From 053d4902ed356c41cfce08e32a4e47751ca26958 Mon Sep 17 00:00:00 2001 From: Isaac0-dev <62234577+Isaac0-dev@users.noreply.github.com> Date: Sun, 19 Feb 2023 07:06:03 +1000 Subject: [PATCH] allow mods to hide and move shadows for small objects (#257) --- autogen/lua_definitions/structs.lua | 4 ++++ docs/lua/structs.md | 4 ++++ include/types.h | 3 +++ src/game/rendering_graph_node.c | 27 ++++++++++++++++----------- src/pc/lua/smlua_cobject_autogen.c | 8 ++++++-- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/autogen/lua_definitions/structs.lua b/autogen/lua_definitions/structs.lua index 230fc29c..8ebf8bd3 100644 --- a/autogen/lua_definitions/structs.lua +++ b/autogen/lua_definitions/structs.lua @@ -555,6 +555,7 @@ --- @field public animInfo AnimInfo --- @field public areaIndex integer --- @field public cameraToObject Vec3f +--- @field public disableAutomaticShadowPos boolean --- @field public node GraphNode --- @field public pos Vec3f --- @field public prevAngle Vec3s @@ -567,6 +568,8 @@ --- @field public prevThrowMatrixTimestamp integer --- @field public prevTimestamp integer --- @field public scale Vec3f +--- @field public shadowInvisible boolean +--- @field public shadowPos Vec3f --- @field public sharedChild GraphNode --- @field public skipInViewCheck boolean --- @field public skipInterpolationTimestamp integer @@ -756,6 +759,7 @@ --- @field public unkC4 number --- @field public usedObj Object --- @field public vel Vec3f +--- @field public visibleToEnemies integer --- @field public wall Surface --- @field public wallKickTimer integer --- @field public wallNormal Vec3f diff --git a/docs/lua/structs.md b/docs/lua/structs.md index 35d4dc1e..f8b1ac37 100644 --- a/docs/lua/structs.md +++ b/docs/lua/structs.md @@ -818,6 +818,7 @@ | animInfo | [AnimInfo](structs.md#AnimInfo) | read-only | | areaIndex | `integer` | | | cameraToObject | [Vec3f](structs.md#Vec3f) | read-only | +| disableAutomaticShadowPos | `boolean` | | | node | [GraphNode](structs.md#GraphNode) | read-only | | pos | [Vec3f](structs.md#Vec3f) | read-only | | prevAngle | [Vec3s](structs.md#Vec3s) | read-only | @@ -830,6 +831,8 @@ | prevThrowMatrixTimestamp | `integer` | | | prevTimestamp | `integer` | | | scale | [Vec3f](structs.md#Vec3f) | read-only | +| shadowInvisible | `boolean` | | +| shadowPos | [Vec3f](structs.md#Vec3f) | read-only | | sharedChild | [GraphNode](structs.md#GraphNode) | | | skipInViewCheck | `boolean` | | | skipInterpolationTimestamp | `integer` | | @@ -1082,6 +1085,7 @@ | unkC4 | `number` | | | usedObj | [Object](structs.md#Object) | | | vel | [Vec3f](structs.md#Vec3f) | read-only | +| visibleToEnemies | `integer` | | | wall | [Surface](structs.md#Surface) | | | wallKickTimer | `integer` | | | wallNormal | [Vec3f](structs.md#Vec3f) | read-only | diff --git a/include/types.h b/include/types.h index d84a84fd..003c11e5 100644 --- a/include/types.h +++ b/include/types.h @@ -145,8 +145,11 @@ struct GraphNodeObject Vec3s prevAngle; Vec3f prevPos; u32 prevTimestamp; + Vec3f shadowPos; Vec3f prevShadowPos; u32 prevShadowPosTimestamp; + bool shadowInvisible; + bool disableAutomaticShadowPos; /*0x2C*/ Vec3f scale; Vec3f prevScale; u32 prevScaleTimestamp; diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index f3c1cfbb..fa4c752e 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -973,7 +973,6 @@ void geo_set_animation_globals(struct AnimInfo *node, s32 hasAnimation) { */ static void geo_process_shadow(struct GraphNodeShadow *node) { Mat4 mtxf; - Vec3f shadowPos; Vec3f shadowPosPrev; Vec3f animOffset; f32 shadowScale; @@ -983,11 +982,13 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { if (gCurGraphNodeCamera != NULL && gCurGraphNodeObject != NULL) { if (gCurGraphNodeHeldObject != NULL) { - get_pos_from_transform_mtx(shadowPos, gMatStack[gMatStackIndex], + get_pos_from_transform_mtx(gCurGraphNodeObject->shadowPos, gMatStack[gMatStackIndex], *gCurGraphNodeCamera->matrixPtr); shadowScale = node->shadowScale; } else { - vec3f_copy(shadowPos, gCurGraphNodeObject->pos); + if (!gCurGraphNodeObject->disableAutomaticShadowPos) { + vec3f_copy(gCurGraphNodeObject->shadowPos, gCurGraphNodeObject->pos); + } shadowScale = node->shadowScale * gCurGraphNodeObject->scale[0]; } @@ -1013,8 +1014,8 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { f32 sinAng = sins(gCurGraphNodeObject->angle[1]); f32 cosAng = coss(gCurGraphNodeObject->angle[1]); - shadowPos[0] += animOffset[0] * cosAng + animOffset[2] * sinAng; - shadowPos[2] += -animOffset[0] * sinAng + animOffset[2] * cosAng; + gCurGraphNodeObject->shadowPos[0] += animOffset[0] * cosAng + animOffset[2] * sinAng; + gCurGraphNodeObject->shadowPos[2] += -animOffset[0] * sinAng + animOffset[2] * cosAng; } } @@ -1023,10 +1024,10 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { if (gGlobalTimer == gCurGraphNodeHeldObject->prevShadowPosTimestamp + 1) { vec3f_copy(shadowPosPrev, gCurGraphNodeHeldObject->prevShadowPos); } else { - vec3f_copy(shadowPosPrev, shadowPos); + vec3f_copy(shadowPosPrev, gCurGraphNodeObject->shadowPos); } - vec3f_copy(gCurGraphNodeHeldObject->prevShadowPos, shadowPos); + vec3f_copy(gCurGraphNodeHeldObject->prevShadowPos, gCurGraphNodeObject->shadowPos); gCurGraphNodeHeldObject->prevShadowPosTimestamp = gGlobalTimer; } else { if (gGlobalTimer == gCurGraphNodeObject->prevShadowPosTimestamp + 1 && @@ -1034,9 +1035,9 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { gGlobalTimer != gLakituState.skipCameraInterpolationTimestamp) { vec3f_copy(shadowPosPrev, gCurGraphNodeObject->prevShadowPos); } else { - vec3f_copy(shadowPosPrev, shadowPos); + vec3f_copy(shadowPosPrev, gCurGraphNodeObject->shadowPos); } - vec3f_copy(gCurGraphNodeObject->prevShadowPos, shadowPos); + vec3f_copy(gCurGraphNodeObject->prevShadowPos, gCurGraphNodeObject->shadowPos); gCurGraphNodeObject->prevShadowPosTimestamp = gGlobalTimer; } @@ -1047,7 +1048,7 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { interp->node = node; interp->shadowScale = shadowScale; interp->obj = gCurGraphNodeObject; - vec3f_copy(interp->shadowPos, shadowPos); + vec3f_copy(interp->shadowPos, gCurGraphNodeObject->shadowPos); vec3f_copy(interp->shadowPosPrev, shadowPosPrev); } else { gShadowInterpCurrent = NULL; @@ -1061,8 +1062,12 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { gShadowInterpCurrent->gfx = shadowListPrev; } + if (gCurGraphNodeObject->shadowInvisible) { + shadowListPrev = NULL; + } + if (shadowListPrev != NULL) { - mtxf_translate(mtxf, shadowPos); + mtxf_translate(mtxf, gCurGraphNodeObject->shadowPos); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, *gCurGraphNodeCamera->matrixPtr); mtxf_translate(mtxf, shadowPosPrev); mtxf_mul(gMatStackPrev[gMatStackIndex + 1], mtxf, *gCurGraphNodeCamera->matrixPtrPrev); diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index d65db294..84e3124b 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -636,13 +636,14 @@ static struct LuaObjectField sGraphNodeFields[LUA_GRAPH_NODE_FIELD_COUNT] = { { "type", LVT_S16, offsetof(struct GraphNode, type), false, LOT_NONE }, }; -#define LUA_GRAPH_NODE_OBJECT_FIELD_COUNT 23 +#define LUA_GRAPH_NODE_OBJECT_FIELD_COUNT 26 static struct LuaObjectField sGraphNodeObjectFields[LUA_GRAPH_NODE_OBJECT_FIELD_COUNT] = { { "activeAreaIndex", LVT_S8, offsetof(struct GraphNodeObject, activeAreaIndex), false, LOT_NONE }, { "angle", LVT_COBJECT, offsetof(struct GraphNodeObject, angle), true, LOT_VEC3S }, { "animInfo", LVT_COBJECT, offsetof(struct GraphNodeObject, animInfo), true, LOT_ANIMINFO }, { "areaIndex", LVT_S8, offsetof(struct GraphNodeObject, areaIndex), false, LOT_NONE }, { "cameraToObject", LVT_COBJECT, offsetof(struct GraphNodeObject, cameraToObject), true, LOT_VEC3F }, + { "disableAutomaticShadowPos", LVT_BOOL, offsetof(struct GraphNodeObject, disableAutomaticShadowPos), false, LOT_NONE }, { "node", LVT_COBJECT, offsetof(struct GraphNodeObject, node), true, LOT_GRAPHNODE }, { "pos", LVT_COBJECT, offsetof(struct GraphNodeObject, pos), true, LOT_VEC3F }, { "prevAngle", LVT_COBJECT, offsetof(struct GraphNodeObject, prevAngle), true, LOT_VEC3S }, @@ -655,6 +656,8 @@ static struct LuaObjectField sGraphNodeObjectFields[LUA_GRAPH_NODE_OBJECT_FIELD_ { "prevThrowMatrixTimestamp", LVT_U32, offsetof(struct GraphNodeObject, prevThrowMatrixTimestamp), false, LOT_NONE }, { "prevTimestamp", LVT_U32, offsetof(struct GraphNodeObject, prevTimestamp), false, LOT_NONE }, { "scale", LVT_COBJECT, offsetof(struct GraphNodeObject, scale), true, LOT_VEC3F }, + { "shadowInvisible", LVT_BOOL, offsetof(struct GraphNodeObject, shadowInvisible), false, LOT_NONE }, + { "shadowPos", LVT_COBJECT, offsetof(struct GraphNodeObject, shadowPos), true, LOT_VEC3F }, { "sharedChild", LVT_COBJECT_P, offsetof(struct GraphNodeObject, sharedChild), false, LOT_GRAPHNODE }, { "skipInViewCheck", LVT_BOOL, offsetof(struct GraphNodeObject, skipInViewCheck), false, LOT_NONE }, { "skipInterpolationTimestamp", LVT_U32, offsetof(struct GraphNodeObject, skipInterpolationTimestamp), false, LOT_NONE }, @@ -796,7 +799,7 @@ static struct LuaObjectField sMarioBodyStateFields[LUA_MARIO_BODY_STATE_FIELD_CO { "wingFlutter", LVT_S8, offsetof(struct MarioBodyState, wingFlutter), false, LOT_NONE }, }; -#define LUA_MARIO_STATE_FIELD_COUNT 76 +#define LUA_MARIO_STATE_FIELD_COUNT 77 static struct LuaObjectField sMarioStateFields[LUA_MARIO_STATE_FIELD_COUNT] = { { "action", LVT_U32, offsetof(struct MarioState, action), false, LOT_NONE }, { "actionArg", LVT_U32, offsetof(struct MarioState, actionArg), false, LOT_NONE }, @@ -869,6 +872,7 @@ static struct LuaObjectField sMarioStateFields[LUA_MARIO_STATE_FIELD_COUNT] = { { "unkC4", LVT_F32, offsetof(struct MarioState, unkC4), false, LOT_NONE }, { "usedObj", LVT_COBJECT_P, offsetof(struct MarioState, usedObj), false, LOT_OBJECT }, { "vel", LVT_COBJECT, offsetof(struct MarioState, vel), true, LOT_VEC3F }, + { "visibleToEnemies", LVT_U8, offsetof(struct MarioState, visibleToEnemies), false, LOT_NONE }, { "wall", LVT_COBJECT_P, offsetof(struct MarioState, wall), false, LOT_SURFACE }, { "wallKickTimer", LVT_U8, offsetof(struct MarioState, wallKickTimer), false, LOT_NONE }, { "wallNormal", LVT_COBJECT, offsetof(struct MarioState, wallNormal), true, LOT_VEC3F },