This commit is contained in:
2026-09-29 12:48:59 +02:00
parent b0c6111d57
commit f48e81716f
3 changed files with 211 additions and 36 deletions
+33 -1
View File
@@ -34,6 +34,9 @@ public sealed class PortalServerGrid : MonoBehaviour
private readonly List<Transform> servers = new List<Transform>();
private readonly List<Collider> colliders = new List<Collider>();
private bool collidersEnabled = true;
private readonly List<Renderer> serverRenderers = new List<Renderer>();
private readonly List<Bounds> serverLocalBounds = new List<Bounds>();
private bool serversCulled;
private float wrapExtent;
// Distance between the centres of two repeated server clusters.
public float RepetitionPeriod => wrapExtent * 2;
@@ -48,7 +51,31 @@ public sealed class PortalServerGrid : MonoBehaviour
private void BeforeCameraRendering(ScriptableRenderContext context, Camera camera)
{
// Match the terrain's current material, including changes made after Update.
if (meadow) SyncBend();
if (!meadow) return;
SyncBend();
CullServers(camera);
}
private void CullServers(Camera camera)
{
if (camera != Camera.main) return;
bool cull = meadow.Culls(camera);
if (!cull && !serversCulled) return;
serversCulled = cull;
for (int i = 0; i < serverRenderers.Count; i++)
{
Renderer renderer = serverRenderers[i];
if (!renderer) continue;
renderer.forceRenderingOff = cull && meadow.IsCulled(WorldBounds(renderer, serverLocalBounds[i]), camera);
}
}
private static Bounds WorldBounds(Renderer renderer, Bounds local)
{
Matrix4x4 matrix = renderer.localToWorldMatrix;
var bounds = new Bounds(matrix.MultiplyPoint3x4(local.center), Vector3.zero);
for (int i = 0; i < 8; i++)
bounds.Encapsulate(matrix.MultiplyPoint3x4(local.center + Vector3.Scale(local.extents,
new Vector3((i & 1) == 0 ? -1 : 1, (i & 2) == 0 ? -1 : 1, (i & 4) == 0 ? -1 : 1))));
return bounds;
}
private void OnValidate()
{
@@ -115,6 +142,9 @@ public sealed class PortalServerGrid : MonoBehaviour
curvedMaterials.Clear();
servers.Clear();
colliders.Clear();
serverRenderers.Clear();
serverLocalBounds.Clear();
serversCulled = false;
}
private GameObject CreateServer()
{
@@ -224,6 +254,8 @@ public sealed class PortalServerGrid : MonoBehaviour
renderer.shadowCastingMode = ShadowCastingMode.Off;
renderer.allowOcclusionWhenDynamic = false;
Bounds expanded = renderer.localBounds;
serverRenderers.Add(renderer);
serverLocalBounds.Add(expanded);
Vector3 scale = renderer.transform.lossyScale;
float minScale = Mathf.Max(0.001f, Mathf.Min(Mathf.Abs(scale.x), Mathf.Abs(scale.y), Mathf.Abs(scale.z)));
expanded.Expand(meadow.BoundsPadding * 2 / minScale);