Merge pull request #166 from Reonu/object_transparency

Fix some transparent objects rendering behind env boxes.
This commit is contained in:
thecozies
2021-12-19 10:09:42 -06:00
committed by GitHub
5 changed files with 33 additions and 29 deletions

View File

@@ -3,9 +3,9 @@ const GeoLayout burn_smoke_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
#ifdef BURN_SMOKE_FIX
GEO_ASM(GEO_TRANSPARENCY_MODE_NORMAL, geo_update_layer_transparency),
GEO_ASM(GEO_TRANSPARENCY_MODE_INTER, geo_update_layer_transparency),
#endif
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, burn_smoke_seg4_dl),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, burn_smoke_seg4_dl),
GEO_CLOSE_NODE(),
GEO_END(),
};

View File

@@ -13,14 +13,14 @@ const GeoLayout red_flame_geo[] = {
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(8, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B3B0),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B3C8),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B3E0),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B3F8),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B410),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B428),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B440),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B458),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B3B0),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B3C8),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B3E0),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B3F8),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B410),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B428),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B440),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B458),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
@@ -32,14 +32,14 @@ const GeoLayout blue_flame_geo[] = {
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(8, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B500),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B518),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B530),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B548),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B560),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B578),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B590),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, flame_seg3_dl_0301B5A8),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B500),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B518),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B530),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B548),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B560),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B578),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B590),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, flame_seg3_dl_0301B5A8),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),

View File

@@ -3,13 +3,13 @@ const GeoLayout bubbly_tree_geo[] = {
GEO_CULLING_RADIUS(800),
GEO_OPEN_NODE(),
#ifdef OBJ_OPACITY_BY_CAM_DIST
GEO_ASM(GEO_TRANSPARENCY_MODE_NORMAL, geo_update_layer_transparency),
GEO_ASM(GEO_TRANSPARENCY_MODE_INTER, geo_update_layer_transparency),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
#endif
GEO_DISPLAY_LIST(LAYER_ALPHA, tree_seg3_dl_bubbly),
#ifdef OBJ_OPACITY_BY_CAM_DIST
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, tree_seg3_dl_bubbly_transparent),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, tree_seg3_dl_bubbly_transparent),
GEO_CLOSE_NODE(),
#endif
GEO_CLOSE_NODE(),
@@ -21,13 +21,13 @@ const GeoLayout spiky_tree_geo[] = {
GEO_CULLING_RADIUS(800),
GEO_OPEN_NODE(),
#ifdef OBJ_OPACITY_BY_CAM_DIST
GEO_ASM(GEO_TRANSPARENCY_MODE_NORMAL, geo_update_layer_transparency),
GEO_ASM(GEO_TRANSPARENCY_MODE_INTER, geo_update_layer_transparency),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
#endif
GEO_DISPLAY_LIST(LAYER_ALPHA, tree_seg3_dl_spiky),
#ifdef OBJ_OPACITY_BY_CAM_DIST
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, tree_seg3_dl_spiky_transparent),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, tree_seg3_dl_spiky_transparent),
GEO_CLOSE_NODE(),
#endif
GEO_CLOSE_NODE(),
@@ -39,13 +39,13 @@ const GeoLayout snow_tree_geo[] = {
GEO_CULLING_RADIUS(800),
GEO_OPEN_NODE(),
#ifdef OBJ_OPACITY_BY_CAM_DIST
GEO_ASM(GEO_TRANSPARENCY_MODE_NORMAL, geo_update_layer_transparency),
GEO_ASM(GEO_TRANSPARENCY_MODE_INTER, geo_update_layer_transparency),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
#endif
GEO_DISPLAY_LIST(LAYER_ALPHA, tree_seg3_dl_snowy_pine),
#ifdef OBJ_OPACITY_BY_CAM_DIST
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, tree_seg3_dl_snowy_pine_transparent),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, tree_seg3_dl_snowy_pine_transparent),
GEO_CLOSE_NODE(),
#endif
GEO_CLOSE_NODE(),
@@ -57,13 +57,13 @@ const GeoLayout palm_tree_geo[] = {
GEO_CULLING_RADIUS(800),
GEO_OPEN_NODE(),
#ifdef OBJ_OPACITY_BY_CAM_DIST
GEO_ASM(GEO_TRANSPARENCY_MODE_NORMAL, geo_update_layer_transparency),
GEO_ASM(GEO_TRANSPARENCY_MODE_INTER, geo_update_layer_transparency),
GEO_SWITCH_CASE(2, geo_switch_anim_state),
GEO_OPEN_NODE(),
#endif
GEO_DISPLAY_LIST(LAYER_ALPHA, tree_seg3_dl_palm),
#ifdef OBJ_OPACITY_BY_CAM_DIST
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, tree_seg3_dl_palm_transparent),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, tree_seg3_dl_palm_transparent),
GEO_CLOSE_NODE(),
#endif
GEO_CLOSE_NODE(),

View File

@@ -51,6 +51,7 @@ Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUS
if (callContext == GEO_CONTEXT_RENDER) {
struct Object *objectGraphNode = (struct Object *) gCurGraphNodeObject; // TODO: change this to object pointer?
struct GraphNodeGenerated *currentGraphNode = (struct GraphNodeGenerated *) node;
s32 parameter = currentGraphNode->parameter;
if (gCurGraphNodeHeldObject != NULL) {
objectGraphNode = gCurGraphNodeHeldObject->objNode;
@@ -62,7 +63,7 @@ Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUS
Gfx *dlHead = dlStart;
if (objectOpacity == 0xFF) {
if (currentGraphNode->parameter == GEO_TRANSPARENCY_MODE_DECAL) {
if (parameter == GEO_TRANSPARENCY_MODE_DECAL) {
SET_GRAPH_NODE_LAYER(currentGraphNode->fnNode.node.flags, LAYER_TRANSPARENT_DECAL);
} else {
SET_GRAPH_NODE_LAYER(currentGraphNode->fnNode.node.flags, LAYER_OPAQUE);
@@ -70,8 +71,10 @@ Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUS
objectGraphNode->oAnimState = TRANSPARENCY_ANIM_STATE_OPAQUE;
} else {
if (currentGraphNode->parameter == GEO_TRANSPARENCY_MODE_DECAL) {
if (parameter == GEO_TRANSPARENCY_MODE_DECAL) {
SET_GRAPH_NODE_LAYER(currentGraphNode->fnNode.node.flags, LAYER_TRANSPARENT_DECAL);
} else if (parameter == GEO_TRANSPARENCY_MODE_INTER) {
SET_GRAPH_NODE_LAYER(currentGraphNode->fnNode.node.flags, LAYER_TRANSPARENT_INTER);
} else {
SET_GRAPH_NODE_LAYER(currentGraphNode->fnNode.node.flags, LAYER_TRANSPARENT);
}
@@ -82,7 +85,7 @@ Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUS
objectGraphNode->oAnimState = BOWSER_ANIM_STATE_INVISIBLE;
}
if (currentGraphNode->parameter != GEO_TRANSPARENCY_MODE_NO_DITHER
if (parameter != GEO_TRANSPARENCY_MODE_NO_DITHER
&& (objectGraphNode->activeFlags & ACTIVE_FLAG_DITHERED_ALPHA)) {
gDPSetAlphaCompare(dlHead++, G_AC_DITHER);
}

View File

@@ -56,6 +56,7 @@ enum GeoUpdateLayerTransparencyModes {
GEO_TRANSPARENCY_MODE_NORMAL = 0,
GEO_TRANSPARENCY_MODE_NO_DITHER = 10,
GEO_TRANSPARENCY_MODE_DECAL = 20,
GEO_TRANSPARENCY_MODE_INTER = 30,
};
Gfx *geo_update_projectile_pos_from_parent(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx);