diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/factories/sf64/AnimFactory.cpp | 35 | ||||
| -rw-r--r-- | src/factories/sf64/SkeletonFactory.cpp | 98 |
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++; |
