Beispiel #1
0
            // Extracts an easily processable BVH tree from the packed version in the mesh data
            public BVHNode getMeshBVH()
            {
                if (CompressedBVH.Size == 0 || CompressedBVH.GetArrayData() == null)
                {
                    return(null);
                }

                BVHNode root = new BVHNode();

                root.Min = new Vector3(BoundingBoxMin.X, BoundingBoxMin.Y, BoundingBoxMin.Z);
                root.Max = new Vector3(BoundingBoxMax.X, BoundingBoxMax.Y, BoundingBoxMax.Z);

                CompressedMeshBVHNode cnode = CompressedBVH.GetArrayData().Elements[0];

                if ((cnode.IDX0 & 0x80) > 0)
                {
                    root.Left  = buildBVHTree(root.Min, root.Max, 1);
                    root.Right = buildBVHTree(root.Min, root.Max, ((((uint)cnode.IDX0 & 0x7F) << 8) | (uint)cnode.IDX1) * 2);
                }
                else
                {
                    root.IsTerminal = true;
                    root.Index      = (((uint)cnode.IDX0 & 0x7F) << 8) | (uint)cnode.IDX1;
                }

                return(root);
            }
Beispiel #2
0
            // Recursively builds the BVH tree from the compressed packed array
            private BVHNode buildBVHTree(Vector3 parentBBMin, Vector3 parentBBMax, uint nodeIndex)
            {
                BVHNode node = new BVHNode();
                CompressedMeshBVHNode cnode = CompressedBVH.GetArrayData().Elements[(int)nodeIndex];

                node.Min = cnode.DecompressMin(parentBBMin, parentBBMax);
                node.Max = cnode.DecompressMax(parentBBMin, parentBBMax);

                if ((cnode.IDX0 & 0x80) > 0)
                {
                    node.Left  = buildBVHTree(node.Min, node.Max, nodeIndex + 1);
                    node.Right = buildBVHTree(node.Min, node.Max, nodeIndex + ((((uint)cnode.IDX0 & 0x7F) << 8) | (uint)cnode.IDX1) * 2);
                }
                else
                {
                    node.IsTerminal = true;
                    node.Index      = (((uint)cnode.IDX0 & 0x7F) << 8) | (uint)cnode.IDX1;
                }
                return(node);
            }