diff options
| author | robojumper <robojumper@gmail.com> | 2026-01-06 21:05:51 +0100 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2026-03-01 20:59:49 +0100 |
| commit | ac48f9877b3918e2c41557fad76c37563678643e (patch) | |
| tree | 0e23db3f2fd9924e76aaea12c310cfa6d47097a2 /src/d/d_camera.cpp | |
| parent | 02c46f14241b2d99d9a68399c4197f493212a301 (diff) | |
d_camera OK
Diffstat (limited to 'src/d/d_camera.cpp')
| -rw-r--r-- | src/d/d_camera.cpp | 99 |
1 files changed, 87 insertions, 12 deletions
diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index d8f8e5ef..589d8c8a 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -109,9 +109,9 @@ int dCamera_c::create() { mpCameras[0]->activate(); - mLetterboxAmount = fn_8019E1F0(); + mLetterboxAmount = getEventLetterboxAmount(); field_0x290 = 1.0f; - mFlags |= CAM_FLAGS_IN_EVENT; + onFlag(CAM_FLAGS_IN_EVENT); // TODO maybe struct + inline mGlobalAlpha = 1.0f; @@ -140,7 +140,7 @@ int dCamera_c::create() { if ((dScGame_c::isCurrentStage("F000") && 26 <= dScGame_c::currentSpawnInfo.layer && dScGame_c::currentSpawnInfo.layer <= 28) || dScGame_c::isInCredits() || dScGame_c::isSeekerStoneStageAndLayer()) { - mFlags |= CAM_FLAGS_NO_LETTERBOX_IN_EVENT; + onFlag(CAM_FLAGS_NO_LETTERBOX_IN_EVENT); dScGame_c::GetInstance()->setTargetingScreenLetterboxAmount(0.0f); } @@ -184,7 +184,7 @@ void dCamera_c::setWorldOffset(f32 x, f32 z) { int dCamera_c::execute() { dAcPy_c *link = dAcPy_c::GetLinkM(); - fn_8019DB80(); + checkCameraChange(); for (int i = 0; i < CAM_MAX; i++) { if (mpCameras[i] != nullptr) { @@ -203,10 +203,10 @@ int dCamera_c::execute() { field_0xDCC = false; if (mActiveCameraIdx == CAM_EVENT) { - mFlags |= CAM_FLAGS_IN_EVENT; + onFlag(CAM_FLAGS_IN_EVENT); } - if ((mFlags & (CAM_FLAGS_0x100 | CAM_FLAGS_IN_EVENT)) != 0) { + if (checkFlag(CAM_FLAGS_0x100 | CAM_FLAGS_IN_EVENT)) { field_0x290 += (1.0f / sHio.field_0x24); if (field_0x290 > 1.0f) { field_0x290 = 1.0f; @@ -218,16 +218,16 @@ int dCamera_c::execute() { } } - f32 scale = (mFlags & CAM_FLAGS_IN_EVENT) != 0 ? fn_8019E1F0() : sHio.field_0x20; + f32 scale = checkFlag(CAM_FLAGS_IN_EVENT) != 0 ? getEventLetterboxAmount() : sHio.field_0x20; f32 target = camEaseInOut(field_0x290, 1.0f); mLetterboxAmount += (target * scale - mLetterboxAmount) * 0.5f; - if (mActiveCameraIdx == CAM_EVENT && (mFlags & CAM_FLAGS_NO_LETTERBOX_IN_EVENT) != 0) { + if (mActiveCameraIdx == CAM_EVENT && checkFlag(CAM_FLAGS_NO_LETTERBOX_IN_EVENT) != 0) { mLetterboxAmount = 0.0f; } dScGame_c::GetInstance()->setTargetingScreenLetterboxAmount(mLetterboxAmount); - mFlags &= ~(CAM_FLAGS_0x100 | CAM_FLAGS_IN_EVENT); + offFlag(CAM_FLAGS_0x100 | CAM_FLAGS_IN_EVENT); if (!link->checkActionFlagsCont(0x400000)) { field_0x299 = 0; @@ -256,6 +256,42 @@ int dCamera_c::execute() { return SUCCEEDED; } +void dCamera_c::checkCameraChange() { + offFlag(CAM_FLAGS_0x10); + if (checkFlag(CAM_FLAGS_0x4)) { + getGameCam1()->onFlag(0x400); + offFlag(CAM_FLAGS_0x4); + } + + if (checkFlag(CAM_FLAGS_MAP) && mActiveCameraIdx == CAM_MAP && !mMapCam.fn_800932E0()) { + offFlag(CAM_FLAGS_MAP); + onFlag(CAM_FLAGS_0x4); + getGameCam1()->onFlag(0x10000); + debugPrintf7("off map"); + } + + if (EventManager::isInEvent()) { + onFlag(CAM_FLAGS_EVENT); + offFlag(CAM_FLAGS_MAP); + } else { + offFlag(CAM_FLAGS_EVENT); + } + + if (checkFlag(CAM_FLAGS_EVENT)) { + if (mActiveCameraIdx != CAM_EVENT) { + setActiveCamera(CAM_EVENT); + } + } else if (checkFlag(CAM_FLAGS_MAP)) { + if (mActiveCameraIdx != CAM_MAP) { + setActiveCamera(CAM_MAP); + } + } else { + if (mActiveCameraIdx != CAM_GAME_0) { + setActiveCamera(CAM_GAME_0); + } + } +} + void dCamera_c::updateView() { if (field_0xDCC) { mView = mView1; @@ -277,15 +313,15 @@ int dCamera_c::draw() { } bool dCamera_c::isUnderwater() const { - return mFlags & CAM_FLAGS_UNDERWATER; + return checkFlag(CAM_FLAGS_UNDERWATER); } void dCamera_c::apply() { updateUnderwaterDepth(mView.mPosition); if (isUnderwater_()) { - mFlags |= CAM_FLAGS_UNDERWATER; + onFlag(CAM_FLAGS_UNDERWATER); } else { - mFlags &= ~CAM_FLAGS_UNDERWATER; + offFlag(CAM_FLAGS_UNDERWATER); } if (mScreenShaker.execute()) { @@ -330,7 +366,10 @@ s32 dCamera_c::setActiveCamera(s32 newCamIdx) { mActiveCameraIdx = newCamIdx; return newCamIdx; } +} +f32 dCamera_c::getEventLetterboxAmount() { + return sHio.field_0x1C; } void dCamera_c::setFrustum(f32 fov, f32 near, f32 far) { @@ -374,6 +413,27 @@ mAng dCamera_c::getXZAngle() const { return mXZAngle; } +bool dCamera_c::fn_8019E3C0() const { + if (mActiveCameraIdx == CAM_GAME_0) { + return mGameCam1.getField_0x078() == true; + } else if (mActiveCameraIdx == CAM_GAME_1) { + return mGameCam2.getField_0x078() == true; + } + return false; +} + +void dCamera_c::enterMap() { + if (!checkFlag(CAM_FLAGS_MAP)) { + onFlag(CAM_FLAGS_MAP); + } +} + +void dCamera_c::leaveMap() { + if (checkFlag(CAM_FLAGS_MAP)) { + mMapCam.fn_800932F0(); + } +} + void dCamera_c::applyTilt() { EGG::Matrix34f &mtx = mLookAtCamera.getViewMatrix(); mMtx_c rotMtx; @@ -381,6 +441,11 @@ void dCamera_c::applyTilt() { MTXConcat(rotMtx, mtx.m, mtx.m); } +bool dCamera_c::fn_8019E4D0() const { + dAcPy_c *link = dAcPy_c::GetLinkM(); + return !EventManager::isInEvent() && !(link != nullptr && link->checkActionFlagsCont(0x5d7)); +} + void dCamera_c::updateUnderwaterDepth(const mVec3_c &pos) { mVec3_c chkPos = pos; dBgS_RoofChk roofChk; @@ -498,6 +563,12 @@ void dCamera_c::substruct_1::fn_8019E940() { } } +bool dCamera_c::setEventCamView(const mVec3_c &target, const mVec3_c &pos, f32 fov, f32 tilt) { + CamView view(pos, target, fov, tilt); + getEventCam()->setView(view); + return true; +} + bool dCamera_c::fn_8019EA70(bool b) { CamView view = getEventCam()->getView(); mVec3_c dest; @@ -515,3 +586,7 @@ bool dCamera_c::fn_8019EA70(bool b) { return true; } + +f32 dCamera_c::fn_8019EB90() { + return getGameCam1()->getField_0x0AC(); +} |
