static void ProcessNodeChildrenRecursive(VisibleSets visibleSets, WorldFrustrumPlanes frustrumPlanes, int4 nodeID, int depth) { int4 min; int4 max; Octree.GetMinMaxNodeChildrenID(nodeID, out min, out max); var subNodeExtent = Octree.NodeExtent(depth); for (int x = min.x; x < max.x; ++x) { for (int y = min.y; y < max.y; ++y) { for (int z = min.z; z < max.z; ++z) { var subNodeID = new int4(x, y, z, depth); if (!Math.IsCubeCulled(Octree.NodeIDToPoint(subNodeID), subNodeExtent, frustrumPlanes)) { var packedID = Octree.PackID(subNodeID); visibleSets[depth].Add(packedID); if (depth < Octree.LeafLayer) { ProcessNodeChildrenRecursive(visibleSets, frustrumPlanes, subNodeID, depth + 1); } } } } } }
static void ProcessFrustrumClusters(VisibleSets visibleSets, AABB frustrumAABB, WorldFrustrumPlanes frustrumPlanes) { int4 min; int4 max; Octree.GetMinMaxClusterIDs(frustrumAABB, out min, out max); for (int x = min.x; x < max.x; ++x) { for (int y = min.y; y < max.y; ++y) { for (int z = min.z; z < max.z; ++z) { var clusterID = new int4(x, y, z, Octree.ClusterLayer); if (!Math.IsCubeCulled(Octree.ClusterIDToPoint(clusterID.xyz), Octree.ClusterExtent, frustrumPlanes)) { var packedID = Octree.PackID(clusterID); visibleSets.ClusterLayer.Add(packedID); ProcessNodeChildrenRecursive(visibleSets, frustrumPlanes, clusterID, 1); } } } } }
public static WorldFrustrumPlanes ComputeFrustrumPlanes(this Camera camera) { var planeArray = GeometryUtility.CalculateFrustumPlanes(camera); var planes = new WorldFrustrumPlanes(); planes.Left = planeArray[0]; planes.Right = planeArray[1]; planes.Down = planeArray[2]; planes.Up = planeArray[3]; planes.Near = planeArray[4]; planes.Far = planeArray[5]; return(planes); }
private void Update() { Inputs(); this.frustrumPlanesMesh.mesh = this.viewerCamera.Camera.ComputeFrustumMesh(); FrustrumPlanes = this.viewerCamera.Camera.ComputeFrustrumPlanes(); FrustrumAABB = this.viewerCamera.Camera.ComputeFrustrumAABB(); WorldToNDC = this.viewerCamera.Camera.projectionMatrix * this.viewerCamera.Camera.worldToCameraMatrix; Viewer = this.viewerCamera.transform.position; NearPlaneCenter = this.viewerCamera.transform.position + this.viewerCamera.transform.forward * this.viewerCamera.Camera.nearClipPlane; var nearPlane = new Quad(); nearPlane.Center = NearPlaneCenter; nearPlane.LocalRight = this.viewerCamera.transform.right * this.viewerCamera.Camera.NearPlaneHalfWidth(); nearPlane.LocalUp = this.viewerCamera.transform.up * this.viewerCamera.Camera.NearPlaneHalfHeight(); nearPlane.Normal = FrustrumPlanes.Near.normal; NearPlane = nearPlane; }