public override void ReadData(Scene scene, BinaryReader stream) { // Note: A max face is three indices and // a flag short. // Read number of faces. short faceCount = 0; faceCount = stream.ReadInt16(); // Read each face and add it. for (short i = 0; i < faceCount; i++) { Face f = new Face(); Index index = new Index(stream.ReadInt16()); f.Indices.Add(index); index = new Index(stream.ReadInt16()); f.Indices.Add(index); index = new Index(stream.ReadInt16()); f.Indices.Add(index); stream.ReadInt16(); faces.Add(f); } }
public Scene LoadData(string path) { char[] split = new char[] { ' ' }; // Create a scene and polygon. Scene scene = new Scene(); Polygon polygon = new Polygon(); string mtlName = null; // Create a stream reader. using (StreamReader reader = new StreamReader(path)) { // Read line by line. string line = null; while ((line = reader.ReadLine()) != null) { // Skip any comments (lines that start with '#'). if (line.StartsWith("#")) continue; // Do we have a texture coordinate? if (line.StartsWith("vt")) { // Get the texture coord strings. string[] values = line.Substring(3).Split(split, StringSplitOptions.RemoveEmptyEntries); // Parse texture coordinates. float u = float.Parse(values[0]); float v = float.Parse(values[1]); // Add the texture coordinate. polygon.UVs.Add(new UV(u, v)); continue; } // Do we have a normal coordinate? if (line.StartsWith("vn")) { // Get the normal coord strings. string[] values = line.Substring(3).Split(split, StringSplitOptions.RemoveEmptyEntries); // Parse normal coordinates. float x = float.Parse(values[0]); float y = float.Parse(values[1]); float z = float.Parse(values[2]); // Add the normal. polygon.Normals.Add(new Vertex(x, y, z)); continue; } // Do we have a vertex? if (line.StartsWith("v")) { // Get the vertex coord strings. string[] values = line.Substring(2).Split(split, StringSplitOptions.RemoveEmptyEntries); // Parse vertex coordinates. float x = float.Parse(values[0]); float y = float.Parse(values[1]); float z = float.Parse(values[2]); // Add the vertices. polygon.Vertices.Add(new Vertex(x, y, z)); continue; } // Do we have a face? if (line.StartsWith("f")) { Face face = new Face(); if (!String.IsNullOrWhiteSpace(mtlName)) face.Material = scene.Assets.Where(t => t.Name == mtlName).FirstOrDefault() as Material; // Get the face indices string[] indices = line.Substring(2).Split(split, StringSplitOptions.RemoveEmptyEntries); // Add each index. foreach (var index in indices) { // Split the parts. string[] parts = index.Split(new char[] { '/' }, StringSplitOptions.None); // Add each part. face.Indices.Add(new Index( (parts.Length > 0 && parts[0].Length > 0) ? int.Parse(parts[0]) - 1 : -1, (parts.Length > 1 && parts[1].Length > 0) ? int.Parse(parts[1]) - 1 : -1, (parts.Length > 2 && parts[2].Length > 0) ? int.Parse(parts[2]) - 1 : -1)); } // Add the face. polygon.Faces.Add(face); continue; } if (line.StartsWith("mtllib")) { // Set current directory in case a relative path to material file is used. Environment.CurrentDirectory = Path.GetDirectoryName(path); // Load materials file. string mtlPath = ReadMaterialValue(line); LoadMaterials(mtlPath, scene); } if (line.StartsWith("usemtl")) mtlName = ReadMaterialValue(line); } } scene.SceneContainer.AddChild(polygon); return scene; }
/// <summary> /// This function reads a polygon. /// </summary> /// <param name="reader"></param> /// <returns></returns> protected override object ReadData(BinaryReader reader) { // Create a polygon. Polygon poly = new Polygon(); // Read a name chunk. CaligariName name = new CaligariName(); name.Read(reader); poly.Name = name.name; // Read the local axies. CaligariAxies axies = new CaligariAxies(); axies.Read(reader); poly.Transformation.TranslateX = axies.centre.X; poly.Transformation.TranslateY = axies.centre.Y; poly.Transformation.TranslateZ = axies.centre.Z; // poly.Rotate = axies.rotate; // Read the position matrix. CaligariPosition pos = new CaligariPosition(); pos.Read(reader); // Read number of verticies. int verticesCount = reader.ReadInt32(); // Get them all for (int i = 0; i < verticesCount; i++) { // Read a vertex. Vertex vertex = new Vertex(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); // Multiply it by the position matrix. vertex = vertex * pos.matrix; // Add it. poly.Vertices.Add(vertex); } // Read UV count. int uvsCount = reader.ReadInt32(); // Read all of the UVs for (int i = 0; i < uvsCount; i++) poly.UVs.Add(new UV(reader.ReadInt32(), reader.ReadInt32())); // Read faces count. int faces = reader.ReadInt32(); // Read each face. for (int f = 0; f < faces; f++) { Face face = new Face(); poly.Faces.Add(face); // Read face type flags. byte flags = reader.ReadByte(); // Read vertex count short verticesInFace = reader.ReadInt16(); // Do we read a material number? if ((flags & 0x08) == 0) // is it a 'hole' face? reader.ReadInt16(); // Now read the indices, a vertex index and a uv index. for (short j = 0; j < verticesInFace; j++) face.Indices.Add(new Index(reader.ReadInt32(), reader.ReadInt32())); } // Any extra stuff? if (header.minorVersion > 4) { // read flags. reader.ReadChars(4); if ((header.minorVersion > 5) && (header.minorVersion < 8)) reader.ReadChars(2); } // Now that we've loaded the polygon, we triangulate it. poly.Triangulate(); // Finally, we update normals. poly.Validate(true); return poly; }