Example #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="root"></param>
        /// <param name="nodes"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        private HSD_AnimJoint ToAnimJointRecursive(HSD_JOBJ root, AOBJ_Flags flags)
        {
            HSD_AnimJoint joint = new HSD_AnimJoint();

            joint.Flags = 1;

            AnimNode n = null;

            if (index >= Nodes.Count)
            {
                n = new AnimNode();
            }
            else
            {
                n = Nodes[index++];
            }

            if (n.Tracks.Count > 0)
            {
                joint.AOBJ       = new HSD_AOBJ();
                joint.AOBJ.Flags = flags;
            }
            foreach (var t in n.Tracks)
            {
                joint.AOBJ.EndFrame = Math.Max(joint.AOBJ.EndFrame, t.FrameCount);

                HSD_FOBJDesc fobj = new HSD_FOBJDesc();
                fobj.SetKeys(t.Keys, (byte)t.TrackType);

                if (joint.AOBJ.FObjDesc == null)
                {
                    joint.AOBJ.FObjDesc = fobj;
                }
                else
                {
                    joint.AOBJ.FObjDesc.Add(fobj);
                }
            }

            foreach (var c in root.Children)
            {
                joint.AddChild(ToAnimJointRecursive(c, flags));
            }

            return(joint);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="endValue"></param>
        /// <param name="startFrame"></param>
        /// <param name="endFrame"></param>
        /// <param name="trackType"></param>
        /// <returns></returns>
        public static void GenerateFOBJ(HSD_AOBJ aobj, float startValue, float endValue, float startFrame, float endFrame, JointTrackType trackType)
        {
            List <FOBJKey> keys = new List <FOBJKey>();

            if (startFrame != 0)
            {
                keys.Add(new FOBJKey()
                {
                    Frame = 0, Value = startValue, InterpolationType = GXInterpolationType.HSD_A_OP_CON
                });
            }

            keys.Add(new FOBJKey()
            {
                Frame = startFrame, Value = startValue, InterpolationType = GXInterpolationType.HSD_A_OP_LIN
            });

            keys.Add(new FOBJKey()
            {
                Frame = endFrame, Value = endValue, InterpolationType = GXInterpolationType.HSD_A_OP_CON
            });
            keys.Add(new FOBJKey()
            {
                Frame = 1600, Value = endValue, InterpolationType = GXInterpolationType.HSD_A_OP_CON
            });

            var fobj = new HSD_FOBJDesc();

            fobj.SetKeys(keys, (byte)trackType);

            if (aobj.FObjDesc == null)
            {
                aobj.FObjDesc = fobj;
            }
            else
            {
                aobj.FObjDesc.Add(fobj);
            }
        }
Example #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="bone"></param>
        /// <param name="joint"></param>
        /// <param name="animation"></param>
        private void EncodeAnimJoint(SBBone bone, HSD_AnimJoint joint, SBAnimation animation)
        {
            var node = animation.TransformNodes.Find(e => e.Name == bone.Name);

            if (node != null)
            {
                // encode tracks
                joint.Flags         = 1;
                joint.AOBJ          = new HSD_AOBJ();
                joint.AOBJ.EndFrame = animation.FrameCount;
                joint.AOBJ.Flags    = AOBJ_Flags.ANIM_LOOP;

                if (!HSDSettings.LoopAnimation)
                {
                    joint.AOBJ.Flags = AOBJ_Flags.FIRST_PLAY;
                }

                if (node.Tracks.Count == 0)
                {
                    joint.AOBJ.Flags = AOBJ_Flags.NO_ANIM;
                }

                var prev = new HSD_FOBJDesc();

                foreach (var track in node.Tracks)
                {
                    var fobjdesc = new HSD_FOBJDesc();
                    fobjdesc.FromFOBJ(EncodeFOBJ(track));
                    fobjdesc.DataLength = fobjdesc.ToFOBJ().Buffer.Length;

                    if (joint.AOBJ.FObjDesc == null)
                    {
                        joint.AOBJ.FObjDesc = fobjdesc;
                    }
                    else
                    {
                        prev.Next = fobjdesc;
                    }

                    prev = fobjdesc;
                }
            }

            // continue adding children
            var prevChild = new HSD_AnimJoint();

            foreach (var c in bone.Children)
            {
                HSD_AnimJoint child = new HSD_AnimJoint();
                EncodeAnimJoint(c, child, animation);
                if (joint.Child == null)
                {
                    joint.Child = child;
                }
                else
                {
                    prevChild.Next = child;
                }
                prevChild = child;
            }
        }
Example #4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="desc"></param>
 /// <param name="lines"></param>
 public static void ImportKeys(HSD_FOBJDesc desc, string[] lines)
 {
     desc.FromFOBJ(ImportKeys(desc.ToFOBJ(), lines));
 }
Example #5
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="desc"></param>
 /// <returns></returns>
 public static string ToString(HSD_FOBJDesc desc)
 {
     return(ToString(desc.ToFOBJ()));
 }