Set names for modelrenderdata properties

This commit is contained in:
Ryan Dwyer 2025-02-08 12:39:33 +10:00
parent eeff60ded0
commit c44895b2b2
12 changed files with 297 additions and 261 deletions

View File

@ -7334,7 +7334,7 @@ void bgun_create_fx(struct hand *hand, s32 handnum, struct funcdef *funcdef, s32
void bgun0f0a5550(s32 handnum) void bgun0f0a5550(s32 handnum)
{ {
u8 *mtxallocation; u8 *mtxallocation;
Mtxf sp2c4; Mtxf rendermtx;
Mtxf sp284; Mtxf sp284;
struct modeldef *modeldef = NULL; struct modeldef *modeldef = NULL;
struct coord sp274 = {0, 0, 0}; struct coord sp274 = {0, 0, 0};
@ -7526,10 +7526,10 @@ void bgun0f0a5550(s32 handnum)
mtx4_load_rotation(&sp1a4, &sp124); mtx4_load_rotation(&sp1a4, &sp124);
mtx4_mult_mtx4(&sp124, &sp164, &sp284); mtx4_mult_mtx4(&sp124, &sp164, &sp284);
mtx4_mult_mtx4_in_place(&sp284, &sp234); mtx4_mult_mtx4_in_place(&sp284, &sp234);
mtx4_copy(&sp234, &sp2c4); mtx4_copy(&sp234, &rendermtx);
mtx4_set_translation(&sp274, &sp2c4); mtx4_set_translation(&sp274, &rendermtx);
mtx4_copy(&sp2c4, &hand->cammtx); mtx4_copy(&rendermtx, &hand->cammtx);
mtx4_copy(&hand->posmtx, &hand->prevmtx); mtx4_copy(&hand->posmtx, &hand->prevmtx);
mtx00015be4(cam_get_projection_mtxf(), &hand->cammtx, &hand->posmtx); mtx00015be4(cam_get_projection_mtxf(), &hand->cammtx, &hand->posmtx);
@ -7549,12 +7549,12 @@ void bgun0f0a5550(s32 handnum)
hand->handmodel.matrices = (Mtxf *)mtxallocation; hand->handmodel.matrices = (Mtxf *)mtxallocation;
if (gset_has_weapon_flag(weaponnum, WEAPONFLAG_DUALFLIP) && handnum == HAND_LEFT) { 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) { if (hand->ejectcount > 0) {
switch (weaponnum) { switch (weaponnum) {
@ -7590,7 +7590,7 @@ void bgun0f0a5550(s32 handnum)
{ {
bool a0 = true; bool a0 = true;
struct modelrenderdata renderdata = {NULL, true, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
#if VERSION >= VERSION_PAL_BETA #if VERSION >= VERSION_PAL_BETA
bool a3 = false; bool a3 = false;
#endif #endif
@ -7603,8 +7603,8 @@ void bgun0f0a5550(s32 handnum)
s32 stack; s32 stack;
s32 sp6c; s32 sp6c;
renderdata.unk00 = &sp2c4; renderdata.rendermtx = &rendermtx;
renderdata.unk10 = hand->gunmodel.matrices; renderdata.matrices = hand->gunmodel.matrices;
if (hand->animmode != HANDANIMMODE_IDLE) { if (hand->animmode != HANDANIMMODE_IDLE) {
a0 = false; a0 = false;
@ -7677,8 +7677,8 @@ void bgun0f0a5550(s32 handnum)
spc4 = hand->gunmodel.matrices; spc4 = hand->gunmodel.matrices;
renderdata.unk00 = &sp84; renderdata.rendermtx = &sp84;
renderdata.unk10 = player->hands[HAND_RIGHT].unk0dd8; renderdata.matrices = player->hands[HAND_RIGHT].unk0dd8;
#if VERSION >= VERSION_PAL_BETA #if VERSION >= VERSION_PAL_BETA
var8005efd8_2 = true; var8005efd8_2 = true;
@ -7707,7 +7707,7 @@ void bgun0f0a5550(s32 handnum)
spc4 = hand->gunmodel.matrices; spc4 = hand->gunmodel.matrices;
for (spcc = 0; spcc < hand->gunmodel.definition->nummatrices; spcc++) { for (spcc = 0; spcc < hand->gunmodel.definition->nummatrices; spcc++) {
mtx00015be4(&sp2c4, spc8, spc4); mtx00015be4(&rendermtx, spc8, spc4);
spc8++; spc8++;
spc4++; spc4++;
} }
@ -8178,7 +8178,7 @@ s32 bgun_allocate_fireslot(void)
void bgun_render(Gfx **gdlptr) void bgun_render(Gfx **gdlptr)
{ {
Gfx *gdl = *gdlptr; Gfx *gdl = *gdlptr;
struct modelrenderdata renderdata = {NULL, true, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
struct player *player; struct player *player;
s32 handnum; s32 handnum;
@ -8257,7 +8257,7 @@ void bgun_render(Gfx **gdlptr)
} }
renderdata.gdl = gdl; renderdata.gdl = gdl;
renderdata.unk30 = 4; renderdata.context = MODELRENDERCONTEXT_BONDGUN_OPA;
if (USINGDEVICE(DEVICE_NIGHTVISION) || USINGDEVICE(DEVICE_IRSCANNER)) { if (USINGDEVICE(DEVICE_NIGHTVISION) || USINGDEVICE(DEVICE_IRSCANNER)) {
u8 *col = player->gunshadecol; u8 *col = player->gunshadecol;
@ -8307,7 +8307,7 @@ void bgun_render(Gfx **gdlptr)
alpha *= 0.74509805f; alpha *= 0.74509805f;
renderdata.fogcolour = renderdata.envcolour; renderdata.fogcolour = renderdata.envcolour;
renderdata.envcolour = 65 + alpha; renderdata.envcolour = 65 + alpha;
renderdata.unk30 = 5; renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU;
colour = renderdata.envcolour; colour = renderdata.envcolour;
} }

View File

@ -139,8 +139,8 @@ void bhead_update(f32 speedforwards, f32 speedsideways)
} }
{ {
struct modelrenderdata sp80 = {NULL, 1, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
Mtxf sp40; Mtxf rendermtx;
struct coord modelpos = {0, 0, 0}; struct coord modelpos = {0, 0, 0};
bool mergeenabled = model_is_anim_merging_enabled(); 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_tick_anim_quarter_speed(&g_Vars.currentplayer->model, g_Vars.lvupdate240, true);
model_set_anim_merging_enabled(mergeenabled); model_set_anim_merging_enabled(mergeenabled);
model_update_info(&g_Vars.currentplayer->model); model_update_info(&g_Vars.currentplayer->model);
mtx4_load_identity(&sp40); mtx4_load_identity(&rendermtx);
sp80.unk00 = &sp40; renderdata.rendermtx = &rendermtx;
sp80.unk10 = g_Vars.currentplayer->bondheadmatrices; renderdata.matrices = g_Vars.currentplayer->bondheadmatrices;
model_set_matrices_with_anim(&sp80, &g_Vars.currentplayer->model);
model_set_matrices_with_anim(&renderdata, &g_Vars.currentplayer->model);
g_Vars.currentplayer->headbodyoffset.x = g_Vars.currentplayer->standbodyoffset.x; g_Vars.currentplayer->headbodyoffset.x = g_Vars.currentplayer->standbodyoffset.x;
g_Vars.currentplayer->headbodyoffset.y = g_Vars.currentplayer->standbodyoffset.y; g_Vars.currentplayer->headbodyoffset.y = g_Vars.currentplayer->standbodyoffset.y;

View File

@ -94,15 +94,17 @@ void bhead_reset(void)
} }
{ {
struct modelrenderdata renderdata = {NULL, 1, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
Mtxf sp48; Mtxf rendermtx;
model_set_animation(&g_Vars.currentplayer->model, ANIM_TWO_GUN_HOLD, 0, 0, 0.5f, 0); model_set_animation(&g_Vars.currentplayer->model, ANIM_TWO_GUN_HOLD, 0, 0, 0.5f, 0);
model_update_info(&g_Vars.currentplayer->model); model_update_info(&g_Vars.currentplayer->model);
mtx4_load_identity(&sp48); mtx4_load_identity(&rendermtx);
renderdata.unk00 = &sp48;
renderdata.unk10 = g_Vars.currentplayer->bondheadmatrices; renderdata.rendermtx = &rendermtx;
renderdata.matrices = g_Vars.currentplayer->bondheadmatrices;
model_set_matrices_with_anim(&renderdata, &g_Vars.currentplayer->model); model_set_matrices_with_anim(&renderdata, &g_Vars.currentplayer->model);
g_Vars.currentplayer->standheight = g_Vars.currentplayer->bondheadmatrices[0].m[3][1]; g_Vars.currentplayer->standheight = g_Vars.currentplayer->bondheadmatrices[0].m[3][1];

View File

@ -1979,35 +1979,35 @@ void chr_tick_child(struct chrdata *chr, struct prop *prop, bool fulltick)
if (model->attachedtomodel && model->attachedtonode if (model->attachedtomodel && model->attachedtonode
&& (obj->hidden & OBJHFLAG_GONE) == 0 && (obj->hidden & OBJHFLAG_GONE) == 0
&& (obj->flags2 & OBJFLAG2_INVISIBLE) == 0) { && (obj->flags2 & OBJFLAG2_INVISIBLE) == 0) {
Mtxf *sp104 = model_find_node_mtx(model->attachedtomodel, model->attachedtonode, 0); Mtxf *mtx0 = model_find_node_mtx(model->attachedtomodel, model->attachedtonode, 0);
struct modelrenderdata thing = {NULL, 1, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
u32 stack; u32 stack;
Mtxf sp80; Mtxf rendermtx;
Mtxf sp40; Mtxf sp40;
prop->flags |= PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK; prop->flags |= PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK;
if (obj->hidden & OBJHFLAG_EMBEDDED) { if (obj->hidden & OBJHFLAG_EMBEDDED) {
mtx00015be4(sp104, &obj->embedment->matrix, &sp80); mtx00015be4(mtx0, &obj->embedment->matrix, &rendermtx);
thing.unk00 = &sp80; renderdata.rendermtx = &rendermtx;
} else if (CHRRACE(chr) == RACE_SKEDAR) { } else if (CHRRACE(chr) == RACE_SKEDAR) {
// The skedar hand position is rotated weirdly, so compensate for it // 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_load_z_rotation(BADDTOR(90.0), &sp40);
mtx4_mult_mtx4_in_place(&sp40, &sp80); mtx4_mult_mtx4_in_place(&sp40, &rendermtx);
mtx4_mult_mtx4_in_place(sp104, &sp80); mtx4_mult_mtx4_in_place(mtx0, &rendermtx);
thing.unk00 = &sp80; renderdata.rendermtx = &rendermtx;
} else if (prop == chr->weapons_held[HAND_LEFT]) { } else if (prop == chr->weapons_held[HAND_LEFT]) {
// Flip the model // Flip the model
mtx4_load_z_rotation(BADDTOR(180), &sp80); mtx4_load_z_rotation(BADDTOR(180), &rendermtx);
mtx4_mult_mtx4_in_place(sp104, &sp80); mtx4_mult_mtx4_in_place(mtx0, &rendermtx);
thing.unk00 = &sp80; renderdata.rendermtx = &rendermtx;
} else { } else {
thing.unk00 = sp104; renderdata.rendermtx = mtx0;
} }
thing.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf));
model_set_matrices(&thing, model); model_set_matrices(&renderdata, model);
obj_child_tick_player(prop, fulltick); obj_child_tick_player(prop, fulltick);
@ -2370,7 +2370,7 @@ bool chr_tick_beams(struct prop *prop)
*/ */
s32 chr_tick(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 chrdata *chr = prop->chr;
struct model *model = chr->model; struct model *model = chr->model;
bool needsupdate; bool needsupdate;
@ -2381,7 +2381,7 @@ s32 chr_tick(struct prop *prop)
bool fulltick = false; bool fulltick = false;
s32 race = CHRRACE(chr); s32 race = CHRRACE(chr);
s32 sp1e8; s32 sp1e8;
Mtxf sp1a8; Mtxf rendermtx;
s32 sp1a4; s32 sp1a4;
bool isrepeatframe; bool isrepeatframe;
bool isrepeatframe2; bool isrepeatframe2;
@ -2689,9 +2689,9 @@ s32 chr_tick(struct prop *prop)
sp190.y = 0.0f; sp190.y = 0.0f;
sp190.z = cosf(angle) * 19; sp190.z = cosf(angle) * 19;
mtx4_load_translation(&sp190, &sp1a8); mtx4_load_translation(&sp190, &rendermtx);
mtx4_mult_mtx4_in_place(cam_get_world_to_screen_mtxf(), &sp1a8); mtx4_mult_mtx4_in_place(cam_get_world_to_screen_mtxf(), &rendermtx);
sp210.unk00 = &sp1a8; renderdata.rendermtx = &rendermtx;
} else if (prop->type == PROPTYPE_PLAYER) { } else if (prop->type == PROPTYPE_PLAYER) {
u8 stack[0x14]; u8 stack[0x14];
f32 sp130; f32 sp130;
@ -2706,17 +2706,17 @@ s32 chr_tick(struct prop *prop)
sp17c.y = ABS(bike->w) * 200 + 25; sp17c.y = ABS(bike->w) * 200 + 25;
sp17c.z = sinf(-sp178) * sp130; sp17c.z = sinf(-sp178) * sp130;
mtx4_load_translation(&sp17c, &sp1a8); mtx4_load_translation(&sp17c, &rendermtx);
mtx4_mult_mtx4_in_place(cam_get_world_to_screen_mtxf(), &sp1a8); mtx4_mult_mtx4_in_place(cam_get_world_to_screen_mtxf(), &rendermtx);
sp210.unk00 = &sp1a8; renderdata.rendermtx = &rendermtx;
} else { } else {
sp210.unk00 = cam_get_world_to_screen_mtxf(); renderdata.rendermtx = cam_get_world_to_screen_mtxf();
} }
} else { } 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) { if (fulltick && g_CurModelChr->flinchcnt >= 0) {
g_CurModelChr->flinchcnt += g_Vars.lvupdate60; 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) { if (restore) {
anim->frac = prevfrac; anim->frac = prevfrac;
@ -3357,7 +3357,7 @@ Gfx *chr_render(struct prop *prop, Gfx *gdl, bool xlupass)
struct model *model = chr->model; struct model *model = chr->model;
f32 shadecolourfracs[4]; f32 shadecolourfracs[4];
s32 shademode; s32 shademode;
s32 sp100; s32 flags;
s32 alpha; s32 alpha;
struct eyespy *eyespy; struct eyespy *eyespy;
struct prop *child; struct prop *child;
@ -3425,12 +3425,12 @@ Gfx *chr_render(struct prop *prop, Gfx *gdl, bool xlupass)
return gdl; return gdl;
} }
sp100 = 3; flags = MODELRENDERFLAG_OPA | MODELRENDERFLAG_XLU;
} else { } else {
if (!xlupass) { if (!xlupass) {
sp100 = 1; flags = MODELRENDERFLAG_OPA;
} else { } 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) { if (shademode != SHADEMODE_XLU && alpha > 0) {
struct modelrenderdata renderdata = {0, 1, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
struct screenbox screenbox; struct screenbox screenbox;
s32 colour[4]; // rgba levels, but allowing > 256 temporarily s32 colour[4]; // rgba levels, but allowing > 256 temporarily
u32 stack; u32 stack;
@ -3457,7 +3457,7 @@ Gfx *chr_render(struct prop *prop, Gfx *gdl, bool xlupass)
gdl = bg_scissor_to_viewport(gdl); gdl = bg_scissor_to_viewport(gdl);
} }
renderdata.flags = sp100; renderdata.flags = flags;
renderdata.zbufferenabled = true; renderdata.zbufferenabled = true;
renderdata.gdl = gdl; 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]; renderdata.fogcolour = colour[0] << 24 | colour[1] << 16 | colour[2] << 8 | colour[3];
if (alpha < 0xff) { if (alpha < 0xff) {
renderdata.unk30 = 8; renderdata.context = MODELRENDERCONTEXT_CHR_XLU;
renderdata.envcolour |= (u8)alpha; renderdata.envcolour |= (u8)alpha;
} else { } else {
renderdata.unk30 = 7; renderdata.context = MODELRENDERCONTEXT_CHR_OPA;
} }
// Set Skedar eyes open or closed // Set Skedar eyes open or closed

View File

@ -821,7 +821,7 @@ void casing_render(struct casing *casing, Gfx **gdlptr)
struct modeldef *modeldef = casing->modeldef; struct modeldef *modeldef = casing->modeldef;
Mtxf *matrices = gfx_allocate(modeldef->nummatrices * sizeof(Mtxf)); Mtxf *matrices = gfx_allocate(modeldef->nummatrices * sizeof(Mtxf));
struct model model; struct model model;
struct modelrenderdata renderdata = { NULL, true, 3 }; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
Mtxf mtx; Mtxf mtx;
s32 i; s32 i;
s32 j; s32 j;
@ -861,10 +861,10 @@ void casing_render(struct casing *casing, Gfx **gdlptr)
} }
if (render) { if (render) {
renderdata.zbufferenabled = 1; renderdata.zbufferenabled = true;
renderdata.gdl = gdl; renderdata.gdl = gdl;
renderdata.unk10 = matrices; renderdata.matrices = matrices;
renderdata.unk30 = 4; renderdata.context = MODELRENDERCONTEXT_BONDGUN_OPA;
renderdata.envcolour = g_Vars.currentplayer->gunshadecol[0] << 24 renderdata.envcolour = g_Vars.currentplayer->gunshadecol[0] << 24
| g_Vars.currentplayer->gunshadecol[1] << 16 | g_Vars.currentplayer->gunshadecol[1] << 16
| g_Vars.currentplayer->gunshadecol[2] << 8 | g_Vars.currentplayer->gunshadecol[2] << 8

View File

@ -1856,7 +1856,7 @@ Gfx *menu_render_model(Gfx *gdl, struct menumodel *menumodel, s32 modeltype)
} }
if (menumodel->bodymodeldef != NULL) { if (menumodel->bodymodeldef != NULL) {
struct modelrenderdata renderdata = {NULL, true, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
Mtxf *matrices; Mtxf *matrices;
s32 i; s32 i;
u32 stack[3]; u32 stack[3];
@ -2243,8 +2243,8 @@ Gfx *menu_render_model(Gfx *gdl, struct menumodel *menumodel, s32 modeltype)
mtx4_copy(&menumodel->mtx, matrices); mtx4_copy(&menumodel->mtx, matrices);
renderdata.unk00 = &menumodel->mtx; renderdata.rendermtx = &menumodel->mtx;
renderdata.unk10 = menumodel->bodymodel.matrices; renderdata.matrices = menumodel->bodymodel.matrices;
model_set_matrices_with_anim(&renderdata, &menumodel->bodymodel); 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); gSPSetLights1(gdl++, var80071468);
gSPLookAt(gdl++, cam_get_look_at()); gSPLookAt(gdl++, cam_get_look_at());
renderdata.unk30 = 1; renderdata.context = MODELRENDERCONTEXT_MENUMODEL_OPA;
renderdata.envcolour = 0xffffffff; renderdata.envcolour = 0xffffffff;
renderdata.fogcolour = 0xffffffff; renderdata.fogcolour = 0xffffffff;

View File

@ -4788,15 +4788,15 @@ void obj_child_tick_player_onscreen(struct prop *prop, bool fulltick)
if (model->attachedtonode && (obj->hidden & OBJHFLAG_EMBEDDED)) { if (model->attachedtonode && (obj->hidden & OBJHFLAG_EMBEDDED)) {
Mtxf *mtx = model_find_node_mtx(model->attachedtomodel, model->attachedtonode, 0); 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; u32 stack;
Mtxf sp30; Mtxf rendermtx;
prop->flags |= PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK; 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.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf));
renderdata.unk00 = &sp30; renderdata.rendermtx = &rendermtx;
model_set_matrices(&renderdata, model); model_set_matrices(&renderdata, model);
obj_child_tick_player(prop, fulltick); obj_child_tick_player(prop, fulltick);
@ -10855,16 +10855,16 @@ void obj_init_matrices(struct prop *prop)
hangingmonitor_init_matrices(prop); hangingmonitor_init_matrices(prop);
} else { } else {
if (obj->model->definition->nummatrices >= 2) { if (obj->model->definition->nummatrices >= 2) {
struct modelrenderdata thing = {NULL, 1, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
u32 stack; u32 stack;
Mtxf sp28; Mtxf rendermtx;
mtx4_copy(obj->model->matrices, &sp28); mtx4_copy(obj->model->matrices, &rendermtx);
thing.unk10 = obj->model->matrices; renderdata.matrices = obj->model->matrices;
thing.unk00 = &sp28; 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; model->anim = NULL;
} else { } else {
// In cutscene // In cutscene
struct modelrenderdata sp476 = {0, 1, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
Mtxf sp412; Mtxf sp412;
struct coord sp400; struct coord sp400;
RoomNum sp384[8]; RoomNum sp384[8];
@ -11086,9 +11086,11 @@ s32 obj_tick_player(struct prop *prop)
} }
sp556 = true; sp556 = true;
sp476.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf));
sp476.unk00 = cam_get_world_to_screen_mtxf(); renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf));
model_set_matrices_with_anim(&sp476, model); renderdata.rendermtx = cam_get_world_to_screen_mtxf();
model_set_matrices_with_anim(&renderdata, model);
if (fulltick) { if (fulltick) {
mtx00015be4(cam_get_projection_mtxf(), model->matrices, &sp412); mtx00015be4(cam_get_projection_mtxf(), model->matrices, &sp412);
@ -11145,12 +11147,12 @@ s32 obj_tick_player(struct prop *prop)
} }
} }
} else { } else {
struct modelrenderdata sp312 = {0, 1, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
Mtxf sp248; Mtxf sp248;
struct coord sp236; struct coord sp236;
RoomNum sp220[8]; RoomNum sp220[8];
s32 numchrs; s32 numchrs;
Mtxf sp152; Mtxf rendermtx;
s32 sp148; s32 sp148;
s32 sp144; s32 sp144;
s32 i; s32 i;
@ -11181,12 +11183,14 @@ s32 obj_tick_player(struct prop *prop)
mtx3_to_mtx4(obj->realrot, &sp248); mtx3_to_mtx4(obj->realrot, &sp248);
mtx4_set_translation(&prop->pos, &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; sp556 = true;
sp312.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf));
sp312.unk00 = &sp152; renderdata.matrices = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf));
model_set_matrices_with_anim(&sp312, model); renderdata.rendermtx = &rendermtx;
model_set_matrices_with_anim(&renderdata, model);
if (fulltick) { if (fulltick) {
sp236.x = (f32)sp116.x + prop->pos.x; 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) { if (model_get_cur_anim_frame(model) >= model_get_num_anim_frames(model) - 1) {
modelmgr_free_anim(model->anim); modelmgr_free_anim(model->anim);
model->anim = NULL; model->anim = NULL;
mtx00015be4(cam_get_projection_mtxf(), model->matrices, &sp248); mtx00015be4(cam_get_projection_mtxf(), model->matrices, &sp248);
mtx4_to_mtx3(&sp248, obj->realrot); mtx4_to_mtx3(&sp248, obj->realrot);
tagnum = obj_get_tag_num(obj); tagnum = obj_get_tag_num(obj);
if (tagnum >= 0) { if (tagnum >= 0) {
@ -12375,7 +12381,7 @@ void obj_render_prop(struct prop *prop, struct modelrenderdata *renderdata, bool
gdl = renderdata->gdl; gdl = renderdata->gdl;
if (obj->type == OBJTYPE_SINGLEMONITOR) { if (obj->type == OBJTYPE_SINGLEMONITOR) {
if (renderdata->flags & 1) { if (renderdata->flags & MODELRENDERFLAG_OPA) {
struct singlemonitorobj *monitor = (struct singlemonitorobj *) prop->obj; struct singlemonitorobj *monitor = (struct singlemonitorobj *) prop->obj;
if (obj->flags2 & OBJFLAG2_DRAWONTOP) { 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); gdl = tvscreen_render(model, model_get_part(model->definition, MODELPART_0000), &monitor->screen, gdl, sp60, 1);
} }
} else if (obj->type == OBJTYPE_MULTIMONITOR) { } else if (obj->type == OBJTYPE_MULTIMONITOR) {
if (renderdata->flags & 1) { if (renderdata->flags & MODELRENDERFLAG_OPA) {
struct multimonitorobj *monitor = (struct multimonitorobj *) prop->obj; struct multimonitorobj *monitor = (struct multimonitorobj *) prop->obj;
if (obj->flags2 & OBJFLAG2_DRAWONTOP) { if (obj->flags2 & OBJFLAG2_DRAWONTOP) {
@ -12427,13 +12433,13 @@ void obj_render_prop(struct prop *prop, struct modelrenderdata *renderdata, bool
renderdata->cullmode = CULLMODE_BACK; renderdata->cullmode = CULLMODE_BACK;
} }
if (renderdata->unk30 == 9) { if (renderdata->context == MODELRENDERCONTEXT_OBJ_OPA) {
renderdata->envcolour &= 0xffffff00; renderdata->envcolour &= 0xffffff00;
} }
} else if ((obj->hidden2 & OBJH2FLAG_DEFORMED) == 0) { } else if ((obj->hidden2 & OBJH2FLAG_DEFORMED) == 0) {
renderdata->cullmode = CULLMODE_BACK; renderdata->cullmode = CULLMODE_BACK;
if (renderdata->unk30 == 9) { if (renderdata->context == MODELRENDERCONTEXT_OBJ_OPA) {
renderdata->envcolour &= 0xffffff00; renderdata->envcolour &= 0xffffff00;
} }
} else { } else {
@ -12441,7 +12447,7 @@ void obj_render_prop(struct prop *prop, struct modelrenderdata *renderdata, bool
renderdata->cullmode = CULLMODE_NONE; renderdata->cullmode = CULLMODE_NONE;
if (renderdata->unk30 == 9) { if (renderdata->context == MODELRENDERCONTEXT_OBJ_OPA) {
s32 alpha = 100 + level * 50; s32 alpha = 100 + level * 50;
if (alpha > 255) { if (alpha > 255) {
@ -12599,10 +12605,10 @@ Gfx *obj_render(struct prop *prop, Gfx *gdl, bool xlupass)
f32 shadecolourfracs[4]; f32 shadecolourfracs[4];
s32 shademode; s32 shademode;
struct defaultobj *obj = prop->obj; struct defaultobj *obj = prop->obj;
struct modelrenderdata renderdata = {NULL, true, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
struct screenbox screenbox; struct screenbox screenbox;
s32 colour[4]; s32 colour[4];
s32 sp84; s32 flags;
s32 healththing; s32 healththing;
s32 alpha = 0xff; s32 alpha = 0xff;
f32 xrayalphafrac; f32 xrayalphafrac;
@ -12687,12 +12693,12 @@ Gfx *obj_render(struct prop *prop, Gfx *gdl, bool xlupass)
return gdl; return gdl;
} }
sp84 = 3; flags = MODELRENDERFLAG_OPA | MODELRENDERFLAG_XLU;
} else { } else {
if (!xlupass) { if (!xlupass) {
sp84 = 1; flags = MODELRENDERFLAG_OPA;
} else { } 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); gdl = bg_scissor_to_viewport(gdl);
} }
renderdata.flags = sp84; renderdata.flags = flags;
renderdata.zbufferenabled = (obj->flags2 & OBJFLAG2_DRAWONTOP) == 0; renderdata.zbufferenabled = (obj->flags2 & OBJFLAG2_DRAWONTOP) == 0;
renderdata.gdl = gdl; renderdata.gdl = gdl;
if (alpha < 0xff) { if (alpha < 0xff) {
renderdata.unk30 = 5; renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU;
renderdata.envcolour = alpha; renderdata.envcolour = alpha;
} else { } else {
renderdata.unk30 = 9; renderdata.context = MODELRENDERCONTEXT_OBJ_OPA;
if (obj->type == OBJTYPE_TINTEDGLASS) { if (obj->type == OBJTYPE_TINTEDGLASS) {
struct tintedglassobj *glass = (struct tintedglassobj *)obj; struct tintedglassobj *glass = (struct tintedglassobj *)obj;

View File

@ -322,7 +322,7 @@ Gfx *title_render_legal(Gfx *gdl)
#endif #endif
struct legalelement *elem; struct legalelement *elem;
struct legalelement *end; struct legalelement *end;
struct modelrenderdata renderdata = { NULL, true, 3 }; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
s32 x; s32 x;
s32 y; s32 y;
struct fontchar *font1; 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 tmp2;
s32 i; s32 i;
s32 j; 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); gDPSetPrimColor(gdl++, 0, 0, 0x00, 0x00, 0x00, alpha1);
renderdata.unk00 = arg6; renderdata.rendermtx = rendermtx;
renderdata.unk10 = gfx_allocate(model->definition->nummatrices * sizeof(Mtxf)); 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); model_update_relations(model);
renderdata.flags = 3; renderdata.flags = MODELRENDERFLAG_DEFAULT;
renderdata.zbufferenabled = false; renderdata.zbufferenabled = false;
renderdata.gdl = gdl; renderdata.gdl = gdl;
@ -956,10 +956,10 @@ void title_skip_to_pd_title(void)
Gfx *title_render_pd_logo(Gfx *gdl) Gfx *title_render_pd_logo(Gfx *gdl)
{ {
struct modelrenderdata renderdata = {NULL, true, 3}; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
Mtxf sp2b0; Mtxf sp2b0;
Mtxf sp270; Mtxf rendermtx1;
Mtxf sp230; Mtxf rendermtx2;
struct model *model; struct model *model;
struct modelnode *node; struct modelnode *node;
Mtxf sp1e8; Mtxf sp1e8;
@ -1368,8 +1368,8 @@ Gfx *title_render_pd_logo(Gfx *gdl)
mtx4_load_y_rotation(g_PdLogoYRotCur, &sp1e8); mtx4_load_y_rotation(g_PdLogoYRotCur, &sp1e8);
mtx4_load_x_rotation(g_PdLogoXRotCur, &sp1a8); mtx4_load_x_rotation(g_PdLogoXRotCur, &sp1a8);
mtx4_mult_mtx4_in_place(&sp1a8, &sp1e8); mtx4_mult_mtx4_in_place(&sp1a8, &sp1e8);
mtx4_mult_mtx4(&sp2b0, &sp1e8, &sp270); mtx4_mult_mtx4(&sp2b0, &sp1e8, &rendermtx1);
mtx00015f04(g_PdLogoScale, &sp270); mtx00015f04(g_PdLogoScale, &rendermtx1);
#if VERSION != VERSION_JPN_FINAL #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; 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); gSPSetLights1(gdl++, g_TitleLightPdLogoMain);
@ -1461,9 +1461,9 @@ Gfx *title_render_pd_logo(Gfx *gdl)
#if VERSION == VERSION_JPN_FINAL #if VERSION == VERSION_JPN_FINAL
mtx00015ea8(0.01f, &sp1e8); mtx00015ea8(0.01f, &sp1e8);
mtx4_mult_mtx4(&sp2b0, &sp1e8, &sp230); mtx4_mult_mtx4(&sp2b0, &sp1e8, &rendermtx2);
mtx00015f04(0.308f, &sp230); mtx00015f04(0.308f, &rendermtx2);
mtx00015f04(3.5f, &sp230); mtx00015f04(3.5f, &rendermtx2);
if (g_PdLogoTitleStep >= 0) { if (g_PdLogoTitleStep >= 0) {
// Background flashing logo // Background flashing logo
@ -1482,16 +1482,16 @@ Gfx *title_render_pd_logo(Gfx *gdl)
mtx4_mult_mtx4_in_place(&sp2b0, &sp1b0); mtx4_mult_mtx4_in_place(&sp2b0, &sp1b0);
mtx4_copy(&sp1b0, &sp2b0); mtx4_copy(&sp1b0, &sp2b0);
renderdata.unk00 = &sp2b0; renderdata.rendermtx = &sp2b0;
renderdata.unk10 = gfx_allocate(g_TitleModelJpnLogo2->definition->nummatrices * sizeof(Mtxf)); 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); model_update_relations(g_TitleModelJpnLogo2);
renderdata.unk30 = 5; renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU;
renderdata.zbufferenabled = false; renderdata.zbufferenabled = false;
renderdata.fogcolour = 0xff0000ff; renderdata.fogcolour = 0xff0000ff;
renderdata.envcolour = 0xff000000 | envalpha; renderdata.envcolour = 0xff000000 | envalpha;
@ -1537,19 +1537,18 @@ Gfx *title_render_pd_logo(Gfx *gdl)
gSPSetLights1(gdl++, g_TitleLightPdLogoJpn); gSPSetLights1(gdl++, g_TitleLightPdLogoJpn);
gSPSetLights1(gdl++, g_TitleLightPdLogoMain); 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.matrices;
g_TitleModelJpnPd->matrices = renderdata.unk10;
model_update_relations(g_TitleModelJpnPd); model_update_relations(g_TitleModelJpnPd);
// @bug: || should be | in fogcolour expression // @bug: || should be | in fogcolour expression
renderdata.zbufferenabled = false; renderdata.zbufferenabled = false;
renderdata.unk30 = 5; renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU;
renderdata.fogcolour = fogcolour << 24 || fogcolour << 16 || (fogcolour << 8 | 0xff); renderdata.fogcolour = fogcolour << 24 || fogcolour << 16 || (fogcolour << 8 | 0xff);
renderdata.envcolour = envcolour; renderdata.envcolour = envcolour;
renderdata.gdl = gdl; renderdata.gdl = gdl;
@ -1578,17 +1577,17 @@ Gfx *title_render_pd_logo(Gfx *gdl)
mtx4_mult_mtx4_in_place(&sp2b0, &spb0); mtx4_mult_mtx4_in_place(&sp2b0, &spb0);
mtx4_copy(&spb0, &sp2b0); mtx4_copy(&spb0, &sp2b0);
renderdata.unk00 = &sp2b0; renderdata.rendermtx = &sp2b0;
renderdata.unk10 = gfx_allocate(g_TitleModelJpnLogo1->definition->nummatrices * sizeof(Mtxf)); 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); model_update_relations(g_TitleModelJpnLogo1);
renderdata.zbufferenabled = false; renderdata.zbufferenabled = false;
renderdata.unk30 = 5; renderdata.context = MODELRENDERCONTEXT_BONDGUN_OBJ_XLU;
renderdata.fogcolour = 0x000000ff; renderdata.fogcolour = 0x000000ff;
renderdata.envcolour = 0x000000ff; renderdata.envcolour = 0x000000ff;
renderdata.gdl = gdl; renderdata.gdl = gdl;
@ -1606,8 +1605,8 @@ Gfx *title_render_pd_logo(Gfx *gdl)
} }
#else #else
mtx00015f88(1.0f + sp13c, &sp1e8); mtx00015f88(1.0f + sp13c, &sp1e8);
mtx4_mult_mtx4(&sp2b0, &sp1e8, &sp230); mtx4_mult_mtx4(&sp2b0, &sp1e8, &rendermtx2);
mtx00015f04(0.308f, &sp230); mtx00015f04(0.308f, &rendermtx2);
// Render the "PERFECT DARK" model // Render the "PERFECT DARK" model
if (g_PdLogoTitleStep >= 0) { if (g_PdLogoTitleStep >= 0) {
@ -1616,18 +1615,18 @@ Gfx *title_render_pd_logo(Gfx *gdl)
} else if (g_PdLogoTitleStep == 1) { } else if (g_PdLogoTitleStep == 1) {
bool visible = g_PdLogoTitleStepFrac < 0.5f; bool visible = g_PdLogoTitleStepFrac < 0.5f;
model = g_TitleModelPdThree; 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) { } else if (g_PdLogoTitleStep == 2) {
bool visible = g_PdLogoTitleStepFrac < 0.5f; bool visible = g_PdLogoTitleStepFrac < 0.5f;
model = g_TitleModelPdTwo; 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) { } else if (g_PdLogoTitleStep == 3) {
bool visible = g_PdLogoTitleStepFrac < 0.5f; bool visible = g_PdLogoTitleStepFrac < 0.5f;
model = g_TitleModelPdTwo; 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 { } else {
model = g_TitleModelPdTwo; 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 #endif
@ -1847,10 +1846,10 @@ void title_tick_nintendo_logo(void)
Gfx *title_render_nintendo_logo(Gfx *gdl) Gfx *title_render_nintendo_logo(Gfx *gdl)
{ {
struct modelrenderdata renderdata = { NULL, true, 3 }; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
s32 i; s32 i;
s32 j; s32 j;
Mtxf sp108; Mtxf rendermtx;
f32 fracdone = g_TitleTimer / (VERSION == VERSION_PAL_FINAL ? 183.0f : TICKS(240.0f)); f32 fracdone = g_TitleTimer / (VERSION == VERSION_PAL_FINAL ? 183.0f : TICKS(240.0f));
struct coord lightdir = {0, 0, 0}; struct coord lightdir = {0, 0, 0};
s32 v0; s32 v0;
@ -1902,22 +1901,23 @@ Gfx *title_render_nintendo_logo(Gfx *gdl)
mtx4_load_rotation(&sp9c, &spa8); mtx4_load_rotation(&sp9c, &spa8);
mtx00015f88(fracdone * 0.2f + 1.0f, &spa8); mtx00015f88(fracdone * 0.2f + 1.0f, &spa8);
mtx00016ae4(&sp108, mtx00016ae4(&rendermtx,
/* pos */ 0.0f, 0.0f, 4000, /* pos */ 0.0f, 0.0f, 4000,
/* look */ 0.0f, 0.0f, 0.0f, /* look */ 0.0f, 0.0f, 0.0f,
/* up */ 0.0f, 1.0f, 0.0f); /* up */ 0.0f, 1.0f, 0.0f);
mtx4_mult_mtx4_in_place(&sp108, &spa8); mtx4_mult_mtx4_in_place(&rendermtx, &spa8);
mtx4_copy(&spa8, &sp108); mtx4_copy(&spa8, &rendermtx);
renderdata.unk00 = &sp108;
renderdata.unk10 = gfx_allocate(g_TitleModel->definition->nummatrices * sizeof(Mtxf)); renderdata.rendermtx = &rendermtx;
mtx4_copy(&sp108, renderdata.unk10); 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); model_update_relations(g_TitleModel);
renderdata.flags = 3; renderdata.flags = MODELRENDERFLAG_DEFAULT;
renderdata.zbufferenabled = false; renderdata.zbufferenabled = false;
renderdata.gdl = gdl; renderdata.gdl = gdl;
@ -2026,10 +2026,10 @@ f32 func0f019d0c(f32 arg0)
Gfx *title_render_rare_logo(Gfx *gdl) Gfx *title_render_rare_logo(Gfx *gdl)
{ {
struct modelrenderdata renderdata = { NULL, true, 3 }; struct modelrenderdata renderdata = { NULL, true, MODELRENDERFLAG_DEFAULT };
s32 i; s32 i;
f32 fracdone = g_TitleTimer / TICKS(240.0f); f32 fracdone = g_TitleTimer / TICKS(240.0f);
Mtxf sp118; Mtxf rendermtx;
s32 j; s32 j;
s32 s0; s32 s0;
@ -2099,19 +2099,20 @@ Gfx *title_render_rare_logo(Gfx *gdl)
mtx4_load_rotation(&spb4, &spc0); mtx4_load_rotation(&spb4, &spc0);
mtx00015f88(1 + fracdone * 0.25f, &spc0); mtx00015f88(1 + fracdone * 0.25f, &spc0);
mtx00016ae4(&sp118, mtx00016ae4(&rendermtx,
/* pos */ 0, 0, 4000, /* pos */ 0, 0, 4000,
/* look */ 0, 0, 0, /* look */ 0, 0, 0,
/* up */ 0, 1, 0); /* up */ 0, 1, 0);
mtx4_mult_mtx4_in_place(&sp118, &spc0); mtx4_mult_mtx4_in_place(&rendermtx, &spc0);
mtx4_copy(&spc0, &sp118); mtx4_copy(&spc0, &rendermtx);
renderdata.unk00 = &sp118; renderdata.rendermtx = &rendermtx;
renderdata.unk10 = gfx_allocate(g_TitleModel->definition->nummatrices * sizeof(Mtxf)); renderdata.matrices = gfx_allocate(g_TitleModel->definition->nummatrices * sizeof(Mtxf));
mtx4_copy(&sp118, renderdata.unk10);
g_TitleModel->matrices = renderdata.unk10; mtx4_copy(&rendermtx, renderdata.matrices);
g_TitleModel->matrices = renderdata.matrices;
model_update_relations(g_TitleModel); model_update_relations(g_TitleModel);
@ -2135,8 +2136,8 @@ Gfx *title_render_rare_logo(Gfx *gdl)
gSPSetLights1(gdl++, g_TitleLightNintendoRare); gSPSetLights1(gdl++, g_TitleLightNintendoRare);
renderdata.flags = 3; renderdata.flags = MODELRENDERFLAG_DEFAULT;
renderdata.zbufferenabled = 0; renderdata.zbufferenabled = false;
renderdata.gdl = gdl; renderdata.gdl = gdl;
model_render(&renderdata, g_TitleModel); model_render(&renderdata, g_TitleModel);
@ -2163,8 +2164,8 @@ Gfx *title_render_rare_logo(Gfx *gdl)
gSPSetLights1(gdl++, g_TitleLightNintendoRare); gSPSetLights1(gdl++, g_TitleLightNintendoRare);
renderdata.flags = 3; renderdata.flags = MODELRENDERFLAG_DEFAULT;
renderdata.zbufferenabled = 0; renderdata.zbufferenabled = false;
renderdata.gdl = gdl; renderdata.gdl = gdl;
model_render(&renderdata, g_TitleModel); model_render(&renderdata, g_TitleModel);

View File

@ -2589,6 +2589,20 @@
#define MODELRENDERFLAG_OPA 1 #define MODELRENDERFLAG_OPA 1
#define MODELRENDERFLAG_XLU 2 #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_GAME 1
#define MODFILE_MPSETUP 2 #define MODFILE_MPSETUP 2

View File

@ -433,7 +433,7 @@ struct modelrodata_gundl { // type 0x04
void *baseaddr; void *baseaddr;
Vtx *vertices; Vtx *vertices;
s16 numvertices; s16 numvertices;
s16 unk12; s16 rendermode;
}; };
struct modelrodata_distance { // type 0x08 struct modelrodata_distance { // type 0x08
@ -542,7 +542,7 @@ struct modelrodata_dl { // type 0x18
/*0x08*/ Col *colours; /*0x08*/ Col *colours;
/*0x0c*/ Vtx *vertices; // colours follow this array /*0x0c*/ Vtx *vertices; // colours follow this array
/*0x10*/ s16 numvertices; /*0x10*/ s16 numvertices;
/*0x12*/ s16 mcount; /*0x12*/ s16 rendermode;
/*0x14*/ u16 rwdataindex; /*0x14*/ u16 rwdataindex;
/*0x16*/ u16 numcolours; /*0x16*/ u16 numcolours;
}; };
@ -5006,19 +5006,13 @@ struct animtableentry {
}; };
struct modelrenderdata { struct modelrenderdata {
/*0x00*/ Mtxf *unk00; /*0x00*/ Mtxf *rendermtx;
/*0x04*/ bool zbufferenabled; /*0x04*/ bool zbufferenabled;
/*0x08*/ u32 flags; /*0x08*/ u32 flags;
/*0x0c*/ Gfx *gdl; /*0x0c*/ Gfx *gdl;
/*0x10*/ Mtxf *unk10; /*0x10*/ Mtxf *matrices;
/*0x14*/ u32 unk14; /*0x14*/ u32 unk14[7];
/*0x18*/ u32 unk18; /*0x30*/ s32 context;
/*0x1c*/ u32 unk1c;
/*0x20*/ u32 unk20;
/*0x24*/ u32 unk24;
/*0x28*/ u32 unk28;
/*0x2c*/ u32 unk2c;
/*0x30*/ s32 unk30;
/*0x34*/ u32 envcolour; /*0x34*/ u32 envcolour;
/*0x38*/ u32 fogcolour; /*0x38*/ u32 fogcolour;
/*0x3c*/ u32 cullmode; /*0x3c*/ u32 cullmode;

View File

@ -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; struct anim *anim = model->anim;
union modelrodata *rodata = node->rodata; 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; f32 scale = model->scale;
struct coord *sp254 = &rwdata->chrinfo.pos; struct coord *sp254 = &rwdata->chrinfo.pos;
f32 sp250 = rwdata->chrinfo.yrot; f32 sp250 = rwdata->chrinfo.yrot;
Mtxf *sp24c; Mtxf *rendermtx;
u32 stack1; u32 stack1;
Mtxf *mtx = &model->matrices[rodata->chrinfo.mtxindex]; Mtxf *mtx = &model->matrices[rodata->chrinfo.mtxindex];
s32 animpart = rodata->chrinfo.animpart; 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 (rodata->chrinfo.mtxindex);
if (node->parent) { if (node->parent) {
sp24c = model_find_node_mtx(model, node->parent, 0); rendermtx = model_find_node_mtx(model, node->parent, 0);
} else { } else {
sp24c = arg0->unk00; rendermtx = renderdata->rendermtx;
} }
anim_get_rot_translate_scale(animpart, anim->flip, skel, anim->animnum, anim->frameslot1, &rot1, &translate1, &scale1); 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); mtx00015f4c(scale, &sp158);
} }
if (sp24c) { if (rendermtx) {
mtx00015be4(sp24c, &sp158, mtx); mtx00015be4(rendermtx, &sp158, mtx);
} else { } else {
mtx4_copy(&sp158, mtx); mtx4_copy(&sp158, mtx);
} }
@ -846,7 +846,7 @@ void model_position_joint_using_vec_rot(struct modelrenderdata *renderdata, stru
if (node->parent != NULL) { if (node->parent != NULL) {
rendermtx = model_find_node_mtx(model, node->parent, 0); rendermtx = model_find_node_mtx(model, node->parent, 0);
} else { } else {
rendermtx = renderdata->unk00; rendermtx = renderdata->rendermtx;
} }
if (rendermtx != NULL) { if (rendermtx != NULL) {
@ -960,7 +960,7 @@ void model_position_joint_using_quat_rot(struct modelrenderdata *renderdata, str
if (node->parent != NULL) { if (node->parent != NULL) {
rendermtx = model_find_node_mtx(model, node->parent, 0); rendermtx = model_find_node_mtx(model, node->parent, 0);
} else { } else {
rendermtx = renderdata->unk00; rendermtx = renderdata->rendermtx;
} }
if (rendermtx != NULL) { if (rendermtx != NULL) {
@ -1060,7 +1060,7 @@ void model_update_position_node_mtx(struct modelrenderdata *renderdata, struct m
struct coord scale1; struct coord scale1;
bool sp128; bool sp128;
Mtxf spe8; Mtxf spe8;
Mtxf *mtx; Mtxf *rendermtx;
f32 spe0; f32 spe0;
struct coord rot2; struct coord rot2;
struct coord translate2; struct coord translate2;
@ -1174,37 +1174,37 @@ void model_update_position_node_mtx(struct modelrenderdata *renderdata, struct m
} }
} else { } else {
if (node->parent) { if (node->parent) {
mtx = model_find_node_mtx(model, node->parent, 0); rendermtx = model_find_node_mtx(model, node->parent, 0);
} else { } else {
mtx = renderdata->unk00; rendermtx = renderdata->rendermtx;
} }
if (mtx) { if (rendermtx) {
mtx4_load_translation(&rodata->pos, &spe8); mtx4_load_translation(&rodata->pos, &spe8);
mtx00015be4(mtx, &spe8, &model->matrices[rodata->mtxindex0]); mtx00015be4(rendermtx, &spe8, &model->matrices[rodata->mtxindex0]);
} else { } else {
mtx4_load_translation(&rodata->pos, &model->matrices[rodata->mtxindex0]); 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; union modelrodata *rodata = node->rodata;
Mtxf *sp68; Mtxf *rendermtx;
Mtxf sp28; Mtxf sp28;
s32 mtxindex = rodata->positionheld.mtxindex; s32 mtxindex = rodata->positionheld.mtxindex;
Mtxf *matrices = model->matrices; Mtxf *matrices = model->matrices;
if (node->parent) { if (node->parent) {
sp68 = model_find_node_mtx(model, node->parent, 0); rendermtx = model_find_node_mtx(model, node->parent, 0);
} else { } else {
sp68 = arg0->unk00; rendermtx = renderdata->rendermtx;
} }
if (sp68) { if (rendermtx) {
mtx4_load_translation(&rodata->positionheld.pos, &sp28); mtx4_load_translation(&rodata->positionheld.pos, &sp28);
mtx00015be4(sp68, &sp28, &matrices[mtxindex]); mtx00015be4(rendermtx, &sp28, &matrices[mtxindex]);
} else { } else {
mtx4_load_translation(&rodata->positionheld.pos, &matrices[mtxindex]); 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; struct modelnode *node = model->definition->rootnode;
@ -1508,13 +1508,13 @@ void model_update_matrices(struct modelrenderdata *arg0, struct model *model)
switch (type) { switch (type) {
case MODELNODETYPE_CHRINFO: case MODELNODETYPE_CHRINFO:
model_update_chr_node_mtx(arg0, model, node); model_update_chr_node_mtx(renderdata, model, node);
break; break;
case MODELNODETYPE_POSITION: case MODELNODETYPE_POSITION:
model_update_position_node_mtx(arg0, model, node); model_update_position_node_mtx(renderdata, model, node);
break; break;
case MODELNODETYPE_POSITIONHELD: case MODELNODETYPE_POSITIONHELD:
model_update_position_held_node_mtx(arg0, model, node); model_update_position_held_node_mtx(renderdata, model, node);
break; break;
case MODELNODETYPE_DISTANCE: case MODELNODETYPE_DISTANCE:
model_update_distance_relations(model, node); 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) 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 VERSION >= VERSION_PAL_BETA
if (var8005efb0_2 || !modelasm00018680(renderdata, model)) { if (var8005efb0_2 || !modelasm00018680(renderdata, model)) {
@ -2797,7 +2797,7 @@ void model_tick_anim(struct model *model, s32 lvupdate240, bool arg2)
} }
#endif #endif
void model_apply_render_mode_type1(struct modelrenderdata *renderdata) void model_apply_rendermode_simple(struct modelrenderdata *renderdata)
{ {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_1CYCLE); 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); 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 (renderdata->context == MODELRENDERCONTEXT_CHR_OPA) {
if (arg1) { // envcolour is blood colour
// fogcolour is shade colour
if (isopa) {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); 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); 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) {
if (arg1) { // envcolour is opacity
// fogcolour is shade colour
if (isopa) {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); 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); 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 ((renderdata->envcolour & 0xff) == 0) {
if (arg1) { if (isopa) {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour);
@ -2870,7 +2876,7 @@ void model_apply_render_mode_type3(struct modelrenderdata *renderdata, bool arg1
} }
} }
} else { } else {
if (arg1) { if (isopa) {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); 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) { } else if (renderdata->context == MODELRENDERCONTEXT_BONDGUN_OPA) {
if (arg1) { // envcolour is shade colour
if (isopa) {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->envcolour); 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); 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; u8 alpha;
if (arg1) { if (isopa) {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); 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); gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2);
} }
} }
} else { } else { // MODELRENDERCONTEXT_MENUMODEL_OPA
if (arg1) { if (isopa) {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2); 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++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour);
gDPSetEnvColorViaWord(renderdata->gdl++, renderdata->envcolour | 0x000000ff); gDPSetEnvColorViaWord(renderdata->gdl++, renderdata->envcolour | 0x000000ff);
gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_17, G_CC_CUSTOM_18); gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_17, G_CC_CUSTOM_18);
if (arg1) { if (isopa) {
if (renderdata->zbufferenabled) { if (renderdata->zbufferenabled) {
gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2); gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2);
} else { } 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); 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++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour);
@ -3003,7 +3016,9 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1
} else { } else {
gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); 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 ((renderdata->envcolour & 0xff) == 0) {
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); 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); gDPSetEnvColorViaWord(renderdata->gdl++, 0xffffffff);
gDPSetPrimColor(renderdata->gdl++, 0, 0, 0, 0, 0, (renderdata->envcolour >> 8) & 0xff); 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); gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_CUSTOM_20);
if (renderdata->zbufferenabled) { if (renderdata->zbufferenabled) {
@ -3034,7 +3049,7 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->fogcolour);
gDPSetEnvColorViaWord(renderdata->gdl++, renderdata->envcolour & 0xff); gDPSetEnvColorViaWord(renderdata->gdl++, renderdata->envcolour & 0xff);
if (arg1) { if (isopa) {
gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_21, G_CC_CUSTOM_18); gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_21, G_CC_CUSTOM_18);
if (renderdata->zbufferenabled) { 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++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, renderdata->envcolour); gDPSetFogColorViaWord(renderdata->gdl++, renderdata->envcolour);
gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2); gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2);
if (arg1) { if (isopa) {
if (renderdata->zbufferenabled) { if (renderdata->zbufferenabled) {
gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2); gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2);
} else { } 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); 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; u8 alpha;
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
@ -3084,7 +3102,7 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1
if (alpha < 255) { if (alpha < 255) {
gDPSetEnvColor(renderdata->gdl++, 0xff, 0xff, 0xff, alpha); gDPSetEnvColor(renderdata->gdl++, 0xff, 0xff, 0xff, alpha);
if (arg1) { if (isopa) {
if (renderdata->envcolour & 0xff00) { if (renderdata->envcolour & 0xff00) {
gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_24, G_CC_MODULATEIA2); gDPSetCombineMode(renderdata->gdl++, G_CC_CUSTOM_24, G_CC_MODULATEIA2);
} else { } else {
@ -3102,13 +3120,13 @@ void model_apply_render_mode_type4(struct modelrenderdata *renderdata, bool arg1
} else { } else {
gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2); gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_XLU_SURF2);
} }
} else { } else { // MODELRENDERCONTEXT_MENUMODEL_OPA
gDPPipeSync(renderdata->gdl++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE);
gDPSetFogColorViaWord(renderdata->gdl++, 0xffffff00); gDPSetFogColorViaWord(renderdata->gdl++, 0xffffff00);
gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2); gDPSetCombineMode(renderdata->gdl++, G_CC_TRILERP, G_CC_MODULATEIA2);
if (arg1) { if (isopa) {
if (renderdata->zbufferenabled) { if (renderdata->zbufferenabled) {
gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2); gDPSetRenderMode(renderdata->gdl++, G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2);
} else { } 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++); gDPPipeSync(renderdata->gdl++);
gDPSetCycleType(renderdata->gdl++, G_CYC_2CYCLE); 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); model_apply_cull_mode(renderdata);
} }
switch (rodata->unk12) { switch (rodata->rendermode) {
case 1: case MODELRENDERMODE_SIMPLE:
model_apply_render_mode_type1(renderdata); model_apply_rendermode_simple(renderdata);
break; break;
case 3: case MODELRENDERMODE_CTXAWARE_1PASS:
model_apply_render_mode_type3(renderdata, true); model_apply_rendermode_ctxaware_1pass(renderdata, true);
break; break;
case 4: case MODELRENDERMODE_CTXAWARE_2PASS:
model_apply_render_mode_type4(renderdata, true); model_apply_rendermode_ctxaware_2pass(renderdata, true);
break; break;
case 2: case MODELRENDERMODE_TRILERP:
model_apply_render_mode_type2(renderdata); model_apply_rendermode_trilerp(renderdata);
break; break;
} }
gSPDisplayList(renderdata->gdl++, rodata->opagdl); gSPDisplayList(renderdata->gdl++, rodata->opagdl);
if (rodata->unk12 == 3 && rodata->xlugdl) { if (rodata->rendermode == MODELRENDERMODE_CTXAWARE_1PASS && rodata->xlugdl) {
model_apply_render_mode_type3(renderdata, false); model_apply_rendermode_ctxaware_1pass(renderdata, false);
gSPDisplayList(renderdata->gdl++, rodata->xlugdl); 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)); gSPSegment(renderdata->gdl++, SPSEGMENT_MODEL_COL1, osVirtualToPhysical(rodata->baseaddr));
if (renderdata->cullmode) { if (renderdata->cullmode) {
model_apply_cull_mode(renderdata); model_apply_cull_mode(renderdata);
} }
model_apply_render_mode_type4(renderdata, false); model_apply_rendermode_ctxaware_2pass(renderdata, false);
gSPDisplayList(renderdata->gdl++, rodata->xlugdl); 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); model_apply_cull_mode(renderdata);
} }
switch (rodata->dl.mcount) { switch (rodata->dl.rendermode) {
case 1: case MODELRENDERMODE_SIMPLE:
model_apply_render_mode_type1(renderdata); model_apply_rendermode_simple(renderdata);
break; break;
case 3: case MODELRENDERMODE_CTXAWARE_1PASS:
model_apply_render_mode_type3(renderdata, true); model_apply_rendermode_ctxaware_1pass(renderdata, true);
break; break;
case 4: case MODELRENDERMODE_CTXAWARE_2PASS:
model_apply_render_mode_type4(renderdata, true); model_apply_rendermode_ctxaware_2pass(renderdata, true);
break; break;
case 2: case MODELRENDERMODE_TRILERP:
model_apply_render_mode_type2(renderdata); model_apply_rendermode_trilerp(renderdata);
break; break;
} }
@ -3239,8 +3257,8 @@ void model_render_node_dl(struct modelrenderdata *renderdata, struct model *mode
gSPDisplayList(renderdata->gdl++, rwdata->dl.gdl); gSPDisplayList(renderdata->gdl++, rwdata->dl.gdl);
if (rodata->dl.mcount == 3 && rodata->dl.xlugdl) { if (rodata->dl.rendermode == MODELRENDERMODE_CTXAWARE_1PASS && rodata->dl.xlugdl) {
model_apply_render_mode_type3(renderdata, false); model_apply_rendermode_ctxaware_1pass(renderdata, false);
gSPDisplayList(renderdata->gdl++, rodata->dl.xlugdl); 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) { if (renderdata->flags & MODELRENDERFLAG_XLU) {
union modelrwdata *rwdata = model_get_node_rw_data(model, node); 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)); gSPSegment(renderdata->gdl++, SPSEGMENT_MODEL_COL1, osVirtualToPhysical(rodata->dl.colours));
if (renderdata->cullmode) { 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_VTX, osVirtualToPhysical(rwdata->dl.vertices));
gSPSegment(renderdata->gdl++, SPSEGMENT_MODEL_COL2, osVirtualToPhysical(rwdata->dl.colours)); 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); gSPDisplayList(renderdata->gdl++, rodata->dl.xlugdl);
} }

View File

@ -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]; t1mtx = &model->matrices[node->rodata->position.mtxindex0];
modelasm_mtx_multiply(t0mtx, t1mtx); modelasm_mtx_multiply(t0mtx, t1mtx);
@ -650,7 +650,7 @@ bool modelasm00018680(struct modelrenderdata *renderdata, struct model *model)
f20 *= model->scale; f20 *= model->scale;
} }
t0mtx = renderdata->unk00; t0mtx = renderdata->rendermtx;
t1mtx = &model->matrices[node->rodata->chrinfo.mtxindex]; t1mtx = &model->matrices[node->rodata->chrinfo.mtxindex];
modelasm_mtx_multiply(t0mtx, t1mtx); modelasm_mtx_multiply(t0mtx, t1mtx);
@ -671,7 +671,7 @@ bool modelasm00018680(struct modelrenderdata *renderdata, struct model *model)
} }
break; break;
case MODELNODETYPE_POSITIONHELD: 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; f12 = 1;
f13 = 0; f13 = 0;