summaryrefslogtreecommitdiff
path: root/src/factories/oot/OoTSceneUtils.h
blob: aa7444333a0dad896ff7e41da4f2facd834fb4dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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