void ParseMesh(ModelMesh modelMesh, BabylonScene scene, BabylonSkeleton skeleton) { var proxyID = ProxyMesh.CreateBabylonMesh(modelMesh.Name, scene); int indexName = 0; foreach (var part in modelMesh.MeshParts) { var material = exportedMaterials.First(m => m.Name == part.Effect.GetHashCode().ToString()); var indices = new ushort[part.PrimitiveCount * 3]; part.IndexBuffer.GetData(part.StartIndex * 2, indices, 0, indices.Length); if (part.VertexBuffer.VertexDeclaration.VertexStride > PositionNormalTextured.Stride) { var mesh = new Mesh <PositionNormalTexturedWeights>(material); var vertices = new PositionNormalTexturedWeights[part.NumVertices]; part.VertexBuffer.GetData(part.VertexOffset * part.VertexBuffer.VertexDeclaration.VertexStride, vertices, 0, vertices.Length, part.VertexBuffer.VertexDeclaration.VertexStride); for (int index = 0; index < vertices.Length; index++) { vertices[index].TextureCoordinates.Y = 1.0f - vertices[index].TextureCoordinates.Y; } mesh.AddPart(indexName.ToString(), vertices.ToList(), indices.Select(i => (int)i).ToList()); mesh.CreateBabylonMesh(scene, proxyID, skeleton); } else { var mesh = new Mesh <PositionNormalTextured>(material); var vertices = new PositionNormalTextured[part.NumVertices]; part.VertexBuffer.GetData(part.VertexOffset * PositionNormalTextured.Stride, vertices, 0, vertices.Length, PositionNormalTextured.Stride); for (int index = 0; index < vertices.Length; index++) { vertices[index].TextureCoordinates.Y = 1.0f - vertices[index].TextureCoordinates.Y; } mesh.AddPart(indexName.ToString(), vertices.ToList(), indices.Select(i => (int)i).ToList()); mesh.CreateBabylonMesh(scene, proxyID, skeleton); } indexName++; } }
void ParseMesh(ModelMesh modelMesh, BabylonScene scene, BabylonSkeleton skeleton, bool rightToLeft) { var proxyID = ProxyMesh.CreateBabylonMesh(modelMesh.Name, scene); int indexName = 0; foreach (var part in modelMesh.MeshParts) { var material = exportedMaterials.First(m => m.Name == part.Effect.GetHashCode().ToString()); var indices = new ushort[part.PrimitiveCount * 3]; part.IndexBuffer.GetData(part.StartIndex * 2, indices, 0, indices.Length); if (rightToLeft) { for (int ib = 0; ib < indices.Length; ib += 3) // reverse winding of triangles { ushort ti = indices[ib]; indices[ib] = indices[ib + 2]; indices[ib + 2] = ti; } } if (part.VertexBuffer.VertexDeclaration.VertexStride >= PositionNormalTexturedWeights.Stride) { var mesh = new Mesh<PositionNormalTexturedWeights>(material); var vertices = new PositionNormalTexturedWeights[part.NumVertices]; part.VertexBuffer.GetData(part.VertexOffset * part.VertexBuffer.VertexDeclaration.VertexStride, vertices, 0, vertices.Length, part.VertexBuffer.VertexDeclaration.VertexStride); for (int index = 0; index < vertices.Length; index++) { vertices[index].TextureCoordinates.Y = 1.0f - vertices[index].TextureCoordinates.Y; if (rightToLeft) { vertices[index].Position.Z = -vertices[index].Position.Z; vertices[index].Normal.Z = -vertices[index].Normal.Z; } } mesh.AddPart(modelMesh.Name+"#"+indexName.ToString(), vertices.ToList(), indices.Select(i => (int)i).ToList()); mesh.CreateBabylonMesh(scene, proxyID, skeleton); } else { if (part.VertexBuffer.VertexDeclaration.VertexStride < PositionNormalTextured.Stride) return; // Error: Not a PositionNormalTextured mesh! var mesh = new Mesh<PositionNormalTextured>(material); var vertices = new PositionNormalTextured[part.NumVertices]; part.VertexBuffer.GetData(part.VertexOffset * part.VertexBuffer.VertexDeclaration.VertexStride, vertices, 0, vertices.Length, part.VertexBuffer.VertexDeclaration.VertexStride); for (int index = 0; index < vertices.Length; index++) { vertices[index].TextureCoordinates.Y = 1.0f - vertices[index].TextureCoordinates.Y; if (rightToLeft) { vertices[index].Position.Z = -vertices[index].Position.Z; vertices[index].Normal.Z = -vertices[index].Normal.Z; } } mesh.AddPart(modelMesh.Name + "#" + indexName.ToString(), vertices.ToList(), indices.Select(i => (int)i).ToList()); mesh.CreateBabylonMesh(scene, proxyID, skeleton); } indexName++; } }
void ParseMesh(ModelMesh modelMesh, BabylonScene scene, BabylonSkeleton skeleton) { var proxyID = ProxyMesh.CreateBabylonMesh(modelMesh.Name, scene); int indexName = 0; foreach (var part in modelMesh.MeshParts) { var material = exportedMaterials.First(m => m.Name == part.Effect.GetHashCode().ToString()); var indices = new ushort[part.PrimitiveCount * 3]; part.IndexBuffer.GetData(part.StartIndex * 2, indices, 0, indices.Length); if (part.VertexBuffer.VertexDeclaration.VertexStride >= PositionNormalTexturedWeights.Stride) { var mesh = new Mesh<PositionNormalTexturedWeights>(material); var vertices = new PositionNormalTexturedWeights[part.NumVertices]; part.VertexBuffer.GetData(part.VertexOffset * part.VertexBuffer.VertexDeclaration.VertexStride, vertices, 0, vertices.Length, part.VertexBuffer.VertexDeclaration.VertexStride); for (int index = 0; index < vertices.Length; index++) { vertices[index].TextureCoordinates.Y = 1.0f - vertices[index].TextureCoordinates.Y; } mesh.AddPart(indexName.ToString(), vertices.ToList(), indices.Select(i => (int)i).ToList()); mesh.CreateBabylonMesh(scene, proxyID, skeleton); } else { var mesh = new Mesh<PositionNormalTextured>(material); var vertices = new PositionNormalTextured[part.NumVertices]; part.VertexBuffer.GetData(part.VertexOffset * PositionNormalTextured.Stride, vertices, 0, vertices.Length, PositionNormalTextured.Stride); for (int index = 0; index < vertices.Length; index++) { vertices[index].TextureCoordinates.Y = 1.0f - vertices[index].TextureCoordinates.Y; } mesh.AddPart(indexName.ToString(), vertices.ToList(), indices.Select(i => (int)i).ToList()); mesh.CreateBabylonMesh(scene, proxyID, skeleton); } indexName++; } }