Example #1
0
    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);
                        }
                    }
                }
            }
        }
    }
Example #2
0
    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);
                    }
                }
            }
        }
    }
Example #3
0
    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);
    }
Example #4
0
    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;
    }