diff --git a/src/game/bondgun.c b/src/game/bondgun.c index a9f0049ae..ef0dea9ec 100644 --- a/src/game/bondgun.c +++ b/src/game/bondgun.c @@ -7334,7 +7334,7 @@ void bgun_create_fx(struct hand *hand, s32 handnum, struct funcdef *funcdef, s32 void bgun0f0a5550(s32 handnum) { u8 *mtxallocation; - Mtxf sp2c4; + Mtxf rendermtx; Mtxf sp284; struct modeldef *modeldef = NULL; struct coord sp274 = {0, 0, 0}; @@ -7526,10 +7526,10 @@ void bgun0f0a5550(s32 handnum) mtx4_load_rotation(&sp1a4, &sp124); mtx4_mult_mtx4(&sp124, &sp164, &sp284); mtx4_mult_mtx4_in_place(&sp284, &sp234); - mtx4_copy(&sp234, &sp2c4); - mtx4_set_translation(&sp274, &sp2c4); + mtx4_copy(&sp234, &rendermtx); + mtx4_set_translation(&sp274, &rendermtx); - mtx4_copy(&sp2c4, &hand->cammtx); + mtx4_copy(&rendermtx, &hand->cammtx); mtx4_copy(&hand->posmtx, &hand->prevmtx); mtx00015be4(cam_get_projection_mtxf(), &hand->cammtx, &hand->posmtx); @@ -7549,12 +7549,12 @@ void bgun0f0a5550(s32 handnum) hand->handmodel.matrices = (Mtxf *)mtxallocation; if (gset_has_weapon_flag(weaponnum, WEAPONFLAG_DUALFLIP) && handnum == HAND_LEFT) { - mtx00015e24(-1, &sp2c4); + mtx00015e24(-1, &rendermtx); } - mtx00015f04(0.10000001f, &sp2c4); + mtx00015f04(0.10000001f, &rendermtx); - mtx4_copy(&sp2c4, (Mtxf *)mtxallocation); + mtx4_copy(&rendermtx, (Mtxf *)mtxallocation); if (hand->ejectcount > 0) { switch (weaponnum) { @@ -7590,7 +7590,7 @@ void bgun0f0a5550(s32 handnum) { bool a0 = true; - struct modelrenderdata renderdata = {NULL, true, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; #if VERSION >= VERSION_PAL_BETA bool a3 = false; #endif @@ -7603,8 +7603,8 @@ void bgun0f0a5550(s32 handnum) s32 stack; s32 sp6c; - renderdata.unk00 = &sp2c4; - renderdata.unk10 = hand->gunmodel.matrices; + renderdata.rendermtx = &rendermtx; + renderdata.matrices = hand->gunmodel.matrices; if (hand->animmode != HANDANIMMODE_IDLE) { a0 = false; @@ -7677,8 +7677,8 @@ void bgun0f0a5550(s32 handnum) spc4 = hand->gunmodel.matrices; - renderdata.unk00 = &sp84; - renderdata.unk10 = player->hands[HAND_RIGHT].unk0dd8; + renderdata.rendermtx = &sp84; + renderdata.matrices = player->hands[HAND_RIGHT].unk0dd8; #if VERSION >= VERSION_PAL_BETA var8005efd8_2 = true; @@ -7707,7 +7707,7 @@ void bgun0f0a5550(s32 handnum) spc4 = hand->gunmodel.matrices; for (spcc = 0; spcc < hand->gunmodel.definition->nummatrices; spcc++) { - mtx00015be4(&sp2c4, spc8, spc4); + mtx00015be4(&rendermtx, spc8, spc4); spc8++; spc4++; } @@ -8178,7 +8178,7 @@ s32 bgun_allocate_fireslot(void) void bgun_render(Gfx **gdlptr) { Gfx *gdl = *gdlptr; - struct modelrenderdata renderdata = {NULL, true, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; struct player *player; s32 handnum; @@ -8257,7 +8257,7 @@ void bgun_render(Gfx **gdlptr) } renderdata.gdl = gdl; - renderdata.unk30 = 4; + renderdata.context = MODELRENDERCONTEXT_BONDGUN_OPA; if (USINGDEVICE(DEVICE_NIGHTVISION) || USINGDEVICE(DEVICE_IRSCANNER)) { u8 *col = player->gunshadecol; @@ -8307,7 +8307,7 @@ void bgun_render(Gfx **gdlptr) alpha *= 0.74509805f; renderdata.fogcolour = renderdata.envcolour; renderdata.envcolour = 65 + alpha; - renderdata.unk30 = 5; + renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU; colour = renderdata.envcolour; } diff --git a/src/game/bondhead.c b/src/game/bondhead.c index f4a2f40f8..2be4dd939 100644 --- a/src/game/bondhead.c +++ b/src/game/bondhead.c @@ -139,8 +139,8 @@ void bhead_update(f32 speedforwards, f32 speedsideways) } { - struct modelrenderdata sp80 = {NULL, 1, 3}; - Mtxf sp40; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; + Mtxf rendermtx; struct coord modelpos = {0, 0, 0}; bool mergeenabled = model_is_anim_merging_enabled(); @@ -150,11 +150,12 @@ void bhead_update(f32 speedforwards, f32 speedsideways) model_tick_anim_quarter_speed(&g_Vars.currentplayer->model, g_Vars.lvupdate240, true); model_set_anim_merging_enabled(mergeenabled); model_update_info(&g_Vars.currentplayer->model); - mtx4_load_identity(&sp40); + mtx4_load_identity(&rendermtx); - sp80.unk00 = &sp40; - sp80.unk10 = g_Vars.currentplayer->bondheadmatrices; - model_set_matrices_with_anim(&sp80, &g_Vars.currentplayer->model); + renderdata.rendermtx = &rendermtx; + renderdata.matrices = g_Vars.currentplayer->bondheadmatrices; + + model_set_matrices_with_anim(&renderdata, &g_Vars.currentplayer->model); g_Vars.currentplayer->headbodyoffset.x = g_Vars.currentplayer->standbodyoffset.x; g_Vars.currentplayer->headbodyoffset.y = g_Vars.currentplayer->standbodyoffset.y; diff --git a/src/game/bondheadreset.c b/src/game/bondheadreset.c index c84c6d399..e248f7215 100644 --- a/src/game/bondheadreset.c +++ b/src/game/bondheadreset.c @@ -94,15 +94,17 @@ void bhead_reset(void) } { - struct modelrenderdata renderdata = {NULL, 1, 3}; - Mtxf sp48; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; + Mtxf rendermtx; model_set_animation(&g_Vars.currentplayer->model, ANIM_TWO_GUN_HOLD, 0, 0, 0.5f, 0); model_update_info(&g_Vars.currentplayer->model); - mtx4_load_identity(&sp48); - renderdata.unk00 = &sp48; - renderdata.unk10 = g_Vars.currentplayer->bondheadmatrices; + mtx4_load_identity(&rendermtx); + + renderdata.rendermtx = &rendermtx; + renderdata.matrices = g_Vars.currentplayer->bondheadmatrices; + model_set_matrices_with_anim(&renderdata, &g_Vars.currentplayer->model); g_Vars.currentplayer->standheight = g_Vars.currentplayer->bondheadmatrices[0].m[3][1]; diff --git a/src/game/chr.c b/src/game/chr.c index 6cf96b8e5..ab6d75f74 100644 --- a/src/game/chr.c +++ b/src/game/chr.c @@ -1979,35 +1979,35 @@ void chr_tick_child(struct chrdata *chr, struct prop *prop, bool fulltick) if (model->attachedtomodel && model->attachedtonode && (obj->hidden & OBJHFLAG_GONE) == 0 && (obj->flags2 & OBJFLAG2_INVISIBLE) == 0) { - Mtxf *sp104 = model_find_node_mtx(model->attachedtomodel, model->attachedtonode, 0); - struct modelrenderdata thing = {NULL, 1, 3}; + Mtxf *mtx0 = model_find_node_mtx(model->attachedtomodel, model->attachedtonode, 0); + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; u32 stack; - Mtxf sp80; + Mtxf rendermtx; Mtxf sp40; prop->flags |= PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK; if (obj->hidden & OBJHFLAG_EMBEDDED) { - mtx00015be4(sp104, &obj->embedment->matrix, &sp80); - thing.unk00 = &sp80; + mtx00015be4(mtx0, &obj->embedment->matrix, &rendermtx); + renderdata.rendermtx = &rendermtx; } else if (CHRRACE(chr) == RACE_SKEDAR) { // The skedar hand position is rotated weirdly, so compensate for it - mtx4_load_y_rotation(BADDTOR(75.6), &sp80); + mtx4_load_y_rotation(BADDTOR(75.6), &rendermtx); mtx4_load_z_rotation(BADDTOR(90.0), &sp40); - mtx4_mult_mtx4_in_place(&sp40, &sp80); - mtx4_mult_mtx4_in_place(sp104, &sp80); - thing.unk00 = &sp80; + mtx4_mult_mtx4_in_place(&sp40, &rendermtx); + mtx4_mult_mtx4_in_place(mtx0, &rendermtx); + renderdata.rendermtx = &rendermtx; } else if (prop == chr->weapons_held[HAND_LEFT]) { // Flip the model - mtx4_load_z_rotation(BADDTOR(180), &sp80); - mtx4_mult_mtx4_in_place(sp104, &sp80); - thing.unk00 = &sp80; + mtx4_load_z_rotation(BADDTOR(180), &rendermtx); + mtx4_mult_mtx4_in_place(mtx0, &rendermtx); + renderdata.rendermtx = &rendermtx; } else { - thing.unk00 = sp104; + renderdata.rendermtx = mtx0; } - thing.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); - model_set_matrices(&thing, model); + renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); + model_set_matrices(&renderdata, model); obj_child_tick_player(prop, fulltick); @@ -2370,7 +2370,7 @@ bool chr_tick_beams(struct prop *prop) */ s32 chr_tick(struct prop *prop) { - struct modelrenderdata sp210 = {0, 1, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; struct chrdata *chr = prop->chr; struct model *model = chr->model; bool needsupdate; @@ -2381,7 +2381,7 @@ s32 chr_tick(struct prop *prop) bool fulltick = false; s32 race = CHRRACE(chr); s32 sp1e8; - Mtxf sp1a8; + Mtxf rendermtx; s32 sp1a4; bool isrepeatframe; bool isrepeatframe2; @@ -2689,9 +2689,9 @@ s32 chr_tick(struct prop *prop) sp190.y = 0.0f; sp190.z = cosf(angle) * 19; - mtx4_load_translation(&sp190, &sp1a8); - mtx4_mult_mtx4_in_place(cam_get_world_to_screen_mtxf(), &sp1a8); - sp210.unk00 = &sp1a8; + mtx4_load_translation(&sp190, &rendermtx); + mtx4_mult_mtx4_in_place(cam_get_world_to_screen_mtxf(), &rendermtx); + renderdata.rendermtx = &rendermtx; } else if (prop->type == PROPTYPE_PLAYER) { u8 stack[0x14]; f32 sp130; @@ -2706,17 +2706,17 @@ s32 chr_tick(struct prop *prop) sp17c.y = ABS(bike->w) * 200 + 25; sp17c.z = sinf(-sp178) * sp130; - mtx4_load_translation(&sp17c, &sp1a8); - mtx4_mult_mtx4_in_place(cam_get_world_to_screen_mtxf(), &sp1a8); - sp210.unk00 = &sp1a8; + mtx4_load_translation(&sp17c, &rendermtx); + mtx4_mult_mtx4_in_place(cam_get_world_to_screen_mtxf(), &rendermtx); + renderdata.rendermtx = &rendermtx; } else { - sp210.unk00 = cam_get_world_to_screen_mtxf(); + renderdata.rendermtx = cam_get_world_to_screen_mtxf(); } } else { - sp210.unk00 = cam_get_world_to_screen_mtxf(); + renderdata.rendermtx = cam_get_world_to_screen_mtxf(); } - sp210.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); + renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); if (fulltick && g_CurModelChr->flinchcnt >= 0) { g_CurModelChr->flinchcnt += g_Vars.lvupdate60; @@ -2786,7 +2786,7 @@ s32 chr_tick(struct prop *prop) } } - model_set_matrices_with_anim(&sp210, model); + model_set_matrices_with_anim(&renderdata, model); if (restore) { anim->frac = prevfrac; @@ -3357,7 +3357,7 @@ Gfx *chr_render(struct prop *prop, Gfx *gdl, bool xlupass) struct model *model = chr->model; f32 shadecolourfracs[4]; s32 shademode; - s32 sp100; + s32 flags; s32 alpha; struct eyespy *eyespy; struct prop *child; @@ -3425,12 +3425,12 @@ Gfx *chr_render(struct prop *prop, Gfx *gdl, bool xlupass) return gdl; } - sp100 = 3; + flags = MODELRENDERFLAG_OPA | MODELRENDERFLAG_XLU; } else { if (!xlupass) { - sp100 = 1; + flags = MODELRENDERFLAG_OPA; } else { - sp100 = 2; + flags = MODELRENDERFLAG_XLU; } } @@ -3442,7 +3442,7 @@ Gfx *chr_render(struct prop *prop, Gfx *gdl, bool xlupass) } if (shademode != SHADEMODE_XLU && alpha > 0) { - struct modelrenderdata renderdata = {0, 1, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; struct screenbox screenbox; s32 colour[4]; // rgba levels, but allowing > 256 temporarily u32 stack; @@ -3457,7 +3457,7 @@ Gfx *chr_render(struct prop *prop, Gfx *gdl, bool xlupass) gdl = bg_scissor_to_viewport(gdl); } - renderdata.flags = sp100; + renderdata.flags = flags; renderdata.zbufferenabled = true; renderdata.gdl = gdl; @@ -3512,10 +3512,10 @@ Gfx *chr_render(struct prop *prop, Gfx *gdl, bool xlupass) renderdata.fogcolour = colour[0] << 24 | colour[1] << 16 | colour[2] << 8 | colour[3]; if (alpha < 0xff) { - renderdata.unk30 = 8; + renderdata.context = MODELRENDERCONTEXT_CHR_XLU; renderdata.envcolour |= (u8)alpha; } else { - renderdata.unk30 = 7; + renderdata.context = MODELRENDERCONTEXT_CHR_OPA; } // Set Skedar eyes open or closed diff --git a/src/game/gunfx.c b/src/game/gunfx.c index 34f56586e..387fa4fdd 100644 --- a/src/game/gunfx.c +++ b/src/game/gunfx.c @@ -821,7 +821,7 @@ void casing_render(struct casing *casing, Gfx **gdlptr) struct modeldef *modeldef = casing->modeldef; Mtxf *matrices = gfx_allocate(modeldef->nummatrices * sizeof(Mtxf)); struct model model; - struct modelrenderdata renderdata = { NULL, true, 3 }; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; Mtxf mtx; s32 i; s32 j; @@ -861,10 +861,10 @@ void casing_render(struct casing *casing, Gfx **gdlptr) } if (render) { - renderdata.zbufferenabled = 1; + renderdata.zbufferenabled = true; renderdata.gdl = gdl; - renderdata.unk10 = matrices; - renderdata.unk30 = 4; + renderdata.matrices = matrices; + renderdata.context = MODELRENDERCONTEXT_BONDGUN_OPA; renderdata.envcolour = g_Vars.currentplayer->gunshadecol[0] << 24 | g_Vars.currentplayer->gunshadecol[1] << 16 | g_Vars.currentplayer->gunshadecol[2] << 8 diff --git a/src/game/menu.c b/src/game/menu.c index e97ed430a..e3999794b 100644 --- a/src/game/menu.c +++ b/src/game/menu.c @@ -1856,7 +1856,7 @@ Gfx *menu_render_model(Gfx *gdl, struct menumodel *menumodel, s32 modeltype) } if (menumodel->bodymodeldef != NULL) { - struct modelrenderdata renderdata = {NULL, true, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; Mtxf *matrices; s32 i; u32 stack[3]; @@ -2243,8 +2243,8 @@ Gfx *menu_render_model(Gfx *gdl, struct menumodel *menumodel, s32 modeltype) mtx4_copy(&menumodel->mtx, matrices); - renderdata.unk00 = &menumodel->mtx; - renderdata.unk10 = menumodel->bodymodel.matrices; + renderdata.rendermtx = &menumodel->mtx; + renderdata.matrices = menumodel->bodymodel.matrices; model_set_matrices_with_anim(&renderdata, &menumodel->bodymodel); @@ -2313,7 +2313,7 @@ Gfx *menu_render_model(Gfx *gdl, struct menumodel *menumodel, s32 modeltype) gSPSetLights1(gdl++, var80071468); gSPLookAt(gdl++, cam_get_look_at()); - renderdata.unk30 = 1; + renderdata.context = MODELRENDERCONTEXT_MENUMODEL_OPA; renderdata.envcolour = 0xffffffff; renderdata.fogcolour = 0xffffffff; diff --git a/src/game/propobj.c b/src/game/propobj.c index 1b1940f7c..80d34b4db 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -4788,15 +4788,15 @@ void obj_child_tick_player_onscreen(struct prop *prop, bool fulltick) if (model->attachedtonode && (obj->hidden & OBJHFLAG_EMBEDDED)) { Mtxf *mtx = model_find_node_mtx(model->attachedtomodel, model->attachedtonode, 0); - struct modelrenderdata renderdata = {NULL, true, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; u32 stack; - Mtxf sp30; + Mtxf rendermtx; prop->flags |= PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK; - mtx00015be4(mtx, &obj->embedment->matrix, &sp30); + mtx00015be4(mtx, &obj->embedment->matrix, &rendermtx); - renderdata.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); - renderdata.unk00 = &sp30; + renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); + renderdata.rendermtx = &rendermtx; model_set_matrices(&renderdata, model); obj_child_tick_player(prop, fulltick); @@ -10855,16 +10855,16 @@ void obj_init_matrices(struct prop *prop) hangingmonitor_init_matrices(prop); } else { if (obj->model->definition->nummatrices >= 2) { - struct modelrenderdata thing = {NULL, 1, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; u32 stack; - Mtxf sp28; + Mtxf rendermtx; - mtx4_copy(obj->model->matrices, &sp28); + mtx4_copy(obj->model->matrices, &rendermtx); - thing.unk10 = obj->model->matrices; - thing.unk00 = &sp28; + renderdata.matrices = obj->model->matrices; + renderdata.rendermtx = &rendermtx; - model_set_matrices(&thing, obj->model); + model_set_matrices(&renderdata, obj->model); } } } @@ -11059,7 +11059,7 @@ s32 obj_tick_player(struct prop *prop) model->anim = NULL; } else { // In cutscene - struct modelrenderdata sp476 = {0, 1, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; Mtxf sp412; struct coord sp400; RoomNum sp384[8]; @@ -11086,9 +11086,11 @@ s32 obj_tick_player(struct prop *prop) } sp556 = true; - sp476.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); - sp476.unk00 = cam_get_world_to_screen_mtxf(); - model_set_matrices_with_anim(&sp476, model); + + renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); + renderdata.rendermtx = cam_get_world_to_screen_mtxf(); + + model_set_matrices_with_anim(&renderdata, model); if (fulltick) { mtx00015be4(cam_get_projection_mtxf(), model->matrices, &sp412); @@ -11145,12 +11147,12 @@ s32 obj_tick_player(struct prop *prop) } } } else { - struct modelrenderdata sp312 = {0, 1, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; Mtxf sp248; struct coord sp236; RoomNum sp220[8]; s32 numchrs; - Mtxf sp152; + Mtxf rendermtx; s32 sp148; s32 sp144; s32 i; @@ -11181,12 +11183,14 @@ s32 obj_tick_player(struct prop *prop) mtx3_to_mtx4(obj->realrot, &sp248); mtx4_set_translation(&prop->pos, &sp248); - mtx4_mult_mtx4(cam_get_world_to_screen_mtxf(), &sp248, &sp152); + mtx4_mult_mtx4(cam_get_world_to_screen_mtxf(), &sp248, &rendermtx); sp556 = true; - sp312.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); - sp312.unk00 = &sp152; - model_set_matrices_with_anim(&sp312, model); + + renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); + renderdata.rendermtx = &rendermtx; + + model_set_matrices_with_anim(&renderdata, model); if (fulltick) { sp236.x = (f32)sp116.x + prop->pos.x; @@ -11202,8 +11206,10 @@ s32 obj_tick_player(struct prop *prop) if (model_get_cur_anim_frame(model) >= model_get_num_anim_frames(model) - 1) { modelmgr_free_anim(model->anim); model->anim = NULL; + mtx00015be4(cam_get_projection_mtxf(), model->matrices, &sp248); mtx4_to_mtx3(&sp248, obj->realrot); + tagnum = obj_get_tag_num(obj); if (tagnum >= 0) { @@ -12375,7 +12381,7 @@ void obj_render_prop(struct prop *prop, struct modelrenderdata *renderdata, bool gdl = renderdata->gdl; if (obj->type == OBJTYPE_SINGLEMONITOR) { - if (renderdata->flags & 1) { + if (renderdata->flags & MODELRENDERFLAG_OPA) { struct singlemonitorobj *monitor = (struct singlemonitorobj *) prop->obj; if (obj->flags2 & OBJFLAG2_DRAWONTOP) { @@ -12389,7 +12395,7 @@ void obj_render_prop(struct prop *prop, struct modelrenderdata *renderdata, bool gdl = tvscreen_render(model, model_get_part(model->definition, MODELPART_0000), &monitor->screen, gdl, sp60, 1); } } else if (obj->type == OBJTYPE_MULTIMONITOR) { - if (renderdata->flags & 1) { + if (renderdata->flags & MODELRENDERFLAG_OPA) { struct multimonitorobj *monitor = (struct multimonitorobj *) prop->obj; if (obj->flags2 & OBJFLAG2_DRAWONTOP) { @@ -12427,13 +12433,13 @@ void obj_render_prop(struct prop *prop, struct modelrenderdata *renderdata, bool renderdata->cullmode = CULLMODE_BACK; } - if (renderdata->unk30 == 9) { + if (renderdata->context == MODELRENDERCONTEXT_OBJ_OPA) { renderdata->envcolour &= 0xffffff00; } } else if ((obj->hidden2 & OBJH2FLAG_DEFORMED) == 0) { renderdata->cullmode = CULLMODE_BACK; - if (renderdata->unk30 == 9) { + if (renderdata->context == MODELRENDERCONTEXT_OBJ_OPA) { renderdata->envcolour &= 0xffffff00; } } else { @@ -12441,7 +12447,7 @@ void obj_render_prop(struct prop *prop, struct modelrenderdata *renderdata, bool renderdata->cullmode = CULLMODE_NONE; - if (renderdata->unk30 == 9) { + if (renderdata->context == MODELRENDERCONTEXT_OBJ_OPA) { s32 alpha = 100 + level * 50; if (alpha > 255) { @@ -12599,10 +12605,10 @@ Gfx *obj_render(struct prop *prop, Gfx *gdl, bool xlupass) f32 shadecolourfracs[4]; s32 shademode; struct defaultobj *obj = prop->obj; - struct modelrenderdata renderdata = {NULL, true, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; struct screenbox screenbox; s32 colour[4]; - s32 sp84; + s32 flags; s32 healththing; s32 alpha = 0xff; f32 xrayalphafrac; @@ -12687,12 +12693,12 @@ Gfx *obj_render(struct prop *prop, Gfx *gdl, bool xlupass) return gdl; } - sp84 = 3; + flags = MODELRENDERFLAG_OPA | MODELRENDERFLAG_XLU; } else { if (!xlupass) { - sp84 = 1; + flags = MODELRENDERFLAG_OPA; } else { - sp84 = 2; + flags = MODELRENDERFLAG_XLU; } } @@ -12721,15 +12727,15 @@ Gfx *obj_render(struct prop *prop, Gfx *gdl, bool xlupass) gdl = bg_scissor_to_viewport(gdl); } - renderdata.flags = sp84; + renderdata.flags = flags; renderdata.zbufferenabled = (obj->flags2 & OBJFLAG2_DRAWONTOP) == 0; renderdata.gdl = gdl; if (alpha < 0xff) { - renderdata.unk30 = 5; + renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU; renderdata.envcolour = alpha; } else { - renderdata.unk30 = 9; + renderdata.context = MODELRENDERCONTEXT_OBJ_OPA; if (obj->type == OBJTYPE_TINTEDGLASS) { struct tintedglassobj *glass = (struct tintedglassobj *)obj; diff --git a/src/game/title.c b/src/game/title.c index eb57c6e03..bc5285c7e 100644 --- a/src/game/title.c +++ b/src/game/title.c @@ -322,7 +322,7 @@ Gfx *title_render_legal(Gfx *gdl) #endif struct legalelement *elem; struct legalelement *end; - struct modelrenderdata renderdata = { NULL, true, 3 }; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; s32 x; s32 y; struct fontchar *font1; @@ -712,9 +712,9 @@ void title_tick_pd_logo(void) } } -Gfx *title_render_pd_logo_model(Gfx *gdl, struct model *model, bool arg2, f32 arg3, s32 arg4, f32 arg5, Mtxf *arg6, Vtx *vertices, Col *colours) +Gfx *title_render_pd_logo_model(Gfx *gdl, struct model *model, bool arg2, f32 arg3, s32 arg4, f32 arg5, Mtxf *rendermtx, Vtx *vertices, Col *colours) { - struct modelrenderdata renderdata = {NULL, true, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; s32 tmp2; s32 i; s32 j; @@ -857,16 +857,16 @@ Gfx *title_render_pd_logo_model(Gfx *gdl, struct model *model, bool arg2, f32 ar gDPSetPrimColor(gdl++, 0, 0, 0x00, 0x00, 0x00, alpha1); - renderdata.unk00 = arg6; - renderdata.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); + renderdata.rendermtx = rendermtx; + renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); - mtx4_copy(arg6, renderdata.unk10); + mtx4_copy(rendermtx, renderdata.matrices); - model->matrices = renderdata.unk10; + model->matrices = renderdata.matrices; model_update_relations(model); - renderdata.flags = 3; + renderdata.flags = MODELRENDERFLAG_DEFAULT; renderdata.zbufferenabled = false; renderdata.gdl = gdl; @@ -956,10 +956,10 @@ void title_skip_to_pd_title(void) Gfx *title_render_pd_logo(Gfx *gdl) { - struct modelrenderdata renderdata = {NULL, true, 3}; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; Mtxf sp2b0; - Mtxf sp270; - Mtxf sp230; + Mtxf rendermtx1; + Mtxf rendermtx2; struct model *model; struct modelnode *node; Mtxf sp1e8; @@ -1368,8 +1368,8 @@ Gfx *title_render_pd_logo(Gfx *gdl) mtx4_load_y_rotation(g_PdLogoYRotCur, &sp1e8); mtx4_load_x_rotation(g_PdLogoXRotCur, &sp1a8); mtx4_mult_mtx4_in_place(&sp1a8, &sp1e8); - mtx4_mult_mtx4(&sp2b0, &sp1e8, &sp270); - mtx00015f04(g_PdLogoScale, &sp270); + mtx4_mult_mtx4(&sp2b0, &sp1e8, &rendermtx1); + mtx00015f04(g_PdLogoScale, &rendermtx1); #if VERSION != VERSION_JPN_FINAL g_TitleLightPdLogoNotFront.a.l.col[0] = g_TitleLightPdLogoNotFront.a.l.col[1] = g_TitleLightPdLogoNotFront.a.l.col[2] = g_TitleLightPdLogoNotFront.a.l.colc[0] = g_TitleLightPdLogoNotFront.a.l.colc[1] = g_TitleLightPdLogoNotFront.a.l.colc[2] = 255.0f * g_PdLogoAmbientLightFrac; @@ -1448,7 +1448,7 @@ Gfx *title_render_pd_logo(Gfx *gdl) } } - gdl = title_render_pd_logo_model(gdl, model, var80062804, g_PdLogoFrac, 240, 1.0f, &sp270, gfx_allocate_vertices(numvertices), gfx_allocate_colours(numcolours)); + gdl = title_render_pd_logo_model(gdl, model, var80062804, g_PdLogoFrac, 240, 1.0f, &rendermtx1, gfx_allocate_vertices(numvertices), gfx_allocate_colours(numcolours)); } gSPSetLights1(gdl++, g_TitleLightPdLogoMain); @@ -1461,9 +1461,9 @@ Gfx *title_render_pd_logo(Gfx *gdl) #if VERSION == VERSION_JPN_FINAL mtx00015ea8(0.01f, &sp1e8); - mtx4_mult_mtx4(&sp2b0, &sp1e8, &sp230); - mtx00015f04(0.308f, &sp230); - mtx00015f04(3.5f, &sp230); + mtx4_mult_mtx4(&sp2b0, &sp1e8, &rendermtx2); + mtx00015f04(0.308f, &rendermtx2); + mtx00015f04(3.5f, &rendermtx2); if (g_PdLogoTitleStep >= 0) { // Background flashing logo @@ -1482,16 +1482,16 @@ Gfx *title_render_pd_logo(Gfx *gdl) mtx4_mult_mtx4_in_place(&sp2b0, &sp1b0); mtx4_copy(&sp1b0, &sp2b0); - renderdata.unk00 = &sp2b0; - renderdata.unk10 = gfx_allocate(g_TitleModelJpnLogo2->definition->nummatrices * sizeof(Mtxf)); + renderdata.rendermtx = &sp2b0; + renderdata.matrices = gfx_allocate(g_TitleModelJpnLogo2->definition->nummatrices * sizeof(Mtxf)); - mtx4_copy(&sp2b0, renderdata.unk10); + mtx4_copy(&sp2b0, renderdata.matrices); - g_TitleModelJpnLogo2->matrices = renderdata.unk10; + g_TitleModelJpnLogo2->matrices = renderdata.matrices; model_update_relations(g_TitleModelJpnLogo2); - renderdata.unk30 = 5; + renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU; renderdata.zbufferenabled = false; renderdata.fogcolour = 0xff0000ff; renderdata.envcolour = 0xff000000 | envalpha; @@ -1537,19 +1537,18 @@ Gfx *title_render_pd_logo(Gfx *gdl) gSPSetLights1(gdl++, g_TitleLightPdLogoJpn); gSPSetLights1(gdl++, g_TitleLightPdLogoMain); - renderdata.unk00 = &sp230; + renderdata.rendermtx = &rendermtx2; + renderdata.matrices = gfx_allocate(g_TitleModelJpnPd->definition->nummatrices * sizeof(Mtxf)); - renderdata.unk10 = gfx_allocate(g_TitleModelJpnPd->definition->nummatrices * sizeof(Mtxf)); + mtx4_copy(&rendermtx2, renderdata.matrices); - mtx4_copy(&sp230, renderdata.unk10); - - g_TitleModelJpnPd->matrices = renderdata.unk10; + g_TitleModelJpnPd->matrices = renderdata.matrices; model_update_relations(g_TitleModelJpnPd); // @bug: || should be | in fogcolour expression renderdata.zbufferenabled = false; - renderdata.unk30 = 5; + renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU; renderdata.fogcolour = fogcolour << 24 || fogcolour << 16 || (fogcolour << 8 | 0xff); renderdata.envcolour = envcolour; renderdata.gdl = gdl; @@ -1578,17 +1577,17 @@ Gfx *title_render_pd_logo(Gfx *gdl) mtx4_mult_mtx4_in_place(&sp2b0, &spb0); mtx4_copy(&spb0, &sp2b0); - renderdata.unk00 = &sp2b0; - renderdata.unk10 = gfx_allocate(g_TitleModelJpnLogo1->definition->nummatrices * sizeof(Mtxf)); + renderdata.rendermtx = &sp2b0; + renderdata.matrices = gfx_allocate(g_TitleModelJpnLogo1->definition->nummatrices * sizeof(Mtxf)); - mtx4_copy(&sp2b0, renderdata.unk10); + mtx4_copy(&sp2b0, renderdata.matrices); - g_TitleModelJpnLogo1->matrices = renderdata.unk10; + g_TitleModelJpnLogo1->matrices = renderdata.matrices; model_update_relations(g_TitleModelJpnLogo1); renderdata.zbufferenabled = false; - renderdata.unk30 = 5; + renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU; renderdata.fogcolour = 0x000000ff; renderdata.envcolour = 0x000000ff; renderdata.gdl = gdl; @@ -1606,8 +1605,8 @@ Gfx *title_render_pd_logo(Gfx *gdl) } #else mtx00015f88(1.0f + sp13c, &sp1e8); - mtx4_mult_mtx4(&sp2b0, &sp1e8, &sp230); - mtx00015f04(0.308f, &sp230); + mtx4_mult_mtx4(&sp2b0, &sp1e8, &rendermtx2); + mtx00015f04(0.308f, &rendermtx2); // Render the "PERFECT DARK" model if (g_PdLogoTitleStep >= 0) { @@ -1616,18 +1615,18 @@ Gfx *title_render_pd_logo(Gfx *gdl) } else if (g_PdLogoTitleStep == 1) { bool visible = g_PdLogoTitleStepFrac < 0.5f; model = g_TitleModelPdThree; - gdl = title_render_pd_logo_model(gdl, model, visible, g_PdLogoTitleStepFrac, 255, g_PdLogoTitleStepFrac, &sp230, g_PdLogoVertices[g_PdLogoVtxColIndex], g_PdLogoColours[g_PdLogoVtxColIndex]); + gdl = title_render_pd_logo_model(gdl, model, visible, g_PdLogoTitleStepFrac, 255, g_PdLogoTitleStepFrac, &rendermtx2, g_PdLogoVertices[g_PdLogoVtxColIndex], g_PdLogoColours[g_PdLogoVtxColIndex]); } else if (g_PdLogoTitleStep == 2) { bool visible = g_PdLogoTitleStepFrac < 0.5f; model = g_TitleModelPdTwo; - gdl = title_render_pd_logo_model(gdl, model, visible, 1.0f - g_PdLogoTitleStepFrac, 255, 1.0f, &sp230, g_PdLogoVertices[g_PdLogoVtxColIndex], g_PdLogoColours[g_PdLogoVtxColIndex]); + gdl = title_render_pd_logo_model(gdl, model, visible, 1.0f - g_PdLogoTitleStepFrac, 255, 1.0f, &rendermtx2, g_PdLogoVertices[g_PdLogoVtxColIndex], g_PdLogoColours[g_PdLogoVtxColIndex]); } else if (g_PdLogoTitleStep == 3) { bool visible = g_PdLogoTitleStepFrac < 0.5f; model = g_TitleModelPdTwo; - gdl = title_render_pd_logo_model(gdl, model, visible, g_PdLogoTitleStepFrac, 255, 1.0f, &sp230, g_PdLogoVertices[g_PdLogoVtxColIndex], g_PdLogoColours[g_PdLogoVtxColIndex]); + gdl = title_render_pd_logo_model(gdl, model, visible, g_PdLogoTitleStepFrac, 255, 1.0f, &rendermtx2, g_PdLogoVertices[g_PdLogoVtxColIndex], g_PdLogoColours[g_PdLogoVtxColIndex]); } else { model = g_TitleModelPdTwo; - gdl = title_render_pd_logo_model(gdl, model, false, 1.0f, 255, 1.0f, &sp230, g_PdLogoVertices[g_PdLogoVtxColIndex], g_PdLogoColours[g_PdLogoVtxColIndex]); + gdl = title_render_pd_logo_model(gdl, model, false, 1.0f, 255, 1.0f, &rendermtx2, g_PdLogoVertices[g_PdLogoVtxColIndex], g_PdLogoColours[g_PdLogoVtxColIndex]); } } #endif @@ -1847,10 +1846,10 @@ void title_tick_nintendo_logo(void) Gfx *title_render_nintendo_logo(Gfx *gdl) { - struct modelrenderdata renderdata = { NULL, true, 3 }; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; s32 i; s32 j; - Mtxf sp108; + Mtxf rendermtx; f32 fracdone = g_TitleTimer / (VERSION == VERSION_PAL_FINAL ? 183.0f : TICKS(240.0f)); struct coord lightdir = {0, 0, 0}; s32 v0; @@ -1902,22 +1901,23 @@ Gfx *title_render_nintendo_logo(Gfx *gdl) mtx4_load_rotation(&sp9c, &spa8); mtx00015f88(fracdone * 0.2f + 1.0f, &spa8); - mtx00016ae4(&sp108, + mtx00016ae4(&rendermtx, /* pos */ 0.0f, 0.0f, 4000, /* look */ 0.0f, 0.0f, 0.0f, /* up */ 0.0f, 1.0f, 0.0f); - mtx4_mult_mtx4_in_place(&sp108, &spa8); - mtx4_copy(&spa8, &sp108); - renderdata.unk00 = &sp108; + mtx4_mult_mtx4_in_place(&rendermtx, &spa8); + mtx4_copy(&spa8, &rendermtx); - renderdata.unk10 = gfx_allocate(g_TitleModel->definition->nummatrices * sizeof(Mtxf)); - mtx4_copy(&sp108, renderdata.unk10); - g_TitleModel->matrices = renderdata.unk10; + renderdata.rendermtx = &rendermtx; + renderdata.matrices = gfx_allocate(g_TitleModel->definition->nummatrices * sizeof(Mtxf)); + + mtx4_copy(&rendermtx, renderdata.matrices); + g_TitleModel->matrices = renderdata.matrices; model_update_relations(g_TitleModel); - renderdata.flags = 3; + renderdata.flags = MODELRENDERFLAG_DEFAULT; renderdata.zbufferenabled = false; renderdata.gdl = gdl; @@ -2026,10 +2026,10 @@ f32 func0f019d0c(f32 arg0) Gfx *title_render_rare_logo(Gfx *gdl) { - struct modelrenderdata renderdata = { NULL, true, 3 }; + struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT }; s32 i; f32 fracdone = g_TitleTimer / TICKS(240.0f); - Mtxf sp118; + Mtxf rendermtx; s32 j; s32 s0; @@ -2099,19 +2099,20 @@ Gfx *title_render_rare_logo(Gfx *gdl) mtx4_load_rotation(&spb4, &spc0); mtx00015f88(1 + fracdone * 0.25f, &spc0); - mtx00016ae4(&sp118, + mtx00016ae4(&rendermtx, /* pos */ 0, 0, 4000, /* look */ 0, 0, 0, /* up */ 0, 1, 0); - mtx4_mult_mtx4_in_place(&sp118, &spc0); - mtx4_copy(&spc0, &sp118); + mtx4_mult_mtx4_in_place(&rendermtx, &spc0); + mtx4_copy(&spc0, &rendermtx); - renderdata.unk00 = &sp118; - renderdata.unk10 = gfx_allocate(g_TitleModel->definition->nummatrices * sizeof(Mtxf)); - mtx4_copy(&sp118, renderdata.unk10); + renderdata.rendermtx = &rendermtx; + renderdata.matrices = gfx_allocate(g_TitleModel->definition->nummatrices * sizeof(Mtxf)); - g_TitleModel->matrices = renderdata.unk10; + mtx4_copy(&rendermtx, renderdata.matrices); + + g_TitleModel->matrices = renderdata.matrices; model_update_relations(g_TitleModel); @@ -2135,8 +2136,8 @@ Gfx *title_render_rare_logo(Gfx *gdl) gSPSetLights1(gdl++, g_TitleLightNintendoRare); - renderdata.flags = 3; - renderdata.zbufferenabled = 0; + renderdata.flags = MODELRENDERFLAG_DEFAULT; + renderdata.zbufferenabled = false; renderdata.gdl = gdl; model_render(&renderdata, g_TitleModel); @@ -2163,8 +2164,8 @@ Gfx *title_render_rare_logo(Gfx *gdl) gSPSetLights1(gdl++, g_TitleLightNintendoRare); - renderdata.flags = 3; - renderdata.zbufferenabled = 0; + renderdata.flags = MODELRENDERFLAG_DEFAULT; + renderdata.zbufferenabled = false; renderdata.gdl = gdl; model_render(&renderdata, g_TitleModel); diff --git a/src/include/constants.h b/src/include/constants.h index 7a0e0ce7a..9ab98fe95 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2589,6 +2589,20 @@ #define MODELRENDERFLAG_OPA 1 #define MODELRENDERFLAG_XLU 2 +#define MODELRENDERFLAG_DEFAULT (MODELRENDERFLAG_OPA | MODELRENDERFLAG_XLU) + +#define MODELRENDERCONTEXT_MENUMODEL_OPA 1 +#define MODELRENDERCONTEXT_BONDGUN_OPA 4 +#define MODELRENDERCONTEXT_BONDGUN_OBJ_XLU 5 +#define MODELRENDERCONTEXT_CHR_OPA 7 +#define MODELRENDERCONTEXT_CHR_XLU 8 +#define MODELRENDERCONTEXT_OBJ_OPA 9 + +#define MODELRENDERMODE_0 0 // Not referenced in code, but is referenced in model files +#define MODELRENDERMODE_SIMPLE 1 // Texture * shade +#define MODELRENDERMODE_TRILERP 2 // Use LOD level to modulate texels from two bilerp tiles +#define MODELRENDERMODE_CTXAWARE_1PASS 3 // Different settings based on model type, xlu rendered on same pass as opa +#define MODELRENDERMODE_CTXAWARE_2PASS 4 // Different settings based on model type, opa/xlu rendered on different passes #define MODFILE_GAME 1 #define MODFILE_MPSETUP 2 diff --git a/src/include/types.h b/src/include/types.h index e171b434a..6f12f98a7 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -433,7 +433,7 @@ struct modelrodata_gundl { // type 0x04 void *baseaddr; Vtx *vertices; s16 numvertices; - s16 unk12; + s16 rendermode; }; struct modelrodata_distance { // type 0x08 @@ -542,7 +542,7 @@ struct modelrodata_dl { // type 0x18 /*0x08*/ Col *colours; /*0x0c*/ Vtx *vertices; // colours follow this array /*0x10*/ s16 numvertices; - /*0x12*/ s16 mcount; + /*0x12*/ s16 rendermode; /*0x14*/ u16 rwdataindex; /*0x16*/ u16 numcolours; }; @@ -5006,19 +5006,13 @@ struct animtableentry { }; struct modelrenderdata { - /*0x00*/ Mtxf *unk00; + /*0x00*/ Mtxf *rendermtx; /*0x04*/ bool zbufferenabled; /*0x08*/ u32 flags; /*0x0c*/ Gfx *gdl; - /*0x10*/ Mtxf *unk10; - /*0x14*/ u32 unk14; - /*0x18*/ u32 unk18; - /*0x1c*/ u32 unk1c; - /*0x20*/ u32 unk20; - /*0x24*/ u32 unk24; - /*0x28*/ u32 unk28; - /*0x2c*/ u32 unk2c; - /*0x30*/ s32 unk30; + /*0x10*/ Mtxf *matrices; + /*0x14*/ u32 unk14[7]; + /*0x30*/ s32 context; /*0x34*/ u32 envcolour; /*0x38*/ u32 fogcolour; /*0x3c*/ u32 cullmode; diff --git a/src/lib/model.c b/src/lib/model.c index 0b0390422..1d685c4e0 100644 --- a/src/lib/model.c +++ b/src/lib/model.c @@ -723,7 +723,7 @@ void model_update_info(struct model *model) } } -void model_update_chr_node_mtx(struct modelrenderdata *arg0, struct model *model, struct modelnode *node) +void model_update_chr_node_mtx(struct modelrenderdata *renderdata, struct model *model, struct modelnode *node) { struct anim *anim = model->anim; union modelrodata *rodata = node->rodata; @@ -731,7 +731,7 @@ void model_update_chr_node_mtx(struct modelrenderdata *arg0, struct model *model f32 scale = model->scale; struct coord *sp254 = &rwdata->chrinfo.pos; f32 sp250 = rwdata->chrinfo.yrot; - Mtxf *sp24c; + Mtxf *rendermtx; u32 stack1; Mtxf *mtx = &model->matrices[rodata->chrinfo.mtxindex]; s32 animpart = rodata->chrinfo.animpart; @@ -761,9 +761,9 @@ void model_update_chr_node_mtx(struct modelrenderdata *arg0, struct model *model if (rodata->chrinfo.mtxindex); if (node->parent) { - sp24c = model_find_node_mtx(model, node->parent, 0); + rendermtx = model_find_node_mtx(model, node->parent, 0); } else { - sp24c = arg0->unk00; + rendermtx = renderdata->rendermtx; } anim_get_rot_translate_scale(animpart, anim->flip, skel, anim->animnum, anim->frameslot1, &rot1, &translate1, &scale1); @@ -824,8 +824,8 @@ void model_update_chr_node_mtx(struct modelrenderdata *arg0, struct model *model mtx00015f4c(scale, &sp158); } - if (sp24c) { - mtx00015be4(sp24c, &sp158, mtx); + if (rendermtx) { + mtx00015be4(rendermtx, &sp158, mtx); } else { mtx4_copy(&sp158, mtx); } @@ -846,7 +846,7 @@ void model_position_joint_using_vec_rot(struct modelrenderdata *renderdata, stru if (node->parent != NULL) { rendermtx = model_find_node_mtx(model, node->parent, 0); } else { - rendermtx = renderdata->unk00; + rendermtx = renderdata->rendermtx; } if (rendermtx != NULL) { @@ -960,7 +960,7 @@ void model_position_joint_using_quat_rot(struct modelrenderdata *renderdata, str if (node->parent != NULL) { rendermtx = model_find_node_mtx(model, node->parent, 0); } else { - rendermtx = renderdata->unk00; + rendermtx = renderdata->rendermtx; } if (rendermtx != NULL) { @@ -1060,7 +1060,7 @@ void model_update_position_node_mtx(struct modelrenderdata *renderdata, struct m struct coord scale1; bool sp128; Mtxf spe8; - Mtxf *mtx; + Mtxf *rendermtx; f32 spe0; struct coord rot2; struct coord translate2; @@ -1174,37 +1174,37 @@ void model_update_position_node_mtx(struct modelrenderdata *renderdata, struct m } } else { if (node->parent) { - mtx = model_find_node_mtx(model, node->parent, 0); + rendermtx = model_find_node_mtx(model, node->parent, 0); } else { - mtx = renderdata->unk00; + rendermtx = renderdata->rendermtx; } - if (mtx) { + if (rendermtx) { mtx4_load_translation(&rodata->pos, &spe8); - mtx00015be4(mtx, &spe8, &model->matrices[rodata->mtxindex0]); + mtx00015be4(rendermtx, &spe8, &model->matrices[rodata->mtxindex0]); } else { mtx4_load_translation(&rodata->pos, &model->matrices[rodata->mtxindex0]); } } } -void model_update_position_held_node_mtx(struct modelrenderdata *arg0, struct model *model, struct modelnode *node) +void model_update_position_held_node_mtx(struct modelrenderdata *renderdata, struct model *model, struct modelnode *node) { union modelrodata *rodata = node->rodata; - Mtxf *sp68; + Mtxf *rendermtx; Mtxf sp28; s32 mtxindex = rodata->positionheld.mtxindex; Mtxf *matrices = model->matrices; if (node->parent) { - sp68 = model_find_node_mtx(model, node->parent, 0); + rendermtx = model_find_node_mtx(model, node->parent, 0); } else { - sp68 = arg0->unk00; + rendermtx = renderdata->rendermtx; } - if (sp68) { + if (rendermtx) { mtx4_load_translation(&rodata->positionheld.pos, &sp28); - mtx00015be4(sp68, &sp28, &matrices[mtxindex]); + mtx00015be4(rendermtx, &sp28, &matrices[mtxindex]); } else { mtx4_load_translation(&rodata->positionheld.pos, &matrices[mtxindex]); } @@ -1499,7 +1499,7 @@ void model_update_relations(struct model *model) } } -void model_update_matrices(struct modelrenderdata *arg0, struct model *model) +void model_update_matrices(struct modelrenderdata *renderdata, struct model *model) { struct modelnode *node = model->definition->rootnode; @@ -1508,13 +1508,13 @@ void model_update_matrices(struct modelrenderdata *arg0, struct model *model) switch (type) { case MODELNODETYPE_CHRINFO: - model_update_chr_node_mtx(arg0, model, node); + model_update_chr_node_mtx(renderdata, model, node); break; case MODELNODETYPE_POSITION: - model_update_position_node_mtx(arg0, model, node); + model_update_position_node_mtx(renderdata, model, node); break; case MODELNODETYPE_POSITIONHELD: - model_update_position_held_node_mtx(arg0, model, node); + model_update_position_held_node_mtx(renderdata, model, node); break; case MODELNODETYPE_DISTANCE: model_update_distance_relations(model, node); @@ -1550,9 +1550,9 @@ void model_update_matrices(struct modelrenderdata *arg0, struct model *model) void model_set_matrices(struct modelrenderdata *renderdata, struct model *model) { - model->matrices = renderdata->unk10; + model->matrices = renderdata->matrices; - renderdata->unk10 += model->definition->nummatrices; + renderdata->matrices += model->definition->nummatrices; #if VERSION >= VERSION_PAL_BETA if (var8005efb0_2 || !modelasm00018680(renderdata, model)) { @@ -2797,7 +2797,7 @@ void model_tick_anim(struct model *model, s32 lvupdate240, bool arg2) } #endif -void model_apply_render_mode_type1(struct modelrenderdata *renderdata) +void model_apply_rendermode_simple(struct modelrenderdata *renderdata) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_1CYCLE); @@ -2811,10 +2811,12 @@ void model_apply_render_mode_type1(struct modelrenderdata *renderdata) gDPSetCombineMode(renderdata->gdl++, G_CC_MODULATEIA, G_CC_MODULATEIA); } -void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1) +void model_apply_rendermode_ctxaware_1pass(struct modelrenderdata *renderdata, bool isopa) { - if (renderdata->unk30 == 7) { - if (arg1) { + if (renderdata->context == MODELRENDERCONTEXT_CHR_OPA) { + // envcolour is blood colour + // fogcolour is shade colour + if (isopa) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); @@ -2833,8 +2835,10 @@ void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1 gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); } } - } else if (renderdata->unk30 == 8) { - if (arg1) { + } else if (renderdata->context == MODELRENDERCONTEXT_CHR_XLU) { + // envcolour is opacity + // fogcolour is shade colour + if (isopa) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); @@ -2847,9 +2851,11 @@ void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1 gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); } } - } else if (renderdata->unk30 == 9) { + } else if (renderdata->context == MODELRENDERCONTEXT_OBJ_OPA) { + // envcolour's blue channel is opacity + // fogcolour is shade colour if ((renderdata->envcolour & 0xff) == 0) { - if (arg1) { + if (isopa) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); @@ -2870,7 +2876,7 @@ void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1 } } } else { - if (arg1) { + if (isopa) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); @@ -2893,8 +2899,9 @@ void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1 } } } - } else if (renderdata->unk30 == 4) { - if (arg1) { + } else if (renderdata->context == MODELRENDERCONTEXT_BONDGUN_OPA) { + // envcolour is shade colour + if (isopa) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->envcolour); @@ -2912,10 +2919,12 @@ void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1 gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); } } - } else if (renderdata->unk30 == 5) { + } else if (renderdata->context == MODELRENDERCONTEXT_BONDGUN_OBJ_XLU) { + // envcolour is opacity + // fogcolour is shade colour u8 alpha; - if (arg1) { + if (isopa) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); @@ -2948,8 +2957,8 @@ void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1 gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2); } } - } else { - if (arg1) { + } else { // MODELRENDERCONTEXT_MENUMODEL_OPA + if (isopa) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2); @@ -2969,16 +2978,18 @@ void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1 } } -void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1) +void model_apply_rendermode_ctxaware_2pass(struct modelrenderdata *renderdata, bool isopa) { - if (renderdata->unk30 == 7) { + if (renderdata->context == MODELRENDERCONTEXT_CHR_OPA) { + // envcolour is blood colour + // fogcolour is shade colour gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); gDPSetEnvColorViaWord(renderdata->gdl++, renderdata->envcolour | 0x000000ff); gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_17, G_CC_CUSTOM_18); - if (arg1) { + if (isopa) { if (renderdata->zbufferenabled) { gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2); } else { @@ -2991,7 +3002,9 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); } } - } else if (renderdata->unk30 == 8) { + } else if (renderdata->context == MODELRENDERCONTEXT_CHR_XLU) { + // envcolour is opacity + // fogcolour is shade colour gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); @@ -3003,7 +3016,9 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 } else { gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); } - } else if (renderdata->unk30 == 9) { + } else if (renderdata->context == MODELRENDERCONTEXT_OBJ_OPA) { + // envcolour's blue channel is opacity + // fogcolour is shade colour if ((renderdata->envcolour & 0xff) == 0) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); @@ -3011,7 +3026,7 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 gDPSetEnvColorViaWord(renderdata->gdl++, 0xffffffff); gDPSetPrimColor(renderdata->gdl++, 0, 0, 0, 0, 0, (renderdata->envcolour >> 8) & 0xff); - if (arg1) { + if (isopa) { gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_CUSTOM_20); if (renderdata->zbufferenabled) { @@ -3034,7 +3049,7 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); gDPSetEnvColorViaWord(renderdata->gdl++, renderdata->envcolour & 0xff); - if (arg1) { + if (isopa) { gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_21, G_CC_CUSTOM_18); if (renderdata->zbufferenabled) { @@ -3053,13 +3068,14 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 } } } - } else if (renderdata->unk30 == 4) { + } else if (renderdata->context == MODELRENDERCONTEXT_BONDGUN_OPA) { + // envcolour is shade colour gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->envcolour); gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2); - if (arg1) { + if (isopa) { if (renderdata->zbufferenabled) { gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2); } else { @@ -3072,7 +3088,9 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); } } - } else if (renderdata->unk30 == 5) { + } else if (renderdata->context == MODELRENDERCONTEXT_BONDGUN_OBJ_XLU) { + // envcolour is opacity + // fogcolour is shade colour u8 alpha; gDPPipeSync(renderdata->gdl++); @@ -3084,7 +3102,7 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 if (alpha < 255) { gDPSetEnvColor(renderdata->gdl++, 0xff, 0xff, 0xff, alpha); - if (arg1) { + if (isopa) { if (renderdata->envcolour & 0xff00) { gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_24, G_CC_MODULATEIA2); } else { @@ -3102,13 +3120,13 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 } else { gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); } - } else { + } else { // MODELRENDERCONTEXT_MENUMODEL_OPA gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetFogColorViaWord(renderdata->gdl++, 0xffffff00); gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2); - if (arg1) { + if (isopa) { if (renderdata->zbufferenabled) { gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2); } else { @@ -3124,7 +3142,7 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1 } } -void model_apply_render_mode_type2(struct modelrenderdata *renderdata) +void model_apply_rendermode_trilerp(struct modelrenderdata *renderdata) { gDPPipeSync(renderdata->gdl++); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); @@ -3164,38 +3182,38 @@ void model_render_node_gundl(struct modelrenderdata *renderdata, struct model *m model_apply_cull_mode(renderdata); } - switch (rodata->unk12) { - case 1: - model_apply_render_mode_type1(renderdata); + switch (rodata->rendermode) { + case MODELRENDERMODE_SIMPLE: + model_apply_rendermode_simple(renderdata); break; - case 3: - model_apply_render_mode_type3(renderdata, true); + case MODELRENDERMODE_CTXAWARE_1PASS: + model_apply_rendermode_ctxaware_1pass(renderdata, true); break; - case 4: - model_apply_render_mode_type4(renderdata, true); + case MODELRENDERMODE_CTXAWARE_2PASS: + model_apply_rendermode_ctxaware_2pass(renderdata, true); break; - case 2: - model_apply_render_mode_type2(renderdata); + case MODELRENDERMODE_TRILERP: + model_apply_rendermode_trilerp(renderdata); break; } gSPDisplayList(renderdata->gdl++, rodata->opagdl); - if (rodata->unk12 == 3 && rodata->xlugdl) { - model_apply_render_mode_type3(renderdata, false); + if (rodata->rendermode == MODELRENDERMODE_CTXAWARE_1PASS && rodata->xlugdl) { + model_apply_rendermode_ctxaware_1pass(renderdata, false); gSPDisplayList(renderdata->gdl++, rodata->xlugdl); } } - if ((renderdata->flags & MODELRENDERFLAG_XLU) && rodata->opagdl && rodata->unk12 == 4 && rodata->xlugdl) { + if ((renderdata->flags & MODELRENDERFLAG_XLU) && rodata->opagdl && rodata->rendermode == MODELRENDERMODE_CTXAWARE_2PASS && rodata->xlugdl) { gSPSegment(renderdata->gdl++, SPSEGMENT_MODEL_COL1, osVirtualToPhysical(rodata->baseaddr)); if (renderdata->cullmode) { model_apply_cull_mode(renderdata); } - model_apply_render_mode_type4(renderdata, false); + model_apply_rendermode_ctxaware_2pass(renderdata, false); gSPDisplayList(renderdata->gdl++, rodata->xlugdl); } @@ -3219,18 +3237,18 @@ void model_render_node_dl(struct modelrenderdata *renderdata, struct model *mode model_apply_cull_mode(renderdata); } - switch (rodata->dl.mcount) { - case 1: - model_apply_render_mode_type1(renderdata); + switch (rodata->dl.rendermode) { + case MODELRENDERMODE_SIMPLE: + model_apply_rendermode_simple(renderdata); break; - case 3: - model_apply_render_mode_type3(renderdata, true); + case MODELRENDERMODE_CTXAWARE_1PASS: + model_apply_rendermode_ctxaware_1pass(renderdata, true); break; - case 4: - model_apply_render_mode_type4(renderdata, true); + case MODELRENDERMODE_CTXAWARE_2PASS: + model_apply_rendermode_ctxaware_2pass(renderdata, true); break; - case 2: - model_apply_render_mode_type2(renderdata); + case MODELRENDERMODE_TRILERP: + model_apply_rendermode_trilerp(renderdata); break; } @@ -3239,8 +3257,8 @@ void model_render_node_dl(struct modelrenderdata *renderdata, struct model *mode gSPDisplayList(renderdata->gdl++, rwdata->dl.gdl); - if (rodata->dl.mcount == 3 && rodata->dl.xlugdl) { - model_apply_render_mode_type3(renderdata, false); + if (rodata->dl.rendermode == MODELRENDERMODE_CTXAWARE_1PASS && rodata->dl.xlugdl) { + model_apply_rendermode_ctxaware_1pass(renderdata, false); gSPDisplayList(renderdata->gdl++, rodata->dl.xlugdl); } @@ -3250,7 +3268,7 @@ void model_render_node_dl(struct modelrenderdata *renderdata, struct model *mode if (renderdata->flags & MODELRENDERFLAG_XLU) { union modelrwdata *rwdata = model_get_node_rw_data(model, node); - if (rwdata->dl.gdl && rodata->dl.mcount == 4 && rodata->dl.xlugdl) { + if (rwdata->dl.gdl && rodata->dl.rendermode == MODELRENDERMODE_CTXAWARE_2PASS && rodata->dl.xlugdl) { gSPSegment(renderdata->gdl++, SPSEGMENT_MODEL_COL1, osVirtualToPhysical(rodata->dl.colours)); if (renderdata->cullmode) { @@ -3260,7 +3278,7 @@ void model_render_node_dl(struct modelrenderdata *renderdata, struct model *mode gSPSegment(renderdata->gdl++, SPSEGMENT_MODEL_VTX, osVirtualToPhysical(rwdata->dl.vertices)); gSPSegment(renderdata->gdl++, SPSEGMENT_MODEL_COL2, osVirtualToPhysical(rwdata->dl.colours)); - model_apply_render_mode_type4(renderdata, false); + model_apply_rendermode_ctxaware_2pass(renderdata, false); gSPDisplayList(renderdata->gdl++, rodata->dl.xlugdl); } diff --git a/src/lib/modelasm_c.c b/src/lib/modelasm_c.c index 7dda2b042..b1ea53e68 100644 --- a/src/lib/modelasm_c.c +++ b/src/lib/modelasm_c.c @@ -363,7 +363,7 @@ bool modelasm00018680(struct modelrenderdata *renderdata, struct model *model) } } - t0mtx = node->parent ? modelasm_find_node_mtx(model, node->parent) : renderdata->unk00; + t0mtx = node->parent ? modelasm_find_node_mtx(model, node->parent) : renderdata->rendermtx; t1mtx = &model->matrices[node->rodata->position.mtxindex0]; modelasm_mtx_multiply(t0mtx, t1mtx); @@ -650,7 +650,7 @@ bool modelasm00018680(struct modelrenderdata *renderdata, struct model *model) f20 *= model->scale; } - t0mtx = renderdata->unk00; + t0mtx = renderdata->rendermtx; t1mtx = &model->matrices[node->rodata->chrinfo.mtxindex]; modelasm_mtx_multiply(t0mtx, t1mtx); @@ -671,7 +671,7 @@ bool modelasm00018680(struct modelrenderdata *renderdata, struct model *model) } break; case MODELNODETYPE_POSITIONHELD: - t0mtx = node->parent ? modelasm_find_node_mtx(model, node->parent) : renderdata->unk00; + t0mtx = node->parent ? modelasm_find_node_mtx(model, node->parent) : renderdata->rendermtx; f12 = 1; f13 = 0;