/// <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++]; } // set flags if (n.Tracks.Count > 0) { joint.AOBJ = new HSD_AOBJ(); joint.AOBJ.Flags = flags; } // add all tracks foreach (var t in n.Tracks) { joint.AOBJ.EndFrame = Math.Max(joint.AOBJ.EndFrame, t.FrameCount); HSD_FOBJDesc fobj = t.ToFobjDesc(); if (joint.AOBJ.FObjDesc == null) { joint.AOBJ.FObjDesc = fobj; } else { joint.AOBJ.FObjDesc.Add(fobj); } } // set particle flag if (n.Tracks.Any(e => e.JointTrackType == JointTrackType.HSD_A_J_PTCL)) { joint.AOBJ.EndFrame += 0.1f; } foreach (var c in root.Children) { joint.AddChild(ToAnimJointRecursive(c, flags)); } return(joint); }
/// <summary> /// /// </summary> /// <param name="node"></param> /// <returns></returns> public static HSD_AnimJoint GenerateAnimJointFromJOBJ(HSD_JOBJ node) { HSD_AnimJoint joint = new HSD_AnimJoint(); foreach (var v in node.Children) { joint.AddChild(GenerateAnimJointFromJOBJ(v)); } return(joint); }
/// <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="icons"></param> /// <returns></returns> public static Tuple <HSD_JOBJ, HSD_AnimJoint, HSD_MatAnimJoint> GenerateIconModel(MEX_CSSIconEntry[] icons) { HSD_JOBJ position_joint = new HSD_JOBJ(); position_joint.Flags = JOBJ_FLAG.CLASSICAL_SCALING | JOBJ_FLAG.ROOT_XLU; position_joint.SX = 1; position_joint.SY = 1; position_joint.SZ = 1; HSD_AnimJoint anim_joint = new HSD_AnimJoint(); HSD_MatAnimJoint matanim_joint = new HSD_MatAnimJoint(); foreach (var ico in icons) { ico.Joint.Next = null; ico.AnimJoint.Next = null; ico.MatAnimJoint.Next = null; position_joint.AddChild(ico.Joint); anim_joint.AddChild(ico.AnimJoint); matanim_joint.AddChild(ico.MatAnimJoint); } return(new Tuple <HSD_JOBJ, HSD_AnimJoint, HSD_MatAnimJoint>(position_joint, anim_joint, matanim_joint)); }
/// <summary> /// /// </summary> /// <param name="stage"></param> /// <param name="icons"></param> public static MEX_mexMapData GenerateMexMap(SBM_MnSelectStageDataTable stage, IEnumerable <MEXStageIconEntry> icons) { MEX_mexMapData mapData = new MEX_mexMapData(); var nameTexAnim = new HSD_TexAnim(); var nameKeys = new List <FOBJKey>(); var iconTexAnim = new HSD_TexAnim(); var iconKeys = new List <FOBJKey>(); HSD_JOBJ root = new HSD_JOBJ() { SX = 1, SY = 1, SZ = 1, Flags = JOBJ_FLAG.CLASSICAL_SCALING }; HSD_AnimJoint animRoot = new HSD_AnimJoint(); // extra { var tobjs = stage.IconLargeMatAnimJoint.Child.MaterialAnimation.Next.TextureAnimation.ToTOBJs(); var index = iconTexAnim.AddImage(tobjs[0]); iconKeys.Add(new FOBJKey() { Frame = index, Value = index, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); index = iconTexAnim.AddImage(tobjs[1]); iconKeys.Add(new FOBJKey() { Frame = index, Value = index, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); } foreach (var v in icons) { var index = iconTexAnim.AddImage(v.IconTOBJ); if (index == -1) { index = 0; } iconKeys.Add(new FOBJKey() { Frame = index, Value = index, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); index = nameTexAnim.AddImage(v.NameTOBJ); if (index == -1) { index = 0; } nameKeys.Add(new FOBJKey() { Frame = index, Value = index, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); v.Joint.Next = null; v.Joint.Child = null; v.AnimJoint.Next = null; v.AnimJoint.Child = null; root.AddChild(v.Joint); animRoot.AddChild(v.AnimJoint); } iconKeys.Add(new FOBJKey() { Frame = 1600, Value = 0, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); iconTexAnim.GXTexMapID = HSDRaw.GX.GXTexMapID.GX_TEXMAP0; iconTexAnim.AnimationObject = new HSD_AOBJ(); iconTexAnim.AnimationObject.EndFrame = 1600; iconTexAnim.AnimationObject.FObjDesc = new HSD_FOBJDesc(); iconTexAnim.AnimationObject.FObjDesc.SetKeys(iconKeys, (byte)TexTrackType.HSD_A_T_TIMG); iconTexAnim.AnimationObject.FObjDesc.Next = new HSD_FOBJDesc(); iconTexAnim.AnimationObject.FObjDesc.Next.SetKeys(iconKeys, (byte)TexTrackType.HSD_A_T_TCLT); var iconJOBJ = HSDAccessor.DeepClone <HSD_JOBJ>(stage.IconDoubleModel); iconJOBJ.Child = iconJOBJ.Child.Next; var iconAnimJoint = HSDAccessor.DeepClone <HSD_AnimJoint>(stage.IconDoubleAnimJoint); iconAnimJoint.Child = iconAnimJoint.Child.Next; var iconMatAnimJoint = HSDAccessor.DeepClone <HSD_MatAnimJoint>(stage.IconDoubleMatAnimJoint); iconMatAnimJoint.Child = iconMatAnimJoint.Child.Next; iconMatAnimJoint.Child.MaterialAnimation.Next.TextureAnimation = iconTexAnim; var iconNameAnim = HSDAccessor.DeepClone <HSD_MatAnimJoint>(stage.StageNameMatAnimJoint); nameTexAnim.AnimationObject = new HSD_AOBJ(); nameTexAnim.AnimationObject.EndFrame = 1600; nameTexAnim.AnimationObject.FObjDesc = new HSD_FOBJDesc(); nameTexAnim.AnimationObject.FObjDesc.SetKeys(nameKeys, (byte)TexTrackType.HSD_A_T_TIMG); iconNameAnim.Child.Child.MaterialAnimation.TextureAnimation = nameTexAnim; mapData.IconModel = iconJOBJ; mapData.IconAnimJoint = iconAnimJoint; mapData.IconMatAnimJoint = iconMatAnimJoint; mapData.PositionModel = root; mapData.PositionAnimJoint = animRoot; mapData.StageNameMaterialAnimation = iconNameAnim; return(mapData); }
/// <summary> /// /// </summary> /// <param name="table"></param> /// <param name="icons"></param> /// <returns></returns> private static MEX_mexSelectChr GenerateMexSelectChrSymbol(SBM_SelectChrDataTable table, MEX_CSSIcon[] cssIcons) { // create mexSelectChr struct MEX_mexSelectChr mex = new MEX_mexSelectChr(); // generate icon model var icon_joint = HSDAccessor.DeepClone <HSD_JOBJ>(table.MenuModel.Children[2].Child); icon_joint.TX = 0; icon_joint.TY = 0; icon_joint.TZ = 0; icon_joint.Next = null; var center = RegenerateIcon(icon_joint); // generate material_anim_joint var icon_matanim_joint = HSDAccessor.DeepClone <HSD_MatAnimJoint>(table.MenuMaterialAnimation.Children[2].Child); icon_matanim_joint.Next = null; // general base models HSD_JOBJ position_joint = new HSD_JOBJ(); position_joint.Flags = JOBJ_FLAG.CLASSICAL_SCALING | JOBJ_FLAG.ROOT_XLU; position_joint.SX = 1; position_joint.SY = 1; position_joint.SZ = 1; HSD_AnimJoint anim_joint = new HSD_AnimJoint(); HSD_MatAnimJoint matanim_joint = new HSD_MatAnimJoint(); // create icon data var joints = table.MenuModel.BreathFirstList; var matanims = table.MenuAnimation.BreathFirstList; foreach (var ico in cssIcons) { if (joints[ico.JointID].Dobj == null) { continue; } HSD_JOBJ joint = HSDAccessor.DeepClone <HSD_JOBJ>(icon_joint); joint.Dobj.Pobj.Attributes = icon_joint.Dobj.Pobj.Attributes; joint.Dobj.Next.Pobj.Attributes = icon_joint.Dobj.Pobj.Attributes; joint.Dobj.Next.Mobj.Textures = HSDAccessor.DeepClone <HSD_TOBJ>(joints[ico.JointID].Dobj.Next.Mobj.Textures); var worldPosition = new GXVector3(joints[ico.JointID].TX, joints[ico.JointID].TY, joints[ico.JointID].TZ); // get anim var anim = matanims[ico.JointID].AOBJ; // if it's a clone get parent location if (ico.JointID < 15) { worldPosition = new GXVector3(joints[ico.JointID - 1].TX, joints[ico.JointID - 1].TY, joints[ico.JointID - 1].TZ); anim = matanims[ico.JointID - 1].AOBJ; } // check animation for world position if (anim != null) { foreach (var v in anim.FObjDesc.List) { System.Diagnostics.Debug.WriteLine(v.JointTrackType); if (v.JointTrackType == JointTrackType.HSD_A_J_TRAX) { var keys = v.GetDecodedKeys(); worldPosition.X = keys[keys.Count - 1].Value; } } } joint.TX = worldPosition.X + center.X; joint.TY = worldPosition.Y + center.Y; joint.TZ = worldPosition.Z + center.Z; position_joint.AddChild(joint); anim_joint.AddChild(new HSD_AnimJoint()); matanim_joint.AddChild(HSDAccessor.DeepClone <HSD_MatAnimJoint>(icon_matanim_joint)); } mex.IconModel = position_joint; mex.IconAnimJoint = anim_joint; mex.IconMatAnimJoint = matanim_joint; mex.CSPMatAnim = HSDAccessor.DeepClone <HSD_MatAnim>(table.MenuMaterialAnimation.Children[6].Child.MaterialAnimation); var cspkeys = mex.CSPMatAnim.TextureAnimation.AnimationObject.FObjDesc.GetDecodedKeys(); foreach (var k in cspkeys) { if ((k.Frame % 30) >= 19) { k.Frame++; } } mex.CSPMatAnim.TextureAnimation.AnimationObject.FObjDesc.SetKeys(cspkeys, (byte)TexTrackType.HSD_A_T_TIMG); mex.CSPMatAnim.TextureAnimation.AnimationObject.FObjDesc.Next.SetKeys(cspkeys, (byte)TexTrackType.HSD_A_T_TCLT); mex.CSPStride = 30; return(mex); }
/// <summary> /// /// </summary> /// <param name="stage"></param> /// <returns></returns> public static MEX_mexMapData LoadIconDataFromVanilla(SBM_MnSelectStageDataTable stage) { List <HSD_TOBJ> nameTags = new List <HSD_TOBJ>(); List <HSD_TOBJ> iconTOBJs = new List <HSD_TOBJ>(); HSD_JOBJ root = new HSD_JOBJ() { SX = 1, SY = 1, SZ = 1, Flags = JOBJ_FLAG.CLASSICAL_SCALING }; HSD_AnimJoint animRoot = new HSD_AnimJoint(); var tex0 = stage.IconDoubleMatAnimJoint.Child.Next.MaterialAnimation.Next.TextureAnimation.ToTOBJs(); var tex0_extra = stage.IconDoubleMatAnimJoint.Child.MaterialAnimation.Next.TextureAnimation.ToTOBJs(); var tex1 = stage.IconLargeMatAnimJoint.Child.MaterialAnimation.Next.TextureAnimation.ToTOBJs(); var tex2 = stage.IconSpecialMatAnimJoint.Child.MaterialAnimation.Next.TextureAnimation.ToTOBJs(); var nameTOBJs = stage.StageNameMatAnimJoint.Child.Child.MaterialAnimation.TextureAnimation.ToTOBJs(); var nameTOBJsAnim = stage.StageNameMatAnimJoint.Child.Child.MaterialAnimation.TextureAnimation.AnimationObject.FObjDesc.GetDecodedKeys(); var positionAnimation = new List <HSD_AnimJoint>(); foreach (var c in stage.PositionAnimation.Children) { var pos = new HSD_AnimJoint(); pos.AOBJ = HSDAccessor.DeepClone <HSD_AOBJ>(c.AOBJ); positionAnimation.Add(pos); } var g1 = tex0.Length - 2; var g2 = tex0.Length - 2 + tex1.Length - 2; var g3 = tex0.Length - 2 + tex1.Length - 2 + tex2.Length - 2; for (int i = 0; i < stage.PositionModel.Children.Length; i++) { var childIndex = i; if (unswizzle.ContainsKey(i)) { childIndex = unswizzle[i]; } HSD_TOBJ icon = null; HSD_TOBJ name = null; var keys = positionAnimation[childIndex].AOBJ.FObjDesc.GetDecodedKeys(); var Y = stage.PositionModel.Children[childIndex].TY; var Z = stage.PositionModel.Children[childIndex].TZ; var SX = 1f; var SY = 1f; if (i >= g3) { //RandomIcon name = nameTOBJs[(int)nameTOBJsAnim[nameTOBJsAnim.Count - 1].Value]; } else if (i >= g2) { name = nameTOBJs[(int)nameTOBJsAnim[24 + (i - g2)].Value]; icon = tex2[i - g2 + 2]; SX = 0.8f; SY = 0.8f; } else if (i >= g1) { name = nameTOBJs[(int)nameTOBJsAnim[22 + texunswizzle[i - g1]].Value]; icon = tex1[i - g1 + 2]; SY = 1.1f; } else { icon = tex0[texunswizzle[i] + 2]; name = nameTOBJs[(int)nameTOBJsAnim[texunswizzle[i]].Value * 2]; root.AddChild(new HSD_JOBJ() { TX = keys[keys.Count - 1].Value, TY = Y, TZ = Z, SX = SX, SY = SY, SZ = 1, Flags = JOBJ_FLAG.CLASSICAL_SCALING }); iconTOBJs.Add(icon); nameTags.Add(name); animRoot.AddChild(HSDAccessor.DeepClone <HSD_AnimJoint>(positionAnimation[childIndex])); Y -= 5.6f; Z = 0; icon = tex0_extra[texunswizzle[i] + 2]; name = nameTOBJs[(int)nameTOBJsAnim[texunswizzle[i]].Value * 2 + 1]; } root.AddChild(new HSD_JOBJ() { TX = keys[keys.Count - 1].Value, TY = Y, TZ = Z, SX = SX, SY = SY, SZ = 1, Flags = JOBJ_FLAG.CLASSICAL_SCALING }); iconTOBJs.Add(icon); nameTags.Add(name); animRoot.AddChild(HSDAccessor.DeepClone <HSD_AnimJoint>(positionAnimation[childIndex])); } var extraIcons = stage.IconLargeMatAnimJoint.Child.MaterialAnimation.Next.TextureAnimation.ToTOBJs(); iconTOBJs.Insert(0, extraIcons[0]); iconTOBJs.Insert(0, extraIcons[1]); iconTOBJs.Add(extraIcons[0]); var iconJOBJ = HSDAccessor.DeepClone <HSD_JOBJ>(stage.IconDoubleModel); iconJOBJ.Child = iconJOBJ.Child.Next; var iconAnimJoint = HSDAccessor.DeepClone <HSD_AnimJoint>(stage.IconDoubleAnimJoint); iconAnimJoint.Child = iconAnimJoint.Child.Next; var iconMatAnimJoint = HSDAccessor.DeepClone <HSD_MatAnimJoint>(stage.IconDoubleMatAnimJoint); iconMatAnimJoint.Child = iconMatAnimJoint.Child.Next; iconMatAnimJoint.Child.MaterialAnimation.Next.TextureAnimation.FromTOBJs(iconTOBJs.ToArray(), true); var mapdata = new MEX_mexMapData(); mapdata.IconModel = iconJOBJ; mapdata.IconAnimJoint = iconAnimJoint; mapdata.IconMatAnimJoint = iconMatAnimJoint; mapdata.PositionModel = root; mapdata.PositionAnimJoint = animRoot; mapdata.StageNameMaterialAnimation = HSDAccessor.DeepClone <HSD_MatAnimJoint>(stage.StageNameMatAnimJoint); mapdata.StageNameMaterialAnimation.Child.Child.MaterialAnimation.TextureAnimation.FromTOBJs(nameTags, true); return(mapdata); }