summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ZAPD/HighLevel/HLAnimationIntermediette.cpp8
-rw-r--r--ZAPD/Main.cpp4
-rw-r--r--ZAPD/ZAnimation.cpp138
-rw-r--r--ZAPD/ZAnimation.h39
-rw-r--r--ZAPD/ZCollision.cpp1
-rw-r--r--ZAPD/ZDisplayList.cpp2
-rw-r--r--ZAPD/ZFile.cpp14
-rw-r--r--ZAPD/ZRoom/Commands/SetCollisionHeader.cpp4
-rw-r--r--ZAPD/ZRoom/Commands/SetMesh.cpp6
-rw-r--r--ZAPD/ZRoom/Commands/SetRoomList.cpp2
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());
}
}
}