Fix silhouette

This commit is contained in:
Arceveti
2021-09-21 12:25:56 -07:00
parent bd9165686d
commit 59d609fb07
11 changed files with 49 additions and 46 deletions

View File

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

View File

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

View File

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

View File

@@ -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 */

View File

@@ -177,7 +177,6 @@ struct GraphNodeObject
/*0x4C*/ struct SpawnInfo *spawnInfo;
/*0x50*/ Mat4 *throwMatrix; // matrix ptr
/*0x54*/ Vec3f cameraToObject;
u8 uCode;
};
struct ObjectNode

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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