/// <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); } }
/// <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; } }
/// <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)); }
/// <summary> /// /// </summary> /// <param name="desc"></param> /// <returns></returns> public static string ToString(HSD_FOBJDesc desc) { return(ToString(desc.ToFOBJ())); }