//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; }
//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; }