Prove stellar environment and shield-free hulls

This commit is contained in:
Meta Vens 2026-07-16 19:01:09 +01:00
commit 24e0a19e17
3 changed files with 89 additions and 31 deletions

View file

@ -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<Renderer>();
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<Collider>(), Is.Empty,
"The provider-authored player presentation retained gameplay colliders.");
Assert.That(playerMarker.GetComponentsInChildren<Rigidbody>(), 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<Light>()
.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
{

View file

@ -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<Renderer>();
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<Collider>(), Is.Empty,
"The provider-authored player presentation retained gameplay colliders.");
Assert.That(playerMarker.GetComponentsInChildren<Rigidbody>(), 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<Light>()
.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
{

View file

@ -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.