public void Initialize() { var vertices = new List <MeshVerticeInfo>(); var indices = new List <int>(); AssimpContext importer = new AssimpContext(); Scene aScene = importer.ImportFile(FilePath, PostProcessPreset.TargetRealTimeMaximumQuality); foreach (var aMesh in aScene.Meshes) { for (int faceIndex = 0; faceIndex < aMesh.FaceCount; faceIndex++) { for (int vertexNum = 0; vertexNum < 3; vertexNum++) { int verticeIndice = aMesh.Faces[faceIndex].Indices[vertexNum]; Vector3 verticePosition = AssimpHelper.VectorAssimpToXna(aMesh.Vertices[verticeIndice]); Vector3 verticeNormal = AssimpHelper.VectorAssimpToXna(aMesh.Normals[verticeIndice]); Vector3 uv = AssimpHelper.VectorAssimpToXna(aMesh.TextureCoordinateChannels[0][verticeIndice]); var verticeUv = new Vector2(uv.X, uv.Y); var vertice = new MeshVerticeInfo() { Position = verticePosition, Normal = verticeNormal, TextureCoordinate = verticeUv }; indices.Add(vertices.Count); vertices.Add(vertice); } } FaceCount += aMesh.FaceCount; } VertexBuffer = new VertexBuffer(GraphicsDevice, typeof(SimpleModelVertex), vertices.Count, BufferUsage.WriteOnly); VertexBuffer.SetData <SimpleModelVertex>(vertices.Select(v => v.ToSimpleModelVertex()).ToArray()); IndexBuffer = new IndexBuffer(GraphicsDevice, typeof(int), indices.Count, BufferUsage.WriteOnly); IndexBuffer.SetData(indices.ToArray()); }
public void Initialize() { var importer = new AssimpContext(); var aScene = importer.ImportFile(FilePath, PostProcessPreset.TargetRealTimeMaximumQuality); Meshes = new List <Mesh>(); foreach (var aMesh in aScene.Meshes) { var verticesResult = new List <MeshSkinnedVerticeInfo>(); var indicesResult = new List <int>(); var mesh = new Mesh(); mesh.Bones = new List <Bone>(); mesh.Name = aMesh.Name; Dictionary <int, List <VerticeWeight> > VerticeWeights = new Dictionary <int, List <VerticeWeight> >(); foreach (var aBone in aMesh.Bones) { Bone bone = GetBone(mesh, aBone); foreach (var vw in aBone.VertexWeights) { if (!VerticeWeights.ContainsKey(vw.VertexID)) { VerticeWeights.Add(vw.VertexID, new List <VerticeWeight>()); } VerticeWeights[vw.VertexID].Add(new VerticeWeight() { Bone = bone, Weight = vw.Weight }); } } var c = aScene.Materials[aMesh.MaterialIndex].ColorDiffuse; for (int faceIndex = 0; faceIndex < aMesh.FaceCount; faceIndex++) { for (int vertexNum = 0; vertexNum < 3; vertexNum++) { int verticeIndice = aMesh.Faces[faceIndex].Indices[vertexNum]; Vector3 verticePosition = AssimpHelper.VectorAssimpToXna(aMesh.Vertices[verticeIndice]); Vector3 verticeNormal = AssimpHelper.VectorAssimpToXna(aMesh.Normals[verticeIndice]); var uv = AssimpHelper.VectorAssimpToXna(aMesh.TextureCoordinateChannels[0][verticeIndice]); var verticeUv = new Vector2(uv.X, uv.Y); BlendInfo blendInfo = GetBlendInfo(VerticeWeights, verticeIndice); var vertice = new MeshSkinnedVerticeInfo() { Position = verticePosition, Normal = verticeNormal, TextureCoordinate = verticeUv, BoneID = blendInfo.BoneId, BoneWeight = blendInfo.Weight }; indicesResult.Add(verticesResult.Count); verticesResult.Add(vertice); } } mesh.TextureFilePath = aScene.Materials[aMesh.MaterialIndex].TextureDiffuse.FilePath; mesh.VertexBuffer = new VertexBuffer(GraphicsDevice, typeof(SkinnedModelVertex), verticesResult.Count, BufferUsage.WriteOnly); mesh.VertexBuffer.SetData <SkinnedModelVertex>(verticesResult.Select(v => v.ToVertexPositionNormalTextureBones()).ToArray()); mesh.IndexBuffer = new IndexBuffer(GraphicsDevice, typeof(int), indicesResult.Count, BufferUsage.WriteOnly); mesh.IndexBuffer.SetData(indicesResult.ToArray()); mesh.FaceCount = aMesh.FaceCount; Meshes.Add(mesh); } }