コード例 #1
0
        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);
        }
コード例 #2
0
 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;
         }
     }
 }
コード例 #3
0
 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;
         }
     }
 }
コード例 #4
0
        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();
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
ファイル: RenderTools.cs プロジェクト: y4my4my4m/Smash-Forge
        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();
                }
            }
        }
コード例 #8
0
ファイル: MeleeRootNode.cs プロジェクト: nnn1590/Smash-Forge
        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));
            }
        }