private DatJOBJ GetJOBJFromIndex(DatJOBJ[] jobs, VBN ImportedBones, int ImportedIndex) { Bone b = ImportedBones.bones[ImportedIndex]; for (int i = 0; i < jobs.Length; i++) { if (b.Text.Equals("Bone_" + i)) { return(jobs[i]); } } if (jobs.Length > 0) { return(jobs[0]); } return(null); }
private void btnLoadVBN_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog()) { ofd.Filter = "Namco Bones (.vbn)|*.vbn"; if (ofd.ShowDialog() == DialogResult.OK) { vbnFilePath = ofd.FileName; vbn = new VBN(vbnFilePath); lbVBN.Text = vbnFilePath; } else { vbnFilePath = ""; vbn = null; lbVBN.Text = vbnFilePath; } } }
private void btnLoadVBN_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog()) { ofd.Filter = "Namco Bones (.vbn)|*.vbn"; if (ofd.ShowDialog() == DialogResult.OK) { VBNFile = ofd.FileName; VBN = new VBN(VBNFile); lbVBN.Text = VBNFile; } else { VBNFile = ""; VBN = null; lbVBN.Text = VBNFile; } } }
private void buttonImport_Click(object sender, EventArgs e) { Smd smd = new Smd(ModelSrc); DatJOBJ[] Bones = DOBJ.GetRoot().Root.GetJOBJinOrder(); VBN RenderBones = DOBJ.GetRoot().RenderBones; RenderBones.reset(); RenderBones.update(); VBN ImportedBones = smd.bones; GXAttribGroup AttrGroup = null; if (listBox1.SelectedIndex != -1) { AttrGroup = DOBJ.GetRoot().Root.Attributes[listBox1.SelectedIndex]; } else { MessageBox.Show("Please select an attribute group"); return; } DOBJ.ClearPolygons(null, null); int Flags = 0x8000; if (comboBoxBoneType.SelectedIndex == 0) { MessageBox.Show("Warning: no binds"); } if (comboBoxBoneType.SelectedIndex == 1) { Flags = 0xA001; } if (comboBoxBoneType.SelectedIndex == 2) // Rigged - needs to create bonelist { Flags = 0xA001; } DatPolygon p = new DatPolygon(); p.AttributeGroup = AttrGroup; p.Flags = Flags; p.ParentDOBJ = DOBJ.DOBJ; DOBJ.VertsToImport = new List <GXVertex[]>(); List <GXVertex> vert = new List <GXVertex>(); DatJOBJ parent = DOBJ.DOBJ.Parent; if (comboBoxBoneType.SelectedIndex == 1) { ImportedBones = RenderBones; } foreach (SmdTriangle t in smd.triangles) { if (comboBoxBoneType.SelectedIndex == 1) { // single bind t.v1.bones = new int[] { CBBone.SelectedIndex }; t.v1.weights = new float[] { 1 }; t.v2.bones = new int[] { CBBone.SelectedIndex }; t.v2.weights = new float[] { 1 }; t.v3.bones = new int[] { CBBone.SelectedIndex }; t.v3.weights = new float[] { 1 }; } List <DatBoneWeight> bwl1 = CreateWeightList(t.v1.bones, t.v1.weights, Bones, ImportedBones); List <DatBoneWeight> bwl2 = CreateWeightList(t.v2.bones, t.v2.weights, Bones, ImportedBones); List <DatBoneWeight> bwl3 = CreateWeightList(t.v3.bones, t.v3.weights, Bones, ImportedBones); int bid1 = GetWeightListIndex(p.BoneWeightList, bwl1); int bid2 = GetWeightListIndex(p.BoneWeightList, bwl2); int bid3 = GetWeightListIndex(p.BoneWeightList, bwl3); int wc = p.BoneWeightList.Count; if (bid1 == -1) { wc++; } if (bid2 == -1) { wc++; } if (bid3 == -1) { wc++; } if (wc >= 10) // need new polygon { DOBJ.VertsToImport.Add(vert.ToArray()); vert.Clear(); p = new DatPolygon(); p.AttributeGroup = AttrGroup; p.Flags = Flags; p.ParentDOBJ = DOBJ.DOBJ; } bid1 = GetWeightListIndex(p.BoneWeightList, bwl1); bid2 = GetWeightListIndex(p.BoneWeightList, bwl2); bid3 = GetWeightListIndex(p.BoneWeightList, bwl3); if (bid1 == -1) { p.BoneWeightList.Add(bwl1); } if (bid2 == -1) { p.BoneWeightList.Add(bwl2); } if (bid3 == -1) { p.BoneWeightList.Add(bwl3); } bid1 = GetWeightListIndex(p.BoneWeightList, bwl1); bid2 = GetWeightListIndex(p.BoneWeightList, bwl2); bid3 = GetWeightListIndex(p.BoneWeightList, bwl3); GXVertex v = SMDVertexToGXVertex(t.v1); v.PMXID = GetWeightListIndex(p.BoneWeightList, bwl1); RigVertex(ref v, RenderBones, p.BoneWeightList[v.PMXID / 3], Bones, parent); GXVertex v2 = SMDVertexToGXVertex(t.v2); v2.PMXID = GetWeightListIndex(p.BoneWeightList, CreateWeightList(t.v2.bones, t.v2.weights, Bones, ImportedBones)); RigVertex(ref v2, RenderBones, p.BoneWeightList[v2.PMXID / 3], Bones, parent); GXVertex v3 = SMDVertexToGXVertex(t.v3); v3.PMXID = GetWeightListIndex(p.BoneWeightList, CreateWeightList(t.v3.bones, t.v3.weights, Bones, ImportedBones)); RigVertex(ref v3, RenderBones, p.BoneWeightList[v3.PMXID / 3], Bones, parent); vert.Add(v); vert.Add(v2); vert.Add(v3); } DOBJ.VertsToImport.Add(vert.ToArray()); exitStatus = ExitStatus.Opened; Close(); }
private List <DatBoneWeight> CreateWeightList(int[] bid, float[] weight, DatJOBJ[] Bones, VBN ImportedBones) { List <DatBoneWeight> Weight = new List <DatBoneWeight>(); if (bid.Length != weight.Length) { return(Weight); } for (int i = 0; i < weight.Length; i++) { DatBoneWeight w = new DatBoneWeight(); w.jobj = GetJOBJFromIndex(Bones, ImportedBones, bid[i]); if (w.jobj == null) { throw new Exception("Can't be null"); } w.Weight = weight[i]; Weight.Add(w); } return(Weight); }
public void Import(object sender, EventArgs args) { VBN bonetree = Runtime.TargetVBN; if (bonetree == null) { MessageBox.Show("Select the model root first"); return; } Animation a = new Animation(Text); a.ReplaceAnimation(sender, args); List <Bone> bones = bonetree.getBoneTreeOrder(); DatAnimation.FrameCount = a.FrameCount; DatAnimation.Nodes.Clear(); foreach (Bone b in bones) { DatAnimationNode node = new DatAnimationNode(); string BoneName = b.Text; foreach (Animation.KeyNode n in a.Bones) { if (n.Text.Equals(BoneName)) { List <AnimationHelperTrack> tracks = new List <AnimationHelperTrack>(); if (n.XPOS.Keys.Count > 0) { tracks.Add(EncodeTrack(n.XPOS, AnimTrackType.XPOS)); } if (n.YPOS.Keys.Count > 0) { tracks.Add(EncodeTrack(n.YPOS, AnimTrackType.YPOS)); } if (n.ZPOS.Keys.Count > 0) { tracks.Add(EncodeTrack(n.ZPOS, AnimTrackType.ZPOS)); } if (n.XROT.Keys.Count > 0) { tracks.Add(EncodeTrack(n.XROT, AnimTrackType.XROT)); } if (n.YROT.Keys.Count > 0) { tracks.Add(EncodeTrack(n.YROT, AnimTrackType.YROT)); } if (n.ZROT.Keys.Count > 0) { tracks.Add(EncodeTrack(n.ZROT, AnimTrackType.ZROT)); } if (n.XSCA.Keys.Count > 0) { tracks.Add(EncodeTrack(n.XSCA, AnimTrackType.XSCA)); } if (n.YSCA.Keys.Count > 0) { tracks.Add(EncodeTrack(n.YSCA, AnimTrackType.YSCA)); } if (n.ZSCA.Keys.Count > 0) { tracks.Add(EncodeTrack(n.ZSCA, AnimTrackType.ZSCA)); } node = (AnimationKeyFrameHelper.EncodeKeyFrames(tracks.ToArray(), (int)a.FrameCount)); break; } } DatAnimation.Nodes.Add(node); } }
public static void DrawVBN(VBN vbn) { // Used for NUD, BFRES, BCH. float ToRad = (float)Math.PI / 180; int swinganim = 0; swinganim++; if (swinganim > 100) { swinganim = 0; } if (vbn != null) { Bone selectedBone = null; foreach (Bone bone in vbn.bones) { if (!bone.IsSelected) { bone.Draw(); } else { selectedBone = bone; } if (vbn.SwingBones != null && (Runtime.renderSwagY || Runtime.renderSwagZ)) { SB.SBEntry sb = null; vbn.SwingBones.TryGetEntry(bone.boneId, out sb); if (sb != null) { float sf = Math.Abs(((swinganim - 50) / 50f)); float sz = (sb.rz1 + (sb.rz2 - sb.rz1) * sf) * ToRad; float sy = (sb.ry1 + (sb.ry2 - sb.ry1) * sf) * ToRad; if (!Runtime.renderSwagY) { sy = 0; } if (!Runtime.renderSwagZ) { sz = 0; } bone.rot = VBN.FromEulerAngles(bone.rotation[2], bone.rotation[1], bone.rotation[0]) * VBN.FromEulerAngles(sz, sy, 0); } } } if (selectedBone != null) { GL.Clear(ClearBufferMask.DepthBufferBit); selectedBone.Draw(); } if (vbn.SwingBones != null && (Runtime.renderSwagY || Runtime.renderSwagZ)) { vbn.update(); } } }
public void RefreshDisplay() { Nodes.Clear(); Skeleton.Nodes.Clear(); DataObjects.Nodes.Clear(); MatAnims.Nodes.Clear(); JointAnims.Nodes.Clear(); // Stage Stuff if (Root.Map_Head != null) { foreach (Map_Model_Group g in Root.Map_Head.ModelObjects) { Nodes.Add(new MeleeMapModelNode(g)); } } // Bones-------------------------------------- if (Root.GetJOBJinOrder().Length > 0) { Nodes.Add(Skeleton); } int boneIndex = 0; RenderBones = new VBN(); List <DatJOBJ> JOBJS = new List <DatJOBJ>(); foreach (DatJOBJ j in Root.GetJOBJinOrder()) { Bone b = new Bone(RenderBones); b.Text = "Bone_" + (boneIndex); b.position = new float[] { j.TX, j.TY, j.TZ }; b.rotation = new float[] { j.RX, j.RY, j.RZ }; b.scale = new float[] { j.SX, j.SY, j.SZ }; if (j.Parent != null) { b.parentIndex = JOBJS.IndexOf(j.Parent); } JOBJS.Add(j); RenderBones.bones.Add(b); Skeleton.Nodes.Add(new MeleeJointNode(j) { Text = "Bone_" + boneIndex++, RenderBone = b }); } RenderBones.reset(); if (Root.GetDataObjects().Length > 0) { Nodes.Add(DataObjects); SelectedImageKey = "model"; ImageKey = "model"; } // Data Objects-------------------------------------- DatDOBJ[] dataObjects = Root.GetDataObjects(); for (int i = 0; i < dataObjects.Length; i++) { DatDOBJ d = dataObjects[i]; MeleeDataObjectNode n = new MeleeDataObjectNode(d) { Text = $"DataObject {i}" }; DataObjects.Nodes.Add(n); n.RefreshRendering(); n.BoneIndex = JOBJS.IndexOf(n.DOBJ.Parent); n.Checked = true; if (Parent is MeleeDataNode) { MeleeDataNode parentNode = (MeleeDataNode)Parent; if ((parentNode.LodModels.Count > 0) && !parentNode.LodModels.Contains((byte)(i))) { n.Checked = false; n.Text += "Low"; } } } // MaterialAnimation-------------------------------------- if (Root.MatAnims.Count > 0) { Nodes.Add(MatAnims); foreach (DatMatAnim anim in Root.MatAnims) { MatAnims.Nodes.Add(new MeleeMaterialAnimationNode(anim)); } } // Animation-------------------------------------- if (Root.Animations.Count > 0) { Nodes.Add(JointAnims); foreach (DatAnimation anim in Root.Animations) { JointAnims.Nodes.Add(new MeleeJointAnimationNode(anim)); } } // Scripts-------------------------------------- foreach (MeleeLib.DAT.Script.DatFighterData r in Root.FighterData) { Nodes.Add(new MeleeFighterDataNode(r)); } }