summaryrefslogtreecommitdiff
path: root/soh/src/code
diff options
context:
space:
mode:
authorfrizzle101101 <aaronfritz96@gmail.com>2022-11-22 02:57:26 -0500
committerGitHub <noreply@github.com>2022-11-22 08:57:26 +0100
commitc569a469333bdecfec9da6a6b5633701f07b4b78 (patch)
treea0ff9eee4b0e7bf8658dde55090fb72ee69e0ff9 /soh/src/code
parentaa16a5388e40818608e20e2e19044e027fd37637 (diff)
[Enhancement] Add fix camera drift option to fixes menu (#1983)
Diffstat (limited to 'soh/src/code')
-rw-r--r--soh/src/code/z_camera.c6
-rw-r--r--soh/src/code/z_lib.c9
-rw-r--r--soh/src/code/z_olib.c18
3 files changed, 27 insertions, 6 deletions
diff --git a/soh/src/code/z_camera.c b/soh/src/code/z_camera.c
index 0d7df8bbf..af343d8fc 100644
--- a/soh/src/code/z_camera.c
+++ b/soh/src/code/z_camera.c
@@ -1238,7 +1238,8 @@ f32 Camera_LERPClampDist(Camera* camera, f32 dist, f32 min, f32 max) {
}
camera->rUpdateRateInv = Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv, PCT(OREG(25)), 0.1f);
- return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f);
+ return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv,
+ CVar_GetS32("gFixCameraDrift", 0) ? 0.0f : 0.2f);
}
f32 Camera_ClampDist(Camera* camera, f32 dist, f32 minDist, f32 maxDist, s16 timer) {
@@ -1260,7 +1261,8 @@ f32 Camera_ClampDist(Camera* camera, f32 dist, f32 minDist, f32 maxDist, s16 tim
}
camera->rUpdateRateInv = Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv, PCT(OREG(25)), 0.1f);
- return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f);
+ return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv,
+ CVar_GetS32("gFixCameraDrift", 0) ? 0.0f : 0.2f);
}
s16 Camera_CalcDefaultPitch(Camera* camera, s16 arg1, s16 arg2, s16 arg3) {
diff --git a/soh/src/code/z_lib.c b/soh/src/code/z_lib.c
index 1da31eb45..3508fceb7 100644
--- a/soh/src/code/z_lib.c
+++ b/soh/src/code/z_lib.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include <math.h>
f32 Math_CosS(s16 angle) {
return coss(angle) * SHT_MINV;
@@ -8,6 +9,14 @@ f32 Math_SinS(s16 angle) {
return sins(angle) * SHT_MINV;
}
+f32 Math_AccurateCosS(s16 angle) {
+ return cosf(DEG_TO_RAD((f32)(angle & 0xFFFC) / SHT_MAX) * 180.0f);
+}
+
+f32 Math_AccurateSinS(s16 angle) {
+ return sinf(DEG_TO_RAD((f32)(angle & 0xFFFC) / SHT_MAX) * 180.0f);
+}
+
/**
* Changes pValue by step (scaled by the update rate) towards target, setting it equal when the target is reached.
* Returns true when target is reached, false otherwise.
diff --git a/soh/src/code/z_olib.c b/soh/src/code/z_olib.c
index 72cd6694b..9446e1dc1 100644
--- a/soh/src/code/z_olib.c
+++ b/soh/src/code/z_olib.c
@@ -76,12 +76,22 @@ Vec3f* OLib_Vec3fDistNormalize(Vec3f* dest, Vec3f* a, Vec3f* b) {
Vec3f* OLib_VecSphToVec3f(Vec3f* dest, VecSph* sph) {
Vec3f v;
f32 sinPitch;
- f32 cosPitch = Math_CosS(sph->pitch);
+ f32 cosPitch;
f32 sinYaw;
- f32 cosYaw = Math_CosS(sph->yaw);
+ f32 cosYaw;
- sinPitch = Math_SinS(sph->pitch);
- sinYaw = Math_SinS(sph->yaw);
+ if (CVar_GetS32("gFixCameraDrift", 0)) {
+ cosPitch = Math_AccurateCosS(sph->pitch);
+ cosYaw = Math_AccurateCosS(sph->yaw);
+ sinPitch = Math_AccurateSinS(sph->pitch);
+ sinYaw = Math_AccurateSinS(sph->yaw);
+ } else {
+ cosPitch = Math_CosS(sph->pitch);
+ cosYaw = Math_CosS(sph->yaw);
+ sinPitch = Math_SinS(sph->pitch);
+ sinYaw = Math_SinS(sph->yaw);
+ }
+
v.x = sph->r * sinPitch * sinYaw;
v.y = sph->r * cosPitch;