public void Export(IPXPmx pmx, string path, IPERunArgs args) { this.pmx = pmx; this.mqopath = path; using (ProgressDialog pd = new ProgressDialog("MQOExporter", new DoWorkEventHandler(ProgressDialog_DoWork))) { pd.CancelButtonEnabled = false; switch (pd.ShowDialog()) { case DialogResult.Abort: //エラー情報を取得する Exception ex = pd.Error; MessageBox.Show(ex.Message, "MQOExporter: Error!!", MessageBoxButtons.OK, MessageBoxIcon.Error); break; case DialogResult.Cancel: MessageBox.Show("キャンセルされました。", "MQOExporter", MessageBoxButtons.OK, MessageBoxIcon.Stop); break; case DialogResult.OK: MessageBox.Show("書き出しが完了しました。", "MQOExporter", MessageBoxButtons.OK, MessageBoxIcon.Information); break; default: break; } } }
public void MakeMorph(IPEConnector connector, MyPMX mypmx, VertexSelect vs, Form1 form) { float diff = form.Morphdiffernce; IPXPmx pmx = connector.Pmx.GetCurrentState(); if (mypmx.VertexArray.Count() != pmx.Vertex.Count) { MessageBox.Show("本体とプラグインのモデル頂点数が異なるのでこの操作はキャンセルされました。"); return; } basePos.Clear(); morphedPos.Clear(); for (int i = 0; i < pmx.Vertex.Count; i++) { Vector3 morphPosI = mypmx.VertexArray[i].Position; Vector3 basePosI = new Vector3(pmx.Vertex[i].UV.U, pmx.Vertex[i].UV.V, 0); if (Math.Abs(basePosI.X - morphPosI.X) > diff || Math.Abs(basePosI.Y - morphPosI.Y) > diff) { basePos.Add(i, basePosI); morphedPos.Add(i, morphPosI); } } form.SetMorphedCount(basePos.Count); vs.selectedVertexIndex = this.GetMorphTargetIndex(); }
private static JointGraph makeJointGraph(IPXPmx pmx) { JointGraph jointGraph = new JointGraph(); foreach (IPXJoint joint in pmx.Joint) { Node jointNode = makeJointNode(joint); if (null != joint.BodyA) { Node bodyANode = makeBodyNode(joint.BodyA); jointGraph.addEdge(bodyANode, jointNode); } if (null != joint.BodyB) { Node bodyBNode = makeBodyNode(joint.BodyB); jointGraph.addEdge(jointNode, bodyBNode); } } // register isolated rigid bodies foreach (IPXBody body in pmx.Body) { jointGraph.addNode(makeBodyNode(body)); } return(jointGraph); }
/// <summary> /// Returns the vertices that are inside the cube defined by its two opposing points. /// </summary> public static IEnumerable <IPXVertex> InsideCube(V3 a, V3 b, IPXPmx pmx) { float xmin = Math.Min(a.X, b.X); float xmax = Math.Max(a.X, b.X); float ymin = Math.Min(a.Y, b.Y); float ymax = Math.Max(a.Y, b.Y); float zmin = Math.Min(a.Z, b.Z); float zmax = Math.Max(a.Z, b.Z); return(pmx.Vertex.Where(v => { float x = v.Position.X; float y = v.Position.Y; float z = v.Position.Z; if (x < xmin || x > xmax) { return false; } if (y < ymin || y > ymax) { return false; } if (z < zmin || z > zmax) { return false; } return true; })); }
public IPXPmx Import(string path, IPERunArgs args) { try { form = new ObjImportForm(path, args); form.ShowDialog(); if (form.DialogResult == DialogResult.OK) { //New importer parses OBJ/MTL files into IPX*-types ObjFileImporter importer = new ObjFileImporter(path, builder, form.Settings); //If there are errors, notify the user if (importer.ErrorNum + importer.ErrorNumMtl > 0) { if (MessageBox.Show($"There have been errors during import:\n{importer.ErrorNum} while processing OBJ\n{importer.ErrorNumMtl} while processing MTL\n\nWould you like to open the log file to find out what happened?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { System.Diagnostics.Process.Start(importer.LogFileUrl); } } return(importer.ToPmx()); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } //If execution reaches this point, either an error has occured or the user pressed Cancel. pmx = builder.Pmx(); return(pmx); }
public override void Run(IPXCPluginRunArgs args) { base.Run(args); try { //PMXファイルを操作するためにおまじない。 this.args = args; this.conn = args.Connector; this.PMX = PXCBridge.GetCurrentPmx(this.conn); //-----------------------------------------------------------ここから----------------------------------------------------------- //ここから処理開始 //-----------------------------------------------------------ここから----------------------------------------------------------- System.Diagnostics.Process.Start("http://walogia.ucoz.club/donate.html"); IPXPmx iPXPmx = base.m_bld.Pmx(); iPXPmx.FromFile(System.IO.Directory.GetCurrentDirectory() + @"\_plugin\User\Scale\model\Scale by iRon0129.pmx"); this.scale = PXCBridge.RegisterUIModel(args.Connector, iPXPmx, "不知道起什么", null, true, true); //-----------------------------------------------------------ここまで----------------------------------------------------------- //処理ここまで //-----------------------------------------------------------ここまで----------------------------------------------------------- //必要がある場合はモデル・画面を更新します。 Thread.Sleep(10000); scale.Release(); this.Update(); } catch (Exception ex) { // 例外処理 MessageBox.Show(ex.Message); } }
public MorphScaleForm(IPERunArgs args) { InitializeComponent(); _args = args; _pmx = args.Host.Connector.Pmx.GetCurrentState(); }
private void buttonMake_Click(object sender, EventArgs e) { pmx = args.Host.Connector.Pmx.GetCurrentState(); var selectedBones = args.Host.Connector.View.PmxView.GetSelectedBoneIndices().Select(i => pmx.Bone[i]).ToList(); if (selectedBones.Count < 1) { MessageBox.Show("PmxViewで対象ボーンを選択してください"); return; } // ボーンモーフを生成 var ScaleMorph = PEStaticBuilder.Pmx.Morph(); ScaleMorph.Name = "拡縮-" + selectedBones[0].Name; ScaleMorph.Kind = MorphKind.Bone; ScaleMorph.Panel = 4; // ボーンオフセットを生成 foreach (var bone in selectedBones) { var offset = PEStaticBuilder.Pmx.BoneMorphOffset(); offset.Bone = bone; offset.Translation = new PEPlugin.SDX.V3( bone.Position.X * (float)numericX.Value - bone.Position.X, bone.Position.Y * (float)numericY.Value - bone.Position.Y, bone.Position.Z * (float)numericZ.Value - bone.Position.Z ); ScaleMorph.Offsets.Add(offset); } pmx.Morph.Add(ScaleMorph); Utility.Update(args.Host.Connector, pmx, PmxUpdateObject.Morph); MessageBox.Show("完了"); }
public void Export(IPXPmx pmx, string path, IPERunArgs args) { this.pmx = pmx; this.mqopath = path; using (ProgressDialog pd = new ProgressDialog("MQOExporter", new DoWorkEventHandler(ProgressDialog_DoWork))) { pd.CancelButtonEnabled = false; switch (pd.ShowDialog()) { case DialogResult.Abort: //エラー情報を取得する Exception ex = pd.Error; MessageBox.Show(ex.Message, "MQOExporter: Error!!", MessageBoxButtons.OK, MessageBoxIcon.Error); break; case DialogResult.Cancel: MessageBox.Show("キャンセルされました。", "MQOExporter", MessageBoxButtons.OK, MessageBoxIcon.Stop); break; case DialogResult.OK: MessageBox.Show("書き出しが完了しました。", "MQOExporter", MessageBoxButtons.OK, MessageBoxIcon.Information); break; default: break; } } }
private void Reload() { currentPmx = args.Host.Connector.Pmx.GetCurrentState(); listBoxMaterial.Items.Clear(); listBoxMaterial.Items.AddRange(currentPmx.Material.Select(m => m.Name).ToArray()); textBoxModelName.Text = currentPmx.ModelInfo.ModelName; textBoxModelText.Text = currentPmx.ModelInfo.Comment; }
private void ReloadButton_Click(object sender, EventArgs e) { pmx = args.Host.Connector.Pmx.GetCurrentState(); materialListBox.Items.Clear(); materialListBox.Items.AddRange(pmx.Material.Select(m => m.Name).ToArray()); comboBoxWeightBone.Items.Clear(); comboBoxWeightBone.Items.AddRange(pmx.Bone.Select(b => b.Name).ToArray()); }
public DrawablePmx(IPXPmx pmx) { World = Matrix.Identity; Visible = true; Pmx = pmx; m_Materials = new List <DrawableMaterial>(pmx.Material.Count); VertexIndexDic = new VIDictionary(pmx.Vertex.Count); }
public CtrlForm(IPERunArgs input) { InitializeComponent(); args = input; currentPmx = args.Host.Connector.Pmx.GetCurrentState(); listBoxMaterial.Items.AddRange(currentPmx.Material.Select(m => m.Name).ToArray()); textBoxModelName.Text = currentPmx.ModelInfo.ModelName; textBoxModelText.Text = currentPmx.ModelInfo.Comment; }
public void TestCreateUVMorph() { var baseVertices = PEMockFactory.CreateVertices(new[] { new V2(0.0f, 0.0f), new V2(0.1f, 0.1f), new V2(0.2f, 0.2f), }).ToList(); IPXPmx baseModel = PEMockFactory.CreateModel(baseVertices, new[] { (0, 1, 2) });
private static BoneGraph makeBoneGraph(IPXPmx pmx) { BoneGraph boneGraph = new BoneGraph(); foreach (IPXBone bone in pmx.Bone) { Node boneNode = makeBoneNode(bone); /////////// // 4 種類のエッジを作成する // (1) 親 -> 子 (type=親子) // (2) 付与親 -> 子 (type=付与親) // (2) IKボーン -> IKターゲットボーン (type=IKターゲット) // (3) IKボーン -> IKリンクボーン (type=IKリンク) boneGraph.addNode(boneNode); // 4種に当てはまらないボーン用 // (1) IPXBone parentBone = bone.Parent; if (null != parentBone) { Node parentNode = makeBoneNode(parentBone); EdgeInfo info = new EdgeInfo(boneNode, "親子"); boneGraph.addEdge(parentNode, info); } // (2) if (null != bone.AppendParent && (bone.IsAppendRotation || bone.IsAppendTranslation)) { Node appendNode = makeBoneNode(bone.AppendParent); EdgeInfo info = new EdgeInfo(boneNode, "付与親"); info.setAttr( "weight", string.Format("{0:F3}", bone.AppendRatio)); boneGraph.addEdge(appendNode, info); } // (3), (4) if (bone.IsIK && null != bone.IK) { if (null != bone.IK.Target) { Node targetNode = makeBoneNode(bone.IK.Target); EdgeInfo targetInfo = new EdgeInfo( targetNode, "IKターゲット"); boneGraph.addEdge(boneNode, targetInfo); } foreach (IPXIKLink ikLink in bone.IK.Links) { Node linkNode = makeBoneNode(ikLink.Bone); EdgeInfo linkInfo = new EdgeInfo( linkNode, "IKリンク"); boneGraph.addEdge(boneNode, linkInfo); } } } return(boneGraph); }
private void UpdatePmx(IPXPmx pmx) { Application.DoEvents(); // TODO: This method blocks the UI thread and there's no way around it. Consider starting the UI on a new thread. _args.Host.Connector.Pmx.Update(pmx); _args.Host.Connector.View.PmxView.UpdateModel(); _args.Host.Connector.View.PmxView.UpdateView(); _args.Host.Connector.Form.UpdateList(PEPlugin.Pmd.UpdateObject.All); cancelButton.Enabled = false; }
public void Format() { pmx = args.Host.Connector.Pmx.GetCurrentState(); listBoxMaterial.Items.Clear(); listBoxMaterial.Items.Add(""); listBoxMaterial.Items.AddRange(pmx.Material.Select(m => m.Name).ToArray()); comboBoxBone.Items.Clear(); comboBoxBone.Items.AddRange(pmx.Bone.Select(b => b.Name).ToArray()); materialBmp = new Bitmap[pmx.Material.Count]; }
public CtrlForm(IPERunArgs input) { InitializeComponent(); args = input; pmx = args.Host.Connector.Pmx.GetCurrentState(); listBoxVMorph.Items.AddRange(pmx.Morph.Where(m => m.IsVertex).Select(m => m.Name).ToArray()); threshold = 1.0E-08f; textBoxThreshold.Text = threshold.ToString("E"); comboBoxParentBone.Items.AddRange(pmx.Bone.Select(b => b.Name).ToArray()); }
public void Export(IPXPmx pmx, string path, IPERunArgs args) { MetasequoiaObject mqo = new MetasequoiaObject(); mqo.MQX = new MetasequoiaXML(); mqo.Write(path); }
internal static void AddUVMorph(string morphName, int panel, IPXPmx baseModel, IPXPmx targetModel) { if (baseModel.Vertex.Count != targetModel.Vertex.Count) { throw new InvalidOperationException("頂点数が異なるため移動量を計算できません。"); } var diff = baseModel.Vertex.Zip(targetModel.Vertex, (b, t) => (Vertex: b, Offset: t.UV - b.UV)).Where(d => d.Offset.X > Delta || d.Offset.Y > Delta); var morph = CreateUVMorph(morphName, panel, diff); baseModel.Morph.Add(morph); }
public static ImportResult Success(IPXPmx pmx, int warningCount, int errorCount) { ImportResult result = new ImportResult { Result = ResultType.Success, Pmx = pmx, ErrorCount = errorCount, WarningCount = warningCount }; return(result); }
public static IEnumerable <IPXVertex> SelectorList(XmlNodeList list, IPXPmx pmx) { HashSet <IPXVertex> vertices = new HashSet <IPXVertex>(); foreach (XmlElement selector in list.OfType <XmlElement>()) { switch (selector.Name.ToLowerInvariant()) { case "material": case "object": switch (selector.GetAttribute("method").ToLowerInvariant()) { case "index": if (int.TryParse(selector.InnerText, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out int index)) { vertices.UnionWith(Vertex.FromMaterial(Material.ByIndex(index, pmx))); } break; case "note": vertices.UnionWith(Vertex.ByMaterialNote(selector.InnerText, pmx)); break; default: vertices.UnionWith(Vertex.ByMaterialName(selector.InnerText, pmx)); break; } break; case "bone": case "weight": switch (selector.GetAttribute("method").ToLowerInvariant()) { case "index": if (int.TryParse(selector.InnerText, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out int index)) { vertices.UnionWith(Vertex.FromBoneWeight(Bone.ByIndex(index, pmx), pmx)); } break; default: vertices.UnionWith(Vertex.FromBoneWeight(Bone.ByName(selector.InnerText, pmx).FirstOrDefault(), pmx)); break; } break; default: break; } } return(vertices); }
internal void CreateUVMorph(string morphName, int panel) { try { IPXPmx baseModel = Args.Host.Connector.Pmx.GetCurrentState(); UVMorphEditor.AddUVMorph(morphName, panel, baseModel, Pmx); PEPExtensions.Utility.Update(Args.Host.Connector, baseModel, PmxUpdateObject.Morph); } catch (Exception) { throw; } }
public CtrlForm(IPERunArgs args) { InitializeComponent(); this.args = args; pmx = this.args.Host.Connector.Pmx.GetCurrentState(); materialListBox.Items.AddRange(pmx.Material.Select(m => m.Name).ToArray()); comboBoxWeightBone.Items.AddRange(pmx.Bone.Select(b => b.Name).ToArray()); comboBoxWeightBone.SelectedIndex = 0; cDialog = new ColorDialog(); cDialog.Color = Color.Black; selectedColor.BackColor = cDialog.Color; }
private static void plugin_main( IPXPmx pmx, IPEViewConnector view, IPEFormConnector form) { StreamWriter writer = makeWriter(); using (writer) { makeIndexDict(pmx); makeBone2BodiesDict(pmx); BoneGraph g = makeBoneGraph(pmx); updateNodeAttrs(g); toDot(g, writer); } return; }
private void MainForm_Load(object sender, EventArgs e) { IPXPmx pmx = _args.Host.Connector.Pmx.GetCurrentState(); parentBoneSelect.Items.Clear(); parentBoneSelect.Items.Add("-1: (empty)"); parentBoneSelect.SelectedIndex = 0; for (int i = 0; i < pmx.Bone.Count; ++i) { parentBoneSelect.Items.Add(string.Format("{0}: {1} ({2})", i, pmx.Bone[i].Name, pmx.Bone[i].NameE)); } positionSelect.SelectedIndex = 0; autoCalcDistance.Checked = true; autoCalc_CheckedChanged(null, new EventArgs()); }
// pmx object -> index private static void makeIndexDict(IPXPmx pmx) { boneIndexDict = new Dictionary <IPXBone, int>(); bodyIndexDict = new Dictionary <IPXBody, int>(); for (int i = 0; i < pmx.Bone.Count; i++) { boneIndexDict[pmx.Bone[i]] = i; } for (int i = 0; i < pmx.Body.Count; i++) { bodyIndexDict[pmx.Body[i]] = i; } return; }
private void PopulateList(MorphKind kind) { _pmx = GetCurrentScene(); morphList.Items.Clear(); for (int i = 0; i < _pmx.Morph.Count; ++i) { IPXMorph morph = _pmx.Morph[i]; if (MorphIsOfKind(morph, kind)) { ListViewItem item = new ListViewItem(new string[] { morph.Name, morph.NameE }); item.Tag = i; morphList.Items.Add(item); } } }
public override void Run(IPERunArgs args) { try { IPEPluginHost host = args.Host; IPEConnector connect = host.Connector; IPEViewConnector view = host.Connector.View; IPEFormConnector form = host.Connector.Form; IPXPmx pmx = connect.Pmx.GetCurrentState(); plugin_main(pmx, view, form); connect.View.PMDView.UpdateView(); } catch (Exception ex) { MessageBox.Show( ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
public static IEnumerable <IPXBone> Selector(XmlElement selector, IPXPmx pmx) { switch (selector.GetAttribute("method").ToLowerInvariant()) { case "index": HashSet <IPXBone> bones = new HashSet <IPXBone>(); if (int.TryParse(selector.InnerText, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out int index)) { bones.Add(ByIndex(index, pmx)); } return(bones); default: return(ByName(selector.InnerText, pmx)); } }
private static void plugin_main( IPXPmx pmx, IPEViewConnector view, IPEFormConnector form) { StreamWriter writer = makeWriter(); using (writer) { int[] selectedBodies = view.PmxView.GetSelectedBodyIndices(); int[] selectedJoints = view.PmxView.GetSelectedJointIndices(); makeIndexDict(pmx); JointGraph g = makeJointGraph(pmx); NodeSet subNodes = new NodeSet(); NodeSet selectedNodes = new NodeSet(); // pmxvewの選択情報は選択解除しても残ってしまうので // form の情報で判断する if (form.SelectedJointIndex >= 0) { foreach (int i in selectedJoints) { Node jointNode = makeJointNode(pmx.Joint[i]); selectedNodes.Add(jointNode); subNodes.UnionWith( g.getConnectedNodes(jointNode)); } } if (form.SelectedBodyIndex >= 0) { foreach (int i in selectedBodies) { Node bodyNode = makeBodyNode(pmx.Body[i]); selectedNodes.Add(bodyNode); subNodes.UnionWith( g.getConnectedNodes(bodyNode)); } } if (selectedNodes.Count > 0) { toDot(g, writer, subNodes, selectedNodes); } else { toDot(g, writer); } return; } }
//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); } }
public void InitVariables(IPERunArgs args) { // 常用接続変数一括登録 // ホスト配下 host = args.Host; builder = host.Builder; bd = builder.SC; // 短絡系ビルダ bdx = builder.Pmx; // PMXビルダ connect = host.Connector; view = connect.View.PMDView; // PMX関連 pmx = connect.Pmx.GetCurrentState(); // PMX取得 header = pmx.Header; // header :ヘッダ info = pmx.ModelInfo; // info :モデル情報 vertex = pmx.Vertex; // vertex :頂点 | リスト material = pmx.Material; // material :材質 | リスト bone = pmx.Bone; // bone :ボーン | リスト morph = pmx.Morph; // morph :モーフ | リスト node = pmx.Node; // node :表示枠 | リスト body = pmx.Body; // body :剛体 | リスト joint = pmx.Joint; // joint :Joint | リスト }
public void RegistToPmx(IPXPmx pmx, IPXPmxBuilder bld, FileFormat.MQOFile mqo, WorkVertexDict dict, BackgroundWorker bw) { int N = list.Length; for (int i = 0; i < N; i++) { bw.ReportProgress(100 * i / N, "面の登録中"); list[i].ForEach(f => { var xf = bld.Face(); xf.Vertex1 = dict.GetVertex(f.V0); xf.Vertex2 = dict.GetVertex(f.V1); xf.Vertex3 = dict.GetVertex(f.V2); pmx.Material[i].Faces.Add(xf); }); } }
public void RegistToPmx(IPXPmx pmx, IPXPmxBuilder bld, FileFormat.MQOFile mqo, BackgroundWorker bw) { int N = dict.Count; for(int i=0; i<N; i++) { bw.ReportProgress(100 * i / N, "頂点の登録中"); var wv = dict[i]; IPXVertex v = bld.Vertex(); var mObj = mqo.Object[wv.ObjID]; var mv = mObj.Vertex[wv.VertID]; v.Position.X = (float)(mv.X); v.Position.Y = (float)(mv.Y); v.Position.Z = -(float)(mv.Z); FileFormat.MQOUV muv = mObj.UV[wv.UvID]; v.UV.U = (float)muv.U; v.UV.V = (float)muv.V; v.Normal.X = (float)mObj.Normal[wv.NormID].X; v.Normal.Y = (float)mObj.Normal[wv.NormID].Y; v.Normal.Z = -(float)mObj.Normal[wv.NormID].Z; wv.vertex = v; pmx.Vertex.Add(v); } }
// エントリポイント public override void Run(IPERunArgs args) { try { //PMD/PMXファイルを操作するためにおまじない。 this.host = args.Host; this.builder = this.host.Builder; this.bd = this.host.Builder.SC; this.connect = this.host.Connector; this.pex = this.connect.Pmd.GetCurrentStateEx(); this.PMD = this.connect.Pmd.GetCurrentState(); this.PMX = this.connect.Pmx.GetCurrentState(); this.Form = this.connect.Form; this.PMDView = this.connect.View.PMDView; //-----------------------------------------------------------ここから----------------------------------------------------------- //ここから処理開始 //-----------------------------------------------------------ここから----------------------------------------------------------- if (this.connect.Form.PmxFormActivate) { for (int i = 0; i < this.PMX.Vertex.Count; i++) { IPXVertex vertex = this.PMX.Vertex[i]; V3 vp = (V3)vertex.Position; int ind1, ind2; ind1 = ind2 = -1; float dis1, dis2; dis1 = dis2 = 10000000; for (int j = 0; j < this.PMX.Bone.Count; j++) { IPXBone bone = this.PMX.Bone[j]; V3 bp = (V3)bone.Position; float dis; if (bone.ToBone == null) continue; else dis = getDistanceBoneToVertex(bone, vertex); if (dis < dis1) { dis2 = dis1; ind2 = ind1; ind1 = j; dis1 = dis; } else if (dis < dis2) { dis2 = dis; ind2 = j; } } if (ind1 >= 0) { vertex.Bone1 = this.PMX.Bone[ind1]; vertex.Weight1 = 1.0f; } if (ind2 >= 0) { vertex.Bone2 = this.PMX.Bone[ind2]; #if MODE_EXCLUSIVE vertex.Weight2 = 0f; #else vertex.Weight2 = (1f * dis1 / (dis1 + dis2)); vertex.Weight1 = 1.0f - vertex.Weight2; #endif } } } else { for (int i = 0; i < this.PMD.Vertex.Count; i++) { IPEVertex vertex = this.PMD.Vertex[i]; V3 vp = (V3)vertex.Position; int ind1, ind2; ind1 = ind2 = -1; float dis1, dis2; dis1 = dis2 = 10000000; for (int j = 0; j < this.PMD.Bone.Count; j++) { IPEBone bone = this.PMD.Bone[j]; V3 bp = (V3)bone.Position; float dis; if (bone.To == -1 || bone.To == 0) continue; else dis = getDistanceBoneToVertex(bone, vertex); // float dis = (bp - vp).Length(); if (dis < dis1) { dis2 = dis1; ind2 = ind1; ind1 = j; dis1 = dis; } else if (dis < dis2) { dis2 = dis; ind2 = j; } } if (ind1 >= 0) vertex.Bone1 = ind1; if (ind2 >= 0) { vertex.Bone2 = ind2; #if MODE_EXCLUSIVE vertex.Weight = 100; #else vertex.Weight = (int)(100f * dis2 / (dis1 + dis2)); #endif } } } //-----------------------------------------------------------ここまで----------------------------------------------------------- //処理ここまで //-----------------------------------------------------------ここまで----------------------------------------------------------- //モデル・画面を更新します。 this.Update(); #if MODE_EXCLUSIVE MessageBox.Show(this.PMD.Vertex.Count.ToString() + "個の頂点のウェイトを最短排他形式で設定しました。", "ウェイト自動設定(排他的)", MessageBoxButtons.OK, MessageBoxIcon.Information); #else MessageBox.Show(this.PMX.Vertex.Count.ToString() + "個の頂点のウェイトを中間補完形式で設定しました。", "ウェイト自動設定(補完的)", MessageBoxButtons.OK, MessageBoxIcon.Information); #endif } catch (Exception ex) { MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }