Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
    // 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);
    }