예제 #1
0
        private void LoadingAsync()
        {
            ShowMsg("Loading...");
            // Thread.Sleep(5000);
            saveFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName);
            saveFileDialog1.FileName         = openFileDialog1.SafeFileName;

            this.Text = "Obj Doctor - " + Path.GetFileNameWithoutExtension(openFileDialog1.FileName);

            //var txt = objSrv.ReadFile(@"C:\Users\jorge\Documents\modo\triszbrush.OBJ");
            //var txt = objSrv.ReadFile(@"C:\Users\jorge\Documents\modo\caja2.WaveFront");
            var txt = objSrv.ReadFile(openFileDialog1.FileName);


            _waveFront = objSrv.ParseString(txt);
            objSrv.ObjGetStat(_waveFront);
            ShowMsg("Drawing...");
            DrawStat();
            var scale = objSrv.Scale(_waveFront.Max, _waveFront.Min, panel1.Width, panel1.Height, 0);
            int axis  = comboBox1.SelectedIndex;

            _bitmap            = objDraw.Draw(_waveFront, panel1.Width, panel1.Height, scale, axis);
            _waveFront.VBackup = objSrv.CloneList(_waveFront.V); // backup previous vectors.
            panel1.Refresh();
            HideMsg();
        }
예제 #2
0
파일: ObjSrv.cs 프로젝트: EFTEC/ObjDoctor
        private void AddVector(WaveFront waveFront, string[] line)
        {
            if (line.Length < 4)
            {
                //error, vector incorrectly defined.
                throw new Exception("Error in vector");
            }
            Vector vector = new Vector(double.Parse(line[1], culture)
                                       , double.Parse(line[2], culture)
                                       , double.Parse(line[3], culture));

            waveFront.V.Add(vector);
        }
예제 #3
0
파일: ObjSrv.cs 프로젝트: EFTEC/ObjDoctor
        public void ParseSave(WaveFront wave, Rescale rescale, string fileName)
        {
            var linesFinal = new List <string>();

            foreach (var line in wave.Original)
            {
                if (line == "")
                {
                    linesFinal.Add(line);
                    continue;
                }
                if (line.Substring(0, 1) == "#")
                {
                    // add comments.
                    linesFinal.Add(line);
                    continue;
                }
                var cont  = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                var first = cont[0];
                switch (first)
                {
                case "o":
                case "g":
                case "\0":
                case "mtllib":
                case "usemtl":
                case "s":
                case "f":
                case "vt":
                    linesFinal.Add(line);     // we do nothing
                    break;

                case "v":
                    linesFinal.Add(AddVector(cont, rescale));
                    //AddVector(waveFront, line);
                    break;

                case "vn":
                    linesFinal.Add(AddNormal(cont, rescale));
                    //waveFront.vn.Add(second);
                    break;

                default:
                    throw new Exception("Error in group type :[" + first + "]");
                }
            }

            string txt = String.Join("\r\n", linesFinal);

            File.WriteAllText(fileName, txt);
        }
예제 #4
0
파일: ObjSrv.cs 프로젝트: EFTEC/ObjDoctor
        /// <summary>
        /// Obtenemos el minimo y maximo.
        /// </summary>
        /// <param name="waveFront"></param>
        public void ObjGetStat(WaveFront waveFront)
        {
            // reset
            waveFront.Min = new Vector(float.MaxValue, float.MaxValue, float.MaxValue);
            waveFront.Max = new Vector(float.MinValue, float.MinValue, float.MinValue);

            foreach (var v in waveFront.V)
            {
                waveFront.Min.X = (waveFront.Min.X > v.X) ? v.X : waveFront.Min.X;
                waveFront.Min.Y = (waveFront.Min.Y > v.Y) ? v.Y : waveFront.Min.Y;
                waveFront.Min.Z = (waveFront.Min.Z > v.Z) ? v.Z : waveFront.Min.Z;
                waveFront.Max.X = (waveFront.Max.X < v.X) ? v.X : waveFront.Max.X;
                waveFront.Max.Y = (waveFront.Max.Y < v.Y) ? v.Y : waveFront.Max.Y;
                waveFront.Max.Z = (waveFront.Max.Z < v.Z) ? v.Z : waveFront.Max.Z;
            }
        }
예제 #5
0
파일: ObjSrv.cs 프로젝트: EFTEC/ObjDoctor
        public WaveFront ParseString(string txt)
        {
            var lines = txt.Split(new[] { "\n" }, StringSplitOptions.None);

            var r = new WaveFront();

            r.Original = lines.ToList();

            foreach (var line in lines)
            {
                if (line == "")
                {
                    continue;
                }

                var    cont   = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                var    first  = cont[0];
                var    p      = line.IndexOf(" ", StringComparison.Ordinal);
                string second = p < 0 ? "" : line.Substring(p + 1);

                ParseHeader(cont, first, second, r);
            }
            return(r);
        }
예제 #6
0
파일: ObjDraw.cs 프로젝트: EFTEC/ObjDoctor
        public Bitmap Draw(WaveFront waveFront, int w, int h, double scale, int axis = 0)
        {
            if (w <= 0 || h <= 0)
            {
                w = 100;
                h = 100;
            }
            var bitmap = new Bitmap(w, h);

            var palette = new[] { Color.Blue, Color.Red, Color.DarkBlue, Color.Green, Color.SaddleBrown, Color.DarkGoldenrod };

            int halfh = h / 2;
            int halfw = w / 2;
            int x = 0, y = 0;
            int x2 = 0, y2 = 0;

            FillBitmap(bitmap);
            double scale2 = scale / 1.5d;

            DrawLineInt(bitmap, halfw, 0, halfw, h, Color.Black);
            DrawLineInt(bitmap, 0, halfh, w, halfh, Color.Black);

            //var scale = Scale(WaveFront.max,WaveFront.min,w,h,axis);
            int numCol = -1;

            /*
             * var color = palette[0];
             * foreach (var v in waveFront.v)
             * {
             *  switch (axis)
             *  {
             *      case 0:
             *          x = halfw+ Convert.ToInt32(v.x * scale);
             *          y = halfh - Convert.ToInt32(v.y * scale);
             *          break;
             *      case 1:
             *          x = halfw + Convert.ToInt32(v.x * scale);
             *          y = halfh - Convert.ToInt32(v.z * scale);
             *          break;
             *      case 2:
             *          x = halfw + Convert.ToInt32(v.y * scale);
             *          y = halfh - Convert.ToInt32(v.z * scale);
             *          break;
             *      case 3:
             *          x = halfw + Convert.ToInt32(v.x+(v.z/2) * scale2);
             *          y = halfh - Convert.ToInt32(v.y+(v.z/2) * scale2);
             *          break;
             *  }
             *
             *  bitmap.SetPixel(x,y,color);
             * }
             */

            foreach (var mesh in waveFront.O)
            {
                foreach (var grupo in mesh.group)
                {
                    numCol++;
                    if (numCol >= palette.Length)
                    {
                        numCol = 0;
                    }

                    var color2 = palette[numCol];
                    int fCount = grupo.fg.Count;
                    fCount = (fCount > 50000) ? 50000 : fCount; // hard limit of 50k vertexs.
                    for (var i = 0; i < fCount; i++)
                    {
                        var curFace     = grupo.fg[i];
                        var curFaceSize = curFace.f.Count;
                        for (var ifg = 0; ifg < curFaceSize; ifg++)
                        {
                            int ifg1    = (ifg < curFaceSize - 1) ? ifg + 1 : 0; // we close the face
                            var idxV1   = curFace.f[ifg];
                            var idxV2   = curFace.f[ifg1];
                            var vector  = waveFront.V[idxV1.v - 1];
                            var vector2 = waveFront.V[idxV2.v - 1];
                            switch (axis)
                            {
                            case 0:
                                x  = Convert.ToInt32(vector.X * scale) + halfw;
                                y  = halfh - Convert.ToInt32(vector.Y * scale);
                                x2 = Convert.ToInt32(vector2.X * scale) + halfw;
                                y2 = halfh - Convert.ToInt32(vector2.Y * scale);
                                break;

                            case 1:
                                x  = Convert.ToInt32(vector.X * scale) + halfw;
                                y  = halfh - Convert.ToInt32(vector.Z * scale);
                                x2 = Convert.ToInt32(vector2.X * scale) + halfw;
                                y2 = halfh - Convert.ToInt32(vector2.Z * scale);
                                break;

                            case 2:
                                x  = Convert.ToInt32(vector.Y * scale) + halfw;
                                y  = halfh - Convert.ToInt32(vector.Z * scale);
                                x2 = Convert.ToInt32(vector2.Y * scale) + halfw;
                                y2 = halfh - Convert.ToInt32(vector2.Z * scale);
                                break;

                            case 3:

                                x  = Convert.ToInt32(vector.X + (vector.Z / 2) * scale2) + halfw;
                                y  = halfh - Convert.ToInt32(vector.Y + (vector.Z / 2) * scale2);
                                x2 = Convert.ToInt32(vector2.X + (vector2.Z / 2) * scale2) + halfw;
                                y2 = halfh - Convert.ToInt32(vector2.Y + (vector2.Z / 2) * scale2);
                                break;
                            }

                            DrawLineInt(bitmap, x, y, x2, y2, color2);
                        }
                    }
                }
            }



            return(bitmap);
        }
예제 #7
0
파일: ObjSrv.cs 프로젝트: EFTEC/ObjDoctor
        private void ParseHeader(string[] line, string first, string second, WaveFront waveFront)
        {
            var curMesh  = waveFront.O.LastOrDefault();
            var curGroup = curMesh?.group.LastOrDefault();

            switch (first)
            {
            case "#":
                waveFront.Com.Add(second);
                break;

            case "o":
                Mesh mesh = new Mesh();
                mesh.name = second;
                waveFront.O.Add(mesh);
                //r = ObjMode.mesh; // cambiamos el modo
                break;

            case "g":
                Group g = new Group();
                g.name = second;
                if (curMesh == null)
                {
                    curMesh = new Mesh("Nonane " + waveFront.O.Count);
                    waveFront.O.Add(curMesh);
                }
                curMesh.group.Add(g);
                //r = ObjMode.group; // cambiamos a modo grupo.
                break;

            case "vn":
                waveFront.Vn.Add(second);
                break;

            case "vt":
                waveFront.Vt.Add(second);
                break;

            case "mtllib":
                waveFront.Mtllib.Add(second);
                break;

            case "usemtl":
                waveFront.Usemtl.Add(second);
                break;

            case "s":
                waveFront.S.Add(second);
                break;

            case "v":
                AddVector(waveFront, line);
                break;

            case "f":
                if (curMesh == null)
                {
                    curMesh = new Mesh("Nonane " + waveFront.O.Count);
                    waveFront.O.Add(curMesh);
                }
                if (curGroup == null)
                {
                    curGroup = new Group("Nonane " + curMesh.group.Count);
                    curMesh.group.Add(curGroup);
                }

                AddFace(curGroup, line);
                break;

            case "\0":
                break;

            default:
                if (first.Substring(0, 1) == "#")
                {
                    waveFront.Com.Add(first.Substring(1));
                }
                else
                {
                    throw new Exception("Error in group type :[" + first + "]");
                }
                break;
            }
        }