From 24e0a19e1703f8382e13a735c400af5f40928d2b Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 16 Jul 2026 19:01:09 +0100 Subject: [PATCH] Prove stellar environment and shield-free hulls --- .../PlayMode/GenericWorldCaptureTests.cs | 42 +++++++++++++++---- .../PlayMode/GenericWorldCaptureTests.cs | 42 +++++++++++++++---- docs/aetheria-released-package-witness.md | 36 +++++++++------- 3 files changed, 89 insertions(+), 31 deletions(-) diff --git a/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs b/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs index cfed0c4..253e8a7 100644 --- a/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs +++ b/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs @@ -12,6 +12,7 @@ using GameCult.Eve.UnityScene.Fields; using GameCult.Mesh; using NUnit.Framework; using UnityEngine; +using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using UnityEngine.TestTools; using UnityEngine.UIElements; @@ -612,6 +613,8 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests var playerMarker = FindMarker(root, playerId); var playerRenderers = playerMarker.GetComponentsInChildren(); Assert.That(playerRenderers, Is.Not.Empty, "The provider-authored player prefab has no renderable visual."); + Assert.That(playerRenderers.Any(renderer => renderer.name == "Shield Visual"), Is.False, + "The provider hull retained an always-on shield envelope instead of using receipt-driven shield feedback."); Assert.That(playerMarker.GetComponentsInChildren(), Is.Empty, "The provider-authored player presentation retained gameplay colliders."); Assert.That(playerMarker.GetComponentsInChildren(), Is.Empty, @@ -642,18 +645,21 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests cameraRig.CameraTransform = camera.transform; cameraRig.RenderPolicySource = provider; Assert.That(cameraRig.ApplyRig(0f), Is.True); - var skybox = provider.ResolveAsset(new EveUnityPlayableWorldAssetBinding( - runtime.ActiveWorld.SkyboxAssetRef, "", "provider-asset-ref"), typeof(Material)) as Material; var reflection = provider.ResolveAsset(new EveUnityPlayableWorldAssetBinding( runtime.ActiveWorld.ReflectionAssetRef, "", "provider-asset-ref"), typeof(Cubemap)) as Cubemap; - Assert.That(runtime.ActiveWorld.SkyboxAssetRef, Is.Not.Empty); + Assert.That(runtime.ActiveWorld.SkyboxAssetRef, Is.Empty, + "Aetheria's raymarch owns the frame; its reflection HDRI must not become a skybox-lighting authority."); Assert.That(runtime.ActiveWorld.ReflectionAssetRef, Is.Not.Empty); - Assert.That(skybox, Is.Not.Null); Assert.That(reflection, Is.Not.Null); - Assert.That(RenderSettings.skybox, Is.SameAs(skybox)); + Assert.That(RenderSettings.ambientMode, Is.EqualTo(AmbientMode.Flat)); + Assert.That(RenderSettings.ambientLight.r, + Is.EqualTo(runtime.ActiveWorld.AmbientLightR * runtime.ActiveWorld.AmbientLightIntensity).Within(0.001f)); + Assert.That(RenderSettings.ambientLight.g, + Is.EqualTo(runtime.ActiveWorld.AmbientLightG * runtime.ActiveWorld.AmbientLightIntensity).Within(0.001f)); + Assert.That(RenderSettings.ambientLight.b, + Is.EqualTo(runtime.ActiveWorld.AmbientLightB * runtime.ActiveWorld.AmbientLightIntensity).Within(0.001f)); Assert.That(RenderSettings.customReflectionTexture, Is.SameAs(reflection)); - Assert.That(camera.clearFlags, Is.EqualTo(CameraClearFlags.Skybox)); - var environmentPresentation = RenderSettings.skybox == skybox && + var environmentPresentation = RenderSettings.ambientMode == AmbientMode.Flat && RenderSettings.customReflectionTexture == reflection; aimRenderer.RefreshNow(); Assert.That(aimRenderer.ViewDotVisible, Is.True); @@ -679,7 +685,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests .Where(material => material != null) .Distinct() .Count(HasAnyTexture); - Assert.That(texturedPlayerMaterialCount, Is.GreaterThanOrEqualTo(9), + Assert.That(texturedPlayerMaterialCount, Is.GreaterThanOrEqualTo(8), "The provider bundle must retain its advertised native material textures."); var directionalLightIntensity = UnityEngine.Object.FindObjectsOfType() .Where(light => light != null && light.enabled && light.type == LightType.Directional) @@ -994,6 +1000,12 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests providerAssets = true, assetBodyTransport = assetBodyTransport, environmentPresentation = environmentPresentation, + ambientProbeEnergy = AmbientProbeEnergy(), + ambientMode = RenderSettings.ambientMode.ToString(), + ambientLight = RenderSettings.ambientLight, + reflectionTexture = RenderSettings.customReflectionTexture != null + ? RenderSettings.customReflectionTexture.name + : "", fieldVolumeFrameId = fieldVolumeFrameId, fieldVolumeLayerCount = fieldVolumeLayerCount, fieldVolumeCompositeCount = fieldVolumeCompositeCount, @@ -1077,6 +1089,10 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public bool providerAssets; public string assetBodyTransport; public bool environmentPresentation; + public float ambientProbeEnergy; + public string ambientMode; + public Color ambientLight; + public string reflectionTexture; public long fieldVolumeFrameId; public int fieldVolumeLayerCount; public long fieldVolumeCompositeCount; @@ -1147,6 +1163,16 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public WitnessReceipt[] receipts; } + private static float AmbientProbeEnergy() + { + var probe = RenderSettings.ambientProbe; + var energy = 0f; + for (var channel = 0; channel < 3; channel++) + for (var coefficient = 0; coefficient < 9; coefficient++) + energy += Mathf.Abs(probe[channel, coefficient]); + return energy; + } + [Serializable] private sealed class WitnessReceipt { diff --git a/TestProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs b/TestProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs index cfed0c4..253e8a7 100644 --- a/TestProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs +++ b/TestProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs @@ -12,6 +12,7 @@ using GameCult.Eve.UnityScene.Fields; using GameCult.Mesh; using NUnit.Framework; using UnityEngine; +using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using UnityEngine.TestTools; using UnityEngine.UIElements; @@ -612,6 +613,8 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests var playerMarker = FindMarker(root, playerId); var playerRenderers = playerMarker.GetComponentsInChildren(); Assert.That(playerRenderers, Is.Not.Empty, "The provider-authored player prefab has no renderable visual."); + Assert.That(playerRenderers.Any(renderer => renderer.name == "Shield Visual"), Is.False, + "The provider hull retained an always-on shield envelope instead of using receipt-driven shield feedback."); Assert.That(playerMarker.GetComponentsInChildren(), Is.Empty, "The provider-authored player presentation retained gameplay colliders."); Assert.That(playerMarker.GetComponentsInChildren(), Is.Empty, @@ -642,18 +645,21 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests cameraRig.CameraTransform = camera.transform; cameraRig.RenderPolicySource = provider; Assert.That(cameraRig.ApplyRig(0f), Is.True); - var skybox = provider.ResolveAsset(new EveUnityPlayableWorldAssetBinding( - runtime.ActiveWorld.SkyboxAssetRef, "", "provider-asset-ref"), typeof(Material)) as Material; var reflection = provider.ResolveAsset(new EveUnityPlayableWorldAssetBinding( runtime.ActiveWorld.ReflectionAssetRef, "", "provider-asset-ref"), typeof(Cubemap)) as Cubemap; - Assert.That(runtime.ActiveWorld.SkyboxAssetRef, Is.Not.Empty); + Assert.That(runtime.ActiveWorld.SkyboxAssetRef, Is.Empty, + "Aetheria's raymarch owns the frame; its reflection HDRI must not become a skybox-lighting authority."); Assert.That(runtime.ActiveWorld.ReflectionAssetRef, Is.Not.Empty); - Assert.That(skybox, Is.Not.Null); Assert.That(reflection, Is.Not.Null); - Assert.That(RenderSettings.skybox, Is.SameAs(skybox)); + Assert.That(RenderSettings.ambientMode, Is.EqualTo(AmbientMode.Flat)); + Assert.That(RenderSettings.ambientLight.r, + Is.EqualTo(runtime.ActiveWorld.AmbientLightR * runtime.ActiveWorld.AmbientLightIntensity).Within(0.001f)); + Assert.That(RenderSettings.ambientLight.g, + Is.EqualTo(runtime.ActiveWorld.AmbientLightG * runtime.ActiveWorld.AmbientLightIntensity).Within(0.001f)); + Assert.That(RenderSettings.ambientLight.b, + Is.EqualTo(runtime.ActiveWorld.AmbientLightB * runtime.ActiveWorld.AmbientLightIntensity).Within(0.001f)); Assert.That(RenderSettings.customReflectionTexture, Is.SameAs(reflection)); - Assert.That(camera.clearFlags, Is.EqualTo(CameraClearFlags.Skybox)); - var environmentPresentation = RenderSettings.skybox == skybox && + var environmentPresentation = RenderSettings.ambientMode == AmbientMode.Flat && RenderSettings.customReflectionTexture == reflection; aimRenderer.RefreshNow(); Assert.That(aimRenderer.ViewDotVisible, Is.True); @@ -679,7 +685,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests .Where(material => material != null) .Distinct() .Count(HasAnyTexture); - Assert.That(texturedPlayerMaterialCount, Is.GreaterThanOrEqualTo(9), + Assert.That(texturedPlayerMaterialCount, Is.GreaterThanOrEqualTo(8), "The provider bundle must retain its advertised native material textures."); var directionalLightIntensity = UnityEngine.Object.FindObjectsOfType() .Where(light => light != null && light.enabled && light.type == LightType.Directional) @@ -994,6 +1000,12 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests providerAssets = true, assetBodyTransport = assetBodyTransport, environmentPresentation = environmentPresentation, + ambientProbeEnergy = AmbientProbeEnergy(), + ambientMode = RenderSettings.ambientMode.ToString(), + ambientLight = RenderSettings.ambientLight, + reflectionTexture = RenderSettings.customReflectionTexture != null + ? RenderSettings.customReflectionTexture.name + : "", fieldVolumeFrameId = fieldVolumeFrameId, fieldVolumeLayerCount = fieldVolumeLayerCount, fieldVolumeCompositeCount = fieldVolumeCompositeCount, @@ -1077,6 +1089,10 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public bool providerAssets; public string assetBodyTransport; public bool environmentPresentation; + public float ambientProbeEnergy; + public string ambientMode; + public Color ambientLight; + public string reflectionTexture; public long fieldVolumeFrameId; public int fieldVolumeLayerCount; public long fieldVolumeCompositeCount; @@ -1147,6 +1163,16 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public WitnessReceipt[] receipts; } + private static float AmbientProbeEnergy() + { + var probe = RenderSettings.ambientProbe; + var energy = 0f; + for (var channel = 0; channel < 3; channel++) + for (var coefficient = 0; coefficient < 9; coefficient++) + energy += Mathf.Abs(probe[channel, coefficient]); + return energy; + } + [Serializable] private sealed class WitnessReceipt { diff --git a/docs/aetheria-released-package-witness.md b/docs/aetheria-released-package-witness.md index ea876bf..bf58a56 100644 --- a/docs/aetheria-released-package-witness.md +++ b/docs/aetheria-released-package-witness.md @@ -4,8 +4,8 @@ The released-package warm-gameplay witness passes with: -- `org.gamecult.eve.unity-scene` `0.3.55`, commit - `745ce7cc24c514ad442d53807722b6a4651d9521`; +- `org.gamecult.eve.unity-scene` `0.3.57`, commit + `0974154fa7c7982c9a8ea0ca006d2698a53e1235`; - `org.gamecult.eve.plugin-fields` `0.2.3`, commit `c5a4a75c1b727499b16c2dae1895f29e2a9f72f0`; - `org.gamecult.eve.surface` `0.2.2`, commit @@ -30,14 +30,14 @@ ships were `Djinni`, and no `LonginusX` appeared. The player moved 14.34 world units and completed its authoritative hardware-driven look before combat. The daemon-owned look direction reached the SoA body rotation, and the generic aim presentation rendered at the advertised 50-unit minimum -convergence distance. The advertised skybox material and reflection cubemap -resolved from the provider bundle as their required native types and became the -active camera rig's leased Unity environment. -The witness supplies no client-authored light. The fossil `ARPG.unity` scene has -no Unity `Light` component, so Aetheria advertises its skybox ambient intensity -and custom reflection but no key light. The generic camera rig records zero live -directional intensity. The earlier invented `0.75` light has been deleted rather -than retained as a material-conversion compensator. +convergence distance. Aetheria derives ambient color from daemon-owned stellar +`LightColor` values and advertises `studio2` only as the reflection cubemap; the +gravity-fog raymarch owns the visible frame. The released lowerer records flat +ambient mode, color `(1.46,1.2556,0.8468)`, ambient-probe energy `4.6354`, and +custom reflection texture `studio2`. No skybox asset or key light is advertised, +and the generic camera rig records zero live directional intensity. The earlier +invented `0.75` light and false skybox authority were deleted rather than retained +as material-conversion compensators. Aetheria also advertises the original undocked `ARPG.unity` Third Person Rig: entity-forward perspective follow, `30` unit distance, `60` degree vertical field of view, canonical bottom-origin target screen position `0.64,0.19`, zero position damping, and @@ -73,7 +73,7 @@ daemon lock progress `1.0`; Unity does not manufacture or smooth that value. Camera-channel facts: -- provider-authored player renderers: `13` total / `9` enabled, with no embedded shield renderer; +- provider-authored player renderers: `7` active, with no embedded shield renderer; - pilot changed pixels: `217,323`; - pilot average luminance: `0.1322155`; - pilot bright pixels: `101,510`; @@ -116,8 +116,9 @@ without resurrecting the false scene light. Visual inspection confirms that map glyphs are absent from the pilot frame and present in the map-only frame. This is transport, authority, field-production, and lowering proof, not visual parity: the current pilot capture contains the -blue fog field and provider geometry, but nearby ships remain too dark and the -celestial composition lacks the fossil capture's readable close body. Release +blue fog field and the provider's magenta-and-gold Longinus hull with no opaque +shield ellipsoid. The celestial composition still lacks the fossil capture's +readable close body. Release `0.3.57` includes generic lowering for Eve Fields `0.2.3`'s `AnimatedRadialCosine` source alongside `PowerPulse`, dither-scale, temporal-history, and finite-look-at semantics. Aetheria publishes the fossil @@ -138,7 +139,12 @@ generic lowerer applies URP TAA with `0.99` history blend, `0.1` jitter scale, high quality, and zero sharpening. Fog and Stardust now consume one generic camera-relative viewport-frame resolver rather than projecting the same splat document independently. The live witness fails unless their snapped grid -centers are identical; this run resolved both to `(-6,-6)` after movement. +centers are identical; the latest run resolved both to `(-6,-6)` after movement. +The provider HLSL now consumes Eve Fields' positive world-axis viewport directly; +it no longer retains the two-axis compensation once required by the deleted +fossil gravity camera. An asymmetric GPU fixture fails unless positive-world X +samples positive texture X, while the existing one-cell remap proof still keeps +705 overlapping world particles bit-identical. The capture is still visibly rough and is not a visual-parity claim. The fossil Stardust material used a screen-space coverage mask that changes on @@ -156,7 +162,7 @@ Aetheria currently bundles ambientCG's 1K `Metal012` color, normal, and metalness maps under CC0. The same pre-generated maps now replace dead Substance archive sub-assets on the brushed aluminium, tinted car paint, cockpit, steel, black-metal, and radiator materials. The released witness - resolves textured native URP materials in `9` distinct player-material slots, + resolves textured native URP materials in `8` distinct player-material slots, up from `3`, without adding another texture payload. This is temporary provider art with recorded provenance, not a replacement texture pipeline.