Another bone fix
This commit is contained in:
parent
f5e7996bd3
commit
5682def8b7
Binary file not shown.
@ -57,6 +57,9 @@ namespace FirstPlugin
|
|||||||
|
|
||||||
private DirectoryEntry[] Directories;
|
private DirectoryEntry[] Directories;
|
||||||
|
|
||||||
|
private uint HeaderSize = 32;
|
||||||
|
private uint Unknown = 256;
|
||||||
|
|
||||||
public void Load(System.IO.Stream stream)
|
public void Load(System.IO.Stream stream)
|
||||||
{
|
{
|
||||||
using (var reader = new FileReader(stream))
|
using (var reader = new FileReader(stream))
|
||||||
@ -64,7 +67,7 @@ namespace FirstPlugin
|
|||||||
reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
|
reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
|
||||||
reader.ReadSignature(4, "RARC");
|
reader.ReadSignature(4, "RARC");
|
||||||
uint FileSize = reader.ReadUInt32();
|
uint FileSize = reader.ReadUInt32();
|
||||||
uint HeaderSize = reader.ReadUInt32();
|
HeaderSize = reader.ReadUInt32();
|
||||||
uint DataOffset = reader.ReadUInt32();
|
uint DataOffset = reader.ReadUInt32();
|
||||||
uint FileDataSize = reader.ReadUInt32();
|
uint FileDataSize = reader.ReadUInt32();
|
||||||
uint EndOfFileOffset = reader.ReadUInt32();
|
uint EndOfFileOffset = reader.ReadUInt32();
|
||||||
@ -81,7 +84,7 @@ namespace FirstPlugin
|
|||||||
uint StringTableSize = reader.ReadUInt32();
|
uint StringTableSize = reader.ReadUInt32();
|
||||||
uint StringTablOffset = reader.ReadUInt32() + (uint)pos;
|
uint StringTablOffset = reader.ReadUInt32() + (uint)pos;
|
||||||
ushort NodeCount = reader.ReadUInt16();
|
ushort NodeCount = reader.ReadUInt16();
|
||||||
ushort Unknown = reader.ReadUInt16();
|
Unknown = reader.ReadUInt16();
|
||||||
byte[] Padding2 = reader.ReadBytes(4);
|
byte[] Padding2 = reader.ReadBytes(4);
|
||||||
|
|
||||||
Directories = new DirectoryEntry[DirectoryCount];
|
Directories = new DirectoryEntry[DirectoryCount];
|
||||||
@ -129,6 +132,121 @@ namespace FirstPlugin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int GetTotalCount()
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
foreach (var dir in Directories)
|
||||||
|
GetTotalCount(dir, count);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetFileCount()
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
foreach (var dir in Directories)
|
||||||
|
GetFileCount(dir, count);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetDirectoryCount()
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
foreach (var dir in Directories)
|
||||||
|
GetDirectoryCount(dir, count);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetTotalCount(INode node, int count)
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
|
||||||
|
foreach (var c in ((DirectoryEntry)node).nodes)
|
||||||
|
return GetDirectoryCount(c, count);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private int GetFileCount(INode node, int count)
|
||||||
|
{
|
||||||
|
if (node is FileEntry)
|
||||||
|
count++;
|
||||||
|
|
||||||
|
foreach (var c in ((DirectoryEntry)node).nodes)
|
||||||
|
return GetDirectoryCount(c, count);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetDirectoryCount(INode node, int count)
|
||||||
|
{
|
||||||
|
if (node is DirectoryEntry)
|
||||||
|
count++;
|
||||||
|
|
||||||
|
foreach (var c in ((DirectoryEntry)node).nodes)
|
||||||
|
return GetDirectoryCount(c, count);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveFile(FileWriter writer)
|
||||||
|
{
|
||||||
|
long pos = writer.Position;
|
||||||
|
|
||||||
|
writer.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
|
||||||
|
writer.WriteSignature("RARC");
|
||||||
|
writer.Write(uint.MaxValue); //FileSize
|
||||||
|
writer.Write(HeaderSize);
|
||||||
|
writer.Write(uint.MaxValue); //DataOffset
|
||||||
|
writer.Write(uint.MaxValue); //End of file
|
||||||
|
writer.Seek(8); //padding
|
||||||
|
|
||||||
|
writer.SeekBegin(HeaderSize);
|
||||||
|
long InfoPos = writer.Position;
|
||||||
|
|
||||||
|
writer.Write(GetDirectoryCount());
|
||||||
|
writer.Write(uint.MaxValue); //DirectoryOffset
|
||||||
|
writer.Write(GetFileCount());
|
||||||
|
writer.Write(uint.MaxValue); //File Node Offset
|
||||||
|
writer.Write(uint.MaxValue); //String pool size
|
||||||
|
writer.Write(uint.MaxValue); //String pool offset
|
||||||
|
writer.Write((ushort)GetFileCount());
|
||||||
|
writer.Write((ushort)Unknown);
|
||||||
|
writer.Write(0); //padding
|
||||||
|
|
||||||
|
//Write directory Offset
|
||||||
|
WriteOffset(writer, 0x4, InfoPos);
|
||||||
|
for (int dir = 0; dir < Directories.Length; dir++)
|
||||||
|
{
|
||||||
|
Directories[dir].Write(writer);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int dir = 0; dir < Directories.Length; dir++)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//Write file size
|
||||||
|
using (writer.TemporarySeek(pos + 0x4, System.IO.SeekOrigin.Begin))
|
||||||
|
{
|
||||||
|
writer.Write((uint)writer.BaseStream.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WriteDirectories()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WriteOffset(FileWriter writer, long Target, long RelativePosition)
|
||||||
|
{
|
||||||
|
long Position = writer.Position;
|
||||||
|
using (writer.TemporarySeek(RelativePosition + Target, System.IO.SeekOrigin.Begin))
|
||||||
|
{
|
||||||
|
writer.Write((uint)Position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private string ReadStringAtTable(FileReader reader, uint NameOffset)
|
private string ReadStringAtTable(FileReader reader, uint NameOffset)
|
||||||
{
|
{
|
||||||
using (reader.TemporarySeek(NameOffset, System.IO.SeekOrigin.Begin))
|
using (reader.TemporarySeek(NameOffset, System.IO.SeekOrigin.Begin))
|
||||||
@ -179,6 +297,8 @@ namespace FirstPlugin
|
|||||||
nodes.Add(node);
|
nodes.Add(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
internal long _positionPtr;
|
||||||
public void Read(FileReader reader)
|
public void Read(FileReader reader)
|
||||||
{
|
{
|
||||||
Identifier = reader.ReadUInt32();
|
Identifier = reader.ReadUInt32();
|
||||||
@ -190,6 +310,8 @@ namespace FirstPlugin
|
|||||||
|
|
||||||
public void Write(FileWriter writer)
|
public void Write(FileWriter writer)
|
||||||
{
|
{
|
||||||
|
_positionPtr = writer.Position;
|
||||||
|
|
||||||
Hash = CalculateHash(Name);
|
Hash = CalculateHash(Name);
|
||||||
|
|
||||||
writer.Write(Identifier);
|
writer.Write(Identifier);
|
||||||
@ -207,7 +329,9 @@ namespace FirstPlugin
|
|||||||
|
|
||||||
public byte[] Save()
|
public byte[] Save()
|
||||||
{
|
{
|
||||||
return null;
|
var mem = new System.IO.MemoryStream();
|
||||||
|
SaveFile(new FileWriter(mem));
|
||||||
|
return mem.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool AddFile(ArchiveFileInfo archiveFileInfo)
|
public bool AddFile(ArchiveFileInfo archiveFileInfo)
|
||||||
@ -229,14 +353,28 @@ namespace FirstPlugin
|
|||||||
internal uint Offset;
|
internal uint Offset;
|
||||||
internal ushort NameOffset;
|
internal ushort NameOffset;
|
||||||
|
|
||||||
|
internal long _positionPtr;
|
||||||
public void Read(FileReader reader)
|
public void Read(FileReader reader)
|
||||||
{
|
{
|
||||||
FileId = reader.ReadUInt16();
|
FileId = reader.ReadUInt16();
|
||||||
uint Unknown = reader.ReadUInt32();
|
Unknown = reader.ReadUInt32();
|
||||||
NameOffset = reader.ReadUInt16();
|
NameOffset = reader.ReadUInt16();
|
||||||
Offset = reader.ReadUInt32();
|
Offset = reader.ReadUInt32();
|
||||||
Size = reader.ReadUInt32();
|
Size = reader.ReadUInt32();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Write(FileWriter writer)
|
||||||
|
{
|
||||||
|
_positionPtr = writer.Position;
|
||||||
|
|
||||||
|
SaveFileFormat();
|
||||||
|
|
||||||
|
writer.Write(FileId);
|
||||||
|
writer.Write(Unknown);
|
||||||
|
writer.Write(NameOffset);
|
||||||
|
writer.Write(uint.MaxValue);
|
||||||
|
writer.Write(FileData.Length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1277,6 +1277,7 @@
|
|||||||
<None Include="Resources\ViewportIconDisable.png" />
|
<None Include="Resources\ViewportIconDisable.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Folder Include="FileFormats\BMD\" />
|
||||||
<Folder Include="FileFormats\EvemtFlow\" />
|
<Folder Include="FileFormats\EvemtFlow\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -471,7 +471,7 @@ namespace Switch_Toolbox.Library
|
|||||||
|
|
||||||
bool IsBone = boneNames.Contains(Name) && !boneNames.Contains(ParentArmatureName) ||
|
bool IsBone = boneNames.Contains(Name) && !boneNames.Contains(ParentArmatureName) ||
|
||||||
Name.Contains("Skl_Root") || Name.Contains("nw4f_root") ||
|
Name.Contains("Skl_Root") || Name.Contains("nw4f_root") ||
|
||||||
Name.Contains("skl_root") || Name.Contains("_root");
|
Name.Contains("skl_root") || Name.Contains("_root") || Name.Contains("Root");
|
||||||
|
|
||||||
short SmoothIndex = 0;
|
short SmoothIndex = 0;
|
||||||
short RigidIndex = -1;
|
short RigidIndex = -1;
|
||||||
@ -480,19 +480,14 @@ namespace Switch_Toolbox.Library
|
|||||||
if (IsBone)
|
if (IsBone)
|
||||||
{
|
{
|
||||||
var idenity = Matrix4x4.Identity;
|
var idenity = Matrix4x4.Identity;
|
||||||
|
|
||||||
var Root = node;
|
|
||||||
if (node.Parent != null)
|
|
||||||
Root = node.Parent;
|
|
||||||
|
|
||||||
CreateByNode(node, skeleton, ParentArmatureName, SmoothIndex, RigidIndex, true, ref idenity);
|
CreateByNode(node, skeleton, ParentArmatureName, SmoothIndex, RigidIndex, true, ref idenity);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (node.HasChildren)
|
if (node.HasChildren)
|
||||||
{
|
{
|
||||||
foreach (Node child in node.Children)
|
foreach (Node child in node.Children)
|
||||||
BuildSkeletonNodes(child, boneNames, skeleton, ref world);
|
BuildSkeletonNodes(child, boneNames, skeleton, ref world);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,6 +82,10 @@ namespace Switch_Toolbox.Library.IO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SeekBegin(uint Offset) { Seek(Offset, SeekOrigin.Begin); }
|
||||||
|
public void SeekBegin(int Offset) { Seek(Offset, SeekOrigin.Begin); }
|
||||||
|
public void SeekBegin(long Offset) { Seek(Offset, SeekOrigin.Begin); }
|
||||||
|
|
||||||
public void Write(OpenTK.Vector2 v)
|
public void Write(OpenTK.Vector2 v)
|
||||||
{
|
{
|
||||||
Write(v.X);
|
Write(v.X);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user