diff options
| author | Anghelo Carvajal <angheloalf95@gmail.com> | 2021-05-26 22:32:39 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-26 22:32:39 -0400 |
| commit | cd3e9527b185190c5f7826766bf2b4760bd12d5f (patch) | |
| tree | bb01e372abc6a72511130adcee1d5e27127a5f49 | |
| parent | 4410b554e835ab7844c8eb78fd54fa3842d50f16 (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.cpp | 18 | ||||
| -rw-r--r-- | ZAPD/ZAnimation.cpp | 40 | ||||
| -rw-r--r-- | ZAPD/ZAnimation.h | 6 | ||||
| -rw-r--r-- | ZAPD/ZDisplayList.cpp | 12 | ||||
| -rw-r--r-- | ZAPD/ZDisplayList.h | 5 | ||||
| -rw-r--r-- | ZAPD/ZLimb.cpp | 106 | ||||
| -rw-r--r-- | ZAPD/ZLimb.h | 11 | ||||
| -rw-r--r-- | ZAPD/ZSkeleton.cpp | 14 |
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; } |
