Fix SILHOUETTE, OBJECTS_REJ, and ucode loading, also clean up render phase system a bit.

This commit is contained in:
Arceveti
2021-12-11 16:04:14 -08:00
parent 81f642aba4
commit 958ae2b987
6 changed files with 281 additions and 283 deletions

View File

@@ -29,12 +29,10 @@
// Similar to the above, but 30 FPS (Textures by InTheBeef, cleaned up by Arceveti)
#define IA8_30FPS_COINS
#ifdef F3DEX_GBI_2 // !Safeguard
// Use .rej microcode for certain objects (experimental - only should be used when F3DEX_GBI_2 is defined).
// Use .rej microcode for certain objects (experimental - only should be used when F3DZEX_GBI_2 is defined).
// So far - recent tests have show that this has reduced performance overall due to CPU load,
// though in some cases it may perform better.
// #define OBJECTS_REJ
#endif
/**
* Mario's silhouette when behind solid objects/surfaces
@@ -65,10 +63,27 @@
// Uses the correct "up" vector for the guLookAtReflect call in geo_process_master_list_sub.
// It is sideways in vanilla, and since vanilla's environment map textures are sideways too, they will appear as sideways in-game if this is enabled.
// Make sure your custom environment map textures are the correct orientation.
#define FIX_REFLECT_MTX
// #define FIX_REFLECT_MTX
// This improves performance a bit, and does not seem to break anything.
#define DISABLE_GRAPH_NODE_TYPE_FUNCTIONAL
// Disables object shadows. You'll probably only want this either as a last resort for performance or if you're making a super stylized hack.
//#define DISABLE_SHADOWS
// #define DISABLE_SHADOWS
// -- Compatibility safeguards. Don't mess with these unless you know what you're doing.--
#ifndef F3DZEX_GBI_2
#undef OBJECTS_REJ // OBJECTS_REJ requires f3dzex.
#endif // !F3DZEX_GBI_2
#ifndef F3DEX_GBI_SHARED
#undef OBJECTS_REJ // Non F3DEX-based ucodes do NOT support ucode switching.
#endif // !F3DEX_GBI_SHARED
#ifdef OBJECTS_REJ
// Enable required ucodes.
#define F3DEX2_REJ_GBI
#define F3DLX2_REJ_GBI
#endif // OBJECTS_REJ

View File

@@ -68,6 +68,11 @@
lib/PR/f3dex2/fifo/gspF3DEX2.Rej.fifo.o(.data);
#endif
/* Fast3DLX2 Rej Data */
#ifdef F3DLX2_REJ_GBI
lib/PR/f3dex2/fifo/gspF3DLX2.Rej.fifo.o(.data);
#endif
/* Line3DEX2 Data */
#ifdef L3DEX2_GBI
lib/PR/f3dex2/fifo/gspL3DEX2.fifo.o(.data);
@@ -81,4 +86,4 @@
/* S2DEX2 Data */
#ifdef S2DEX_GBI_2
lib/PR/s2dex2/fifo/gspS2DEX2.fifo.o(.data);
#endif
#endif

View File

@@ -68,6 +68,11 @@
lib/PR/f3dex2/fifo/gspF3DEX2.Rej.fifo.o(.text);
#endif
/* Fast3DLX2 Rej Text */
#ifdef F3DLX2_REJ_GBI
lib/PR/f3dex2/fifo/gspF3DLX2.Rej.fifo.o(.text);
#endif
/* Line3DEX2 Text */
#ifdef L3DEX2_GBI
lib/PR/f3dex2/fifo/gspL3DEX2.fifo.o(.text);
@@ -81,4 +86,4 @@
/* S2DEX2 Text */
#ifdef S2DEX_GBI_2
lib/PR/s2dex2/fifo/gspS2DEX2.fifo.o(.text);
#endif
#endif

View File

@@ -278,31 +278,47 @@ 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 = OS_TASK_LOADABLE | OS_TASK_DP_WAIT;
#if defined(F3DEX_GBI_SHARED) && defined(OBJECTS_REJ)
gGfxSPTask->task.t.flags = (OS_TASK_LOADABLE | OS_TASK_DP_WAIT);
#else
gGfxSPTask->task.t.flags = 0x0;
#endif
#ifdef L3DEX2_ALONE
gGfxSPTask->task.t.ucode = gspL3DEX2_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspL3DEX2_fifoDataStart;
gGfxSPTask->task.t.ucode_size = ((u8 *) gspL3DEX2_fifoTextEnd - (u8 *) gspL3DEX2_fifoTextStart);
gGfxSPTask->task.t.ucode_data_size = ((u8 *) gspL3DEX2_fifoDataEnd - (u8 *) gspL3DEX2_fifoDataStart);
#elif F3DZEX_GBI_2
gGfxSPTask->task.t.ucode = gspF3DZEX2_PosLight_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspF3DZEX2_PosLight_fifoDataStart;
gGfxSPTask->task.t.ucode_size = ((u8 *) gspF3DZEX2_PosLight_fifoTextEnd - (u8 *) gspF3DZEX2_PosLight_fifoTextStart);
gGfxSPTask->task.t.ucode_data_size = ((u8 *) gspF3DZEX2_PosLight_fifoDataEnd - (u8 *) gspF3DZEX2_PosLight_fifoDataStart);
#elif F3DEX2PL_GBI
gGfxSPTask->task.t.ucode = gspF3DEX2_PosLight_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspF3DEX2_PosLight_fifoDataStart;
gGfxSPTask->task.t.ucode_size = ((u8 *) gspF3DEX2_PosLight_fifoTextEnd - (u8 *) gspF3DEX2_PosLight_fifoTextStart);
gGfxSPTask->task.t.ucode_data_size = ((u8 *) gspF3DEX2_PosLight_fifoDataEnd - (u8 *) gspF3DEX2_PosLight_fifoDataStart);
#elif F3DEX_GBI_2
gGfxSPTask->task.t.ucode = gspF3DEX2_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspF3DEX2_fifoDataStart;
gGfxSPTask->task.t.ucode_size = ((u8 *) gspF3DEX2_fifoTextEnd - (u8 *) gspF3DEX2_fifoTextStart);
gGfxSPTask->task.t.ucode_data_size = ((u8 *) gspF3DEX2_fifoDataEnd - (u8 *) gspF3DEX2_fifoDataStart);
#elif F3DEX_GBI
gGfxSPTask->task.t.ucode = gspF3DEX_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspF3DEX_fifoDataStart;
gGfxSPTask->task.t.ucode_size = ((u8 *) gspF3DEX_fifoTextEnd - (u8 *) gspF3DEX_fifoTextStart);
gGfxSPTask->task.t.ucode_data_size = ((u8 *) gspF3DEX_fifoDataEnd - (u8 *) gspF3DEX_fifoDataStart);
#elif SUPER3D_GBI
gGfxSPTask->task.t.ucode = gspSuper3D_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspSuper3D_fifoDataStart;
gGfxSPTask->task.t.ucode = gspSuper3DTextStart;
gGfxSPTask->task.t.ucode_data = gspSuper3DDataStart;
gGfxSPTask->task.t.ucode_size = ((u8 *) gspSuper3DTextEnd - (u8 *) gspSuper3DTextStart);
gGfxSPTask->task.t.ucode_data_size = ((u8 *) gspSuper3DDataEnd - (u8 *) gspSuper3DDataStart);
#else
gGfxSPTask->task.t.ucode = gspFast3D_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspFast3D_fifoDataStart;
gGfxSPTask->task.t.ucode_size = ((u8 *) gspFast3D_fifoTextEnd - (u8 *) gspFast3D_fifoTextStart);
gGfxSPTask->task.t.ucode_data_size = ((u8 *) gspFast3D_fifoDataEnd - (u8 *) gspFast3D_fifoDataStart);
#endif
gGfxSPTask->task.t.ucode_size = SP_UCODE_SIZE; // (this size is ignored)
gGfxSPTask->task.t.ucode_data_size = SP_UCODE_DATA_SIZE;
gGfxSPTask->task.t.dram_stack = (u64 *) gGfxSPTaskStack;
gGfxSPTask->task.t.dram_stack_size = SP_DRAM_STACK_SIZE8;
gGfxSPTask->task.t.output_buff = gGfxSPTaskOutputBuffer;

File diff suppressed because it is too large Load Diff

View File

@@ -28,56 +28,65 @@ enum AnimType {
ANIM_TYPE_ROTATION
};
#define IS_LAYER_ZB( layer) (((layer) >= LAYER_ZB_FIRST ) || ((layer) <= LAYER_ZB_LAST))
#define IS_LAYER_NON_ZB(layer) (((layer) >= LAYER_NON_ZB_FIRST) || ((layer) <= LAYER_LAST ))
#ifdef OBJECTS_REJ
enum HeadsList {
LIST_HEADS_ZEX,
LIST_HEADS_REJ,
};
#endif
#define IS_LAYER_ZB( layer) (((layer) >= LAYER_ZB_FIRST ) || ((layer) <= LAYER_ZB_LAST))
#define IS_LAYER_NON_ZB(layer) (((layer) >= LAYER_NON_ZB_FIRST) || ((layer) <= LAYER_LAST ))
#if SILHOUETTE
// Silhouette, .rej
enum RenderPhases {
RENDER_PHASE_ZEX_BEFORE_SILHOUETTE,
RENDER_PHASE_REJ_ZB,
RENDER_PHASE_REJ_SILHOUETTE,
RENDER_PHASE_REJ_NON_SILHOUETTE,
RENDER_PHASE_REJ_OCCLUDE_SILHOUETTE,
RENDER_PHASE_ZEX_AFTER_SILHOUETTE,
RENDER_PHASE_REJ_NON_ZB,
RENDER_PHASE_END,
};
#define RENDER_PHASE_SILHOUETTE RENDER_PHASE_REJ_SILHOUETTE
#define RENDER_PHASE_NON_SILHOUETTE RENDER_PHASE_REJ_NON_SILHOUETTE
#else
// No silhouette, .rej
enum RenderPhases {
RENDER_PHASE_ZEX_BG,
RENDER_PHASE_REJ_ZB,
RENDER_PHASE_ZEX_ALL,
RENDER_PHASE_REJ_NON_ZB,
RENDER_PHASE_END,
};
#endif
#else
#if SILHOUETTE
// Silhouette, no .rej
enum RenderPhases {
RENDER_PHASE_ZEX_BEFORE_SILHOUETTE,
RENDER_PHASE_ZEX_SILHOUETTE,
RENDER_PHASE_ZEX_NON_SILHOUETTE,
RENDER_PHASE_ZEX_OCCLUDE_SILHOUETTE,
RENDER_PHASE_ZEX_AFTER_SILHOUETTE,
RENDER_PHASE_END,
};
#define RENDER_PHASE_SILHOUETTE RENDER_PHASE_ZEX_SILHOUETTE
#define RENDER_PHASE_NON_SILHOUETTE RENDER_PHASE_ZEX_NON_SILHOUETTE
#else
// No silhouette, no .rej
enum RenderPhases {
RENDER_PHASE_ZEX_ALL,
RENDER_PHASE_END,
};
#endif
#endif
#if SILHOUETTE
#define IS_LAYER_SILHOUETTE(layer) (((layer) >= LAYER_SILHOUETTE_FIRST) || ((layer) <= LAYER_SILHOUETTE_LAST))
#ifdef OBJECTS_REJ
enum RenderPhase { // Silhouette, .rej
RENDER_PHASE_ZEX_BG,
RENDER_PHASE_REJ_ZB,
RENDER_PHASE_ZEX_BEFORE_SILHOUETTE,
RENDER_PHASE_REJ_SILHOUETTE,
RENDER_PHASE_REJ_NON_SILHOUETTE,
RENDER_PHASE_REJ_OCCLUDE_SILHOUETTE,
RENDER_PHASE_ZEX_AFTER_SILHOUETTE,
RENDER_PHASE_REJ_NON_ZB,
RENDER_PHASE_END,
};
#else
enum RenderPhase { // Silhouette, no .rej
RENDER_PHASE_ZEX_BEFORE_SILHOUETTE,
RENDER_PHASE_ZEX_SILHOUETTE,
RENDER_PHASE_ZEX_NON_SILHOUETTE,
RENDER_PHASE_ZEX_OCCLUDE_SILHOUETTE,
RENDER_PHASE_ZEX_AFTER_SILHOUETTE,
RENDER_PHASE_END,
};
#endif
#else
#ifdef OBJECTS_REJ
enum RenderPhase { // No silhouette, .rej
RENDER_PHASE_ZEX_BG,
RENDER_PHASE_REJ_ZB,
RENDER_PHASE_ZEX_ALL,
RENDER_PHASE_REJ_NON_ZB,
RENDER_PHASE_END,
};
#else
enum RenderPhase { // No silhouette, no .rej
RENDER_PHASE_ZEX_ALL,
RENDER_PHASE_END,
};
#endif
#endif
#define RENDER_PHASE_FIRST 0
void geo_process_node_and_siblings(struct GraphNode *firstNode);