Fix numerous errors in animation and skeleton detection

This commit is contained in:
Thar0
2021-06-05 19:40:00 +01:00
parent ba1b5c46b4
commit 85811dffd7
2 changed files with 11 additions and 5 deletions
+10 -5
View File
@@ -338,14 +338,14 @@ namespace Z64
{
// Search for Skeleton Headers
// Structure: SS OO OO OO XX 00 00 00 [XX 00 00 00]
for (int i = 0; i < data.Length - Z64Object.SkeletonHolder.HEADER_SIZE; i += 4)
for (int i = 0; i <= data.Length - Z64Object.SkeletonHolder.HEADER_SIZE; i += 4)
{
var segment = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, i));
// check for segmentId match, check for valid segment offset,
// check for Limbs 0x4 alignment, check for nonzero limb count,
// check for zeroes in struct padding
if (segment.SegmentId == segmentId && segment.SegmentOff < data.Length &&
(segment.SegmentOff % 4) == 0 && data[i+4] != 0 &&
(segment.SegmentOff % 4) == 0 && data[i+4] > 1 && // There should be no single-limb skeletons
data[i + 5] == 0 && data[i + 6] == 0 && data[i + 7] == 0)
{
if (!obj.IsOffsetFree(i))
@@ -377,7 +377,7 @@ namespace Z64
// check if nothing is already assumed to occupy that space,
// check if the number of dlists is equal to the actual number of non-null dlists,
// check struct padding
if (i < data.Length - Z64Object.FlexSkeletonHolder.HEADER_SIZE && obj.IsOffsetFree(i + Z64Object.SkeletonHolder.HEADER_SIZE) &&
if (i <= data.Length - Z64Object.FlexSkeletonHolder.HEADER_SIZE && obj.IsOffsetFree(i + Z64Object.SkeletonHolder.HEADER_SIZE) &&
data[i + 8] == nNonNullDlists && data[i + 9] == 0 && data[i + 10] == 0 && data[i + 11] == 0)
{
obj.AddFlexSkeleton(off: i);
@@ -401,19 +401,24 @@ namespace Z64
if (frameCount > 0 &&
data[i + 2] == 0 && data[i + 3] == 0 && data[i + 14] == 0 && data[i + 15] == 0)
{
if (!obj.IsOffsetFree(i))
if (!(obj.IsOffsetFree(i) && obj.IsOffsetFree(i + Z64Object.AnimationHolder.HEADER_SIZE)))
continue;
var frameDataSeg = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, i+4));
var jointIndicesSeg = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, i+8));
// check for segmentId match, check for valid segment offsets
if (frameDataSeg.SegmentId == segmentId && jointIndicesSeg.SegmentId == segmentId &&
frameDataSeg.SegmentOff < data.Length && jointIndicesSeg.SegmentOff < data.Length)
frameDataSeg.SegmentOff < data.Length && jointIndicesSeg.SegmentOff < data.Length &&
jointIndicesSeg.SegmentOff > frameDataSeg.SegmentOff)
{
// Assumes these are all in order and end at the start of the next, which seems to be the case so far
int frameDataSize = (int)(jointIndicesSeg.SegmentOff - frameDataSeg.SegmentOff);
int jointIndicesSize = (int)(i - jointIndicesSeg.SegmentOff);
// Require at least one entry to be considered valid
if (frameDataSize < 2 || jointIndicesSize < Z64Object.AnimationJointIndicesHolder.ENTRY_SIZE)
continue;
// if not a multiple of 2, check for struct padding
if ((frameDataSize % 2) != 0)
{
+1
View File
@@ -17,6 +17,7 @@
<PackageReference Include="Be.Windows.Forms.HexBox" Version="1.6.1" />
<PackageReference Include="OpenTK.GLControl" Version="3.1.0" />
<PackageReference Include="Syroot.BinaryData" Version="5.2.2" />
<PackageReference Include="System.Drawing.Common" Version="5.0.2" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">