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 | |
| parent | 02c46f14241b2d99d9a68399c4197f493212a301 (diff) | |
d_camera OK
Diffstat (limited to 'src')
| -rw-r--r-- | src/REL/d/a/b/d_a_b_lastboss.cpp | 2 | ||||
| -rw-r--r-- | src/d/d_camera.cpp | 99 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_map.cpp | 6 | ||||
| -rw-r--r-- | src/toBeSorted/d_camera_base.cpp | 16 | ||||
| -rw-r--r-- | src/toBeSorted/d_camera_game.cpp | 8 |
5 files changed, 103 insertions, 28 deletions
diff --git a/src/REL/d/a/b/d_a_b_lastboss.cpp b/src/REL/d/a/b/d_a_b_lastboss.cpp index 718f1cca..fd5656b9 100644 --- a/src/REL/d/a/b/d_a_b_lastboss.cpp +++ b/src/REL/d/a/b/d_a_b_lastboss.cpp @@ -3303,7 +3303,7 @@ void dAcBlastboss_c::executeLightningStrike() { f32 fac = val * 3.0f; tmp1.y += mAng(val * 0x1C20).cos() * fac; } - cam->fn_8019EA00(tmp1, field_0x2D04, field_0x2CFC, 0.0f); + cam->setEventCamView(tmp1, field_0x2D04, field_0x2CFC, 0.0f); if (b2) { mtx1.transS(0.5f, 0.5f, 0.0f); // REGSWAP 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(); +} diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index fcaddb3a..8357b510 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -3309,7 +3309,7 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) { dScGame_c::getCamera(0)->getMapCam()->fn_80093360(); dScGame_c::getCamera(0)->getMapCam()->fn_80093340(); } - dScGame_c::getCamera(0)->fn_8019E410(); + dScGame_c::getCamera(0)->enterMap(); dLytMapMain_vt0x10(); s32 floor = dStage_c::GetInstance()->getMapRelated()->getField_0x1EC(); mCurrentFloor = floor; @@ -3377,7 +3377,7 @@ void dLytMapMain_c::close() { } mEventDone = false; - dScGame_c::getCamera(0)->fn_8019E430(); + dScGame_c::getCamera(0)->leaveMap(); dSndPlayerMgr_c::GetInstance()->leaveMap(); mStateMgr.changeState(StateID_Out); @@ -5048,7 +5048,7 @@ void dLytMapMain_c::forceOut() { dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10; dScGame_c::getCamera(0)->getMapCam()->fn_80093360(); - dScGame_c::getCamera(0)->fn_8019E430(); + dScGame_c::getCamera(0)->leaveMap(); mStateMgr.changeState(StateID_Invisible); } diff --git a/src/toBeSorted/d_camera_base.cpp b/src/toBeSorted/d_camera_base.cpp index d8c163d9..7949c539 100644 --- a/src/toBeSorted/d_camera_base.cpp +++ b/src/toBeSorted/d_camera_base.cpp @@ -22,18 +22,18 @@ bool dCameraBase_c::doCreate(s32 index) { } bool dCameraBase_c::doRemove() { - field_0x01 = false; + mPrevIsActive = false; return remove(); } bool dCameraBase_c::doExecute() { - if (mIsActie && !field_0x01) { - vt_0x08(); - } else if (!mIsActie && field_0x01) { - vt_0x0C(); + if (mIsActive && !mPrevIsActive) { + onBecomeActive(); + } else if (!mIsActive && mPrevIsActive) { + onBecomeInactive(); } - field_0x01 = mIsActie; - if (!mIsActie) { + mPrevIsActive = mIsActive; + if (!mIsActive) { return false; } else { return execute(); @@ -41,7 +41,7 @@ bool dCameraBase_c::doExecute() { } bool dCameraBase_c::doDraw() { - if (field_0x01) { + if (mPrevIsActive) { return draw(); } return false; diff --git a/src/toBeSorted/d_camera_game.cpp b/src/toBeSorted/d_camera_game.cpp index 23a43e05..ba8677c3 100644 --- a/src/toBeSorted/d_camera_game.cpp +++ b/src/toBeSorted/d_camera_game.cpp @@ -282,7 +282,7 @@ dCameraGame_c::dCameraGame_c() field_0x06C(0), field_0x070(0xFFFF), field_0x074(0), - field_0x078(0), + field_0x078(false), field_0x07C(0), field_0x08C(-1), field_0x090(-1), @@ -324,7 +324,7 @@ bool dCameraGame_c::create() { mFlags = 0xA00; field_0x07C = 0; field_0x096 = 0; - field_0x078 = 0; + field_0x078 = false; mChk.fn_8007E130(this); mChk.fn_8007E1B0(field_0x098); @@ -416,9 +416,9 @@ void dCameraGame_c::setView(const CamView &view) { mView = view; mVec3_c diff = view.mPosition - view.mTarget; field_0x02C.setCartesian(diff); - field_0x078 = 0; + field_0x078 = false; } -void dCameraGame_c::vt_0x08() { +void dCameraGame_c::onBecomeActive() { // TODO - ... } |
