diff --git a/Assets/Scenes/ARPG.unity b/Assets/Scenes/ARPG.unity index 370f1914b..9c650e2f0 100644 --- a/Assets/Scenes/ARPG.unity +++ b/Assets/Scenes/ARPG.unity @@ -8037,7 +8037,7 @@ Camera: m_Depth: 0 m_CullingMask: serializedVersion: 2 - m_Bits: 5632 + m_Bits: 5120 m_RenderingPath: 1 m_TargetTexture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} m_TargetDisplay: 0 diff --git a/Assets/Scripts/Editor/GravityFieldParityVerify.cs b/Assets/Scripts/Editor/GravityFieldParityVerify.cs index c6de02c4a..7791fa62b 100644 --- a/Assets/Scripts/Editor/GravityFieldParityVerify.cs +++ b/Assets/Scripts/Editor/GravityFieldParityVerify.cs @@ -295,6 +295,17 @@ namespace Aetheria.EditorTools } if (seen < gravityTargets.Length) Fail("wiring", $"only {seen} gravity cameras found in ARPG.unity"); + // The patch texture is half-float: it holds the patch layers only, the nebula reads gravity from the R32 surface. + var patchCameras = 0; + foreach (var camera in UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)) + { + if (camera.targetTexture == null || camera.targetTexture.name != "Fog Patch Displacement") continue; + patchCameras++; + if ((camera.cullingMask & 1 << GravityLowering.FieldLayer) != 0) + Fail("wiring", $"camera {camera.name} (target Fog Patch Displacement) culls layer {GravityLowering.FieldLayer}, the gravity layer"); + } + if (patchCameras != 1) Fail("wiring", $"{patchCameras} Fog Patch Displacement cameras in ARPG.unity, expected 1"); + // The map screen's gravity camera has no target until MapRenderer gives it one at run time. var map = UnityEngine.Object.FindFirstObjectByType(FindObjectsInactive.Include); if (map == null || map.GravityCamera == null) Fail("wiring", "no MapRenderer.GravityCamera in ARPG.unity"); diff --git a/Assets/Shaders/Brushes/GravityField.shader b/Assets/Shaders/Brushes/GravityField.shader index b3987aab1..857d7c80e 100644 --- a/Assets/Shaders/Brushes/GravityField.shader +++ b/Assets/Shaders/Brushes/GravityField.shader @@ -1,5 +1,5 @@ // Draws the zone's gravity: depth = -Zone.GetHeight at the world xz of every texel, into whichever gravity camera culls -// layer 9 (Surface Displacement, Patch Displacement, Slime Gravity, both Map Gravity). One quad covers the zone; the +// layer 9 (Surface Displacement, Slime Gravity, both Map Gravity). One quad covers the zone; the // law lives in Gravity.cginc, which mirrors ServerShared's GravityField. Shader "Brushes/Gravity Field" { Category { diff --git a/Assets/Shaders/Volumetric.cginc b/Assets/Shaders/Volumetric.cginc index ec95aedc3..2ceb66314 100644 --- a/Assets/Shaders/Volumetric.cginc +++ b/Assets/Shaders/Volumetric.cginc @@ -97,7 +97,9 @@ float cloudDensity(float3 pos, float surfaceDisp) float2 uv = getUV(pos.xz); const float dist = pos.y + surfaceDisp - _NebulaFloorOffset; const float patch = tex2Dlod(_NebulaPatch, half4(uv, 0, 0)).r; - const float patchDisp = tex2Dlod(_NebulaPatchHeight, half4(uv, 0, 0)).r; + // Gravity comes from the R32 surface height the caller sampled at this uv; the patch texture carries only the patch + // layers (sector waves, patch brushes), small enough for half floats. + const float patchDisp = surfaceDisp + tex2Dlod(_NebulaPatchHeight, half4(uv, 0, 0)).r; const float patchDensity = saturate((-abs(pos.y+patchDisp - _NebulaFloorOffset)+patch)/_NebulaPatchBlend)*_NebulaPatchDensity; const float floorDist = -dist;