From 59d609fb070faabacc14933686ea9d1515ad71a1 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 21 Sep 2021 12:25:56 -0700 Subject: [PATCH] Fix silhouette --- actors/group0_geo.c | 16 ---------------- actors/mario_cap/geo.inc.c | 12 ++++++------ data/behavior_data.c | 10 +++++----- include/object_constants.h | 7 ++++--- include/types.h | 1 - src/engine/behavior_script.c | 14 ++++++++++---- src/engine/graph_node.h | 5 ++--- src/game/behaviors/ukiki.inc.c | 2 +- src/game/rendering_graph_node.c | 23 +++++++++++++++++------ src/game/rendering_graph_node.h | 3 +++ src/game/spawn_object.c | 2 +- 11 files changed, 49 insertions(+), 46 deletions(-) diff --git a/actors/group0_geo.c b/actors/group0_geo.c index e2451f0d..bddefae9 100644 --- a/actors/group0_geo.c +++ b/actors/group0_geo.c @@ -15,20 +15,4 @@ #include "sparkle/geo.inc.c" #include "water_splash/geo.inc.c" #include "sparkle_animation/geo.inc.c" -#if SILHOUETTE -#define LAYER_OPAQUE_ORIG LAYER_OPAQUE -#define LAYER_ALPHA_ORIG LAYER_ALPHA -#undef LAYER_OPAQUE -#undef LAYER_ALPHA -#define LAYER_OPAQUE LAYER_SILHOUETTE_OPAQUE -#define LAYER_ALPHA LAYER_SILHOUETTE_ALPHA #include "mario/geo.inc.c" -#undef LAYER_OPAQUE -#undef LAYER_ALPHA -#define LAYER_OPAQUE LAYER_OPAQUE_ORIG -#define LAYER_ALPHA LAYER_ALPHA_ORIG -#undef LAYER_OPAQUE_ORIG -#undef LAYER_ALPHA_ORIG -#else -#include "mario/geo.inc.c" -#endif diff --git a/actors/mario_cap/geo.inc.c b/actors/mario_cap/geo.inc.c index 04634be0..5e59c311 100644 --- a/actors/mario_cap/geo.inc.c +++ b/actors/mario_cap/geo.inc.c @@ -7,7 +7,7 @@ const GeoLayout marios_cap_geo[] = { GEO_ASM(10, geo_update_layer_transparency), GEO_SWITCH_CASE(2, geo_switch_anim_state), GEO_OPEN_NODE(), - GEO_DISPLAY_LIST(LAYER_SILHOUETTE_OPAQUE, mario_cap_seg3_dl_03022F48), + GEO_DISPLAY_LIST(LAYER_OPAQUE, mario_cap_seg3_dl_03022F48), GEO_DISPLAY_LIST(LAYER_TRANSPARENT, mario_cap_seg3_dl_03022F48), GEO_CLOSE_NODE(), GEO_CLOSE_NODE(), @@ -24,7 +24,7 @@ const GeoLayout marios_metal_cap_geo[] = { GEO_ASM(10, geo_update_layer_transparency), GEO_SWITCH_CASE(2, geo_switch_anim_state), GEO_OPEN_NODE(), - GEO_DISPLAY_LIST(LAYER_SILHOUETTE_OPAQUE, mario_cap_seg3_dl_03022FF8), + GEO_DISPLAY_LIST(LAYER_OPAQUE, mario_cap_seg3_dl_03022FF8), GEO_DISPLAY_LIST(LAYER_TRANSPARENT, mario_cap_seg3_dl_03022FF8), GEO_CLOSE_NODE(), GEO_CLOSE_NODE(), @@ -43,8 +43,8 @@ const GeoLayout marios_wing_cap_geo[] = { GEO_OPEN_NODE(), GEO_NODE_START(), GEO_OPEN_NODE(), - GEO_DISPLAY_LIST(LAYER_SILHOUETTE_OPAQUE, mario_cap_seg3_dl_03022F48), - GEO_DISPLAY_LIST(LAYER_SILHOUETTE_ALPHA, mario_cap_seg3_dl_030230B0), + GEO_DISPLAY_LIST(LAYER_OPAQUE, mario_cap_seg3_dl_03022F48), + GEO_DISPLAY_LIST(LAYER_ALPHA, mario_cap_seg3_dl_030230B0), GEO_CLOSE_NODE(), GEO_NODE_START(), GEO_OPEN_NODE(), @@ -67,8 +67,8 @@ const GeoLayout marios_winged_metal_cap_geo[] = { GEO_OPEN_NODE(), GEO_NODE_START(), GEO_OPEN_NODE(), - GEO_DISPLAY_LIST(LAYER_SILHOUETTE_OPAQUE, mario_cap_seg3_dl_03022FF8), - GEO_DISPLAY_LIST(LAYER_SILHOUETTE_ALPHA, mario_cap_seg3_dl_03023108), + GEO_DISPLAY_LIST(LAYER_OPAQUE, mario_cap_seg3_dl_03022FF8), + GEO_DISPLAY_LIST(LAYER_ALPHA, mario_cap_seg3_dl_03023108), GEO_CLOSE_NODE(), GEO_NODE_START(), GEO_OPEN_NODE(), diff --git a/data/behavior_data.c b/data/behavior_data.c index b8f8e073..d2b4dc77 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -3429,7 +3429,7 @@ UNUSED static const u64 behavior_data_unused_0 = 0; const BehaviorScript bhvMario[] = { BEGIN(OBJ_LIST_PLAYER), SET_INT(oIntangibleTimer, 0), - OR_INT(oFlags, OBJ_FLAG_PLAYER), + OR_LONG(oFlags, (OBJ_FLAG_PLAYER | OBJ_FLAG_SILHOUETTE)), OR_INT(oUnk94, 0x0001), SET_HITBOX(/*Radius*/ 37, /*Height*/ 160), BEGIN_LOOP(), @@ -4472,7 +4472,7 @@ const BehaviorScript bhvBigBoulderGenerator[] = { const BehaviorScript bhvWingCap[] = { BEGIN(OBJ_LIST_LEVEL), - 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_SILHOUETTE)), CALL_NATIVE(bhv_wing_cap_init), BEGIN_LOOP(), CALL_NATIVE(bhv_wing_vanish_cap_loop), @@ -4481,7 +4481,7 @@ const BehaviorScript bhvWingCap[] = { const BehaviorScript bhvMetalCap[] = { BEGIN(OBJ_LIST_LEVEL), - 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_SILHOUETTE)), CALL_NATIVE(bhv_metal_cap_init), BEGIN_LOOP(), CALL_NATIVE(bhv_metal_cap_loop), @@ -4490,7 +4490,7 @@ const BehaviorScript bhvMetalCap[] = { const BehaviorScript bhvNormalCap[] = { BEGIN(OBJ_LIST_LEVEL), - 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_SILHOUETTE)), CALL_NATIVE(bhv_normal_cap_init), BEGIN_LOOP(), SET_INT(oIntangibleTimer, 0), @@ -4500,7 +4500,7 @@ const BehaviorScript bhvNormalCap[] = { const BehaviorScript bhvVanishCap[] = { BEGIN(OBJ_LIST_LEVEL), - 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_SILHOUETTE)), CALL_NATIVE(bhv_vanish_cap_init), BEGIN_LOOP(), CALL_NATIVE(bhv_wing_vanish_cap_loop), diff --git a/include/object_constants.h b/include/object_constants.h index 6ddfe4bf..94cbbb07 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -47,12 +47,13 @@ #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_SILHOUETTE (1 << 19) // 0x00080000 #define OBJ_FLAG_HITBOX_WAS_SET (1 << 30) // 0x40000000 /* oHeldState */ -#define HELD_FREE 0 -#define HELD_HELD 1 -#define HELD_THROWN 2 +#define HELD_FREE 0 +#define HELD_HELD 1 +#define HELD_THROWN 2 #define HELD_DROPPED 3 /* oDialogState */ diff --git a/include/types.h b/include/types.h index 7e65a583..d484a401 100644 --- a/include/types.h +++ b/include/types.h @@ -177,7 +177,6 @@ struct GraphNodeObject /*0x4C*/ struct SpawnInfo *spawnInfo; /*0x50*/ Mat4 *throwMatrix; // matrix ptr /*0x54*/ Vec3f cameraToObject; - u8 uCode; }; struct ObjectNode diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index d1542bb3..b523e148 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -981,11 +981,17 @@ void cur_obj_update(void) { obj_update_gfx_pos_and_angle(gCurrentObject); } + if (objFlags & OBJ_FLAG_UCODE_LARGE) { + gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_UCODE_REJ; + } else { + gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_UCODE_REJ; + } - if (objFlags & OBJ_FLAG_UCODE_LARGE) - gCurrentObject->header.gfx.uCode = UCODE_DEFAULT; - else - gCurrentObject->header.gfx.uCode = UCODE_REJ; + if (objFlags & OBJ_FLAG_SILHOUETTE) { + gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_SILHOUETTE; + } else { + gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_SILHOUETTE; + } #ifdef PUPPYLIGHTS puppylights_object_emit(gCurrentObject); diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index d9e3c4ad..51d77a25 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -9,15 +9,14 @@ #include "geo_commands.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) #define GRAPH_RENDER_Z_BUFFER (1 << 3) #define GRAPH_RENDER_INVISIBLE (1 << 4) #define GRAPH_RENDER_HAS_ANIMATION (1 << 5) +#define GRAPH_RENDER_UCODE_REJ (1 << 6) +#define GRAPH_RENDER_SILHOUETTE (1 << 7) // Whether the node type has a function pointer of type GraphNodeFunc #define GRAPH_NODE_TYPE_FUNCTIONAL 0x100 diff --git a/src/game/behaviors/ukiki.inc.c b/src/game/behaviors/ukiki.inc.c index fc5d00c9..45854449 100644 --- a/src/game/behaviors/ukiki.inc.c +++ b/src/game/behaviors/ukiki.inc.c @@ -45,7 +45,7 @@ Gfx *geo_update_projectile_pos_from_parent_copy(s32 run,UNUSED struct GraphNode if (run == TRUE) { // TODO: change global type to Object pointer - obj = (struct Object*)gCurGraphNodeObject; + obj = (struct Object *) gCurGraphNodeObject; if (obj->prevObj != NULL) { create_transformation_from_matrices(mtx2, mtx, *gCurGraphNodeCamera->matrixPtr); diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 5c90fae0..253ea0d4 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -222,7 +222,6 @@ LookAt lookAt; gDPSetRenderMode( (gfx)++, (mode1List->modes[(i)] & ~IM_RD), \ (mode2List->modes[(i)] & ~IM_RD)); /* Use normal mode list, no AA */ \ } -#define IS_LAYER_SILHOUETTE(layer) (((layer) >= LAYER_SILHOUETTE_FIRST) || ((layer) <= LAYER_SILHOUETTE_LAST)) #endif u8 ucodeTestSwitch = 1; @@ -339,6 +338,8 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { #if SILHOUETTE #undef SIL_CVG_THRESHOLD #undef SCHWA +#undef SET_SILHOUETTE_F3D +#undef CLEAR_SILHOUETTE_F3D #endif /** @@ -351,11 +352,21 @@ static void geo_append_display_list(void *displayList, s32 layer) { #ifdef F3DEX_GBI_2 gSPLookAt(gDisplayListHead++, &lookAt); #endif +#if defined(F3DZEX_GBI_2) || (SILHOUETTE > 0) + if (gCurGraphNodeObject != NULL) { #ifdef F3DZEX_GBI_2 - if (gCurGraphNodeObject != NULL) - { - if (gCurGraphNodeObject->uCode == UCODE_REJ && ucodeTestSwitch) + if (gCurGraphNodeObject->node.flags & GRAPH_RENDER_UCODE_REJ && ucodeTestSwitch) { index = 1; + } +#endif +#if SILHOUETTE + if (gCurGraphNodeObject->node.flags & GRAPH_RENDER_SILHOUETTE) { + switch (layer) { + case LAYER_OPAQUE: layer = LAYER_SILHOUETTE_OPAQUE; break; + case LAYER_ALPHA: layer = LAYER_SILHOUETTE_ALPHA; break; + } + } +#endif } #endif if (gCurGraphNodeMasterList != 0) { @@ -382,8 +393,8 @@ 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++) { - node->listHeads[0][i] = NULL; - node->listHeads[1][i] = NULL; + node->listHeads[LIST_HEADS_ZEX][i] = NULL; + node->listHeads[LIST_HEADS_REJ][i] = NULL; } geo_process_node_and_siblings(node->node.children); geo_process_master_list_sub(gCurGraphNodeMasterList); diff --git a/src/game/rendering_graph_node.h b/src/game/rendering_graph_node.h index 56407ffb..d096a30a 100644 --- a/src/game/rendering_graph_node.h +++ b/src/game/rendering_graph_node.h @@ -35,6 +35,8 @@ extern f32 gWorldScale; #define IS_LAYER_NON_ZB(layer) (((layer) >= LAYER_FIRST_NON_ZB) || ((layer) <= LAYER_LAST_ALL)) #if SILHOUETTE +#define IS_LAYER_SILHOUETTE(layer) (((layer) >= LAYER_SILHOUETTE_FIRST) || ((layer) <= LAYER_SILHOUETTE_LAST)) + #define RENDER_PHASE_REJ_ZB 0 #define RENDER_PHASE_ZEX_BEFORE_SILHOUETTE 1 #define RENDER_PHASE_REJ_SILHOUETTE 2 @@ -47,6 +49,7 @@ extern f32 gWorldScale; #define RENDER_PHASE_ZEX_ALL 1 #define RENDER_PHASE_REJ_NON_ZB 2 #endif + #define RENDER_PHASE_FIRST RENDER_PHASE_REJ_ZB #define RENDER_PHASE_LAST RENDER_PHASE_REJ_NON_ZB diff --git a/src/game/spawn_object.c b/src/game/spawn_object.c index f0064eec..a2dc0649 100644 --- a/src/game/spawn_object.c +++ b/src/game/spawn_object.c @@ -282,11 +282,11 @@ struct Object *allocate_object(struct ObjectNode *objList) { obj->oRoom = -1; obj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; + obj->header.gfx.node.flags |= GRAPH_RENDER_UCODE_REJ; obj->header.gfx.pos[0] = -10000.0f; 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