From c2aba16979b24da0857f498554843aaebe58cd3e Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Fri, 30 Jun 2023 06:43:36 -0400 Subject: [PATCH] Implement & link m_rcp.c --- config/rel_slices.yml | 4 + include/libforest/gbi_extensions.h | 13 + include/m_rcp.h | 37 ++- rel/m_prenmi.c | 2 +- rel/m_rcp.c | 455 +++++++++++++++++++++++++++++ 5 files changed, 504 insertions(+), 7 deletions(-) create mode 100644 rel/m_rcp.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index af9a0653..6b00ee48 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -79,6 +79,10 @@ m_random_field.c: .text: [0x803E4B20, 0x803E50E4] .rodata: [0x80643218, 0x80643240] .data: [0x8065C098, 0x8065C588] +m_rcp.c: + .text: [0x803E50E4, 0x803E5D04] + .data: [0x8065C588, 0x8065C910] + .bss: [0x8129F2E8, 0x8129F2F0] m_room_type/mRmTp_FtrItemNo2FtrIdx.c: .text: [0x803E7878, 0x803E78BC] #m_time.c: # unlinked until function callers that reorder local static variables are implemented. diff --git a/include/libforest/gbi_extensions.h b/include/libforest/gbi_extensions.h index b8aad211..99486f4a 100644 --- a/include/libforest/gbi_extensions.h +++ b/include/libforest/gbi_extensions.h @@ -476,6 +476,19 @@ do { \ /*_gfx->words.w1 = 0;*/ /* bug? they don't set the second word */ \ }} +#define gDPSetTileSize_Dolphin(pkt, tile, s, t, width, height) \ +do { \ + Gfx* _gfx = (Gfx*)(pkt); \ + _gfx->words.w0 = _SHIFTL(G_SETTILESIZE, 24, 8) | _SHIFTL(s, 10, 14) | _SHIFTL(width - 1, 0, 10); \ + _gfx->words.w1 = _SHIFTL(1, 31, 1) | _SHIFTL(tile, 24, 3) | _SHIFTL(t, 10, 14) | _SHIFTL(height - 1, 0, 10); \ +} while (0) + +#define gsDPSetTileSize_Dolphin(tile, s, t, width, height) \ +{{ \ + _SHIFTL(G_SETTILESIZE, 24, 8) | _SHIFTL(s, 10, 14) | _SHIFTL(width - 1, 0, 10), \ + _SHIFTL(1, 31, 1) | _SHIFTL(tile, 24, 3) | _SHIFTL(t, 10, 14) | _SHIFTL(height - 1, 0, 10)\ +}} + #define G_DOLPHIN_TLUT_DEFAULT_MODE 15 // used almost always? CI palettes are forced to GX_TF_RGB5A3 #define gsDPLoadTextureBlock_4b_Dolphin(timg, fmt, w, h, pal, ws, wt, ss, st) \ gsDPSetTextureImage_Dolphin(fmt, G_IM_SIZ_4b, h, w, timg), \ diff --git a/include/m_rcp.h b/include/m_rcp.h index 2185ec37..a6542bd6 100644 --- a/include/m_rcp.h +++ b/include/m_rcp.h @@ -3,20 +3,45 @@ #include "types.h" #include "PR/mbi.h" +#include "libforest/gbi_extensions.h" #include "game.h" #ifdef __cplusplus extern "C" { #endif -extern Gfx* gfx_gSPTextureRectangle1(Gfx* gfx, u32 ulx, u32 uly, u32 lrx, u32 lry, int tile, int s, int t, int dsdx, int dtdy); +extern void gfx_set_fog_position(Gfx** gfxp, int near, int far); +extern Gfx* gfx_set_fog_nosync(Gfx* gfx, int r, int g, int b, int a, int near, int far); +extern void texture_z_light_prim_xlu_disp(GRAPH* graph); +extern void _texture_z_light_fog_prim_bg(GRAPH* graph); +extern void _texture_z_light_fog_prim(GRAPH* graph); +extern void _texture_z_light_fog_prim_shadow(GRAPH* graph); +extern void _texture_z_light_fog_prim_xlu(GRAPH* graph); +extern void _texture_z_light_fog_prim_light(GRAPH* graph); +extern void _texture_z_light_fog_prim_npc(GRAPH* graph); +extern Gfx* texture_z_light_fog_prim_bb_pal_opa(Gfx* gfx); +extern Gfx* texture_z_light_fog_prim_bb_pal_xlu(Gfx* gfx); +extern Gfx* texture_z_fog_lod_alpha_shadow(Gfx* gfx); +extern Gfx* gfx_rect_moji(Gfx* gfx); +extern void rect_moji(GRAPH* graph); +extern void polygon_z_light_prim(GRAPH* graph); +extern void softsprite_prim(GRAPH* graph); +extern Gfx* gfx_softsprite_prim_xlu(Gfx* gfx); +extern Gfx* gfx_tex_scroll2(Gfx** gfxpp, int x, int y, int width, int height); +extern Gfx* tex_scroll2(GRAPH* graph, u32 x, u32 y, int width, int height); +extern Gfx* tex_scroll2_dolphin(GRAPH* graph, int x, int y, int width, int height); +extern Gfx* two_tex_scroll(GRAPH* graph, int tile1, int x1, int y1, int width1, int height1, int tile2, int x2, int y2, int width2, int height2); +extern Gfx* two_tex_scroll_dolphin(GRAPH* graph, int tile1, int x1, int y1, int width1, int height1, int tile2, int x2, int y2, int width2, int height2); +extern void DisplayList_initialize(GRAPH* graph, u32 clear_r, u32 clear_g, u32 clear_b, GAME* game); +extern void fade_rgba8888_draw(Gfx** gfxp, u32 color); +extern void fade_black_draw(Gfx** gfx, u32 color); extern Gfx* gfx_gDPFillRectangle1(Gfx* gfx, u32 ulx, u32 uly, u32 lrx, u32 lry); extern Gfx* gfx_gDPFillRectangleF(Gfx* gfx, u32 ulx, u32 uly, u32 lrx, u32 lry); -extern Gfx* gfx_tex_scroll2(Gfx** gfxpp, u32 x, u32 y, int width, int height); -extern void DisplayList_initialize(GRAPH* graph, u32 clear_r, u32 clear_g, u32 clear_b, GAME* game); -extern void fade_black_draw(Gfx** gfxpp, u32 alpha); -extern void rect_moji(GRAPH* graph); -extern void _texture_z_light_fog_prim(GRAPH* graph); +extern Gfx* gfx_gSPTextureRectangle1(Gfx* gfx, int xl, int yl, int xh, int yh, int tile, int s, int t, int dsdx, int dtdy); +extern Gfx* gfx_gSPScisTextureRectangle1(Gfx* gfx, int xl, int yl, int xh, int yh, int tile, int s, int t, int dsdx, int dtdy); + +extern Gfx RSP_RDP_clear_data[]; +extern int fbdemo_mode; #ifdef __cplusplus } diff --git a/rel/m_prenmi.c b/rel/m_prenmi.c index 9f785225..1023822b 100644 --- a/rel/m_prenmi.c +++ b/rel/m_prenmi.c @@ -41,7 +41,7 @@ static void prenmi_draw(GAME_PRENMI* prenmi) { // adjust size y_pos = (1.0f - (timer / (f32)PRENMI_TIMER)) * -15.0f + 127.0f; - gfx = gfx_gSPTextureRectangle1(gfx, 0, (y_pos * 4.0f), 0x500, ((y_pos + 1.0f) * 4.0f), 0, 0, 0, 0, 0); + gfx = gfx_gSPTextureRectangle1(gfx, 0, (u32)(y_pos * 4.0f), 0x500, (u32)((y_pos + 1.0f) * 4.0f), 0, 0, 0, 0, 0); gDPPipeSync(gfx++); SET_POLY_OPA_DISP(gfx); diff --git a/rel/m_rcp.c b/rel/m_rcp.c new file mode 100644 index 00000000..6e905fd2 --- /dev/null +++ b/rel/m_rcp.c @@ -0,0 +1,455 @@ +#include "m_rcp.h" + +#include "gfxalloc.h" + +#define G_CC_POLY_Z_LIGHT_PRIM PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIDECALA_PRIM2 PRIMITIVE, 0, COMBINED, 0, 0, 0, 0, COMBINED +#define G_CC_PRIMLERP 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIM_LOD_FRAC, 0 + +static Gfx z_gsCPModeSet_Data[15][6] = { + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_OFF), + gsDPSetCombineMode(G_CC_POLY_Z_LIGHT_PRIM, G_CC_POLY_Z_LIGHT_PRIM), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM), + gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_AA_TEX_EDGE | G_RM_AA_TEX_EDGE2), + gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_OFF), + gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE), + gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE, G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2), + gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_OFF), + gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE), + gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2), + gsSPLoadGeometryMode(G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2), + gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_PASS2), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_ZB_CLD_SURF2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA_PRIM2), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA_PRIM2), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA | ALPHA_CVG_SEL | G_RM_FOG_SHADE_A | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA_PRIM2), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA_PRIM2), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_CLD_SURF2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + }, + { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_ON), + gsDPSetCombineMode(G_CC_PRIMLERP, G_CC_PASS2), + gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_OVL_SURF2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_SHADING_SMOOTH), + gsSPEndDisplayList(), + } +}; + +Gfx RSP_RDP_clear_data[12] = { + gsDPPipeSync(), + gsSPTexture(65535, 65535, 0, 0, G_OFF), + gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE), + gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_FILL | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), + gsDPSetScissor(G_SC_NON_INTERLACE, 0, 0, 640, 480), + gsDPSetBlendColor(0x00, 0x00, 0x00, 0x08), + gsSPClipRatio(FRUSTRATIO_2), + gsSPEndDisplayList(), +}; + +int fbdemo_mode; + +extern void gfx_set_fog_position(Gfx** gfxp, int near, int far) { + Gfx* gfx; + + if (near == far) { + gfx = (*gfxp)++; + gSPFogPosition(gfx++, 0, 10000000); + return; + } + gfx = (*gfxp)++; + gSPFogPosition(gfx++, near, far); +} + +extern Gfx* gfx_set_fog_nosync(Gfx* gfx, int r, int g, int b, int a, int near, + int far) { + gDPSetFogColor(gfx++, r, g, b, a); + gfx_set_fog_position(&gfx, near, far); + + return gfx; +} + +extern void texture_z_light_prim_xlu_disp(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_POLY_XLU_DISP++, z_gsCPModeSet_Data[2]); + + CLOSE_DISP(graph); +} + +extern void _texture_z_light_fog_prim_bg(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_BG_OPA_DISP++, z_gsCPModeSet_Data[2]); + + CLOSE_DISP(graph); +} + +extern void _texture_z_light_fog_prim(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_POLY_OPA_DISP++, z_gsCPModeSet_Data[2]); + + CLOSE_DISP(graph); +} + +extern void _texture_z_light_fog_prim_shadow(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_SHADOW_DISP++, z_gsCPModeSet_Data[2]); + + CLOSE_DISP(graph); +} + +extern void _texture_z_light_fog_prim_xlu(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_POLY_XLU_DISP++, z_gsCPModeSet_Data[2]); + + CLOSE_DISP(graph); +} + +extern void _texture_z_light_fog_prim_light(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_LIGHT_DISP++, z_gsCPModeSet_Data[2]); + + CLOSE_DISP(graph); +} + +extern void _texture_z_light_fog_prim_npc(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_POLY_OPA_DISP++, z_gsCPModeSet_Data[10]); + gDPPipeSync(NOW_POLY_OPA_DISP++); + gDPSetPrimColor(NOW_POLY_OPA_DISP++, 0, 128, 255, 255, 255, 255); + + CLOSE_DISP(graph); +} + +extern Gfx* texture_z_light_fog_prim_bb_pal_opa(Gfx* gfx) { + gSPDisplayList(gfx++, z_gsCPModeSet_Data[12]); + gDPSetPrimColor(gfx++, 0, 128, 255, 255, 255, 255); + + return gfx; +} + +extern Gfx* texture_z_light_fog_prim_bb_pal_xlu(Gfx* gfx) { + gSPDisplayList(gfx++, z_gsCPModeSet_Data[13]); + gDPSetPrimColor(gfx++, 0, 128, 255, 255, 255, 255); + + return gfx; +} + +extern Gfx* texture_z_fog_lod_alpha_shadow(Gfx* gfx) { + gSPDisplayList(gfx++, z_gsCPModeSet_Data[14]); + + return gfx; +} + +extern Gfx* gfx_rect_moji(Gfx* gfx) { + gSPDisplayList(gfx++, z_gsCPModeSet_Data[4]); + + return gfx; +} + +extern void rect_moji(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_POLY_OPA_DISP++, z_gsCPModeSet_Data[4]); + + CLOSE_DISP(graph); +} + +extern void polygon_z_light_prim(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_POLY_XLU_DISP++, z_gsCPModeSet_Data[0]); + + CLOSE_DISP(graph); +} + +extern void softsprite_prim(GRAPH* graph) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_POLY_XLU_DISP++, z_gsCPModeSet_Data[6]); + + CLOSE_DISP(graph); +} + +extern Gfx* gfx_softsprite_prim_xlu(Gfx* gfx) { + gSPDisplayList(gfx++, z_gsCPModeSet_Data[8]); + gDPSetColorDither(gfx++, G_CD_DISABLE); + + return gfx++; +} + +extern Gfx* gfx_tex_scroll2(Gfx** gfxpp, int x, int y, int width, int height) { + Gfx* dl = gfxalloc(gfxpp, 3 * sizeof(Gfx)); + + gDPTileSync(dl); + gDPSetTileSize(dl + 1, G_TX_RENDERTILE, x, y, x + ((width - 1) << 2), + y + ((height - 1) << 2)); + gSPEndDisplayList(dl + 2); +} + +extern Gfx* tex_scroll2(GRAPH* graph, u32 x, u32 y, int width, int height) { + Gfx* dl = GRAPH_ALLOC_TYPE(graph, Gfx, 3); + if (dl != NULL) { + gDPTileSync(dl); + gDPSetTileSize(dl + 1, G_TX_RENDERTILE, x & 0x7FF, y & 0x7FF, + ((x & 0x7FF) + ((width - 1) << 2)), + ((y & 0x7FF) + ((height - 1) << 2))); + gSPEndDisplayList(dl + 2); + } + + return dl; +} + +extern Gfx* tex_scroll2_dolphin(GRAPH* graph, int x, int y, int width, int height) { + Gfx* dl = GRAPH_ALLOC_TYPE(graph, Gfx, 2); + + if (dl != NULL) { + gDPSetTileSize_Dolphin(dl, 0, x << 1, y << 1, width, height); + gSPEndDisplayList(dl + 1); + } + + return dl; +} + +extern Gfx* two_tex_scroll(GRAPH* graph, int tile1, int x1, int y1, int width1, + int height1, int tile2, int x2, int y2, int width2, + int height2) { + Gfx* dl = GRAPH_ALLOC_TYPE(graph, Gfx, 5); + + if (dl != NULL) { + gDPTileSync(dl); + gDPSetTileSize(dl + 1, tile1, x1 & 0x7FF, y1 & 0x7FF, + (x1 & 0x7FF) + ((width1 - 1) << 2), + (y1 & 0x7FF) + ((height1 - 1) << 2)); + gDPTileSync(dl + 2); + gDPSetTileSize(dl + 3, tile2, x2 & 0x7FF, y2 & 0x7FF, + (x2 & 0x7FF) + ((width2 - 1) << 2), + (y2 & 0x7FF) + ((height2 - 1) << 2)); + gSPEndDisplayList(dl + 4); + } + + return dl; +} + +extern Gfx* two_tex_scroll_dolphin(GRAPH* graph, int tile1, int x1, int y1, int width1, + int height1, int tile2, int x2, int y2, int width2, + int height2) { + Gfx* dl = GRAPH_ALLOC_TYPE(graph, Gfx, 3); + + if (dl != NULL) { + gDPSetTileSize_Dolphin(dl, tile1, x1 << 1, y1 << 1, width1, height1); + gDPSetTileSize_Dolphin(dl + 1, tile2, x2 << 1, y2 << 1, width2, height2); + gSPEndDisplayList(dl + 2); + } + + return dl; +} + +extern void DisplayList_initialize(GRAPH* graph, u32 clear_r, u32 clear_g, + u32 clear_b, GAME* game) { + OPEN_DISP(graph); + + gSPDisplayList(NOW_POLY_OPA_DISP++, RSP_RDP_clear_data); + gSPDisplayList(NOW_POLY_XLU_DISP++, RSP_RDP_clear_data); + gSPDisplayList(NOW_OVERLAY_DISP++, RSP_RDP_clear_data); + gSPDisplayList(NOW_FONT_DISP++, RSP_RDP_clear_data); + gSPDisplayList(NOW_BG_OPA_DISP++, RSP_RDP_clear_data); + gSPDisplayList(NOW_BG_XLU_DISP++, z_gsCPModeSet_Data[2]); + gSPDisplayList(NOW_SHADOW_DISP++, z_gsCPModeSet_Data[2]); + gSPDisplayList(NOW_LIGHT_DISP++, z_gsCPModeSet_Data[2]); + + gDPSetScissor(NOW_POLY_OPA_DISP++, G_SC_NON_INTERLACE, 0, 0, 640, 480); + gDPSetScissor(NOW_POLY_XLU_DISP++, G_SC_NON_INTERLACE, 0, 0, 640, 480); + gDPSetScissor(NOW_OVERLAY_DISP++, G_SC_NON_INTERLACE, 0, 0, 640, 480); + gDPSetScissor(NOW_FONT_DISP++, G_SC_NON_INTERLACE, 0, 0, 640, 480); + gDPSetScissor(NOW_SHADOW_DISP++, G_SC_NON_INTERLACE, 0, 0, 640, 480); + gDPSetScissor(NOW_LIGHT_DISP++, G_SC_NON_INTERLACE, 0, 0, 640, 480); + gDPSetScissor(NOW_BG_OPA_DISP++, G_SC_NON_INTERLACE, 0, 0, 640, 480); + gDPSetScissor(NOW_BG_XLU_DISP++, G_SC_NON_INTERLACE, 0, 0, 640, 480); + + if (((game == NULL) || (fbdemo_mode < 2)) && + (JW_setClearColor(clear_r, clear_g, clear_b))) { + gDPSetCycleType(NOW_POLY_OPA_DISP++, G_CYC_FILL); + gDPSetRenderMode(NOW_POLY_OPA_DISP++, G_RM_NOOP, G_RM_NOOP2); + gDPSetFillColor(NOW_POLY_OPA_DISP++, + (GPACK_RGBA5551(clear_r, clear_g, clear_b, 1) << 16) | + GPACK_RGBA5551(clear_r, clear_g, clear_b, 1)); + gDPFillRectangle(NOW_POLY_OPA_DISP++, 0, 0, 639, 479); + gDPPipeSync(NOW_POLY_OPA_DISP++); + } + + CLOSE_DISP(graph); + + mFont_Main_start(graph); +} + +extern void fade_rgba8888_draw(Gfx** gfxp, u32 color) { + static Gfx fade_gfx[6] = { + gsDPPipeSync(), + gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | + G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | + G_TP_NONE | G_CYC_1CYCLE | G_PM_1PRIMITIVE, + G_AC_NONE | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2), + gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE), + gsDPFillRectangle(0, 0, 640, 480), + gsDPPipeSync(), + gsSPEndDisplayList(), + }; + + static Gfx fill_gfx[5] = { + gsDPPipeSync(), + gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | + G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | + G_TP_NONE | G_CYC_FILL | G_PM_1PRIMITIVE, + G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2), + gsDPFillRectangle(0, 0, 639, 479), + gsDPPipeSync(), + gsSPEndDisplayList(), + }; + + Gfx* gfx; + + if ((color & 0xFF) == 255) { + u32 r = ((color >> 16) & 0xF800); + u32 g = ((color >> 13) & 0x7FFC0); + u32 b = (color >> 10) & 0x7FFFFF; + u32 c = ((r | g | b | 1)); + u32 f = c | ((c & 0xFFFF) << 16); + + gfx = *gfxp; + gDPSetFillColor(gfx, f); + gSPDisplayList(gfx + 1, fill_gfx); + *gfxp = gfx + 2; + } else if ((color & 0xFF) != 0) { + gfx = *gfxp; + gDPSetColor(gfx, G_SETPRIMCOLOR, color); + gSPDisplayList(gfx + 1, fade_gfx); + *gfxp = gfx + 2; + } +} + +extern void fade_black_draw(Gfx** gfx, u32 color) { fade_rgba8888_draw(gfx, color); } + +extern Gfx* gfx_gDPFillRectangle1(Gfx* gfx, u32 ulx, u32 uly, u32 lrx, u32 lry) { + gDPFillRectangle(gfx++, ulx << 1, uly << 1, lrx << 1, lry << 1); + return gfx; +} + +extern Gfx* gfx_gDPFillRectangleF(Gfx* gfx, u32 ulx, u32 uly, u32 lrx, u32 lry) { + gDPFillRectangle(gfx++, ulx << 1, uly << 1, (lrx << 1) - 1, (lry << 1) - 1); + return gfx; +} + +extern Gfx* gfx_gSPTextureRectangle1(Gfx* gfx, int xl, int yl, int xh, int yh, + int tile, int s, int t, int dsdx, int dtdy) { + gSPTextureRectangle(gfx++, xl << 1, yl << 1, xh << 1, yh << 1, tile, s, t, + dsdx >> 1, dtdy >> 1); + return gfx; +} + +extern Gfx* gfx_gSPScisTextureRectangle1(Gfx* gfx, int xl, int yl, int xh, int yh, + int tile, int s, int t, int dsdx, int dtdy) { + gSPScisTextureRectangle(gfx++, (s16)(xl << 1), (s16)(yl << 1), xh << 1, + yh << 1, tile, s, t, dsdx >> 1, dtdy >> 1); + return gfx; +}