From 4f8646f022dc63e54c60201160f635c6e6f38d02 Mon Sep 17 00:00:00 2001 From: SabeMP Date: Fri, 16 May 2025 17:26:53 -0300 Subject: [PATCH 1/4] zCameraTweak: Progress for most functions --- src/SB/Game/zCameraTweak.cpp | 206 +++++++++++++++++++++++++++++++++-- src/SB/Game/zCameraTweak.h | 27 ++++- 2 files changed, 224 insertions(+), 9 deletions(-) diff --git a/src/SB/Game/zCameraTweak.cpp b/src/SB/Game/zCameraTweak.cpp index 62407fcaf..781f9fe5d 100644 --- a/src/SB/Game/zCameraTweak.cpp +++ b/src/SB/Game/zCameraTweak.cpp @@ -1,22 +1,214 @@ #include "zCameraTweak.h" +#include "xEvent.h" +#include "xMath.h" +#include "xMathInlines.h" +#include "iMath.h" #include -static float sCamPitch; -static float sCamH; -static float sCamD; +static S32 sCamTweakCount; +static zCamTweak sCamTweakList[8]; +static F32 sCamTweakLerp; +static F32 sCamTweakTime; +static F32 sCamTweakPitch[2]; +static F32 sCamTweakDistMult[2]; +static F32 sCamTweakPitchCur; +static F32 sCamTweakDistMultCur; +static F32 sCamD; +static F32 sCamH; +static F32 sCamPitch; +static zCamTweakLook zcam_neartweak; +static zCamTweakLook zcam_fartweak; +extern F32 zcam_near_d; +extern F32 zcam_near_h; +extern F32 zcam_near_pitch; +extern F32 zcam_far_d; +extern F32 zcam_far_h; +extern F32 zcam_far_pitch; -F32 zCameraTweakGlobal_GetPitch() +static void zCameraTweak_LookPreCalc(zCamTweakLook* tlook, F32 d, F32 h, F32 pitch) { - return sCamPitch; + F32 tan = itan(pitch); + F32 unk = d*tan; + tlook->h = h-unk; + tlook->dist = xsqrt(unk*unk + d*d); + tlook->pitch = pitch; } -F32 zCameraTweakGlobal_GetH() +void zCameraTweakGlobal_Init() { - return sCamH; + zCameraTweak_LookPreCalc(&zcam_neartweak, zcam_near_d, zcam_near_h, zcam_near_pitch); + zCameraTweak_LookPreCalc(&zcam_fartweak, zcam_far_d, zcam_far_h, zcam_far_pitch); + zCameraTweakGlobal_Reset(); +} + +void zCameraTweakGlobal_Add(U32 owner, F32 priority, F32 time, F32 pitch, F32 distMult) +{ + S32 i; + S32 j; + + for (i = 0; i < sCamTweakCount; i++) + { + if (sCamTweakList[i].owner == owner) + { + return; + } + } + + for (i = 0; i < sCamTweakCount; i++) + { + if (priority >= sCamTweakList[i].priority) + { + for (j = sCamTweakCount; j >= i + 1; j--) + { + sCamTweakList[j] = sCamTweakList[j - 1]; + } + break; + } + } + + sCamTweakList[i].owner = owner; + sCamTweakList[i].priority = priority; + sCamTweakList[i].time = time > 0.001f ? time : 0.001f; + sCamTweakList[i].pitch = DEG2RAD(pitch); + sCamTweakList[i].distMult = distMult > 0.001f ? distMult : 0.001f; + + sCamTweakCount++; + + if (i == 0) + { + sCamTweakPitch[1] = sCamTweakPitch[1] * sCamTweakLerp + sCamTweakPitch[0] * (1.0f - sCamTweakLerp); + sCamTweakDistMult[1] = sCamTweakDistMult[1] * sCamTweakLerp + sCamTweakDistMult[0] * (1.0f - sCamTweakLerp); + sCamTweakLerp = 1.0f; + sCamTweakTime = sCamTweakList[0].time; + sCamTweakPitch[0] = sCamTweakList[0].pitch; + sCamTweakDistMult[0] = sCamTweakList[0].distMult; + } +} + +void zCameraTweakGlobal_Remove(U32 owner) +{ + S32 i; + + for (i = 0; i < sCamTweakCount; i++) + { + if (sCamTweakList[i].owner == owner) + { + if (i == 0) + { + sCamTweakPitch[1] = sCamTweakPitch[1] * sCamTweakLerp + sCamTweakPitch[0] * (1.0f - sCamTweakLerp); + sCamTweakDistMult[1] = sCamTweakDistMult[1] * sCamTweakLerp + sCamTweakDistMult[0] * (1.0f - sCamTweakLerp); + sCamTweakLerp = 1.0f; + sCamTweakTime = sCamTweakList[0].time; + sCamTweakPitch[0] = sCamTweakCount < 2 ? 0.0f : sCamTweakList[1].pitch; + sCamTweakDistMult[0] = sCamTweakCount < 2 ? 1.0f : sCamTweakList[1].distMult; + } + + for (S32 j = i; j < sCamTweakCount; j--) + { + sCamTweakList[j] = sCamTweakList[j + 1]; + } + + sCamTweakCount--; + return; + } + } +} + +void zCameraTweakGlobal_Reset() +{ + sCamTweakCount = 0; + sCamTweakPitch[0] = 0.0f; + sCamTweakPitch[1] = 0.0f; + sCamTweakDistMult[0] = 1.0f; + sCamTweakDistMult[1] = 1.0f; + sCamTweakTime = 0.1f; + sCamTweakLerp = 0.0f; + sCamTweakPitchCur = 0.0f; + sCamTweakDistMultCur = 1.0f; + return; +} + +void zCameraTweakGlobal_Update(F32 dt) +{ + } F32 zCameraTweakGlobal_GetD() { return sCamD; } + +F32 zCameraTweakGlobal_GetH() +{ + return sCamH; +} + +F32 zCameraTweakGlobal_GetPitch() +{ + return sCamPitch; +} + +void zCameraTweak_Init(xBase& data, xDynAsset& asset, size_t) +{ + zCameraTweak_Init((zCameraTweak*)(&data), (CameraTweak_asset*)&asset); +} + +void zCameraTweak_Init(zCameraTweak* tweak, CameraTweak_asset* asset) +{ + xBaseInit((xBase*)tweak, (xBaseAsset*)asset); + + tweak->casset = asset; + tweak->eventFunc = zCameraTweak_EventCB; + + if (tweak->linkCount != 0) + { + tweak->link = (xLinkAsset*)(asset + 1); + } + else + { + tweak->link = NULL; + } +} + +void zCameraTweak_Save(zCameraTweak* tweak, xSerial* s) +{ + xBaseSave((xBase*)tweak, s); +} + +void zCameraTweak_Load(zCameraTweak* tweak, xSerial* s) +{ + xBaseLoad((xBase*)tweak, s); +} + +S32 zCameraTweak_EventCB(xBase* from, xBase* to, U32 toEvent, const F32* toParam, xBase* b3) +{ + zCameraTweak* tweak = (zCameraTweak*)to; + + switch (toEvent) + { + case eEventEnable: + xBaseEnable(tweak); + break; + + case eEventDisable: + xBaseDisable(tweak); + break; + + case eEventRun: + if (xBaseIsEnabled(tweak)) + { + zCameraTweakGlobal_Add(tweak->id, tweak->casset->priority, tweak->casset->time, tweak->casset->pitch_adjust, tweak->casset->dist_adjust); + } + break; + + case eEventStop: + if (xBaseIsEnabled(tweak)) + { + zCameraTweakGlobal_Remove(tweak->id); + } + break; + } + + return 1; +} diff --git a/src/SB/Game/zCameraTweak.h b/src/SB/Game/zCameraTweak.h index ab90cbc6d..89902c6c8 100644 --- a/src/SB/Game/zCameraTweak.h +++ b/src/SB/Game/zCameraTweak.h @@ -18,13 +18,36 @@ struct zCameraTweak : xBase CameraTweak_asset* casset; }; -F32 zCameraTweakGlobal_GetPitch(); -F32 zCameraTweakGlobal_GetH(); +struct zCamTweak +{ + U32 owner; + F32 priority; + F32 time; + F32 pitch; + F32 distMult; +}; + +struct zCamTweakLook +{ + F32 h; + F32 dist; + F32 pitch; +}; + +void zCameraTweakGlobal_Init(); +void zCameraTweakGlobal_Add(U32 owner, F32 priority, F32 time, F32 pitch, F32 distMult); +void zCameraTweakGlobal_Remove(U32 owner); +void zCameraTweakGlobal_Reset(); +void zCameraTweakGlobal_Update(F32 dt); F32 zCameraTweakGlobal_GetD(); +F32 zCameraTweakGlobal_GetH(); +F32 zCameraTweakGlobal_GetPitch(); void zCameraTweakGlobal_Update(F32 dt); void zCameraTweakGlobal_Reset(); void zCameraTweak_Init(xBase& data, xDynAsset& asset, size_t); +void zCameraTweak_Init(zCameraTweak* tweak, CameraTweak_asset* asset); void zCameraTweak_Save(zCameraTweak* tweak, xSerial* s); void zCameraTweak_Load(zCameraTweak* tweak, xSerial* s); +S32 zCameraTweak_EventCB(xBase* from, xBase* to, U32 toEvent, const F32* toParam, xBase* b3); #endif From bede9dd1f41bfae6158e37df9c38b2bd1e991fb9 Mon Sep 17 00:00:00 2001 From: SabeMP Date: Sun, 18 May 2025 10:57:57 -0300 Subject: [PATCH 2/4] zCameraTweak: Implement zCameraTweakGlobal_Update and clang-format --- src/SB/Game/zCameraTweak.cpp | 43 ++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/SB/Game/zCameraTweak.cpp b/src/SB/Game/zCameraTweak.cpp index 781f9fe5d..2daa28dd4 100644 --- a/src/SB/Game/zCameraTweak.cpp +++ b/src/SB/Game/zCameraTweak.cpp @@ -4,6 +4,7 @@ #include "xMathInlines.h" #include "iMath.h" +#include "zCamera.h" #include static S32 sCamTweakCount; @@ -19,19 +20,13 @@ static F32 sCamH; static F32 sCamPitch; static zCamTweakLook zcam_neartweak; static zCamTweakLook zcam_fartweak; -extern F32 zcam_near_d; -extern F32 zcam_near_h; -extern F32 zcam_near_pitch; -extern F32 zcam_far_d; -extern F32 zcam_far_h; -extern F32 zcam_far_pitch; static void zCameraTweak_LookPreCalc(zCamTweakLook* tlook, F32 d, F32 h, F32 pitch) { F32 tan = itan(pitch); - F32 unk = d*tan; - tlook->h = h-unk; - tlook->dist = xsqrt(unk*unk + d*d); + F32 unk = d * tan; + tlook->h = h - unk; + tlook->dist = xsqrt(unk * unk + d * d); tlook->pitch = pitch; } @@ -77,8 +72,10 @@ void zCameraTweakGlobal_Add(U32 owner, F32 priority, F32 time, F32 pitch, F32 di if (i == 0) { - sCamTweakPitch[1] = sCamTweakPitch[1] * sCamTweakLerp + sCamTweakPitch[0] * (1.0f - sCamTweakLerp); - sCamTweakDistMult[1] = sCamTweakDistMult[1] * sCamTweakLerp + sCamTweakDistMult[0] * (1.0f - sCamTweakLerp); + sCamTweakPitch[1] = + sCamTweakPitch[1] * sCamTweakLerp + sCamTweakPitch[0] * (1.0f - sCamTweakLerp); + sCamTweakDistMult[1] = + sCamTweakDistMult[1] * sCamTweakLerp + sCamTweakDistMult[0] * (1.0f - sCamTweakLerp); sCamTweakLerp = 1.0f; sCamTweakTime = sCamTweakList[0].time; sCamTweakPitch[0] = sCamTweakList[0].pitch; @@ -96,8 +93,10 @@ void zCameraTweakGlobal_Remove(U32 owner) { if (i == 0) { - sCamTweakPitch[1] = sCamTweakPitch[1] * sCamTweakLerp + sCamTweakPitch[0] * (1.0f - sCamTweakLerp); - sCamTweakDistMult[1] = sCamTweakDistMult[1] * sCamTweakLerp + sCamTweakDistMult[0] * (1.0f - sCamTweakLerp); + sCamTweakPitch[1] = + sCamTweakPitch[1] * sCamTweakLerp + sCamTweakPitch[0] * (1.0f - sCamTweakLerp); + sCamTweakDistMult[1] = sCamTweakDistMult[1] * sCamTweakLerp + + sCamTweakDistMult[0] * (1.0f - sCamTweakLerp); sCamTweakLerp = 1.0f; sCamTweakTime = sCamTweakList[0].time; sCamTweakPitch[0] = sCamTweakCount < 2 ? 0.0f : sCamTweakList[1].pitch; @@ -131,7 +130,22 @@ void zCameraTweakGlobal_Reset() void zCameraTweakGlobal_Update(F32 dt) { + sCamTweakLerp -= dt / sCamTweakTime; + if (sCamTweakLerp < 0.0f) + { + sCamTweakLerp = 0.0f; + } + + zCamTweakLook* tlook = &zcam_fartweak; + sCamTweakPitchCur = + sCamTweakPitch[1] * sCamTweakLerp + sCamTweakPitch[0] * (1.0f - sCamTweakLerp); + sCamTweakDistMultCur = + sCamTweakDistMult[1] * sCamTweakLerp + sCamTweakDistMult[0] * (1.0f - sCamTweakLerp); + tlook = zcam_near != 0 ? &zcam_neartweak : tlook; + sCamD = sCamTweakDistMultCur * tlook->dist * icos(tlook->pitch + sCamTweakPitchCur); + sCamH = sCamTweakDistMultCur * tlook->dist * isin(tlook->pitch + sCamTweakPitchCur) + tlook->h; + sCamPitch = tlook->pitch + sCamTweakPitchCur; } F32 zCameraTweakGlobal_GetD() @@ -198,7 +212,8 @@ S32 zCameraTweak_EventCB(xBase* from, xBase* to, U32 toEvent, const F32* toParam case eEventRun: if (xBaseIsEnabled(tweak)) { - zCameraTweakGlobal_Add(tweak->id, tweak->casset->priority, tweak->casset->time, tweak->casset->pitch_adjust, tweak->casset->dist_adjust); + zCameraTweakGlobal_Add(tweak->id, tweak->casset->priority, tweak->casset->time, + tweak->casset->pitch_adjust, tweak->casset->dist_adjust); } break; From 77f8aac4fdd3d63e07cc9456e0d3d1fafee88696 Mon Sep 17 00:00:00 2001 From: SabeMP Date: Sun, 18 May 2025 11:01:43 -0300 Subject: [PATCH 3/4] zCameraTweak: Remove empty space and format --- src/SB/Game/zCameraTweak.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SB/Game/zCameraTweak.cpp b/src/SB/Game/zCameraTweak.cpp index 2daa28dd4..ac2c9363d 100644 --- a/src/SB/Game/zCameraTweak.cpp +++ b/src/SB/Game/zCameraTweak.cpp @@ -3,7 +3,6 @@ #include "xMath.h" #include "xMathInlines.h" #include "iMath.h" - #include "zCamera.h" #include @@ -86,6 +85,7 @@ void zCameraTweakGlobal_Add(U32 owner, F32 priority, F32 time, F32 pitch, F32 di void zCameraTweakGlobal_Remove(U32 owner) { S32 i; + S32 j; for (i = 0; i < sCamTweakCount; i++) { @@ -103,7 +103,7 @@ void zCameraTweakGlobal_Remove(U32 owner) sCamTweakDistMult[0] = sCamTweakCount < 2 ? 1.0f : sCamTweakList[1].distMult; } - for (S32 j = i; j < sCamTweakCount; j--) + for (j = i; j < sCamTweakCount; j--) { sCamTweakList[j] = sCamTweakList[j + 1]; } From 27c7f07918e1aa2f1b5d7e6e95fad80088275632 Mon Sep 17 00:00:00 2001 From: SabeMP Date: Sun, 18 May 2025 19:50:12 -0300 Subject: [PATCH 4/4] zCameraTweak: Better name for local --- src/SB/Game/zCameraTweak.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SB/Game/zCameraTweak.cpp b/src/SB/Game/zCameraTweak.cpp index ac2c9363d..81bf0035d 100644 --- a/src/SB/Game/zCameraTweak.cpp +++ b/src/SB/Game/zCameraTweak.cpp @@ -23,9 +23,9 @@ static zCamTweakLook zcam_fartweak; static void zCameraTweak_LookPreCalc(zCamTweakLook* tlook, F32 d, F32 h, F32 pitch) { F32 tan = itan(pitch); - F32 unk = d * tan; - tlook->h = h - unk; - tlook->dist = xsqrt(unk * unk + d * d); + F32 deltaH = d * tan; + tlook->h = h - deltaH; + tlook->dist = xsqrt(deltaH * deltaH + d * d); tlook->pitch = pitch; }