LibT2FS 0.1
C API for accessing TEngine data in memory.
Loading...
Searching...
No Matches
models.h
Go to the documentation of this file.
1/* This file is part of LibT2FS.
2 *
3 * LibT2FS is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * LibT2FS is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <https://www.gnu.org/licenses/>.
15 */
16
17#ifndef H_T2FS_MODELS
18#define H_T2FS_MODELS
19
20#include <stdint.h>
21
22#include "t2fs.h"
23#include "array.h"
24#include "models/common.h"
25
26// Usefull links:
27// https://ultra64.ca/files/documentation/online-manuals/man/header/gbi.htm
28
29#define T2FS_VERTEX_CACHE_SIZE 32
30#define T2FS_VERTEX_GLOBAL_UNSET (uint32_t)-1
31
32#define T2FS_MODEL_BONE_SYMBOL_LEG 0b001 // else arm also depends on T2FS_MODEL_BONE_SYMBOL_NOT_HEAD
33#define T2FS_MODEL_BONE_SYMBOL_NOT_HEAD 0b010
34#define T2FS_MODEL_BONE_SYMBOL_RIGHT 0b100 // else left
35
36#define T2FS_MATERIAL_FLAG_UNK_0 0b0000000000000001
37#define T2FS_MATERIAL_FLAG_UNK_1 0b0000000000000010
38#define T2FS_MATERIAL_FLAG_CULBF 0b0000000000000100
39#define T2FS_MATERIAL_FLAG_UNK_3 0b0000000000001000
40#define T2FS_MATERIAL_FLAG_UNK_4 0b0000000000010000
41#define T2FS_MATERIAL_FLAG_UNK_5 0b0000000000100000
42#define T2FS_MATERIAL_FLAG_UNK_6 0b0000000001000000
43#define T2FS_MATERIAL_FLAG_UNK_7 0b0000000010000000
44#define T2FS_MATERIAL_FLAG_TRANSPARENCY 0b0000000100000000
45#define T2FS_MATERIAL_FLAG_UNK_9 0b0000001000000000
46#define T2FS_MATERIAL_FLAG_UNK_10 0b0000010000000000
47#define T2FS_MATERIAL_FLAG_UNK_11 0b0000100000000000
48#define T2FS_MATERIAL_FLAG_UNK_12 0b0001000000000000
49#define T2FS_MATERIAL_FLAG_UNK_13 0b0010000000000000
50#define T2FS_MATERIAL_FLAG_UNK_14 0b0100000000000000
51#define T2FS_MATERIAL_FLAG_UNK_15 0b1000000000000000
52
53// ********************************************************************
54// Structs as in file (possible after decompression and/or deinterleaving)
55// ********************************************************************
56
57
60typedef struct __attribute__((__packed__)) s_T2FSDataModelInfo {
66 int8_t unk1;
67 uint16_t unk2;
68 int16_t unk3;
70
72T2FS_CREATE_SWAP_STRUCT(T2FSDataModelInfo, (4,4,4,4,4,4,1,1,1,1,2,2));
73
74
83
86
87
90typedef struct __attribute__((__packed__)) s_T2FSDataBone {
91 /* The bouding box order:
92
93 7-----6 Z axis
94 / | /| |
95 / | / | |
96 3-----2 | |
97 | 4-|--5 | Y axis
98 | / | / | /
99 | / |/ | /
100 0-----1 | /
101 | /
102 X axis ---------
103
104 Are these always rectangular prisms or any cuboid?
105
106 */
110 uint8_t symbol;
112 uint8_t pad;
114 uint32_t flags;
116
118T2FS_CREATE_SWAP_STRUCT(T2FSDataBone, (4,4,4,4,4,4,4,4,
119 4,4,4,4,4,4,4,4,
120 4,4,4,4,4,4,4,4,
121 4,1,1,1,1,4,4));
122
125typedef struct __attribute__((__packed__)) s_T2FSDataBoneOrientation {
127 int16_t rotx;
128 int16_t roty;
129 int16_t rotz;
130 int16_t rotw;
132
135
136
139typedef struct __attribute__((__packed__)) s_T2FSDataBoneOrientationE3 {
141 float rotx;
142 float roty;
143 float rotz;
144 float rotw;
146
149
150
161typedef struct __attribute__((__packed__)) s_T2FSDataAnimationBoneIndices {
165
168
169
178typedef struct __attribute__((__packed__)) s_T2FSDataAnimationHeader {
179 uint16_t unk_u16_00;
180 uint16_t unk_u16_01;
181
184 uint16_t unk_u16_02;
185 uint16_t unk_u16_03;
186
187 uint16_t unk_u16_04;
188 uint16_t unk_u16_05;
189
190 //uint16_t unk_u16_06;
191 //uint16_t unk_u16_07;
192 float scale;
193
197 uint16_t unk_u16_09;
198
202 uint16_t unk_u16_11;
203
204 uint16_t unk_u16_12;
205 uint16_t unk_u16_13;
206 uint16_t unk_u16_14;
207 uint16_t unk_u16_15;
209
211T2FS_CREATE_SWAP_STRUCT(T2FSDataAnimationHeader, (2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2));
212
213
215typedef struct __attribute__((__packed__)) s_T2FSDataUnk2_x_4 {
216 int16_t boneId;
217 int16_t unk_s16_00;
218 int16_t unk_s16_01;
219
220 // possible vector
224
225 int16_t unk_s16_04;
226 int16_t unk_s16_05;
227
228 // possible bounds
229 int8_t unk_s8_00;
230 int8_t unk_s8_01;
231 int8_t unk_s8_02;
232 int8_t unk_s8_03;
233 int8_t unk_s8_04;
234 int8_t unk_s8_05;
236
238T2FS_CREATE_SWAP_STRUCT(T2FSDataUnk2_x_4, (2, 2, 2, 4, 4, 4, 2, 2, 1, 1, 1, 1, 1, 1));
239
240
243typedef struct __attribute__((__packed__)) s_T2FSDataHotpoint {
245 uint32_t flags;
246 uint16_t boneId;
247 uint16_t unk;
249
251T2FS_CREATE_SWAP_STRUCT(T2FSDataHotpoint, (4, 4, 4, 4, 2, 2));
252
253
256typedef struct __attribute__((__packed__)) s_T2FSDataColorRGBA8 {
257 uint8_t r, g, b, a;
259
260
267typedef struct __attribute__((__packed__)) s_T2FSDataMaterial {
268 uint32_t textureId; // 0xFFFFFFFF means no texture
269 uint32_t unk_u32_1;
270 uint32_t flags;
271
272 // fgColor looks good on South Park model 652
273 T2FSDataColorRGBA8 fgColor; // most set to 0x******FF
274 T2FSDataColorRGBA8 bgColor; // most set to 0xFFFFFF**
275
292 uint16_t sc, tc;
294
296T2FS_CREATE_SWAP_STRUCT(T2FSDataMaterial, (4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2));
297
298
299typedef struct __attribute__((__packed__)) s_T2FSDataVertexNormal {
300 int8_t x, y, z;
302
303typedef struct __attribute__((__packed__)) s_T2FSDataVertexColor {
304 uint8_t red, green, blue;
306
307
312
313
318typedef struct __attribute__((__packed__)) s_T2FSDataVertex {
319 int16_t x, y, z;
320 uint16_t flags; //<! n64 docs say unused, but some models do set this
321 float s, t;
323 uint8_t alpha;
325
327T2FS_CREATE_SWAP_STRUCT(T2FSDataVertex, (2, 2, 2, 2, 4, 4, 1, 1, 1, 1));
328
329
330typedef struct __attribute__((__packed__)) s_T2FSDataVertexN64 {
331 int16_t x, y, z;
332 uint16_t flags; //<! n64 docs say unused, but some models do set this
333 int16_t s, t;
335 uint8_t alpha;
337
339T2FS_CREATE_SWAP_STRUCT(T2FSDataVertexN64, (2, 2, 2, 2, 2, 2, 1, 1, 1, 1));
340
341
342
343// ********************************************************************
344// Our structs
345// ********************************************************************
346
347
352
353
354typedef struct s_T2FSAnimation {
355 uint32_t boneCount; // count of bones that have changes
356 uint8_t *boneIds; // bone id's of those that have changes
357 uint32_t frameCount;
360
361
362typedef struct s_T2FSPolygon {
363 uint32_t a, b, c;
364 uint32_t realA, realB, realC;
366
367
372
373
381
382
387
388
421
422
435
436
443
444
454
455
457typedef struct s_T2FSModelContext {
458 // main functions
459 uint32_t (*getVarCount)(T2FSNode *mdlNode);
460 int (*make)(T2FSContext *ctx, T2FSNode *mdlNode, uint32_t varId, T2FSModel *dest);
461 // helper functions for make
462
463 // for convenience
466
467
471uint32_t
473
474
483void
485
486
495int
496t2fs_model_load_data_node(T2FSModelContext *mdlCtx, uint32_t mdlId, T2FSNode **dest);
497
498
502void
504
505
511uint32_t
513
518void
520
521
535int
536t2fs_model_make(T2FSModelContext *mdlCtx, T2FSNode *mdlNode, uint32_t varId, T2FSModel *dest);
537
539void
541
542#endif
struct s_T2FSDataModelInfo T2FSDataModelInfo
struct s_T2FSDataMaterial T2FSDataMaterial
struct s_T2FSDataHotpoint T2FSDataHotpoint
struct s_T2FSDataAnimationHeader T2FSDataAnimationHeader
struct s_T2FSDataBone T2FSDataBone
struct s_T2FSDataAnimationBoneIndices T2FSDataAnimationBoneIndices
struct s_T2FSDataVertex T2FSDataVertex
struct s_T2FSDataColorRGBA8 T2FSDataColorRGBA8
struct s_T2FSDataModelInfoDino T2FSDataModelInfoDino
struct s_T2FSDataBoneOrientation T2FSDataBoneOrientation
struct s_T2FSDataBoneOrientationE3 T2FSDataBoneOrientationE3
struct s_T2FSDataCoordF32 T2FSDataCoordF32
#define SASSERT_SIZE(what, size)
Definition models/common.h:26
#define T2FS_CREATE_SWAP_STRUCT(name, sizes)
Definition models/common.h:36
struct s_T2FSSurface T2FSSurface
struct s_T2FSDataVertexN64 T2FSDataVertexN64
struct s_T2FSAnimationFrame T2FSAnimationFrame
void t2fs_model_init(T2FSModel *mdl)
Init our unified model struct.
struct s_T2FSVtxCache T2FSVtxCache
uint32_t t2fs_model_count(T2FSContext *ctx)
Get the amount of models present.
e_T2FSModelType
Definition models.h:383
@ T2FS_MDL_TYPE_ANIMATED
Definition models.h:385
@ T2FS_MDL_TYPE_STATIC
Definition models.h:384
struct s_T2FSDataVertexNormal T2FSDataVertexNormal
void t2fs_model_free(T2FSModel *mdl)
Free all allocated memory for given T2FSModel.
struct s_T2FSModel T2FSModel
struct s_T2FSDataVertexColor T2FSDataVertexColor
struct s_T2FSDataUnk2_x_4 T2FSDataUnk2_x_4
This is a guess, to try out stuff.
struct s_T2FSModelContext T2FSModelContext
helper to unify different games/versions
#define T2FS_VERTEX_CACHE_SIZE
Definition models.h:29
int t2fs_model_load_data_node(T2FSModelContext *mdlCtx, uint32_t mdlId, T2FSNode **dest)
Loads the model data into memory.
void t2fs_model_context_init(T2FSContext *ctx, T2FSModelContext *mdlCtx)
Initialize T2FSModelContext.
enum e_T2FSModelType T2FSModelType
struct s_T2FSPolygon T2FSPolygon
int t2fs_model_make(T2FSModelContext *mdlCtx, T2FSNode *mdlNode, uint32_t varId, T2FSModel *dest)
Convert the model data to our unified struct s_T2FSModel.
struct s_T2FSSurfaceVertices T2FSSurfaceVertices
Contains indices to vertices in global vertex buffer.
uint32_t t2fs_model_get_variation_count(T2FSModelContext *mdlCtx, T2FSNode *mdlNode)
Get the model variation count.
struct s_T2FSVertexBonePair T2FSVertexBonePair
void t2fs_model_unload_data_node(T2FSNode *modelNode)
Unloads the model data node.
union u_T2FSDataVertexAttr T2FSDataVertexAttr
struct s_T2FSAnimation T2FSAnimation
struct s_T2FSPolygonBuffer T2FSPolygonBuffer
Definition models.h:348
float posy
Definition models.h:349
float rotz
Definition models.h:350
float rotx
Definition models.h:350
float rotw
Definition models.h:350
float posz
Definition models.h:349
float roty
Definition models.h:350
float posx
Definition models.h:349
Definition models.h:354
uint32_t boneCount
Definition models.h:355
uint8_t * boneIds
Definition models.h:356
uint32_t frameCount
Definition models.h:357
T2FSAnimationFrame * frames
Definition models.h:358
Definition models.h:161
int16_t rotationIndex
-1 == UNUSED (no rotation changes for this bone)
Definition models.h:162
int16_t positionIndex
-1 == UNUSED (no position changes for this bone)
Definition models.h:163
Definition models.h:178
uint16_t rotationBoneCount
Count of 71c35b87 in 0/x/2/x/5/1/data ??? at least seams to affect data size, when this is larger,...
Definition models.h:201
uint16_t unk_u16_14
Missing on South Park.
Definition models.h:206
uint16_t unk_u16_12
Missing on South Park.
Definition models.h:204
uint16_t unk_u16_11
Definition models.h:202
uint16_t unk_u16_09
Definition models.h:197
uint16_t unk_u16_15
Missing on South Park.
Definition models.h:207
uint16_t positionBoneCount
Definition models.h:196
uint16_t unk_u16_01
Definition models.h:180
uint16_t unk_u16_00
Definition models.h:179
uint16_t unk_u16_05
Definition models.h:188
uint16_t unk_u16_13
Missing on South Park.
Definition models.h:205
uint16_t unk_u16_02
Definition models.h:184
uint16_t unk_u16_03
Definition models.h:185
uint16_t unk_u16_04
Definition models.h:187
float scale
this is a guess, value looks like scale values I've seen before ..
Definition models.h:192
Definition models.h:139
float rotw
Definition models.h:144
float rotz
Definition models.h:143
float rotx
Definition models.h:141
float roty
Definition models.h:142
T2FSDataCoordF32 pos
Definition models.h:140
Definition models.h:125
int16_t rotw
Needs to be scaled, see T2FS_BONE_ROT_SCALE_FACTOR.
Definition models.h:130
T2FSDataCoordF32 pos
Definition models.h:126
int16_t roty
Needs to be scaled, see T2FS_BONE_ROT_SCALE_FACTOR.
Definition models.h:128
int16_t rotx
Needs to be scaled, see T2FS_BONE_ROT_SCALE_FACTOR.
Definition models.h:127
int16_t rotz
Needs to be scaled, see T2FS_BONE_ROT_SCALE_FACTOR.
Definition models.h:129
Definition models.h:90
T2FSDataCoordF32 bbox[8]
Definition models.h:107
uint32_t flags
Definition models.h:114
uint8_t pad
Definition models.h:112
float damageScaler
Definition models.h:113
float maxBounds
Definition models.h:108
uint8_t materialType
Definition models.h:111
int8_t parentIndex
Definition models.h:109
uint8_t symbol
Definition models.h:110
Definition models.h:256
uint8_t r
Definition models.h:257
uint8_t b
Definition models.h:257
uint8_t a
Definition models.h:257
uint8_t g
Definition models.h:257
Definition models.h:243
T2FSDataCoordF32 pos
Definition models.h:244
uint32_t flags
Definition models.h:245
uint16_t boneId
Definition models.h:246
uint16_t unk
Definition models.h:247
Definition models.h:267
T2FSDataColorRGBA8 bgColor
Definition models.h:274
uint16_t sc
Definition models.h:292
uint32_t flags
Definition models.h:270
uint32_t textureId
Definition models.h:268
T2FSDataColorRGBA8 fgColor
Definition models.h:273
uint16_t tc
Definition models.h:292
uint32_t unk_u32_1
Definition models.h:269
Definition models.h:79
T2FSDataCoordF32 max
Definition models.h:81
T2FSDataCoordF32 min
Definition models.h:80
Definition models.h:60
int8_t unk1
Definition models.h:66
int8_t headTrackFactor
Definition models.h:65
int8_t headTrackStartBone
Definition models.h:63
T2FSDataCoordF32 max
Definition models.h:62
int8_t headTrackEndBone
Definition models.h:64
T2FSDataCoordF32 min
Definition models.h:61
uint16_t unk2
Definition models.h:67
int16_t unk3
Definition models.h:68
This is a guess, to try out stuff.
Definition models.h:215
int8_t unk_s8_00
Definition models.h:229
int8_t unk_s8_03
Definition models.h:232
int8_t unk_s8_05
Definition models.h:234
int8_t unk_s8_01
Definition models.h:230
float unk_f32_00
Definition models.h:221
int16_t unk_s16_04
Definition models.h:225
float unk_f32_01
Definition models.h:222
int8_t unk_s8_04
Definition models.h:233
int16_t unk_s16_00
probably also some index/id (low values)
Definition models.h:217
float unk_f32_02
Definition models.h:223
int16_t unk_s16_05
Definition models.h:226
int16_t unk_s16_01
0xFFFF
Definition models.h:218
int16_t boneId
assumed based on max value and the bone count
Definition models.h:216
int8_t unk_s8_02
Definition models.h:231
Definition models.h:303
uint8_t green
Definition models.h:304
uint8_t red
Definition models.h:304
uint8_t blue
Definition models.h:304
Definition models.h:330
int16_t x
Definition models.h:331
uint16_t flags
Definition models.h:332
uint8_t alpha
Definition models.h:335
int16_t t
Definition models.h:333
int16_t y
Definition models.h:331
int16_t z
Definition models.h:331
int16_t s
Definition models.h:333
T2FSDataVertexAttr attr
Definition models.h:334
Definition models.h:299
int8_t y
Definition models.h:300
int8_t z
Definition models.h:300
int8_t x
Definition models.h:300
Definition models.h:318
int16_t y
Definition models.h:319
int16_t x
Definition models.h:319
float t
Definition models.h:321
float s
Definition models.h:321
T2FSDataVertexAttr attr
Definition models.h:322
uint8_t alpha
Definition models.h:323
int16_t z
Definition models.h:319
uint16_t flags
Definition models.h:320
helper to unify different games/versions
Definition models.h:457
T2FSContext * ctx
Definition models.h:464
uint32_t(* getVarCount)(T2FSNode *mdlNode)
Definition models.h:459
int(* make)(T2FSContext *ctx, T2FSNode *mdlNode, uint32_t varId, T2FSModel *dest)
Definition models.h:460
Definition models.h:389
T2FSDataCoordF32 min
Minimum bounds.
Definition models.h:394
T2FSDataVertex * vertices
Vertex buffer.
Definition models.h:402
uint32_t var
Variation ID.
Definition models.h:391
uint8_t boneCount
Amount of bones.
Definition models.h:404
uint32_t poseCount
Amount of poses and possible amount of animations.
Definition models.h:408
T2FSSurface * surfaces
Definition models.h:416
float scale
TODO.
Definition models.h:399
int8_t headTrackStartBone
Headtrack bone ID.
Definition models.h:396
T2FSDataCoordF32 max
Maximum bounds.
Definition models.h:395
T2FSModelType type
Animated or static.
Definition models.h:393
T2FSDataBone * bones
Bone infos.
Definition models.h:405
uint32_t vertexCount
Total vertex count.
Definition models.h:401
uint32_t id
Model ID.
Definition models.h:390
T2FSDataBoneOrientation ** poses
The bone orientations per pose, like this poses[poseId][boneId].
Definition models.h:410
T2FSAnimation * animations
TODO current unused.
Definition models.h:413
uint32_t surfaceCount
Definition models.h:415
uint32_t animationCount
TODO current unused.
Definition models.h:412
int8_t headTrackEndBone
TODO.
Definition models.h:397
int8_t headTrackFactor
TODO.
Definition models.h:398
uint32_t hotpointCount
TODO current unused.
Definition models.h:418
T2FSDataHotpoint * hotpoints
TODO current unused.
Definition models.h:419
Definition models.h:445
uint32_t polygonCount
Amount of valid polygons. Set per surface.
Definition models.h:449
uint32_t polygonSize
Total size of the polygon buffer. Set per surface.
Definition models.h:450
T2FSSurfaceVertices vertices
Definition models.h:452
T2FSPolygon * polygons
Set per surface.
Definition models.h:448
T2FSVtxCache cache
Definition models.h:447
Definition models.h:362
uint32_t realC
For debugging.
Definition models.h:364
uint32_t realB
Definition models.h:364
uint32_t c
Definition models.h:363
uint32_t b
Definition models.h:363
uint32_t a
Definition models.h:363
uint32_t realA
Definition models.h:364
Contains indices to vertices in global vertex buffer.
Definition models.h:438
uint32_t size
Definition models.h:441
T2FSVertexBonePair * indices
Definition models.h:439
uint32_t count
Definition models.h:440
Definition models.h:374
T2FSPolygon * polygons
Definition models.h:379
uint32_t polygonCount
Definition models.h:378
uint32_t vertexCount
Definition models.h:376
T2FSDataMaterial material
Definition models.h:375
T2FSVertexBonePair * vertices
indices to global vertex buffer
Definition models.h:377
Definition models.h:368
uint32_t vertexIndex
Index in global vertex buffer.
Definition models.h:369
int32_t boneId
The bone ID to add this vertex to.
Definition models.h:370
Definition models.h:423
uint32_t curVertCount
Definition models.h:433
uint32_t localOffset
Definition models.h:430
uint32_t buf[T2FS_VERTEX_CACHE_SIZE]
Mimic N64 vertex cache.
Definition models.h:424
int8_t bones[T2FS_VERTEX_CACHE_SIZE]
Keep track of what boneId the vertices belong to.
Definition models.h:425
uint32_t globalOffset
Current offset to global vertex buffer.
Definition models.h:426
struct s_T2FSNode T2FSNode
This is the core object to describe a path inside the tree.
Definition t2fs.h:110
struct s_T2FSContext T2FSContext
This is the core LibT2FS object that you will be passing around.
Definition t2fs.h:53
Definition models.h:308
T2FSDataVertexNormal normals
Definition models.h:309
T2FSDataVertexColor colors
Definition models.h:310