mirror of
https://gitlab.com/ryandwyer/perfect-dark
synced 2026-08-17 12:59:41 -04:00
Add support for non-matching ntsc-final builds
This commit is contained in:
+296
-294
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user