private void objectSelected(ThreeDModel sel)
 {
     if (Control.ModifierKeys == Keys.Shift)
     {
         if (!sel.Selected)
         {
             listSTLObjects.SelectedItems.Add(sel);
         }
     }
     else
     if (Control.ModifierKeys == Keys.Control)
     {
         if (sel.Selected)
         {
             listSTLObjects.SelectedItems.Remove(sel);
         }
         else
         {
             listSTLObjects.SelectedItems.Add(sel);
         }
     }
     else
     {
         listSTLObjects.SelectedItems.Clear();
         listSTLObjects.SelectedItem = sel;
     }
 }
Ejemplo n.º 2
0
 public void WriteModel(ThreeDModel m3d, Stream stream)
 {
     this.ostream    = stream;
     this.tw         = new FormattedStreamWriter(this.ostream, new UTF8Encoding(false), 4096, false, CultureInfo.InvariantCulture);
     this.tw.NewLine = "\n";
     this.WriteInternal(m3d);
 }
Ejemplo n.º 3
0
 private void objectSelected(ThreeDModel sel)
 {
     if (Control.ModifierKeys == Keys.Shift)
     {
         if (!sel.Selected)
         {
             SetObjectSelected((PrintModel)sel, true);
         }
     }
     else
     if (Control.ModifierKeys == Keys.Control)
     {
         if (sel.Selected)
         {
             SetObjectSelected((PrintModel)sel, false);
         }
         else
         {
             SetObjectSelected((PrintModel)sel, true);
         }
     }
     else
     {
         listObjects.SelectedItems.Clear();
         SetObjectSelected((PrintModel)sel, true);
     }
 }
Ejemplo n.º 4
0
 private void objectSelected(ThreeDModel sel)
 {
     if (Control.ModifierKeys == Keys.Shift)
     {
         if (!sel.Selected)
         {
             SetObjectSelected((PrintModel)sel, true);
         }
     }
     else
     if (Control.ModifierKeys == Keys.Control)
     {
         if (sel.Selected)
         {
             SetObjectSelected((PrintModel)sel, false);
         }
         else
         {
             SetObjectSelected((PrintModel)sel, true);
         }
     }
     else
     {
         foreach (ListViewItem test in listObjects.Items)
         {
             if (test.Selected && (PrintModel)test.Tag != (PrintModel)sel)
             {
                 test.Selected = false;
             }
         }
         //listObjects.SelectedItems.Clear();
         SetObjectSelected((PrintModel)sel, true);
     }
 }
Ejemplo n.º 5
0
        private void WriteMtl(ThreeDModel m3d, string mtlfn)
        {
            var opts  = Program.Options;
            var clr   = opts.OverrideColor;
            var dn    = this.fi.Directory.FullName;
            var p     = Path.Combine(dn, string.Concat(mtlfn, ".mtl"));
            var mtlfi = new FileInfo(p);

            using (var fs = mtlfi.Create())
                using (var sw = new StreamWriter(fs, new UTF8Encoding(false)))
                {
                    sw.NewLine = "\n";

                    sw.WriteLine("# Generated using MSET Converter by John Cena of PTF");
                    sw.WriteLine("# mset Version: {0}", Program.GetAssemblyVersion());
                    sw.WriteLine("# mset-obj Version: {0}", this.VersionID);
                    sw.WriteLine();
                    sw.WriteLine("# Default MSET material");
                    sw.WriteLine("newmtl JCMSet");
                    sw.WriteLine("Kd {0:0.000000} {1:0.000000} {2:0.000000}", clr.RFloat, clr.GFloat, clr.BFloat);
                    sw.WriteLine("d  {0:0.000000}", clr.AFloat);
                    sw.WriteLine("Tr {0:0.000000}", 1F - clr.AFloat);
                    sw.WriteLine();

                    sw.Flush();
                }

            if (opts.VerboseMode)
            {
                ULogger.W("OBJMTL", "Written MTL: {0}", mtlfi.FullName);
            }
        }
Ejemplo n.º 6
0
 public void WriteModel(ThreeDModel m3d, Stream stream)
 {
     this.ostream    = stream;
     this.tw         = new FormattedStreamWriter(this.ostream, new ASCIIEncoding(), 4096, true, CultureInfo.InvariantCulture);
     this.bw         = new BinaryWriter(this.ostream, new ASCIIEncoding(), true);
     this.tw.NewLine = "\n";
     this.WriteInternal(m3d);
 }
Ejemplo n.º 7
0
 private void gl_MouseDown(object sender, MouseEventArgs e)
 {
     lastX             = xDown = e.X;
     lastY             = yDown = e.Y;
     startRotX         = rotX;
     startRotZ         = rotZ;
     startViewCenter   = viewCenter;
     startUserPosition = userPosition;
     if (e.Button == MouseButtons.Right)
     {
         ThreeDModel sel = Picktest(e.X, e.Y);
         if (sel != null && eventObjectMoved != null)
         {
             eventObjectSelected(sel);
         }
         //computeRay();
     }
 }
Ejemplo n.º 8
0
 private void objectSelected(ThreeDModel sel)
 {
     listSTLObjects.SelectedItem = sel;
 }
Ejemplo n.º 9
0
        public void WriteRawMesh(ThreeDModel m3d, FileInfo msetf, FileInfo m3drf, Encoding enc)
        {
            using (var fs = m3drf.Create())
                using (var tw = new FormattedStreamWriter(fs, enc, 4096, false, CultureInfo.InvariantCulture))
                    using (var xw = new XmlTextWriter(tw))
                    {
                        xw.Formatting = Formatting.Indented;
                        xw.WriteStartDocument();

                        var sb = new StringBuilder();
                        sb.AppendLine()
                        .AppendLine("3D Model imported from MSET")
                        .AppendLine("Using John Cena's MSET Converter")
                        .AppendFormat("Converter version: {0}", Program.GetAssemblyVersion()).AppendLine()
                        .AppendLine()
                        .AppendLine("Mesh information:")
                        .AppendFormat("Vertex count: {0}", m3d.VertexCount).AppendLine()
                        .AppendFormat("Face count: {0}", m3d.FaceCount).AppendLine();

                        xw.WriteComment(sb.ToString());
                        xw.WriteStartElement("3dmesh");

                        xw.WriteStartElement("mesh-info");

                        xw.WriteStartElement("model-name");
                        xw.WriteStartAttribute("value");
                        xw.WriteValue(m3d.ModelName);
                        xw.WriteEndAttribute();
                        xw.WriteEndElement();

                        xw.WriteStartElement("source-file");
                        xw.WriteStartAttribute("value");
                        xw.WriteValue(msetf.Name);
                        xw.WriteEndAttribute();
                        xw.WriteEndElement();

                        xw.WriteStartElement("vertex-count");
                        xw.WriteStartAttribute("value");
                        xw.WriteValue(m3d.VertexCount);
                        xw.WriteEndAttribute();
                        xw.WriteEndElement();

                        xw.WriteStartElement("face-count");
                        xw.WriteStartAttribute("value");
                        xw.WriteValue(m3d.FaceCount);
                        xw.WriteEndAttribute();
                        xw.WriteEndElement();

                        xw.WriteStartElement("data-contained");

                        if (m3d.Vertices != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("vertices");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.Faces != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("faces");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.Normals != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("normals");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.Binormals != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("binormals");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.Tangents != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("tangents");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.TextureCoordinates != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("texture-coordinates");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.Colors != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("vertex-colors");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.TextureCoordinates3 != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("texture-coordinates-3");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.Vertices2 != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("vertices-2");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        if (m3d.Normals2 != null)
                        {
                            xw.WriteStartElement("data");
                            xw.WriteStartAttribute("type");
                            xw.WriteValue("normals-2");
                            xw.WriteEndAttribute();
                            xw.WriteEndElement();
                        }

                        xw.WriteEndElement(); // data-contained

                        xw.WriteEndElement(); // mesh-info

                        xw.WriteStartElement("mesh-data");

                        if (m3d.Vertices != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("vertices");
                            xw.WriteEndAttribute();

                            foreach (var vertex in m3d.Vertices)
                            {
                                xw.WriteStartElement("vertex");

                                xw.WriteStartAttribute("x");
                                xw.WriteValue(vertex.X.ToString("0.000000"));
                                xw.WriteEndAttribute(); // x

                                xw.WriteStartAttribute("y");
                                xw.WriteValue(vertex.Y.ToString("0.000000"));
                                xw.WriteEndAttribute(); // y

                                xw.WriteStartAttribute("z");
                                xw.WriteValue(vertex.Z.ToString("0.000000"));
                                xw.WriteEndAttribute(); // z

                                xw.WriteEndElement();   // vertex
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.Faces != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("faces");
                            xw.WriteEndAttribute();

                            foreach (var face in m3d.Faces)
                            {
                                xw.WriteStartElement("face");

                                xw.WriteStartAttribute("v1");
                                xw.WriteValue(face.Vertex1);
                                xw.WriteEndAttribute(); // v1

                                xw.WriteStartAttribute("v2");
                                xw.WriteValue(face.Vertex2);
                                xw.WriteEndAttribute(); // v2

                                xw.WriteStartAttribute("v3");
                                xw.WriteValue(face.Vertex3);
                                xw.WriteEndAttribute(); // v3

                                xw.WriteEndElement();   // face
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.Normals != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("normals");
                            xw.WriteEndAttribute();

                            foreach (var normal in m3d.Normals)
                            {
                                xw.WriteStartElement("normal");

                                xw.WriteStartAttribute("x");
                                xw.WriteValue(normal.X.ToString("0.000000"));
                                xw.WriteEndAttribute(); // x

                                xw.WriteStartAttribute("y");
                                xw.WriteValue(normal.Y.ToString("0.000000"));
                                xw.WriteEndAttribute(); // y

                                xw.WriteStartAttribute("z");
                                xw.WriteValue(normal.Z.ToString("0.000000"));
                                xw.WriteEndAttribute(); // z

                                xw.WriteEndElement();   // normal
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.Binormals != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("binormals");
                            xw.WriteEndAttribute();

                            foreach (var binormal in m3d.Binormals)
                            {
                                xw.WriteStartElement("binormal");

                                xw.WriteStartAttribute("x");
                                xw.WriteValue(binormal.X.ToString("0.000000"));
                                xw.WriteEndAttribute(); // x

                                xw.WriteStartAttribute("y");
                                xw.WriteValue(binormal.Y.ToString("0.000000"));
                                xw.WriteEndAttribute(); // y

                                xw.WriteStartAttribute("z");
                                xw.WriteValue(binormal.Z.ToString("0.000000"));
                                xw.WriteEndAttribute(); // z

                                xw.WriteEndElement();   // binormal
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.Tangents != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("tangents");
                            xw.WriteEndAttribute();

                            foreach (var tangent in m3d.Tangents)
                            {
                                xw.WriteStartElement("tangent");

                                xw.WriteStartAttribute("x");
                                xw.WriteValue(tangent.X.ToString("0.000000"));
                                xw.WriteEndAttribute(); // x

                                xw.WriteStartAttribute("y");
                                xw.WriteValue(tangent.Y.ToString("0.000000"));
                                xw.WriteEndAttribute(); // y

                                xw.WriteStartAttribute("z");
                                xw.WriteValue(tangent.Z.ToString("0.000000"));
                                xw.WriteEndAttribute(); // z

                                xw.WriteEndElement();   // tangent
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.TextureCoordinates != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("texture-coordinates");
                            xw.WriteEndAttribute();

                            foreach (var texcoord in m3d.TextureCoordinates)
                            {
                                xw.WriteStartElement("texcoord");

                                xw.WriteStartAttribute("u");
                                xw.WriteValue(texcoord.U.ToString("0.000000"));
                                xw.WriteEndAttribute(); // u

                                xw.WriteStartAttribute("v");
                                xw.WriteValue(texcoord.V.ToString("0.000000"));
                                xw.WriteEndAttribute(); // v

                                xw.WriteEndElement();   // texcoord
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.Colors != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("colors");
                            xw.WriteEndAttribute();

                            foreach (var color in m3d.Colors)
                            {
                                xw.WriteStartElement("color");

                                xw.WriteStartAttribute("r");
                                xw.WriteValue(color.R);
                                xw.WriteEndAttribute(); // r

                                xw.WriteStartAttribute("g");
                                xw.WriteValue(color.G);
                                xw.WriteEndAttribute(); // g

                                xw.WriteStartAttribute("b");
                                xw.WriteValue(color.B);
                                xw.WriteEndAttribute(); // b

                                xw.WriteStartAttribute("a");
                                xw.WriteValue(color.A);
                                xw.WriteEndAttribute(); // a

                                xw.WriteEndElement();   // color
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.TextureCoordinates3 != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("texture-coordinates-3");
                            xw.WriteEndAttribute();

                            foreach (var texcoord3 in m3d.TextureCoordinates3)
                            {
                                xw.WriteStartElement("texcoord3");

                                xw.WriteStartAttribute("u");
                                xw.WriteValue(texcoord3.U.ToString("0.000000"));
                                xw.WriteEndAttribute(); // u

                                xw.WriteStartAttribute("v");
                                xw.WriteValue(texcoord3.V.ToString("0.000000"));
                                xw.WriteEndAttribute(); // v

                                xw.WriteEndElement();   // texcoord3
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.Vertices2 != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("vertices-2");
                            xw.WriteEndAttribute();

                            foreach (var vertex2 in m3d.Vertices2)
                            {
                                xw.WriteStartElement("vertex2");

                                xw.WriteStartAttribute("x");
                                xw.WriteValue(vertex2.X.ToString("0.000000"));
                                xw.WriteEndAttribute(); // x

                                xw.WriteStartAttribute("y");
                                xw.WriteValue(vertex2.Y.ToString("0.000000"));
                                xw.WriteEndAttribute(); // y

                                xw.WriteStartAttribute("z");
                                xw.WriteValue(vertex2.Z.ToString("0.000000"));
                                xw.WriteEndAttribute(); // z

                                xw.WriteEndElement();   // vertex2
                            }

                            xw.WriteEndElement(); // data
                        }

                        if (m3d.Normals2 != null)
                        {
                            xw.WriteStartElement("data");

                            xw.WriteStartAttribute("type");
                            xw.WriteValue("normals-2");
                            xw.WriteEndAttribute();

                            foreach (var normal2 in m3d.Normals2)
                            {
                                xw.WriteStartElement("normal2");

                                xw.WriteStartAttribute("x");
                                xw.WriteValue(normal2.X.ToString("0.000000"));
                                xw.WriteEndAttribute(); // x

                                xw.WriteStartAttribute("y");
                                xw.WriteValue(normal2.Y.ToString("0.000000"));
                                xw.WriteEndAttribute(); // y

                                xw.WriteStartAttribute("z");
                                xw.WriteValue(normal2.Z.ToString("0.000000"));
                                xw.WriteEndAttribute(); // z

                                xw.WriteEndElement();   // normal2
                            }

                            xw.WriteEndElement(); // data
                        }

                        xw.WriteEndElement(); //mesh-data

                        xw.WriteEndElement();
                        xw.WriteEndDocument();
                        xw.Flush();
                    }
        }
Ejemplo n.º 10
0
        private void WriteInternal(ThreeDModel m3d)
        {
            var opts     = Program.Options;
            var oclr     = opts.OverrideColor;
            var is_ascii = this.opts.ContainsKey("fmt") && this.opts["fmt"] == "ascii";
            var ascii    = is_ascii ? new ASCIIEncoding() : null;

            this.tw.WriteLine("ply");
            if (is_ascii)
            {
                this.tw.WriteLine("format ascii 1.0");
            }
            else
            {
                this.tw.WriteLine("format binary_little_endian 1.0");
            }

            var hasclr  = m3d.Colors != null;
            var hasnorm = m3d.Normals != null;
            var hastex  = m3d.TextureCoordinates != null;

            this.tw.WriteLine("comment Converted using MSET Converter by John Cena of PTF");
            this.tw.WriteLine("comment mset Version: {0}", Program.GetAssemblyVersion());
            this.tw.WriteLine("comment mset-ply Version: {0}", this.VersionID);
            this.tw.WriteLine("comment ");
            this.tw.WriteLine("comment Model Summary: ");
            this.tw.WriteLine("comment Name: {0}", m3d.ModelName);
            this.tw.WriteLine("comment Vertex Count: {0:#,##0} ", m3d.VertexCount);
            this.tw.WriteLine("comment Face Count: {0:#,##0} ", m3d.FaceCount);
            this.tw.WriteLine("comment ");
            this.tw.WriteLine("comment Writer options:");
            foreach (var kvp in this.opts)
            {
                this.tw.WriteLine("comment {0}={1}", kvp.Key, kvp.Value);
            }

            this.tw.WriteLine("element vertex {0:0}", m3d.VertexCount);
            this.tw.WriteLine("property float x");
            this.tw.WriteLine("property float y");
            this.tw.WriteLine("property float z");

            if (hasnorm)
            {
                this.tw.WriteLine("property float nx");
                this.tw.WriteLine("property float ny");
                this.tw.WriteLine("property float nz");
            }

            if (hasclr)
            {
                this.tw.WriteLine("property uchar red");
                this.tw.WriteLine("property uchar green");
                this.tw.WriteLine("property uchar blue");
                this.tw.WriteLine("property uchar alpha");
            }

            if (hastex)
            {
                this.tw.WriteLine("property float s");
                this.tw.WriteLine("property float t");
            }

            this.tw.WriteLine("element face {0:0}", m3d.FaceCount);
            this.tw.WriteLine("property list uchar int vertex_indices");

            this.tw.WriteLine("end_header");
            this.tw.Flush();

            for (int i = 0; i < m3d.VertexCount; i++)
            {
                var vert     = m3d.Vertices[i];
                var norm     = hasnorm ? m3d.Normals[i] : default(ThreeDNormal);
                var clr      = hasclr ? (m3d.Colors[i]) : default(ThreeDColor);
                var texcoord = hastex ? m3d.TextureCoordinates[i] : default(ThreeDTextureCoordinate);

                if (is_ascii)
                {
                    this.tw.Write("{0:0.000000} {1:0.000000} {2:0.000000}", vert.X, vert.Y, vert.Z);

                    if (hasnorm)
                    {
                        this.tw.Write(" {0:0.000000} {1:0.000000} {2:0.000000}", norm.X, norm.Y, norm.Z);
                    }

                    if (hasclr && !opts.IsColorDefined)
                    {
                        this.tw.Write(" {0:0} {1:0} {2:0} {3:0}", clr.R, clr.G, clr.B, clr.A);
                    }
                    else if (hasclr)
                    {
                        this.tw.Write(" {0:0} {1:0} {2:0} {3:0}", oclr.R, oclr.G, oclr.B, oclr.A);
                    }

                    if (hastex)
                    {
                        this.tw.Write(" {0:0.000000} {1:0.000000}", texcoord.U, texcoord.V);
                    }

                    this.tw.WriteLine();
                }
                else
                {
                    this.bw.Write(vert.X);
                    this.bw.Write(vert.Y);
                    this.bw.Write(vert.Z);

                    if (hasnorm)
                    {
                        this.bw.Write(norm.X);
                        this.bw.Write(norm.Y);
                        this.bw.Write(norm.Z);
                    }

                    if (hasclr && !opts.IsColorDefined)
                    {
                        this.bw.Write(clr.R);
                        this.bw.Write(clr.G);
                        this.bw.Write(clr.B);
                        this.bw.Write(clr.A);
                    }
                    else if (hasclr)
                    {
                        this.bw.Write(oclr.R);
                        this.bw.Write(oclr.G);
                        this.bw.Write(oclr.B);
                        this.bw.Write(oclr.A);
                    }

                    if (hastex)
                    {
                        this.bw.Write(texcoord.U);
                        this.bw.Write(texcoord.V);
                    }
                }
            }

            if (is_ascii)
            {
                foreach (var face in m3d.Faces)
                {
                    this.tw.WriteLine("3 {0:0} {1:0} {2:0}", face.Vertex1, face.Vertex2, face.Vertex3);
                }
            }
            else
            {
                foreach (var face in m3d.Faces)
                {
                    this.bw.Write((byte)3);
                    this.bw.Write(face.Vertex1);
                    this.bw.Write(face.Vertex2);
                    this.bw.Write(face.Vertex3);
                }
            }

            if (is_ascii)
            {
                this.tw.Flush();
            }
            else
            {
                this.bw.Flush();
            }
        }
Ejemplo n.º 11
0
 public void WriteModel(ThreeDModel m3d, string filename)
 {
     this.WriteModel(m3d, new FileInfo(filename));
 }
Ejemplo n.º 12
0
 public void WriteModel(ThreeDModel m3d, FileInfo file)
 {
     this.fi = file;
     using (var fs = file.Create())
         this.WriteModel(m3d, fs);
 }
Ejemplo n.º 13
0
 public void DeleteModel(ThreeDModel threeDModel)
 {
     ModelList.Remove((PrintModel)threeDModel);
     SelectedModelIndex = -1;
     PreView.models.Remove(threeDModel);
 }
Ejemplo n.º 14
0
        private ThreeDModel Picktest(int x, int y)
        {
            // int x = Mouse.X;
            // int y = Mouse.Y;
            // Console.WriteLine("X:" + x + " Y:" + y);
            gl.MakeCurrent();
            uint[] selectBuffer = new uint[128];
            GL.SelectBuffer(128, selectBuffer);
            GL.RenderMode(RenderingMode.Select);
            SetupViewport();

            GL.MatrixMode(MatrixMode.Projection);
            GL.PushMatrix();
            GL.LoadIdentity();

            int[] viewport = new int[4];
            GL.GetInteger(GetPName.Viewport, viewport);

            Matrix4 m = GluPickMatrix(x, viewport[3] - y, 1, 1, viewport);

            GL.MultMatrix(ref m);

            //GluPerspective(45, 32 / 24, 0.1f, 100.0f);
            //Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, 1, 0.1f, 100.0f);
            GL.MultMatrix(ref persp);

            GL.MatrixMode(MatrixMode.Modelview);
            GL.ClearColor(Main.threeDSettings.background.BackColor);
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            GL.Enable(EnableCap.DepthTest);
            lookAt = Matrix4.LookAt(userPosition.X, userPosition.Y, userPosition.Z, viewCenter.X, viewCenter.Y, viewCenter.Z, 0, 0, 1.0f);

            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadMatrix(ref lookAt);
            GL.Rotate(rotX, 1, 0, 0);
            GL.Rotate(rotZ, 0, 0, 1);
            GL.Translate(-ps.PrintAreaWidth * 0.5f, -ps.PrintAreaDepth * 0.5f, -0.5f * ps.PrintAreaHeight);

            GL.InitNames();
            int pos = 0;

            foreach (ThreeDModel model in models)
            {
                GL.PushName(pos++);
                GL.PushMatrix();
                model.AnimationBefore();
                GL.Translate(model.Position.x, model.Position.y, model.Position.z);
                GL.Rotate(model.Rotation.z, Vector3.UnitZ);
                GL.Rotate(model.Rotation.y, Vector3.UnitY);
                GL.Rotate(model.Rotation.x, Vector3.UnitX);
                GL.Scale(model.Scale.x, model.Scale.y, model.Scale.z);
                model.Paint();
                model.AnimationAfter();
                GL.PopMatrix();
                GL.PopName();
            }
            GL.MatrixMode(MatrixMode.Projection);
            GL.PopMatrix();
            GL.MatrixMode(MatrixMode.Modelview);

            int         hits     = GL.RenderMode(RenderingMode.Render);
            ThreeDModel selected = null;

            if (hits > 0)
            {
                selected = models.ElementAt((int)selectBuffer[3]);
                uint depth = selectBuffer[1];
                for (int i = 1; i < hits; i++)
                {
                    if (selectBuffer[4 * i + 1] < depth)
                    {
                        depth    = selectBuffer[i * 4 + 1];
                        selected = models.ElementAt((int)selectBuffer[i * 4 + 3]);
                    }
                }
            }
            //PrinterConnection.logInfo("Hits: " + hits);
            return(selected);
        }
Ejemplo n.º 15
0
        private void WriteInternal(ThreeDModel m3d)
        {
            var opts   = Program.Options;
            var usemtl = this.opts.ContainsKey("usemtl") && this.opts["usemtl"] == "true";

            if (usemtl && !opts.IsColorDefined)
            {
                ULogger.W("OBJWRITE", "usemtl set to true but no override color defined; ignoring...");
            }
            usemtl = usemtl && opts.IsColorDefined;
            if (!usemtl && opts.IsColorDefined && opts.OverrideColor.A != 255)
            {
                ULogger.W("OBJWRITE", "usemtl is not set to true, but override color has Alpha different from 255 -- it won't be written!");
            }

            this.tw.WriteLine("# Converted using MSET Converter by John Cena of PTF");
            this.tw.WriteLine("# mset Version: {0}", Program.GetAssemblyVersion());
            this.tw.WriteLine("# mset-obj Version: {0}", this.VersionID);
            this.tw.WriteLine("# ");
            this.tw.WriteLine("# Model Summary: ");
            this.tw.WriteLine("# Name: {0}", m3d.ModelName);
            this.tw.WriteLine("# Vertex Count: {0:#,##0} ", m3d.VertexCount);
            this.tw.WriteLine("# Face Count: {0:#,##0} ", m3d.FaceCount);
            this.tw.WriteLine("# ");
            this.tw.WriteLine("# Writer options:");
            foreach (var kvp in this.opts)
            {
                this.tw.WriteLine("# {0}={1}", kvp.Key, kvp.Value);
            }
            this.tw.WriteLine();

            var hasclr  = m3d.Colors != null;
            var hasnorm = m3d.Normals != null;
            var hastex  = m3d.TextureCoordinates != null;
            var mtlfn   = (string)null;

            if (this.fi != null && usemtl)
            {
                mtlfn = this.fi.Name.Substring(0, this.fi.Name.Length - this.fi.Extension.Length);
                this.tw.WriteLine("mtllib {0}.mtl", mtlfn);
            }

            this.tw.WriteLine("o Mset.1");
            this.tw.WriteLine();

            this.tw.WriteLine("# Vertices");
            //foreach (var vert in m3d.Vertices)
            for (int i = 0; i < m3d.VertexCount; i++)
            {
                var vert = m3d.Vertices[i];
                var clr  = hasclr && !usemtl ? m3d.Colors[i] : default(ThreeDColor);

                if (hasclr && !usemtl)
                {
                    this.tw.WriteLine("v {0:0.000000} {1:0.000000} {2:0.000000} {3:0.000000} {4:0.000000} {5:0.000000}", vert.X, vert.Y, vert.Z, clr.RFloat, clr.GFloat, clr.BFloat);
                }
                else
                {
                    this.tw.WriteLine("v {0:0.000000} {1:0.000000} {2:0.000000}", vert.X, vert.Y, vert.Z);
                }
            }
            this.tw.WriteLine("");

            if (hasnorm)
            {
                this.tw.WriteLine("# Normals");
                foreach (var norm in m3d.Normals)
                {
                    this.tw.WriteLine("vn {0:0.000000} {1:0.000000} {2:0.000000}", norm.X, norm.Y, norm.Z);
                }
                this.tw.WriteLine("");
            }

            if (hastex)
            {
                this.tw.WriteLine("# Texture Coordinates");
                foreach (var texcoord in m3d.TextureCoordinates)
                {
                    this.tw.WriteLine("vt {0:0.000000} {1:0.000000}", texcoord.U, texcoord.V);
                }
                this.tw.WriteLine("");
            }

            this.tw.WriteLine("# Faces");
            if (this.fi != null && usemtl)
            {
                this.tw.WriteLine("usemtl JCMset");
            }
            //foreach (var face in m3d.Faces)
            for (int i = 0; i < m3d.FaceCount; i++)
            {
                var face = m3d.Faces[i];

                if (hastex && hasnorm)
                {
                    this.tw.WriteLine("f {0:0}/{0:0}/{0:0} {1:0}/{1:0}/{1:0} {2:0}/{2:0}/{2:0}", face.Vertex1 + 1, face.Vertex2 + 1, face.Vertex3 + 1);
                }
                else if (hastex && !hasnorm)
                {
                    this.tw.WriteLine("f {0:0}/{0:0} {1:0}/{1:0} {2:0}/{2:0}", face.Vertex1 + 1, face.Vertex2 + 1, face.Vertex3 + 1);
                }
                else if (!hastex && hasnorm)
                {
                    this.tw.WriteLine("f {0:0}//{0:0} {1:0}//{1:0} {2:0}//{2:0}", face.Vertex1 + 1, face.Vertex2 + 1, face.Vertex3 + 1);
                }
                else
                {
                    this.tw.WriteLine("f {0:0} {1:0} {2:0}", face.Vertex1 + 1, face.Vertex2 + 1, face.Vertex3 + 1);
                }
            }
            this.tw.WriteLine("");

            this.tw.Flush();

            if (usemtl)
            {
                this.WriteMtl(m3d, mtlfn);
            }
        }
Ejemplo n.º 16
0
        public IEnumerable <ThreeDModel> Create3DModels(MSetFile file)
        {
            var opts = Program.Options;
            var mzs  = file.Data;
            var mns  = new HashSet <string>();

            var ns = 0;

            foreach (var mz in mzs)
            {
                ns = Math.Max(ns, mz.Model);
            }

            var mzm = new MSetZlibStream[ns + 1, 12];

            for (int i = 0; i < mzs.Length; i++)
            {
                if (opts.VerboseMode)
                {
                    ULogger.W("3DMC", "Processing stream {0}", i);
                }

                var mz = mzs[i];

                int fc = file.Models[mz.Model].FaceCount;
                var vc = file.Models[mz.Model].VertexCount;

                var mzdat = new byte[mz.DecompressedLength];
                var y     = 0;

                if (mz.CompressedLength == 0 && mz.DecompressedLength > 0)
                {
                    while (y < mz.DecompressedLength)
                    {
                        y += mz.Data.Read(mzdat, y, mz.DecompressedLength - y);
                    }
                }
                else
                {
                    var mzlib = new ZlibStream(mz.Data, CompressionMode.Decompress);
                    while (y < mz.DecompressedLength)
                    {
                        y += mzlib.Read(mzdat, y, mz.DecompressedLength - y);
                    }
                }

                if (mz.IsEncoded)
                {
                    if (mz.DataStream == 0)
                    {
                        mzdat = DataOperations.DeltaDecompress(mzdat, DataType.I32S, 3, fc);
                    }
                    else if (mz.DataStream <= 4 || mz.DataStream >= 10)
                    {
                        mzdat = DataOperations.DeltaDecompress(mzdat, DataType.F32, 3, vc);
                    }
                    else if (mz.DataStream == 5 || mz.DataStream == 6)
                    {
                        mzdat = DataOperations.DeltaDecompress(mzdat, DataType.F32, 2, vc);
                    }
                }

                mz.DataProcessed             = mzdat;
                mzm[mz.Model, mz.DataStream] = mz;
            }

            if (file.Models.Length <= 0)
            {
                yield break;
            }

            for (int i = 0; i < ns + 1; i++)
            {
                if (opts.VerboseMode)
                {
                    ULogger.W("3DMC", "Processing model {0}", i);
                }

                var mz_tris     = mzm[i, 0];
                var mz_verts    = mzm[i, 1];
                var mz_norms    = mzm[i, 2];
                var mz_binorms  = mzm[i, 3];
                var mz_tangents = mzm[i, 4];
                var mz_sts      = mzm[i, 5];
                var mz_sts3     = mzm[i, 6];
                var mz_colors   = mzm[i, 7];
                //var mz_weights =  mzm[i, 8];
                //var mz_matidxs =  mzm[i, 9];
                var mz_verts2 = mzm[i, 10];
                var mz_norms2 = mzm[i, 11];

                int fc = file.Models[mz_tris.Model].FaceCount;
                var vc = file.Models[mz_tris.Model].VertexCount;

                // ...
                var l_tris     = mz_tris.DataProcessed != null ? new ThreeDFace[fc] : null;
                var l_verts    = mz_verts.DataProcessed != null ? new ThreeDVertex[vc] : null;
                var l_norms    = mz_norms.DataProcessed != null ? new ThreeDNormal[vc] : null;
                var l_binorms  = mz_binorms.DataProcessed != null ? new ThreeDBinormal[vc] : null;
                var l_tangents = mz_tangents.DataProcessed != null ? new ThreeDTangent[vc] : null;
                var l_sts      = mz_sts.DataProcessed != null ? new ThreeDTextureCoordinate[vc] : null;
                var l_sts3     = mz_sts3.DataProcessed != null ? new ThreeDTextureCoordinate[vc] : null;
                var l_colors   = mz_colors.DataProcessed != null ? new ThreeDColor[vc] : null;
                //var l_weights =  mz_matidxs.DataProcessed != null ? new ThreeDBoneWeight[] : null;
                //var l_matidxs =  mz_weights.DataProcessed != null ? new ThreeDBoneMaterials[] : null;
                var l_verts2 = mz_verts2.DataProcessed != null ? new ThreeDVertex[vc] : null;
                var l_norms2 = mz_norms2.DataProcessed != null ? new ThreeDNormal[vc] : null;

                if (l_tris != null)
                {
                    for (int j = 0; j < fc; j++)
                    {
                        int index = j * 12;

                        var f_v1 = BitConverter.ToInt32(mz_tris.DataProcessed, index + 0);
                        var f_v2 = BitConverter.ToInt32(mz_tris.DataProcessed, index + 4);
                        var f_v3 = BitConverter.ToInt32(mz_tris.DataProcessed, index + 8);

                        //l_tris.Add(new ThreeDFace(f_v1, f_v2, f_v3));
                        l_tris[j] = new ThreeDFace(f_v1, f_v2, f_v3);
                    }
                }

                for (int j = 0; j < vc; j++)
                {
                    int index1 = j * 12;
                    int index2 = j * 8;
                    int index3 = j * 4;

                    if (l_verts != null)
                    {
                        var v_x = BitConverter.ToSingle(mz_verts.DataProcessed, index1 + 0);
                        var v_y = BitConverter.ToSingle(mz_verts.DataProcessed, index1 + 4);
                        var v_z = BitConverter.ToSingle(mz_verts.DataProcessed, index1 + 8);

                        //l_verts.Add(new ThreeDVertex(v_x, v_y, v_z));
                        l_verts[j] = new ThreeDVertex(v_x, v_y, v_z);
                    }

                    if (l_norms != null)
                    {
                        var n_x = BitConverter.ToSingle(mz_norms.DataProcessed, index1 + 0);
                        var n_y = BitConverter.ToSingle(mz_norms.DataProcessed, index1 + 4);
                        var n_z = BitConverter.ToSingle(mz_norms.DataProcessed, index1 + 8);

                        //l_norms.Add(new ThreeDNormal(n_x, n_y, n_z));
                        l_norms[j] = new ThreeDNormal(n_x, n_y, n_z);
                    }

                    if (l_binorms != null)
                    {
                        var b_x = BitConverter.ToSingle(mz_binorms.DataProcessed, index1 + 0);
                        var b_y = BitConverter.ToSingle(mz_binorms.DataProcessed, index1 + 4);
                        var b_z = BitConverter.ToSingle(mz_binorms.DataProcessed, index1 + 8);

                        //l_binorms.Add(new ThreeDBinormal(b_x, b_y, b_z));
                        l_binorms[j] = new ThreeDBinormal(b_x, b_y, b_z);
                    }

                    if (l_tangents != null)
                    {
                        var t_x = BitConverter.ToSingle(mz_tangents.DataProcessed, index1 + 0);
                        var t_y = BitConverter.ToSingle(mz_tangents.DataProcessed, index1 + 4);
                        var t_z = BitConverter.ToSingle(mz_tangents.DataProcessed, index1 + 8);

                        //l_tangents.Add(new ThreeDTangent(t_x, t_y, t_z));
                        l_tangents[j] = new ThreeDTangent(t_x, t_y, t_z);
                    }

                    if (l_sts != null)
                    {
                        var t_u = BitConverter.ToSingle(mz_sts.DataProcessed, index2 + 0);
                        var t_v = 1F - BitConverter.ToSingle(mz_sts.DataProcessed, index2 + 4);

                        //l_sts.Add(new ThreeDTextureCoordinate(t_u, t_v));
                        l_sts[j] = new ThreeDTextureCoordinate(t_u, t_v);
                    }

                    if (l_sts3 != null)
                    {
                        var t_u = BitConverter.ToSingle(mz_sts3.DataProcessed, index2 + 0);
                        var t_v = 1F - BitConverter.ToSingle(mz_sts3.DataProcessed, index2 + 4);

                        //l_sts3.Add(new ThreeDTextureCoordinate(t_u, t_v));
                        l_sts3[j] = new ThreeDTextureCoordinate(t_u, t_v);
                    }

                    if (l_colors != null)
                    {
                        var c_r = mz_colors.DataProcessed[index3 + 0];
                        var c_g = mz_colors.DataProcessed[index3 + 1];
                        var c_b = mz_colors.DataProcessed[index3 + 2];
                        var c_a = mz_colors.DataProcessed[index3 + 3];

                        //l_colors.Add(new ThreeDColor(c_r, c_g, c_b, c_a));
                        l_colors[j] = new ThreeDColor(c_r, c_g, c_b, c_a);
                    }

                    if (l_verts2 != null)
                    {
                        var v_x = BitConverter.ToSingle(mz_verts2.DataProcessed, index1 + 0);
                        var v_y = BitConverter.ToSingle(mz_verts2.DataProcessed, index1 + 4);
                        var v_z = BitConverter.ToSingle(mz_verts2.DataProcessed, index1 + 8);

                        //l_verts2.Add(new ThreeDVertex(v_x, v_y, v_z));
                        l_verts2[j] = new ThreeDVertex(v_x, v_y, v_z);
                    }

                    if (l_norms2 != null)
                    {
                        var n_x = BitConverter.ToSingle(mz_norms2.DataProcessed, index1 + 0);
                        var n_y = BitConverter.ToSingle(mz_norms2.DataProcessed, index1 + 4);
                        var n_z = BitConverter.ToSingle(mz_norms2.DataProcessed, index1 + 8);

                        //l_norms2.Add(new ThreeDNormal(n_x, n_y, n_z));
                        l_norms2[j] = new ThreeDNormal(n_x, n_y, n_z);
                    }
                }

                var mname = this.GenerateUniqueName(mns, mz_tris.ModelName);
                mns.Add(mname);
                var m3d = new ThreeDModel
                {
                    ModelName   = mname,
                    VertexCount = vc,
                    FaceCount   = fc,

                    Faces = l_tris != null?Array.AsReadOnly(l_tris) : null,
                                Vertices = l_verts != null?Array.AsReadOnly(l_verts) : null,
                                               Normals = l_norms != null?Array.AsReadOnly(l_norms) : null,
                                                             Binormals = l_binorms != null?Array.AsReadOnly(l_binorms) : null,
                                                                             Tangents = l_tangents != null?Array.AsReadOnly(l_tangents) : null,
                                                                                            TextureCoordinates = l_sts != null?Array.AsReadOnly(l_sts) : null,
                                                                                                                     TextureCoordinates3 = l_sts3 != null?Array.AsReadOnly(l_sts3) : null,
                                                                                                                                               Colors = l_colors != null?Array.AsReadOnly(l_colors) : null,
                                                                                                                                                            //
                                                                                                                                                            //
                                                                                                                                                            Vertices2 = l_verts2 != null?Array.AsReadOnly(l_verts2) : null,
                                                                                                                                                                            Normals2 = l_norms2 != null?Array.AsReadOnly(l_norms2) : null
                };
                yield return(m3d);
            }
        }