blob: 145b525bbc9d5b6a5b70bc369546b1c9f1e35dd0 (
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
#include "nw4r/g3d.h" // IWYU pragma: export
#include "nw4r/g3d/res/g3d_resmat.h"
namespace nw4r {
namespace g3d {
/******************************************************************************
*
* ResByteCode
*
******************************************************************************/
const u8 *ResMdl::GetResByteCode(const char *pName) const {
return static_cast<u8 *>(ofs_to_obj<ResDic>(ref().toResByteCodeDic)[pName]);
}
/******************************************************************************
*
* ResNode
*
******************************************************************************/
ResNode ResMdl::GetResNode(const char *pName) const {
return ResNode(ofs_to_obj<ResDic>(ref().toResNodeDic)[pName]);
}
ResNode ResMdl::GetResNode(const ResName name) const {
return ResNode(ofs_to_obj<ResDic>(ref().toResNodeDic)[name]);
}
ResNode ResMdl::GetResNode(int idx) const {
return ResNode(ofs_to_obj<ResDic>(ref().toResNodeDic)[idx]);
}
ResNode ResMdl::GetResNode(u32 idx) const {
return ResNode(ofs_to_obj<ResDic>(ref().toResNodeDic)[idx]);
}
u32 ResMdl::GetResNodeNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResNodeDic).GetNumData();
}
/******************************************************************************
*
* RexVtxPos
*
******************************************************************************/
ResVtxPos ResMdl::GetResVtxPos(const ResName name) const {
return ResVtxPos(ofs_to_obj<ResDic>(ref().toResVtxPosDic)[name]);
}
ResVtxPos ResMdl::GetResVtxPos(int idx) const {
return ResVtxPos(ofs_to_obj<ResDic>(ref().toResVtxPosDic)[idx]);
}
ResVtxPos ResMdl::GetResVtxPos(u32 idx) const {
return ResVtxPos(ofs_to_obj<ResDic>(ref().toResVtxPosDic)[idx]);
}
u32 ResMdl::GetResVtxPosNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResVtxPosDic).GetNumData();
}
/******************************************************************************
*
* ResVtxNrm
*
******************************************************************************/
ResVtxNrm ResMdl::GetResVtxNrm(const ResName name) const {
return ResVtxNrm(ofs_to_obj<ResDic>(ref().toResVtxNrmDic)[name]);
}
ResVtxNrm ResMdl::GetResVtxNrm(int idx) const {
return ResVtxNrm(ofs_to_obj<ResDic>(ref().toResVtxNrmDic)[idx]);
}
ResVtxNrm ResMdl::GetResVtxNrm(u32 idx) const {
return ResVtxNrm(ofs_to_obj<ResDic>(ref().toResVtxNrmDic)[idx]);
}
u32 ResMdl::GetResVtxNrmNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResVtxNrmDic).GetNumData();
}
/******************************************************************************
*
* ResVtxClr
*
******************************************************************************/
ResVtxClr ResMdl::GetResVtxClr(const ResName name) const {
return ResVtxClr(ofs_to_obj<ResDic>(ref().toResVtxClrDic)[name]);
}
ResVtxClr ResMdl::GetResVtxClr(int idx) const {
return ResVtxClr(ofs_to_obj<ResDic>(ref().toResVtxClrDic)[idx]);
}
ResVtxClr ResMdl::GetResVtxClr(u32 idx) const {
return ResVtxClr(ofs_to_obj<ResDic>(ref().toResVtxClrDic)[idx]);
}
u32 ResMdl::GetResVtxClrNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResVtxClrDic).GetNumData();
}
/******************************************************************************
*
* ResVtxTexCoord
*
******************************************************************************/
ResVtxTexCoord ResMdl::GetResVtxTexCoord(int idx) const {
return ResVtxTexCoord(ofs_to_obj<ResDic>(ref().toResVtxTexCoordDic)[idx]);
}
u32 ResMdl::GetResVtxTexCoordNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResVtxTexCoordDic).GetNumData();
}
/******************************************************************************
*
* ResVtxFurPos
*
******************************************************************************/
ResVtxFurPos ResMdl::GetResVtxFurPos(int idx) const {
return ResVtxFurPos(ofs_to_obj<ResDic>(ref().toResVtxFurPosDic)[idx]);
}
u32 ResMdl::GetResVtxFurPosNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResVtxFurPosDic).GetNumData();
}
/******************************************************************************
*
* ResVtxFurVec
*
******************************************************************************/
ResVtxFurVec ResMdl::GetResVtxFurVec(int idx) const {
return ResVtxFurVec(ofs_to_obj<ResDic>(ref().toResVtxFurVecDic)[idx]);
}
u32 ResMdl::GetResVtxFurVecNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResVtxFurVecDic).GetNumData();
}
/******************************************************************************
*
* ResMat
*
******************************************************************************/
ResMat ResMdl::GetResMat(const char *pName) const {
return ResMat(ofs_to_obj<ResDic>(ref().toResMatDic)[pName]);
}
ResMat ResMdl::GetResMat(const ResName name) const {
return ResMat(ofs_to_obj<ResDic>(ref().toResMatDic)[name]);
}
ResMat ResMdl::GetResMat(int idx) const {
return ResMat(ofs_to_obj<ResDic>(ref().toResMatDic)[idx]);
}
ResMat ResMdl::GetResMat(u32 idx) const {
return ResMat(ofs_to_obj<ResDic>(ref().toResMatDic)[idx]);
}
u32 ResMdl::GetResMatNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResMatDic).GetNumData();
}
/******************************************************************************
*
* ResShp
*
******************************************************************************/
ResShp ResMdl::GetResShp(const char *pName) const {
return ResShp(ofs_to_obj<ResDic>(ref().toResShpDic)[pName]);
}
ResShp ResMdl::GetResShp(int idx) const {
return ResShp(ofs_to_obj<ResDic>(ref().toResShpDic)[idx]);
}
ResShp ResMdl::GetResShp(u32 idx) const {
return ResShp(ofs_to_obj<ResDic>(ref().toResShpDic)[idx]);
}
u32 ResMdl::GetResShpNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResShpDic).GetNumData();
}
/******************************************************************************
*
* ResTexPlttInfo
*
******************************************************************************/
ResTexPlttInfoOffset ResMdl::GetResTexPlttInfoOffsetFromTexName(int idx) const {
return ResTexPlttInfoOffset(ofs_to_obj<ResDic>(ref().toResTexNameToTexPlttInfoDic)[idx]);
}
u32 ResMdl::GetResTexPlttInfoOffsetFromTexNameNumEntries() const {
return ofs_to_obj<ResDic>(ref().toResTexNameToTexPlttInfoDic).GetNumData();
}
/******************************************************************************
*
* ResMdl
*
******************************************************************************/
bool ResMdl::Bind(const ResFile file) {
u32 i;
bool success = true;
u32 matNum = GetResMatNumEntries();
for (i = 0; i < matNum; i++) {
success = GetResMat(i).Bind(file) && success;
}
return success;
}
void ResMdl::Release() {
u32 i;
u32 matNum = GetResMatNumEntries();
for (i = 0; i < matNum; i++) {
GetResMat(i).Release();
}
}
void ResMdl::Init() {
u32 i;
u32 matNum = GetResMatNumEntries();
for (i = 0; i < matNum; i++) {
GetResMat(i).Init();
}
u32 shpNum = GetResShpNumEntries();
for (i = 0; i < shpNum; i++) {
GetResShp(i).Init();
}
u32 vtxPosNum = GetResVtxPosNumEntries();
for (i = 0; i < vtxPosNum; i++) {
GetResVtxPos(i).Init();
}
u32 vtxNrmNum = GetResVtxNrmNumEntries();
for (i = 0; i < vtxNrmNum; i++) {
GetResVtxNrm(i).Init();
}
u32 vtxClrNum = GetResVtxClrNumEntries();
for (i = 0; i < vtxClrNum; i++) {
GetResVtxClr(i).Init();
}
u32 texCoordNum = GetResVtxTexCoordNumEntries();
for (i = 0; i < texCoordNum; i++) {
GetResVtxTexCoord(i).Init();
}
u32 vtxFurVecNum = GetResVtxFurVecNumEntries();
for (i = 0; i < vtxFurVecNum; i++) {
GetResVtxFurVec(i).Init();
}
u32 vtxFurPosNum = GetResVtxFurPosNumEntries();
for (i = 0; i < vtxFurPosNum; i++) {
GetResVtxFurPos(i).Init();
}
}
void ResMdl::Terminate() {
u32 i;
u32 shpNum = GetResShpNumEntries();
for (i = 0; i < shpNum; i++) {
GetResShp(i).Terminate();
}
}
bool ResMdl::IsOpaque(u32 mat) const {
const u8 *drawOpa = GetResByteCode("DrawOpa");
if (drawOpa) {
while (drawOpa[0] != 1 /* End of Commands*/) {
// Code 4 -> Draw Polygon
if (drawOpa[0] == 4) {
// First two bytes are the MatId
u32 matID = (drawOpa[1] << 8 | drawOpa[2]);
if (matID == mat) {
return true;
}
drawOpa += 8 /* Size of Draw Polygon Code*/;
} else {
return false;
}
}
}
return false;
}
ResMdl::DrawEnumerator::DrawEnumerator(const u8 *pDrawOpa, const u8 *pDrawXlu)
: drawOpa(pDrawOpa), drawXlu(pDrawXlu), bOpa(pDrawOpa != NULL) {}
bool ResMdl::DrawEnumerator::IsValid() const {
if (bOpa) {
return drawOpa && drawOpa[0] == 4;
} else {
return drawXlu && drawXlu[0] == 4;
}
}
void ResMdl::DrawEnumerator::MoveNext() {
// Draw opaque before transparent
if (bOpa) {
/* Size of Draw Polygon Code*/
if (*(drawOpa += 8) == 1) {
bOpa = false;
}
return;
} else {
drawXlu += 8 /* Size of Draw Polygon Code*/;
}
}
u32 ResMdl::DrawEnumerator::GetMatID() const {
if (bOpa) {
return (drawOpa[1] << 8 | drawOpa[2]);
} else {
return (drawXlu[1] << 8 | drawXlu[2]);
}
}
u32 ResMdl::DrawEnumerator::GetShpID() const {
if (bOpa) {
return (drawOpa[3] << 8 | drawOpa[4]);
} else {
return (drawXlu[3] << 8 | drawXlu[4]);
}
}
u32 ResMdl::DrawEnumerator::GetNodeID() const {
if (bOpa) {
return (drawOpa[5] << 8 | drawOpa[6]);
} else {
return (drawXlu[5] << 8 | drawXlu[6]);
}
}
} // namespace g3d
} // namespace nw4r
|