mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-22 12:05:11 +00:00
allow mods to hide and move shadows for small objects (#257)
This commit is contained in:
parent
76038a20e4
commit
053d4902ed
5 changed files with 33 additions and 13 deletions
|
@ -555,6 +555,7 @@
|
||||||
--- @field public animInfo AnimInfo
|
--- @field public animInfo AnimInfo
|
||||||
--- @field public areaIndex integer
|
--- @field public areaIndex integer
|
||||||
--- @field public cameraToObject Vec3f
|
--- @field public cameraToObject Vec3f
|
||||||
|
--- @field public disableAutomaticShadowPos boolean
|
||||||
--- @field public node GraphNode
|
--- @field public node GraphNode
|
||||||
--- @field public pos Vec3f
|
--- @field public pos Vec3f
|
||||||
--- @field public prevAngle Vec3s
|
--- @field public prevAngle Vec3s
|
||||||
|
@ -567,6 +568,8 @@
|
||||||
--- @field public prevThrowMatrixTimestamp integer
|
--- @field public prevThrowMatrixTimestamp integer
|
||||||
--- @field public prevTimestamp integer
|
--- @field public prevTimestamp integer
|
||||||
--- @field public scale Vec3f
|
--- @field public scale Vec3f
|
||||||
|
--- @field public shadowInvisible boolean
|
||||||
|
--- @field public shadowPos Vec3f
|
||||||
--- @field public sharedChild GraphNode
|
--- @field public sharedChild GraphNode
|
||||||
--- @field public skipInViewCheck boolean
|
--- @field public skipInViewCheck boolean
|
||||||
--- @field public skipInterpolationTimestamp integer
|
--- @field public skipInterpolationTimestamp integer
|
||||||
|
@ -756,6 +759,7 @@
|
||||||
--- @field public unkC4 number
|
--- @field public unkC4 number
|
||||||
--- @field public usedObj Object
|
--- @field public usedObj Object
|
||||||
--- @field public vel Vec3f
|
--- @field public vel Vec3f
|
||||||
|
--- @field public visibleToEnemies integer
|
||||||
--- @field public wall Surface
|
--- @field public wall Surface
|
||||||
--- @field public wallKickTimer integer
|
--- @field public wallKickTimer integer
|
||||||
--- @field public wallNormal Vec3f
|
--- @field public wallNormal Vec3f
|
||||||
|
|
|
@ -818,6 +818,7 @@
|
||||||
| animInfo | [AnimInfo](structs.md#AnimInfo) | read-only |
|
| animInfo | [AnimInfo](structs.md#AnimInfo) | read-only |
|
||||||
| areaIndex | `integer` | |
|
| areaIndex | `integer` | |
|
||||||
| cameraToObject | [Vec3f](structs.md#Vec3f) | read-only |
|
| cameraToObject | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
|
| disableAutomaticShadowPos | `boolean` | |
|
||||||
| node | [GraphNode](structs.md#GraphNode) | read-only |
|
| node | [GraphNode](structs.md#GraphNode) | read-only |
|
||||||
| pos | [Vec3f](structs.md#Vec3f) | read-only |
|
| pos | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
| prevAngle | [Vec3s](structs.md#Vec3s) | read-only |
|
| prevAngle | [Vec3s](structs.md#Vec3s) | read-only |
|
||||||
|
@ -830,6 +831,8 @@
|
||||||
| prevThrowMatrixTimestamp | `integer` | |
|
| prevThrowMatrixTimestamp | `integer` | |
|
||||||
| prevTimestamp | `integer` | |
|
| prevTimestamp | `integer` | |
|
||||||
| scale | [Vec3f](structs.md#Vec3f) | read-only |
|
| scale | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
|
| shadowInvisible | `boolean` | |
|
||||||
|
| shadowPos | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
| sharedChild | [GraphNode](structs.md#GraphNode) | |
|
| sharedChild | [GraphNode](structs.md#GraphNode) | |
|
||||||
| skipInViewCheck | `boolean` | |
|
| skipInViewCheck | `boolean` | |
|
||||||
| skipInterpolationTimestamp | `integer` | |
|
| skipInterpolationTimestamp | `integer` | |
|
||||||
|
@ -1082,6 +1085,7 @@
|
||||||
| unkC4 | `number` | |
|
| unkC4 | `number` | |
|
||||||
| usedObj | [Object](structs.md#Object) | |
|
| usedObj | [Object](structs.md#Object) | |
|
||||||
| vel | [Vec3f](structs.md#Vec3f) | read-only |
|
| vel | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
|
| visibleToEnemies | `integer` | |
|
||||||
| wall | [Surface](structs.md#Surface) | |
|
| wall | [Surface](structs.md#Surface) | |
|
||||||
| wallKickTimer | `integer` | |
|
| wallKickTimer | `integer` | |
|
||||||
| wallNormal | [Vec3f](structs.md#Vec3f) | read-only |
|
| wallNormal | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
|
|
|
@ -145,8 +145,11 @@ struct GraphNodeObject
|
||||||
Vec3s prevAngle;
|
Vec3s prevAngle;
|
||||||
Vec3f prevPos;
|
Vec3f prevPos;
|
||||||
u32 prevTimestamp;
|
u32 prevTimestamp;
|
||||||
|
Vec3f shadowPos;
|
||||||
Vec3f prevShadowPos;
|
Vec3f prevShadowPos;
|
||||||
u32 prevShadowPosTimestamp;
|
u32 prevShadowPosTimestamp;
|
||||||
|
bool shadowInvisible;
|
||||||
|
bool disableAutomaticShadowPos;
|
||||||
/*0x2C*/ Vec3f scale;
|
/*0x2C*/ Vec3f scale;
|
||||||
Vec3f prevScale;
|
Vec3f prevScale;
|
||||||
u32 prevScaleTimestamp;
|
u32 prevScaleTimestamp;
|
||||||
|
|
|
@ -973,7 +973,6 @@ void geo_set_animation_globals(struct AnimInfo *node, s32 hasAnimation) {
|
||||||
*/
|
*/
|
||||||
static void geo_process_shadow(struct GraphNodeShadow *node) {
|
static void geo_process_shadow(struct GraphNodeShadow *node) {
|
||||||
Mat4 mtxf;
|
Mat4 mtxf;
|
||||||
Vec3f shadowPos;
|
|
||||||
Vec3f shadowPosPrev;
|
Vec3f shadowPosPrev;
|
||||||
Vec3f animOffset;
|
Vec3f animOffset;
|
||||||
f32 shadowScale;
|
f32 shadowScale;
|
||||||
|
@ -983,11 +982,13 @@ static void geo_process_shadow(struct GraphNodeShadow *node) {
|
||||||
|
|
||||||
if (gCurGraphNodeCamera != NULL && gCurGraphNodeObject != NULL) {
|
if (gCurGraphNodeCamera != NULL && gCurGraphNodeObject != NULL) {
|
||||||
if (gCurGraphNodeHeldObject != NULL) {
|
if (gCurGraphNodeHeldObject != NULL) {
|
||||||
get_pos_from_transform_mtx(shadowPos, gMatStack[gMatStackIndex],
|
get_pos_from_transform_mtx(gCurGraphNodeObject->shadowPos, gMatStack[gMatStackIndex],
|
||||||
*gCurGraphNodeCamera->matrixPtr);
|
*gCurGraphNodeCamera->matrixPtr);
|
||||||
shadowScale = node->shadowScale;
|
shadowScale = node->shadowScale;
|
||||||
} else {
|
} else {
|
||||||
vec3f_copy(shadowPos, gCurGraphNodeObject->pos);
|
if (!gCurGraphNodeObject->disableAutomaticShadowPos) {
|
||||||
|
vec3f_copy(gCurGraphNodeObject->shadowPos, gCurGraphNodeObject->pos);
|
||||||
|
}
|
||||||
shadowScale = node->shadowScale * gCurGraphNodeObject->scale[0];
|
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 sinAng = sins(gCurGraphNodeObject->angle[1]);
|
||||||
f32 cosAng = coss(gCurGraphNodeObject->angle[1]);
|
f32 cosAng = coss(gCurGraphNodeObject->angle[1]);
|
||||||
|
|
||||||
shadowPos[0] += animOffset[0] * cosAng + animOffset[2] * sinAng;
|
gCurGraphNodeObject->shadowPos[0] += animOffset[0] * cosAng + animOffset[2] * sinAng;
|
||||||
shadowPos[2] += -animOffset[0] * sinAng + animOffset[2] * cosAng;
|
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) {
|
if (gGlobalTimer == gCurGraphNodeHeldObject->prevShadowPosTimestamp + 1) {
|
||||||
vec3f_copy(shadowPosPrev, gCurGraphNodeHeldObject->prevShadowPos);
|
vec3f_copy(shadowPosPrev, gCurGraphNodeHeldObject->prevShadowPos);
|
||||||
} else {
|
} else {
|
||||||
vec3f_copy(shadowPosPrev, shadowPos);
|
vec3f_copy(shadowPosPrev, gCurGraphNodeObject->shadowPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3f_copy(gCurGraphNodeHeldObject->prevShadowPos, shadowPos);
|
vec3f_copy(gCurGraphNodeHeldObject->prevShadowPos, gCurGraphNodeObject->shadowPos);
|
||||||
gCurGraphNodeHeldObject->prevShadowPosTimestamp = gGlobalTimer;
|
gCurGraphNodeHeldObject->prevShadowPosTimestamp = gGlobalTimer;
|
||||||
} else {
|
} else {
|
||||||
if (gGlobalTimer == gCurGraphNodeObject->prevShadowPosTimestamp + 1 &&
|
if (gGlobalTimer == gCurGraphNodeObject->prevShadowPosTimestamp + 1 &&
|
||||||
|
@ -1034,9 +1035,9 @@ static void geo_process_shadow(struct GraphNodeShadow *node) {
|
||||||
gGlobalTimer != gLakituState.skipCameraInterpolationTimestamp) {
|
gGlobalTimer != gLakituState.skipCameraInterpolationTimestamp) {
|
||||||
vec3f_copy(shadowPosPrev, gCurGraphNodeObject->prevShadowPos);
|
vec3f_copy(shadowPosPrev, gCurGraphNodeObject->prevShadowPos);
|
||||||
} else {
|
} else {
|
||||||
vec3f_copy(shadowPosPrev, shadowPos);
|
vec3f_copy(shadowPosPrev, gCurGraphNodeObject->shadowPos);
|
||||||
}
|
}
|
||||||
vec3f_copy(gCurGraphNodeObject->prevShadowPos, shadowPos);
|
vec3f_copy(gCurGraphNodeObject->prevShadowPos, gCurGraphNodeObject->shadowPos);
|
||||||
gCurGraphNodeObject->prevShadowPosTimestamp = gGlobalTimer;
|
gCurGraphNodeObject->prevShadowPosTimestamp = gGlobalTimer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1047,7 +1048,7 @@ static void geo_process_shadow(struct GraphNodeShadow *node) {
|
||||||
interp->node = node;
|
interp->node = node;
|
||||||
interp->shadowScale = shadowScale;
|
interp->shadowScale = shadowScale;
|
||||||
interp->obj = gCurGraphNodeObject;
|
interp->obj = gCurGraphNodeObject;
|
||||||
vec3f_copy(interp->shadowPos, shadowPos);
|
vec3f_copy(interp->shadowPos, gCurGraphNodeObject->shadowPos);
|
||||||
vec3f_copy(interp->shadowPosPrev, shadowPosPrev);
|
vec3f_copy(interp->shadowPosPrev, shadowPosPrev);
|
||||||
} else {
|
} else {
|
||||||
gShadowInterpCurrent = NULL;
|
gShadowInterpCurrent = NULL;
|
||||||
|
@ -1061,8 +1062,12 @@ static void geo_process_shadow(struct GraphNodeShadow *node) {
|
||||||
gShadowInterpCurrent->gfx = shadowListPrev;
|
gShadowInterpCurrent->gfx = shadowListPrev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gCurGraphNodeObject->shadowInvisible) {
|
||||||
|
shadowListPrev = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (shadowListPrev != NULL) {
|
if (shadowListPrev != NULL) {
|
||||||
mtxf_translate(mtxf, shadowPos);
|
mtxf_translate(mtxf, gCurGraphNodeObject->shadowPos);
|
||||||
mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, *gCurGraphNodeCamera->matrixPtr);
|
mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, *gCurGraphNodeCamera->matrixPtr);
|
||||||
mtxf_translate(mtxf, shadowPosPrev);
|
mtxf_translate(mtxf, shadowPosPrev);
|
||||||
mtxf_mul(gMatStackPrev[gMatStackIndex + 1], mtxf, *gCurGraphNodeCamera->matrixPtrPrev);
|
mtxf_mul(gMatStackPrev[gMatStackIndex + 1], mtxf, *gCurGraphNodeCamera->matrixPtrPrev);
|
||||||
|
|
|
@ -636,13 +636,14 @@ static struct LuaObjectField sGraphNodeFields[LUA_GRAPH_NODE_FIELD_COUNT] = {
|
||||||
{ "type", LVT_S16, offsetof(struct GraphNode, type), false, LOT_NONE },
|
{ "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] = {
|
static struct LuaObjectField sGraphNodeObjectFields[LUA_GRAPH_NODE_OBJECT_FIELD_COUNT] = {
|
||||||
{ "activeAreaIndex", LVT_S8, offsetof(struct GraphNodeObject, activeAreaIndex), false, LOT_NONE },
|
{ "activeAreaIndex", LVT_S8, offsetof(struct GraphNodeObject, activeAreaIndex), false, LOT_NONE },
|
||||||
{ "angle", LVT_COBJECT, offsetof(struct GraphNodeObject, angle), true, LOT_VEC3S },
|
{ "angle", LVT_COBJECT, offsetof(struct GraphNodeObject, angle), true, LOT_VEC3S },
|
||||||
{ "animInfo", LVT_COBJECT, offsetof(struct GraphNodeObject, animInfo), true, LOT_ANIMINFO },
|
{ "animInfo", LVT_COBJECT, offsetof(struct GraphNodeObject, animInfo), true, LOT_ANIMINFO },
|
||||||
{ "areaIndex", LVT_S8, offsetof(struct GraphNodeObject, areaIndex), false, LOT_NONE },
|
{ "areaIndex", LVT_S8, offsetof(struct GraphNodeObject, areaIndex), false, LOT_NONE },
|
||||||
{ "cameraToObject", LVT_COBJECT, offsetof(struct GraphNodeObject, cameraToObject), true, LOT_VEC3F },
|
{ "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 },
|
{ "node", LVT_COBJECT, offsetof(struct GraphNodeObject, node), true, LOT_GRAPHNODE },
|
||||||
{ "pos", LVT_COBJECT, offsetof(struct GraphNodeObject, pos), true, LOT_VEC3F },
|
{ "pos", LVT_COBJECT, offsetof(struct GraphNodeObject, pos), true, LOT_VEC3F },
|
||||||
{ "prevAngle", LVT_COBJECT, offsetof(struct GraphNodeObject, prevAngle), true, LOT_VEC3S },
|
{ "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 },
|
{ "prevThrowMatrixTimestamp", LVT_U32, offsetof(struct GraphNodeObject, prevThrowMatrixTimestamp), false, LOT_NONE },
|
||||||
{ "prevTimestamp", LVT_U32, offsetof(struct GraphNodeObject, prevTimestamp), false, LOT_NONE },
|
{ "prevTimestamp", LVT_U32, offsetof(struct GraphNodeObject, prevTimestamp), false, LOT_NONE },
|
||||||
{ "scale", LVT_COBJECT, offsetof(struct GraphNodeObject, scale), true, LOT_VEC3F },
|
{ "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 },
|
{ "sharedChild", LVT_COBJECT_P, offsetof(struct GraphNodeObject, sharedChild), false, LOT_GRAPHNODE },
|
||||||
{ "skipInViewCheck", LVT_BOOL, offsetof(struct GraphNodeObject, skipInViewCheck), false, LOT_NONE },
|
{ "skipInViewCheck", LVT_BOOL, offsetof(struct GraphNodeObject, skipInViewCheck), false, LOT_NONE },
|
||||||
{ "skipInterpolationTimestamp", LVT_U32, offsetof(struct GraphNodeObject, skipInterpolationTimestamp), 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 },
|
{ "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] = {
|
static struct LuaObjectField sMarioStateFields[LUA_MARIO_STATE_FIELD_COUNT] = {
|
||||||
{ "action", LVT_U32, offsetof(struct MarioState, action), false, LOT_NONE },
|
{ "action", LVT_U32, offsetof(struct MarioState, action), false, LOT_NONE },
|
||||||
{ "actionArg", LVT_U32, offsetof(struct MarioState, actionArg), 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 },
|
{ "unkC4", LVT_F32, offsetof(struct MarioState, unkC4), false, LOT_NONE },
|
||||||
{ "usedObj", LVT_COBJECT_P, offsetof(struct MarioState, usedObj), false, LOT_OBJECT },
|
{ "usedObj", LVT_COBJECT_P, offsetof(struct MarioState, usedObj), false, LOT_OBJECT },
|
||||||
{ "vel", LVT_COBJECT, offsetof(struct MarioState, vel), true, LOT_VEC3F },
|
{ "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 },
|
{ "wall", LVT_COBJECT_P, offsetof(struct MarioState, wall), false, LOT_SURFACE },
|
||||||
{ "wallKickTimer", LVT_U8, offsetof(struct MarioState, wallKickTimer), false, LOT_NONE },
|
{ "wallKickTimer", LVT_U8, offsetof(struct MarioState, wallKickTimer), false, LOT_NONE },
|
||||||
{ "wallNormal", LVT_COBJECT, offsetof(struct MarioState, wallNormal), true, LOT_VEC3F },
|
{ "wallNormal", LVT_COBJECT, offsetof(struct MarioState, wallNormal), true, LOT_VEC3F },
|
||||||
|
|
Loading…
Reference in a new issue