/** * Format (everything little endian): * * UINT8[80] – Header * UINT32 – Number of triangles * * foreach triangle * REAL32[3] – Normal vector * REAL32[3] – Vertex 1 * REAL32[3] – Vertex 2 * REAL32[3] – Vertex 3 * UINT16 – Attribute byte count * end */ public static TriangleMeshModel Parse(string f) { using (var reader = new BinaryReader(new FileStream(f, FileMode.Open, FileAccess.Read))) { reader.ReadBytes(80); // skipping header int triangleCount = reader.ReadInt32(); var triangleEdgeData = new List <I3DObject>(triangleCount); for (int i = 0; i < triangleCount; i++) { triangleEdgeData[i] = new MinimalTriangle( new Vect3 { X = reader.ReadSingle(), Y = reader.ReadSingle(), Z = reader.ReadSingle() }, new Vect3 { X = reader.ReadSingle(), Y = reader.ReadSingle(), Z = reader.ReadSingle() }, new Vect3 { X = reader.ReadSingle(), Y = reader.ReadSingle(), Z = reader.ReadSingle() }, new Vect3 { X = reader.ReadSingle(), Y = reader.ReadSingle(), Z = reader.ReadSingle() } ); reader.ReadUInt16(); // skip the 2 attribute bytes } return(new TriangleMeshModel(triangleEdgeData)); } }
public static void AddTraceables(this Mesh mesh, MaterialAbstract material, Matrix4X4 matrix, List <ITraceable> tracePrimitives) { for (int faceIndex = 0; faceIndex < mesh.Faces.Count; faceIndex++) { var face = mesh.Faces[faceIndex]; ITraceable triangle; if (material != null) { triangle = new TriangleShape( mesh.Vertices[face.v0].Transform(matrix), mesh.Vertices[face.v1].Transform(matrix), mesh.Vertices[face.v2].Transform(matrix), material, faceIndex); } else { triangle = new MinimalTriangle((fi, vi) => { switch (vi) { case 0: return(mesh.Vertices[mesh.Faces[fi].v0]); case 1: return(mesh.Vertices[mesh.Faces[fi].v1]); default: return(mesh.Vertices[mesh.Faces[fi].v2]); } }, faceIndex); } tracePrimitives.Add(triangle); } }