//DoWorkイベントハンドラ private void ProgressDialog_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bw = (BackgroundWorker)sender; bw.ReportProgress(0, "ファイル読み込み中(バーは動きません (^-^;)"); using (FileFormat.MQOFile mqo = FileFormat.MQOFile.load(mqopath, true)) // 三角面化して読み込む { if (mqo == null) throw new Exception("読み込み失敗。おそらくmqoファイルの構文エラー。"); if (mqo.Object.Count == 0) throw new Exception("オブジェクトが空です。"); // pmx作成 bld = PEStaticBuilder.Pmx; pmx = bld.Pmx(); pmx.Clear(); // モデル名は最初のオブジェクト名を利用する pmx.ModelInfo.ModelName = mqo.Object[0].Name; // 材質 int mc = mqo.Material.Count; if (mc == 0) throw new Exception("材質がありません。少なくとも1つ材質が必要です。"); int cw = 100 / mc; int pc = 0; mqo.Material.ForEach(m => { bw.ReportProgress(cw * pc++, "材質の変換中"); IPXMaterial pm = bld.Material(); pm.Name = m.Name; pm.Diffuse.R = (float)(m.Color.R * m.Diffuse); pm.Diffuse.G = (float)(m.Color.G * m.Diffuse); pm.Diffuse.B = (float)(m.Color.B * m.Diffuse); pm.Diffuse.A = (float)m.Color.A; pm.Ambient.R = (float)(m.Color.R * m.Ambient); pm.Ambient.G = (float)(m.Color.G * m.Ambient); pm.Ambient.B = (float)(m.Color.B * m.Ambient); pm.Specular.R = (float)(m.Color.R * m.Specular); pm.Specular.G = (float)(m.Color.G * m.Specular); pm.Specular.B = (float)(m.Color.B * m.Specular); pm.Power = (float)m.Power; pm.Tex = m.Tex; pmx.Material.Add(pm); }); // 各オブジェクトを処理 // ただし、非表示オブジェクトはスキップ mc = mqo.Object.Count; cw = 100 / mc; bw.ReportProgress(0, "法線を計算中"); Parallel.ForEach(mqo.Object, mObj => { if (mObj.Visible) mObj.CalcNormals(); bw.ReportProgress(cw, 1); }); // 先に頂点をすべて登録してから面を登録する // 頂点登録と面登録を交互に行うととんでもなく遅くなる mc = mqo.Material.Count; WorkFaceList workfacelist = new WorkFaceList(mc); WorkVertexDict workvertexdict = new WorkVertexDict(); mc = mqo.Object.Count; cw = 100 / mc; pc = 0; for (int objID=0; objID<mc; objID++) { var mObj = mqo.Object[objID]; bw.ReportProgress(cw * pc++, String.Format("'{0}'の変換中", mObj.Name)); mObj.Face.ForEach(fc => { if (!mObj.Visible) return; // 非表示オブジェクトは無視 // 材質割り当てのない面は材質0として処理 int matID = fc.MatID < 0 ? 0 : fc.MatID; Func<int, int> get_vertex = i => workvertexdict.RegistVertex(objID, fc.VertexID[i], fc.UVID[i], fc.NormalID[i]); workfacelist.AddFace(matID, get_vertex(0), get_vertex(1), get_vertex(2)); }); } workvertexdict.RegistToPmx(pmx, bld, mqo, bw); workfacelist.RegistToPmx(pmx, bld, mqo, workvertexdict, bw); } }
//DoWorkイベントハンドラ private void ProgressDialog_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bw = (BackgroundWorker)sender; bw.ReportProgress(0, "ファイル読み込み中(バーは動きません (^-^;)"); using (FileFormat.MQOFile mqo = FileFormat.MQOFile.load(mqopath, true)) // 三角面化して読み込む { if (mqo == null) { throw new Exception("読み込み失敗。おそらくmqoファイルの構文エラー。"); } if (mqo.Object.Count == 0) { throw new Exception("オブジェクトが空です。"); } // pmx作成 bld = PEStaticBuilder.Pmx; pmx = bld.Pmx(); pmx.Clear(); // モデル名は最初のオブジェクト名を利用する pmx.ModelInfo.ModelName = mqo.Object[0].Name; // 材質 int mc = mqo.Material.Count; if (mc == 0) { throw new Exception("材質がありません。少なくとも1つ材質が必要です。"); } int cw = 100 / mc; int pc = 0; mqo.Material.ForEach(m => { bw.ReportProgress(cw * pc++, "材質の変換中"); IPXMaterial pm = bld.Material(); pm.Name = m.Name; pm.Diffuse.R = (float)(m.Color.R * m.Diffuse); pm.Diffuse.G = (float)(m.Color.G * m.Diffuse); pm.Diffuse.B = (float)(m.Color.B * m.Diffuse); pm.Diffuse.A = (float)m.Color.A; pm.Ambient.R = (float)(m.Color.R * m.Ambient); pm.Ambient.G = (float)(m.Color.G * m.Ambient); pm.Ambient.B = (float)(m.Color.B * m.Ambient); pm.Specular.R = (float)(m.Color.R * m.Specular); pm.Specular.G = (float)(m.Color.G * m.Specular); pm.Specular.B = (float)(m.Color.B * m.Specular); pm.Power = (float)m.Power; pm.Tex = m.Tex; pmx.Material.Add(pm); }); // 各オブジェクトを処理 // ただし、非表示オブジェクトはスキップ mc = mqo.Object.Count; cw = 100 / mc; bw.ReportProgress(0, "法線を計算中"); Parallel.ForEach(mqo.Object, mObj => { if (mObj.Visible) { mObj.CalcNormals(); } bw.ReportProgress(cw, 1); }); // 先に頂点をすべて登録してから面を登録する // 頂点登録と面登録を交互に行うととんでもなく遅くなる mc = mqo.Material.Count; WorkFaceList workfacelist = new WorkFaceList(mc); WorkVertexDict workvertexdict = new WorkVertexDict(); mc = mqo.Object.Count; cw = 100 / mc; pc = 0; for (int objID = 0; objID < mc; objID++) { var mObj = mqo.Object[objID]; bw.ReportProgress(cw * pc++, String.Format("'{0}'の変換中", mObj.Name)); mObj.Face.ForEach(fc => { if (!mObj.Visible) { return; // 非表示オブジェクトは無視 } // 材質割り当てのない面は材質0として処理 int matID = fc.MatID < 0 ? 0 : fc.MatID; Func <int, int> get_vertex = i => workvertexdict.RegistVertex(objID, fc.VertexID[i], fc.UVID[i], fc.NormalID[i]); workfacelist.AddFace(matID, get_vertex(0), get_vertex(1), get_vertex(2)); }); } workvertexdict.RegistToPmx(pmx, bld, mqo, bw); workfacelist.RegistToPmx(pmx, bld, mqo, workvertexdict, bw); } }