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)
{
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;
}

View File

@ -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;

View File

@ -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];

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;

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;
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);
}

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];
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;