This commit is contained in:
Arceveti
2021-09-26 14:51:33 -07:00
3 changed files with 43 additions and 97 deletions

View File

@@ -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)

View File

@@ -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.

View File

@@ -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;
}