Align spectrum spline camera and layout
This commit is contained in:
parent
7bb7e6e1f3
commit
01f696abb0
3 changed files with 28 additions and 19 deletions
|
|
@ -8,6 +8,6 @@ surface id=curvature op=d2Fdx2 inputs=amplitude value=0,0,0,0
|
|||
surface id=emission op=mix inputs=amplitude,derivative,curvature value=1.0,0.72,0.22,1.0
|
||||
surface id=coverage op=sdf.tube inputs=amplitude,derivative,curvature value=0.74,0.20,0.0,0.0
|
||||
|
||||
splinefield id=asioSpectrumWaterfall texture=spectrumHistory frequencyAxis=x firstColumn=0 columns=160 columnStride=1 rollingModulo=160 subdivisions=4 density=1.0 minimumContribution=0.004 origin=-0.82,0.40,-0.18 axisStep=0.016,0.0,0.0 columnStep=0.0,-0.0055,0.0060 amplitudeScale=0.34 radius=0.064 alpha=0.98 zeroThreshold=0.68 feather=0.18 tangent=1.0 curvature=0.68 normal=0.34 derivative=0.88 emission=1.0,0.72,0.22,4.0 seed=2971668797
|
||||
splinefield id=asioSpectrumWaterfall texture=spectrumHistory frequencyAxis=x firstColumn=0 columns=$ROW_COUNT columnStride=1 rollingModulo=$ROW_COUNT subdivisions=4 density=1.0 minimumContribution=0.004 origin=-6.0,0.0,0.0 axisStep=0.2553,0.0,0.0 columnStep=0.0,0.0,0.18 columnGroupSize=$HISTORY_COUNT columnGroupStep=0.0,1.75,0.0 amplitudeScale=1.1 radius=0.042 alpha=0.98 zeroThreshold=0.68 feather=0.18 tangent=1.0 curvature=0.68 normal=0.34 derivative=0.88 emission=1.0,0.72,0.22,4.0 seed=2971668797
|
||||
|
||||
lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBias=1.0
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ surface id=derivative op=dFdx inputs=amplitude value=0,0,0,0
|
|||
surface id=curvature op=d2Fdx2 inputs=amplitude value=0,0,0,0
|
||||
surface id=emission op=mix inputs=amplitude,derivative,curvature value=1.0,0.72,0.22,1.0
|
||||
surface id=coverage op=sdf.tube inputs=amplitude,derivative,curvature value=0.74,0.20,0.0,0.0
|
||||
splinefield id=asioSpectrumWaterfall texture=spectrumHistory frequencyAxis=x firstColumn=0 columns=160 columnStride=1 rollingModulo=160 subdivisions=4 density=1.0 minimumContribution=0.004 origin=-0.82,0.40,-0.18 axisStep=0.016,0.0,0.0 columnStep=0.0,-0.0055,0.0060 amplitudeScale=0.34 radius=0.064 alpha=0.98 zeroThreshold=0.68 feather=0.18 tangent=1.0 curvature=0.68 normal=0.34 derivative=0.88 emission=1.0,0.72,0.22,4.0 seed=2971668797
|
||||
splinefield id=asioSpectrumWaterfall texture=spectrumHistory frequencyAxis=x firstColumn=0 columns=$ROW_COUNT columnStride=1 rollingModulo=$ROW_COUNT subdivisions=4 density=1.0 minimumContribution=0.004 origin=-6.0,0.0,0.0 axisStep=0.2553,0.0,0.0 columnStep=0.0,0.0,0.18 columnGroupSize=$HISTORY_COUNT columnGroupStep=0.0,1.75,0.0 amplitudeScale=1.1 radius=0.042 alpha=0.98 zeroThreshold=0.68 feather=0.18 tangent=1.0 curvature=0.68 normal=0.34 derivative=0.88 emission=1.0,0.72,0.22,4.0 seed=2971668797
|
||||
lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBias=1.0
|
||||
""";
|
||||
private readonly MimirSynchronizationHub synchronization;
|
||||
|
|
@ -132,19 +132,9 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia
|
|||
private AquariumFrame CreateFrame()
|
||||
{
|
||||
var channelCount = Math.Max(1, lastAudioSpectra.Count);
|
||||
var cameraZ = channelCount * SpectrumChannelSeparation;
|
||||
var bufferFieldFrame = BuildSpectrumBufferFieldFrame();
|
||||
var directField = bufferFieldFrame.HasInput && !bufferFieldFrame.UseReservoirLowering;
|
||||
var cameraPosition = directField
|
||||
? new Vector3(0.0f, -1.85f, 0.68f)
|
||||
: bufferFieldFrame.HasInput
|
||||
? new Vector3(0.0f, -13.5f, 10.5f)
|
||||
: new Vector3(0.0f, 0.0f, cameraZ);
|
||||
var cameraTarget = directField
|
||||
? new Vector3(0.0f, -0.04f, 0.08f)
|
||||
: bufferFieldFrame.HasInput
|
||||
? new Vector3(0.0f, 0.0f, 12.0f)
|
||||
: new Vector3(0.0f, 0.0f, cameraZ + 12.0f);
|
||||
var cameraPosition = SpectrumCameraPosition(channelCount);
|
||||
var cameraTarget = SpectrumSplineAabbCenter(channelCount, spectrumHistory.Count);
|
||||
return new AquariumFrame(
|
||||
new ViewFrame(Vector2.Zero, 24.0f),
|
||||
cameraPosition,
|
||||
|
|
@ -160,6 +150,20 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia
|
|||
});
|
||||
}
|
||||
|
||||
private static Vector3 SpectrumCameraPosition(int spectrumCount)
|
||||
{
|
||||
var distance = Math.Max(1, spectrumCount) * SpectrumChannelSeparation;
|
||||
return new Vector3(0.0f, distance, -distance);
|
||||
}
|
||||
|
||||
private static Vector3 SpectrumSplineAabbCenter(int spectrumCount, int windowCount)
|
||||
{
|
||||
var x = 0.0f;
|
||||
var y = (Math.Max(1, spectrumCount) - 1) * SpectrumChannelSeparation * 0.5f + SpectrumAmplitudeHeight * 0.5f;
|
||||
var z = Math.Max(0, windowCount - 1) * SpectrumWindowDepthSeparation * 0.5f;
|
||||
return new Vector3(x, y, z);
|
||||
}
|
||||
|
||||
public AquariumSynthDocument Synth => AquariumSynthDocument.Empty;
|
||||
|
||||
public void RegisterStreamSource(IMimirStreamSource source)
|
||||
|
|
@ -726,7 +730,7 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia
|
|||
continue;
|
||||
}
|
||||
|
||||
var row = baseRow + windowIndex * sourceIds.Length + channelIndex;
|
||||
var row = baseRow + channelIndex * SpectrumHistoryWindowCount + windowIndex;
|
||||
WriteSpectrumRow(samples, row * bandCount, spectrum);
|
||||
}
|
||||
}
|
||||
|
|
@ -740,7 +744,7 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia
|
|||
AquariumRollingModuloMode.Rows,
|
||||
samples);
|
||||
return AquariumFieldScriptCompiler.Compile(
|
||||
LoadSpectrumFieldScript(),
|
||||
LoadSpectrumFieldScript(rowCount),
|
||||
new Dictionary<string, AquariumTextureFieldBinding>(StringComparer.Ordinal)
|
||||
{
|
||||
[texture.Id] = texture,
|
||||
|
|
@ -763,18 +767,22 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia
|
|||
private static bool ShouldRenderSpectrumPreviewSplines() =>
|
||||
string.Equals(Environment.GetEnvironmentVariable("MIMIR_SPECTRUM_PREVIEW_SPLINES"), "1", StringComparison.Ordinal);
|
||||
|
||||
private static string LoadSpectrumFieldScript()
|
||||
private static string LoadSpectrumFieldScript(int rowCount)
|
||||
{
|
||||
string Expand(string script) => script
|
||||
.Replace("$ROW_COUNT", rowCount.ToString(System.Globalization.CultureInfo.InvariantCulture), StringComparison.Ordinal)
|
||||
.Replace("$HISTORY_COUNT", SpectrumHistoryWindowCount.ToString(System.Globalization.CultureInfo.InvariantCulture), StringComparison.Ordinal);
|
||||
|
||||
foreach (var basePath in AncestorDirectories(Environment.CurrentDirectory).Concat(AncestorDirectories(AppContext.BaseDirectory)))
|
||||
{
|
||||
var candidate = Path.Combine(basePath, SpectrumFieldScriptPath);
|
||||
if (File.Exists(candidate))
|
||||
{
|
||||
return File.ReadAllText(candidate);
|
||||
return Expand(File.ReadAllText(candidate));
|
||||
}
|
||||
}
|
||||
|
||||
return DefaultSpectrumFieldScript;
|
||||
return Expand(DefaultSpectrumFieldScript);
|
||||
}
|
||||
|
||||
private static IEnumerable<string> AncestorDirectories(string path)
|
||||
|
|
|
|||
|
|
@ -121,3 +121,4 @@
|
|||
{"ts": "2026-05-25T17:43:25+01:00", "type": "decision", "status": "ok", "note": "Fensalir direct splinefield correction: texture-derived tube trails are direct SDF envelope surfaces, not point-splat fractal dust. AquariumFieldScriptCompiler supports direct; D3D12Renderer now derives AquariumSplineFrame tube-envelope trails from BufferFieldFrame texture spline programs, the spline pipeline declares triangle topology, and D3D12SplinePS writes color, metadata/control, and reservoirGuide outputs. Mimir capture artifacts/runtime/mimir-direct-sdf-tube-spectrum.png proves the DSL-authored ASIO spectrum appears through the direct SDF tube path with ~0.64 ms record CPU in the canary."}
|
||||
{"ts": "2026-05-25T18:01:04+01:00", "type": "decision", "status": "ok", "note": "EVE native program output is now a D3D12 shared-texture contract: Fensalir owns completed backbuffer pixels and publishes Global\\MimirFensalirProgramTexture when FENSALIR_PROGRAM_OUTPUT_D3D12=1; Mimir records the EVE publication profile and WebKit remains forbidden as pixel/layout authority."}
|
||||
{"ts": "2026-05-25T18:25:00+01:00", "type": "decision", "status": "ok", "note": "Mimir's spectrum field script no longer chooses direct or reservoir backend lowering. It declares rolling texture-to-splinefield intent plus an auto lowering budget; Fensalir owns backend selection and LOD. MIMIR_SYNTHETIC_SPECTRUM_PREVIEW=1 exists only as a render-proof source when ASIO startup would block headless capture; real audio buffers remain runtime authority."}
|
||||
{"ts": "2026-05-25T19:14:58+01:00", "type": "implementation", "status": "ok", "note": "Mimir spectrum layout now matches the intended coordinate contract: frequency runs along X, amplitude displaces Y, history windows step along Z, channels stack along Y via Fensalir column groups, and the runtime camera is placed at (0, spectrumCount * spacing, -spectrumCount * spacing) looking at the spline AABB center. Proof capture: artifacts/runtime/mimir-aabb-camera-spectrum-splines.png."}
|
||||
|
|
|
|||
Loading…
Reference in a new issue