void OnDrawGizmos() { var c = camera; if (c == null) { return; } if (drawDebugGizmos) { GDOC_Utils.CalculateFrustumPlanes(c, frustumPlanes); Gizmos.color = massGizmoColor; foreach (var id in occludeeList) { var e = occludees[id]; if (e == null) { continue; } if (!e.isActive) { continue; } if (e.currentState == 1 || e.currentState == 3) { continue; } // if (!GeometryUtility.TestPlanesAABB(frustumPlanes, e.bounds)) continue; Gizmos.DrawWireCube(e.position, e.size * 2); } } Gizmos.matrix = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one); Gizmos.color = Color.blue; Gizmos.DrawFrustum(Vector3.zero, c.fieldOfView, c.farClipPlane, c.nearClipPlane, c.aspect); }
void Kickstart() { GDOC_Utils.CalculateFrustumPlanes(camera, frustumPlanes); var pos = camera.transform.position; foreach (var e in FindObjectsOfType <GDOC_Occludee>()) { if (e.mode == GDOC_OccludeeMode.Excluded) { continue; } var d = (pos - e.position).sqrMagnitude; var rv = e.volumeSizeSqr / d; if (rv < 0.01 || (rv < 0.05 && !GeometryUtility.TestPlanesAABB(frustumPlanes, e.bounds))) { e.SetVisibleState(0, false); } } }
void EnableFrustumObjects() { if (shouldLogInfo) { sw.Reset(); sw.Start(); } GDOC_Utils.CalculateFrustumPlanes(camera, frustumPlanes); var pos = camera.transform.position; var count = 0; for (var i = occluders.Count - 1; i >= 0; i--) { var e = occluders[i]; if (e == null) { occluders.RemoveAt(i); continue; } if (!e.isActive) { continue; } if (e.currentState == 1 || e.currentState == 3) { continue; } var d = (pos - e.position).sqrMagnitude; var rv = e.volumeSizeSqr / d; if (rv < teleportRV) { continue; } if (!GeometryUtility.TestPlanesAABB(frustumPlanes, e.bounds)) { continue; } ChangeOccludeeState(e.runtimeId, 1); UpdateOccludeeState(e.runtimeId, 1); count++; } if (shouldLogInfo) { var t = (float)sw.ElapsedTicks / Stopwatch.Frequency * 1000f; UnityEngine.Debug.Log(string.Format("Enabled {0} of {1} objects in {2} ms", count, occluders.Count, t)); } }