Пример #1
0
        private MeshData ProcessMesh(Assimp.Mesh assImpMesh, Scene scene)
        {
            Vertex[]     vertices    = ProcessVerticies(assImpMesh);
            uint[]       meshIndices = ProcessIndices(assImpMesh);
            MaterialData material    = ProcessMaterials(assImpMesh, scene);

            return(new MeshData(vertices, meshIndices, material));
        }
Пример #2
0
        private MaterialData ProcessMaterials(Assimp.Mesh assImpMesh, Scene scene)
        {
            Assimp.Material assImpMeshMaterial = scene.Materials[assImpMesh.MaterialIndex];
            TextureData     diffuse            = ProcessTexture(TextureType.Diffuse, scene, assImpMeshMaterial);
            TextureData     normalMap          = ProcessTexture(TextureType.Height, scene, assImpMeshMaterial);
            TextureData     specularMap        = ProcessTexture(TextureType.Specular, scene, assImpMeshMaterial);

            MaterialData material = new MaterialData(diffuse, normalMap, specularMap);

            return(material);
        }
Пример #3
0
        private uint[] ProcessIndices(Assimp.Mesh assImpMesh)
        {
            List <Face> assImpMeshFaces = assImpMesh.Faces;
            List <uint> meshIndices     = new List <uint>(assImpMesh.FaceCount * 3);

            for (int i = 0; i < assImpMeshFaces.Count; i++)
            {
                List <int> faceIndices = assImpMeshFaces[i].Indices;
                for (int j = 0; j < faceIndices.Count; j++)
                {
                    meshIndices.Add((uint)faceIndices[j]);
                }
            }

            return(meshIndices.ToArray());
        }
Пример #4
0
        private void ProcessNode(Node node, Scene scene)
        {
            List <int> assImpNodeMeshIndicies = node.MeshIndices;

            for (int i = 0; i < assImpNodeMeshIndicies.Count; i++)
            {
                Assimp.Mesh assImpMesh = scene.Meshes[assImpNodeMeshIndicies[i]];

                MeshData newMesh = ProcessMesh(assImpMesh, scene);
                meshes.Add(newMesh);
            }

            foreach (Node child in node.Children)
            {
                ProcessNode(child, scene);
            }
        }
Пример #5
0
        private Vertex[] ProcessVerticies(Assimp.Mesh assImpMesh)
        {
            List <Assimp.Vector3D> assImpMeshVertices = assImpMesh.Vertices;
            List <Assimp.Vector3D> assImpMeshNormals  = assImpMesh.Normals;
            List <Assimp.Vector3D> assImpMeshTangents = assImpMesh.Tangents;

            List <Assimp.Vector3D>[] assImpMeshTextureCoords = assImpMesh.TextureCoordinateChannels;

            Vertex[] vertices = new Vertex[assImpMeshVertices.Count];
            for (int i = 0; i < assImpMeshVertices.Count; i++)
            {
                Assimp.Vector3D position  = assImpMeshVertices[i];
                Vector3         pos       = new Vector3(position.X, position.Y, position.Z);
                Vector3         normals   = new Vector3(0, 0, 0);
                Vector3         tangent   = new Vector3(0, 0, 0);
                Vector2         texCoords = new Vector2(0, 0);

                if (assImpMesh.HasNormals)
                {
                    Assimp.Vector3D assImpMeshNormal = assImpMeshNormals[i];
                    normals.X = assImpMeshNormal.X;
                    normals.Y = assImpMeshNormal.Y;
                    normals.Z = assImpMeshNormal.Z;
                }

                /*if (assImpMesh.HasTangentBasis) {
                 *  Assimp.Vector3D assImpMeshTangent = assImpMeshTangents[i];
                 *  tangent.X = assImpMeshTangent.X;
                 *  tangent.Y = assImpMeshTangent.Y;
                 *  tangent.Z = assImpMeshTangent.Z;
                 * }*/

                if (assImpMesh.HasTextureCoords(0))
                {
                    Assimp.Vector3D assImpMeshTexCoord = assImpMeshTextureCoords[0][i];
                    texCoords.X = assImpMeshTexCoord.X;
                    texCoords.Y = assImpMeshTexCoord.Y;
                }

                vertices[i] = new Vertex(pos, normals, tangent, texCoords);
            }

            return(vertices);
        }