public static void readOBJ(string filename, ref List <OBJFileReader.OBJFace> faces, ref List <Vector3> positions, ref List <Vector3> normals, ref List <Vector2> texCoords, ref MaterialManager.Material material) { // Sections // . normals // . texcoords // . verts // . faces StreamReader sourceFile = new StreamReader(filename); string line; do { line = sourceFile.ReadLine(); if (line == null) { break; } if (line.Contains("#")) { // comment } else if (line.Contains("mtllib")) { // material // Read material properties from file OBJFileReader.readMaterialFile(line, ref material); } else if (line.Contains("usemtl")) { // material, what material to use. } else if (line.Contains("vn")) { normals.Add(readNormal(line)); } else if (line.Contains("vt")) { texCoords.Add(readVector2(line)); } else if (line.Contains("v")) { positions.Add(readPos(line)); } else if (line.Contains("f")) { OBJFileReader.readFaces(line, ref faces); } } while (line != null); sourceFile.Close(); }
// Reads on .obs file static public Mesh CreateFromFile(string filename) { List <OBJFileReader.OBJFace> faces = new List <OBJFileReader.OBJFace>(); List <Vector3> positions = new List <Vector3>(); List <Vector3> normals = new List <Vector3>(); List <Vector2> texCoords = new List <Vector2>(); MaterialManager.Material meshMaterial = null; OBJFileReader.readOBJ(filename, ref faces, ref positions, ref normals, ref texCoords, ref meshMaterial); // Create positions List <PosNorTexVertex> vertices = new List <PosNorTexVertex>(positions.Count); Console.WriteLine("Mesh read from " + filename); foreach (OBJFileReader.OBJFace face in faces) { vertices.Add(new PosNorTexVertex(positions[(int)face.positionIndex - 1], normals[(int)face.normalIndex - 1], texCoords[(int)face.texCoordIndex - 1])); } return(new Mesh(vertices, meshMaterial)); }
static Vector3 readNormal(string normalLine) { // vn # # # return(OBJFileReader.readVector3(normalLine)); }
static Vector3 readPos(string posLine) { return(OBJFileReader.readVector3(posLine)); }
public static Material loadMaterial(string materialFileName) { string fullPath = dataDir + materialFileName; StreamReader sourceFile = new StreamReader(fullPath); string line; string materialName = null; bool existingFound = false; Material newMaterial = null; char[] space = { ' ' }; // First check if we already have this material do { line = sourceFile.ReadLine(); if (line == null) { break; } else if (line.Contains("newmtl")) { materialName = line.Split(space)[1]; break; } }while (line != null); newMaterial = getMaterialByName(materialName); if (newMaterial != null) { sourceFile.Close(); return(newMaterial); } else { newMaterial = new Material(); newMaterial.materialName = materialName; } // Read rest of the file // use . as separator instead of system default System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat; do { line = sourceFile.ReadLine(); if (line == null) { break; } if (line.Contains("#")) { // comment } else if (line.Contains("map_Kd")) { // map_Kd filename.png newMaterial.textureName = line.Split(space)[1]; newMaterial.textureGLIndex = loadTexture(newMaterial.textureName); } else if (line.Contains("illum")) { newMaterial.illumination = Single.Parse(line.Split(space)[1], nfi); } else if (line.Contains("Ka")) { newMaterial.alpha = OBJFileReader.readVector3(line); } else if (line.Contains("Kd")) { newMaterial.diffuse = OBJFileReader.readVector3(line); } else if (line.Contains("Ks")) { newMaterial.specular = OBJFileReader.readVector3(line); } } while (line != null); sourceFile.Close(); materials.Add(newMaterial); return(newMaterial); }