Пример #1
0
        /// <summary>
        /// Returns the resulting mesh.
        /// </summary>
        /// <returns>The resulting mesh.</returns>
        public override Mesh ToMesh()
        {
            int vertexCount   = this.vertices.Length;
            int triangleCount = this.triangles.Length;
            var vertices      = new Vector3d[vertexCount];
            var indices       = new int[subMeshCount][];

            var vertArr = this.vertices.Data;

            for (int i = 0; i < vertexCount; i++)
            {
                vertices[i] = vertArr[i].p;
            }

            // First get the sub-mesh offse-ts
            var triArr = this.triangles.Data;

            int[] subMeshOffsets    = new int[subMeshCount];
            int   lastSubMeshOffset = -1;

            for (int i = 0; i < triangleCount; i++)
            {
                var triangle = triArr[i];
                if (triangle.subMeshIndex != lastSubMeshOffset)
                {
                    for (int j = lastSubMeshOffset + 1; j < triangle.subMeshIndex; j++)
                    {
                        subMeshOffsets[j] = i - 1;
                    }
                    subMeshOffsets[triangle.subMeshIndex] = i;
                    lastSubMeshOffset = triangle.subMeshIndex;
                }
            }
            for (int i = lastSubMeshOffset + 1; i < subMeshCount; i++)
            {
                subMeshOffsets[i] = triangleCount;
            }

            // Then setup the sub-meshes
            for (int subMeshIndex = 0; subMeshIndex < subMeshCount; subMeshIndex++)
            {
                int startOffset          = subMeshOffsets[subMeshIndex];
                int endOffset            = ((subMeshIndex + 1) < subMeshCount ? subMeshOffsets[subMeshIndex + 1] : triangleCount) - 1;
                int subMeshTriangleCount = endOffset - startOffset + 1;
                if (subMeshTriangleCount < 0)
                {
                    subMeshTriangleCount = 0;
                }
                int[] subMeshIndices = new int[subMeshTriangleCount * 3];
                for (int triangleIndex = startOffset; triangleIndex <= endOffset; triangleIndex++)
                {
                    var triangle = triArr[triangleIndex];
                    int offset   = (triangleIndex - startOffset) * 3;
                    subMeshIndices[offset]     = triangle.v0;
                    subMeshIndices[offset + 1] = triangle.v1;
                    subMeshIndices[offset + 2] = triangle.v2;
                }

                indices[subMeshIndex] = subMeshIndices;
            }

            Mesh newMesh = new Mesh(vertices, indices);

            if (vertNormals != null)
            {
                vertNormals.TrimExcess();
                newMesh.Normals = vertNormals.Data;
            }
            if (vertTangents != null)
            {
                vertTangents.TrimExcess();
                newMesh.Tangents = vertTangents.Data;
            }
            if (vertUV1 != null)
            {
                vertUV1.TrimExcess();
                newMesh.UV1 = vertUV1.Data;
            }
            if (vertUV2 != null)
            {
                vertUV2.TrimExcess();
                newMesh.UV2 = vertUV2.Data;
            }
            if (vertUV3 != null)
            {
                vertUV3.TrimExcess();
                newMesh.UV3 = vertUV3.Data;
            }
            if (vertUV4 != null)
            {
                vertUV4.TrimExcess();
                newMesh.UV4 = vertUV4.Data;
            }
            if (vertColors != null)
            {
                vertColors.TrimExcess();
                newMesh.Colors = vertColors.Data;
            }
            if (vertBoneWeights != null)
            {
                vertBoneWeights.TrimExcess();
                newMesh.BoneWeights = vertBoneWeights.Data;
            }

            return(newMesh);
        }