summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2026-01-06 21:05:51 +0100
committerrobojumper <robojumper@gmail.com>2026-03-01 20:59:49 +0100
commitac48f9877b3918e2c41557fad76c37563678643e (patch)
tree0e23db3f2fd9924e76aaea12c310cfa6d47097a2 /src
parent02c46f14241b2d99d9a68399c4197f493212a301 (diff)
d_camera OK
Diffstat (limited to 'src')
-rw-r--r--src/REL/d/a/b/d_a_b_lastboss.cpp2
-rw-r--r--src/d/d_camera.cpp99
-rw-r--r--src/d/lyt/d_lyt_map.cpp6
-rw-r--r--src/toBeSorted/d_camera_base.cpp16
-rw-r--r--src/toBeSorted/d_camera_game.cpp8
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 - ...
}