// Extracts an easily processable BVH tree from the packed version in the mesh data public BVHNode getChunkBVH() { 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); CompressedChunkBVHNode cnode = CompressedBVH.GetArrayData().Elements[0]; if ((cnode.IDX & 0x01) > 0) { root.Left = buildBVHTree(root.Min, root.Max, 1); root.Right = buildBVHTree(root.Min, root.Max, (uint)cnode.IDX & 0xFE); } else { root.IsTerminal = true; root.Index = (uint)cnode.IDX / 2; } return(root); }
// Recursively builds the BVH tree from the compressed packed array private BVHNode buildBVHTree(Vector3 parentBBMin, Vector3 parentBBMax, uint nodeIndex) { BVHNode node = new BVHNode(); CompressedChunkBVHNode cnode = CompressedBVH.GetArrayData().Elements[(int)nodeIndex]; node.Min = cnode.DecompressMin(parentBBMin, parentBBMax); node.Max = cnode.DecompressMax(parentBBMin, parentBBMax); if ((cnode.IDX & 0x01) > 0) { node.Left = buildBVHTree(node.Min, node.Max, nodeIndex + 1); node.Right = buildBVHTree(node.Min, node.Max, nodeIndex + ((uint)cnode.IDX & 0xFE)); } else { node.IsTerminal = true; node.Index = (uint)cnode.IDX / 2; } return(node); }