diff options
| -rw-r--r-- | ZAPD/HighLevel/HLAnimationIntermediette.cpp | 8 | ||||
| -rw-r--r-- | ZAPD/Main.cpp | 4 | ||||
| -rw-r--r-- | ZAPD/ZAnimation.cpp | 138 | ||||
| -rw-r--r-- | ZAPD/ZAnimation.h | 39 | ||||
| -rw-r--r-- | ZAPD/ZCollision.cpp | 1 | ||||
| -rw-r--r-- | ZAPD/ZDisplayList.cpp | 2 | ||||
| -rw-r--r-- | ZAPD/ZFile.cpp | 14 | ||||
| -rw-r--r-- | ZAPD/ZRoom/Commands/SetCollisionHeader.cpp | 4 | ||||
| -rw-r--r-- | ZAPD/ZRoom/Commands/SetMesh.cpp | 6 | ||||
| -rw-r--r-- | ZAPD/ZRoom/Commands/SetRoomList.cpp | 2 |
10 files changed, 163 insertions, 55 deletions
diff --git a/ZAPD/HighLevel/HLAnimationIntermediette.cpp b/ZAPD/HighLevel/HLAnimationIntermediette.cpp index 9543bc0..1b64af1 100644 --- a/ZAPD/HighLevel/HLAnimationIntermediette.cpp +++ b/ZAPD/HighLevel/HLAnimationIntermediette.cpp @@ -54,14 +54,14 @@ HLAnimationIntermediette* HLAnimationIntermediette::FromZAnimation(ZAnimation* z { HLAnimationIntermediette* anim = new HLAnimationIntermediette(); - anim->limit = zAnim->limit; + /*anim->limit = zAnim->limit; anim->frameCount = zAnim->frameCount; for (uint16_t item : zAnim->rotationValues) anim->rotationValues.push_back(item); for (RotationIndex item : zAnim->rotationIndices) - anim->rotationIndices.push_back(item); + anim->rotationIndices.push_back(item);*/ return anim; } @@ -70,14 +70,14 @@ ZAnimation* HLAnimationIntermediette::ToZAnimation() { ZAnimation* zAnim = new ZAnimation(); - zAnim->limit = limit; + /*zAnim->limit = limit; zAnim->frameCount = frameCount; for (uint16_t item : rotationValues) zAnim->rotationValues.push_back(item); for (RotationIndex item : rotationIndices) - zAnim->rotationIndices.push_back(item); + zAnim->rotationIndices.push_back(item);*/ return zAnim; } diff --git a/ZAPD/Main.cpp b/ZAPD/Main.cpp index 468dd66..f583edd 100644 --- a/ZAPD/Main.cpp +++ b/ZAPD/Main.cpp @@ -315,8 +315,8 @@ void BuildAssetAnimationIntermediette(string animPath, string outPath) ZAnimation* zAnim = anim->ToZAnimation(); zAnim->SetName(Path::GetFileNameWithoutExtension(split[split.size() - 1])); zAnim->parent = file; - zAnim->rotationIndicesSeg = 1; - zAnim->rotationValuesSeg = 2; + //zAnim->rotationIndicesSeg = 1; + //zAnim->rotationValuesSeg = 2; zAnim->GetSourceOutputCode(split[split.size() - 2]); string output = ""; diff --git a/ZAPD/ZAnimation.cpp b/ZAPD/ZAnimation.cpp index c420909..c0fa085 100644 --- a/ZAPD/ZAnimation.cpp +++ b/ZAPD/ZAnimation.cpp @@ -11,20 +11,6 @@ using namespace std; ZAnimation::ZAnimation() : ZResource() { frameCount = 0; - rotationValues = vector<uint16_t>(); - rotationIndices = vector<RotationIndex>(); - limit = 0; -} - -ZAnimation* ZAnimation::ExtractFromXML(tinyxml2::XMLElement* reader, vector<uint8_t> nRawData, int rawDataIndex, string nRelPath) -{ - ZAnimation* anim = new ZAnimation(); - anim->rawData = nRawData; - anim->rawDataIndex = rawDataIndex; - anim->ParseXML(reader); - anim->ParseRawData(); - - return anim; } void ZAnimation::ParseRawData() @@ -33,27 +19,6 @@ void ZAnimation::ParseRawData() // Read the header frameCount = BitConverter::ToInt16BE(data, rawDataIndex + 0); - rotationValuesSeg = BitConverter::ToInt32BE(data, rawDataIndex + 4) & 0x00FFFFFF; - rotationIndicesSeg = BitConverter::ToInt32BE(data, rawDataIndex + 8) & 0x00FFFFFF; - limit = BitConverter::ToInt16BE(data, rawDataIndex + 12); - - uint32_t currentPtr = rotationValuesSeg; - - // Read the Rotation Values - for (int i = 0; i < ((rotationIndicesSeg - rotationValuesSeg) / 2); i++) - { - rotationValues.push_back(BitConverter::ToInt16BE(data, currentPtr)); - currentPtr += 2; - } - - currentPtr = rotationIndicesSeg; - - // Read the Rotation Indices - for (int i = 0; i < ((rawDataIndex - rotationIndicesSeg) / 6); i++) - { - rotationIndices.push_back(RotationIndex(BitConverter::ToInt16BE(data, currentPtr), BitConverter::ToInt16BE(data, currentPtr + 2), BitConverter::ToInt16BE(data, currentPtr + 4))); - currentPtr += 6; - } } void ZAnimation::Save(string outFolder) @@ -77,6 +42,18 @@ void ZAnimation::ParseXML(tinyxml2::XMLElement* reader) string ZAnimation::GetSourceOutputCode(string prefix) { + return ""; +} + +ZNormalAnimation::ZNormalAnimation() : ZAnimation() +{ + rotationValues = vector<uint16_t>(); + rotationIndices = vector<RotationIndex>(); + limit = 0; +} + +std::string ZNormalAnimation::GetSourceOutputCode(std::string prefix) +{ if (parent != nullptr) { string headerStr = StringHelper::Sprintf("%i, %sFrameData, %sJointIndices, %i", @@ -112,4 +89,93 @@ string ZAnimation::GetSourceOutputCode(string prefix) } return ""; -}
\ No newline at end of file +} + +int ZNormalAnimation::GetRawDataSize() +{ + return 16; +} + +ZNormalAnimation* ZNormalAnimation::ExtractFromXML(tinyxml2::XMLElement* reader, std::vector<uint8_t> nRawData, int rawDataIndex, std::string nRelPath) +{ + ZNormalAnimation* anim = new ZNormalAnimation(); + anim->rawData = nRawData; + anim->rawDataIndex = rawDataIndex; + anim->ParseXML(reader); + anim->ParseRawData(); + + return anim; +} + +void ZNormalAnimation::ParseRawData() +{ + ZAnimation::ParseRawData(); + + uint8_t* data = rawData.data(); + + rotationValuesSeg = BitConverter::ToInt32BE(data, rawDataIndex + 4) & 0x00FFFFFF; + rotationIndicesSeg = BitConverter::ToInt32BE(data, rawDataIndex + 8) & 0x00FFFFFF; + limit = BitConverter::ToInt16BE(data, rawDataIndex + 12); + + uint32_t currentPtr = rotationValuesSeg; + + // Read the Rotation Values + for (int i = 0; i < ((rotationIndicesSeg - rotationValuesSeg) / 2); i++) + { + rotationValues.push_back(BitConverter::ToInt16BE(data, currentPtr)); + currentPtr += 2; + } + + currentPtr = rotationIndicesSeg; + + // Read the Rotation Indices + for (int i = 0; i < ((rawDataIndex - rotationIndicesSeg) / 6); i++) + { + rotationIndices.push_back(RotationIndex(BitConverter::ToInt16BE(data, currentPtr), BitConverter::ToInt16BE(data, currentPtr + 2), BitConverter::ToInt16BE(data, currentPtr + 4))); + currentPtr += 6; + } +} + +ZLinkAnimation::ZLinkAnimation() : ZAnimation() +{ + segmentAddress = 0; +} + +std::string ZLinkAnimation::GetSourceOutputCode(std::string prefix) +{ + if (parent != nullptr) + { + string segSymbol = segmentAddress == 0 ? "NULL" : parent->GetDeclarationName(segmentAddress, StringHelper::Sprintf("%sSeg%06X", name.c_str(), segmentAddress)); + string headerStr = StringHelper::Sprintf("%i, 0x%08X", + frameCount, segmentAddress); + parent->declarations[rawDataIndex] = new Declaration(DeclarationAlignment::None, 16, "LinkAnimationHeader", StringHelper::Sprintf("%s", name.c_str()), false, headerStr); + } + + return ""; +} + +int ZLinkAnimation::GetRawDataSize() +{ + return 8; +} + +ZLinkAnimation* ZLinkAnimation::ExtractFromXML(tinyxml2::XMLElement* reader, std::vector<uint8_t> nRawData, int rawDataIndex, std::string nRelPath) +{ + ZLinkAnimation* anim = new ZLinkAnimation(); + anim->rawData = nRawData; + anim->rawDataIndex = rawDataIndex; + anim->ParseXML(reader); + anim->ParseRawData(); + + return anim; +} + +void ZLinkAnimation::ParseRawData() +{ + ZAnimation::ParseRawData(); + + uint8_t* data = rawData.data(); + + //segmentAddress = SEG2FILESPACE(BitConverter::ToInt32BE(data, rawDataIndex + 4)); + segmentAddress = (BitConverter::ToInt32BE(data, rawDataIndex + 4)); +} diff --git a/ZAPD/ZAnimation.h b/ZAPD/ZAnimation.h index 2ca5096..db5847f 100644 --- a/ZAPD/ZAnimation.h +++ b/ZAPD/ZAnimation.h @@ -20,20 +20,49 @@ class ZAnimation : public ZResource public: int16_t frameCount; + + ZAnimation(); + + std::string GetSourceOutputCode(std::string prefix); +protected: + + virtual void ParseRawData(); + void Save(std::string outFolder); + void ParseXML(tinyxml2::XMLElement* reader); +}; + +class ZNormalAnimation : public ZAnimation +{ +public: std::vector<uint16_t> rotationValues; std::vector<RotationIndex> rotationIndices; uint32_t rotationValuesSeg; uint32_t rotationIndicesSeg; int16_t limit; - ZAnimation(); + ZNormalAnimation(); std::string GetSourceOutputCode(std::string prefix); + virtual int GetRawDataSize(); + + static ZNormalAnimation* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector<uint8_t> nRawData, int rawDataIndex, std::string nRelPath); - static ZAnimation* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector<uint8_t> nRawData, int rawDataIndex, std::string nRelPath); protected: + virtual void ParseRawData(); +}; - void ParseRawData(); - void Save(std::string outFolder); - void ParseXML(tinyxml2::XMLElement* reader); +class ZLinkAnimation : public ZAnimation +{ +public: + uint32_t segmentAddress; + + ZLinkAnimation(); + + std::string GetSourceOutputCode(std::string prefix); + virtual int GetRawDataSize(); + + static ZLinkAnimation* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector<uint8_t> nRawData, int rawDataIndex, std::string nRelPath); + +protected: + virtual void ParseRawData(); };
\ No newline at end of file diff --git a/ZAPD/ZCollision.cpp b/ZAPD/ZCollision.cpp index f1a17e0..2247c9c 100644 --- a/ZAPD/ZCollision.cpp +++ b/ZAPD/ZCollision.cpp @@ -122,6 +122,7 @@ ZCollisionHeader::ZCollisionHeader(ZFile* parent, std::string prefix, std::vecto for (int i = 0; i < vertices.size(); i++) { + sprintf(line, "{ %i, %i, %i }, // 0x%08X\n", vertices[i]->x, vertices[i]->y, vertices[i]->z, vtxSegmentOffset + (i * 6)); declaration += line; } diff --git a/ZAPD/ZDisplayList.cpp b/ZAPD/ZDisplayList.cpp index 588f01d..cc92b86 100644 --- a/ZAPD/ZDisplayList.cpp +++ b/ZAPD/ZDisplayList.cpp @@ -66,7 +66,7 @@ ZDisplayList::ZDisplayList(vector<uint8_t> nRawData, int nRawDataIndex, int rawD { fileData = nRawData; rawDataIndex = nRawDataIndex; - name = StringHelper::Sprintf("dlist0x%06X", rawDataIndex); + name = StringHelper::Sprintf("Dlist0x%06X", rawDataIndex); rawData = vector<uint8_t>(nRawData.data() + rawDataIndex, nRawData.data() + rawDataIndex + rawDataSize); ParseRawData(); } diff --git a/ZAPD/ZFile.cpp b/ZAPD/ZFile.cpp index 28eb322..fa4f081 100644 --- a/ZAPD/ZFile.cpp +++ b/ZAPD/ZFile.cpp @@ -172,7 +172,19 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, bool placeholderMode) ZAnimation* anim = nullptr; if (mode == ZFileMode::Extract) - anim = ZAnimation::ExtractFromXML(child, rawData, rawDataIndex, folderName); + anim = ZNormalAnimation::ExtractFromXML(child, rawData, rawDataIndex, folderName); + + anim->parent = this; + resources.push_back(anim); + + rawDataIndex += anim->GetRawDataSize(); + } + else if (string(child->Name()) == "PlayerAnimation") + { + ZLinkAnimation* anim = nullptr; + + if (mode == ZFileMode::Extract) + anim = ZLinkAnimation::ExtractFromXML(child, rawData, rawDataIndex, folderName); anim->parent = this; resources.push_back(anim); diff --git a/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp b/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp index a72d98d..7141abf 100644 --- a/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp +++ b/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp @@ -9,7 +9,7 @@ using namespace std; SetCollisionHeader::SetCollisionHeader(ZRoom* nZRoom, std::vector<uint8_t> rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) { segmentOffset = SEG2FILESPACE(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); - collisionHeader = ZCollisionHeader(nZRoom->parent, StringHelper::Sprintf("%sCollisionHeader", nZRoom->GetName().c_str()), rawData, segmentOffset); + collisionHeader = ZCollisionHeader(nZRoom->parent, StringHelper::Sprintf("%sCollisionHeader0x%06X", nZRoom->GetName().c_str(), segmentOffset), rawData, segmentOffset); } string SetCollisionHeader::GenerateSourceCodePass1(string roomName, int baseAddress) @@ -29,7 +29,7 @@ string SetCollisionHeader::GetCommandCName() string SetCollisionHeader::GenerateExterns() { - return StringHelper::Sprintf("extern CollisionHeader %sCollisionHeader0x%06X;\n", zRoom->GetName().c_str(), segmentOffset); + return ""; } RoomCommand SetCollisionHeader::GetRoomCommand() diff --git a/ZAPD/ZRoom/Commands/SetMesh.cpp b/ZAPD/ZRoom/Commands/SetMesh.cpp index a362c1f..5902a93 100644 --- a/ZAPD/ZRoom/Commands/SetMesh.cpp +++ b/ZAPD/ZRoom/Commands/SetMesh.cpp @@ -104,7 +104,7 @@ SetMesh::SetMesh(ZRoom* nZRoom, std::vector<uint8_t> rawData, int rawDataIndex, //declaration += "static u32 terminatorMaybe = 0x01000000; // This always appears after the mesh entries. Its purpose is not clear.\n"; zRoom->parent->AddDeclarationArray(meshHeader0->dListStart, DeclarationAlignment::None, DeclarationPadding::None, (meshHeader0->entries.size() * 8) + 0, "MeshEntry0", - StringHelper::Sprintf("%sMeshDListEntry", zRoom->GetName().c_str(), meshHeader0->dListStart), meshHeader0->entries.size(), declaration); + StringHelper::Sprintf("%sMeshDListEntry0x%06X", zRoom->GetName().c_str(), meshHeader0->dListStart), meshHeader0->entries.size(), declaration); zRoom->parent->AddDeclaration(meshHeader0->dListStart + (meshHeader0->entries.size() * 8) + 0, DeclarationAlignment::None, DeclarationPadding::Pad16, 4, "static s32", "terminatorMaybe", " 0x01000000 "); @@ -297,7 +297,7 @@ void SetMesh::GenDListDeclarations(std::vector<uint8_t> rawData, ZDisplayList* d string srcVarName = ""; if (Globals::Instance->includeFilePrefix) - srcVarName = StringHelper::Sprintf("%s_%s", zRoom->GetName().c_str(), dList->GetName().c_str()); + srcVarName = StringHelper::Sprintf("%s%s", zRoom->GetName().c_str(), dList->GetName().c_str()); else srcVarName = StringHelper::Sprintf("%s", dList->GetName().c_str()); @@ -345,7 +345,7 @@ std::string SetMesh::GenDListExterns(ZDisplayList* dList) sourceOutput += GenDListExterns(otherDList); for (pair<uint32_t, string> vtxEntry : dList->vtxDeclarations) - sourceOutput += StringHelper::Sprintf("extern Vtx_t %sVertices0x%06X[%i];\n", zRoom->GetName().c_str(), vtxEntry.first, dList->vertices[vtxEntry.first].size()); + sourceOutput += StringHelper::Sprintf("extern Vtx %sVertices0x%06X[%i];\n", zRoom->GetName().c_str(), vtxEntry.first, dList->vertices[vtxEntry.first].size()); for (pair<uint32_t, string> texEntry : dList->texDeclarations) sourceOutput += StringHelper::Sprintf("extern u64 %sTex0x%06X[];\n", zRoom->GetName().c_str(), texEntry.first); diff --git a/ZAPD/ZRoom/Commands/SetRoomList.cpp b/ZAPD/ZRoom/Commands/SetRoomList.cpp index e0f8d8e..7adefd4 100644 --- a/ZAPD/ZRoom/Commands/SetRoomList.cpp +++ b/ZAPD/ZRoom/Commands/SetRoomList.cpp @@ -74,7 +74,7 @@ std::string SetRoomList::PreGenSourceFiles() if (res->GetResourceType() == ZResourceType::Room && res != zRoom) { string roomName = res->GetName(); - declaration += StringHelper::Sprintf("\t{ (u32)%sSegmentRomStart, (u32)%sSegmentRomEnd },\n", roomName.c_str(), roomName.c_str()); + declaration += StringHelper::Sprintf("\t{ (u32)_%sSegmentRomStart, (u32)_%sSegmentRomEnd },\n", roomName.c_str(), roomName.c_str()); } } } |
