Example #1
0
        /**
         *  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);
            }
        }