summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpetrie911 <petrie911@yahoo.com>2024-03-11 19:42:39 -0500
committerLywx <kiritodev01@gmail.com>2024-03-11 18:47:16 -0600
commite4608e57763f86b8326422c8011db43d8b8d9b95 (patch)
treed4ac0a74c275c927540b97d50b865c7a8163a4cb /src
parent5576a7af964f2a7ec15ba7a3a9f56d8a1abfc3e4 (diff)
fix dlists and some other things
Diffstat (limited to 'src')
-rw-r--r--src/factories/sf64/AnimFactory.cpp35
-rw-r--r--src/factories/sf64/SkeletonFactory.cpp98
2 files changed, 95 insertions, 38 deletions
diff --git a/src/factories/sf64/AnimFactory.cpp b/src/factories/sf64/AnimFactory.cpp
index f054d76..c0df138 100644
--- a/src/factories/sf64/AnimFactory.cpp
+++ b/src/factories/sf64/AnimFactory.cpp
@@ -6,19 +6,20 @@
#define NUM(x) std::dec << std::setfill(' ') << std::setw(7) << x
#define NUM_JOINT(x) std::dec << std::setfill(' ') << std::setw(5) << x
+#define VEC_SIZE(vec) ((vec).size() * sizeof((vec)[0]))
-SF64::AnimData::AnimData(int16_t frameCount, int16_t limbCount, uint32_t dataOffset, std::vector<int16_t> frameData, uint32_t keyOffset, std::vector<JointKey> jointKeys): mFrameCount(frameCount), mLimbCount(limbCount), mDataOffset(dataOffset), mFrameData(std::move(frameData)), mKeyOffset(keyOffset), mJointKeys(std::move(jointKeys)) {
- if((mDataOffset + sizeof(mFrameData) > mKeyOffset) && (mKeyOffset + sizeof(mJointKeys) > mDataOffset)) {
- SPDLOG_ERROR("Data and Key offsets overlap");
+SF64::AnimData::AnimData(int16_t frameCount, int16_t limbCount, uint32_t dataOffset, std::vector<int16_t> frameData, uint32_t keyOffset, std::vector<SF64::JointKey> jointKeys): mFrameCount(frameCount), mLimbCount(limbCount), mDataOffset(dataOffset), mFrameData(std::move(frameData)), mKeyOffset(keyOffset), mJointKeys(std::move(jointKeys)) {
+ if((mDataOffset + VEC_SIZE(mFrameData) > mKeyOffset) && (mKeyOffset + VEC_SIZE(mJointKeys) > mDataOffset)) {
+ SPDLOG_ERROR("SF64:ANIM error: Data and Key offsets overlap");
}
if(mJointKeys.size() != limbCount + 1) {
- SPDLOG_ERROR("Joint Key count does not match Limb count");
+ SPDLOG_ERROR("SF64:ANIM error: Joint Key count does not match Limb count");
}
if(frameData.size() > 0 && frameData[0] != 0){
- SPDLOG_INFO("Found non-zero frame data on first frame");
+ SPDLOG_INFO("SF64:ANIM alert: Found non-zero frame data on first frame");
}
if(jointKeys.size() > 0 && jointKeys[0].keys[1] != 0){
- SPDLOG_INFO("Found non-zero joint key on first frame");
+ SPDLOG_INFO("SF64:ANIM alert: Found non-zero joint key on first frame");
}
}
@@ -51,18 +52,18 @@ void SF64::AnimCodeExporter::Export(std::ostream &write, std::shared_ptr<IParsed
dataOffset = SEGMENT_OFFSET(dataOffset);
}
- dataDefaultName << symbol << "_frame_data_" << std::hex << dataOffset;
+ dataDefaultName << symbol << "_frame_data_" << std::uppercase << std::hex << dataOffset;
auto dataName = GetSafeNode(node, "data_symbol", dataDefaultName.str());
if (IS_SEGMENTED(keyOffset)) {
keySegment = SEGMENT_NUMBER(keyOffset);
keyOffset = SEGMENT_OFFSET(keyOffset);
}
- keyDefaultName << symbol << "_joint_key_" << std::hex << keyOffset;
+ keyDefaultName << symbol << "_joint_key_" << std::uppercase << std::hex << keyOffset;
auto keyName = GetSafeNode(node, "data_symbol", keyDefaultName.str());
if (Companion::Instance->IsDebug()) {
- write << "// 0x" << std::hex << std::uppercase << offset << "\n";
+ write << "// 0x" << std::uppercase << std::hex << dataOffset << "\n";
}
write << "u16 " << dataName << "[] = {";
@@ -86,11 +87,21 @@ void SF64::AnimCodeExporter::Export(std::ostream &write, std::shared_ptr<IParsed
write << "Animation " << symbol << " = {\n";
write << fourSpaceTab << anim->mFrameCount << ", " << anim->mLimbCount << ", " << dataName << ", " << keyName << ",\n";
- write << "};\n\n";
+ write << "};\n";
+
+ if (Companion::Instance->IsDebug()) {
+ int off = offset + 0xC;
+ if(IS_SEGMENTED(off)) {
+ off = SEGMENT_OFFSET(off);
+ }
+ write << "// 0x" << std::uppercase << std::hex << off << "\n";
+ }
+
+ write<< "\n";
}
void SF64::AnimBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
- auto anim = std::static_pointer_cast<AnimData>(raw);
+ auto anim = std::static_pointer_cast<SF64::AnimData>(raw);
auto writer = LUS::BinaryWriter();
WriteHeader(writer, LUS::ResourceType::AnimData, 0);
@@ -160,5 +171,5 @@ std::optional<std::shared_ptr<IParsedData>> SF64::AnimFactory::parse(std::vector
frameData.push_back(dataReader.ReadInt16());
}
- return std::make_shared<AnimData>(frameCount, limbCount, dataOffset, frameData, keyOffset, jointKeys);
+ return std::make_shared<SF64::AnimData>(frameCount, limbCount, dataOffset, frameData, keyOffset, jointKeys);
}
diff --git a/src/factories/sf64/SkeletonFactory.cpp b/src/factories/sf64/SkeletonFactory.cpp
index 61af167..fe0fab0 100644
--- a/src/factories/sf64/SkeletonFactory.cpp
+++ b/src/factories/sf64/SkeletonFactory.cpp
@@ -3,6 +3,7 @@
#include "Companion.h"
#include "utils/Decompressor.h"
+#include "utils/TorchUtils.h"
#define NUM(x) std::dec << std::setfill(' ') << std::setw(7) << x
#define NUM_JOINT(x) std::dec << std::setfill(' ') << std::setw(5) << x
@@ -30,6 +31,13 @@ void SF64::SkeletonCodeExporter::Export(std::ostream &write, std::shared_ptr<IPa
std::sort(limbs.begin(), limbs.end(), [](SF64::LimbData a, SF64::LimbData b) {return a.mAddr < b.mAddr;});
std::map<uint32_t, std::string> limbDict;
+ if (Companion::Instance->IsDebug()) {
+ int off = limbs[0].mAddr;
+ if (IS_SEGMENTED(off)) {
+ off = SEGMENT_OFFSET(off);
+ }
+ write << "// 0x" << std::hex << std::uppercase << off << "\n";
+ }
limbDict[0] = "NULL";
for(SF64::LimbData limb : limbs) {
std::ostringstream limbDefaultName;
@@ -37,17 +45,24 @@ void SF64::SkeletonCodeExporter::Export(std::ostream &write, std::shared_ptr<IPa
if(IS_SEGMENTED(limbOffset)){
limbOffset = SEGMENT_OFFSET(limbOffset);
}
- limbDefaultName << symbol << "_limb_" << std::dec << limb.mIndex << "_" << std::hex << limbOffset;
+ limbDefaultName << symbol << "_limb_" << std::dec << limb.mIndex << "_" << std::uppercase << std::hex << limbOffset;
limbDict[limb.mAddr] = limbDefaultName.str();
}
for(SF64::LimbData limb : limbs) {
write << "Limb " << limbDict[limb.mAddr] << " = {\n";
-
- if(limb.mDList != 0) {
- write << fourSpaceTab << "0x" << std::hex << limb.mDList << ", ";
+ write << fourSpaceTab;
+ if(limb.mDList == 0) {
+ write << "NULL, ";
} else {
- write << fourSpaceTab << "NULL, ";
+ auto dec = Companion::Instance->GetNodeByAddr(limb.mDList);
+ if(dec.has_value()){
+ auto node = std::get<1>(dec.value());
+ auto symbol = GetSafeNode<std::string>(node, "symbol");
+ write << symbol << ", ";
+ } else {
+ write << "0x" << std::uppercase << std::hex << limb.mDList << ", ";
+ }
}
write << "{ " << limb.mTx << ", " << limb.mTy << ", " << limb.mTz << "}, ";
write << "{ " << std::dec << limb.mRx << ", " << limb.mRy << ", " << limb.mRz << "}, ";
@@ -58,7 +73,7 @@ void SF64::SkeletonCodeExporter::Export(std::ostream &write, std::shared_ptr<IPa
write << "Limb* " << symbol << "[] = {";
for(int i = 0; i <= skeleton->mSkeleton.size(); i++) {
- if ((i % 6) == 0) {
+ if ((i % 4) == 0) {
write << "\n" << fourSpaceTab;
}
if (i == skeleton->mSkeleton.size()) {
@@ -67,28 +82,21 @@ void SF64::SkeletonCodeExporter::Export(std::ostream &write, std::shared_ptr<IPa
write << "&" << limbDict[skeleton->mSkeleton[i].mAddr] << ", ";
}
}
- write << "\n};\n\n";
+ write << "\n};\n";
+ if (Companion::Instance->IsDebug()) {
+ int sz = (skeleton->mSkeleton.size() * 0x24) + 4;
+ int off = limbs[0].mAddr;;
+ if (IS_SEGMENTED(off)) {
+ off = SEGMENT_OFFSET(off);
+ }
+ write << "// Limbs: " << std::dec << skeleton->mSkeleton.size() << "\n";
+ write << "// 0x" << std::hex << std::uppercase << (off + sz) << "\n";
+ }
+ write << "\n";
}
void SF64::SkeletonBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
- // auto anim = std::static_pointer_cast<AnimData>(raw);
- // auto writer = LUS::BinaryWriter();
-
- // WriteHeader(writer, LUS::ResourceType::AnimData, 0);
- // writer.Write(anim->mFrameCount);
- // writer.Write(anim->mLimbCount);
- // writer.Write((uint32_t) anim->mFrameData.size());
- // writer.Write((uint32_t) anim->mJointKeys.size());
-
- // for(auto joint : anim->mJointKeys) {
- // for (int i = 0; i < 6; i++) {
- // writer.Write(joint.keys[i]);
- // }
- // }
- // for(auto data : anim->mFrameData) {
- // writer.Write(data);
- // }
- // writer.Finish(write);
+
}
std::optional<std::shared_ptr<IParsedData>> SF64::SkeletonFactory::parse(std::vector<uint8_t>& buffer, YAML::Node& node) {
@@ -104,7 +112,7 @@ std::optional<std::shared_ptr<IParsedData>> SF64::SkeletonFactory::parse(std::ve
while(limbAddr != 0) {
limbNode["offset"] = limbAddr;
- // std::cout << std::dec << limbIndex << ": 0x" << std::hex << limbAddr << "\n";
+
DecompressedData limbDataRaw = Decompressor::AutoDecode(limbNode, buffer, 0x20);
LUS::BinaryReader limbReader(limbDataRaw.segment.data, limbDataRaw.segment.size);
limbReader.SetEndianness(LUS::Endianness::Big);
@@ -120,6 +128,44 @@ std::optional<std::shared_ptr<IParsedData>> SF64::SkeletonFactory::parse(std::ve
auto siblingAddr = limbReader.ReadUInt32();
auto childAddr = limbReader.ReadUInt32();
+ if(dListAddr != 0 && (SEGMENT_NUMBER(dListAddr) == SEGMENT_NUMBER(limbAddr))) {
+ const auto decl = Companion::Instance->GetNodeByAddr(dListAddr);
+
+ if(!decl.has_value()){
+ SPDLOG_INFO("Addr to Display list command at 0x{:X} not in yaml, autogenerating it", dListAddr);
+
+ auto rom = Companion::Instance->GetRomData();
+ auto factory = Companion::Instance->GetFactory("GFX")->get();
+
+ std::string output;
+ YAML::Node dl;
+ uint32_t ptr = dListAddr;
+
+ if(Decompressor::IsSegmented(dListAddr)){
+ SPDLOG_INFO("Found segmented display list at 0x{:X}", dListAddr);
+ output = Companion::Instance->NormalizeAsset("seg" + std::to_string(SEGMENT_NUMBER(ptr)) +"_dl_" + Torch::to_hex(SEGMENT_OFFSET(ptr), false));
+ } else {
+ SPDLOG_INFO("Found display list at 0x{:X}", ptr);
+ output = Companion::Instance->NormalizeAsset("dl_" + Torch::to_hex(ptr, false));
+ }
+
+ dl["type"] = "GFX";
+ dl["offset"] = ptr;
+ dl["symbol"] = output;
+ dl["autogen"] = true;
+
+ auto result = factory->parse(rom, dl);
+
+ if(!result.has_value()){
+ continue;
+ }
+
+ Companion::Instance->RegisterAsset(output, dl);
+ } else {
+ SPDLOG_WARN("Could not find display list at 0x{:X}", dListAddr);
+ }
+ }
+
skeleton.push_back(LimbData(limbAddr, dListAddr, tx, ty, tz, rx, ry, rz, siblingAddr, childAddr, limbIndex));
limbAddr = reader.ReadUInt32();
limbIndex++;