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