opti
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user