public BVH(IPrimitive[] p, SplitMethod splitMethod, int maxPerNode = 1) { _p = p; SplitMethod = splitMethod; MaxPerNode = maxPerNode; var primitiveInfo = new BVHPrimitiveInfo[p.Length]; for (var i = 0; i < primitiveInfo.Length; ++i) { primitiveInfo[i] = new BVHPrimitiveInfo(i, p[i].WorldBounds); } var ordered = new List <IPrimitive>(p); var arena = new ObjectArena(); var totalNodes = 0; var root = splitMethod == SplitMethod.HLBVH ? HLBVHBuild(arena, primitiveInfo, out totalNodes, ordered) : RecursiveBuild(arena, primitiveInfo, 0, p.Length, ref totalNodes, ordered); _p = ordered.ToArray(); _nodes = new LinearBVHNode[totalNodes]; var offset = 0; FlattenBVHTree(root, ref offset); arena.Clear(); }
// Create MeshData and MeshBoundingBox of the object private void ParseSceneMesh(Transform meshObject) { MeshData newMeshData = new MeshData(); newMeshData._TriangleIndexStart = _SceneData._SizeOfTriangleList; newMeshData._VertexIndexStart = _SceneData._SizeOfVertexList; newMeshData._BVHNodeOffset = _SceneData._SizeOfBVHNodeList; Mesh mesh = meshObject.GetComponent <MeshFilter>().mesh; Vector3[] newVertexList = mesh.vertices; for (int i = 0; i < newVertexList.Length; i++) { newVertexList[i] = meshObject.rotation * newVertexList[i]; newVertexList[i] = meshObject.localScale.x * newVertexList[i]; newVertexList[i] = meshObject.position + newVertexList[i]; } _SceneData._VertexList.AddRange(newVertexList); _SceneData._SizeOfVertexList += mesh.vertexCount; List <Triangle> newMeshTriangles = new List <Triangle>(); List <BVHPrimitiveInfo> primitiveInfos = new List <BVHPrimitiveInfo>(); int iterator = 0; while (iterator < mesh.triangles.Length) { Triangle newTriangle = new Triangle(); // Set new triangles indices newTriangle.indices.x = mesh.triangles[iterator]; newTriangle.indices.y = mesh.triangles[iterator + 1]; newTriangle.indices.z = mesh.triangles[iterator + 2]; Vector3 p0 = newVertexList[(int)newTriangle.indices.x]; Vector3 p1 = newVertexList[(int)newTriangle.indices.y]; Vector3 p2 = newVertexList[(int)newTriangle.indices.z]; // Set new triangles bounds Bounds3 triBounds = new Bounds3(); triBounds.pMax = Vector3.Max(p0, p1); triBounds.pMax = Vector3.Max(triBounds.pMax, p2); triBounds.pMin = Vector3.Min(p0, p1); triBounds.pMin = Vector3.Min(triBounds.pMin, p2); BVHPrimitiveInfo newInfo = new BVHPrimitiveInfo(newMeshTriangles.Count, triBounds); primitiveInfos.Add(newInfo); iterator += 3; newMeshTriangles.Add(newTriangle); } BVHAcc BVHAccObj = new BVHAcc(ref primitiveInfos); foreach (LinearBVHNode node in BVHAccObj.LinearBVHArr) { LinearBVHNode newLinearNode = new LinearBVHNode(); newLinearNode.bounds = node.bounds; newLinearNode.primitiveOffset = node.primitiveOffset; newLinearNode.secondChildOffset = node.secondChildOffset; //Debug.Log("Primitiveoffset: " + node.primitiveOffset); //Debug.Log("SecondChildoffset: " + node.secondChildOffset); _SceneData._BVHNodeList.Add(newLinearNode); _SceneData._SizeOfBVHNodeList++; } _SceneData._TriangleList.AddRange(newMeshTriangles); _SceneData._SizeOfTriangleList = _SceneData._TriangleList.Count; newMeshData._TriangleIndexEnd = _SceneData._SizeOfTriangleList; AddMaterialData(meshObject); newMeshData._MaterialID = _SceneData._MaterialCount - 1; _SceneData._MeshDataList.Add(newMeshData); _SceneData._MeshCount++; //Debug.Log("Mesh Count: " + _SceneData._MeshCount); //Debug.Log("BVHNode Count: " + _SceneData._SizeOfBVHNodeList); //Debug.Log("BVHNode offset: " + _SceneData._MeshDataList[0]._BVHNodeOffset); }