diff options
| author | briaguya <70942617+briaguya0@users.noreply.github.com> | 2026-07-24 18:09:55 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-24 18:09:55 -0400 |
| commit | 4cae44160693e1beb562e39dc301bd42278be1f9 (patch) | |
| tree | 5d247f7821a6040221b4bf34d2cae2b87c42d23a /src/factories/oot/OoTSceneUtils.cpp | |
| parent | cd33252589a61d044138f449041a87adee2a8291 (diff) | |
oot support (#219)
Diffstat (limited to 'src/factories/oot/OoTSceneUtils.cpp')
| -rw-r--r-- | src/factories/oot/OoTSceneUtils.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/factories/oot/OoTSceneUtils.cpp b/src/factories/oot/OoTSceneUtils.cpp new file mode 100644 index 0000000..ee0a301 --- /dev/null +++ b/src/factories/oot/OoTSceneUtils.cpp @@ -0,0 +1,52 @@ +#include "OoTSceneUtils.h" + +namespace OoT { + +LUS::BinaryReader ReadSubArray(std::vector<uint8_t>& buffer, uint32_t segAddr, uint32_t size) { + YAML::Node node; + node["offset"] = Companion::Instance->PatchVirtualAddr(segAddr); + auto raw = Decompressor::AutoDecode(node, buffer, size); + LUS::BinaryReader reader(raw.segment.data, raw.segment.size); + reader.SetEndianness(Torch::Endianness::Big); + return reader; +} + +std::string ResolvePointer(uint32_t ptr) { + if (ptr == 0) return ""; + ptr = Companion::Instance->PatchVirtualAddr(ptr); + auto result = Companion::Instance->GetStringByAddr(ptr); + if (result.has_value()) return result.value(); + return ""; +} + +std::string MakeAssetName(const std::string& baseName, const std::string& suffix, uint32_t offset) { + std::ostringstream ss; + ss << baseName << suffix << "_" << std::uppercase << std::hex + << std::setfill('0') << std::setw(6) << offset; + return ss.str(); +} + +std::vector<char> SerializePathways(std::vector<uint8_t>& buffer, + const std::vector<std::pair<uint8_t, uint32_t>>& pathways, + uint32_t writeCount, uint32_t repeats) { + LUS::BinaryWriter w; + BaseExporter::WriteHeader(w, Torch::ResourceType::OoTPath, 0); + w.Write(static_cast<uint32_t>(writeCount)); + for (uint32_t r = 0; r < repeats; r++) { + for (auto& [np, ptsAddr] : pathways) { + w.Write(static_cast<uint32_t>(np)); + auto ptReader = ReadSubArray(buffer, ptsAddr, np * 6); + for (uint8_t k = 0; k < np; k++) { + w.Write(ptReader.ReadInt16()); + w.Write(ptReader.ReadInt16()); + w.Write(ptReader.ReadInt16()); + } + } + } + std::stringstream ss; + w.Finish(ss); + std::string str = ss.str(); + return std::vector<char>(str.begin(), str.end()); +} + +} // namespace OoT |
