diff --git a/include/sm64.h b/include/sm64.h index e8471fda..2e9d6ad2 100644 --- a/include/sm64.h +++ b/include/sm64.h @@ -29,55 +29,45 @@ #define SET_HIGH_U16_OF_32(var, x) ((var) = ((var) & 0xFFFF) | ((x) << 16)) #define SET_HIGH_S16_OF_32(var, x) ((var) = ((var) & 0xFFFF) | ((x) << 16)) -// Layers +enum RenderLayers +{ + LAYER_FORCE, + LAYER_OPAQUE, + LAYER_OPAQUE_INTER, + LAYER_OPAQUE_DECAL, + LAYER_ALPHA, #if SILHOUETTE -#define LAYER_FORCE 0x0 // is zbuffered -#define LAYER_OPAQUE 0x1 // is zbuffered -#define LAYER_OPAQUE_INTER 0x2 // is zbuffered -#define LAYER_OPAQUE_DECAL 0x3 // is zbuffered -#define LAYER_ALPHA 0x4 // is zbuffered -#define LAYER_ALPHA_DECAL 0x5 // is zbuffered -#define LAYER_SILHOUETTE_OPAQUE 0x6 // is zbuffered -#define LAYER_SILHOUETTE_ALPHA 0x7 // is zbuffered -#define LAYER_OCCLUDE_SILHOUETTE_OPAQUE 0x8 // is zbuffered -#define LAYER_OCCLUDE_SILHOUETTE_ALPHA 0x9 // is zbuffered -#define LAYER_TRANSPARENT_DECAL 0xA // not zbuffered -#define LAYER_TRANSPARENT 0xB // not zbuffered -#define LAYER_TRANSPARENT_INTER 0xC // not zbuffered - -#define LAYER_ZB_LAST LAYER_OCCLUDE_SILHOUETTE_ALPHA - + LAYER_ALPHA_DECAL, + LAYER_SILHOUETTE_OPAQUE, + LAYER_SILHOUETTE_ALPHA, + LAYER_OCCLUDE_SILHOUETTE_OPAQUE, + LAYER_OCCLUDE_SILHOUETTE_ALPHA, +#endif + LAYER_TRANSPARENT_DECAL, + LAYER_TRANSPARENT, + LAYER_TRANSPARENT_INTER, + LAYER_COUNT, +}; +#if SILHOUETTE +#define LAYER_ZB_LAST LAYER_OCCLUDE_SILHOUETTE_ALPHA #define LAYER_SILHOUETTE_FIRST LAYER_SILHOUETTE_OPAQUE #define LAYER_LAST_BEFORE_SILHOUETTE (LAYER_SILHOUETTE_FIRST - 1) #define LAYER_SILHOUETTE_LAST LAYER_SILHOUETTE_ALPHA #define LAYER_OCCLUDE_SILHOUETTE_FIRST LAYER_OCCLUDE_SILHOUETTE_OPAQUE #define LAYER_OCCLUDE_SILHOUETTE_LAST LAYER_OCCLUDE_SILHOUETTE_ALPHA - #define LAYER_OPAQUE_ORIG LAYER_OPAQUE #define LAYER_ALPHA_ORIG LAYER_ALPHA - #else -#define LAYER_FORCE 0x0 // is zbuffered -#define LAYER_OPAQUE 0x1 // is zbuffered -#define LAYER_OPAQUE_DECAL 0x2 // is zbuffered -#define LAYER_OPAQUE_INTER 0x3 // is zbuffered -#define LAYER_ALPHA 0x4 // is zbuffered -#define LAYER_TRANSPARENT 0x5 // not zbuffered -#define LAYER_TRANSPARENT_DECAL 0x6 // not zbuffered -#define LAYER_TRANSPARENT_INTER 0x7 // not zbuffered - -#define LAYER_ZB_LAST LAYER_ALPHA - -#define LAYER_ALPHA_DECAL 0x4 // is zbuffered -#define LAYER_SILHOUETTE_OPAQUE 0x1 // is zbuffered -#define LAYER_SILHOUETTE_ALPHA 0x4 // is zbuffered -#define LAYER_OCCLUDE_SILHOUETTE_OPAQUE 0x1 // is zbuffered -#define LAYER_OCCLUDE_SILHOUETTE_ALPHA 0x4 // is zbuffered - +#define LAYER_ZB_LAST LAYER_ALPHA +#define LAYER_ALPHA_DECAL LAYER_ALPHA +#define LAYER_SILHOUETTE_OPAQUE LAYER_OPAQUE // is zbuffered +#define LAYER_SILHOUETTE_ALPHA LAYER_ALPHA // is zbuffered +#define LAYER_OCCLUDE_SILHOUETTE_OPAQUE LAYER_OPAQUE // is zbuffered +#define LAYER_OCCLUDE_SILHOUETTE_ALPHA LAYER_ALPHA // is zbuffered #endif + #define LAYER_FIRST_NON_ZB (LAYER_ZB_LAST + 1) -#define LAYER_LAST_ALL LAYER_TRANSPARENT_INTER #define INPUT_NONZERO_ANALOG /* 0x0001 */ (1 << 0) #define INPUT_A_PRESSED /* 0x0002 */ (1 << 1) diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index 72a54511..5d8f4c5c 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -58,10 +58,6 @@ #define GRAPH_NODE_TYPES_MASK 0x0FF -// The number of master lists. A master list determines the order and render -// mode with which display lists are drawn. -#define GFX_NUM_MASTER_LISTS (LAYER_LAST_ALL + 1) - // Passed as first argument to a GraphNodeFunc to give information about in // which context it was called and what it is expected to do. #define GEO_CONTEXT_CREATE 0 // called when node is created from a geo command @@ -143,8 +139,8 @@ struct DisplayListNode struct GraphNodeMasterList { /*0x00*/ struct GraphNode node; - /*0x14*/ struct DisplayListNode *listHeads[2][GFX_NUM_MASTER_LISTS]; - /*0x34*/ struct DisplayListNode *listTails[2][GFX_NUM_MASTER_LISTS]; + /*0x14*/ struct DisplayListNode *listHeads[2][LAYER_COUNT]; + /*0x34*/ struct DisplayListNode *listTails[2][LAYER_COUNT]; }; /** Simply used as a parent to group multiple children. diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 802fcb18..3c8f8fa5 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -77,10 +77,9 @@ s16 *gCurAnimData; struct AllocOnlyPool *gDisplayListHeap; struct RenderModeContainer { - u32 modes[GFX_NUM_MASTER_LISTS]; + u32 modes[LAYER_COUNT]; }; -#if SILHOUETTE /* Rendermode settings for cycle 1 for all 13 layers. */ struct RenderModeContainer renderModeTable_1Cycle[2] = { { { G_RM_OPA_SURF, // LAYER_FORCE @@ -88,11 +87,13 @@ struct RenderModeContainer renderModeTable_1Cycle[2] = { { { G_RM_AA_OPA_SURF, // LAYER_OPAQUE_INTER G_RM_AA_OPA_SURF, // LAYER_OPAQUE_DECAL G_RM_AA_TEX_EDGE, // LAYER_ALPHA + #if SILHOUETTE G_RM_AA_TEX_EDGE | ZMODE_DEC, // LAYER_ALPHA_DECAL G_RM_AA_OPA_SURF, // LAYER_SILHOUETTE_OPAQUE G_RM_AA_TEX_EDGE, // LAYER_SILHOUETTE_ALPHA G_RM_AA_OPA_SURF, // LAYER_OCCLUDE_SILHOUETTE_OPAQUE G_RM_AA_TEX_EDGE, // LAYER_OCCLUDE_SILHOUETTE_ALPHA + #endif G_RM_AA_XLU_SURF, // LAYER_TRANSPARENT_DECAL G_RM_AA_XLU_SURF, // LAYER_TRANSPARENT G_RM_AA_XLU_SURF, // LAYER_TRANSPARENT_INTER @@ -104,11 +105,13 @@ struct RenderModeContainer renderModeTable_1Cycle[2] = { { { G_RM_AA_ZB_OPA_INTER, // LAYER_OPAQUE_INTER G_RM_AA_ZB_OPA_DECAL, // LAYER_OPAQUE_DECAL G_RM_AA_ZB_TEX_EDGE, // LAYER_ALPHA + #if SILHOUETTE G_RM_AA_ZB_TEX_EDGE | ZMODE_DEC, // LAYER_ALPHA_DECAL G_RM_AA_ZB_OPA_SURF, // LAYER_SILHOUETTE_OPAQUE G_RM_AA_ZB_TEX_EDGE, // LAYER_SILHOUETTE_ALPHA G_RM_AA_ZB_OPA_SURF, // LAYER_OCCLUDE_SILHOUETTE_OPAQUE G_RM_AA_ZB_TEX_EDGE, // LAYER_OCCLUDE_SILHOUETTE_ALPHA + #endif G_RM_AA_ZB_XLU_DECAL, // LAYER_TRANSPARENT_DECAL G_RM_AA_ZB_XLU_SURF, // LAYER_TRANSPARENT G_RM_AA_ZB_XLU_INTER, // LAYER_TRANSPARENT_INTER @@ -121,11 +124,13 @@ struct RenderModeContainer renderModeTable_2Cycle[2] = { { { G_RM_AA_OPA_SURF2, // LAYER_OPAQUE_INTER G_RM_AA_OPA_SURF2, // LAYER_OPAQUE_DECAL G_RM_AA_TEX_EDGE2, // LAYER_ALPHA +#if SILHOUETTE G_RM_AA_TEX_EDGE2 | ZMODE_DEC, // LAYER_ALPHA_DECAL G_RM_AA_OPA_SURF2, // LAYER_SILHOUETTE_OPAQUE G_RM_AA_TEX_EDGE2, // LAYER_SILHOUETTE_ALPHA G_RM_AA_OPA_SURF2, // LAYER_OCCLUDE_SILHOUETTE_OPAQUE G_RM_AA_TEX_EDGE2, // LAYER_OCCLUDE_SILHOUETTE_ALPHA +#endif G_RM_AA_XLU_SURF2, // LAYER_TRANSPARENT_DECAL G_RM_AA_XLU_SURF2, // LAYER_TRANSPARENT G_RM_AA_XLU_SURF2, // LAYER_TRANSPARENT_INTER @@ -137,62 +142,17 @@ struct RenderModeContainer renderModeTable_2Cycle[2] = { { { G_RM_AA_ZB_OPA_INTER2, // LAYER_OPAQUE_INTER G_RM_AA_ZB_OPA_DECAL2, // LAYER_OPAQUE_DECAL G_RM_AA_ZB_TEX_EDGE2, // LAYER_ALPHA +#if SILHOUETTE G_RM_AA_ZB_TEX_EDGE2 | ZMODE_DEC, // LAYER_ALPHA_DECAL G_RM_AA_ZB_OPA_SURF2, // LAYER_SILHOUETTE_OPAQUE G_RM_AA_ZB_TEX_EDGE2, // LAYER_SILHOUETTE_ALPHA G_RM_AA_ZB_OPA_SURF2, // LAYER_OCCLUDE_SILHOUETTE_OPAQUE G_RM_AA_ZB_TEX_EDGE2, // LAYER_OCCLUDE_SILHOUETTE_ALPHA +#endif G_RM_AA_ZB_XLU_DECAL2, // LAYER_TRANSPARENT_DECAL G_RM_AA_ZB_XLU_SURF2, // LAYER_TRANSPARENT G_RM_AA_ZB_XLU_INTER2, // LAYER_TRANSPARENT_INTER } } }; -#else -/* Rendermode settings for cycle 1 for all 8 layers. */ -struct RenderModeContainer renderModeTable_1Cycle[2] = { { { - G_RM_OPA_SURF, - G_RM_AA_OPA_SURF, - G_RM_AA_OPA_SURF, - G_RM_AA_OPA_SURF, - G_RM_AA_TEX_EDGE, - G_RM_AA_XLU_SURF, - G_RM_AA_XLU_SURF, - G_RM_AA_XLU_SURF, - } }, - { { - /* z-buffered */ - G_RM_ZB_OPA_SURF, - G_RM_AA_ZB_OPA_SURF, - G_RM_AA_ZB_OPA_DECAL, - G_RM_AA_ZB_OPA_INTER, - G_RM_AA_ZB_TEX_EDGE, - G_RM_AA_ZB_XLU_SURF, - G_RM_AA_ZB_XLU_DECAL, - G_RM_AA_ZB_XLU_INTER, - } } }; - -/* Rendermode settings for cycle 2 for all 8 layers. */ -struct RenderModeContainer renderModeTable_2Cycle[2] = { { { - G_RM_OPA_SURF2, - G_RM_AA_OPA_SURF2, - G_RM_AA_OPA_SURF2, - G_RM_AA_OPA_SURF2, - G_RM_AA_TEX_EDGE2, - G_RM_AA_XLU_SURF2, - G_RM_AA_XLU_SURF2, - G_RM_AA_XLU_SURF2, - } }, - { { - /* z-buffered */ - G_RM_ZB_OPA_SURF2, - G_RM_AA_ZB_OPA_SURF2, - G_RM_AA_ZB_OPA_DECAL2, - G_RM_AA_ZB_OPA_INTER2, - G_RM_AA_ZB_TEX_EDGE2, - G_RM_AA_ZB_XLU_SURF2, - G_RM_AA_ZB_XLU_DECAL2, - G_RM_AA_ZB_XLU_INTER2, - } } }; -#endif struct GraphNodeRoot *gCurGraphNodeRoot = NULL; struct GraphNodeMasterList *gCurGraphNodeMasterList = NULL; @@ -269,12 +229,12 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { case RENDER_PHASE_REJ_SILHOUETTE: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_SILHOUETTE_FIRST; endLayer = LAYER_SILHOUETTE_LAST; break; case RENDER_PHASE_REJ_NON_SILHOUETTE: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_SILHOUETTE_FIRST; endLayer = LAYER_SILHOUETTE_LAST; break; case RENDER_PHASE_REJ_OCCLUDE_SILHOUETTE: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_OCCLUDE_SILHOUETTE_FIRST; endLayer = LAYER_OCCLUDE_SILHOUETTE_LAST; break; - case RENDER_PHASE_ZEX_AFTER_SILHOUETTE: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_OCCLUDE_SILHOUETTE_FIRST; endLayer = LAYER_LAST_ALL; break; - case RENDER_PHASE_REJ_NON_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FIRST_NON_ZB; endLayer = LAYER_LAST_ALL; break; + case RENDER_PHASE_ZEX_AFTER_SILHOUETTE: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_OCCLUDE_SILHOUETTE_FIRST; endLayer = LAYER_COUNT-1; break; + case RENDER_PHASE_REJ_NON_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FIRST_NON_ZB; endLayer = LAYER_COUNT-1; break; #else case RENDER_PHASE_REJ_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FORCE; endLayer = LAYER_ZB_LAST; break; - case RENDER_PHASE_ZEX_ALL: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_FORCE; endLayer = LAYER_LAST_ALL; break; - case RENDER_PHASE_REJ_NON_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FIRST_NON_ZB; endLayer = LAYER_LAST_ALL; break; + case RENDER_PHASE_ZEX_ALL: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_FORCE; endLayer = LAYER_COUNT-1; break; + case RENDER_PHASE_REJ_NON_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FIRST_NON_ZB; endLayer = LAYER_COUNT-1; break; #endif } // Load rejection on pass 2. ZEX is loaded afterwards. @@ -403,7 +363,7 @@ static void geo_process_master_list(struct GraphNodeMasterList *node) { if (gCurGraphNodeMasterList == NULL && node->node.children != NULL) { gCurGraphNodeMasterList = node; - for (i = 0; i < GFX_NUM_MASTER_LISTS; i++) { + for (i = 0; i < LAYER_COUNT; i++) { node->listHeads[LIST_HEADS_ZEX][i] = NULL; node->listHeads[LIST_HEADS_REJ][i] = NULL; }