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); } } }
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); } } }
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); }