From 68aba5f67b4aef8cf1be734bd73e7f298e318e5c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 15 Jul 2026 06:14:49 +0100 Subject: [PATCH] Prove released authoritative aim and camera channels --- .../PlayMode/GenericWorldCaptureTests.cs | 42 ++++++++++++++----- ReleaseConsumerProject/Packages/manifest.json | 2 +- .../Packages/packages-lock.json | 4 +- .../PlayMode/GenericWorldCaptureTests.cs | 42 ++++++++++++++----- scripts/run-aetheria-daemon-world-witness.ps1 | 2 +- 5 files changed, 66 insertions(+), 26 deletions(-) diff --git a/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs b/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs index 9f58eac..4723fe8 100644 --- a/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs +++ b/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs @@ -188,6 +188,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests EveUnityPlayableWorldClientHost host = null; EveUnityPlayableWorldRuntime runtime = null; WitnessReceipt movementReceipt = null; + WitnessReceipt lookReceipt = null; WitnessReceipt focusReceipt = null; WitnessReceipt actionReceipt = null; EveUnityShotReceipt observedShot = null; @@ -196,6 +197,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests float hullRatioBefore = 0f; long initialVersion = 0; float movementDistance = 0f; + float aimDotDistance = 0f; try { @@ -344,18 +346,24 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests aim.y = 0; Assert.That(aim.sqrMagnitude, Is.GreaterThan(0.0001f)); aim.Normalize(); - var steerVersion = runtime.ActiveVersion; - var steer = runtime.SubmitMoveVectorIntent(playerId, aim.x, aim.z, 0.25f); - var steerDeadline = Time.realtimeSinceStartup + 12f; - while (Time.realtimeSinceStartup < steerDeadline && - (runtime.LastReceipt == null || runtime.LastReceipt.CommandId != steer.CommandId || - !string.Equals(runtime.LastReceipt.State, "reconciled", StringComparison.OrdinalIgnoreCase))) + var lookVersion = runtime.ActiveVersion; + var look = runtime.SubmitLookDirectionIntent(playerId, aim.x, 0f, aim.z); + var lookDeadline = Time.realtimeSinceStartup + 12f; + while (Time.realtimeSinceStartup < lookDeadline && + (runtime.LastReceipt == null || runtime.LastReceipt.CommandId != look.CommandId || + !string.Equals(runtime.LastReceipt.State, "reconciled", StringComparison.OrdinalIgnoreCase) || + runtime.ActiveVersion < runtime.LastReceipt.SourceVersion || + Vector3.Dot(FindMarker(root, playerId).transform.forward, aim) < 0.99f)) { yield return new WaitForSecondsRealtime(0.1f); runtime.Refresh(); } - AssertReconciledProviderReceipt(runtime.LastReceipt, steer.CommandId, - provider.Selection.ProviderId, provider.Selection.SurfaceId, steerVersion); + AssertReconciledProviderReceipt(runtime.LastReceipt, look.CommandId, + provider.Selection.ProviderId, provider.Selection.SurfaceId, lookVersion); + Assert.That(Vector3.Dot(FindMarker(root, playerId).transform.forward, aim), Is.GreaterThan(0.99f)); + lookReceipt = WitnessReceipt.From("look", runtime.LastReceipt); + var aimRenderer = root.GetComponent(); + Assert.That(aimRenderer, Is.Not.Null); var focusVersion = runtime.ActiveVersion; var inputDriver = root.GetComponent() ?? @@ -448,6 +456,10 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests cameraRig.CameraTransform = camera.transform; cameraRig.RenderPolicySource = provider; Assert.That(cameraRig.ApplyRig(0f), Is.True); + aimRenderer.RefreshNow(); + Assert.That(aimRenderer.ViewDotVisible, Is.True); + aimDotDistance = Vector3.Distance(playerMarker.transform.position, aimRenderer.ViewDotPosition); + Assert.That(aimDotDistance, Is.GreaterThanOrEqualTo(49.9f)); Assert.That(camera.cullingMask & (1 << mapLayer), Is.Zero); Assert.That(camera.fieldOfView, Is.EqualTo(60f).Within(0.001f)); var playerViewport = camera.WorldToViewportPoint(playerMarker.transform.position); @@ -504,6 +516,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests (camera.cullingMask & (1 << mapLayer)) == 0, (mapCamera.cullingMask & (1 << mapLayer)) != 0, movementReceipt, + lookReceipt, focusReceipt, actionReceipt, observedShot, @@ -511,7 +524,8 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests observedCombat?.ShieldRatio ?? shieldRatioBefore, hullRatioBefore, observedCombat?.HullRatio ?? hullRatioBefore, - (float)observedShot.LockQuality); + (float)observedShot.LockQuality, + aimDotDistance); } finally { @@ -541,6 +555,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests bool pilotCameraExcludesMapChannel, bool mapCameraIncludesMapChannel, WitnessReceipt movement, + WitnessReceipt look, WitnessReceipt targeting, WitnessReceipt action, EveUnityShotReceipt shot, @@ -548,7 +563,8 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests float shieldRatioAfter, float hullRatioBefore, float hullRatioAfter, - float lockProgress) + float lockProgress, + float aimDotDistance) { var path = Environment.GetEnvironmentVariable("EVEUNITY_WITNESS_FACTS_PATH"); if (string.IsNullOrWhiteSpace(path)) return; @@ -557,6 +573,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests providerAdvertisement = true, providerAssets = true, movement = movement != null, + aimPresentation = look != null && aimDotDistance >= 49.9f, targeting = targeting != null, action = action != null, combatPresentation = shot != null, @@ -573,13 +590,14 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests initialVersion = initialVersion, finalVersion = finalVersion, movementDistance = movementDistance, + aimDotDistance = aimDotDistance, playerRendererCount = playerRendererCount, pilotChangedPixels = pilotChangedPixels, mapChannelRendererCount = mapChannelRendererCount, mapChangedPixels = mapChangedPixels, pilotCameraExcludesMapChannel = pilotCameraExcludesMapChannel, mapCameraIncludesMapChannel = mapCameraIncludesMapChannel, - receipts = new[] { movement, targeting, action } + receipts = new[] { movement, look, targeting, action } }; Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(path))); File.WriteAllText(path, JsonUtility.ToJson(document, true)); @@ -591,6 +609,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public bool providerAdvertisement; public bool providerAssets; public bool movement; + public bool aimPresentation; public bool targeting; public bool action; public bool combatPresentation; @@ -607,6 +626,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public long initialVersion; public long finalVersion; public float movementDistance; + public float aimDotDistance; public int playerRendererCount; public int pilotChangedPixels; public int mapChannelRendererCount; diff --git a/ReleaseConsumerProject/Packages/manifest.json b/ReleaseConsumerProject/Packages/manifest.json index db6b58e..089ad45 100644 --- a/ReleaseConsumerProject/Packages/manifest.json +++ b/ReleaseConsumerProject/Packages/manifest.json @@ -9,7 +9,7 @@ "org.gamecult.cultlib": "https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.13", "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.1.1", "org.gamecult.eve.surface": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.surface#eveunity-surface-v0.2.1", - "org.gamecult.eve.unity-scene": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.24", + "org.gamecult.eve.unity-scene": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.25", "org.gamecult.eve.unity-uitoolkit": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-uitoolkit#eveunity-uitoolkit-v0.1.0" }, "testables": [ diff --git a/ReleaseConsumerProject/Packages/packages-lock.json b/ReleaseConsumerProject/Packages/packages-lock.json index a412205..c2e7ebf 100644 --- a/ReleaseConsumerProject/Packages/packages-lock.json +++ b/ReleaseConsumerProject/Packages/packages-lock.json @@ -142,7 +142,7 @@ "hash": "d0aa50d31f3b6da96bffc194fdc3aa358f37e332" }, "org.gamecult.eve.unity-scene": { - "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.24", + "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.25", "depth": 0, "source": "git", "dependencies": { @@ -151,7 +151,7 @@ "org.gamecult.eve.surface": "0.2.1", "com.unity.mathematics": "1.3.2" }, - "hash": "e43f2d74557dcbf2cc408893c7b7d7ac708a44a8" + "hash": "58d87c628a261751439584263c18e93a7d8d8708" }, "org.gamecult.eve.unity-uitoolkit": { "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-uitoolkit#eveunity-uitoolkit-v0.1.0", diff --git a/TestProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs b/TestProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs index 9f58eac..4723fe8 100644 --- a/TestProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs +++ b/TestProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs @@ -188,6 +188,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests EveUnityPlayableWorldClientHost host = null; EveUnityPlayableWorldRuntime runtime = null; WitnessReceipt movementReceipt = null; + WitnessReceipt lookReceipt = null; WitnessReceipt focusReceipt = null; WitnessReceipt actionReceipt = null; EveUnityShotReceipt observedShot = null; @@ -196,6 +197,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests float hullRatioBefore = 0f; long initialVersion = 0; float movementDistance = 0f; + float aimDotDistance = 0f; try { @@ -344,18 +346,24 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests aim.y = 0; Assert.That(aim.sqrMagnitude, Is.GreaterThan(0.0001f)); aim.Normalize(); - var steerVersion = runtime.ActiveVersion; - var steer = runtime.SubmitMoveVectorIntent(playerId, aim.x, aim.z, 0.25f); - var steerDeadline = Time.realtimeSinceStartup + 12f; - while (Time.realtimeSinceStartup < steerDeadline && - (runtime.LastReceipt == null || runtime.LastReceipt.CommandId != steer.CommandId || - !string.Equals(runtime.LastReceipt.State, "reconciled", StringComparison.OrdinalIgnoreCase))) + var lookVersion = runtime.ActiveVersion; + var look = runtime.SubmitLookDirectionIntent(playerId, aim.x, 0f, aim.z); + var lookDeadline = Time.realtimeSinceStartup + 12f; + while (Time.realtimeSinceStartup < lookDeadline && + (runtime.LastReceipt == null || runtime.LastReceipt.CommandId != look.CommandId || + !string.Equals(runtime.LastReceipt.State, "reconciled", StringComparison.OrdinalIgnoreCase) || + runtime.ActiveVersion < runtime.LastReceipt.SourceVersion || + Vector3.Dot(FindMarker(root, playerId).transform.forward, aim) < 0.99f)) { yield return new WaitForSecondsRealtime(0.1f); runtime.Refresh(); } - AssertReconciledProviderReceipt(runtime.LastReceipt, steer.CommandId, - provider.Selection.ProviderId, provider.Selection.SurfaceId, steerVersion); + AssertReconciledProviderReceipt(runtime.LastReceipt, look.CommandId, + provider.Selection.ProviderId, provider.Selection.SurfaceId, lookVersion); + Assert.That(Vector3.Dot(FindMarker(root, playerId).transform.forward, aim), Is.GreaterThan(0.99f)); + lookReceipt = WitnessReceipt.From("look", runtime.LastReceipt); + var aimRenderer = root.GetComponent(); + Assert.That(aimRenderer, Is.Not.Null); var focusVersion = runtime.ActiveVersion; var inputDriver = root.GetComponent() ?? @@ -448,6 +456,10 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests cameraRig.CameraTransform = camera.transform; cameraRig.RenderPolicySource = provider; Assert.That(cameraRig.ApplyRig(0f), Is.True); + aimRenderer.RefreshNow(); + Assert.That(aimRenderer.ViewDotVisible, Is.True); + aimDotDistance = Vector3.Distance(playerMarker.transform.position, aimRenderer.ViewDotPosition); + Assert.That(aimDotDistance, Is.GreaterThanOrEqualTo(49.9f)); Assert.That(camera.cullingMask & (1 << mapLayer), Is.Zero); Assert.That(camera.fieldOfView, Is.EqualTo(60f).Within(0.001f)); var playerViewport = camera.WorldToViewportPoint(playerMarker.transform.position); @@ -504,6 +516,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests (camera.cullingMask & (1 << mapLayer)) == 0, (mapCamera.cullingMask & (1 << mapLayer)) != 0, movementReceipt, + lookReceipt, focusReceipt, actionReceipt, observedShot, @@ -511,7 +524,8 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests observedCombat?.ShieldRatio ?? shieldRatioBefore, hullRatioBefore, observedCombat?.HullRatio ?? hullRatioBefore, - (float)observedShot.LockQuality); + (float)observedShot.LockQuality, + aimDotDistance); } finally { @@ -541,6 +555,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests bool pilotCameraExcludesMapChannel, bool mapCameraIncludesMapChannel, WitnessReceipt movement, + WitnessReceipt look, WitnessReceipt targeting, WitnessReceipt action, EveUnityShotReceipt shot, @@ -548,7 +563,8 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests float shieldRatioAfter, float hullRatioBefore, float hullRatioAfter, - float lockProgress) + float lockProgress, + float aimDotDistance) { var path = Environment.GetEnvironmentVariable("EVEUNITY_WITNESS_FACTS_PATH"); if (string.IsNullOrWhiteSpace(path)) return; @@ -557,6 +573,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests providerAdvertisement = true, providerAssets = true, movement = movement != null, + aimPresentation = look != null && aimDotDistance >= 49.9f, targeting = targeting != null, action = action != null, combatPresentation = shot != null, @@ -573,13 +590,14 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests initialVersion = initialVersion, finalVersion = finalVersion, movementDistance = movementDistance, + aimDotDistance = aimDotDistance, playerRendererCount = playerRendererCount, pilotChangedPixels = pilotChangedPixels, mapChannelRendererCount = mapChannelRendererCount, mapChangedPixels = mapChangedPixels, pilotCameraExcludesMapChannel = pilotCameraExcludesMapChannel, mapCameraIncludesMapChannel = mapCameraIncludesMapChannel, - receipts = new[] { movement, targeting, action } + receipts = new[] { movement, look, targeting, action } }; Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(path))); File.WriteAllText(path, JsonUtility.ToJson(document, true)); @@ -591,6 +609,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public bool providerAdvertisement; public bool providerAssets; public bool movement; + public bool aimPresentation; public bool targeting; public bool action; public bool combatPresentation; @@ -607,6 +626,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public long initialVersion; public long finalVersion; public float movementDistance; + public float aimDotDistance; public int playerRendererCount; public int pilotChangedPixels; public int mapChannelRendererCount; diff --git a/scripts/run-aetheria-daemon-world-witness.ps1 b/scripts/run-aetheria-daemon-world-witness.ps1 index 213d96f..94d4ce2 100644 --- a/scripts/run-aetheria-daemon-world-witness.ps1 +++ b/scripts/run-aetheria-daemon-world-witness.ps1 @@ -13,7 +13,7 @@ param( ) $ErrorActionPreference = "Stop" -$expectedEveUnityCommit = "e43f2d74557dcbf2cc408893c7b7d7ac708a44a8" +$expectedEveUnityCommit = "58d87c628a261751439584263c18e93a7d8d8708" $expectedCultLibCommit = "feb5c71513e71d681699f462fe3682b3168c6f73" $repoRoot = Split-Path -Parent $PSScriptRoot $projectRoot = $ClientProject