/// <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); }