From 9d1329f245ee24813596ce71dbfc2b355543bbfe Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 14 Sep 2021 21:43:55 +0100 Subject: [PATCH 1/6] F3DLX2.Rej integration The master displaylist has been split into two, one for things to render in F3DZEX, and one that renders in F3DLX2.Rej, with the aim to save performance when rendering smaller things. --- data/behavior_data.c | 26 +++++---- include/object_constants.h | 1 + include/types.h | 1 + lib/rsp.s | 6 ++ src/engine/behavior_script.c | 11 ++-- src/engine/graph_node.h | 7 ++- src/engine/level_script.c | 2 +- src/game/crash_screen.c | 3 +- src/game/game_init.c | 15 ++--- src/game/game_init.h | 2 +- src/game/rendering_graph_node.c | 100 +++++++++++++++++++++++--------- src/game/spawn_object.c | 1 + 12 files changed, 118 insertions(+), 57 deletions(-) diff --git a/data/behavior_data.c b/data/behavior_data.c index 6ea15514..17352732 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -242,6 +242,8 @@ #define BEGIN_REPEAT_UNUSED(count) \ BC_BB(0x26, count) +#define OR_LONG(field, value) LOAD_ANIMATIONS(field, value) + // Loads the animations for the object. is always set to oAnimations. #define LOAD_ANIMATIONS(field, anims) \ BC_BB(0x27, field), \ @@ -2657,7 +2659,7 @@ const BehaviorScript bhvBowserSubDoor[] = { const BehaviorScript bhvBowsersSub[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), LOAD_COLLISION_DATA(ddd_seg7_collision_submarine), @@ -2705,7 +2707,7 @@ const BehaviorScript bhvJrbSlidingBox[] = { const BehaviorScript bhvShipPart3[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), SET_HOME(), BEGIN_LOOP(), CALL_NATIVE(bhv_ship_part_3_loop), @@ -2714,7 +2716,7 @@ const BehaviorScript bhvShipPart3[] = { const BehaviorScript bhvInSunkenShip3[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_3), SET_HOME(), SET_FLOAT(oCollisionDistance, 4000), @@ -2726,7 +2728,7 @@ const BehaviorScript bhvInSunkenShip3[] = { const BehaviorScript bhvSunkenShipPart[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, (OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SCALE(/*Unused*/ 0, /*Field*/ 50), SET_HOME(), BEGIN_LOOP(), @@ -2743,7 +2745,7 @@ const BehaviorScript bhvSunkenShipSetRotation[] = { const BehaviorScript bhvSunkenShipPart2[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SCALE(/*Unused*/ 0, /*Field*/ 100), SET_FLOAT(oDrawingDistance, 6000), SET_HOME(), @@ -2761,7 +2763,7 @@ const BehaviorScript bhvInSunkenShip2[] = { BEGIN(OBJ_LIST_SURFACE), LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_2), // Sunken ship - common: - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), SET_FLOAT(oCollisionDistance, 4000), CALL(bhvSunkenShipSetRotation), BEGIN_LOOP(), @@ -3152,7 +3154,7 @@ UNUSED static const BehaviorScript unused_1[] = { const BehaviorScript bhvStaticObject[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), BREAK(), }; @@ -3611,7 +3613,7 @@ const BehaviorScript bhvRandomAnimatedTexture[] = { const BehaviorScript bhvYellowBackgroundInMenu[] = { BEGIN(OBJ_LIST_LEVEL), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), CALL_NATIVE(beh_yellow_background_menu_init), BEGIN_LOOP(), SET_INT(oIntangibleTimer, 0), @@ -3631,7 +3633,7 @@ const BehaviorScript bhvMenuButton[] = { const BehaviorScript bhvMenuButtonManager[] = { BEGIN(OBJ_LIST_LEVEL), - OR_INT(oFlags, (OBJ_FLAG_SET_THROW_MATRIX_FROM_TRANSFORM | OBJ_FLAG_UPDATE_TRANSFORM_FOR_THROW_MATRIX | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_SET_THROW_MATRIX_FROM_TRANSFORM | OBJ_FLAG_UPDATE_TRANSFORM_FOR_THROW_MATRIX | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), CALL_NATIVE(bhv_menu_button_manager_init), BEGIN_LOOP(), SET_INT(oIntangibleTimer, 0), @@ -5461,7 +5463,7 @@ const BehaviorScript bhvTTCRotatingSolid[] = { const BehaviorScript bhvTTCPendulum[] = { BEGIN(OBJ_LIST_SURFACE), LOAD_COLLISION_DATA(ttc_seg7_collision_clock_pendulum), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_FLOAT(oCollisionDistance, 1500), CALL_NATIVE(bhv_ttc_pendulum_init), SET_FLOAT(oTTCPendulumAccelDir, 1), @@ -5474,9 +5476,9 @@ const BehaviorScript bhvTTCPendulum[] = { const BehaviorScript bhvTTCTreadmill[] = { BEGIN(OBJ_LIST_SURFACE), #ifdef PLATFORM_DISPLACEMENT_2 - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_VELOCITY_PLATFORM)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_VELOCITY_PLATFORM | OBJ_FLAG_UCODE_LARGE)), #else - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), #endif SET_FLOAT(oCollisionDistance, 750), CALL_NATIVE(bhv_ttc_treadmill_init), diff --git a/include/object_constants.h b/include/object_constants.h index ac73b2d5..6ddfe4bf 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -46,6 +46,7 @@ #define OBJ_FLAG_VELOCITY_PLATFORM (1 << 15) // 0x00008000 #define OBJ_FLAG_DONT_CALC_COLL_DIST (1 << 16) // 0x00010000 #define OBJ_FLAG_EMIT_LIGHT (1 << 17) // 0x00020000 +#define OBJ_FLAG_UCODE_LARGE (1 << 18) // 0x00040000 #define OBJ_FLAG_HITBOX_WAS_SET (1 << 30) // 0x40000000 /* oHeldState */ diff --git a/include/types.h b/include/types.h index 15ff15b7..b1219968 100644 --- a/include/types.h +++ b/include/types.h @@ -146,6 +146,7 @@ struct GraphNodeObject /*0x4C*/ struct SpawnInfo *unk4C; /*0x50*/ Mat4 *throwMatrix; // matrix ptr /*0x54*/ Vec3f cameraToObject; + u8 uCode; }; struct ObjectNode diff --git a/lib/rsp.s b/lib/rsp.s index 4c82b25a..11fadafa 100644 --- a/lib/rsp.s +++ b/lib/rsp.s @@ -40,6 +40,9 @@ glabel gspFast3D_fifoTextEnd glabel gspF3DZEX2_PosLight_fifoTextStart .incbin "lib/PR/f3dzex/F3DZEX.bin" glabel gspF3DZEX2_PosLight_fifoTextEnd + glabel gspF3DLX2_Rej_fifoTextStart + .incbin "lib/PR/f3dex2/F3DLX2_Rej.bin" + glabel gspF3DLX2_Rej_fifoTextEnd #endif #endif @@ -196,6 +199,9 @@ glabel gspFast3D_fifoDataEnd glabel gspF3DZEX2_PosLight_fifoDataStart .incbin "lib/PR/f3dzex/F3DZEX_data.bin" glabel gspF3DZEX2_PosLight_fifoDataEnd + glabel gspF3DLX2_Rej_fifoDataStart + .incbin "lib/PR/f3dex2/F3DLX2_Rej_data.bin" + glabel gspF3DLX2_Rej_fifoDataEnd #endif #endif diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index 001da0ba..48c37cb2 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -907,7 +907,7 @@ static BhvCommandProc BehaviorCmdTable[] = { void cur_obj_update(void) { UNUSED u32 unused; - s16 objFlags = gCurrentObject->oFlags; + u32 objFlags = gCurrentObject->oFlags; f32 distanceFromMario; BhvCommandProc bhvCmdProc; s32 bhvProcResult; @@ -952,9 +952,6 @@ void cur_obj_update(void) { gCurrentObject->oPrevAction = gCurrentObject->oAction); } - // Execute various code based on object flags. - objFlags = (s16) gCurrentObject->oFlags; - if (objFlags & OBJ_FLAG_SET_FACE_ANGLE_TO_MOVE_ANGLE) { obj_set_face_angle_to_move_angle(gCurrentObject); } @@ -983,6 +980,12 @@ void cur_obj_update(void) { obj_update_gfx_pos_and_angle(gCurrentObject); } + + if (objFlags & OBJ_FLAG_UCODE_LARGE) + gCurrentObject->header.gfx.uCode = UCODE_DEFAULT; + else + gCurrentObject->header.gfx.uCode = UCODE_REJ; + #ifdef PUPPYLIGHTS puppylights_object_emit(gCurrentObject); #endif diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index 89276f59..36b21220 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -7,6 +7,9 @@ #include "types.h" #include "game/memory.h" +#define UCODE_DEFAULT 0 +#define UCODE_REJ 1 + #define GRAPH_RENDER_ACTIVE (1 << 0) #define GRAPH_RENDER_CHILDREN_FIRST (1 << 1) #define GRAPH_RENDER_BILLBOARD (1 << 2) @@ -126,8 +129,8 @@ struct DisplayListNode struct GraphNodeMasterList { /*0x00*/ struct GraphNode node; - /*0x14*/ struct DisplayListNode *listHeads[GFX_NUM_MASTER_LISTS]; - /*0x34*/ struct DisplayListNode *listTails[GFX_NUM_MASTER_LISTS]; + /*0x14*/ struct DisplayListNode *listHeads[2][GFX_NUM_MASTER_LISTS]; + /*0x34*/ struct DisplayListNode *listTails[2][GFX_NUM_MASTER_LISTS]; }; /** Simply used as a parent to group multiple children. diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 239e79f5..8cf8300c 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -963,7 +963,7 @@ struct LevelCommand *level_script_execute(struct LevelCommand *cmd) { } profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE); - init_rcp(); + init_rcp(1); render_game(); end_master_display_list(); alloc_display_list(0); diff --git a/src/game/crash_screen.c b/src/game/crash_screen.c index ac7a284f..d2b274b8 100644 --- a/src/game/crash_screen.c +++ b/src/game/crash_screen.c @@ -111,9 +111,8 @@ void crash_screen_print(s32 x, s32 y, const char *fmt, ...) { u32 glyph; s32 size; char buf[0x108]; - UNUSED s32 i = 0; - memset(buf, 0, sizeof(buf)); + bzero(&buf ,sizeof(buf)); va_list args; va_start(args, fmt); diff --git a/src/game/game_init.c b/src/game/game_init.c index e98fc46c..8997558d 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -125,9 +125,7 @@ void init_rdp(void) { gDPSetColorDither(gDisplayListHead++, G_CD_MAGICSQ); gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); -#ifdef VERSION_SH gDPSetAlphaDither(gDisplayListHead++, G_AD_PATTERN); -#endif gDPPipeSync(gDisplayListHead++); } @@ -135,6 +133,7 @@ void init_rdp(void) { * Sets the initial RSP (Reality Signal Processor) settings. */ void init_rsp(void) { + gSPClearGeometryMode(gDisplayListHead++, G_SHADE | G_SHADING_SMOOTH | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD); @@ -153,13 +152,15 @@ void init_rsp(void) { /** * Initialize the z buffer for the current frame. */ -void init_z_buffer(void) { +void init_z_buffer(s32 resetZB) { gDPPipeSync(gDisplayListHead++); gDPSetDepthSource(gDisplayListHead++, G_ZS_PIXEL); gDPSetDepthImage(gDisplayListHead++, gPhysicalZBuffer); gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gPhysicalZBuffer); + if (!resetZB) + return; gDPSetFillColor(gDisplayListHead++, GPACK_ZDZ(G_MAXFBZ, 0) << 16 | GPACK_ZDZ(G_MAXFBZ, 0)); @@ -273,7 +274,7 @@ void create_gfx_task_structure(void) { gGfxSPTask->task.t.type = M_GFXTASK; gGfxSPTask->task.t.ucode_boot = rspbootTextStart; gGfxSPTask->task.t.ucode_boot_size = ((u8 *) rspbootTextEnd - (u8 *) rspbootTextStart); - gGfxSPTask->task.t.flags = 0; + gGfxSPTask->task.t.flags = OS_TASK_LOADABLE | OS_TASK_DP_WAIT; #ifdef L3DEX2_ALONE gGfxSPTask->task.t.ucode = gspL3DEX2_fifoTextStart; gGfxSPTask->task.t.ucode_data = gspL3DEX2_fifoDataStart; @@ -312,11 +313,11 @@ void create_gfx_task_structure(void) { /** * Set default RCP (Reality Co-Processor) settings. */ -void init_rcp(void) { +void init_rcp(s32 resetZB) { move_segment_table_to_dmem(); init_rdp(); init_rsp(); - init_z_buffer(); + init_z_buffer(resetZB); select_frame_buffer(); } @@ -381,7 +382,7 @@ void render_init(void) { gGfxSPTask = &gGfxPool->spTask; gDisplayListHead = gGfxPool->buffer; gGfxPoolEnd = (u8 *)(gGfxPool->buffer + GFX_POOL_SIZE); - init_rcp(); + init_rcp(1); clear_frame_buffer(0); end_master_display_list(); exec_display_list(&gGfxPool->spTask); diff --git a/src/game/game_init.h b/src/game/game_init.h index a61e2d60..2a58e917 100644 --- a/src/game/game_init.h +++ b/src/game/game_init.h @@ -79,7 +79,7 @@ void thread5_game_loop(UNUSED void *arg); void clear_frame_buffer(s32 color); void clear_viewport(Vp *viewport, s32 color); void make_viewport_clip_rect(Vp *viewport); -void init_rcp(void); +void init_rcp(s32 resetZB); void end_master_display_list(void); void render_init(void); void select_gfx_pool(void); diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 7d992f1f..e847ebad 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -142,7 +142,7 @@ LookAt lookAt; */ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { struct DisplayListNode *currList; - s32 i; + s32 i, j; s32 enableZBuffer = (node->node.flags & GRAPH_RENDER_Z_BUFFER) != 0; struct RenderModeContainer *modeList = &renderModeTable_1Cycle[enableZBuffer]; struct RenderModeContainer *mode2List = &renderModeTable_2Cycle[enableZBuffer]; @@ -155,26 +155,56 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); #endif - if (enableZBuffer != 0) { + + if (enableZBuffer != 0) + { gDPPipeSync(gDisplayListHead++); gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); } - - for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) { - if ((currList = node->listHeads[i]) != NULL) { - gDPSetRenderMode(gDisplayListHead++, modeList->modes[i], mode2List->modes[i]); - while (currList != NULL) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(currList->transform), - G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); - gSPDisplayList(gDisplayListHead++, currList->displayList); - currList = currList->next; +#ifdef F3DZEX_GBI_2 + for (j = 0; j < 2; j++) + { + //Load rejection on pass 2. ZEX is loaded afterwards. + if (j == 1) + { + gSPLoadUcodeL(gDisplayListHead++, gspF3DLX2_Rej_fifo); + init_rcp(0); + gSPClipRatio(gDisplayListHead++, FRUSTRATIO_2); + if (enableZBuffer != 0) + { + gDPPipeSync(gDisplayListHead++); + gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); + } + guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); + } +#else +j = 0; +#endif + for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) + { + if ((currList = node->listHeads[j][i]) != NULL) + { + gDPSetRenderMode(gDisplayListHead++, modeList->modes[i], mode2List->modes[i]); + while (currList != NULL) + { + gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(currList->transform), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); + gSPDisplayList(gDisplayListHead++, currList->displayList); + currList = currList->next; + } } } +#ifdef F3DZEX_GBI_2 } - if (enableZBuffer != 0) { +#endif + if (enableZBuffer != 0) + { gDPPipeSync(gDisplayListHead++); gSPClearGeometryMode(gDisplayListHead++, G_ZBUFFER); } +#ifdef F3DZEX_GBI_2 + gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); + init_rcp(0); +#endif } /** @@ -182,24 +212,35 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { * parameter. Look at the RenderModeContainer struct to see the corresponding * render modes of layers. */ -static void geo_append_display_list(void *displayList, s16 layer) { - +static void geo_append_display_list(void *displayList, s32 layer) +{ + s32 index = 0; #ifdef F3DEX_GBI_2 gSPLookAt(gDisplayListHead++, &lookAt); #endif - if (gCurGraphNodeMasterList != 0) { - struct DisplayListNode *listNode = - alloc_only_pool_alloc(gDisplayListHeap, sizeof(struct DisplayListNode)); +#ifdef F3DZEX_GBI_2 + if (gCurGraphNodeObject != NULL) + { + if (gCurGraphNodeObject->uCode == UCODE_REJ) + index = 1; + } +#endif + if (gCurGraphNodeMasterList != 0) + { + struct DisplayListNode *listNode = alloc_only_pool_alloc(gDisplayListHeap, sizeof(struct DisplayListNode)); listNode->transform = gMatStackFixed[gMatStackIndex]; listNode->displayList = displayList; listNode->next = 0; - if (gCurGraphNodeMasterList->listHeads[layer] == 0) { - gCurGraphNodeMasterList->listHeads[layer] = listNode; - } else { - gCurGraphNodeMasterList->listTails[layer]->next = listNode; + if (gCurGraphNodeMasterList->listHeads[index][layer] == 0) + { + gCurGraphNodeMasterList->listHeads[index][layer] = listNode; } - gCurGraphNodeMasterList->listTails[layer] = listNode; + else + { + gCurGraphNodeMasterList->listTails[index][layer]->next = listNode; + } + gCurGraphNodeMasterList->listTails[index][layer] = listNode; } } @@ -209,13 +250,16 @@ static void geo_append_display_list(void *displayList, s16 layer) { static void geo_process_master_list(struct GraphNodeMasterList *node) { s32 i; - if (gCurGraphNodeMasterList == NULL && node->node.children != NULL) { + if (gCurGraphNodeMasterList == NULL && node->node.children != NULL) + { gCurGraphNodeMasterList = node; - for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) { - node->listHeads[i] = NULL; + for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) + { + node->listHeads[0][i] = NULL; + node->listHeads[1][i] = NULL; } geo_process_node_and_siblings(node->node.children); - geo_process_master_list_sub(node); + geo_process_master_list_sub(gCurGraphNodeMasterList); gCurGraphNodeMasterList = NULL; } } @@ -768,8 +812,8 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { * Since (0,0,0) is unaffected by rotation, columns 0, 1 and 2 are ignored. */ static s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { - s16 cullingRadius; - s16 halfFov; // half of the fov in in-game angle units instead of degrees + s32 cullingRadius; + s32 halfFov; // half of the fov in in-game angle units instead of degrees struct GraphNode *geo; f32 hScreenEdge; diff --git a/src/game/spawn_object.c b/src/game/spawn_object.c index eb42bd04..f0064eec 100644 --- a/src/game/spawn_object.c +++ b/src/game/spawn_object.c @@ -286,6 +286,7 @@ struct Object *allocate_object(struct ObjectNode *objList) { obj->header.gfx.pos[1] = -10000.0f; obj->header.gfx.pos[2] = -10000.0f; obj->header.gfx.throwMatrix = NULL; + obj->header.gfx.uCode = UCODE_REJ; #ifdef PUPPYLIGHTS obj->oLightID = 0xFFFF; #endif From 2a4dec18909fbdabc161c66be85ebc9a413c7de3 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 14 Sep 2021 22:32:21 +0100 Subject: [PATCH 2/6] Fixed render order --- src/game/rendering_graph_node.c | 70 ++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index e847ebad..d74c1da1 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -138,11 +138,17 @@ LookAt lookAt; #endif /** - * Process a master list node. + * Process a master list node. This has been modified, so now it runs twice, for each microcode. + It iterates through the first 5 layers of if the first index using F3DZEX, then it switches + to F3DLX2.Rej and iterates through all layers, then switches back to F3DZEX and finishes the last + 3. It does this, because layers 5-7 are non zbuffered, and just doing 0-7 of ZEX, then 0-7 of REJ + would make the rej 0-4 render on top of ZEX's 5-7. */ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { struct DisplayListNode *currList; - s32 i, j; + s32 i = 0; + s32 j = 0; + s32 renderPhase = 0; s32 enableZBuffer = (node->node.flags & GRAPH_RENDER_Z_BUFFER) != 0; struct RenderModeContainer *modeList = &renderModeTable_1Cycle[enableZBuffer]; struct RenderModeContainer *mode2List = &renderModeTable_2Cycle[enableZBuffer]; @@ -155,45 +161,59 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); #endif - if (enableZBuffer != 0) { gDPPipeSync(gDisplayListHead++); gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); } #ifdef F3DZEX_GBI_2 - for (j = 0; j < 2; j++) + loopBegin: + //Load rejection on pass 2. ZEX is loaded afterwards. + if (renderPhase > 0) { - //Load rejection on pass 2. ZEX is loaded afterwards. if (j == 1) { gSPLoadUcodeL(gDisplayListHead++, gspF3DLX2_Rej_fifo); init_rcp(0); gSPClipRatio(gDisplayListHead++, FRUSTRATIO_2); - if (enableZBuffer != 0) - { - gDPPipeSync(gDisplayListHead++); - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); - } - guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); } -#else -j = 0; -#endif - for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) + else { - if ((currList = node->listHeads[j][i]) != NULL) + gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); + init_rcp(0); + gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); + } + if (enableZBuffer != 0) + { + gDPPipeSync(gDisplayListHead++); + gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); + } + guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); + } +#endif + for (; i < GFX_NUM_MASTER_LISTS; i++) + { +#ifdef F3DZEX_GBI_2 + if (i == 5 && (renderPhase == 0 || renderPhase == 2)) + break; +#endif + if ((currList = node->listHeads[j][i]) != NULL) + { + gDPSetRenderMode(gDisplayListHead++, modeList->modes[i], mode2List->modes[i]); + while (currList != NULL) { - gDPSetRenderMode(gDisplayListHead++, modeList->modes[i], mode2List->modes[i]); - while (currList != NULL) - { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(currList->transform), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); - gSPDisplayList(gDisplayListHead++, currList->displayList); - currList = currList->next; - } + gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(currList->transform), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); + gSPDisplayList(gDisplayListHead++, currList->displayList); + currList = currList->next; } } + } #ifdef F3DZEX_GBI_2 + switch (renderPhase) + { + case 0: renderPhase++; j = 1; i = 0; goto loopBegin; + case 1: renderPhase++; i = 5; goto loopBegin; + case 2: renderPhase++; j = 0; i = 5; goto loopBegin; } #endif if (enableZBuffer != 0) @@ -201,10 +221,6 @@ j = 0; gDPPipeSync(gDisplayListHead++); gSPClearGeometryMode(gDisplayListHead++, G_ZBUFFER); } -#ifdef F3DZEX_GBI_2 - gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); - init_rcp(0); -#endif } /** From 35c5adafbed4d824c3b062d85d9603e0acc96a03 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 14 Sep 2021 22:41:47 +0100 Subject: [PATCH 3/6] Fix layering a bit more. --- src/game/rendering_graph_node.c | 68 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index d74c1da1..8305f70b 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -139,28 +139,20 @@ LookAt lookAt; /** * Process a master list node. This has been modified, so now it runs twice, for each microcode. - It iterates through the first 5 layers of if the first index using F3DZEX, then it switches - to F3DLX2.Rej and iterates through all layers, then switches back to F3DZEX and finishes the last + It iterates through the first 5 layers of if the first index using F3DLX2.Rej, then it switches + to F3DZEX and iterates through all layers, then switches back to F3DLX2.Rej and finishes the last 3. It does this, because layers 5-7 are non zbuffered, and just doing 0-7 of ZEX, then 0-7 of REJ - would make the rej 0-4 render on top of ZEX's 5-7. + would make the ZEX 0-4 render on top of Rej's 5-7. */ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { struct DisplayListNode *currList; s32 i = 0; - s32 j = 0; + s32 j = 1; s32 renderPhase = 0; s32 enableZBuffer = (node->node.flags & GRAPH_RENDER_Z_BUFFER) != 0; struct RenderModeContainer *modeList = &renderModeTable_1Cycle[enableZBuffer]; struct RenderModeContainer *mode2List = &renderModeTable_2Cycle[enableZBuffer]; - // @bug This is where the LookAt values should be calculated but aren't. - // As a result, environment mapping is broken on Fast3DEX2 without the - // changes below. -#ifdef F3DEX_GBI_2 - Mtx lMtx; - guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); -#endif - if (enableZBuffer != 0) { gDPPipeSync(gDisplayListHead++); @@ -169,32 +161,36 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { #ifdef F3DZEX_GBI_2 loopBegin: //Load rejection on pass 2. ZEX is loaded afterwards. - if (renderPhase > 0) + if (renderPhase == 2) { - if (j == 1) - { - gSPLoadUcodeL(gDisplayListHead++, gspF3DLX2_Rej_fifo); - init_rcp(0); - gSPClipRatio(gDisplayListHead++, FRUSTRATIO_2); - } - else - { - gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); - init_rcp(0); - gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); - } - if (enableZBuffer != 0) - { - gDPPipeSync(gDisplayListHead++); - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); - } - guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); + gSPLoadUcodeL(gDisplayListHead++, gspF3DLX2_Rej_fifo); + init_rcp(0); + gSPClipRatio(gDisplayListHead++, FRUSTRATIO_2); } + else + if (renderPhase == 1) + { + gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); + init_rcp(0); + gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); + } + if (enableZBuffer != 0) + { + gDPPipeSync(gDisplayListHead++); + gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); + } +#endif + // @bug This is where the LookAt values should be calculated but aren't. + // As a result, environment mapping is broken on Fast3DEX2 without the + // changes below. +#ifdef F3DEX_GBI_2 + Mtx lMtx; + guLookAtReflect(&lMtx, &lookAt, 0, 0, 0, /* eye */ 0, 0, 1, /* at */ 1, 0, 0 /* up */); #endif for (; i < GFX_NUM_MASTER_LISTS; i++) { #ifdef F3DZEX_GBI_2 - if (i == 5 && (renderPhase == 0 || renderPhase == 2)) + if (i == 5 && renderPhase == 0) break; #endif if ((currList = node->listHeads[j][i]) != NULL) @@ -211,10 +207,12 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { #ifdef F3DZEX_GBI_2 switch (renderPhase) { - case 0: renderPhase++; j = 1; i = 0; goto loopBegin; - case 1: renderPhase++; i = 5; goto loopBegin; - case 2: renderPhase++; j = 0; i = 5; goto loopBegin; + case 0: renderPhase++; j = 0; i = 0; goto loopBegin; + case 1: renderPhase++; j = 1; i = 5; goto loopBegin; } + gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); + init_rcp(0); + gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); #endif if (enableZBuffer != 0) { From a40cf7f7ef7d0d4efbd005968f5daa7dd2d185bc Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Wed, 15 Sep 2021 15:05:44 +0100 Subject: [PATCH 4/6] Small order fix --- data/behavior_data.c | 22 +++++++++++----------- src/game/rendering_graph_node.c | 9 +++++++-- src/goddard/renderer.c | 32 ++++++++++++++++---------------- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/data/behavior_data.c b/data/behavior_data.c index 17352732..4f8f5a05 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -2003,7 +2003,7 @@ const BehaviorScript bhvBowserFlameSpawn[] = { const BehaviorScript bhvTiltingBowserLavaPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(bowser_2_seg7_collision_tilting_platform), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), @@ -2017,7 +2017,7 @@ const BehaviorScript bhvTiltingBowserLavaPlatform[] = { const BehaviorScript bhvFallingBowserPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), SET_HOME(), @@ -2190,7 +2190,7 @@ const BehaviorScript bhvWaterLevelPillar[] = { const BehaviorScript bhvDddWarp[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), SET_FLOAT(oCollisionDistance, 30000), BEGIN_LOOP(), CALL_NATIVE(bhv_ddd_warp_loop), @@ -4246,7 +4246,7 @@ const BehaviorScript bhvLllDrawbridge[] = { const BehaviorScript bhvSmallBomp[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wf_seg7_collision_small_bomp), CALL_NATIVE(bhv_small_bomp_init), BEGIN_LOOP(), @@ -4257,7 +4257,7 @@ const BehaviorScript bhvSmallBomp[] = { const BehaviorScript bhvLargeBomp[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wf_seg7_collision_large_bomp), CALL_NATIVE(bhv_large_bomp_init), BEGIN_LOOP(), @@ -4367,7 +4367,7 @@ const BehaviorScript bhvThiBowlingBallSpawner[] = { const BehaviorScript bhvRrCruiserWing[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), CALL_NATIVE(bhv_rr_cruiser_wing_init), BEGIN_LOOP(), CALL_NATIVE(bhv_rr_cruiser_wing_loop), @@ -4398,7 +4398,7 @@ const BehaviorScript bhvSslMovingPyramidWall[] = { const BehaviorScript bhvPyramidElevator[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_elevator), SET_HOME(), SET_FLOAT(oCollisionDistance, 20000), @@ -4420,7 +4420,7 @@ const BehaviorScript bhvPyramidElevatorTrajectoryMarkerBall[] = { const BehaviorScript bhvPyramidTop[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_top), SET_HOME(), SET_FLOAT(oCollisionDistance, 20000), @@ -5392,7 +5392,7 @@ const BehaviorScript bhvTrackBall[] = { const BehaviorScript bhvSeesawPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), CALL_NATIVE(bhv_seesaw_platform_init), BEGIN_LOOP(), CALL_NATIVE(bhv_seesaw_platform_update), @@ -5431,7 +5431,7 @@ const BehaviorScript bhvWaterBombSpawner[] = { const BehaviorScript bhvWaterBomb[] = { BEGIN(OBJ_LIST_GENACTOR), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 120, /*Gravity*/ -400, /*Bounciness*/ 0, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 200, /*Unused*/ 0, 0), BEGIN_LOOP(), CALL_NATIVE(bhv_water_bomb_update), @@ -5626,7 +5626,7 @@ const BehaviorScript bhvAnimatesOnFloorSwitchPress[] = { const BehaviorScript bhvActivatedBackAndForthPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_HOME(), CALL_NATIVE(bhv_activated_back_and_forth_platform_init), BEGIN_LOOP(), diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 8305f70b..aa7c72ca 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -137,6 +137,8 @@ u16 gAreaUpdateCounter = 0; LookAt lookAt; #endif +u8 ucodeTestSwitch = 1; + /** * Process a master list node. This has been modified, so now it runs twice, for each microcode. It iterates through the first 5 layers of if the first index using F3DLX2.Rej, then it switches @@ -158,10 +160,13 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { gDPPipeSync(gDisplayListHead++); gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); } + //if (gPlayer1Controller->buttonPressed & L_TRIG) + // ucodeTestSwitch ^= 1; + //print_text_fmt_int(32,32,"%d",ucodeTestSwitch); #ifdef F3DZEX_GBI_2 loopBegin: //Load rejection on pass 2. ZEX is loaded afterwards. - if (renderPhase == 2) + if (renderPhase == 0 || renderPhase == 2) { gSPLoadUcodeL(gDisplayListHead++, gspF3DLX2_Rej_fifo); init_rcp(0); @@ -235,7 +240,7 @@ static void geo_append_display_list(void *displayList, s32 layer) #ifdef F3DZEX_GBI_2 if (gCurGraphNodeObject != NULL) { - if (gCurGraphNodeObject->uCode == UCODE_REJ) + if (gCurGraphNodeObject->uCode == UCODE_REJ && ucodeTestSwitch) index = 1; } #endif diff --git a/src/goddard/renderer.c b/src/goddard/renderer.c index 6e8dd3a8..34c9a064 100644 --- a/src/goddard/renderer.c +++ b/src/goddard/renderer.c @@ -510,11 +510,11 @@ static Gfx gd_dl_sparkle[] = { gsSPClearGeometryMode(G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR), gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_NOOP2), gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON), - gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, + gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), - gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, G_TX_RENDERTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, + gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, G_TX_RENDERTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPSetTileSize(0, 0, 0, (32 - 1) << G_TEXTURE_IMAGE_FRAC, (32 - 1) << G_TEXTURE_IMAGE_FRAC), gsSPVertex(gd_vertex_sparkle, 4, 0), @@ -663,7 +663,7 @@ static Gfx gd_dl_mario_face_shine[] = { gsDPSetTexturePersp(G_TP_PERSP), gsDPSetTextureFilter(G_TF_BILERP), gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA), - gsDPLoadTextureBlock(gd_texture_mario_face_shine, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, + gsDPLoadTextureBlock(gd_texture_mario_face_shine, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 5, 5, G_TX_NOLOD, G_TX_NOLOD), gsDPPipeSync(), gsSPEndDisplayList(), @@ -1192,7 +1192,7 @@ void print_gdm_stats(void) { /* 24AC80 -> 24AD14; orig name: func_8019C4B0 */ struct ObjView *make_view_withgrp(char *name, struct ObjGroup *grp) { - struct ObjView *view = make_view(name, (VIEW_DRAW | VIEW_ALLOC_ZBUF | VIEW_MOVEMENT), 1, 0, 0, 320, 240, grp); + struct ObjView *view = make_view(name, (VIEW_DRAW | VIEW_ALLOC_ZBUF | VIEW_MOVEMENT), 1, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, grp); UNUSED struct ObjGroup *viewgrp = make_group(2, grp, view); view->lights = gGdLightGroup; @@ -1270,7 +1270,7 @@ void gd_vblank(void) { } /** - * Copies the player1 controller data from p1cont to sGdContPads[0]. + * Copies the player1 controller data from p1cont to sGdContPads[0]. */ void gd_copy_p1_contpad(OSContPad *p1cont) { u32 i; // 24 @@ -1942,7 +1942,7 @@ Vtx *gd_dl_make_vertex(f32 x, f32 y, f32 z, f32 alpha) { /* 24E6C0 -> 24E724 */ void func_8019FEF0(void) { sTriangleBufCount++; - if (sVertexBufCount >= 12) { + if (sVertexBufCount >= 30) { gd_dl_flush_vertices(); func_801A0038(); } @@ -2366,7 +2366,7 @@ void parse_p1_controller(void) { OSContPad *currInputs; OSContPad *prevInputs; - // Copy current inputs to previous + // Copy current inputs to previous u8 *src = (u8 *) gdctrl; u8 *dest = (u8 *) gdctrl->prevFrame; for (i = 0; i < sizeof(struct GdControl); i++) { @@ -2891,7 +2891,7 @@ void Unknown801A4F58(void) { cbufOn = sScreenView->colourBufs[gGdFrameBufNum]; zbuf = sScreenView->zbuf; - for (i = 0; i < (320 * 240); i++) { // L801A4FCC + for (i = 0; i < (SCREEN_WIDTH * SCREEN_HEIGHT); i++) { // L801A4FCC colour = cbufOff[i]; if (colour) { r = (s16)(colour >> 11 & 0x1F); @@ -3000,7 +3000,7 @@ void gd_init(void) { sScreenView = make_view("screenview2", (VIEW_2_COL_BUF | VIEW_UNK_1000 | VIEW_COLOUR_BUF | VIEW_Z_BUF), 0, 0, - 0, 320, 240, NULL); + 0, SCREEN_WIDTH, SCREEN_HEIGHT, NULL); sScreenView->colour.r = 0.0f; sScreenView->colour.g = 0.0f; sScreenView->colour.b = 0.0f; @@ -3033,7 +3033,7 @@ void gd_init(void) { * functions from IRIS GL. * @param buf pointer to an array of 16-bit values * @param len maximum number of values to store - */ + */ void init_pick_buf(s16 *buf, s32 len) { buf[0] = 0; buf[1] = 0; @@ -3105,8 +3105,8 @@ void Unknown801A5C80(struct ObjGroup *parentGroup) { d_end_group("debugg"); debugGroup = (struct ObjGroup *) d_use_obj("debugg"); - make_view("debugview", (VIEW_2_COL_BUF | VIEW_ALLOC_ZBUF | VIEW_1_CYCLE | VIEW_DRAW), 2, 0, 0, 320, - 240, debugGroup); + make_view("debugview", (VIEW_2_COL_BUF | VIEW_ALLOC_ZBUF | VIEW_1_CYCLE | VIEW_DRAW), 2, 0, 0, SCREEN_WIDTH, + SCREEN_HEIGHT, debugGroup); if (parentGroup != NULL) { addto_group(parentGroup, &debugGroup->header); @@ -3149,7 +3149,7 @@ void Unknown801A5D90(struct ObjGroup *arg0) { d_add_valproc(cvrt_val_to_kb); sp23C = TRUE; sp244 += 14; - if (sp244 > 200) { + if (sp244 > SCREEN_HEIGHT) { break; } } @@ -3167,7 +3167,7 @@ void Unknown801A5D90(struct ObjGroup *arg0) { memview = make_view("memview", (VIEW_2_COL_BUF | VIEW_ALLOC_ZBUF | VIEW_UNK_2000 | VIEW_UNK_4000 | VIEW_1_CYCLE | VIEW_DRAW), - 2, 0, 10, 320, 200, labelgrp); + 2, 0, 10, SCREEN_WIDTH, SCREEN_HEIGHT-40, labelgrp); memview->colour.r = 0.0f; memview->colour.g = 0.0f; memview->colour.b = 0.0f; @@ -3407,7 +3407,7 @@ void make_timer_gadgets(void) { timerg = (struct ObjGroup *) d_use_obj("timerg"); timersview = make_view( "timersview", (VIEW_2_COL_BUF | VIEW_ALLOC_ZBUF | VIEW_1_CYCLE | VIEW_MOVEMENT | VIEW_DRAW), 2, - 0, 10, 320, 270, timerg); + 0, 10, SCREEN_WIDTH, SCREEN_HEIGHT+30, timerg); timersview->colour.r = 0.0f; timersview->colour.g = 0.0f; timersview->colour.b = 0.0f; @@ -3472,7 +3472,7 @@ struct GdObj *load_dynlist(struct DynList *dynlist) { fatal_printf("load_dynlist() unkown bank"); } -#define PAGE_SIZE 65536 // size of a 64K TLB page +#define PAGE_SIZE 65536 // size of a 64K TLB page segSize = dynlistSegEnd - dynlistSegStart; allocSegSpace = gd_malloc_temp(segSize + PAGE_SIZE); From 6f852f2e13baa2504e093e90186101efa3c6039f Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Wed, 15 Sep 2021 21:37:45 +0100 Subject: [PATCH 5/6] Globally link essential ucodes rather than sometimes --- lib/rsp.s | 112 +++++++++++++++++++++++++----------------------------- 1 file changed, 52 insertions(+), 60 deletions(-) diff --git a/lib/rsp.s b/lib/rsp.s index 11fadafa..a90f2a1c 100644 --- a/lib/rsp.s +++ b/lib/rsp.s @@ -22,30 +22,42 @@ glabel gspFast3D_fifoTextEnd #endif #else /* Use one of the Fast3DEX series grucodes. */ - #ifndef F3DZEX_GBI_2 #if F3DEX2PL_GBI == 1 glabel gspF3DEX2_PosLight_fifoTextStart .incbin "lib/PR/f3dex2pl/F3DEX2_PosLight.bin" glabel gspF3DEX2_PosLight_fifoTextEnd - #elif F3DEX_GBI_2 == 1 - glabel gspF3DEX2_fifoTextStart - .incbin "lib/PR/f3dex2/F3DEX2.bin" - glabel gspF3DEX2_fifoTextEnd #elif F3DEX_GBI == 1 glabel gspF3DEX_fifoTextStart .incbin "lib/PR/f3dex/F3DEX.bin" glabel gspF3DEX_fifoTextEnd #endif - #else /* Fast3DZEX */ - glabel gspF3DZEX2_PosLight_fifoTextStart - .incbin "lib/PR/f3dzex/F3DZEX.bin" - glabel gspF3DZEX2_PosLight_fifoTextEnd - glabel gspF3DLX2_Rej_fifoTextStart - .incbin "lib/PR/f3dex2/F3DLX2_Rej.bin" - glabel gspF3DLX2_Rej_fifoTextEnd - #endif #endif +.balign 16 +glabel gspF3DEX2_fifoTextStart + .incbin "lib/PR/f3dex2/F3DEX2.bin" +glabel gspF3DEX2_fifoTextEnd + +.balign 16 +glabel gspF3DZEX2_PosLight_fifoTextStart + .incbin "lib/PR/f3dzex/F3DZEX.bin" +glabel gspF3DZEX2_PosLight_fifoTextEnd + +.balign 16 +glabel gspF3DLX2_Rej_fifoTextStart + .incbin "lib/PR/f3dex2/F3DLX2_Rej.bin" +glabel gspF3DLX2_Rej_fifoTextEnd + +.balign 16 +glabel gspS2DEX2_fifoTextStart + .incbin "lib/PR/s2dex2/S2DEX2.bin" +glabel gspS2DEX2_fifoTextEnd + +.balign 16 +glabel gspL3DZEX2_PosLight_fifoTextStart + .incbin "lib/PR/f3dzex/L3DZEX.bin" +glabel gspL3DZEX2_PosLight_fifoTextEnd + /* Audio Bins */ /* @@ -148,22 +160,6 @@ glabel gspL3DEX2_fifoTextStart glabel gspL3DEX2_fifoTextEnd #endif -/* Line3DZEX Text */ -#ifdef L3DZEX_GBI -.balign 16 -glabel gspL3DZEX2_PosLight_fifoTextStart - .incbin "lib/PR/f3dzex/L3DZEX.bin" -glabel gspL3DZEX2_PosLight_fifoTextEnd -#endif - -/* S2DEX2 Text */ -#ifdef S2DEX_GBI_2 -.balign 16 -glabel gspS2DEX2_fifoTextStart - .incbin "lib/PR/s2dex2/S2DEX2.bin" -glabel gspS2DEX2_fifoTextEnd -#endif - /* DATA SECTION START */ .section .rodata @@ -174,37 +170,49 @@ glabel gspS2DEX2_fifoTextEnd glabel gspSuper3D_fifoDataStart .incbin "lib/PR/super3d/Super3D_data.bin" glabel gspSuper3D_fifoDataEnd -#else + #else glabel gspFast3D_fifoDataStart .incbin "rsp/fast3d_data.bin" glabel gspFast3D_fifoDataEnd -#endif + #endif #else /* Using one of the Fast3DEX series grucodes */ - #ifndef F3DZEX_GBI_2 #if F3DEX2PL_GBI == 1 glabel gspF3DEX2_PosLight_fifoDataStart .incbin "lib/PR/f3dex2pl/F3DEX2_PosLight_data.bin" glabel gspF3DEX2_PosLight_fifoDataEnd - #elif F3DEX_GBI_2 == 1 - glabel gspF3DEX2_fifoDataStart - .incbin "lib/PR/f3dex2/F3DEX2_data.bin" - glabel gspF3DEX2_fifoDataEnd #elif F3DEX_GBI == 1 glabel gspF3DEX_fifoDataStart .incbin "lib/PR/f3dex/F3DEX_data.bin" glabel gspF3DEX_fifoDataEnd #endif - #else /* Fast3DZEX */ - glabel gspF3DZEX2_PosLight_fifoDataStart - .incbin "lib/PR/f3dzex/F3DZEX_data.bin" - glabel gspF3DZEX2_PosLight_fifoDataEnd - glabel gspF3DLX2_Rej_fifoDataStart - .incbin "lib/PR/f3dex2/F3DLX2_Rej_data.bin" - glabel gspF3DLX2_Rej_fifoDataEnd - #endif #endif +.balign 16 +glabel gspF3DEX2_fifoDataStart + .incbin "lib/PR/f3dex2/F3DEX2_data.bin" +glabel gspF3DEX2_fifoDataEnd + +.balign 16 +glabel gspF3DZEX2_PosLight_fifoDataStart + .incbin "lib/PR/f3dzex/F3DZEX_data.bin" +glabel gspF3DZEX2_PosLight_fifoDataEnd + +.balign 16 +glabel gspF3DLX2_Rej_fifoDataStart + .incbin "lib/PR/f3dex2/F3DLX2_Rej_data.bin" +glabel gspF3DLX2_Rej_fifoDataEnd + +.balign 16 +glabel gspS2DEX_fifoDataStart + .incbin "lib/PR/s2dex/S2DEX_data.bin" +glabel gspS2DEX_fifoDataEnd + +.balign 16 +glabel gspS2DEX2_fifoDataStart + .incbin "lib/PR/s2dex2/S2DEX2_data.bin" +glabel gspS2DEX2_fifoDataEnd + /* Audio Data */ .balign 16 @@ -260,14 +268,6 @@ glabel gspL3DEX_fifoDataStart glabel gspL3DEX_fifoDataEnd #endif -/* S2DEX Data */ -#ifdef S2DEX_GBI -.balign 16 -glabel gspS2DEX_fifoDataStart - .incbin "lib/PR/s2dex/S2DEX_data.bin" -glabel gspS2DEX_fifoDataEnd -#endif - /* Fast3DEX2 Series */ /* Fast3DEX2 NoN Data */ @@ -309,11 +309,3 @@ glabel gspL3DZEX2_PosLight_fifoDataStart .incbin "lib/PR/f3dzex/L3DZEX_data.bin" glabel gspL3DZEX2_PosLight_fifoDataEnd #endif - -/* S2DEX2 Data */ -#ifdef S2DEX_GBI_2 -.balign 16 -glabel gspS2DEX2_fifoDataStart - .incbin "lib/PR/s2dex2/S2DEX2_data.bin" -glabel gspS2DEX2_fifoDataEnd -#endif From 26005df9d7f86b16fdcfb036c9218aca00beb184 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Thu, 16 Sep 2021 23:14:53 +0100 Subject: [PATCH 6/6] Label RCP resets --- src/engine/behavior_script.c | 2 -- src/engine/level_script.c | 2 +- src/game/game_init.c | 2 +- src/game/game_init.h | 5 +++++ src/game/rendering_graph_node.c | 6 +++--- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index c31474e7..d1542bb3 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -905,8 +905,6 @@ static BhvCommandProc BehaviorCmdTable[] = { // Execute the behavior script of the current object, process the object flags, and other miscellaneous code for updating objects. void cur_obj_update(void) { - UNUSED u32 unused; - u32 objFlags = gCurrentObject->oFlags; f32 distanceFromMario; BhvCommandProc bhvCmdProc; diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 8cf8300c..7940c50e 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -963,7 +963,7 @@ struct LevelCommand *level_script_execute(struct LevelCommand *cmd) { } profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE); - init_rcp(1); + init_rcp(CLEAR_ZBUFFER); render_game(); end_master_display_list(); alloc_display_list(0); diff --git a/src/game/game_init.c b/src/game/game_init.c index 8997558d..491d6a15 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -382,7 +382,7 @@ void render_init(void) { gGfxSPTask = &gGfxPool->spTask; gDisplayListHead = gGfxPool->buffer; gGfxPoolEnd = (u8 *)(gGfxPool->buffer + GFX_POOL_SIZE); - init_rcp(1); + init_rcp(CLEAR_ZBUFFER); clear_frame_buffer(0); end_master_display_list(); exec_display_list(&gGfxPool->spTask); diff --git a/src/game/game_init.h b/src/game/game_init.h index 2a58e917..0c1d170d 100644 --- a/src/game/game_init.h +++ b/src/game/game_init.h @@ -24,6 +24,11 @@ struct DemoInput u8 buttonMask; }; +enum ZBmodes { + KEEP_ZBUFFER = 0, + CLEAR_ZBUFFER = 1, +}; + extern struct Controller gControllers[3]; extern OSContStatus gControllerStatuses[4]; extern OSContPad gControllerPads[4]; diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 3e212810..02701875 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -169,14 +169,14 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { if (renderPhase == 0 || renderPhase == 2) { gSPLoadUcodeL(gDisplayListHead++, gspF3DLX2_Rej_fifo); - init_rcp(0); + init_rcp(KEEP_ZBUFFER); gSPClipRatio(gDisplayListHead++, FRUSTRATIO_2); } else if (renderPhase == 1) { gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); - init_rcp(0); + init_rcp(KEEP_ZBUFFER); gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); } if (enableZBuffer != 0) @@ -216,7 +216,7 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { case 1: renderPhase++; j = 1; i = 5; goto loopBegin; } gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); - init_rcp(0); + init_rcp(KEEP_ZBUFFER); gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); #endif if (enableZBuffer != 0)