Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
entity_model.c
Go to the documentation of this file.
1#include "common.h"
2#include "entity.h"
3
8Lights1 D_8014C268 = gdSPDefLights1(255, 255, 255, 0, 0, 0, 0, 0, 0);
9
11
15
24
25extern Gfx Gfx_RM1_SURFACE_OPA[];
26extern Gfx Gfx_RM1_DECAL_OPA[];
27extern Gfx Gfx_RM1_INTERSECTING_OPA[];
28extern Gfx Gfx_RM1_ALPHATEST[];
29extern Gfx Gfx_RM1_SURFACE_XLU[];
30extern Gfx Gfx_RM1_DECAL_XLU[];
31extern Gfx Gfx_RM1_INTERSECTING_XLU[];
33extern Gfx Gfx_RM1_SURFACE_XLU_NO_AA[];
34extern Gfx Gfx_RM1_DECAL_XLU_NO_AA[];
35extern Gfx Gfx_RM1_PASS_THROUGH[];
36extern Gfx Gfx_RM1_SURFACE_OPA_NO_ZB[];
37extern Gfx Gfx_RM1_ALPHATEST_NO_ZB[];
38extern Gfx Gfx_RM1_SURFACE_XLU_NO_ZB[];
39extern Gfx Gfx_RM1_CLOUD_NO_ZCMP[];
40extern Gfx Gfx_RM3_SURFACE_OPA[];
41extern Gfx Gfx_RM3_DECAL_OPA[];
42extern Gfx Gfx_RM3_INTERSECTING_OPA[];
43extern Gfx Gfx_RM3_ALPHATEST[];
44extern Gfx Gfx_RM3_SURFACE_XLU[];
45extern Gfx Gfx_RM3_DECAL_XLU[];
46extern Gfx Gfx_RM3_INTERSECTING_XLU[];
47
49void free_entity_model_by_ref(EntityModel* entityModel);
50
52 s32 i;
53
56 } else {
58 }
59
60 for (i = 0; i < MAX_ENTITY_MODELS; i++) {
61 (*gCurrentEntityModelList)[i] = NULL;
62 }
63
66 entity_fog_red = 10;
68 entity_fog_blue = 10;
72}
73
92
94 EntityModel* newEntityModel;
95 s32* entityModelCount;
96 s32 i;
97
98 for (i = 0; i < MAX_ENTITY_MODELS; i++) {
99 if ((*gCurrentEntityModelList)[i] == NULL) {
100 break;
101 }
102 }
104
105 (*gCurrentEntityModelList)[i] = newEntityModel = heap_malloc(sizeof(*newEntityModel));
106 entityModelCount = &gEntityModelCount;
107 (*entityModelCount)++;
108
109 ASSERT(newEntityModel != NULL);
110
112 newEntityModel->renderMode = 1;
113 newEntityModel->gfx.displayList = NULL;
114 newEntityModel->cmdListReadPos = cmdList;
115 newEntityModel->nextFrameTime = 1.0f;
116 newEntityModel->timeScale = 1.0f;
117 if (cmdList == NULL) {
118 newEntityModel->cmdListReadPos = &D_8014C260;
119 }
120 newEntityModel->vertexArray = NULL;
121 newEntityModel->fpSetupGfxCallback = NULL;
122 newEntityModel->cmdListSavedPos = newEntityModel->cmdListReadPos;
123
126 }
127 return i;
128}
129
131 EntityModel* newEntityModel;
132 SpriteRasterInfo* imageData;
133 s32 i;
134
135 for (i = 0; i < MAX_ENTITY_MODELS; i++) {
136 if ((*gCurrentEntityModelList)[i] == NULL) {
137 break;
138 }
139 }
141
142 {
143 s32* entityModelCount;
144 (*gCurrentEntityModelList)[i] = newEntityModel = heap_malloc(sizeof(*newEntityModel));
145 entityModelCount = &gEntityModelCount;
146 (*entityModelCount)++;
147 }
148
149 ASSERT(newEntityModel != NULL);
150
151 newEntityModel->gfx.imageData = imageData = heap_malloc(sizeof(*imageData));
152 ASSERT(imageData != NULL);
153
155 newEntityModel->renderMode = 1;
156 newEntityModel->cmdListReadPos = cmdList;
157 newEntityModel->nextFrameTime = 1.0f;
158 newEntityModel->timeScale = 1.0f;
159 if (cmdList == NULL) {
160 newEntityModel->cmdListReadPos = &D_8014C260;
161 }
162 newEntityModel->vertexArray = NULL;
163 newEntityModel->fpSetupGfxCallback = NULL;
164 newEntityModel->cmdListSavedPos = newEntityModel->cmdListReadPos;
165
168 }
169 return i;
170}
171
173 EntityModel* entityModel;
174
176 idx &= ~BATTLE_ENTITY_ID_BIT;
177 entityModel = (*gCurrentEntityModelList)[idx];
178 if (entityModel != NULL && (entityModel->flags)) {
179 if (!(entityModel->flags & ENTITY_MODEL_FLAG_HIDDEN)) {
180 if (!(entityModel->flags & ENTITY_MODEL_FLAG_DISABLE_SCRIPT)) {
181 entityModel->flags &= ~ENTITY_MODEL_FLAG_100;
182 entityModel->nextFrameTime -= entityModel->timeScale;
183 if (entityModel->nextFrameTime <= 0.0f) {
184 while (step_entity_model_commandlist(entityModel));
185 }
186 }
187 }
188 }
189 }
190}
191
193 SpriteRasterInfo* imageData;
194
195 u32* curPos = *entityModel->cmdListReadPos;
196 switch (*curPos++) {
197 case ENTITY_MODEL_SCRIPT_OP_End: // kill model
198 free_entity_model_by_ref(entityModel);
199 return 1;
200 case ENTITY_MODEL_SCRIPT_OP_Draw: // set display list ptr
201 entityModel->nextFrameTime = (f32) *curPos++;
202 entityModel->gfx.displayList = (Gfx*) *curPos++;
203 entityModel->cmdListReadPos = (EntityModelScript*) curPos;
204 break;
205 case ENTITY_MODEL_SCRIPT_OP_Restart: // restore saved position
206 entityModel->cmdListReadPos = entityModel->cmdListSavedPos;
207 return 1;
208 case ENTITY_MODEL_SCRIPT_OP_Loop: // set saved position
209 entityModel->cmdListReadPos = entityModel->cmdListSavedPos = (EntityModelScript*) curPos;
210 return 1;
211 case ENTITY_MODEL_SCRIPT_OP_SetRenderMode: // set render mode
212 entityModel->renderMode = *curPos++;
213 entityModel->cmdListReadPos = (EntityModelScript*) curPos;
214 return 1;
215 case ENTITY_MODEL_SCRIPT_OP_SetFlags: // set flags
216 entityModel->flags |= *curPos++;
217 entityModel->cmdListReadPos = (EntityModelScript*) curPos;
218 return 1;
219 case ENTITY_MODEL_SCRIPT_OP_ClearFlags: // clear flags
220 entityModel->flags &= ~*curPos++;
221 entityModel->cmdListReadPos = (EntityModelScript*) curPos;
222 return 1;
223 case ENTITY_MODEL_SCRIPT_OP_DrawImage: // set image data
224 imageData = entityModel->gfx.imageData;
225 entityModel->nextFrameTime = *curPos++;
226 imageData->raster = (u8*)*curPos++;
227 imageData->defaultPal = (PAL_PTR) *curPos++;
228 imageData->width = *curPos++;
229 imageData->height = *curPos++;
230 entityModel->cmdListReadPos = (EntityModelScript*) curPos;
231 break;
232 }
233 return 0;
234}
235
237 guMtxIdentF(mtx);
238 mtx[0][0] = 1.0f;
239 mtx[1][1] = 1.0f;
240 mtx[2][2] = -1.0f;
241 mtx[3][3] = 1.0f;
242}
243
245 Matrix4f mtx;
246 Matrix4f mtx2;
247 ImgFXTexture ifxImg;
248 Matrix4f imgfxMtx;
249
251 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
252 if (!(model->flags & ENTITY_MODEL_FLAG_USE_IMAGE)) {
253 if (!(model->flags & ENTITY_MODEL_FLAG_10000)) {
254 gDPPipeSync(gMainGfxPos++);
255 gDPSetRenderMode(gMainGfxPos++, G_RM_TEX_EDGE, G_RM_TEX_EDGE2);
256 gDPSetPrimColor(gMainGfxPos++, 0, 0, 255, 255, 255, 255);
257 gDPSetCombineMode(gMainGfxPos++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
258 gDPSetAlphaCompare(gMainGfxPos++, G_AC_NONE);
259 gSPSetOtherMode(gMainGfxPos++, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 18, G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE);
260
262 case FALSE:
263 switch (model->renderMode) {
265 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_OPA);
266 break;
268 gSPDisplayList(gMainGfxPos++, Gfx_RM1_DECAL_OPA);
269 break;
271 gSPDisplayList(gMainGfxPos++, Gfx_RM1_INTERSECTING_OPA);
272 break;
274 gSPDisplayList(gMainGfxPos++, Gfx_RM1_ALPHATEST);
275 break;
279 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_XLU);
280 break;
282 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_XLU_NO_AA);
283 break;
286 gSPDisplayList(gMainGfxPos++, Gfx_RM1_DECAL_XLU);
287 break;
290 gSPDisplayList(gMainGfxPos++, Gfx_RM1_DECAL_XLU_NO_AA);
291 break;
293 gSPDisplayList(gMainGfxPos++, Gfx_RM1_INTERSECTING_XLU);
294 break;
296 gSPDisplayList(gMainGfxPos++, Gfx_RM1_PASS_THROUGH);
297 break;
299 gSPDisplayList(gMainGfxPos++, Gfx_RM1_ALPHATEST_ONESIDED);
300 break;
303 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_OPA_NO_ZB);
304 break;
307 gSPDisplayList(gMainGfxPos++, Gfx_RM1_ALPHATEST_NO_ZB);
308 break;
311 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_XLU_NO_ZB);
312 break;
314 gSPDisplayList(gMainGfxPos++, Gfx_RM1_CLOUD_NO_ZCMP);
315 break;
316 }
317 break;
318 case TRUE:
319 switch (model->renderMode) {
321 gSPDisplayList(gMainGfxPos++, Gfx_RM3_SURFACE_OPA);
322 break;
324 gSPDisplayList(gMainGfxPos++, Gfx_RM3_DECAL_OPA);
325 break;
327 gSPDisplayList(gMainGfxPos++, Gfx_RM3_INTERSECTING_OPA);
328 break;
330 gSPDisplayList(gMainGfxPos++, Gfx_RM3_ALPHATEST);
331 break;
333 gSPDisplayList(gMainGfxPos++, Gfx_RM3_SURFACE_XLU);
334 break;
336 gSPDisplayList(gMainGfxPos++, Gfx_RM3_DECAL_XLU);
337 break;
339 gSPDisplayList(gMainGfxPos++, Gfx_RM3_INTERSECTING_XLU);
340 break;
341 }
344 break;
345 }
346 gSPClearGeometryMode(gMainGfxPos++, G_LIGHTING);
348 gDPSetCombineMode(gMainGfxPos++, G_CC_MODULATEIA, G_CC_MODULATEIA);
349 } else {
350 gDPSetCombineMode(gMainGfxPos++, PM_CC_42, PM_CC2_MULTIPLY_SHADE);
351 }
352 }
353 if (model->vertexArray != NULL) {
355 }
356 gDPPipeSync(gMainGfxPos++);
357
358 if (model->fpSetupGfxCallback != NULL) {
360 }
361 gDPPipeSync(gMainGfxPos++);
362
363 gSPDisplayList(gMainGfxPos++, model->gfx.displayList);
364 gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
365 gDPPipeSync(gMainGfxPos++);
366
367 if (!(model->flags & ENTITY_MODEL_FLAG_REFLECT)) {
368 return;
369 }
370
371 guMtxL2F(mtx, &model->transform);
373 guMtxCatF(mtx, mtx2, mtx);
374 guMtxF2L(mtx, &model->transform);
376 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
377 gSPDisplayList(gMainGfxPos++, model->gfx.displayList);
378 } else {
379 SpriteRasterInfo* imageData;
380
381 gDPPipeSync(gMainGfxPos++);
382 gSPClearGeometryMode(gMainGfxPos++, G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH);
383 gSPSetGeometryMode(gMainGfxPos++, G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH);
384 gSPSetLights1(gMainGfxPos++, D_8014C268);
385 gSPTexture(gMainGfxPos++, -1, -1, 0, G_TX_RENDERTILE, G_ON);
386 gDPSetAlphaCompare(gMainGfxPos++, G_AC_NONE);
387 gSPSetOtherMode(gMainGfxPos++, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 18, G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE);
388
389 imageData = model->gfx.imageData;
390 ifxImg.raster = imageData->raster;
391 ifxImg.palette = imageData->defaultPal;
392 ifxImg.width = imageData->width;
393 ifxImg.height = imageData->height;
394 ifxImg.xOffset = -imageData->width / 2;
395 ifxImg.yOffset = imageData->height / 2;
396 ifxImg.alpha = 255;
397 guMtxL2F(imgfxMtx, &model->transform);
398 imgfx_appendGfx_component(0, &ifxImg, 0, imgfxMtx);
399 }
400
401 gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
402 gDPPipeSync(gMainGfxPos++);
403}
404
405void draw_entity_model_A(s32 modelIdx, Mtx* transformMtx) {
406 EntityModel* model;
407 RenderTask rt;
408 RenderTask* rtPtr = &rt;
409 Camera* camera = &gCameras[gCurrentCamID];
410 Matrix4f mtx;
411 f32 x, y, z, w;
412 f32 inX, inY, inZ;
413
414 if ((gGameStatusPtr->context == CONTEXT_WORLD) || (modelIdx & BATTLE_ENTITY_ID_BIT)) {
415 modelIdx &= ~BATTLE_ENTITY_ID_BIT;
416 model = (*gCurrentEntityModelList)[modelIdx];
417
418 if (model != NULL) {
419 if (model->flags != 0) {
420 if (!(model->flags & ENTITY_MODEL_FLAG_100)) {
421 if (!(model->flags & ENTITY_MODEL_FLAG_HIDDEN)) {
422 if (!(model->flags & ENTITY_MODEL_FLAG_40) && (model->flags & (1 << gCurrentCamID))) {
423 model->transform = *transformMtx;
424 model->vertexArray = NULL;
425 guMtxL2F(mtx, transformMtx);
426 inX = mtx[3][0];
427 inY = mtx[3][1];
428 inZ = mtx[3][2];
429 transform_point(camera->mtxPerspective, inX, inY, inZ, 1.0f, &x, &y, &z, &w);
430 rtPtr->renderMode = model->renderMode;
431 rtPtr->appendGfxArg = model;
432 rtPtr->appendGfx = (void(*)(void*))appendGfx_entity_model;
433 rtPtr->dist = ((u32)(model->flags & 0xF000) >> 8) + inZ;
434 queue_render_task(rtPtr);
435 }
436 }
437 }
438 }
439 }
440 }
441}
442
443void draw_entity_model_B(s32 modelIdx, Mtx* transformMtx, s32 vertexSegment, Vec3s* vertexArray) {
444 EntityModel* model;
445 RenderTask rt;
446 RenderTask* rtPtr = &rt;
447 Camera* camera = &gCameras[gCurrentCamID];
448 Matrix4f mtx;
449 f32 x, y, z, w;
450 f32 inX, inY, inZ;
451
452 if ((gGameStatusPtr->context == CONTEXT_WORLD) || (modelIdx & BATTLE_ENTITY_ID_BIT)) {
453 modelIdx &= ~BATTLE_ENTITY_ID_BIT;
454 model = (*gCurrentEntityModelList)[modelIdx];
455
456 if (model != NULL) {
457 if (model->flags != 0) {
458 if (!(model->flags & ENTITY_MODEL_FLAG_100)) {
459 if (!(model->flags & ENTITY_MODEL_FLAG_HIDDEN)) {
460 if (model->flags & (1 << gCurrentCamID)) {
461 model->transform = *transformMtx;
462 D_80154374 = vertexSegment;
463 model->vertexArray = vertexArray;
464 guMtxL2F(mtx, transformMtx);
465 inX = mtx[3][0];
466 inY = mtx[3][1];
467 inZ = mtx[3][2];
468 transform_point(camera->mtxPerspective, inX, inY, inZ, 1.0f, &x, &y, &z, &w);
469 rtPtr->renderMode = model->renderMode;
470 rtPtr->appendGfxArg = model;
471 rtPtr->appendGfx = (void(*)(void*))appendGfx_entity_model;
472 rtPtr->dist = ((u32)(model->flags & 0xF000) >> 8) + inZ;
473 queue_render_task(rtPtr);
474 }
475 }
476 }
477 }
478 }
479 }
480}
481
482void draw_entity_model_C(s32 modelIdx, Mtx* transformMtx) {
483 EntityModel* model;
484 RenderTask rt;
485 RenderTask* rtPtr = &rt;
486
487 if ((gGameStatusPtr->context == CONTEXT_WORLD) || (modelIdx & BATTLE_ENTITY_ID_BIT)) {
488 modelIdx &= ~BATTLE_ENTITY_ID_BIT;
489 model = (*gCurrentEntityModelList)[modelIdx];
490
491 if (model != NULL) {
492 if (model->flags != 0) {
493 if (!(model->flags & ENTITY_MODEL_FLAG_100)) {
494 if (!(model->flags & ENTITY_MODEL_FLAG_HIDDEN)) {
495 if (!(model->flags & ENTITY_MODEL_FLAG_40) && (model->flags & (1 << gCurrentCamID))) {
497 model->transform = *transformMtx;
498 model->vertexArray = NULL;
499 rtPtr->renderMode = model->renderMode;
500 rtPtr->appendGfxArg = model;
501 rtPtr->appendGfx = (void(*)(void*))appendGfx_entity_model;
502 rtPtr->dist = (u32)(model->flags & 0xF000) >> 8;
503 queue_render_task(rtPtr);
504 }
505 }
506 }
507 }
508 }
509 }
510}
511
512void draw_entity_model_D(s32 modelIdx, Mtx* transformMtx, s32 arg2, Vec3s* vertexArray) {
513 EntityModel* model;
514 RenderTask rt;
515 RenderTask* rtPtr = &rt;
516
517 if ((gGameStatusPtr->context == CONTEXT_WORLD) || (modelIdx & BATTLE_ENTITY_ID_BIT)) {
518 modelIdx &= ~BATTLE_ENTITY_ID_BIT;
519 model = (*gCurrentEntityModelList)[modelIdx];
520
521 if (model != NULL) {
522 if (model->flags != 0) {
523 if (!(model->flags & ENTITY_MODEL_FLAG_100)) {
524 if (!(model->flags & ENTITY_MODEL_FLAG_HIDDEN)) {
525 if (model->flags & (1 << gCurrentCamID)) {
527 model->transform = *transformMtx;
528 D_80154374 = arg2;
529 model->vertexArray = vertexArray;
530 rtPtr->renderMode = model->renderMode;
531 rtPtr->appendGfxArg = model;
532 rtPtr->appendGfx = (void(*)(void*))appendGfx_entity_model;
533 rtPtr->dist = (u32)(model->flags & 0xF000) >> 8;
534 queue_render_task(rtPtr);
535 }
536 }
537 }
538 }
539 }
540 }
541}
542
543void draw_entity_model_E(s32 modelIdx, Mtx* transformMtx) {
544 EntityModel* model = (*gCurrentEntityModelList)[modelIdx & ~BATTLE_ENTITY_ID_BIT];
545 Matrix4f mtx;
546 Matrix4f mtx2;
547 ImgFXTexture ifxImg;
548 Matrix4f imgfxMtx;
549
550 if (model == NULL) {
551 return;
552 }
553 if (model->flags == 0) {
554 return;
555 }
556 if (model->flags & ENTITY_MODEL_FLAG_100) {
557 return;
558 }
559 if (model->flags & ENTITY_MODEL_FLAG_HIDDEN) {
560 return;
561 }
562 if (model->flags & ENTITY_MODEL_FLAG_40) {
563 return;
564 }
565 if (!(model->flags & ENTITY_MODEL_FLAG_CAM3)) {
566 return;
567 }
568
569 model->transform = *transformMtx;
570 model->vertexArray = NULL;
572 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
573 if (!(model->flags & ENTITY_MODEL_FLAG_USE_IMAGE)) {
575 case FALSE:
576 switch (model->renderMode) {
578 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_OPA);
579 break;
581 gSPDisplayList(gMainGfxPos++, Gfx_RM1_DECAL_OPA);
582 break;
584 gSPDisplayList(gMainGfxPos++, Gfx_RM1_INTERSECTING_OPA);
585 break;
587 gSPDisplayList(gMainGfxPos++, Gfx_RM1_ALPHATEST);
588 break;
592 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_XLU);
593 break;
595 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_XLU_NO_AA);
596 break;
599 gSPDisplayList(gMainGfxPos++, Gfx_RM1_DECAL_XLU);
600 break;
603 gSPDisplayList(gMainGfxPos++, Gfx_RM1_DECAL_XLU_NO_AA);
604 break;
606 gSPDisplayList(gMainGfxPos++, Gfx_RM1_INTERSECTING_XLU);
607 break;
609 gSPDisplayList(gMainGfxPos++, Gfx_RM1_PASS_THROUGH);
610 break;
612 gSPDisplayList(gMainGfxPos++, Gfx_RM1_ALPHATEST_ONESIDED);
613 break;
616 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_OPA_NO_ZB);
617 break;
620 gSPDisplayList(gMainGfxPos++, Gfx_RM1_ALPHATEST_NO_ZB);
621 break;
624 gSPDisplayList(gMainGfxPos++, Gfx_RM1_SURFACE_XLU_NO_ZB);
625 break;
627 gSPDisplayList(gMainGfxPos++, Gfx_RM1_CLOUD_NO_ZCMP);
628 break;
629 }
630 break;
631 case TRUE:
632 switch (model->renderMode) {
634 gSPDisplayList(gMainGfxPos++, Gfx_RM3_SURFACE_OPA);
635 break;
637 gSPDisplayList(gMainGfxPos++, Gfx_RM3_DECAL_OPA);
638 break;
640 gSPDisplayList(gMainGfxPos++, Gfx_RM3_INTERSECTING_OPA);
641 break;
643 gSPDisplayList(gMainGfxPos++, Gfx_RM3_ALPHATEST);
644 break;
646 gSPDisplayList(gMainGfxPos++, Gfx_RM3_SURFACE_XLU);
647 break;
649 gSPDisplayList(gMainGfxPos++, Gfx_RM3_DECAL_XLU);
650 break;
652 gSPDisplayList(gMainGfxPos++, Gfx_RM3_INTERSECTING_XLU);
653 break;
654 }
657 break;
658 }
659 gSPClearGeometryMode(gMainGfxPos++, G_LIGHTING);
661 gDPSetCombineMode(gMainGfxPos++, G_CC_MODULATEIA, G_CC_MODULATEIA);
662 } else {
663 gDPSetCombineMode(gMainGfxPos++, PM_CC_42, PM_CC2_MULTIPLY_SHADE);
664 }
665 if (model->vertexArray != NULL) {
667 }
668 gSPDisplayList(gMainGfxPos++, model->gfx.displayList);
669 gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
670 gDPPipeSync(gMainGfxPos++);
671 if (!(model->flags & ENTITY_MODEL_FLAG_REFLECT)) {
672 return;
673 }
674
675 guMtxL2F(mtx, &model->transform);
677 guMtxCatF(mtx, mtx2, mtx);
678 guMtxF2L(mtx, &model->transform);
680 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
681 gSPDisplayList(gMainGfxPos++, model->gfx.displayList);
682 } else {
683 SpriteRasterInfo* imageData;
684
685 gDPPipeSync(gMainGfxPos++);
686 gSPClearGeometryMode(gMainGfxPos++, G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH);
687 gSPSetGeometryMode(gMainGfxPos++, G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH);
688 gSPSetLights1(gMainGfxPos++, D_8014C268);
689 gSPTexture(gMainGfxPos++, -1, -1, 0, G_TX_RENDERTILE, G_ON);
690 gDPSetAlphaCompare(gMainGfxPos++, G_AC_NONE);
691 gSPSetOtherMode(gMainGfxPos++, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 18, G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE);
692
693 imageData = model->gfx.imageData;
694 ifxImg.raster = imageData->raster;
695 ifxImg.palette = imageData->defaultPal;
696 ifxImg.width = imageData->width;
697 ifxImg.height = imageData->height;
698 ifxImg.xOffset = -imageData->width / 2;
699 ifxImg.yOffset = imageData->height / 2;
700 ifxImg.alpha = 255;
701 guMtxL2F(imgfxMtx, &model->transform);
702 imgfx_appendGfx_component(0, &ifxImg, 0, imgfxMtx);
703 }
704
705 gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
706 gDPPipeSync(gMainGfxPos++);
707}
708
710 EntityModel* entityModel = (*gCurrentEntityModelList)[idx & ~BATTLE_ENTITY_ID_BIT];
711
712 if (entityModel != NULL && entityModel->flags) {
713 if (cmdList == NULL) {
714 cmdList = &D_8014C260;
715 }
716 entityModel->cmdListReadPos = cmdList;
717 entityModel->cmdListSavedPos = cmdList;
718 entityModel->nextFrameTime = 1.0f;
719 entityModel->timeScale = 1.0f;
720 }
721}
722
724 return (*gCurrentEntityModelList)[listIndex & ~BATTLE_ENTITY_ID_BIT];
725}
726
728 s32 index = idx & ~BATTLE_ENTITY_ID_BIT;
729 EntityModel* entityModel = (*gCurrentEntityModelList)[index];
730
731 if (entityModel != NULL && entityModel->flags) {
732 if (entityModel->flags & ENTITY_MODEL_FLAG_USE_IMAGE) {
733 heap_free(entityModel->gfx.imageData);
734 }
735 {
736 s32* modelCount = &gEntityModelCount;
738 (*gCurrentEntityModelList)[index] = NULL;
739 (*modelCount)--;
740 }
741 }
742}
743
745 s32 i;
746
747 for (i = 0; i < MAX_ENTITY_MODELS; i++) {
748 if ((*gCurrentEntityModelList)[i] == entityModel) {
749 break;
750 }
751 }
752
753 if (i < MAX_ENTITY_MODELS) {
755 }
756}
757
758void set_entity_model_flags(s32 idx, s32 newFlags) {
759 EntityModel* entityModel = (*gCurrentEntityModelList)[idx & ~BATTLE_ENTITY_ID_BIT];
760
761 if (entityModel != NULL && entityModel->flags) {
762 entityModel->flags |= newFlags;
763 }
764}
765
766void clear_entity_model_flags(s32 idx, s32 newFlags) {
767 EntityModel* entityModel = (*gCurrentEntityModelList)[idx & ~BATTLE_ENTITY_ID_BIT];
768
769 if (entityModel != NULL && entityModel->flags) {
770 entityModel->flags &= ~newFlags;
771 }
772}
773
774void bind_entity_model_setupGfx(s32 idx, void* setupGfxCallbackArg0, void (*fpSetupGfxCallback)(void*)) {
775 EntityModel* entityModel = (*gCurrentEntityModelList)[idx & ~BATTLE_ENTITY_ID_BIT];
776
777 entityModel->fpSetupGfxCallback = fpSetupGfxCallback;
778 entityModel->setupGfxCallbackArg0 = setupGfxCallbackArg0;
779}
780
781void func_80122F8C(s32 idx, s32 newFlags) {
782 EntityModel* entityModel = (*gCurrentEntityModelList)[idx & ~BATTLE_ENTITY_ID_BIT];
783
784 entityModel->flags |= newFlags;
785}
786
787void func_80122FB8(s32 idx, s32 newFlags) {
788 EntityModel* entityModel = (*gCurrentEntityModelList)[idx & ~BATTLE_ENTITY_ID_BIT];
789
791}
792
795}
796
799}
800
801void set_entity_fog_dist(s32 min, s32 max) {
804}
805
806void set_entity_fog_color(s32 r, s32 g, s32 b, s32 a) {
807 entity_fog_red = r;
809 entity_fog_blue = b;
811}
812
814 return entity_fog_enabled;
815}
816
817void get_entity_fog_distance(s32* start, s32* end) {
818 *start = entity_fog_dist_min;
819 *end = entity_fog_dist_max;
820}
821
822void get_entity_fog_color(s32* r, s32* g, s32* b, s32* a) {
823 *r = entity_fog_red;
824 *g = entity_fog_green;
825 *b = entity_fog_blue;
826 *a = entity_fog_alpha;
827}
Mtx matrixStack[0x200]
#define PAL_PTR
f32 Matrix4f[4][4]
#define transform_point
#define queue_render_task
#define guMtxF2L
#define guMtxCatF
#define ASSERT(condition)
s32 EntityModelScript[]
Definition entity.h:7
EntityModel * EntityModelList[256]
Definition entity.h:467
#define ems_End
Definition entity.h:47
@ ENTITY_MODEL_SCRIPT_OP_SetFlags
Definition entity.h:30
@ ENTITY_MODEL_SCRIPT_OP_Draw
Definition entity.h:26
@ ENTITY_MODEL_SCRIPT_OP_Loop
Definition entity.h:28
@ ENTITY_MODEL_SCRIPT_OP_SetRenderMode
Definition entity.h:29
@ ENTITY_MODEL_SCRIPT_OP_Restart
Definition entity.h:27
@ ENTITY_MODEL_SCRIPT_OP_End
Definition entity.h:25
@ ENTITY_MODEL_SCRIPT_OP_DrawImage
Definition entity.h:32
@ ENTITY_MODEL_SCRIPT_OP_ClearFlags
Definition entity.h:31
Gfx Gfx_RM3_SURFACE_OPA[]
Definition model.c:1067
void enable_entity_fog(void)
void make_entity_model_mtx_flipZ(Matrix4f mtx)
BSS EntityModelList * gCurrentEntityModelList
Gfx Gfx_RM3_DECAL_XLU[]
Definition model.c:1117
Gfx Gfx_RM3_DECAL_OPA[]
Definition model.c:1077
s32 step_entity_model_commandlist(EntityModel *entityModel)
BSS s32 entity_fog_blue
void init_entity_models(void)
EntityModel * get_entity_model(s32 listIndex)
void clear_entity_model_flags(s32 idx, s32 newFlags)
BSS EntityModelList gBattleEntityModelList
void set_entity_model_flags(s32 idx, s32 newFlags)
void func_80122FB8(s32 idx, s32 newFlags)
s32 is_entity_fog_enabled(void)
s32 load_entity_model(EntityModelScript *cmdList)
Gfx Gfx_RM1_SURFACE_XLU[]
Definition model.c:686
Gfx Gfx_RM1_DECAL_XLU[]
Definition model.c:696
void func_80122F8C(s32 idx, s32 newFlags)
Gfx Gfx_RM1_ALPHATEST_ONESIDED[]
Definition model.c:746
BSS s32 entity_fog_red
BSS s32 D_80154374
void exec_entity_model_commandlist(s32 idx)
Lights1 D_8014C268
Definition entity_model.c:8
void draw_entity_model_E(s32 modelIdx, Mtx *transformMtx)
Gfx Gfx_RM1_SURFACE_XLU_NO_AA[]
Definition model.c:756
void appendGfx_entity_model(EntityModel *model)
void free_entity_model_by_ref(EntityModel *entityModel)
void draw_entity_model_D(s32 modelIdx, Mtx *transformMtx, s32 arg2, Vec3s *vertexArray)
void draw_entity_model_A(s32 modelIdx, Mtx *transformMtx)
s32 ALT_load_entity_model(EntityModelScript *cmdList)
BSS s32 entity_fog_dist_max
s32 gEntityModelCount
void get_entity_fog_distance(s32 *start, s32 *end)
void set_entity_model_render_command_list(s32 idx, EntityModelScript *cmdList)
void draw_entity_model_B(s32 modelIdx, Mtx *transformMtx, s32 vertexSegment, Vec3s *vertexArray)
void draw_entity_model_C(s32 modelIdx, Mtx *transformMtx)
BSS s32 entity_fog_green
Gfx Gfx_RM1_DECAL_OPA[]
Definition model.c:654
BSS s32 entity_fog_dist_min
void get_entity_fog_color(s32 *r, s32 *g, s32 *b, s32 *a)
void set_entity_fog_dist(s32 min, s32 max)
BSS s32 entity_fog_enabled
Gfx Gfx_RM1_ALPHATEST[]
Definition model.c:676
Gfx Gfx_RM1_INTERSECTING_XLU[]
Definition model.c:706
Gfx Gfx_RM1_SURFACE_OPA[]
Definition model.c:643
Gfx Gfx_RM3_INTERSECTING_XLU[]
Definition model.c:1127
Gfx Gfx_RM1_ALPHATEST_NO_ZB[]
Definition model.c:810
void set_entity_fog_color(s32 r, s32 g, s32 b, s32 a)
void bind_entity_model_setupGfx(s32 idx, void *setupGfxCallbackArg0, void(*fpSetupGfxCallback)(void *))
Gfx Gfx_RM3_INTERSECTING_OPA[]
Definition model.c:1087
Gfx Gfx_RM1_CLOUD_NO_ZCMP[]
Definition model.c:844
BSS s32 entity_fog_alpha
BSS EntityModelList gWorldEntityModelList
EntityModelScript D_8014C260
Definition entity_model.c:4
Gfx Gfx_RM3_ALPHATEST[]
Definition model.c:1097
void clear_entity_models(void)
Gfx Gfx_RM1_SURFACE_OPA_NO_ZB[]
Definition model.c:800
Gfx Gfx_RM1_DECAL_XLU_NO_AA[]
Definition model.c:766
Gfx Gfx_RM1_PASS_THROUGH[]
Definition model.c:779
Gfx Gfx_RM1_SURFACE_XLU_NO_ZB[]
Definition model.c:820
void free_entity_model_by_index(s32 idx)
void disable_entity_fog(void)
Gfx Gfx_RM1_INTERSECTING_OPA[]
Definition model.c:665
Gfx Gfx_RM3_SURFACE_XLU[]
Definition model.c:1107
@ ENTITY_MODEL_FLAG_CAM1
Definition enums.h:5010
@ ENTITY_MODEL_FLAG_FOG_DISABLED
Definition enums.h:5020
@ ENTITY_MODEL_FLAG_USE_IMAGE
Definition enums.h:5019
@ ENTITY_MODEL_FLAG_100
Definition enums.h:5017
@ ENTITY_MODEL_FLAG_40
Definition enums.h:5015
@ ENTITY_MODEL_FLAG_CAM3
Definition enums.h:5012
@ ENTITY_MODEL_FLAG_DISABLE_SCRIPT
Definition enums.h:5026
@ ENTITY_MODEL_FLAG_10000
Definition enums.h:5025
@ ENTITY_MODEL_FLAG_HIDDEN
Definition enums.h:5014
@ ENTITY_MODEL_FLAG_CAM2
Definition enums.h:5011
@ ENTITY_MODEL_FLAG_REFLECT
Definition enums.h:5018
@ ENTITY_MODEL_FLAG_CAM0
Definition enums.h:5009
@ ENTITY_MODEL_FLAG_ENABLED
Definition enums.h:5013
@ CONTEXT_WORLD
Definition enums.h:3528
@ RENDER_MODE_ALPHATEST_ONESIDED
Definition enums.h:3278
@ RENDER_MODE_SURFACE_OPA_NO_ZB
Definition enums.h:3267
@ RENDER_MODE_DECAL_OPA
Definition enums.h:3268
@ RENDER_MODE_SURFACE_XLU_LAYER3
Definition enums.h:3299
@ RENDER_MODE_DECAL_XLU_NO_AA
Definition enums.h:3293
@ RENDER_MODE_SURFACE_XLU_LAYER2
Definition enums.h:3287
@ RENDER_MODE_SURFACE_XLU_NO_AA
Definition enums.h:3284
@ RENDER_MODE_INTERSECTING_XLU
Definition enums.h:3303
@ RENDER_MODE_PASS_THROUGH
Definition enums.h:3306
@ RENDER_MODE_DECAL_XLU
Definition enums.h:3291
@ RENDER_MODE_SHADOW
Definition enums.h:3297
@ RENDER_MODE_SURFACE_XLU_NO_ZB
Definition enums.h:3285
@ RENDER_MODE_SURFACE_XLU_NO_ZB_BEHIND
Definition enums.h:3310
@ RENDER_MODE_SURFACE_OPA_NO_ZB_BEHIND
Definition enums.h:3308
@ RENDER_MODE_DECAL_XLU_AHEAD
Definition enums.h:3295
@ RENDER_MODE_ALPHATEST_NO_ZB_BEHIND
Definition enums.h:3309
@ RENDER_MODE_INTERSECTING_OPA
Definition enums.h:3272
@ RENDER_MODE_ALPHATEST
Definition enums.h:3276
@ RENDER_MODE_SURFACE_OPA
Definition enums.h:3264
@ RENDER_MODE_ALPHATEST_NO_ZB
Definition enums.h:3279
@ RENDER_MODE_SURFACE_XLU_LAYER1
Definition enums.h:3282
@ RENDER_MODE_CLOUD_NO_ZCMP
Definition enums.h:3311
s32 imgfx_appendGfx_component(s32, ImgFXTexture *, u32, Matrix4f)
Definition imgfx.c:703
s32 heap_free(void *ptr)
Definition heap.c:42
void * heap_malloc(s32 size)
Definition heap.c:34
#define BSS
Definition macros.h:7
#define BATTLE_ENTITY_ID_BIT
Definition macros.h:150
#define MAX_ENTITY_MODELS
Definition macros.h:87
#define PM_CC2_MULTIPLY_SHADE
Definition macros.h:312
#define PM_CC_42
Definition macros.h:471
#define VIRTUAL_TO_PHYSICAL(addr)
Definition macros.h:47
Matrix4f mtxPerspective
s32 flags
Definition entity.h:448
EntityModelScript * cmdListSavedPos
Definition entity.h:461
void(* fpSetupGfxCallback)(void *)
Definition entity.h:463
void * setupGfxCallbackArg0
Definition entity.h:464
Mtx transform
Definition entity.h:460
EntityModelScript * cmdListReadPos
Definition entity.h:455
union EntityModel::@43 gfx
Vec3s * vertexArray
Definition entity.h:462
f32 timeScale
Default is 1.0.
Definition entity.h:454
f32 nextFrameTime
Set to 1.0 after each update.
Definition entity.h:453
s8 renderMode
Definition entity.h:449
void * appendGfxArg
void(* appendGfx)(void *)
GameStatus * gGameStatusPtr
Definition main_loop.c:32
Camera gCameras[4]
Definition cam_main.c:17
Gfx * gMainGfxPos
Definition cam_main.c:15
u16 gMatrixListPos
Definition main_loop.c:45
DisplayContext * gDisplayContext
Definition cam_main.c:16
s16 gCurrentCamID
Definition cam_main.c:13