Exemple #1
0
        private IEnumerator ImportMeshes()
        {
            int i = 0;

            foreach (Assimp.Mesh assimpMesh in scene.Meshes)
            {
                GlobalState.Instance.messageBox.ShowMessage("Importing Meshes : " + i + " / " + scene.MeshCount);
                if (assimpMesh.HasBones)
                {
                    isHuman = true;
                }

                SubMeshComponent subMeshComponent = ImportMesh(assimpMesh);
                meshes.Add(subMeshComponent);
                i++;

                progress += 0.25f / scene.MeshCount;

                if (isHuman)
                {
                    foreach (Assimp.Bone bone in assimpMesh.Bones)
                    {
                        if (!bones.ContainsKey(bone.Name))
                        {
                            bones.Add(bone.Name, null);
                        }
                    }
                }

                if (!blocking)
                {
                    yield return(null);
                }
            }
        }
Exemple #2
0
        private IEnumerator ImportMeshes()
        {
            int i = 0;

            foreach (Assimp.Mesh assimpMesh in scene.Meshes)
            {
                SubMeshComponent subMeshComponent = ImportMesh(assimpMesh);
                meshes.Add(subMeshComponent);
                i++;

                progress += 0.25f / scene.MeshCount;

                if (!blocking)
                {
                    yield return(null);
                }
            }
        }
Exemple #3
0
        private SubMeshComponent ImportMesh(Assimp.Mesh assimpMesh)
        {
            int i;

            Vector3[]   vertices = new Vector3[assimpMesh.VertexCount];
            Vector2[][] uv       = new Vector2[assimpMesh.TextureCoordinateChannelCount][];
            for (i = 0; i < assimpMesh.TextureCoordinateChannelCount; i++)
            {
                uv[i] = new Vector2[assimpMesh.VertexCount];
            }
            Vector3[] normals      = new Vector3[assimpMesh.VertexCount];
            int[]     triangles    = new int[assimpMesh.FaceCount * 3];
            Vector4[] tangents     = null;
            Color[]   vertexColors = null;

            i = 0;
            foreach (Assimp.Vector3D v in assimpMesh.Vertices)
            {
                vertices[i].x = v.X;
                vertices[i].y = v.Y;
                vertices[i].z = v.Z;
                i++;
            }

            for (int UVlayer = 0; UVlayer < assimpMesh.TextureCoordinateChannelCount; UVlayer++)
            {
                i = 0;
                foreach (Assimp.Vector3D UV in assimpMesh.TextureCoordinateChannels[UVlayer])
                {
                    uv[UVlayer][i].x = UV.X;
                    uv[UVlayer][i].y = UV.Y;
                    i++;
                }
            }

            i = 0;
            foreach (Assimp.Vector3D n in assimpMesh.Normals)
            {
                normals[i].x = n.X;
                normals[i].y = n.Y;
                normals[i].z = n.Z;
                i++;
            }

            if (assimpMesh.HasTangentBasis)
            {
                i        = 0;
                tangents = new Vector4[assimpMesh.VertexCount];
                foreach (Assimp.Vector3D t in assimpMesh.Tangents)
                {
                    tangents[i].x = t.X;
                    tangents[i].y = t.Y;
                    tangents[i].z = t.Z;
                    tangents[i].w = 1f;
                    i++;
                }
            }

            if (assimpMesh.VertexColorChannelCount >= 1)
            {
                i            = 0;
                vertexColors = new Color[assimpMesh.VertexCount];
                foreach (Assimp.Color4D c in assimpMesh.VertexColorChannels[0])
                {
                    vertexColors[i].r = c.R;
                    vertexColors[i].g = c.G;
                    vertexColors[i].b = c.B;
                    vertexColors[i].a = c.A;
                    i++;
                }
            }

            i = 0;
            foreach (Assimp.Face face in assimpMesh.Faces)
            {
                triangles[i + 0] = face.Indices[0];
                triangles[i + 1] = face.Indices[1];
                triangles[i + 2] = face.Indices[2];
                i += 3;
            }

            SubMeshComponent subMeshComponent = new SubMeshComponent();
            Mesh             mesh             = new Mesh();

            mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
            mesh.vertices    = vertices;
            if (assimpMesh.TextureCoordinateChannelCount > 0)
            {
                mesh.uv = uv[0];
            }
            if (assimpMesh.TextureCoordinateChannelCount > 1)
            {
                mesh.uv2 = uv[1];
            }
            if (assimpMesh.TextureCoordinateChannelCount > 2)
            {
                mesh.uv3 = uv[2];
            }
            if (assimpMesh.TextureCoordinateChannelCount > 3)
            {
                mesh.uv4 = uv[3];
            }
            if (assimpMesh.TextureCoordinateChannelCount > 4)
            {
                mesh.uv5 = uv[4];
            }
            if (assimpMesh.TextureCoordinateChannelCount > 5)
            {
                mesh.uv6 = uv[5];
            }
            if (assimpMesh.TextureCoordinateChannelCount > 6)
            {
                mesh.uv7 = uv[6];
            }
            if (assimpMesh.TextureCoordinateChannelCount > 7)
            {
                mesh.uv8 = uv[7];
            }
            mesh.normals = normals;
            if (tangents != null)
            {
                mesh.tangents = tangents;
            }
            if (vertexColors != null)
            {
                mesh.colors = vertexColors;
            }
            mesh.triangles = triangles;
            mesh.RecalculateBounds();

            subMeshComponent.mesh          = mesh;
            subMeshComponent.name          = Utils.CreateUniqueName(assimpMesh.Name);
            subMeshComponent.materialIndex = assimpMesh.MaterialIndex;

            return(subMeshComponent);
        }