private void DrawClusterGizmo(CameraRig rig, ClusterRenderer clusterRenderer) { int totalNodeCount; if (rig.clusterType == CameraRig.ClusterType.Wall) totalNodeCount = rig.wallParams.cols * rig.wallParams.rows; else totalNodeCount = rig.caveParams.sides + (rig.caveParams.hasFloor ? 1 : 0) + (rig.caveParams.hasSky ? 1 : 0); for (int i = 0; i < totalNodeCount; ++i) { if (m_PreviewingIndex != -1 && m_PreviewingIndex != i) continue; float nearLeft = 0.0f; float nearRight = 0.0f; float nearBottom = 0.0f; float nearTop = 0.0f; // Get the nears rig.CalculateCameraProjectionFrustum (i, ref nearLeft, ref nearRight, ref nearBottom, ref nearTop); float ratio = rig.farClip / rig.nearClip; // Calculate the far float farLeft = nearLeft * ratio; float farRight = nearRight * ratio; float farBottom = nearBottom * ratio; float farTop = nearTop * ratio; // Points Vector3[] near = new Vector3[4]; near[0] = new Vector3 (nearLeft, nearBottom, rig.nearClip); near[1] = new Vector3 (nearRight, nearBottom, rig.nearClip); near[2] = new Vector3 (nearRight, nearTop, rig.nearClip); near[3] = new Vector3 (nearLeft, nearTop, rig.nearClip); Vector3[] far = new Vector3[4]; far[0] = new Vector3 (farLeft, farBottom, rig.farClip); far[1] = new Vector3 (farRight, farBottom, rig.farClip); far[2] = new Vector3 (farRight, farTop, rig.farClip); far[3] = new Vector3 (farLeft, farTop, rig.farClip); // Local to world transform (ignore scale of transform) Matrix4x4 localToWorld; if (rig.clusterType == CameraRig.ClusterType.Wall) { localToWorld = Matrix4x4.TRS(clusterRenderer.transform.position, clusterRenderer.transform.rotation, Vector3.one); } else { Quaternion q = clusterRenderer.transform.rotation * (m_PreviewingIndex == -1 ? Quaternion.Euler (rig.CalculateRotationForCaveNode (i)) : Quaternion.identity); localToWorld = Matrix4x4.TRS (clusterRenderer.transform.position, q, Vector3.one); } // transform point to world for (int p = 0; p < 4; ++p) { near[p] = localToWorld.MultiplyPoint (near[p]); far[p] = localToWorld.MultiplyPoint (far[p]); } // Draw the frustum gizmo for (int p = 0; p < 4; ++p) { Handles.DrawLine (near[p], near[(p + 1) % 4]); Handles.DrawLine (far[p], far[(p + 1) % 4]); Handles.DrawLine (near[p], far[p]); } // Label to show which index of node this screen belongs to Handles.Label(Vector3.Lerp(far[1], far[3], 0.9f), "" + i); // Button to activate preview Vector3 midPoint = Vector3.Lerp (far[0], far[2], 0.5f); float handleSize = HandleUtility.GetHandleSize(midPoint) * 0.1f; if (Handles.Button(midPoint, Quaternion.identity, handleSize, handleSize, Handles.DotCap)) { if (m_PreviewingIndex == i) { m_PreviewingIndex = -1; ResetCamera (); } else { m_PreviewingIndex = i; rig.SetupCamera (Camera.main, i); } } } }