Improve mismatch of tvscreenRender

This commit is contained in:
Ryan Dwyer 2022-10-15 10:04:19 +10:00
parent 914aaaa0e4
commit b47847fb9d
1 changed files with 118 additions and 109 deletions

View File

@ -15064,76 +15064,79 @@ glabel var7f1aa824
/* 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.
struct tvcmd {
u32 type;
s32 arg1;
u32 arg2;
};
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
struct colour *colours = gfxAllocateColours(1); // b0
Gfx *savedgdl = gdl++; // ac
union modelrodata *rodata = node->rodata; // a8
union modelrwdata *rwdata = modelGetNodeRwData(model, node); // a4
struct textureconfig *tconfig;
bool yielding = false;
while (!yielding) {
u32 *cmd = &screen->cmdlist[screen->offset];
struct tvcmd *cmd = (struct tvcmd *) &screen->cmdlist[screen->offset]; // 98
switch (cmd[0]) {
case TVCMD_STOPSCROLL: // f07fce4
screen->xmidinc = 0;
screen->ymidinc = 0;
switch (cmd->type) {
case TVCMD_STOPSCROLL:
screen->xmidinc = 0.0f;
screen->ymidinc = 0.0f;
screen->offset++;
break;
case TVCMD_SCROLLRELX: // f07fcf8
screen->xmidfrac = 0;
screen->xmidinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
case TVCMD_SCROLLRELX:
screen->xmidfrac = 0.0f;
screen->xmidinc = cmd->arg2 == 0 ? 1.0f : 1.0f / cmd->arg2;
screen->xmidold = screen->xmid;
screen->xmidnew = screen->xmid + (s32)cmd[1] * (1.0f / 1024.0f);
screen->xmidnew = screen->xmid + cmd->arg1 * (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];
case TVCMD_SCROLLRELY:
screen->ymidfrac = 0.0f;
screen->ymidinc = cmd->arg2 == 0 ? 1.0f : 1.0f / cmd->arg2;
screen->ymidold = screen->ymid;
screen->ymidnew = screen->ymid + (s32)cmd[1] * (1.0f / 1024.0f);
screen->ymidnew = screen->ymid + cmd->arg1 * (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];
case TVCMD_SCROLLABSX:
screen->xmidfrac = 0.0f;
screen->xmidinc = cmd->arg2 == 0 ? 1.0f : 1.0f / cmd->arg2;
screen->xmidold = screen->xmid;
screen->xmidnew = (s32)cmd[1] * (1.0f / 1024.0f);
screen->xmidnew = cmd->arg1 * (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];
case TVCMD_SCROLLABSY:
screen->ymidfrac = 0.0f;
screen->ymidinc = cmd->arg2 == 0 ? 1.0f : 1.0f / cmd->arg2;
screen->ymidold = screen->ymid;
screen->ymidnew = (s32)cmd[1] * (1.0f / 1024.0f);
screen->ymidnew = cmd->arg1 * (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];
case TVCMD_SCALEABSX:
screen->xscalefrac = 0.0f;
screen->xscaleinc = cmd->arg2 == 0 ? 1.0f : 1.0f / cmd->arg2;
screen->xscaleold = screen->xscale;
screen->xscalenew = (s32)cmd[1] * (1.0f / 1024.0f);
screen->xscalenew = cmd->arg1 * (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];
case TVCMD_SCALEABSY:
screen->yscalefrac = 0.0f;
screen->yscaleinc = cmd->arg2 == 0 ? 1.0f : 1.0f / cmd->arg2;
screen->yscaleold = screen->yscale;
screen->yscalenew = (s32)cmd[1] * (1.0f / 1024.0f);
screen->yscalenew = cmd->arg1 * (1.0f / 1024.0f);
screen->offset += 3;
break;
case TVCMD_SETTEXTURE: // f07ff88
tvscreenSetTexture(screen, cmd[1]);
case TVCMD_SETTEXTURE:
tvscreenSetTexture(screen, cmd->arg1);
screen->offset += 2;
break;
case TVCMD_PAUSE: // f07ffb4
case TVCMD_PAUSE:
if (screen->pause60 >= 0) {
screen->pause60 -= g_Vars.lvupdate60;
@ -15144,55 +15147,55 @@ Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen
}
} else {
yielding = true;
screen->pause60 = cmd[1];
screen->pause60 = cmd->arg1;
}
break;
case TVCMD_SETCMDLIST: // f080000
tvscreenSetCmdlist(screen, (u32 *) cmd[1]);
case TVCMD_SETCMDLIST:
tvscreenSetCmdlist(screen, (u32 *) cmd->arg1);
break;
case TVCMD_RANDSETCMDLIST: // f080020
if ((random() >> 16) < cmd[2]) {
tvscreenSetCmdlist(screen, (u32 *) cmd[1]);
case TVCMD_RANDSETCMDLIST:
if ((random() >> 16) < cmd->arg2) {
tvscreenSetCmdlist(screen, (u32 *) cmd->arg1);
} else {
screen->offset += 3;
}
break;
case TVCMD_RESTART: // f080074
case TVCMD_RESTART:
screen->offset = 0;
break;
case TVCMD_YIELD: // f08007c
case TVCMD_YIELD:
yielding = true;
break;
case TVCMD_SETCOLOUR: // f080084
screen->colfrac = 0;
screen->colinc = cmd[2] == 0 ? 1.0f : 1.0f / cmd[2];
case TVCMD_SETCOLOUR:
screen->colfrac = 0.0f;
screen->colinc = cmd->arg2 == 0 ? 1.0f : 1.0f / cmd->arg2;
screen->redold = screen->red;
screen->rednew = (cmd[1] >> 24);
screen->rednew = ((u32)cmd->arg1 >> 24) & 0xff;
screen->greenold = screen->green;
screen->greennew = (cmd[1] >> 16);
screen->greennew = ((u32)cmd->arg1 >> 16) & 0xff;
screen->blueold = screen->blue;
screen->bluenew = (cmd[1] >> 8);
screen->bluenew = ((u32)cmd->arg1 >> 8) & 0xff;
screen->alphaold = screen->alpha;
screen->alphanew = cmd[1];
screen->alphanew = cmd->arg1 & 0xff;
screen->offset += 3;
break;
case TVCMD_ROTATEABS: // f08011c
screen->rot = (s32)cmd[1] * (M_BADTAU / 65536.0f);
case TVCMD_ROTATEABS:
screen->rot = cmd->arg1 * (M_BADTAU / 65536.0f);
screen->offset += 2;
break;
case TVCMD_ROTATEREL: // f080140
screen->rot += g_Vars.lvupdate60f * (s32)cmd[1] * (M_BADTAU / 65536.0f);
case TVCMD_ROTATEREL:
screen->rot += g_Vars.lvupdate60f * cmd->arg1 * (M_BADTAU / 65536.0f);
if (screen->rot >= M_BADTAU) {
screen->rot -= M_BADTAU;
}
if (screen->rot < 0) {
if (screen->rot < 0.0f) {
screen->rot += M_BADTAU;
}
@ -15202,79 +15205,69 @@ Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen
}
// Increment X scale
if (screen->xscaleinc > 0) {
if (screen->xscaleinc > 0.0f) {
screen->xscalefrac += screen->xscaleinc * g_Vars.lvupdate60f;
if (screen->xscalefrac < 1.0f) {
screen->xscale = screen->xscaleold + (screen->xscalenew - screen->xscaleold) * screen->xscalefrac;
} else {
screen->xscalefrac = 1.0f;
screen->xscaleinc = 0;
screen->xscaleinc = 0.0f;
screen->xscale = screen->xscalenew;
}
}
// Increment Y scale
if (screen->yscaleinc > 0) {
if (screen->yscaleinc > 0.0f) {
screen->yscalefrac += screen->yscaleinc * g_Vars.lvupdate60f;
if (screen->yscalefrac < 1.0f) {
screen->yscale = screen->yscaleold + (screen->yscalenew - screen->yscaleold) * screen->yscalefrac;
} else {
screen->yscalefrac = 1.0f;
screen->yscaleinc = 0;
screen->yscaleinc = 0.0f;
screen->yscale = screen->yscalenew;
}
}
// Increment X scroll
if (screen->xmidinc > 0) {
if (screen->xmidinc > 0.0f) {
screen->xmidfrac += screen->xmidinc * g_Vars.lvupdate60f;
if (screen->xmidfrac < 1.0f) {
screen->xmid = screen->xmidold + (screen->xmidnew - screen->xmidold) * screen->xmidfrac;
} else {
screen->xmidfrac = 1.0f;
screen->xmidinc = 0;
screen->xmidinc = 0.0f;
screen->xmid = screen->xmidnew;
}
}
// Increment Y scroll
if (screen->ymidinc > 0) {
if (screen->ymidinc > 0.0f) {
screen->ymidfrac += screen->ymidinc * g_Vars.lvupdate60f;
if (screen->ymidfrac < 1.0f) {
screen->ymid = screen->ymidold + (screen->ymidnew - screen->ymidold) * screen->ymidfrac;
} else {
screen->ymidfrac = 1.0f;
screen->ymidinc = 0;
screen->ymidinc = 0.0f;
screen->ymid = screen->ymidnew;
}
}
// Increment colour change
// 370
if (screen->colinc > 0) {
if (screen->colinc > 0.0f) {
screen->colfrac += screen->colinc * g_Vars.lvupdate60f;
// 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;
screen->red = screen->redold + (s32) ((screen->rednew - screen->redold) * screen->colfrac);
screen->green = screen->greenold + (s32) ((screen->greennew - screen->greenold) * screen->colfrac);
screen->blue = screen->blueold + (s32) ((screen->bluenew - screen->blueold) * screen->colfrac);
screen->alpha = screen->alphaold + (s32) ((screen->alphanew - screen->alphaold) * screen->colfrac);
} else {
screen->colfrac = 1.0f;
screen->colinc = 0;
screen->colinc = 0.0f;
screen->red = screen->rednew;
screen->green = screen->greennew;
screen->blue = screen->bluenew;
@ -15283,9 +15276,9 @@ Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen
}
// Set up everything for rendering
rwdata->dl.vertices = vertices;
rwdata->dl.colours = (struct colour *) colours;
rwdata->dl.gdl = gdl;
rwdata->dl.vertices = vertices;
rwdata->dl.colours = colours;
vertices[0] = rodata->dl.vertices[0];
vertices[1] = rodata->dl.vertices[1];
@ -15293,20 +15286,38 @@ Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen
vertices[3] = rodata->dl.vertices[3];
if ((u32)screen->tconfig < 100) {
tconfig = &g_TexScreenConfigs[(u32)screen->tconfig];
tconfig = &g_TexScreenConfigs[(s32)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;
u32 stack[13];
f32 f20;
f32 f24;
f32 f14; // 58
f32 f16; // 54
u8 stack2[0x8];
f32 a;
f32 b;
if (screen->rot != 0) {
f32 f22 = cosf(screen->rot) * 1.4141999483109f;
f32 f2 = sinf(screen->rot) * 1.4141999483109f;
f20 = screen->xscale / 2.0f;
f24 = screen->yscale / 2.0f;
f14 = f20;
f16 = f24;
if (1);
if (1);
if (1);
if (1);
if (1);
if (screen->rot != 0.0f) {
f32 f22;
f32 f2;
f22 = cosf(screen->rot) * 1.4142f;
f2 = sinf(screen->rot) * 1.4142f;
f20 *= f22;
f24 *= f2;
@ -15314,22 +15325,20 @@ Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen
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;
vertices[0].s = tconfig->width * (screen->xmid + f20) * 32.0f;
vertices[0].t = tconfig->height * (screen->ymid + f24) * 32.0f;
vertices[1].s = tconfig->width * (screen->xmid - f14) * 32.0f;
vertices[1].t = tconfig->height * (screen->ymid + f16) * 32.0f;
vertices[2].s = tconfig->width * (screen->xmid - f20) * 32.0f;
vertices[2].t = tconfig->height * (screen->ymid - f24) * 32.0f;
vertices[3].s = tconfig->width * (screen->xmid + f14) * 32.0f;
vertices[3].t = tconfig->height * (screen->ymid - f16) * 32.0f;
}
if (tconfig);
colours[0] = screen->red;
colours[1] = screen->green;
colours[2] = screen->blue;
colours[3] = screen->alpha;
colours[0].r = screen->red;
colours[0].g = screen->green;
colours[0].b = screen->blue;
colours[0].a = screen->alpha;
vertices[0].colour = 0;
vertices[1].colour = 0;
@ -15343,14 +15352,14 @@ Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen
// Render the image
gSPSetGeometryMode(gdl++, G_CULL_BACK);
if (1);
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));
gSPSegment(gdl++, SPSEGMENT_MODEL_VTX, osVirtualToPhysical(vertices));
gDPSetColorArray(gdl++, osVirtualToPhysical(colours), 1);
gDPSetVerticeArray(gdl++, 0x04000000, 4);
gDPSetVerticeArray(gdl++, SPSEGMENT_MODEL_VTX << 24, 4);
gDPTri2(gdl++, 0, 1, 2, 0, 2, 3);
gSPEndDisplayList(gdl++);