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());
        }
Esempio n. 2
0
        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);
            }
        }