Add support for non-matching ntsc-final builds

This commit is contained in:
Ryan Dwyer
2022-09-09 17:19:48 +10:00
parent ad28d219d1
commit bbf52f580b
41 changed files with 10982 additions and 10853 deletions
+296 -294
View File
@@ -14058,6 +14058,7 @@ void tvscreenSetTexture(struct tvscreen *screen, s32 texturenum)
screen->tconfig = (struct textureconfig *)texturenum;
}
#if MATCHING
GLOBAL_ASM(
glabel tvscreenRender
.late_rodata
@@ -15049,302 +15050,303 @@ glabel var7f1aa824
/* f0809bc: 03e00008 */ jr $ra
/* f0809c0: 27bd00b8 */ addiu $sp,$sp,0xb8
);
#else
// Mismatch: Several issues, but main one is the float variables near the cosf
// and sinf calls. Appears to be functionally identical.
//Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen *screen, Gfx *gdl, s32 arg4, s32 arg5)
//{
// struct textureconfig *tconfig;
//
// if (node && (node->type & 0xff) == MODELNODETYPE_DL) {
// struct gfxvtx *vertices = gfxAllocateVertices(4); // b4
// u8 *colours = gfxAllocateColours(1); // b0
// Gfx *savedgdl = gdl++; // ac
// union modelrodata *rodata = node->rodata; // a8
// union modelrwdata *rwdata = modelGetNodeRwData(model, node); // a4
// bool yielding = false;
//
// while (!yielding) {
// u32 *cmd = &screen->cmdlist[screen->offset];
//
// switch (cmd[0]) {
// case TVCMD_STOPSCROLL: // f07fce4
// screen->xmidinc = 0;
// screen->ymidinc = 0;
// screen->offset++;
// break;
// case TVCMD_SCROLLRELX: // f07fcf8
// screen->xmidfrac = 0;
// screen->xmidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
// screen->xmidold = screen->xmid;
// screen->xmidnew = screen->xmid + (s32)cmd[1] * (1.0f / 1024.0f);
// screen->offset += 3;
// break;
// case TVCMD_SCROLLRELY: // f07fd68
// screen->ymidfrac = 0;
// screen->ymidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
// screen->ymidold = screen->ymid;
// screen->ymidnew = screen->ymid + (s32)cmd[1] * (1.0f / 1024.0f);
// screen->offset += 3;
// break;
// case TVCMD_SCROLLABSX: // f07fdd8
// screen->xmidfrac = 0;
// screen->xmidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
// screen->xmidold = screen->xmid;
// screen->xmidnew = (s32)cmd[1] * (1.0f / 1024.0f);
// screen->offset += 3;
// break;
// case TVCMD_SCROLLABSY: // f07fe44
// screen->ymidfrac = 0;
// screen->ymidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
// screen->ymidold = screen->ymid;
// screen->ymidnew = (s32)cmd[1] * (1.0f / 1024.0f);
// screen->offset += 3;
// break;
// case TVCMD_SCALEABSX: // f07feb0
// screen->xscalefrac = 0;
// screen->xscaleinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
// screen->xscaleold = screen->xscale;
// screen->xscalenew = (s32)cmd[1] * (1.0f / 1024.0f);
// screen->offset += 3;
// break;
// case TVCMD_SCALEABSY: // f07ff1c
// screen->yscalefrac = 0;
// screen->yscaleinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
// screen->yscaleold = screen->yscale;
// screen->yscalenew = (s32)cmd[1] * (1.0f / 1024.0f);
// screen->offset += 3;
// break;
// case TVCMD_SETTEXTURE: // f07ff88
// tvscreenSetTexture(screen, cmd[1]);
// screen->offset += 2;
// break;
// case TVCMD_PAUSE: // f07ffb4
// if (screen->pause60 >= 0) {
// screen->pause60 -= g_Vars.lvupdate240_60;
//
// if (screen->pause60 >= 0) {
// yielding = true;
// } else {
// screen->offset += 2;
// }
// } else {
// yielding = true;
// screen->pause60 = cmd[1];
// }
// break;
// case TVCMD_SETCMDLIST: // f080000
// tvscreenSetCmdlist(screen, (u32 *) cmd[1]);
// break;
// case TVCMD_RANDSETCMDLIST: // f080020
// if ((random() >> 16) < cmd[2]) {
// tvscreenSetCmdlist(screen, (u32 *) cmd[1]);
// } else {
// screen->offset += 3;
// }
// break;
// case TVCMD_RESTART: // f080074
// screen->offset = 0;
// break;
// case TVCMD_YIELD: // f08007c
// yielding = true;
// break;
// case TVCMD_SETCOLOUR: // f080084
// screen->colfrac = 0;
// screen->colinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
//
// screen->redold = screen->red;
// screen->rednew = (cmd[1] >> 24);
//
// screen->greenold = screen->green;
// screen->greennew = (cmd[1] >> 16);
//
// screen->blueold = screen->blue;
// screen->bluenew = (cmd[1] >> 8);
//
// screen->alphaold = screen->alpha;
// screen->alphanew = cmd[1];
//
// screen->offset += 3;
// break;
// case TVCMD_ROTATEABS: // f08011c
// screen->rot = (s32)cmd[1] * (M_BADTAU / 65536.0f);
// screen->offset += 2;
// break;
// case TVCMD_ROTATEREL: // f080140
// screen->rot += g_Vars.lvupdate240f * (s32)cmd[1] * (M_BADTAU / 65536.0f);
//
// if (screen->rot >= M_BADTAU) {
// screen->rot -= M_BADTAU;
// }
//
// if (screen->rot < 0) {
// screen->rot += M_BADTAU;
// }
//
// screen->offset += 2;
// break;
// }
// }
//
// // Increment X scale
// if (screen->xscaleinc > 0) {
// screen->xscalefrac += screen->xscaleinc * g_Vars.lvupdate240f;
//
// if (screen->xscalefrac < 1.0f) {
// screen->xscale = screen->xscaleold + (screen->xscalenew - screen->xscaleold) * screen->xscalefrac;
// } else {
// screen->xscalefrac = 1.0f;
// screen->xscaleinc = 0;
// screen->xscale = screen->xscalenew;
// }
// }
//
// // Increment Y scale
// if (screen->yscaleinc > 0) {
// screen->yscalefrac += screen->yscaleinc * g_Vars.lvupdate240f;
//
// if (screen->yscalefrac < 1.0f) {
// screen->yscale = screen->yscaleold + (screen->yscalenew - screen->yscaleold) * screen->yscalefrac;
// } else {
// screen->yscalefrac = 1.0f;
// screen->yscaleinc = 0;
// screen->yscale = screen->yscalenew;
// }
// }
//
// // Increment X scroll
// if (screen->xmidinc > 0) {
// screen->xmidfrac += screen->xmidinc * g_Vars.lvupdate240f;
//
// if (screen->xmidfrac < 1.0f) {
// screen->xmid = screen->xmidold + (screen->xmidnew - screen->xmidold) * screen->xmidfrac;
// } else {
// screen->xmidfrac = 1.0f;
// screen->xmidinc = 0;
// screen->xmid = screen->xmidnew;
// }
// }
//
// // Increment Y scroll
// if (screen->ymidinc > 0) {
// screen->ymidfrac += screen->ymidinc * g_Vars.lvupdate240f;
//
// if (screen->ymidfrac < 1.0f) {
// screen->ymid = screen->ymidold + (screen->ymidnew - screen->ymidold) * screen->ymidfrac;
// } else {
// screen->ymidfrac = 1.0f;
// screen->ymidinc = 0;
// screen->ymid = screen->ymidnew;
// }
// }
//
// // Increment colour change
// // 370
// if (screen->colinc > 0) {
// screen->colfrac += screen->colinc * g_Vars.lvupdate240f;
//
// // 398
// if (screen->colfrac < 1.0f) {
// s32 r;
// s32 g;
// s32 b;
// s32 a;
// r = screen->colfrac * (screen->rednew - screen->redold);
// g = screen->colfrac * (screen->greennew - screen->greenold);
// screen->red = r + screen->redold;
// screen->green = g + screen->greenold;
// b = screen->colfrac * (screen->bluenew - screen->blueold);
// a = screen->colfrac * (screen->alphanew - screen->alphaold);
// screen->blue = b + screen->blueold;
// screen->alpha = a + screen->alphaold;
// } else {
// screen->colfrac = 1.0f;
// screen->colinc = 0;
// screen->red = screen->rednew;
// screen->green = screen->greennew;
// screen->blue = screen->bluenew;
// screen->alpha = screen->alphanew;
// }
// }
//
// // Set up everything for rendering
// rwdata->dl.vertices = vertices;
// rwdata->dl.unk08 = (u32 *) colours;
// rwdata->dl.gdl = gdl;
//
// vertices[0] = rodata->dl.vertices[0];
// vertices[1] = rodata->dl.vertices[1];
// vertices[2] = rodata->dl.vertices[2];
// vertices[3] = rodata->dl.vertices[3];
//
// if ((u32)screen->tconfig < 100) {
// tconfig = &g_TexScreenConfigs[(u32)screen->tconfig];
// } else {
// tconfig = screen->tconfig;
// }
//
// if (tconfig != NULL) {
// f32 f20 = screen->xscale * 0.5f;
// f32 f24 = screen->yscale * 0.5f;
// f32 f14 = f20;
// f32 f16 = f24;
//
// if (screen->rot != 0) {
// f32 f22 = cosf(screen->rot) * 1.4141999483109f;
// f32 f2 = sinf(screen->rot) * 1.4141999483109f;
//
// f20 *= f22;
// f24 *= f2;
// f14 *= f2;
// f16 *= f22;
// }
//
// vertices[0].s = tconfig->width * (screen->xmid + f20) * 32;
// vertices[0].t = tconfig->height * (screen->ymid + f24) * 32;
// vertices[1].s = tconfig->width * (screen->xmid - f14) * 32;
// vertices[1].t = tconfig->height * (screen->ymid + f16) * 32;
// vertices[2].s = tconfig->width * (screen->xmid - f20) * 32;
// vertices[2].t = tconfig->height * (screen->ymid - f24) * 32;
// vertices[3].s = tconfig->width * (screen->xmid + f14) * 32;
// vertices[3].t = tconfig->height * (screen->ymid - f16) * 32;
// }
//
// if (tconfig);
//
// colours[0] = screen->red;
// colours[1] = screen->green;
// colours[2] = screen->blue;
// colours[3] = screen->alpha;
//
// vertices[0].colour = 0;
// vertices[1].colour = 0;
// vertices[2].colour = 0;
// vertices[3].colour = 0;
//
// if (screen->alpha < 255) {
// arg5 = 2;
// }
//
// // Render the image
// gSPSetGeometryMode(gdl++, G_CULL_BACK);
//
// texSelect(&gdl, tconfig, arg5, arg4, 2, 1, NULL);
//
// gSPMatrix(gdl++, osVirtualToPhysical(model->matrices), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
//
// gMoveWd(gdl++, 1, 6, osVirtualToPhysical(vertices));
// gDPSetColorArray(gdl++, osVirtualToPhysical(colours), 1);
// gDPSetVerticeArray(gdl++, 0x04000000, 4);
//
// gDPTri2(gdl++, 0, 1, 2, 0, 2, 3);
// gSPEndDisplayList(gdl++);
//
// gSPBranchList(savedgdl++, gdl);
// }
//
// return gdl;
//}
Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen *screen, Gfx *gdl, s32 arg4, s32 arg5)
{
struct textureconfig *tconfig;
if (node && (node->type & 0xff) == MODELNODETYPE_DL) {
struct gfxvtx *vertices = gfxAllocateVertices(4); // b4
u8 *colours = gfxAllocateColours(1); // b0
Gfx *savedgdl = gdl++; // ac
union modelrodata *rodata = node->rodata; // a8
union modelrwdata *rwdata = modelGetNodeRwData(model, node); // a4
bool yielding = false;
while (!yielding) {
u32 *cmd = &screen->cmdlist[screen->offset];
switch (cmd[0]) {
case TVCMD_STOPSCROLL: // f07fce4
screen->xmidinc = 0;
screen->ymidinc = 0;
screen->offset++;
break;
case TVCMD_SCROLLRELX: // f07fcf8
screen->xmidfrac = 0;
screen->xmidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
screen->xmidold = screen->xmid;
screen->xmidnew = screen->xmid + (s32)cmd[1] * (1.0f / 1024.0f);
screen->offset += 3;
break;
case TVCMD_SCROLLRELY: // f07fd68
screen->ymidfrac = 0;
screen->ymidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
screen->ymidold = screen->ymid;
screen->ymidnew = screen->ymid + (s32)cmd[1] * (1.0f / 1024.0f);
screen->offset += 3;
break;
case TVCMD_SCROLLABSX: // f07fdd8
screen->xmidfrac = 0;
screen->xmidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
screen->xmidold = screen->xmid;
screen->xmidnew = (s32)cmd[1] * (1.0f / 1024.0f);
screen->offset += 3;
break;
case TVCMD_SCROLLABSY: // f07fe44
screen->ymidfrac = 0;
screen->ymidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
screen->ymidold = screen->ymid;
screen->ymidnew = (s32)cmd[1] * (1.0f / 1024.0f);
screen->offset += 3;
break;
case TVCMD_SCALEABSX: // f07feb0
screen->xscalefrac = 0;
screen->xscaleinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
screen->xscaleold = screen->xscale;
screen->xscalenew = (s32)cmd[1] * (1.0f / 1024.0f);
screen->offset += 3;
break;
case TVCMD_SCALEABSY: // f07ff1c
screen->yscalefrac = 0;
screen->yscaleinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
screen->yscaleold = screen->yscale;
screen->yscalenew = (s32)cmd[1] * (1.0f / 1024.0f);
screen->offset += 3;
break;
case TVCMD_SETTEXTURE: // f07ff88
tvscreenSetTexture(screen, cmd[1]);
screen->offset += 2;
break;
case TVCMD_PAUSE: // f07ffb4
if (screen->pause60 >= 0) {
screen->pause60 -= g_Vars.lvupdate240_60;
if (screen->pause60 >= 0) {
yielding = true;
} else {
screen->offset += 2;
}
} else {
yielding = true;
screen->pause60 = cmd[1];
}
break;
case TVCMD_SETCMDLIST: // f080000
tvscreenSetCmdlist(screen, (u32 *) cmd[1]);
break;
case TVCMD_RANDSETCMDLIST: // f080020
if ((random() >> 16) < cmd[2]) {
tvscreenSetCmdlist(screen, (u32 *) cmd[1]);
} else {
screen->offset += 3;
}
break;
case TVCMD_RESTART: // f080074
screen->offset = 0;
break;
case TVCMD_YIELD: // f08007c
yielding = true;
break;
case TVCMD_SETCOLOUR: // f080084
screen->colfrac = 0;
screen->colinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
screen->redold = screen->red;
screen->rednew = (cmd[1] >> 24);
screen->greenold = screen->green;
screen->greennew = (cmd[1] >> 16);
screen->blueold = screen->blue;
screen->bluenew = (cmd[1] >> 8);
screen->alphaold = screen->alpha;
screen->alphanew = cmd[1];
screen->offset += 3;
break;
case TVCMD_ROTATEABS: // f08011c
screen->rot = (s32)cmd[1] * (M_BADTAU / 65536.0f);
screen->offset += 2;
break;
case TVCMD_ROTATEREL: // f080140
screen->rot += g_Vars.lvupdate240f * (s32)cmd[1] * (M_BADTAU / 65536.0f);
if (screen->rot >= M_BADTAU) {
screen->rot -= M_BADTAU;
}
if (screen->rot < 0) {
screen->rot += M_BADTAU;
}
screen->offset += 2;
break;
}
}
// Increment X scale
if (screen->xscaleinc > 0) {
screen->xscalefrac += screen->xscaleinc * g_Vars.lvupdate240f;
if (screen->xscalefrac < 1.0f) {
screen->xscale = screen->xscaleold + (screen->xscalenew - screen->xscaleold) * screen->xscalefrac;
} else {
screen->xscalefrac = 1.0f;
screen->xscaleinc = 0;
screen->xscale = screen->xscalenew;
}
}
// Increment Y scale
if (screen->yscaleinc > 0) {
screen->yscalefrac += screen->yscaleinc * g_Vars.lvupdate240f;
if (screen->yscalefrac < 1.0f) {
screen->yscale = screen->yscaleold + (screen->yscalenew - screen->yscaleold) * screen->yscalefrac;
} else {
screen->yscalefrac = 1.0f;
screen->yscaleinc = 0;
screen->yscale = screen->yscalenew;
}
}
// Increment X scroll
if (screen->xmidinc > 0) {
screen->xmidfrac += screen->xmidinc * g_Vars.lvupdate240f;
if (screen->xmidfrac < 1.0f) {
screen->xmid = screen->xmidold + (screen->xmidnew - screen->xmidold) * screen->xmidfrac;
} else {
screen->xmidfrac = 1.0f;
screen->xmidinc = 0;
screen->xmid = screen->xmidnew;
}
}
// Increment Y scroll
if (screen->ymidinc > 0) {
screen->ymidfrac += screen->ymidinc * g_Vars.lvupdate240f;
if (screen->ymidfrac < 1.0f) {
screen->ymid = screen->ymidold + (screen->ymidnew - screen->ymidold) * screen->ymidfrac;
} else {
screen->ymidfrac = 1.0f;
screen->ymidinc = 0;
screen->ymid = screen->ymidnew;
}
}
// Increment colour change
// 370
if (screen->colinc > 0) {
screen->colfrac += screen->colinc * g_Vars.lvupdate240f;
// 398
if (screen->colfrac < 1.0f) {
s32 r;
s32 g;
s32 b;
s32 a;
r = screen->colfrac * (screen->rednew - screen->redold);
g = screen->colfrac * (screen->greennew - screen->greenold);
screen->red = r + screen->redold;
screen->green = g + screen->greenold;
b = screen->colfrac * (screen->bluenew - screen->blueold);
a = screen->colfrac * (screen->alphanew - screen->alphaold);
screen->blue = b + screen->blueold;
screen->alpha = a + screen->alphaold;
} else {
screen->colfrac = 1.0f;
screen->colinc = 0;
screen->red = screen->rednew;
screen->green = screen->greennew;
screen->blue = screen->bluenew;
screen->alpha = screen->alphanew;
}
}
// Set up everything for rendering
rwdata->dl.vertices = vertices;
rwdata->dl.colours = (struct colour *) colours;
rwdata->dl.gdl = gdl;
vertices[0] = rodata->dl.vertices[0];
vertices[1] = rodata->dl.vertices[1];
vertices[2] = rodata->dl.vertices[2];
vertices[3] = rodata->dl.vertices[3];
if ((u32)screen->tconfig < 100) {
tconfig = &g_TexScreenConfigs[(u32)screen->tconfig];
} else {
tconfig = screen->tconfig;
}
if (tconfig != NULL) {
f32 f20 = screen->xscale * 0.5f;
f32 f24 = screen->yscale * 0.5f;
f32 f14 = f20;
f32 f16 = f24;
if (screen->rot != 0) {
f32 f22 = cosf(screen->rot) * 1.4141999483109f;
f32 f2 = sinf(screen->rot) * 1.4141999483109f;
f20 *= f22;
f24 *= f2;
f14 *= f2;
f16 *= f22;
}
vertices[0].s = tconfig->width * (screen->xmid + f20) * 32;
vertices[0].t = tconfig->height * (screen->ymid + f24) * 32;
vertices[1].s = tconfig->width * (screen->xmid - f14) * 32;
vertices[1].t = tconfig->height * (screen->ymid + f16) * 32;
vertices[2].s = tconfig->width * (screen->xmid - f20) * 32;
vertices[2].t = tconfig->height * (screen->ymid - f24) * 32;
vertices[3].s = tconfig->width * (screen->xmid + f14) * 32;
vertices[3].t = tconfig->height * (screen->ymid - f16) * 32;
}
if (tconfig);
colours[0] = screen->red;
colours[1] = screen->green;
colours[2] = screen->blue;
colours[3] = screen->alpha;
vertices[0].colour = 0;
vertices[1].colour = 0;
vertices[2].colour = 0;
vertices[3].colour = 0;
if (screen->alpha < 255) {
arg5 = 2;
}
// Render the image
gSPSetGeometryMode(gdl++, G_CULL_BACK);
texSelect(&gdl, tconfig, arg5, arg4, 2, 1, NULL);
gSPMatrix(gdl++, osVirtualToPhysical(model->matrices), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gMoveWd(gdl++, 1, 6, osVirtualToPhysical(vertices));
gDPSetColorArray(gdl++, osVirtualToPhysical(colours), 1);
gDPSetVerticeArray(gdl++, 0x04000000, 4);
gDPTri2(gdl++, 0, 1, 2, 0, 2, 3);
gSPEndDisplayList(gdl++);
gSPBranchList(savedgdl++, gdl);
}
return gdl;
}
#endif
void objRenderProp(struct prop *prop, struct modelrenderdata *renderdata, bool xlupass)
{