From 9b259143be4e50316d5d415d1566e180ce3f3392 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Mon, 27 Apr 2026 12:05:26 -0400 Subject: [PATCH] Better Freecam code + Allow Freecam in Target mode --- src/d/d_camera.cpp | 53 +++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index c59cf1c525..471c93bb19 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -794,16 +794,15 @@ void dCamera_c::updatePad() { if (mTriggerLeftLast > mCamSetup.ManualEndVal()) { if (mLockLActive == 0) { + #if TARGET_PC + mCamParam.mManualMode = 0; + #endif mLockLJustActivated = 1; } else { mLockLJustActivated = 0; } mLockLActive = 1; - - #if TARGET_PC - mCamParam.mManualMode = 0; - #endif } else { mLockLJustActivated = 0; mLockLActive = 0; @@ -1178,12 +1177,6 @@ bool dCamera_c::Run() { } else { sp0F = (this->*engine_tbl[mCamParam.Algorythmn(mCamStyle)])(mCamStyle); - #if TARGET_PC - if (mCamParam.Algorythmn(mCamStyle) != 1) { - mCamParam.mManualMode = 0; - } - #endif - field_0x170++; field_0x160++; mCurCamStyleTimer++; @@ -3527,6 +3520,12 @@ void dCamera_c::checkGroundInfo() { } bool dCamera_c::chaseCamera(s32 param_0) { +#if TARGET_PC + if (freeCamera()) { + return 1; + } +#endif + static f32 JumpCushion = 0.9f; f32 charge_latitude = mCamSetup.ChargeLatitude(); int charge_timer = mCamSetup.ChargeTimer(); @@ -4631,10 +4630,6 @@ bool dCamera_c::chaseCamera(s32 param_0) { sp110 = mViewCache.mDirection.R(); mViewCache.mDirection.R(mViewCache.mDirection.R() + (fVar55 - mViewCache.mDirection.R()) * chase->field_0x74); - #if TARGET_PC - freeCamera(); - #endif - chase->field_0x64 = mViewCache.mCenter + mViewCache.mDirection.Xyz(); mViewCache.mEye = chase->field_0x64; @@ -7482,6 +7477,9 @@ bool dCamera_c::freeCamera() { return false; } + mCamParam.freeXAngle = mViewCache.mDirection.mAzimuth.Degree(); + mCamParam.freeYAngle = mViewCache.mDirection.mInclination.Degree(); + cXyz camMovement = {mPadInfo.mCStick.mLastPosX, mPadInfo.mCStick.mLastPosY, 0.0f}; f32 magnitude = sqrt(mPadInfo.mCStick.mLastPosX * mPadInfo.mCStick.mLastPosX + mPadInfo.mCStick.mLastPosY * mPadInfo.mCStick.mLastPosY); @@ -7498,14 +7496,29 @@ bool dCamera_c::freeCamera() { mCamParam.freeYAngle += camMovement.y * magnitude * dusk::getSettings().game.freeCameraSensitivity * 4.0f; } - if (mCamParam.mManualMode) { - mCamParam.freeYAngle = std::clamp(mCamParam.freeYAngle, -35.0f, 60.0f); - mViewCache.mDirection.mAzimuth = cSAngle(mCamParam.freeXAngle); - mViewCache.mDirection.mInclination = cSAngle(mCamParam.freeYAngle); - mViewCache.mDirection.mRadius = std::clamp((mCamParam.freeYAngle + 35.0f) * 10.0f, 300.0f, 10000.0f); + if (!mCamParam.mManualMode) { + return false; } - return mCamParam.mManualMode; + f32 minYAngle = -10.0f; + f32 maxAngle = 50.0f; + + mCamParam.freeYAngle = std::clamp(mCamParam.freeYAngle, minYAngle, maxAngle); + mViewCache.mDirection.mAzimuth = cSAngle(mCamParam.freeXAngle); + mViewCache.mDirection.mInclination = cSAngle(mCamParam.freeYAngle); + f32 currentLerp = (mCamParam.freeYAngle - minYAngle) / (maxAngle - minYAngle); + mViewCache.mDirection.mRadius = std::lerp(200.0f, 1000.0f, currentLerp); + + cXyz finalCenter = mpPlayerActor->current.pos; + finalCenter.y += mIsWolf ? 90.0f : 100.0f; + mViewCache.mCenter = finalCenter; + + cXyz finalEye = finalCenter + mViewCache.mDirection.Xyz(); + mViewCache.mEye = finalEye; + + mViewCache.mFovy = 60.0f; + + return true; } #endif