Capture settled HD temporal witness

This commit is contained in:
Meta Vens 2026-07-16 20:40:40 +01:00
commit b25d914049
4 changed files with 54 additions and 16 deletions

View file

@ -638,7 +638,9 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests
}
Assert.That(mapRenderers, Is.Not.Empty, "The live provider prefab has no renderer assigned to its advertised map channel.");
target = new RenderTexture(640, 360, 24, RenderTextureFormat.ARGB32);
const int captureWidth = 1280;
const int captureHeight = 720;
target = new RenderTexture(captureWidth, captureHeight, 24, RenderTextureFormat.ARGB32);
camera.targetTexture = target;
var cameraRig = cameraObject.AddComponent<EveUnityPlayableWorldCameraRig>();
cameraRig.Host = host;
@ -697,11 +699,22 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests
var mapCamera = mapCameraObject.AddComponent<Camera>();
mapCamera.cullingMask = 1 << mapLayer;
Assert.That(mapCamera.cullingMask, Is.EqualTo(1 << mapLayer));
yield return null;
var captureFieldVolume = root.GetComponent<EveUnityFieldsVolumeRenderer>();
Assert.That(captureFieldVolume, Is.Not.Null,
"The generic client did not install its Fields volume lowerer before temporal settling.");
const int temporalSettlingFrames = 128;
var initialCompositeCount = captureFieldVolume.CompositeCount;
var temporalSettlingDeadline = Time.realtimeSinceStartup + 20f;
while (captureFieldVolume.CompositeCount - initialCompositeCount < temporalSettlingFrames &&
Time.realtimeSinceStartup < temporalSettlingDeadline)
yield return null;
Assert.That(captureFieldVolume.CompositeCount - initialCompositeCount,
Is.GreaterThanOrEqualTo(temporalSettlingFrames),
"The pilot capture ran before the advertised temporal reconstruction had settled.");
camera.Render();
RenderTexture.active = target;
pixels = new Texture2D(640, 360, TextureFormat.RGB24, false);
pixels.ReadPixels(new Rect(0, 0, 640, 360), 0, 0);
pixels = new Texture2D(captureWidth, captureHeight, TextureFormat.RGB24, false);
pixels.ReadPixels(new Rect(0, 0, captureWidth, captureHeight), 0, 0);
pixels.Apply();
var pilotChangedPixels = CountChangedPixels(pixels, camera.backgroundColor);
MeasureLuminance(pixels, out var pilotAverageLuminance, out var pilotBrightPixelCount);
@ -749,7 +762,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests
Assert.That(particleMapCameraIsolated, Is.True,
"The map camera executed the pilot-only field-particle pass.");
RenderTexture.active = target;
pixels.ReadPixels(new Rect(0, 0, 640, 360), 0, 0);
pixels.ReadPixels(new Rect(0, 0, captureWidth, captureHeight), 0, 0);
pixels.Apply();
var mapChangedPixels = CountChangedPixels(pixels, mapCamera.backgroundColor);
Assert.That(mapChangedPixels, Is.GreaterThan(25), "The map-only camera rendered no provider-authored map glyph pixels.");

View file

@ -638,7 +638,9 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests
}
Assert.That(mapRenderers, Is.Not.Empty, "The live provider prefab has no renderer assigned to its advertised map channel.");
target = new RenderTexture(640, 360, 24, RenderTextureFormat.ARGB32);
const int captureWidth = 1280;
const int captureHeight = 720;
target = new RenderTexture(captureWidth, captureHeight, 24, RenderTextureFormat.ARGB32);
camera.targetTexture = target;
var cameraRig = cameraObject.AddComponent<EveUnityPlayableWorldCameraRig>();
cameraRig.Host = host;
@ -697,11 +699,22 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests
var mapCamera = mapCameraObject.AddComponent<Camera>();
mapCamera.cullingMask = 1 << mapLayer;
Assert.That(mapCamera.cullingMask, Is.EqualTo(1 << mapLayer));
yield return null;
var captureFieldVolume = root.GetComponent<EveUnityFieldsVolumeRenderer>();
Assert.That(captureFieldVolume, Is.Not.Null,
"The generic client did not install its Fields volume lowerer before temporal settling.");
const int temporalSettlingFrames = 128;
var initialCompositeCount = captureFieldVolume.CompositeCount;
var temporalSettlingDeadline = Time.realtimeSinceStartup + 20f;
while (captureFieldVolume.CompositeCount - initialCompositeCount < temporalSettlingFrames &&
Time.realtimeSinceStartup < temporalSettlingDeadline)
yield return null;
Assert.That(captureFieldVolume.CompositeCount - initialCompositeCount,
Is.GreaterThanOrEqualTo(temporalSettlingFrames),
"The pilot capture ran before the advertised temporal reconstruction had settled.");
camera.Render();
RenderTexture.active = target;
pixels = new Texture2D(640, 360, TextureFormat.RGB24, false);
pixels.ReadPixels(new Rect(0, 0, 640, 360), 0, 0);
pixels = new Texture2D(captureWidth, captureHeight, TextureFormat.RGB24, false);
pixels.ReadPixels(new Rect(0, 0, captureWidth, captureHeight), 0, 0);
pixels.Apply();
var pilotChangedPixels = CountChangedPixels(pixels, camera.backgroundColor);
MeasureLuminance(pixels, out var pilotAverageLuminance, out var pilotBrightPixelCount);
@ -749,7 +762,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests
Assert.That(particleMapCameraIsolated, Is.True,
"The map camera executed the pilot-only field-particle pass.");
RenderTexture.active = target;
pixels.ReadPixels(new Rect(0, 0, 640, 360), 0, 0);
pixels.ReadPixels(new Rect(0, 0, captureWidth, captureHeight), 0, 0);
pixels.Apply();
var mapChangedPixels = CountChangedPixels(pixels, mapCamera.backgroundColor);
Assert.That(mapChangedPixels, Is.GreaterThan(25), "The map-only camera rendered no provider-authored map glyph pixels.");

View file

@ -41,6 +41,18 @@ effectively unchanged while mean neighboring-pixel variation falls from
to `0.0531`. This proves the temporal history is accumulating and that its
bootstrap seed mattered. The remaining cyan/tonemap mismatch is still open.
The cold HD witness in `artifacts/aetheria-daemon-fog-alpha-cold-hd` then
transfers the rebuilt 56,168,970-byte provider bundle
`a829e57731fbe08f4564fa131468148e99f6b4204708ad3e64498885532b5091`
through `SharedFileMapping` and captures after 128 temporal composites at
1280x720. It restores the historical fog history ABI: the temporal pass stores
density directly in alpha, so the composite consumes that density directly
instead of decoding it as the raymarch pass's packed distance/density payload.
The flat grey opacity slabs disappear. The released client test passes in 52.7
seconds with 238 fog composites and Stardust draws; the pilot camera still
excludes map renderers and the map camera includes them. Remaining visual work
is color/composition parity, not broken fog opacity or an unsettled witness.
Current released-package evidence is in
`artifacts/aetheria-daemon-mapped-body-cold`; despite that retained directory
name, `runtime-witness.warm.json` is the current passing run. The warm PlayMode test

View file

@ -346,8 +346,8 @@ try {
assertions = $facts
receipts = @($facts.receipts)
screenshotMetrics = [ordered]@{
width = 640
height = 360
width = 1280
height = 720
encodedSizeBytes = $capture.Length
sha256 = (Get-FileHash -LiteralPath $capture.FullName -Algorithm SHA256).Hash.ToLowerInvariant()
mapEncodedSizeBytes = $mapCapture.Length
@ -360,16 +360,16 @@ try {
path = $capture.Name
sha256 = (Get-FileHash -LiteralPath $capture.FullName -Algorithm SHA256).Hash.ToLowerInvariant()
sizeBytes = $capture.Length
width = 640
height = 360
width = 1280
height = 720
},
[ordered]@{
kind = "unity-map-channel-png"
path = $mapCapture.Name
sha256 = (Get-FileHash -LiteralPath $mapCapture.FullName -Algorithm SHA256).Hash.ToLowerInvariant()
sizeBytes = $mapCapture.Length
width = 640
height = 360
width = 1280
height = 720
},
[ordered]@{
kind = "unity-test-results"