internal void addFaceMat(FaceMat3ds fm) { mFaceMat.Add(fm); }
public override Scene ImportFile(FileStream fileStream, string fileName) { Scene3ds scene3ds = new Scene3ds(fileStream, null, Scene3ds.DECODE_ALL); Scene result = new Scene(); // Compute normals for our scene computeNormals(scene3ds, result); Material defaultMaterial = new Material { Name = "Default", FileName = fileName, DiffuseColor = ColorsRgbF.Gray, SpecularColor = ColorsRgbF.White, Shininess = 64 }; for (int i = 0; i < scene3ds.Materials.Count(); ++i) { Material3ds material3ds = scene3ds.Materials.ElementAt(i); Material material = new Material { Name = material3ds.name(), FileName = fileName, DiffuseColor = material3ds.diffuse().ToColorRgbF(), AmbientColor = material3ds.ambient().ToColorRgbF(), SpecularColor = material3ds.specular().ToColorRgbF(), Transparency = material3ds.transparency() }; if (material3ds.DiffuseTexture != null) { material.DiffuseTextureName = Path.Combine(Path.GetDirectoryName(fileName), material3ds.DiffuseTexture.MapName); } if ((int)material3ds._shininess != 0) { material.Shininess = (int)material3ds._shininess; } result.Materials.Add(material); } for (int i = 0; i < scene3ds.Meshes.Count(); ++i) { Mesh3ds mesh3ds = scene3ds.Meshes.ElementAt(i); Mesh resultMesh = result.Meshes[i]; //resultMesh.Material = defaultMaterial; // TODO: Is this right? if (mesh3ds.faceMats() == 0) { resultMesh.Material = defaultMaterial; for (int fi = 0; fi < mesh3ds.faces(); ++fi) { Face3ds f = mesh3ds.face(fi); resultMesh.Indices.Add(f.P0); resultMesh.Indices.Add(f.P1); resultMesh.Indices.Add(f.P2); } } else { // TODO: Split by face materials so that each mesh only has one material. Debug.Assert(mesh3ds.faceMats() == 1); for (int fm = 0; fm < mesh3ds.faceMats(); ++fm) { // Get current material's face. FaceMat3ds fmat = mesh3ds.faceMat(fm); Material material = result.Materials[fmat.material()]; resultMesh.Material = material; for (int fi = 0; fi < fmat.faces(); ++fi) { int idx = fmat.face(fi); Face3ds f = mesh3ds.face(idx); resultMesh.Indices.Add(f.P0); resultMesh.Indices.Add(f.P1); resultMesh.Indices.Add(f.P2); } } } } return(result); }
private void read_MSH_MAT_GROUP(Mesh3ds mes) { string name = ReadName(); FaceMat3ds fm = new FaceMat3ds(); mes.addFaceMat(fm); for (int i = 0; i < Materials.Count(); i++) { if (Materials.ElementAt(i).name().Equals(name) == true) { fm.mMatIndex = i; break; } } int indexes = ReadUnsignedShort(); fm.mFaceIndex = new int[indexes]; for (int n = 0; n < indexes; n++) { fm.mFaceIndex[n] = ReadUnsignedShort(); } if (mDecode != null) { mDecode.enter(); mDecode.println("Faces: " + indexes); for (int t = 0; t < indexes; t++) { mDecode.println(" face: " + fm.mFaceIndex[t]); } mDecode.leave(); } }