diff options
| author | inspectredc <inspectredc@gmail.com> | 2024-04-04 22:29:55 +0100 |
|---|---|---|
| committer | Lywx <kiritodev01@gmail.com> | 2024-04-04 16:00:59 -0600 |
| commit | 53eec1f33a761a2dac032c94bfd9856c00014747 (patch) | |
| tree | ce93d16522ffffe524ee43c6fe29b14487b2a807 | |
| parent | 378575792b9f0eeddae6e9fa53e1412d129a89a5 (diff) | |
exporters
| -rw-r--r-- | src/Companion.cpp | 2 | ||||
| -rw-r--r-- | src/Companion.h | 2 | ||||
| -rw-r--r-- | src/factories/ResourceType.h | 8 | ||||
| -rw-r--r-- | src/factories/Vec3fFactory.cpp | 14 | ||||
| -rw-r--r-- | src/factories/Vec3sFactory.cpp | 14 | ||||
| -rw-r--r-- | src/factories/sf64/ColPolyFactory.cpp | 24 | ||||
| -rw-r--r-- | src/factories/sf64/EnvSettingsFactory.cpp | 25 | ||||
| -rw-r--r-- | src/factories/sf64/ScriptFactory.cpp | 50 | ||||
| -rw-r--r-- | src/factories/sf64/SkeletonFactory.cpp | 66 | ||||
| -rw-r--r-- | src/factories/sf64/TriangleFactory.cpp | 14 |
10 files changed, 216 insertions, 3 deletions
diff --git a/src/Companion.cpp b/src/Companion.cpp index 172ad81..1ad9e64 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -163,6 +163,8 @@ void Companion::ParseEnums(std::string& header) { void Companion::ExtractNode(YAML::Node& node, std::string& name, SWrapper* binary) { std::ostringstream stream; + this->gCurrentWrapper = binary; + auto type = GetSafeNode<std::string>(node, "type"); std::transform(type.begin(), type.end(), type.begin(), ::toupper); diff --git a/src/Companion.h b/src/Companion.h index 6f687c2..4319587 100644 --- a/src/Companion.h +++ b/src/Companion.h @@ -118,6 +118,7 @@ public: std::string NormalizeAsset(const std::string& name) const; TorchConfig& GetConfig() { return this->gConfig; } + SWrapper* GetCurrentWrapper() { return this->gCurrentWrapper; } std::optional<std::tuple<std::string, YAML::Node>> RegisterAsset(const std::string& name, YAML::Node& node); std::optional<YAML::Node> AddAsset(YAML::Node asset); @@ -132,6 +133,7 @@ private: YAML::Node gHashNode; std::shared_ptr<N64::Cartridge> gCartridge; std::unordered_map<std::string, std::unordered_map<int32_t, std::string>> gEnums; + SWrapper* gCurrentWrapper; // Temporal Variables std::string gCurrentFile; diff --git a/src/factories/ResourceType.h b/src/factories/ResourceType.h index a10dde0..3c44c5e 100644 --- a/src/factories/ResourceType.h +++ b/src/factories/ResourceType.h @@ -19,6 +19,8 @@ enum class ResourceType { Sample = 0x41554643, // AIFC Sequence = 0x53455143, // SEQC Lights = 0x46669697, // LGTS + Vec3f = 0x56433346, // VC3F + Vec3s = 0x56433353, // VC3S // SM64 Anim = 0x414E494D, // ANIM @@ -36,10 +38,14 @@ enum class ResourceType { // SF64 AnimData = 0x414E494D, // ANIM - Message = 0x4D53474C, // MSG + ColPoly = 0x43504C59, // CPLY + EnvSettings = 0x454E5653, // ENVS + Limb = 0x4C494D42, // LIMB + Message = 0x4D534720, // MSG MessageTable = 0x4D534754, // MSGT Skeleton = 0x534B454C, // SKEL Script = 0x53435250, // SCRP + ScriptCmd = 0x53434D44, // SCMD Hitbox = 0x48544258, // HTBX ObjectInit = 0x4F42494E, // OBIN }; diff --git a/src/factories/Vec3fFactory.cpp b/src/factories/Vec3fFactory.cpp index 32854b3..ef55dcc 100644 --- a/src/factories/Vec3fFactory.cpp +++ b/src/factories/Vec3fFactory.cpp @@ -59,6 +59,20 @@ ExportResult Vec3fCodeExporter::Export(std::ostream &write, std::shared_ptr<IPar } ExportResult Vec3fBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + auto writer = LUS::BinaryWriter(); + auto vecData = std::static_pointer_cast<Vec3fData>(raw); + + WriteHeader(writer, LUS::ResourceType::Vec3f, 0); + writer.Write((uint32_t) vecData->mVecs.size()); + + for(Vec3f v : vecData->mVecs) { + auto [x, y, z] = v; + writer.Write(x); + writer.Write(y); + writer.Write(z); + } + + writer.Finish(write); return std::nullopt; } diff --git a/src/factories/Vec3sFactory.cpp b/src/factories/Vec3sFactory.cpp index 7e62d89..60bba9f 100644 --- a/src/factories/Vec3sFactory.cpp +++ b/src/factories/Vec3sFactory.cpp @@ -57,6 +57,20 @@ ExportResult Vec3sCodeExporter::Export(std::ostream &write, std::shared_ptr<IPar } ExportResult Vec3sBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + auto writer = LUS::BinaryWriter(); + auto vecData = std::static_pointer_cast<Vec3sData>(raw); + + WriteHeader(writer, LUS::ResourceType::Vec3s, 0); + writer.Write((uint32_t) vecData->mVecs.size()); + + for(Vec3s v : vecData->mVecs) { + auto [x, y, z] = v; + writer.Write(x); + writer.Write(y); + writer.Write(z); + } + + writer.Finish(write); return std::nullopt; } diff --git a/src/factories/sf64/ColPolyFactory.cpp b/src/factories/sf64/ColPolyFactory.cpp index 7ce4d1a..b4f739f 100644 --- a/src/factories/sf64/ColPolyFactory.cpp +++ b/src/factories/sf64/ColPolyFactory.cpp @@ -63,6 +63,30 @@ ExportResult SF64::ColPolyCodeExporter::Export(std::ostream &write, std::shared_ } ExportResult SF64::ColPolyBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + auto writer = LUS::BinaryWriter(); + auto colpolys = std::static_pointer_cast<SF64::ColPolyData>(raw); + + WriteHeader(writer, LUS::ResourceType::ColPoly, 0); + + writer.Write((uint32_t) colpolys->mPolys.size()); + + for(auto &poly : colpolys->mPolys) { + writer.Write(poly.tri.x); + writer.Write(poly.tri.y); + writer.Write(poly.tri.z); + if (poly.unk_06 != 0) { + SPDLOG_ERROR("SF64:COLPOLY error: Nonzero value found in padding"); + } + writer.Write(poly.norm.x); + writer.Write(poly.norm.y); + writer.Write(poly.norm.z); + if (poly.unk_0E != 0) { + SPDLOG_ERROR("SF64:COLPOLY error: Nonzero value found in padding"); + } + writer.Write(poly.dist); + } + + writer.Finish(write); return std::nullopt; } diff --git a/src/factories/sf64/EnvSettingsFactory.cpp b/src/factories/sf64/EnvSettingsFactory.cpp index a75912b..73b3f89 100644 --- a/src/factories/sf64/EnvSettingsFactory.cpp +++ b/src/factories/sf64/EnvSettingsFactory.cpp @@ -54,6 +54,31 @@ ExportResult SF64::EnvSettingsCodeExporter::Export(std::ostream &write, std::sha } ExportResult SF64::EnvSettingsBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + auto writer = LUS::BinaryWriter(); + auto envSettings = std::static_pointer_cast<SF64::EnvSettingsData>(raw); + + WriteHeader(writer, LUS::ResourceType::EnvSettings, 0); + + writer.Write(envSettings->mType); + writer.Write(envSettings->mUnk_04); + writer.Write(envSettings->mBgColor); + writer.Write(envSettings->mSeqId); + writer.Write(envSettings->mFogR); + writer.Write(envSettings->mFogG); + writer.Write(envSettings->mFogB); + writer.Write(envSettings->mFogN); + writer.Write(envSettings->mFogF); + writer.Write(envSettings->mUnk_20.x); + writer.Write(envSettings->mUnk_20.y); + writer.Write(envSettings->mUnk_20.z); + writer.Write(envSettings->mLightR); + writer.Write(envSettings->mLightG); + writer.Write(envSettings->mLightB); + writer.Write(envSettings->mAmbR); + writer.Write(envSettings->mAmbG); + writer.Write(envSettings->mAmbB); + + writer.Finish(write); return std::nullopt; } diff --git a/src/factories/sf64/ScriptFactory.cpp b/src/factories/sf64/ScriptFactory.cpp index 190cee0..d44a103 100644 --- a/src/factories/sf64/ScriptFactory.cpp +++ b/src/factories/sf64/ScriptFactory.cpp @@ -5,6 +5,8 @@ #include "utils/Decompressor.h" #include "utils/TorchUtils.h" +#include "storm/SWrapper.h" + SF64::ScriptData::ScriptData(std::vector<uint32_t> ptrs, std::vector<uint16_t> cmds, std::map<uint32_t, int> sizeMap, uint32_t ptrsStart, uint32_t cmdsStart): mPtrs(ptrs), mCmds(cmds), mSizeMap(sizeMap), mPtrsStart(ptrsStart), mCmdsStart(cmdsStart) { } @@ -138,6 +140,54 @@ ExportResult SF64::ScriptCodeExporter::Export(std::ostream &write, std::shared_p } ExportResult SF64::ScriptBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + const auto symbol = GetSafeNode(node, "symbol", entryName); + auto scriptWriter = LUS::BinaryWriter(); + auto script = std::static_pointer_cast<SF64::ScriptData>(raw); + auto sortedPtrs = script->mPtrs; + std::sort(sortedPtrs.begin(), sortedPtrs.end()); + uint32_t ptrCount = 0; + uint32_t cmdIndex = 0; + std::unordered_map<uint32_t, uint64_t> ptrMap; + + // Export Commands and Populate Hashes Map + for (auto ptr : sortedPtrs) { + auto wrapper = Companion::Instance->GetCurrentWrapper(); + std::ostringstream stream; + stream.str(""); + stream.clear(); + + auto cmdWriter = LUS::BinaryWriter(); + WriteHeader(cmdWriter, LUS::ResourceType::ScriptCmd, 0); + + auto cmdCount = script->mSizeMap.at(ptr) / 2; + cmdWriter.Write((uint32_t) cmdCount); + + // Writing in pairs for readability + for (uint32_t i = 0; i < cmdCount; ++i) { + cmdWriter.Write(script->mCmds.at(cmdIndex++)); + cmdWriter.Write(script->mCmds.at(cmdIndex++)); + } + + cmdWriter.Finish(stream); + + auto data = stream.str(); + wrapper->CreateFile(entryName + "_cmd_" + std::to_string(ptrCount), std::vector(data.begin(), data.end())); + + std::ostringstream cmdName; + cmdName << symbol << "_cmd_" << std::dec << ptrCount; + ptrMap[ptr] = CRC64(cmdName.str().c_str()); + ptrCount++; + } + + // Export Script + WriteHeader(scriptWriter, LUS::ResourceType::Script, 0); + scriptWriter.Write((uint32_t) script->mPtrs.size()); + for (auto &ptr : script->mPtrs) { + scriptWriter.Write(ptrMap.at(ptr)); + } + + scriptWriter.Finish(write); + return std::nullopt; } diff --git a/src/factories/sf64/SkeletonFactory.cpp b/src/factories/sf64/SkeletonFactory.cpp index 0efce32..0671455 100644 --- a/src/factories/sf64/SkeletonFactory.cpp +++ b/src/factories/sf64/SkeletonFactory.cpp @@ -5,6 +5,8 @@ #include "utils/Decompressor.h" #include "utils/TorchUtils.h" +#include "storm/SWrapper.h" + #define NUM(x, w) std::dec << std::setfill(' ') << std::setw(w) << x // #define NUM_JOINT(x) std::dec << std::setfill(' ') << std::setw(5) << x #define FLOAT(x, w, p) std::dec << std::setfill(' ') << std::setw(w) << std::fixed << std::setprecision(p) << x @@ -31,7 +33,7 @@ ExportResult SF64::SkeletonCodeExporter::Export(std::ostream &write, std::shared auto skeleton = std::static_pointer_cast<SF64::SkeletonData>(raw); auto limbs = skeleton->mSkeleton; std::sort(limbs.begin(), limbs.end(), [](SF64::LimbData a, SF64::LimbData b) {return a.mAddr < b.mAddr;}); - std::map<uint32_t, std::string> limbDict; + std::unordered_map<uint32_t, std::string> limbDict; limbDict[0] = "NULL"; for(SF64::LimbData limb : limbs) { @@ -87,12 +89,72 @@ ExportResult SF64::SkeletonCodeExporter::Export(std::ostream &write, std::shared } ExportResult SF64::SkeletonBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + const auto symbol = GetSafeNode(node, "symbol", entryName); + auto skeletonWriter = LUS::BinaryWriter(); + auto skeleton = std::static_pointer_cast<SF64::SkeletonData>(raw); + auto limbs = skeleton->mSkeleton; + std::unordered_map<uint32_t, uint64_t> limbDict; + + // Populate map of limbs with hashes + for (auto &limb : limbs) { + std::ostringstream limbDefaultName; + limbDefaultName << symbol << "_limb_" << std::dec << limb.mIndex; + limbDict[limb.mAddr] = CRC64(limbDefaultName.str().c_str()); + } + + // Export Each Limb + for (auto &limb : limbs) { + auto wrapper = Companion::Instance->GetCurrentWrapper(); + std::ostringstream stream; + stream.str(""); + stream.clear(); + + auto limbWriter = LUS::BinaryWriter(); + WriteHeader(limbWriter, LUS::ResourceType::Limb, 0); + uint64_t hash = 0; + if (limb.mDList != 0) { + auto dec = Companion::Instance->GetNodeByAddr(limb.mDList); + if (dec.has_value()){ + hash = CRC64(std::get<0>(dec.value()).c_str()); + SPDLOG_INFO("Found display list: 0x{:X} Hash: 0x{:X} Path: {}", limb.mDList, hash, std::get<0>(dec.value())); + } else { + SPDLOG_WARN("Could not find dlist at 0x{:X}", limb.mDList); + } + } + limbWriter.Write(hash); + auto [transX, transY, transZ] = limb.mTrans; + limbWriter.Write(transX); + limbWriter.Write(transY); + limbWriter.Write(transZ); + auto [rotX, rotY, rotZ] = limb.mRot; + limbWriter.Write(rotX); + limbWriter.Write(rotY); + limbWriter.Write(rotZ); + uint64_t sibling = (limb.mSibling != 0) ? limbDict.at(limb.mSibling) : 0; + limbWriter.Write(sibling); + uint64_t child = (limb.mChild != 0) ? limbDict.at(limb.mChild) : 0; + limbWriter.Write(child); + limbWriter.Finish(stream); + + auto data = stream.str(); + wrapper->CreateFile(entryName + "_limb_" + std::to_string(limb.mIndex), std::vector(data.begin(), data.end())); + } + + // Export Skeleton + WriteHeader(skeletonWriter, LUS::ResourceType::Skeleton, 0); + skeletonWriter.Write((uint32_t) limbs.size()); + for (auto &limb : limbs) { + skeletonWriter.Write(limbDict.at(limb.mAddr)); + } + + skeletonWriter.Finish(write); + + return std::nullopt; } std::optional<std::shared_ptr<IParsedData>> SF64::SkeletonFactory::parse(std::vector<uint8_t>& buffer, YAML::Node& node) { std::vector<SF64::LimbData> skeleton; - std::map<std::string, std::string> limbDict; auto [root, segment] = Decompressor::AutoDecode(node, buffer, 0x1000); LUS::BinaryReader reader(segment.data, segment.size); reader.SetEndianness(LUS::Endianness::Big); diff --git a/src/factories/sf64/TriangleFactory.cpp b/src/factories/sf64/TriangleFactory.cpp index d379264..db77405 100644 --- a/src/factories/sf64/TriangleFactory.cpp +++ b/src/factories/sf64/TriangleFactory.cpp @@ -52,6 +52,20 @@ ExportResult SF64::TriangleCodeExporter::Export(std::ostream &write, std::shared } ExportResult SF64::TriangleBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + auto writer = LUS::BinaryWriter(); + auto triData = std::static_pointer_cast<TriangleData>(raw); + + WriteHeader(writer, LUS::ResourceType::Vec3s, 0); + writer.Write((uint32_t) triData->mTris.size()); + + for(Vec3s tri : triData->mTris) { + auto [x, y, z] = tri; + writer.Write(x); + writer.Write(y); + writer.Write(z); + } + + writer.Finish(write); return std::nullopt; } |
