summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2021-05-26 22:32:39 -0400
committerGitHub <noreply@github.com>2021-05-26 22:32:39 -0400
commitcd3e9527b185190c5f7826766bf2b4760bd12d5f (patch)
treebb01e372abc6a72511130adcee1d5e27127a5f49
parent4410b554e835ab7844c8eb78fd54fa3842d50f16 (diff)
A few Limbs, Skel and CurveAnimation fixes (#144)
* Detect if a limb is pointing to the middle of a dlist * Fix limbs names being ignored in some cases * Check if pointing past the object's size * Remove unnecesary pointers * Don't try to extract the skel offset declared in a CurveAnimation * Final cleanup * Use GetDeclarationRanged * Always set the rangeEnd to the filesize by default * Revert "Always set the rangeEnd to the filesize by default" This reverts commit f5c135c39a1df3f545c97c0a0becf7808115e06f.
-rw-r--r--ZAPD/HighLevel/HLModelIntermediette.cpp18
-rw-r--r--ZAPD/ZAnimation.cpp40
-rw-r--r--ZAPD/ZAnimation.h6
-rw-r--r--ZAPD/ZDisplayList.cpp12
-rw-r--r--ZAPD/ZDisplayList.h5
-rw-r--r--ZAPD/ZLimb.cpp106
-rw-r--r--ZAPD/ZLimb.h11
-rw-r--r--ZAPD/ZSkeleton.cpp14
8 files changed, 104 insertions, 108 deletions
diff --git a/ZAPD/HighLevel/HLModelIntermediette.cpp b/ZAPD/HighLevel/HLModelIntermediette.cpp
index e621a51..88f66a4 100644
--- a/ZAPD/HighLevel/HLModelIntermediette.cpp
+++ b/ZAPD/HighLevel/HLModelIntermediette.cpp
@@ -250,22 +250,24 @@ void HLModelIntermediette::FromZSkeleton(HLModelIntermediette* model, ZSkeleton*
void HLModelIntermediette::ProcessZSkeletonLimb(HLModelIntermediette* model, ZSkeleton* zSkeleton,
ZLimb* limb)
{
+ /*
if (limb->dList == nullptr && limb->dListPtr != 0)
- limb->dList = (ZDisplayList*)zSkeleton->parent->FindResource(limb->dListPtr);
+ limb->dList = (ZDisplayList*)zSkeleton->parent->FindResource(limb->dListPtr);
if (limb->dList != nullptr)
{
- auto cmdTrans = new HLSetTranslation(limb->transX, limb->transY, limb->transZ);
- cmdTrans->parent = model;
- model->blocks.push_back(cmdTrans);
+ auto cmdTrans = new HLSetTranslation(limb->transX, limb->transY, limb->transZ);
+ cmdTrans->parent = model;
+ model->blocks.push_back(cmdTrans);
- FromZDisplayList(model, limb->dList);
+ FromZDisplayList(model, limb->dList);
}
+ */
- for (ZLimb* childLimb : limb->children)
+ /*for (ZLimb* childLimb : limb->children)
{
- ProcessZSkeletonLimb(model, zSkeleton, childLimb);
- }
+ ProcessZSkeletonLimb(model, zSkeleton, childLimb);
+ }*/
}
std::string HLModelIntermediette::ToOBJFile()
diff --git a/ZAPD/ZAnimation.cpp b/ZAPD/ZAnimation.cpp
index f011a29..5f9f934 100644
--- a/ZAPD/ZAnimation.cpp
+++ b/ZAPD/ZAnimation.cpp
@@ -229,11 +229,6 @@ ZCurveAnimation::ZCurveAnimation(ZFile* nParent) : ZAnimation(nParent)
RegisterOptionalAttribute("SkelOffset");
}
-ZCurveAnimation::~ZCurveAnimation()
-{
- delete skel;
-}
-
void ZCurveAnimation::ParseXML(tinyxml2::XMLElement* reader)
{
ZAnimation::ParseXML(reader);
@@ -259,25 +254,18 @@ void ZCurveAnimation::ParseRawData()
copyValues = BitConverter::ToUInt32BE(rawData, rawDataIndex + 8);
unk_0C = BitConverter::ToInt16BE(rawData, rawDataIndex + 12);
unk_10 = BitConverter::ToInt16BE(rawData, rawDataIndex + 14);
-}
-void ZCurveAnimation::ExtractFromXML(tinyxml2::XMLElement* reader,
- const std::vector<uint8_t>& nRawData,
- const uint32_t nRawDataIndex)
-{
- ZResource::ExtractFromXML(reader, nRawData, nRawDataIndex);
-
- skel = new ZSkeleton(ZSkeletonType::Curve, ZLimbType::Curve, "CurveAnim", nRawData,
- Seg2Filespace(skelOffset, parent->baseAddress), parent);
+ limbCount =
+ BitConverter::ToUInt8BE(rawData, Seg2Filespace(skelOffset, parent->baseAddress) + 4);
size_t transformDataSize = 0;
size_t copyValuesSize = 0;
if (refIndex != 0)
{
uint32_t refIndexOffset = Seg2Filespace(refIndex, parent->baseAddress);
- for (size_t i = 0; i < 3 * 3 * skel->GetLimbCount(); i++)
+ for (size_t i = 0; i < 3 * 3 * limbCount; i++)
{
- uint8_t ref = BitConverter::ToUInt8BE(nRawData, refIndexOffset + i);
+ uint8_t ref = BitConverter::ToUInt8BE(rawData, refIndexOffset + i);
if (ref == 0)
copyValuesSize++;
else
@@ -292,7 +280,7 @@ void ZCurveAnimation::ExtractFromXML(tinyxml2::XMLElement* reader,
uint32_t transformDataOffset = Seg2Filespace(transformData, parent->baseAddress);
for (size_t i = 0; i < transformDataSize; i++)
- transformDataArr.emplace_back(parent, nRawData, transformDataOffset, i);
+ transformDataArr.emplace_back(parent, rawData, transformDataOffset, i);
}
if (copyValues != 0)
@@ -300,21 +288,21 @@ void ZCurveAnimation::ExtractFromXML(tinyxml2::XMLElement* reader,
uint32_t copyValuesOffset = Seg2Filespace(copyValues, parent->baseAddress);
for (size_t i = 0; i < copyValuesSize; i++)
- copyValuesArr.emplace_back(BitConverter::ToInt16BE(nRawData, copyValuesOffset + i * 2));
+ copyValuesArr.emplace_back(BitConverter::ToInt16BE(rawData, copyValuesOffset + i * 2));
}
+}
+
+void ZCurveAnimation::ExtractFromXML(tinyxml2::XMLElement* reader,
+ const std::vector<uint8_t>& nRawData, uint32_t nRawDataIndex)
+{
+ ZResource::ExtractFromXML(reader, nRawData, nRawDataIndex);
parent->AddDeclaration(rawDataIndex, DeclarationAlignment::Align16, GetRawDataSize(),
GetSourceTypeName(), name, "");
}
-void ZCurveAnimation::PreGenValues(const std::string& prefix)
+void ZCurveAnimation::DeclareReferences(const std::string& prefix)
{
- Declaration* decl = parent->GetDeclaration(skelOffset);
- if (decl == nullptr)
- {
- skel->GetSourceOutputCode(prefix);
- }
-
if (refIndex != 0)
{
uint32_t refIndexOffset = Seg2Filespace(refIndex, parent->baseAddress);
@@ -413,8 +401,6 @@ std::string ZCurveAnimation::GetSourceOutputCode(const std::string& prefix)
std::string bodyStr = "";
uint32_t address = Seg2Filespace(rawDataIndex, parent->baseAddress);
- PreGenValues(prefix);
-
std::string refIndexStr = "NULL";
if (refIndex != 0)
{
diff --git a/ZAPD/ZAnimation.h b/ZAPD/ZAnimation.h
index 513ee59..2d23ddd 100644
--- a/ZAPD/ZAnimation.h
+++ b/ZAPD/ZAnimation.h
@@ -114,7 +114,7 @@ protected:
///* 0x000E */ s16 unk_10;
int16_t unk_10;
- ZSkeleton* skel;
+ uint8_t limbCount = 0;
std::vector<uint8_t> refIndexArr;
std::vector<TransformData> transformDataArr;
@@ -123,13 +123,13 @@ protected:
public:
ZCurveAnimation();
ZCurveAnimation(ZFile* nParent);
- ~ZCurveAnimation();
+
void ParseXML(tinyxml2::XMLElement* reader) override;
void ParseRawData() override;
void ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData,
const uint32_t nRawDataIndex) override;
- void PreGenValues(const std::string& prefix);
+ void DeclareReferences(const std::string& prefix) override;
size_t GetRawDataSize() const override;
std::string GetSourceOutputCode(const std::string& prefix) override;
diff --git a/ZAPD/ZDisplayList.cpp b/ZAPD/ZDisplayList.cpp
index 745442d..de041f1 100644
--- a/ZAPD/ZDisplayList.cpp
+++ b/ZAPD/ZDisplayList.cpp
@@ -56,6 +56,8 @@ void ZDisplayList::ExtractFromXML(tinyxml2::XMLElement* reader,
dlistRawData.assign(nRawData.data() + rawDataIndex,
nRawData.data() + rawDataIndex + rawDataSize);
ParseRawData();
+
+ DeclareVar("", "");
}
ZDisplayList::ZDisplayList(std::vector<uint8_t> nRawData, uint32_t nRawDataIndex,
@@ -81,6 +83,12 @@ void ZDisplayList::ParseRawData()
instructions.push_back(BitConverter::ToUInt64BE(dlistRawData, (i * 8)));
}
+Declaration* ZDisplayList::DeclareVar(const std::string& prefix, const std::string& bodyStr)
+{
+ return parent->AddDeclarationArray(rawDataIndex, DeclarationAlignment::Align8, GetRawDataSize(),
+ GetSourceTypeName(), name, 0, bodyStr, true);
+}
+
void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int32_t i, std::string prefix,
char* line)
{
@@ -1849,9 +1857,7 @@ std::string ZDisplayList::GetSourceOutputCode(const std::string& prefix)
if (parent != nullptr)
{
- Declaration* decl = parent->AddDeclarationArray(
- rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), "Gfx",
- StringHelper::Sprintf("%s", name.c_str()), 0, sourceOutput, true);
+ Declaration* decl = DeclareVar("", sourceOutput);
decl->references = references;
// return "";
// return sourceOutput;
diff --git a/ZAPD/ZDisplayList.h b/ZAPD/ZDisplayList.h
index 233d80d..091b4b2 100644
--- a/ZAPD/ZDisplayList.h
+++ b/ZAPD/ZDisplayList.h
@@ -287,7 +287,6 @@ class ZDisplayList : public ZResource
{
protected:
static TextureType TexFormatToTexType(F3DZEXTexFormats fmt, F3DZEXTexSizes siz);
- void ParseRawData() override;
void ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int32_t i, std::string prefix, char* line);
void ParseF3DEX(F3DEXOpcode opcode, uint64_t data, std::string prefix, char* line);
@@ -358,6 +357,10 @@ public:
void ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData,
const uint32_t nRawDataIndex) override;
+ void ParseRawData() override;
+
+ Declaration* DeclareVar(const std::string& prefix, const std::string& bodyStr);
+
void TextureGenCheck(std::string prefix);
static bool TextureGenCheck(std::vector<uint8_t> fileData, ZRoom* scene, ZFile* parent,
std::string prefix, int32_t texWidth, int32_t texHeight,
diff --git a/ZAPD/ZLimb.cpp b/ZAPD/ZLimb.cpp
index ce891b2..ffb61e2 100644
--- a/ZAPD/ZLimb.cpp
+++ b/ZAPD/ZLimb.cpp
@@ -240,12 +240,6 @@ Struct_800A5E28::~Struct_800A5E28()
delete unk_8_dlist;
}
-ZLimb::~ZLimb()
-{
- for (auto DL : dLists)
- delete DL;
-}
-
void Struct_800A5E28::PreGenSourceFiles(const std::string& prefix)
{
if (unk_4 != 0)
@@ -369,12 +363,20 @@ ZLimb::ZLimb(ZLimbType limbType, const std::string& prefix, const std::vector<ui
parent = nParent;
type = limbType;
- segAddress = nRawDataIndex;
name = StringHelper::Sprintf("%sLimb_%06X", prefix.c_str(), GetFileAddress());
ParseRawData();
}
+void ZLimb::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData,
+ const uint32_t nRawDataIndex)
+{
+ ZResource::ExtractFromXML(reader, nRawData, nRawDataIndex);
+
+ parent->AddDeclaration(GetFileAddress(), DeclarationAlignment::None, GetRawDataSize(),
+ GetSourceTypeName(), name, "");
+}
+
void ZLimb::ParseXML(tinyxml2::XMLElement* reader)
{
ZResource::ParseXML(reader);
@@ -425,6 +427,8 @@ void ZLimb::ParseXML(tinyxml2::XMLElement* reader)
void ZLimb::ParseRawData()
{
+ ZResource::ParseRawData();
+
if (type == ZLimbType::Curve)
{
childIndex = rawData.at(rawDataIndex + 0);
@@ -455,29 +459,15 @@ void ZLimb::ParseRawData()
skinSegmentType =
static_cast<ZLimbSkinType>(BitConverter::ToInt32BE(rawData, rawDataIndex + 8));
skinSegment = BitConverter::ToUInt32BE(rawData, rawDataIndex + 12);
- break;
- default:
- throw std::runtime_error("Invalid ZLimb type");
- break;
- }
-}
-
-void ZLimb::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData,
- const uint32_t nRawDataIndex)
-{
- ZResource::ExtractFromXML(reader, nRawData, nRawDataIndex);
- segAddress = nRawDataIndex;
-
- parent->AddDeclaration(GetFileAddress(), DeclarationAlignment::None, GetRawDataSize(),
- GetSourceTypeName(), name, "");
-
- if (type == ZLimbType::Skin)
- {
if (skinSegmentType == ZLimbSkinType::SkinType_4 && skinSegment != 0)
{
uint32_t skinSegmentOffset = Seg2Filespace(skinSegment, parent->baseAddress);
segmentStruct = Struct_800A5E28(parent, rawData, skinSegmentOffset);
}
+ break;
+ default:
+ throw std::runtime_error("Invalid ZLimb type");
+ break;
}
}
@@ -498,19 +488,10 @@ size_t ZLimb::GetRawDataSize() const
std::string ZLimb::GetSourceOutputCode(const std::string& prefix)
{
- std::string dListStr = "NULL";
- std::string dListStr2 = "NULL";
-
- if (dListPtr != 0)
- {
- std::string limbPrefix = type == ZLimbType::Curve ? "Curve" : "";
- dListStr = GetLimbDListSourceOutputCode(prefix, limbPrefix, dListPtr);
- }
- if (dList2Ptr != 0)
- {
- std::string limbPrefix = type == ZLimbType::Curve ? "Curve" : "Far";
- dListStr2 = GetLimbDListSourceOutputCode(prefix, limbPrefix, dList2Ptr);
- }
+ std::string limbPrefix = type == ZLimbType::Curve ? "Curve" : "";
+ std::string dListStr = GetLimbDListSourceOutputCode(prefix, limbPrefix, dListPtr);
+ limbPrefix = type == ZLimbType::Curve ? "Curve" : "Far";
+ std::string dListStr2 = GetLimbDListSourceOutputCode(prefix, limbPrefix, dList2Ptr);
std::string entryStr = "";
if (type != ZLimbType::Curve)
@@ -584,9 +565,10 @@ const char* ZLimb::GetSourceTypeName(ZLimbType limbType)
uint32_t ZLimb::GetFileAddress()
{
- return Seg2Filespace(segAddress, parent->baseAddress);
+ return Seg2Filespace(rawDataIndex, parent->baseAddress);
}
+// Returns the ptrname of a dlist. Declares it if it has not been declared yet.
std::string ZLimb::GetLimbDListSourceOutputCode(const std::string& prefix,
const std::string& limbPrefix, segptr_t dListPtr)
{
@@ -594,26 +576,42 @@ std::string ZLimb::GetLimbDListSourceOutputCode(const std::string& prefix,
return "NULL";
uint32_t dListOffset = Seg2Filespace(dListPtr, parent->baseAddress);
- std::string dListStr;
+
+ // Check if pointing past the object's size
+ if (dListOffset > parent->GetRawData().size())
+ return StringHelper::Sprintf("0x%08X", dListPtr);
+
+ // Check if it is already declared
Declaration* decl = parent->GetDeclaration(dListOffset);
- if (decl == nullptr)
- {
- dListStr = StringHelper::Sprintf("%s%sLimbDL_%06X", prefix.c_str(), limbPrefix.c_str(),
- dListOffset);
+ if (decl != nullptr)
+ return decl->varName;
- int32_t dlistLength = ZDisplayList::GetDListLength(
- rawData, dListOffset,
- Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX);
- auto dList = new ZDisplayList(rawData, dListOffset, dlistLength, parent);
- dLists.push_back(dList);
- dList->SetName(dListStr);
- dList->GetSourceOutputCode(prefix);
- }
- else
+ // Check if it points to the middle of a DList
+ decl = parent->GetDeclarationRanged(dListOffset);
+ if (decl != nullptr)
{
- dListStr = decl->varName;
+ // TODO: Figure out a way to not hardcode the "Gfx" type.
+ if (decl->varType == "Gfx")
+ {
+ uint32_t declAddress = parent->GetDeclarationRangedAddress(dListOffset);
+ if (dListOffset < declAddress + decl->size)
+ {
+ uint32_t index = (dListOffset - declAddress) / 8;
+ return StringHelper::Sprintf("&%s[%u]", decl->varName.c_str(), index);
+ }
+ }
}
+ // Create the DList
+ std::string dListStr =
+ StringHelper::Sprintf("%s%sLimbDL_%06X", prefix.c_str(), limbPrefix.c_str(), dListOffset);
+
+ int32_t dlistLength = ZDisplayList::GetDListLength(
+ rawData, dListOffset,
+ Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX);
+ auto dList = new ZDisplayList(rawData, dListOffset, dlistLength, parent);
+ dList->SetName(dListStr);
+ dList->GetSourceOutputCode(prefix);
return dListStr;
}
diff --git a/ZAPD/ZLimb.h b/ZAPD/ZLimb.h
index d3ac3d0..8172bef 100644
--- a/ZAPD/ZLimb.h
+++ b/ZAPD/ZLimb.h
@@ -120,7 +120,6 @@ public:
class ZLimb : public ZResource
{
protected:
- segptr_t segAddress;
ZLimbType type = ZLimbType::Standard;
ZLimbSkinType skinSegmentType = ZLimbSkinType::SkinType_0; // Skin only
@@ -135,23 +134,21 @@ protected:
std::string GetSourceOutputCodeSkin_Type_4(const std::string& prefix);
public:
- ZDisplayList* dList;
segptr_t dListPtr = 0;
segptr_t farDListPtr = 0; // LOD only
int16_t transX, transY, transZ;
uint8_t childIndex, siblingIndex;
- std::vector<ZDisplayList*> dLists;
- std::vector<ZLimb*> children;
ZLimb(ZFile* nParent);
ZLimb(ZLimbType limbType, const std::string& prefix, const std::vector<uint8_t>& nRawData,
uint32_t nRawDataIndex, ZFile* nParent);
- ~ZLimb();
- void ParseXML(tinyxml2::XMLElement* reader) override;
- void ParseRawData() override;
void ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData,
const uint32_t nRawDataIndex) override;
+
+ void ParseXML(tinyxml2::XMLElement* reader) override;
+ void ParseRawData() override;
+
size_t GetRawDataSize() const override;
std::string GetSourceOutputCode(const std::string& prefix) override;
std::string GetSourceTypeName() const override;
diff --git a/ZAPD/ZSkeleton.cpp b/ZAPD/ZSkeleton.cpp
index cb2d2a9..dd5f8bd 100644
--- a/ZAPD/ZSkeleton.cpp
+++ b/ZAPD/ZSkeleton.cpp
@@ -116,10 +116,14 @@ void ZSkeleton::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<u
{
uint32_t ptr2 = Seg2Filespace(BitConverter::ToUInt32BE(rawData, ptr), parent->baseAddress);
- // ZLimb* limb = new ZLimb(reader, rawData, ptr2, parent);
+ std::string limbName = StringHelper::Sprintf("%sLimb_%06X", defaultPrefix.c_str(), ptr2);
+ Declaration* decl = parent->GetDeclaration(ptr2);
+ if (decl != nullptr)
+ limbName = decl->varName;
+
ZLimb* limb = new ZLimb(parent);
limb->SetLimbType(limbType);
- limb->SetName(StringHelper::Sprintf("%sLimb_%06X", defaultPrefix.c_str(), ptr2));
+ limb->SetName(limbName);
limb->ExtractFromXML(nullptr, rawData, ptr2);
limbs.push_back(limb);
@@ -194,11 +198,11 @@ std::string ZSkeleton::GetSourceOutputCode(const std::string& prefix)
{
case ZSkeletonType::Normal:
case ZSkeletonType::Curve:
- headerStr = StringHelper::Sprintf("%sLimbs, %i", defaultPrefix.c_str(), limbCount);
+ headerStr = StringHelper::Sprintf("\n\t%sLimbs, %i\n", defaultPrefix.c_str(), limbCount);
break;
case ZSkeletonType::Flex:
- headerStr =
- StringHelper::Sprintf("%sLimbs, %i, %i", defaultPrefix.c_str(), limbCount, dListCount);
+ headerStr = StringHelper::Sprintf("\n\t{ %sLimbs, %i }, %i\n", defaultPrefix.c_str(),
+ limbCount, dListCount);
break;
}