mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-25 13:35:12 +00:00
Rework First Person FOV
This commit is contained in:
parent
6419e53297
commit
2a0af8e216
14 changed files with 20 additions and 68 deletions
|
@ -115,7 +115,7 @@ override_disallowed_functions = {
|
||||||
"src/pc/lua/utils/smlua_text_utils.h": [ "smlua_text_utils_reset_all" ],
|
"src/pc/lua/utils/smlua_text_utils.h": [ "smlua_text_utils_reset_all" ],
|
||||||
"src/pc/lua/utils/smlua_anim_utils.h": [ "smlua_anim_util_reset", "smlua_anim_util_register_animation" ],
|
"src/pc/lua/utils/smlua_anim_utils.h": [ "smlua_anim_util_reset", "smlua_anim_util_register_animation" ],
|
||||||
"src/pc/network/lag_compensation.h": [ "lag_compensation_clear", "lag_compensation_store" ],
|
"src/pc/network/lag_compensation.h": [ "lag_compensation_clear", "lag_compensation_store" ],
|
||||||
"src/game/first_person_cam.h": [ "first_person_update" ]
|
"src/game/first_person_cam.h": [ "first_person_update", "get_dest_fov", "get_dest_near" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
override_hide_functions = {
|
override_hide_functions = {
|
||||||
|
|
|
@ -113,8 +113,7 @@ override_field_immutable = {
|
||||||
"ObjectWarpNode": [ "next "],
|
"ObjectWarpNode": [ "next "],
|
||||||
"Animation": [ "length" ],
|
"Animation": [ "length" ],
|
||||||
"AnimationTable": [ "count" ],
|
"AnimationTable": [ "count" ],
|
||||||
"Controller": [ "controllerData", "statusData" ],
|
"Controller": [ "controllerData", "statusData" ]
|
||||||
"FirstPersonCamera": [ "enabled" ],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override_field_version_excludes = {
|
override_field_version_excludes = {
|
||||||
|
|
|
@ -4016,12 +4016,6 @@ function get_first_person_enabled()
|
||||||
-- ...
|
-- ...
|
||||||
end
|
end
|
||||||
|
|
||||||
--- @param enable boolean
|
|
||||||
--- @return nil
|
|
||||||
function set_first_person_enabled(enable)
|
|
||||||
-- ...
|
|
||||||
end
|
|
||||||
|
|
||||||
--- @return nil
|
--- @return nil
|
||||||
function reset_dialog_override_color()
|
function reset_dialog_override_color()
|
||||||
-- ...
|
-- ...
|
||||||
|
|
|
@ -595,7 +595,6 @@
|
||||||
--- @field public crouch number
|
--- @field public crouch number
|
||||||
--- @field public enabled boolean
|
--- @field public enabled boolean
|
||||||
--- @field public forceRoll boolean
|
--- @field public forceRoll boolean
|
||||||
--- @field public fov number
|
|
||||||
--- @field public offset Vec3f
|
--- @field public offset Vec3f
|
||||||
--- @field public pitch integer
|
--- @field public pitch integer
|
||||||
--- @field public yaw integer
|
--- @field public yaw integer
|
||||||
|
|
|
@ -3322,26 +3322,6 @@
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
## [set_first_person_enabled](#set_first_person_enabled)
|
|
||||||
|
|
||||||
### Lua Example
|
|
||||||
`set_first_person_enabled(enable)`
|
|
||||||
|
|
||||||
### Parameters
|
|
||||||
| Field | Type |
|
|
||||||
| ----- | ---- |
|
|
||||||
| enable | `boolean` |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
- None
|
|
||||||
|
|
||||||
### C Prototype
|
|
||||||
`void set_first_person_enabled(bool enable);`
|
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
---
|
---
|
||||||
# functions from ingame_menu.h
|
# functions from ingame_menu.h
|
||||||
|
|
||||||
|
|
|
@ -803,7 +803,6 @@
|
||||||
- [first_person_check_cancels](functions-3.md#first_person_check_cancels)
|
- [first_person_check_cancels](functions-3.md#first_person_check_cancels)
|
||||||
- [first_person_reset](functions-3.md#first_person_reset)
|
- [first_person_reset](functions-3.md#first_person_reset)
|
||||||
- [get_first_person_enabled](functions-3.md#get_first_person_enabled)
|
- [get_first_person_enabled](functions-3.md#get_first_person_enabled)
|
||||||
- [set_first_person_enabled](functions-3.md#set_first_person_enabled)
|
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
|
|
|
@ -848,9 +848,8 @@
|
||||||
| ----- | ---- | ------ |
|
| ----- | ---- | ------ |
|
||||||
| centerL | `boolean` | |
|
| centerL | `boolean` | |
|
||||||
| crouch | `number` | |
|
| crouch | `number` | |
|
||||||
| enabled | `boolean` | read-only |
|
| enabled | `boolean` | |
|
||||||
| forceRoll | `boolean` | |
|
| forceRoll | `boolean` | |
|
||||||
| fov | `number` | |
|
|
||||||
| offset | [Vec3f](structs.md#Vec3f) | read-only |
|
| offset | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
| pitch | `integer` | |
|
| pitch | `integer` | |
|
||||||
| yaw | `integer` | |
|
| yaw | `integer` | |
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "mario.h"
|
#include "mario.h"
|
||||||
#include "hardcoded.h"
|
#include "hardcoded.h"
|
||||||
#include "save_file.h"
|
#include "save_file.h"
|
||||||
|
#include "rendering_graph_node.h"
|
||||||
|
|
||||||
#include "engine/math_util.h"
|
#include "engine/math_util.h"
|
||||||
|
|
||||||
|
@ -27,7 +28,6 @@ struct FirstPersonCamera gFirstPersonCamera = {
|
||||||
.pitch = 0,
|
.pitch = 0,
|
||||||
.yaw = 0,
|
.yaw = 0,
|
||||||
.crouch = 0,
|
.crouch = 0,
|
||||||
.fov = FIRST_PERSON_DEFAULT_FOV,
|
|
||||||
.offset = { 0, 0, 0 }
|
.offset = { 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -54,9 +54,12 @@ bool get_first_person_enabled(void) {
|
||||||
return gFirstPersonCamera.enabled && !first_person_check_cancels(&gMarioStates[0]);
|
return gFirstPersonCamera.enabled && !first_person_check_cancels(&gMarioStates[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_first_person_enabled(bool enable) {
|
f32 get_dest_fov(f32 fov) {
|
||||||
if (gFirstPersonCamera.enabled && !enable) { gFOVState.fov = 45.0f; }
|
return get_first_person_enabled() ? FIRST_PERSON_DEFAULT_FOV : not_zero(fov, gOverrideFOV);
|
||||||
gFirstPersonCamera.enabled = enable;
|
}
|
||||||
|
|
||||||
|
f32 get_dest_near(f32 near) {
|
||||||
|
return get_first_person_enabled() ? 1 : not_zero(near, gOverrideNear);
|
||||||
}
|
}
|
||||||
|
|
||||||
void first_person_camera_update(void) {
|
void first_person_camera_update(void) {
|
||||||
|
@ -143,8 +146,6 @@ void first_person_camera_update(void) {
|
||||||
gLakituState.focHSpeed = 0;
|
gLakituState.focHSpeed = 0;
|
||||||
gLakituState.focVSpeed = 0;
|
gLakituState.focVSpeed = 0;
|
||||||
vec3s_set(gLakituState.shakeMagnitude, 0, 0, 0);
|
vec3s_set(gLakituState.shakeMagnitude, 0, 0, 0);
|
||||||
|
|
||||||
gFOVState.fov = gFirstPersonCamera.fov;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void first_person_update(void) {
|
void first_person_update(void) {
|
||||||
|
@ -192,7 +193,6 @@ void first_person_reset(void) {
|
||||||
gFirstPersonCamera.pitch = 0;
|
gFirstPersonCamera.pitch = 0;
|
||||||
gFirstPersonCamera.yaw = 0;
|
gFirstPersonCamera.yaw = 0;
|
||||||
gFirstPersonCamera.crouch = 0;
|
gFirstPersonCamera.crouch = 0;
|
||||||
gFirstPersonCamera.fov = FIRST_PERSON_DEFAULT_FOV;
|
|
||||||
gFirstPersonCamera.offset[0] = 0;
|
gFirstPersonCamera.offset[0] = 0;
|
||||||
gFirstPersonCamera.offset[1] = 0;
|
gFirstPersonCamera.offset[1] = 0;
|
||||||
gFirstPersonCamera.offset[2] = 0;
|
gFirstPersonCamera.offset[2] = 0;
|
||||||
|
|
|
@ -15,7 +15,6 @@ struct FirstPersonCamera {
|
||||||
s16 pitch;
|
s16 pitch;
|
||||||
s16 yaw;
|
s16 yaw;
|
||||||
f32 crouch;
|
f32 crouch;
|
||||||
f32 fov;
|
|
||||||
Vec3f offset;
|
Vec3f offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -24,7 +23,9 @@ extern struct FirstPersonCamera gFirstPersonCamera;
|
||||||
bool first_person_check_cancels(struct MarioState *m);
|
bool first_person_check_cancels(struct MarioState *m);
|
||||||
|
|
||||||
bool get_first_person_enabled(void);
|
bool get_first_person_enabled(void);
|
||||||
void set_first_person_enabled(bool enable);
|
|
||||||
|
f32 get_dest_fov(f32 fov);
|
||||||
|
f32 get_dest_near(f32 near);
|
||||||
|
|
||||||
void first_person_update(void);
|
void first_person_update(void);
|
||||||
void first_person_reset(void);
|
void first_person_reset(void);
|
||||||
|
|
|
@ -237,7 +237,7 @@ void patch_mtx_interpolated(f32 delta) {
|
||||||
u16 perspNorm;
|
u16 perspNorm;
|
||||||
f32 fovInterpolated = delta_interpolate_f32(sPerspectiveNode->prevFov, sPerspectiveNode->fov, delta);
|
f32 fovInterpolated = delta_interpolate_f32(sPerspectiveNode->prevFov, sPerspectiveNode->fov, delta);
|
||||||
f32 near = MIN(sPerspectiveNode->near, gProjectionMaxNearValue);
|
f32 near = MIN(sPerspectiveNode->near, gProjectionMaxNearValue);
|
||||||
guPerspective(sPerspectiveMtx, &perspNorm, not_zero(fovInterpolated, gOverrideFOV), sPerspectiveAspect, get_first_person_enabled() ? 1 : not_zero(near, gOverrideNear), not_zero(sPerspectiveNode->far, gOverrideFar), 1.0f);
|
guPerspective(sPerspectiveMtx, &perspNorm, get_dest_fov(fovInterpolated), sPerspectiveAspect, get_dest_near(near), not_zero(sPerspectiveNode->far, gOverrideFar), 1.0f);
|
||||||
gSPMatrix(sPerspectivePos, VIRTUAL_TO_PHYSICAL(sPerspectiveNode), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
|
gSPMatrix(sPerspectivePos, VIRTUAL_TO_PHYSICAL(sPerspectiveNode), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,7 +488,7 @@ static void geo_process_perspective(struct GraphNodePerspective *node) {
|
||||||
gProjectionVanillaNearValue = node->near;
|
gProjectionVanillaNearValue = node->near;
|
||||||
gProjectionVanillaFarValue = node->far;
|
gProjectionVanillaFarValue = node->far;
|
||||||
f32 near = MIN(node->near, gProjectionMaxNearValue);
|
f32 near = MIN(node->near, gProjectionMaxNearValue);
|
||||||
guPerspective(mtx, &perspNorm, not_zero(node->prevFov, gOverrideFOV), aspect, get_first_person_enabled() ? 1 : not_zero(near, gOverrideNear), not_zero(node->far, gOverrideFar), 1.0f);
|
guPerspective(mtx, &perspNorm, get_dest_fov(node->prevFov), aspect, get_dest_near(near), not_zero(node->far, gOverrideFar), 1.0f);
|
||||||
|
|
||||||
sPerspectiveNode = node;
|
sPerspectiveNode = node;
|
||||||
sPerspectiveMtx = mtx;
|
sPerspectiveMtx = mtx;
|
||||||
|
@ -1156,7 +1156,7 @@ static s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) {
|
||||||
// visibly pop in or out at the edge of the screen.
|
// visibly pop in or out at the edge of the screen.
|
||||||
//
|
//
|
||||||
// Half of the fov in in-game angle units instead of degrees.
|
// Half of the fov in in-game angle units instead of degrees.
|
||||||
s16 halfFov = (not_zero(gCurGraphNodeCamFrustum->fov, gOverrideFOV) / 2.0f + 1.0f) * 32768.0f / 180.0f + 0.5f;
|
s16 halfFov = (get_dest_fov(gCurGraphNodeCamFrustum->fov) / 2.0f + 1.0f) * 32768.0f / 180.0f + 0.5f;
|
||||||
|
|
||||||
f32 divisor = coss(halfFov);
|
f32 divisor = coss(halfFov);
|
||||||
if (divisor == 0) { divisor = 1; }
|
if (divisor == 0) { divisor = 1; }
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "game/camera.h"
|
#include "game/camera.h"
|
||||||
#include "game/hud.h"
|
#include "game/hud.h"
|
||||||
#include "game/rendering_graph_node.h"
|
#include "game/rendering_graph_node.h"
|
||||||
|
#include "game/first_person_cam.h"
|
||||||
|
|
||||||
#include "engine/math_util.h"
|
#include "engine/math_util.h"
|
||||||
|
|
||||||
|
@ -578,7 +579,7 @@ bool djui_hud_world_pos_to_screen_pos(Vec3f pos, Vec3f out) {
|
||||||
out[1] *= 256.0f / out[2];
|
out[1] *= 256.0f / out[2];
|
||||||
|
|
||||||
// fov of 45.0 is the default fov
|
// fov of 45.0 is the default fov
|
||||||
f32 fovDefault = tanf(not_zero(45.0f, gOverrideFOV) * ((f32)M_PI / 360.0f));
|
f32 fovDefault = tanf(get_dest_fov(45.0f) * ((f32)M_PI / 360.0f));
|
||||||
f32 fovCurrent = tanf((gFOVState.fov + gFOVState.fovOffset) * ((f32)M_PI / 360.0f));
|
f32 fovCurrent = tanf((gFOVState.fov + gFOVState.fovOffset) * ((f32)M_PI / 360.0f));
|
||||||
|
|
||||||
f32 fovDifference = (fovDefault / fovCurrent) * 1.13f;
|
f32 fovDifference = (fovDefault / fovCurrent) * 1.13f;
|
||||||
|
|
|
@ -674,13 +674,12 @@ static struct LuaObjectField sDjuiColorFields[LUA_DJUI_COLOR_FIELD_COUNT] = {
|
||||||
{ "r", LVT_U8, offsetof(struct DjuiColor, r), false, LOT_NONE },
|
{ "r", LVT_U8, offsetof(struct DjuiColor, r), false, LOT_NONE },
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LUA_FIRST_PERSON_CAMERA_FIELD_COUNT 8
|
#define LUA_FIRST_PERSON_CAMERA_FIELD_COUNT 7
|
||||||
static struct LuaObjectField sFirstPersonCameraFields[LUA_FIRST_PERSON_CAMERA_FIELD_COUNT] = {
|
static struct LuaObjectField sFirstPersonCameraFields[LUA_FIRST_PERSON_CAMERA_FIELD_COUNT] = {
|
||||||
{ "centerL", LVT_BOOL, offsetof(struct FirstPersonCamera, centerL), false, LOT_NONE },
|
{ "centerL", LVT_BOOL, offsetof(struct FirstPersonCamera, centerL), false, LOT_NONE },
|
||||||
{ "crouch", LVT_F32, offsetof(struct FirstPersonCamera, crouch), false, LOT_NONE },
|
{ "crouch", LVT_F32, offsetof(struct FirstPersonCamera, crouch), false, LOT_NONE },
|
||||||
{ "enabled", LVT_BOOL, offsetof(struct FirstPersonCamera, enabled), true, LOT_NONE },
|
{ "enabled", LVT_BOOL, offsetof(struct FirstPersonCamera, enabled), false, LOT_NONE },
|
||||||
{ "forceRoll", LVT_BOOL, offsetof(struct FirstPersonCamera, forceRoll), false, LOT_NONE },
|
{ "forceRoll", LVT_BOOL, offsetof(struct FirstPersonCamera, forceRoll), false, LOT_NONE },
|
||||||
{ "fov", LVT_F32, offsetof(struct FirstPersonCamera, fov), false, LOT_NONE },
|
|
||||||
{ "offset", LVT_COBJECT, offsetof(struct FirstPersonCamera, offset), true, LOT_VEC3F },
|
{ "offset", LVT_COBJECT, offsetof(struct FirstPersonCamera, offset), true, LOT_VEC3F },
|
||||||
{ "pitch", LVT_S16, offsetof(struct FirstPersonCamera, pitch), false, LOT_NONE },
|
{ "pitch", LVT_S16, offsetof(struct FirstPersonCamera, pitch), false, LOT_NONE },
|
||||||
{ "yaw", LVT_S16, offsetof(struct FirstPersonCamera, yaw), false, LOT_NONE },
|
{ "yaw", LVT_S16, offsetof(struct FirstPersonCamera, yaw), false, LOT_NONE },
|
||||||
|
|
|
@ -13231,23 +13231,6 @@ int smlua_func_get_first_person_enabled(UNUSED lua_State* L) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int smlua_func_set_first_person_enabled(lua_State* L) {
|
|
||||||
if (L == NULL) { return 0; }
|
|
||||||
|
|
||||||
int top = lua_gettop(L);
|
|
||||||
if (top != 1) {
|
|
||||||
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_first_person_enabled", 1, top);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool enable = smlua_to_boolean(L, 1);
|
|
||||||
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_first_person_enabled"); return 0; }
|
|
||||||
|
|
||||||
set_first_person_enabled(enable);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
// ingame_menu.h //
|
// ingame_menu.h //
|
||||||
///////////////////
|
///////////////////
|
||||||
|
@ -32076,7 +32059,6 @@ void smlua_bind_functions_autogen(void) {
|
||||||
smlua_bind_function(L, "first_person_check_cancels", smlua_func_first_person_check_cancels);
|
smlua_bind_function(L, "first_person_check_cancels", smlua_func_first_person_check_cancels);
|
||||||
smlua_bind_function(L, "first_person_reset", smlua_func_first_person_reset);
|
smlua_bind_function(L, "first_person_reset", smlua_func_first_person_reset);
|
||||||
smlua_bind_function(L, "get_first_person_enabled", smlua_func_get_first_person_enabled);
|
smlua_bind_function(L, "get_first_person_enabled", smlua_func_get_first_person_enabled);
|
||||||
smlua_bind_function(L, "set_first_person_enabled", smlua_func_set_first_person_enabled);
|
|
||||||
|
|
||||||
// ingame_menu.h
|
// ingame_menu.h
|
||||||
smlua_bind_function(L, "reset_dialog_override_color", smlua_func_reset_dialog_override_color);
|
smlua_bind_function(L, "reset_dialog_override_color", smlua_func_reset_dialog_override_color);
|
||||||
|
|
|
@ -708,7 +708,6 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect
|
||||||
cnt->extStickY = 0;
|
cnt->extStickY = 0;
|
||||||
|
|
||||||
gFirstPersonCamera.enabled = false;
|
gFirstPersonCamera.enabled = false;
|
||||||
gFirstPersonCamera.fov = FIRST_PERSON_DEFAULT_FOV;
|
|
||||||
first_person_reset();
|
first_person_reset();
|
||||||
|
|
||||||
extern void save_file_load_all(UNUSED u8 reload);
|
extern void save_file_load_all(UNUSED u8 reload);
|
||||||
|
|
Loading…
Reference in a new issue