From 68c12f2201e6fc8c206dae63aeabeb0780582e9e Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 16 Jul 2026 17:54:00 +0100 Subject: [PATCH] Align fog grid and advertise temporal reconstruction --- Aetheria.State.Daemon.Smoke/Program.cs | 11 +++++++++++ Aetheria.Unity/Packages/manifest.json | 2 +- Aetheria.Unity/Packages/packages-lock.json | 4 ++-- .../AetheriaRuntimeDaemonGameSurfaceBuilder.cs | 11 +++++++++++ docs/aetheria-perfect-machine-map.md | 10 +++++++++- docs/original-game-migration-matrix.md | 2 +- 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Aetheria.State.Daemon.Smoke/Program.cs b/Aetheria.State.Daemon.Smoke/Program.cs index 49cd4e976..55c020afb 100644 --- a/Aetheria.State.Daemon.Smoke/Program.cs +++ b/Aetheria.State.Daemon.Smoke/Program.cs @@ -230,6 +230,12 @@ internal sealed class AetheriaDaemonYmirSmokeChecks volume.Props["layerTargetDescriptors"].Contains("fog.surface_height=2,2,false,bilinear", StringComparison.Ordinal) && volume.Props["layerTargetDescriptors"].Contains("fog.tint=0.5,0.5,true,trilinear", StringComparison.Ordinal) && volume.Props["viewportTextureScaleBindings"] == "ditherCoordinates=dither" && + volume.Props["viewportAnchor"] == stardust.Props["viewportAnchor"] && + volume.Props["span"] == stardust.Props["span"] && + volume.Props["cellWorldSize"] == stardust.Props["cellWorldSize"] && + volume.Props["gravityTexelsPerCell"] == stardust.Props["gravityTexelsPerCell"] && + volume.Props["viewportSnapLayer"] == stardust.Props["viewportSnapLayer"] && + volume.Props["viewportSnapTexels"] == stardust.Props["viewportSnapTexels"] && volume.Props["documentFloatBindings"] == "simulationTimeSeconds=flowScroll,0.025,0" && !volume.Props.ContainsKey("vectorParameters"), "portable Eve volume surfaces must name logical ports rather than Unity shader properties"); @@ -788,6 +794,11 @@ internal sealed class AetheriaDaemonYmirSmokeChecks Require(world.Props["skyboxAssetRef"] == "material.environment.skybox" && world.Props["reflectionAssetRef"] == "texture.environment.reflection" && world.Props["postProcessProfileAssetRef"] == "profile.environment.flight" && + world.Props["cameraReconstruction"] == "temporal-reprojection.v1" && + world.Props["temporalQuality"] == "high" && + world.Props["temporalHistoryBlend"] == "0.99" && + world.Props["temporalJitterScale"] == "0.1" && + world.Props["temporalSharpening"] == "0" && world.Props["reflectionIntensity"] == "1" && world.Props["ambientLightIntensity"] == "1.46" && !world.Props.ContainsKey("keyLightDirection") && diff --git a/Aetheria.Unity/Packages/manifest.json b/Aetheria.Unity/Packages/manifest.json index bb1ad69b1..9958c0d95 100644 --- a/Aetheria.Unity/Packages/manifest.json +++ b/Aetheria.Unity/Packages/manifest.json @@ -9,6 +9,6 @@ "org.gamecult.cultlib": "https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.15", "org.gamecult.eve.plugin-fields": "https://github.com/GameCult/EvePlugins.git?path=/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields#eve-plugin-fields-unity-v0.2.3", "org.gamecult.eve.surface": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.surface#eveunity-surface-v0.2.2", - "org.gamecult.eve.unity-scene": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.55" + "org.gamecult.eve.unity-scene": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.56" } } diff --git a/Aetheria.Unity/Packages/packages-lock.json b/Aetheria.Unity/Packages/packages-lock.json index e96f49836..309dc8a3b 100644 --- a/Aetheria.Unity/Packages/packages-lock.json +++ b/Aetheria.Unity/Packages/packages-lock.json @@ -144,7 +144,7 @@ "hash": "140e1bd963a0033e66777a3b2c5fe6e9c97dfe32" }, "org.gamecult.eve.unity-scene": { - "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.55", + "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.56", "depth": 0, "source": "git", "dependencies": { @@ -155,7 +155,7 @@ "com.unity.render-pipelines.universal": "17.4.0", "com.unity.modules.particlesystem": "1.0.0" }, - "hash": "745ce7cc24c514ad442d53807722b6a4651d9521" + "hash": "dfa843cde2c0d9328bb2fa342c9378bf3cdfe6f4" }, "com.unity.modules.assetbundle": { "version": "1.0.0", diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonGameSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonGameSurfaceBuilder.cs index 55fd4aefa..762bf13fb 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonGameSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonGameSurfaceBuilder.cs @@ -651,6 +651,11 @@ namespace GameCult.Aetheria.State.Verse ["reflectionAssetRef"] = "texture.environment.reflection", ["reflectionIntensity"] = "1", ["postProcessProfileAssetRef"] = "profile.environment.flight", + ["cameraReconstruction"] = "temporal-reprojection.v1", + ["temporalQuality"] = "high", + ["temporalHistoryBlend"] = "0.99", + ["temporalJitterScale"] = "0.1", + ["temporalSharpening"] = "0", ["viewId"] = "pilot", ["excludedRenderChannels"] = "map", ["playerEntityId"] = playerEntityId, @@ -733,6 +738,12 @@ namespace GameCult.Aetheria.State.Verse "fog.tint=0.5,0.5,true,trilinear", ["assetTextureBindings"] = "texture.environment.volume-dither=dither", ["viewportTextureScaleBindings"] = "ditherCoordinates=dither", + ["viewportAnchor"] = "active-camera.xz", + ["span"] = "256", + ["cellWorldSize"] = "6", + ["gravityTexelsPerCell"] = "8", + ["viewportSnapLayer"] = "fog.surface_height", + ["viewportSnapTexels"] = "8", ["documentFloatBindings"] = "simulationTimeSeconds=flowScroll,0.025,0", ["floatParameters"] = "fillDensity=0.000000001;fillDistance=120;fillExponent=5;fillOffset=70;" + "patchDensity=0.35;floorOffset=-20;floorBlend=10;patchBlend=25;luminance=1;extinction=0.5;" + diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index 0bc084151..aeefdbcd4 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -1015,6 +1015,9 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. bloom, histogram dark-scene exposure bound, contrast, vignette, and grain. - Outputs: the generic Unity lowerer resolves a `VolumeProfile`, enables URP post-processing on the leased camera, and installs one global runtime volume. + The same world view advertises `temporal-reprojection.v1` with the fossil + pilot camera's `0.99` history blend, `0.1` jitter scale, zero sharpening, and + high quality; EveUnity lowers those neutral values to URP TAA. - Derived state: the Unity `Volume`, additional-camera data, and enabled flag are client presentation state. They restore or disappear when the camera lease ends. @@ -1121,7 +1124,9 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. truncation toward zero. The snapped center becomes both the raster viewport center and `_GridTransform.xy`. A 2000-wide viewport is rejected because it aliases the gravity and particle lattices even when particle hashing itself - is correct. + is correct. Fog and particles do not separately project that frame: both + generic lowerers call the same viewport-frame resolver and receive identical + `EveFieldsViewport` bounds. - Derived state: GPU buffers, generated quads, raster targets, keywords, and draw calls are client presentation state. They cannot feed simulation. - Forbidden writers: EveUnity cannot reseed, pool, randomly initialize, move, @@ -1138,6 +1143,9 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. all seven particle floats bit-identical while the same buffer slot changes identity. The released witness must record 65,536 particles, one compute dispatch and one pilot-camera draw while the map camera remains isolated. + The released `0.3.56` witness additionally requires the live fog and particle + grid centers to be equal and the leased pilot camera to report URP temporal + anti-aliasing with the advertised history and jitter values. ### Gravity Fog Presentation Contract diff --git a/docs/original-game-migration-matrix.md b/docs/original-game-migration-matrix.md index 32c0aa0b4..4f8274915 100644 --- a/docs/original-game-migration-matrix.md +++ b/docs/original-game-migration-matrix.md @@ -35,7 +35,7 @@ validation proves contract shape, not wiring, exclusivity, lowering, or parity. | Render channels | Unity layers/culling masks | provider surface policy + runtime asset variant | semantic channel exclusions | EveUnity native layer mapping | wired, exclusive, and lowered: the pilot surface excludes the semantic `map` channel; the Unity asset variant maps `map` to its authored native layer; EveUnity subtracts that layer from the configured camera mask; portable state contains no Unity layer or mask; provider conversion preserves the source icon shader's unlit lighting model; the released witness proves the pilot camera excludes map glyphs while the map camera retains readable white glyphs without a scene light | preserve the channel proof while world presentation and transport continue to evolve | | Minimap/tactical map | `ZoneRenderer`, map cameras | daemon world facts | explicit map projections | Unity and Electron | facts fragmented; generic lowerers absent | same state in both runtimes | | Celestial world | `ZoneRenderer`, body/asteroid prefab scripts | daemon render projection plus provider assets | ordinary generic Eve entity SoA rows | EveUnity generic entity/prefab lowerer | wired, exclusive, projected, and lowered: daemon orbit and terrain queries emit stable presentation-only identities for suns, planets, gas giants, and live asteroid instances; provider packaging extracts only each advertised visual child and strips fossil scripts/physics; released EveUnity `0.3.51` applies semantic scale around provider-authored local scale and contains no celestial or Aetheria branch. The released warm witness records eleven bodies and eighteen asteroids with provider refs and enabled renderers, including seven celestial instances intersecting the pilot frustum | body material/light readability, close-range composition matching the fossil, asteroid variation, and Electron lowering | -| Fields/fog/gravity | zone renderer and shaders | daemon/plugin semantics | Fields plugin documents | EveUnity fields lowerer | daemon publishes canonical gravity/fog splat layers through `field.volume3d`; Eve Fields `0.2.3` owns portable `PowerPulse` and `AnimatedRadialCosine` semantics; Aetheria emits the fossil global animated simplex/cellular/ambient stack, body-owned radial waves, and separate negative gameplay `gravity.height` and positive visual `fog.surface_height`; the shared camera-relative lattice spans 1536 world units as 256 six-unit Stardust cells, rasterizes gravity at eight texels per cell into 2048 texels, and snaps the viewport by one six-unit cell; daemon entities follow fossil terrain height plus hull grid offset after Ymir XZ motion; released EveUnity `0.3.55` lowers the authored topology, provider shader ABI, pre-postprocess URP pass, authoritative flow time, explicit camera matrix, and float32 packed-output diagnostics without provider code. The provider bundle runs the actual Stardust compute shader across X, Y, and diagonal one-cell remaps and proves 705 overlapping world cells remain bit-identical after buffer reassignment. The released warm witness proves the same snapped grid drives 65,536 rendered particles while the map camera remains isolated. The flight post-process bundle gate verifies serialized ACES, exposure/contrast, bloom, vignette, and film-grain components | restore readable patch structure, gravity waves, surrounding world geometry, and final luminance/composition parity; visual parity remains explicitly open | +| Fields/fog/gravity | zone renderer and shaders | daemon/plugin semantics | Fields plugin documents | EveUnity fields lowerer | daemon publishes canonical gravity/fog splat layers through `field.volume3d`; Eve Fields `0.2.3` owns portable `PowerPulse` and `AnimatedRadialCosine` semantics; Aetheria emits the fossil global animated simplex/cellular/ambient stack, body-owned radial waves, and separate negative gameplay `gravity.height` and positive visual `fog.surface_height`; the shared camera-relative lattice spans 1536 world units as 256 six-unit Stardust cells, rasterizes gravity at eight texels per cell into 2048 texels, and snaps the viewport by one six-unit cell; daemon entities follow fossil terrain height plus hull grid offset after Ymir XZ motion; released EveUnity `0.3.56` lowers the authored topology, one shared snapped viewport frame for fog and Stardust, provider shader ABI, pre-postprocess URP pass, provider-requested TAA, authoritative flow time, explicit camera matrix, and float32 packed-output diagnostics without provider code. The provider bundle runs the actual Stardust compute shader across X, Y, and diagonal one-cell remaps and proves 705 overlapping world cells remain bit-identical after buffer reassignment. The released warm witness proves identical fog/particle grid centers drive 65,536 rendered particles while the map camera remains isolated. The flight post-process bundle gate verifies serialized ACES, exposure/contrast, bloom, vignette, and film-grain components | restore readable patch structure, gravity waves, surrounding world geometry, and final luminance/composition parity; visual parity remains explicitly open | | HUD/schematic | ARPG HUD and `SchematicDisplay` | Eve composition from daemon facts | semantic status/components | EveUnity UI | provider-authored transparent cockpit is wired, projected, and lowered through generic UI Toolkit panes, metrics, and progress components for hull, shield, capacitor, temperature, cargo, weapon cooldown/groups, selected target, target lock, target shield, and target hull; the original armor/equipment schematic and transient warning choreography remain reference-only | schematic topology, warning timelines, dynamic action state, and composited live capture | | Hit/lock/warnings | `ActionGameManager` feedback | daemon event facts | transient feedback stream | VFX/UI/audio | bounded deduplicated game-event ledger and Eve `feedback.stream` wired for pickup outcomes, projectile launch/impact, entity damage, alive-to-dead destruction, authoritative weapon reload chronology, lock start/acquired/lost chronology, and episode-deduplicated `weapon.fire.refused` facts for insufficient energy or missing ammunition; every lock transition carries authored weapon identity, target, reason, and prior/current progress, while reconnect priming prevents retained events from replaying as new feedback | add thermal and docking event families, negative transaction fixtures, provider lock audio/effect roles, and broader runtime effect consumption | | Assets | `Assets/Resources` | Aetheria provider | asset catalog + CultMesh CDN | runtime cache/load | provider manifests name deterministic bundle-internal paths and now project each typed hull prefab through the same asset key in Eve scene and SoA identity state; the authoring build derives presentation-only prefabs, strips non-Eve gameplay scripts, externalizes embedded effects, preserves source material semantics, and verifies the loaded bundle ABI; released EveUnity `0.3.55` resolves Unity's lowercase bundle names against authored-case advertised keys and the warm cache witness lowers the verified provider body through local file mapping | cold CDN transfer is failing: the bundle still times out while transported through batched snapshot records instead of mapped/network body transport; provider-to-client network zero-copy, shared-memory delivery, and GPU zero-copy remain open |