summaryrefslogtreecommitdiff
path: root/src/factories/oot/OoTSceneUtils.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/factories/oot/OoTSceneUtils.h')
-rw-r--r--src/factories/oot/OoTSceneUtils.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/factories/oot/OoTSceneUtils.h b/src/factories/oot/OoTSceneUtils.h
new file mode 100644
index 0000000..aa74443
--- /dev/null
+++ b/src/factories/oot/OoTSceneUtils.h
@@ -0,0 +1,51 @@
+#pragma once
+
+#include "factories/BaseFactory.h"
+#include "Companion.h"
+#include "utils/Decompressor.h"
+#include <sstream>
+#include <iomanip>
+#include <set>
+
+namespace OoT {
+
+// Cutscene field packing macros (matching OTRExporter's command_macros_base.h)
+inline uint32_t CS_CMD_HH(uint16_t a, uint16_t b) { return ((uint32_t)b << 16) | (uint32_t)a; }
+inline uint32_t CS_CMD_BBH(int8_t a, int8_t b, int16_t c) {
+ return ((uint32_t)(uint8_t)a) | ((uint32_t)(uint8_t)b << 8) | ((uint32_t)(uint16_t)c << 16);
+}
+inline uint32_t CS_CMD_HBB(uint16_t a, uint8_t b, uint8_t c) {
+ return (uint32_t)a | ((uint32_t)b << 16) | ((uint32_t)c << 24);
+}
+
+// Helper to read a sub-array from ROM given a segmented pointer
+LUS::BinaryReader ReadSubArray(std::vector<uint8_t>& buffer, uint32_t segAddr, uint32_t size);
+
+// Resolve a segmented pointer to an O2R asset path string
+std::string ResolvePointer(uint32_t ptr);
+
+// Build a scene-relative asset name from offset
+std::string MakeAssetName(const std::string& baseName, const std::string& suffix, uint32_t offset);
+
+// Serialize pathway data into OoTPath binary format.
+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);
+
+class CutsceneSerializer {
+public:
+ static std::vector<char> Serialize(std::vector<uint8_t>& buffer, uint32_t segAddr);
+private:
+ static uint32_t CalculateSize(std::vector<uint8_t>& buffer, uint32_t segAddr);
+ static std::vector<char> Write(std::vector<uint8_t>& buffer, uint32_t segAddr, uint32_t size);
+ static void WriteCameraCmd(LUS::BinaryReader& reader, LUS::BinaryWriter& w);
+ static void WriteSingleEntryCmd(LUS::BinaryReader& reader, LUS::BinaryWriter& w);
+ static void WriteEntryCountCmd(uint32_t cid, LUS::BinaryReader& reader, LUS::BinaryWriter& w);
+ static bool IsCameraCmd(uint32_t id);
+ static bool IsSingleEntryCmd(uint32_t id);
+ static bool IsSmallEntryCmd(uint32_t id);
+ static bool IsHandledCmd(uint32_t id);
+ static const std::set<uint32_t> sUnimplementedCmds;
+};
+
+} // namespace OoT