Exemplo n.º 1
0
        public IOWriteResult Write(BinaryWriter writer, List <WriteMesh> vMeshes, WriteOptions options)
        {
            string header = "g3sharp_stl ";

            byte[] header_bytes = ASCIIEncoding.ASCII.GetBytes(header);
            byte[] stl_header   = new byte[80];
            Array.Clear(stl_header, 0, stl_header.Length);
            Array.Copy(header_bytes, stl_header, header_bytes.Length);

            writer.Write(stl_header);

            int total_tris = 0;

            foreach (WriteMesh mesh in vMeshes)
            {
                total_tris += mesh.Mesh.TriangleCount;
            }

            writer.Write(total_tris);

            for (int mi = 0; mi < vMeshes.Count; ++mi)
            {
                IMesh mesh = vMeshes[mi].Mesh;

                if (options.ProgressFunc != null)
                {
                    options.ProgressFunc(mi, vMeshes.Count - 1);
                }

                Func <int, stl_triangle> producerF = (ti) =>
                {
                    var      tri = new stl_triangle();
                    Index3i  t = mesh.GetTriangle(ti);
                    Vector3d a = mesh.GetVertex(t.a), b = mesh.GetVertex(t.b), c = mesh.GetVertex(t.c);
                    Vector3d n = MathUtil.Normal(a, b, c);

                    tri.nx     = (float)n.x; tri.ny = (float)n.y; tri.nz = (float)n.z;
                    tri.ax     = (float)a.x; tri.ay = (float)a.y; tri.az = (float)a.z;
                    tri.bx     = (float)b.x; tri.by = (float)b.y; tri.bz = (float)b.z;
                    tri.cx     = (float)c.x; tri.cy = (float)c.y; tri.cz = (float)c.z;
                    tri.attrib = 0;
                    return(tri);
                };
                Action <stl_triangle> consumerF = (tri) =>
                {
                    byte[] tri_bytes = Util.StructureToByteArray(tri);
                    writer.Write(tri_bytes);
                };

                var stream = new ParallelStream <int, stl_triangle>();
                stream.ProducerF = producerF;
                stream.ConsumerF = consumerF;

                // parallel version is slower =\
                //stream.Run_Thread(mesh.TriangleIndices());
                stream.Run(mesh.TriangleIndices());
            }

            return(new IOWriteResult(IOCode.Ok, ""));
        }
Exemplo n.º 2
0
        public IOReadResult Read(BinaryReader reader, ReadOptions options, IMeshBuilder builder)
        {
            if (options.CustomFlags != null)
            {
                ParseArguments(options.CustomFlags);
            }

            /*byte[] header = */
            reader.ReadBytes(80);
            int totalTris = reader.ReadInt32();

            Objects = new List <STLSolid>();
            Objects.Add(new STLSolid());

            int    tri_size = 50;               // bytes
            IntPtr bufptr   = Marshal.AllocHGlobal(tri_size);
            var    tmp      = new stl_triangle();
            Type   tri_type = tmp.GetType();

            var tri_attribs = new DVector <short>();

            try
            {
                for (int i = 0; i < totalTris; ++i)
                {
                    byte[] tri_bytes = reader.ReadBytes(50);
                    if (tri_bytes.Length < 50)
                    {
                        break;
                    }

                    Marshal.Copy(tri_bytes, 0, bufptr, tri_size);
                    var tri = (stl_triangle)Marshal.PtrToStructure(bufptr, tri_type);

                    append_vertex(tri.ax, tri.ay, tri.az);
                    append_vertex(tri.bx, tri.by, tri.bz);
                    append_vertex(tri.cx, tri.cy, tri.cz);
                    tri_attribs.Add(tri.attrib);
                }
            }
            catch (Exception e)
            {
                return(new IOReadResult(IOCode.GenericReaderError, "exception: " + e.Message));
            }

            Marshal.FreeHGlobal(bufptr);

            if (Objects.Count == 1)
            {
                Objects[0].TriAttribs = tri_attribs;
            }

            foreach (STLSolid solid in Objects)
            {
                BuildMesh(solid, builder);
            }

            return(new IOReadResult(IOCode.Ok, ""));
        }
Exemplo n.º 3
0
        public IOReadResult Read(BinaryReader reader, ReadOptions options, IMeshBuilder builder)
        {
            /*byte[] header = */ reader.ReadBytes(80);
            int totalTris = reader.ReadInt32();

            Objects = new List <STLSolid>();
            Objects.Add(new STLSolid());

            int          tri_size = 50; // bytes
            IntPtr       bufptr   = Marshal.AllocHGlobal(tri_size);
            stl_triangle tmp      = new stl_triangle();
            Type         tri_type = tmp.GetType();

            try {
                for (int i = 0; i < totalTris; ++i)
                {
                    byte[] tri_bytes = reader.ReadBytes(50);

                    Marshal.Copy(tri_bytes, 0, bufptr, tri_size);
                    stl_triangle tri = (stl_triangle)Marshal.PtrToStructure(bufptr, tri_type);

                    append_vertex(tri.ax, tri.ay, tri.az);
                    append_vertex(tri.bx, tri.by, tri.bz);
                    append_vertex(tri.cx, tri.cy, tri.cz);
                }
            } catch (Exception e) {
                return(new IOReadResult(IOCode.GenericReaderError, "exception: " + e.Message));
            }

            Marshal.FreeHGlobal(bufptr);

            foreach (STLSolid solid in Objects)
            {
                BuildMesh(solid, builder);
            }

            return(new IOReadResult(IOCode.Ok, ""));
        }