/// <summary> /// /// </summary> public static void LoadFromMEXNode(MEX_mexSelectChr mex, MEX_CSSIconEntry[] icons) { var csps = mex.CSPMatAnim.TextureAnimation.ToTOBJs(); var cspKeys = mex.CSPMatAnim.TextureAnimation.AnimationObject.FObjDesc.GetDecodedKeys(); var stride = mex.CSPStride; var index = 0; foreach (var ico in icons) { // load joints if (index < mex.IconModel.Children.Length) { ico.Joint = mex.IconModel.Children[index]; ico.Animation = MexMenuAnimationGenerator.FromAnimJoint(mex.IconAnimJoint.Children[index], ico.Joint); ico.MatAnimJoint = mex.IconMatAnimJoint.Children[index]; } // load csps var icocsps = new List <HSD_TOBJ>(); int cspIndex = 0; while (true) { var key = ico.FighterExternalID + (cspIndex * stride); var k = cspKeys.Find(e => e.Frame == key); if (k == null) { break; } icocsps.Add(csps[(int)k.Value]); cspIndex++; } ico.CSPs = icocsps.Select(e => new TOBJProxy(e)).ToArray(); index++; } }
/// <summary> /// /// </summary> public static void SetMexNode(MEX_mexSelectChr mex, MEX_CSSIconEntry[] icons) { var posModel = GenerateIconModel(icons); mex.IconModel = posModel.Item1; mex.IconAnimJoint = posModel.Item2; mex.IconMatAnimJoint = posModel.Item3; // generate csp node var stride = MEXConverter.FighterIDCount; List <FOBJKey> keys = new List <FOBJKey>(); List <HSD_TOBJ> tobjs = new List <HSD_TOBJ>(); foreach (var v in icons) { for (int i = 0; i < v.CSPs.Length; i++) { var id = v.FighterExternalID; keys.Add(new FOBJKey() { Frame = stride * i + id, Value = tobjs.Count, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); tobjs.Add(v.CSPs[i].TOBJ); } } keys = keys.OrderBy(e => e.Frame).ToList(); HSD_MatAnim anim = new HSD_MatAnim(); anim.TextureAnimation = new HSD_TexAnim(); anim.TextureAnimation.FromTOBJs(tobjs, false); anim.TextureAnimation.AnimationObject = new HSD_AOBJ(); anim.TextureAnimation.AnimationObject.EndFrame = 1200; anim.TextureAnimation.AnimationObject.FObjDesc = new HSD_FOBJDesc(); anim.TextureAnimation.AnimationObject.FObjDesc.SetKeys(keys, (byte)TexTrackType.HSD_A_T_TIMG); anim.TextureAnimation.AnimationObject.FObjDesc.Next = new HSD_FOBJDesc(); anim.TextureAnimation.AnimationObject.FObjDesc.Next.SetKeys(keys, (byte)TexTrackType.HSD_A_T_TCLT); mex.CSPMatAnim = anim; mex.CSPStride = stride; }
/// <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="table"></param> /// <param name="icons"></param> /// <returns></returns> public static MEX_mexSelectChr GenerateMEXMapFromVanilla(SBM_SelectChrDataTable table, MEX_CSSIconEntry[] icons) { // 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); var icon_matanim_joint = HSDAccessor.DeepClone <HSD_MatAnimJoint>(table.MenuMaterialAnimation.Children[2].Child); icon_matanim_joint.Next = null; // generate mat anim node var joints = table.MenuModel.BreathFirstList; HSD_TOBJ[] tobjs = new HSD_TOBJ[icons.Max(e => e.FighterExternalID) + 1]; JOBJManager m = new JOBJManager(); m.SetJOBJ(table.MenuModel); m.SetAnimJoint(table.MenuAnimation); m.Frame = 600; m.UpdateNoRender(); var csps = table.MenuMaterialAnimation.Children[6].Child.MaterialAnimation.TextureAnimation.ToTOBJs(); var cspKeys = table.MenuMaterialAnimation.Children[6].Child.MaterialAnimation.TextureAnimation.AnimationObject.FObjDesc.GetDecodedKeys(); var stride = 30; foreach (var ico in icons) { if (joints[ico.icon.JointID].Dobj == null) { continue; } HSD_JOBJ pos = HSDAccessor.DeepClone <HSD_JOBJ>(icon_joint); pos.Dobj.Pobj.Attributes = icon_joint.Dobj.Pobj.Attributes; pos.Dobj.Next.Pobj.Attributes = icon_joint.Dobj.Pobj.Attributes; pos.Dobj.Next.Mobj.Textures = HSDAccessor.DeepClone <HSD_TOBJ>(joints[ico.icon.JointID].Dobj.Next.Mobj.Textures); var worldPosition = Vector3.TransformPosition(Vector3.Zero, m.GetWorldTransform(ico.icon.JointID)); pos.TX = worldPosition.X + center.X; pos.TY = worldPosition.Y + center.Y; pos.TZ = worldPosition.Z + center.Z; ico.Joint = pos; ico.Animation = new MexMenuAnimation(); ico.MatAnimJoint = HSDAccessor.DeepClone <HSD_MatAnimJoint>(icon_matanim_joint); // load csps // find key at stride var icocsps = new List <HSD_TOBJ>(); int cspIndex = 0; while (true) { var key = ico.FighterExternalID + (cspIndex * stride); if (ico.FighterExternalID > 0x13) { key = ico.FighterExternalID + (cspIndex * stride) - 1; } var k = cspKeys.Find(e => e.Frame == key); if (k == null) { break; } icocsps.Add(csps[(int)k.Value]); cspIndex++; } ico.CSPs = icocsps.Select(e => new TOBJProxy() { TOBJ = e }).ToArray(); } m.RefreshRendering = true; MEX_mexSelectChr mex = new MEX_mexSelectChr(); SetMexNode(mex, icons); return(mex); }