Torch
Loading...
Searching...
No Matches
ModelFactory.h
1#pragma once
2
3#include <factories/BaseFactory.h>
4
5namespace BK64 {
6
16typedef struct BoneData {
17 float pos[3];
18 uint16_t id;
19 uint16_t parentId;
20} BoneData;
21
30typedef struct GeoCube {
31 uint16_t startTri;
32 uint16_t triCount;
33} GeoCube;
34
44typedef struct CollisionTri {
45 uint16_t vtxIds[3];
46 uint16_t unk6;
47 uint32_t flags;
49
53typedef struct Effect {
54 uint16_t dataInfo; // packed effect type + params
55 std::vector<uint16_t> vtxIndices; // the vertices this effect acts on
56} Effect;
57
67typedef struct AnimTexture {
68 uint16_t frameSize;
69 uint16_t frameCount;
70 float frameRate;
72
92typedef struct CollisionHeader {
93 int16_t minIndex[3];
94 int16_t maxIndex[3];
95 uint16_t yStride;
96 uint16_t zStride;
97 uint16_t geoCubeScale;
99
109typedef struct AnimationHeader {
110 float scalingFactor;
112
118typedef struct VtxHeader {
119 int16_t minCoord[3];
120 int16_t maxCoord[3];
121 int16_t centerCoord[3];
122 int16_t localNorm;
123 uint16_t count;
124 int16_t globalNorm;
125} VtxHeader;
126
131typedef struct TexInfo {
132 uint16_t type;
133 uint8_t width;
134 uint8_t height;
135 uint16_t tlutColors;
136 uint32_t textureDataOffset; // ROM offset, relative to the texture data base
137} TexInfo;
138
143typedef struct Unk14_0 {
144 int16_t scale1[3];
145 int16_t scale2[3];
146 int16_t pos[3];
147 uint8_t rot[3];
148 uint8_t unk15;
149 int8_t animIndex;
150 uint8_t pad;
151} Unk14_0; // 24 bytes
152
153typedef struct Unk14_1 {
154 int16_t unk0;
155 int16_t unk2;
156 int16_t pos[3];
157 uint8_t rot[3];
158 uint8_t unkD;
159 int8_t animIndex;
160 uint8_t pad;
161} Unk14_1; // 16 bytes
162
163typedef struct Unk14_2 {
164 int16_t unk0;
165 int16_t unk2[3];
166 uint8_t unk8;
167 int8_t unk9;
168 uint8_t pad[2];
169} Unk14_2; // 12 bytes
170
174typedef struct Unk20_0 {
175 int16_t unk0[3];
176 int16_t unk6[3];
177 uint8_t unkC;
178 uint8_t pad;
179} Unk20_0; // 14 bytes raw, pad to 16
180
184typedef struct Unk28_0 {
185 int16_t coord[3];
186 int8_t animIndex;
187 std::vector<int16_t> vtxList;
188} Unk28_0;
189
190class ModelData : public IParsedData {
191 public:
192 uint16_t mGeoType;
193 uint16_t mTriCount;
194 uint16_t mVertCount;
195
196 // ── GEO layout ────────────────────────────────────────────────────────────
197 bool mHasGeo = false;
198
199 // ── Vertex list ───────────────────────────────────────────────────────────
200 bool mHasVtx = false;
201 VtxHeader mVtxHeader{};
202
203 // ── Display lists ─────────────────────────────────────────────────────────
204 bool mHasDL = false;
205 uint32_t mDLCount = 0; // total GFX command words over all sub-lists
206 uint32_t mDLUnkInfo = 0; // checksum, or whatever — from the GFX header
207 uint32_t mGfxSubListCount = 0; // how many _GFX_* sub-assets we made
208 std::vector<uint32_t> mRawDLWords; // raw N64 DL words, as w0/w1 pairs
209
210 // ── Texture list ──────────────────────────────────────────────────────────
211 std::vector<TexInfo> mTexInfos;
212 uint32_t mTexDataSize = 0; // size of the raw texture area, for segment 2 allocation
213 std::vector<uint8_t> mRawTexData; // the whole raw texture blob, animated frames and all
214
215 // ── Animation data ────────────────────────────────────────────────────────
216 bool mHasAnimation = false;
217 AnimationHeader mAnimHeader{};
218 std::vector<BoneData> mBones;
219
220 // ── Collision data ────────────────────────────────────────────────────────
221 bool mHasCollision = false;
222 CollisionHeader mCollisionHeader{};
223 std::vector<GeoCube> mGeoCubes;
224 std::vector<CollisionTri> mCollisionTris;
225
226 // ── Unk14 (hitbox) ────────────────────────────────────────────────────────
227 bool mHasUnk14 = false;
228 int16_t mUnk14Unk6 = 0;
229 std::vector<Unk14_0> mUnk14Entries0;
230 std::vector<Unk14_1> mUnk14Entries1;
231 std::vector<Unk14_2> mUnk14Entries2;
232
233 // ── Unk20 ─────────────────────────────────────────────────────────────────
234 bool mHasUnk20 = false;
235 std::vector<Unk20_0> mUnk20Entries;
236
237 // ── Effects ───────────────────────────────────────────────────────────────
238 std::vector<Effect> mEffects;
239
240 // ── Unk28 ─────────────────────────────────────────────────────────────────
241 bool mHasUnk28 = false;
242 std::vector<Unk28_0> mUnk28Entries;
243
244 // ── Animated textures ─────────────────────────────────────────────────────
245 std::vector<AnimTexture> mAnimTextures;
246
247 ModelData(uint16_t geoType, uint16_t triCount, uint16_t vertCount)
248 : mGeoType(geoType), mTriCount(triCount), mVertCount(vertCount) {
249 }
250};
251
253 ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName,
254 YAML::Node& node, std::string* replacement) override;
255};
256
258 ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName,
259 YAML::Node& node, std::string* replacement) override;
260};
261
263 ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName,
264 YAML::Node& node, std::string* replacement) override;
265};
266
267class ModelFactory : public BaseFactory {
268 public:
269 std::optional<std::shared_ptr<IParsedData>> parse(std::vector<uint8_t>& buffer, YAML::Node& data) override;
270 inline std::unordered_map<ExportType, std::shared_ptr<BaseExporter>> GetExporters() override {
271 return { REGISTER(Code, ModelCodeExporter) REGISTER(Header, ModelHeaderExporter)
272 REGISTER(Binary, ModelBinaryExporter) };
273 }
274
275 bool HasModdedDependencies() override {
276 return true;
277 }
278};
279} // namespace BK64
Definition ModelFactory.h:257
Definition ModelFactory.h:262
Definition ModelFactory.h:267
Definition ModelFactory.h:252
Definition BaseFactory.h:96
Definition BaseFactory.h:102
Definition BaseFactory.h:88
Definition ModelFactory.h:67
Definition ModelFactory.h:109
Definition ModelFactory.h:16
Definition ModelFactory.h:92
Definition ModelFactory.h:44
Definition ModelFactory.h:53
Definition ModelFactory.h:30
Definition ModelFactory.h:131
Definition ModelFactory.h:143
Definition ModelFactory.h:153
Definition ModelFactory.h:163
Definition ModelFactory.h:174
Definition ModelFactory.h:184
Definition ModelFactory.h:118