示例#1
0
        //DoWorkイベントハンドラ
        private void ProgressDialog_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = (BackgroundWorker)sender;

            FileFormat.MQOFile mqo = new FileFormat.MQOFile();

            int mc = pmx.Material.Count;
            int cw = 100 / mc;

            // 形状の変換
            // pmxは材質ごとに面がある
            bw.ReportProgress(0, "材質と形状の変換中");
            for (var i = 0; i < pmx.Material.Count; i++)
            {
                mqo.Material.Add(null); mqo.Object.Add(null);
            }
            Parallel.For(0, pmx.Material.Count, matID =>
            {
                var pmxMat = pmx.Material[matID];

                // 材質変換
                var mqoMat      = new FileFormat.MQOMaterial(pmxMat.Name);
                mqoMat.Color.R  = (Decimal)pmxMat.Diffuse.R;
                mqoMat.Color.G  = (Decimal)pmxMat.Diffuse.G;
                mqoMat.Color.B  = (Decimal)pmxMat.Diffuse.B;
                mqoMat.Color.A  = (Decimal)pmxMat.Diffuse.A;
                mqoMat.Diffuse  = 1;
                mqoMat.Ambient  = (Decimal)(pmxMat.Ambient.R + pmxMat.Ambient.G + pmxMat.Ambient.B) / 3;
                mqoMat.Specular = (Decimal)(pmxMat.Specular.R + pmxMat.Specular.G + pmxMat.Specular.B) / 3;
                mqoMat.Power    = (Decimal)pmxMat.Power;
                if (pmxMat.Tex != null)
                {
                    mqoMat.Tex = pmxMat.Tex;
                }
                mqo.Material[matID] = mqoMat;

                // 形状変換
                var mqoObj = new FileFormat.MQOObject(pmxMat.Name);
                foreach (var face in pmxMat.Faces)
                {
                    int v1           = appendVertex(mqoObj, face.Vertex1);
                    int v2           = appendVertex(mqoObj, face.Vertex2);
                    int v3           = appendVertex(mqoObj, face.Vertex3);
                    int uv1          = appendUV(mqoObj, face.Vertex1);
                    int uv2          = appendUV(mqoObj, face.Vertex2);
                    int uv3          = appendUV(mqoObj, face.Vertex3);
                    var mqoFace      = new FileFormat.MQOFace();
                    mqoFace.MatID    = matID;
                    mqoFace.VertexID = new int[] { v1, v2, v3 };
                    mqoFace.UVID     = new int[] { uv1, uv2, uv3 };
                    mqoObj.Face.Add(mqoFace);
                }
                mqo.Object[matID] = mqoObj;
                bw.ReportProgress(cw, 1);
            });

            mqo.FixNames();

            bw.ReportProgress(0, "書き出し中(バーは動きません (^-^;)");
            // 書き出し
            mqo.WriteTo(mqopath);

            bw.ReportProgress(100, "書き出し完了");
            //結果を設定する
            //e.Result = true;
        }
示例#2
0
        //DoWorkイベントハンドラ
        private void ProgressDialog_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = (BackgroundWorker)sender;

            FileFormat.MQOFile mqo = new FileFormat.MQOFile();

            int mc = pmx.Material.Count;
            int cw = 100 / mc;

            // 形状の変換
            // pmxは材質ごとに面がある
            bw.ReportProgress(0, "材質と形状の変換中");
            for (var i = 0; i < pmx.Material.Count; i++) { mqo.Material.Add(null); mqo.Object.Add(null); }
            Parallel.For(0, pmx.Material.Count, matID =>
            {
                var pmxMat = pmx.Material[matID];

                // 材質変換
                var mqoMat = new FileFormat.MQOMaterial(pmxMat.Name);
                mqoMat.Color.R = (Decimal)pmxMat.Diffuse.R;
                mqoMat.Color.G = (Decimal)pmxMat.Diffuse.G;
                mqoMat.Color.B = (Decimal)pmxMat.Diffuse.B;
                mqoMat.Color.A = (Decimal)pmxMat.Diffuse.A;
                mqoMat.Diffuse = 1;
                mqoMat.Ambient = (Decimal)(pmxMat.Ambient.R + pmxMat.Ambient.G + pmxMat.Ambient.B)/3;
                mqoMat.Specular = (Decimal)(pmxMat.Specular.R + pmxMat.Specular.G + pmxMat.Specular.B)/3;
                mqoMat.Power = (Decimal)pmxMat.Power;
                if (pmxMat.Tex != null) mqoMat.Tex = pmxMat.Tex;
                mqo.Material[matID] = mqoMat;

                // 形状変換
                var mqoObj = new FileFormat.MQOObject(pmxMat.Name);
                foreach (var face in pmxMat.Faces)
                {
                    int v1 = appendVertex(mqoObj, face.Vertex1);
                    int v2 = appendVertex(mqoObj, face.Vertex2);
                    int v3 = appendVertex(mqoObj, face.Vertex3);
                    int uv1 = appendUV(mqoObj, face.Vertex1);
                    int uv2 = appendUV(mqoObj, face.Vertex2);
                    int uv3 = appendUV(mqoObj, face.Vertex3);
                    var mqoFace = new FileFormat.MQOFace();
                    mqoFace.MatID = matID;
                    mqoFace.VertexID = new int[] { v1, v2, v3 };
                    mqoFace.UVID = new int[] { uv1, uv2, uv3 };
                    mqoObj.Face.Add(mqoFace);
                }
                mqo.Object[matID] = mqoObj;
                bw.ReportProgress(cw, 1);
            });

            mqo.FixNames();

            bw.ReportProgress(0, "書き出し中(バーは動きません (^-^;)");
            // 書き出し
            mqo.WriteTo(mqopath);

            bw.ReportProgress(100, "書き出し完了");
            //結果を設定する
            //e.Result = true;
        }