1
0
mirror of synced 2024-11-30 18:24:39 +01:00

Fix skeletal animation importing/exporting for wii u bfres,

This commit is contained in:
KillzXGaming 2018-12-10 19:52:58 -05:00
parent 86ccd5f023
commit e82d065255
9 changed files with 75 additions and 26 deletions

3
.gitignore vendored
View File

@ -3,6 +3,3 @@
*.resources *.resources
Debug/ Debug/
Release/ Release/
Switch_Toolbox/Lib/Syroot.NintenTools.Bfres.dll
Switch_Toolbox/Lib/Syroot.NintenTools.Bfres.pdb
Switch_Toolbox/Lib/Syroot.NintenTools.Bfres.xml

View File

@ -366,8 +366,8 @@ namespace FirstPlugin
Nodes.Add(fksaFolder); Nodes.Add(fksaFolder);
foreach (ResU.SkeletalAnim ska in resFile.SkeletalAnims.Values) foreach (ResU.SkeletalAnim ska in resFile.SkeletalAnims.Values)
{ {
BfresSkeletonAnim skeletonAnim = new BfresSkeletonAnim(ska.Name); FSKA skeletonAnim = new FSKA(ska.Name);
skeletonAnim.Read(ska, resFile); skeletonAnim.Read(ska);
fksaFolder.Nodes.Add(skeletonAnim); fksaFolder.Nodes.Add(skeletonAnim);
} }
} }
@ -377,8 +377,8 @@ namespace FirstPlugin
Nodes.Add(fksaFolder); Nodes.Add(fksaFolder);
foreach (SkeletalAnim ska in resFile.SkeletalAnims) foreach (SkeletalAnim ska in resFile.SkeletalAnims)
{ {
BfresSkeletonAnim skeletonAnim = new BfresSkeletonAnim(ska.Name); FSKA skeletonAnim = new FSKA(ska.Name);
skeletonAnim.Read(ska, resFile); skeletonAnim.Read(ska);
fksaFolder.Nodes.Add(skeletonAnim); fksaFolder.Nodes.Add(skeletonAnim);
} }
} }
@ -462,7 +462,7 @@ namespace FirstPlugin
} }
if (Nodes.ContainsKey("FSKA")) if (Nodes.ContainsKey("FSKA"))
{ {
foreach (BfresSkeletonAnim ska in Nodes["FSKA"].Nodes) foreach (FSKA ska in Nodes["FSKA"].Nodes)
resFile.SkeletalAnims.Add(ska.SkeletalAnim); resFile.SkeletalAnims.Add(ska.SkeletalAnim);
} }
if (Nodes.ContainsKey("FMAA")) if (Nodes.ContainsKey("FMAA"))
@ -495,7 +495,7 @@ namespace FirstPlugin
{ {
var resFileU = BFRESRender.ResFileNode.resFileU; var resFileU = BFRESRender.ResFileNode.resFileU;
resFileU.Models.Clear(); resFileU.Models.Clear();
// resFileU.SkeletalAnims.Clear(); resFileU.SkeletalAnims.Clear();
// resFileU.SceneAnims.Clear(); // resFileU.SceneAnims.Clear();
// resFileU.ShapeAnims.Clear(); // resFileU.ShapeAnims.Clear();
// resFileU.BoneVisibilityAnims.Clear(); // resFileU.BoneVisibilityAnims.Clear();
@ -516,6 +516,15 @@ namespace FirstPlugin
resFileU.Textures.Add(tex.Text, tex.texture); resFileU.Textures.Add(tex.Text, tex.texture);
} }
} }
if (Nodes.ContainsKey("FSKA"))
{
foreach (FSKA ska in Nodes["FSKA"].Nodes)
{
ska.SkeletalAnimU.Name = ska.Text;
resFileU.SkeletalAnims.Add(ska.Text, ska.SkeletalAnimU);
}
}
else else
throw new Exception("Failed to find textures"); throw new Exception("Failed to find textures");

View File

@ -37,10 +37,14 @@ namespace Bfres.Structs
if (sfd.ShowDialog() == DialogResult.OK) if (sfd.ShowDialog() == DialogResult.OK)
{ {
string folderPath = sfd.SelectedPath; string folderPath = sfd.SelectedPath;
foreach (BfresSkeletonAnim fska in Nodes) foreach (FSKA fska in Nodes)
{ {
string FileName = folderPath + '\\' + fska.Text + ".bfska"; string FileName = folderPath + '\\' + fska.Text + ".bfska";
((BfresSkeletonAnim)fska).SkeletalAnim.Export(FileName, fska.GetResFile());
if (fska.GetResFileU() != null)
((FSKA)fska).SkeletalAnimU.Export(FileName, fska.GetResFileU());
else
((FSKA)fska).SkeletalAnim.Export(FileName, fska.GetResFile());
} }
} }
} }
@ -54,7 +58,7 @@ namespace Bfres.Structs
} }
} }
public class BfresSkeletonAnim : Animation public class FSKA : Animation
{ {
public enum TrackType public enum TrackType
{ {
@ -71,7 +75,7 @@ namespace Bfres.Structs
public SkeletalAnim SkeletalAnim; public SkeletalAnim SkeletalAnim;
public ResU.SkeletalAnim SkeletalAnimU; public ResU.SkeletalAnim SkeletalAnimU;
public BfresSkeletonAnim() public FSKA()
{ {
ImageKey = "skeletonAnimation"; ImageKey = "skeletonAnimation";
SelectedImageKey = "skeletonAnimation"; SelectedImageKey = "skeletonAnimation";
@ -84,7 +88,7 @@ namespace Bfres.Structs
ContextMenu.MenuItems.Add(replace); ContextMenu.MenuItems.Add(replace);
replace.Click += Replace; replace.Click += Replace;
} }
public BfresSkeletonAnim(string name) public FSKA(string name)
{ {
Text = name; Text = name;
@ -120,7 +124,7 @@ namespace Bfres.Structs
{ {
if (GetResFileU() != null) if (GetResFileU() != null)
{ {
throw new Exception("Wii U unsupported!"); SkeletalAnimU.Export(sfd.FileName, GetResFileU());
} }
else else
{ {
@ -137,19 +141,24 @@ namespace Bfres.Structs
{ {
if (GetResFileU() != null) if (GetResFileU() != null)
{ {
throw new Exception("Wii U unsupported!"); SkeletalAnimU.Import(ofd.FileName, GetResFileU());
SkeletalAnimU.Name = Text;
Read(SkeletalAnimU);
} }
else else
{ {
SkeletalAnim.Import(ofd.FileName); SkeletalAnim.Import(ofd.FileName);
SkeletalAnim.Name = Text;
Read(SkeletalAnim);
} }
} }
SkeletalAnim.Name = Text;
} }
public static List<Animation> SkeletonAnimations = new List<Animation>(); public void Read(ResU.SkeletalAnim ska)
public void Read(ResU.SkeletalAnim ska, ResU.ResFile b)
{ {
Nodes.Clear();
Bones.Clear();
FrameCount = ska.FrameCount; FrameCount = ska.FrameCount;
SkeletalAnimU = ska; SkeletalAnimU = ska;
@ -220,8 +229,11 @@ namespace Bfres.Structs
} }
} }
} }
public void Read(SkeletalAnim ska, ResFile b) public void Read(SkeletalAnim ska)
{ {
Nodes.Clear();
Bones.Clear();
FrameCount = ska.FrameCount; FrameCount = ska.FrameCount;
SkeletalAnim = ska; SkeletalAnim = ska;
@ -311,8 +323,6 @@ namespace Bfres.Structs
public List<FSKATrack> tracks = new List<FSKATrack>(); public List<FSKATrack> tracks = new List<FSKATrack>();
public FSKANode(ResU.BoneAnim b) public FSKANode(ResU.BoneAnim b)
{ {
return;
Text = b.Name; Text = b.Name;
sca = new Vector3(b.BaseData.Scale.X, b.BaseData.Scale.Y, b.BaseData.Scale.Z); sca = new Vector3(b.BaseData.Scale.X, b.BaseData.Scale.Y, b.BaseData.Scale.Z);

View File

@ -338,7 +338,7 @@ namespace FirstPlugin
VertexBufferHelperAttrib attd = helper[attName]; VertexBufferHelperAttrib attd = helper[attName];
return attd.Data; return attd.Data;
} }
public static SkeletalAnim SetSkeletalAniamtion(BfresSkeletonAnim anim) public static SkeletalAnim SetSkeletalAniamtion(FSKA anim)
{ {
SkeletalAnim animation = new SkeletalAnim(); SkeletalAnim animation = new SkeletalAnim();
@ -359,7 +359,7 @@ namespace FirstPlugin
return animation; return animation;
} }
private static BoneAnim createBoneAnim(Animation.KeyNode bone, BfresSkeletonAnim anim) private static BoneAnim createBoneAnim(Animation.KeyNode bone, FSKA anim)
{ {
BoneAnim boneAnim = new BoneAnim(); BoneAnim boneAnim = new BoneAnim();
boneAnim.Name = bone.Name; boneAnim.Name = bone.Name;

View File

@ -2417,6 +2417,11 @@
Starts serializing the data from the <see cref="P:Syroot.NintenTools.Bfres.Core.ResFileSaver.Material"/> root. Starts serializing the data from the <see cref="P:Syroot.NintenTools.Bfres.Core.ResFileSaver.Material"/> root.
</summary> </summary>
</member> </member>
<member name="M:Syroot.NintenTools.Bfres.Core.ResFileSaver.ExportSkeletalAnimation">
<summary>
Starts serializing the data from the <see cref="P:Syroot.NintenTools.Bfres.Core.ResFileSaver.SkeletalAnim"/> root.
</summary>
</member>
<member name="M:Syroot.NintenTools.Bfres.Core.ResFileSaver.Execute"> <member name="M:Syroot.NintenTools.Bfres.Core.ResFileSaver.Execute">
<summary> <summary>
Starts serializing the data from the <see cref="P:Syroot.NintenTools.Bfres.Core.ResFileSaver.ResFile"/> root. Starts serializing the data from the <see cref="P:Syroot.NintenTools.Bfres.Core.ResFileSaver.ResFile"/> root.
@ -5316,6 +5321,34 @@
Gets or sets customly attached <see cref="P:Syroot.NintenTools.Bfres.SkeletalAnim.UserData"/> instances. Gets or sets customly attached <see cref="P:Syroot.NintenTools.Bfres.SkeletalAnim.UserData"/> instances.
</summary> </summary>
</member> </member>
<member name="M:Syroot.NintenTools.Bfres.SkeletalAnim.Import(System.IO.Stream,Syroot.NintenTools.Bfres.ResFile,System.Boolean)">
<summary>
Initializes a new instance of the <see cref="T:Syroot.NintenTools.Bfres.Material"/> class from the given <paramref name="stream"/> which
is optionally left open.
</summary>
<param name="stream">The <see cref="T:System.IO.Stream"/> to load the data from.</param>
<param name="leaveOpen"><c>true</c> to leave the stream open after reading, otherwise <c>false</c>.</param>
</member>
<member name="M:Syroot.NintenTools.Bfres.SkeletalAnim.Import(System.String,Syroot.NintenTools.Bfres.ResFile)">
<summary>
Initializes a new instance of the <see cref="T:Syroot.NintenTools.Bfres.ResFile"/> class from the file with the given
<paramref name="fileName"/>.
</summary>
<param name="fileName">The name of the file to load the data from.</param>
</member>
<member name="M:Syroot.NintenTools.Bfres.SkeletalAnim.Export(System.IO.Stream,Syroot.NintenTools.Bfres.ResFile,System.Boolean)">
<summary>
Saves the contents in the given <paramref name="stream"/> and optionally leaves it open
</summary>
<param name="stream">The <see cref="T:System.IO.Stream"/> to save the contents into.</param>
<param name="leaveOpen"><c>true</c> to leave the stream open after writing, otherwise <c>false</c>.</param>
</member>
<member name="M:Syroot.NintenTools.Bfres.SkeletalAnim.Export(System.String,Syroot.NintenTools.Bfres.ResFile)">
<summary>
Saves the contents in the file with the given <paramref name="fileName"/>.
</summary>
<param name="fileName">The name of the file to save the contents into.</param>
</member>
<member name="T:Syroot.NintenTools.Bfres.SkeletalAnimFlags"> <member name="T:Syroot.NintenTools.Bfres.SkeletalAnimFlags">
<summary> <summary>
Represents flags specifying how animation data is stored or should be played. Represents flags specifying how animation data is stored or should be played.

Binary file not shown.

View File

@ -16,7 +16,7 @@ namespace Switch_Toolbox.Library
public virtual void OnMouseRightClick(TreeView treeview) { } public virtual void OnMouseRightClick(TreeView treeview) { }
public virtual void OnDoubleMouseClick(TreeView treeview) { } public virtual void OnDoubleMouseClick(TreeView treeview) { }
public void Sort(TreeNode node) public void SortNodes(TreeNode node)
{ {
/* string[] array = new string[Nodes.Count]; /* string[] array = new string[Nodes.Count];
for (int i = 0; i < Nodes.Count; ++i) for (int i = 0; i < Nodes.Count; ++i)
@ -29,7 +29,7 @@ namespace Switch_Toolbox.Library
//Good enough for now. I'll update with a more cleaner method later //Good enough for now. I'll update with a more cleaner method later
foreach (TreeNode n in node.Nodes) foreach (TreeNode n in node.Nodes)
Sort(n); SortNodes(n);
try try
{ {
TreeNode temp = null; TreeNode temp = null;