d_camera_map OK

This commit is contained in:
robojumper
2026-01-07 21:48:44 +01:00
parent ac48f9877b
commit fe54824a8b
9 changed files with 213 additions and 111 deletions
+6 -7
View File
@@ -72,7 +72,6 @@ dCamera_c::dCamera_c()
mpScreen(dStageMgr_c::GetInstance()->getScreen(0)),
mYAngle(0),
mXZAngle(0),
field_0xD94(0.0f),
field_0x1F8(0),
field_0x1FC(0),
mFlags(0) {
@@ -90,10 +89,10 @@ int dCamera_c::create() {
mFlags = 0;
mMyCameraIndex = getFromParams(0, 0xF);
dScGame_c::setCamera(mMyCameraIndex, nullptr);
mpCameras[0] = &mGameCam1;
mpCameras[1] = &mGameCam2;
mpCameras[2] = &mEventCam;
mpCameras[3] = &mMapCam;
mpCameras[CAM_GAME_0] = &mGameCam1;
mpCameras[CAM_GAME_1] = &mGameCam2;
mpCameras[CAM_EVENT] = &mEventCam;
mpCameras[CAM_MAP] = &mMapCam;
for (int i = 0; i < CAM_MAX; i++) {
if (mpCameras[i] == nullptr) {
@@ -263,7 +262,7 @@ void dCamera_c::checkCameraChange() {
offFlag(CAM_FLAGS_0x4);
}
if (checkFlag(CAM_FLAGS_MAP) && mActiveCameraIdx == CAM_MAP && !mMapCam.fn_800932E0()) {
if (checkFlag(CAM_FLAGS_MAP) && mActiveCameraIdx == CAM_MAP && !mMapCam.isActiveOrAnimating()) {
offFlag(CAM_FLAGS_MAP);
onFlag(CAM_FLAGS_0x4);
getGameCam1()->onFlag(0x10000);
@@ -430,7 +429,7 @@ void dCamera_c::enterMap() {
void dCamera_c::leaveMap() {
if (checkFlag(CAM_FLAGS_MAP)) {
mMapCam.fn_800932F0();
mMapCam.startOut();
}
}
+37 -33
View File
@@ -2224,7 +2224,7 @@ static const char *sPriorityGroupNames[] = {
};
void dLytMapMain_c::build() {
mIsVisible = 0;
mIsVisible = false;
field_0x8DB0 = 0;
if (dScGame_c::isCurrentStage("F102")) {
// awesome but unnecessary
@@ -2359,7 +2359,7 @@ void dLytMapMain_c::build() {
mAnmGroups[MAP_MAIN_ANIM_IN].unbind();
mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false);
field_0x8C8C = mAnmGroups[MAP_MAIN_ANIM_OUT].getLastFrame();
mOutDuration = mAnmGroups[MAP_MAIN_ANIM_OUT].getLastFrame();
mAnmGroups[MAP_MAIN_ANIM_OUT].unbind();
field_0x8CAC = 0;
mDisplayedBeaconCount = getMaxBeaconCount();
@@ -3182,18 +3182,17 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) {
}
mMarkers.setLinkRot(link->getRotation());
// TODO - mAng nonsense?
field_0x8D68 = dScGame_c::getCamera(0)->getXZAngle();
mpAllPane->SetVisible(false);
getGlobal()->setField_0x55(field_0x8CAE);
mDoCameraTransition = false;
mCameraTransitionPossible = false;
switch (event) {
case MAP_EVENT_NONE: {
if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR && field_0x8CAE) {
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM;
mNextMapMode = mCurrentMapMode;
mMapUpDirection = false;
mDoCameraTransition = true;
mCameraTransitionPossible = true;
} else {
if (!sSavedMapData.entries[mRoomType].isValid) {
if (MinigameManager::isInMinigameState(MinigameManager::SPIRAL_CHARGE_TUTORIAL)) {
@@ -3201,7 +3200,7 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) {
fn_80142C80(mCurrentMapMode);
// TODO - regswap (???)
mMapUpDirection = false;
mDoCameraTransition = true;
mCameraTransitionPossible = true;
} else {
loadMapState();
if (mRoomType == ROOMTYPE_SKYFIELD) {
@@ -3212,21 +3211,21 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) {
mMapUpDirection = true;
}
if (mMapUpDirection == false) {
mDoCameraTransition = true;
mCameraTransitionPossible = true;
}
}
} else {
loadMapState();
if (mMapUpDirection == false) {
mDoCameraTransition = true;
mCameraTransitionPossible = true;
}
}
if (link->checkActionFlags(daPlayerActBase_c::FLG0_CRAWLING)) {
mDoCameraTransition = false;
mCameraTransitionPossible = false;
}
}
if (mRoomType == ROOMTYPE_DUNGEON) {
mDoCameraTransition = false;
mCameraTransitionPossible = false;
}
break;
}
@@ -3255,7 +3254,7 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) {
case 1: mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; break;
}
mMapUpDirection = true;
mDoCameraTransition = false;
mCameraTransitionPossible = false;
break;
}
case MAP_EVENT_MAP_INTRO: {
@@ -3265,7 +3264,7 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) {
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_WORLD;
}
mMapUpDirection = true;
mDoCameraTransition = false;
mCameraTransitionPossible = false;
break;
}
case MAP_EVENT_DUNGEON_MAP_GET:
@@ -3278,20 +3277,20 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) {
case MAP_EVENT_SW_BANK_SMALL: {
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
mMapUpDirection = true;
mDoCameraTransition = false;
mCameraTransitionPossible = false;
break;
}
case MAP_EVENT_FIELD_MAP_CHANGE_5:
case MAP_EVENT_FIELD_MAP_CHANGE_8: {
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
mMapUpDirection = true;
mDoCameraTransition = false;
mCameraTransitionPossible = false;
break;
}
case MAP_EVENT_SAVE_OBJ: {
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE;
mMapUpDirection = true;
mDoCameraTransition = false;
mCameraTransitionPossible = false;
break;
}
}
@@ -3300,13 +3299,13 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) {
mNextMapMode = mCurrentMapMode;
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE ||
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) {
mDoCameraTransition = false;
mCameraTransitionPossible = false;
}
if (mDoCameraTransition) {
dScGame_c::getCamera(0)->getMapCam()->fn_80093380();
if (mCameraTransitionPossible) {
dScGame_c::getCamera(0)->getMapCam()->setCameraTransition();
} else {
dScGame_c::getCamera(0)->getMapCam()->fn_80093360();
dScGame_c::getCamera(0)->getMapCam()->setNoCameraTransition();
dScGame_c::getCamera(0)->getMapCam()->fn_80093340();
}
dScGame_c::getCamera(0)->enterMap();
@@ -3349,27 +3348,27 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) {
void dLytMapMain_c::close() {
dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10;
mDoCameraTransition = false;
mCameraTransitionPossible = false;
if (mMapEvent == MAP_EVENT_NONE) {
if (mRoomType == ROOMTYPE_FIELD || mRoomType == ROOMTYPE_SKYLOFT) {
if (!field_0x8CAE && !mMapUpDirection) {
mDoCameraTransition = true;
mCameraTransitionPossible = true;
}
} else if (mRoomType == ROOMTYPE_DUNGEON && !field_0x8CAE && !mMapUpDirection) {
mDoCameraTransition = false;
mCameraTransitionPossible = false;
dScGame_c::getCamera(0)->getMapCam()->fn_80093340();
}
}
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE ||
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) {
mDoCameraTransition = false;
mCameraTransitionPossible = false;
}
if (mDoCameraTransition) {
dScGame_c::getCamera(0)->getMapCam()->fn_80093380();
if (mCameraTransitionPossible) {
dScGame_c::getCamera(0)->getMapCam()->setCameraTransition();
} else {
dScGame_c::getCamera(0)->getMapCam()->fn_80093360();
dScGame_c::getCamera(0)->getMapCam()->setNoCameraTransition();
}
if (mMapEvent == MAP_EVENT_NONE) {
@@ -4088,6 +4087,10 @@ void dLytMapMain_c::setupFlags() {
}
}
void dLytMapMain_c::fn_8013B350() {
field_0x8C84 = 1;
}
void dLytMapMain_c::initializeState_In() {
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
displaySaveObjs();
@@ -4096,7 +4099,7 @@ void dLytMapMain_c::initializeState_In() {
}
}
if (mDoCameraTransition || mMapEvent == MAP_EVENT_MAP_INTRO) {
if (mCameraTransitionPossible || mMapEvent == MAP_EVENT_MAP_INTRO) {
mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN];
} else {
mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN_NO_CAM];
@@ -4108,10 +4111,11 @@ void dLytMapMain_c::initializeState_In() {
mPinIconAggregate.setScale(getGlobal()->getZoomFrame());
}
void dLytMapMain_c::executeState_In() {
mIsVisible = 1;
mIsVisible = true;
dLytMapGlobal_c *global = getGlobal();
if ((!mDoCameraTransition || !field_0x8C84) && mDoCameraTransition) {
// ???
if ((!mCameraTransitionPossible || !field_0x8C84) && mCameraTransitionPossible) {
return;
}
@@ -4596,7 +4600,7 @@ void dLytMapMain_c::initializeState_Out() {
mPopupInfo.mStateMgr.changeState(StateID_Out);
}
dLytMeter_c::GetInstance()->setMeterMode(dLytMeterMain_c::MODE_MAP_INIT);
if (mDoCameraTransition || mMapEvent == MAP_EVENT_MAP_INTRO) {
if (mCameraTransitionPossible || mMapEvent == MAP_EVENT_MAP_INTRO) {
mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT];
} else {
mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM];
@@ -4604,7 +4608,7 @@ void dLytMapMain_c::initializeState_Out() {
mpInOutAnmGroup->bind(false);
mpInOutAnmGroup->setFrame(0.0f);
field_0x8C8C = mpInOutAnmGroup->getLastFrame();
mOutDuration = mpInOutAnmGroup->getLastFrame();
if (fn_80141530()) {
dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10;
@@ -4620,7 +4624,7 @@ void dLytMapMain_c::executeState_Out() {
dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10;
mLyt.calc();
mpInOutAnmGroup->unbind();
mIsVisible = 0;
mIsVisible = false;
mStateMgr.changeState(StateID_Invisible);
}
}
@@ -5047,7 +5051,7 @@ void dLytMapMain_c::forceOut() {
mAnmGroups[MAP_MAIN_ANIM_OUT].unbind();
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)->getMapCam()->setNoCameraTransition();
dScGame_c::getCamera(0)->leaveMap();
mStateMgr.changeState(StateID_Invisible);
}
+102 -13
View File
@@ -6,6 +6,8 @@
#include "d/col/bg/d_bg_s.h"
#include "d/col/bg/d_bg_s_lin_chk.h"
#include "d/col/cc/d_cc_s.h"
#include "d/d_sc_game.h"
#include "d/lyt/d_lyt_map.h"
#include "m/m_vec.h"
#include "toBeSorted/d_camera_math.h"
#include "toBeSorted/deg_angle_util.h"
@@ -86,12 +88,67 @@ mVec3_c fn_800929C0(const mVec3_c &p2, const mVec3_c &p3, dAcObjBase_c *obj) {
return ret;
}
bool dCameraMap_c::execute() {
s16 unk = sHio.field_0x28;
void dCameraMap_c::onBecomeActive() {
mTimer = 0;
mSourceView = mView;
mTargetView = mView;
if (!(sHio.field_0x3C & 0x100)) {
mTargetView.mPosition = mTargetView.mTarget;
}
mTargetView.mPosition.y += sHio.field_0x08;
mTargetView.mFov = sHio.field_0x24;
mTargetView.mTilt = 0.0f;
dLytMap_c::GetInstance()->doFn_8013B350();
dPolar polar(mView.mPosition - mView.mTarget);
field_0xC4 = polar.V.value;
mIsMovingOut = false;
mIsActiveOrAnimating = true;
}
if ((sHio.field_0x3C & 0x200) && field_0xAC) {
void dCameraMap_c::onBecomeInactive() {
mIsMovingOut = true;
dScGame_c::getCamera()->getGameCam1()->setView(mView);
}
bool dCameraMap_c::create() {
dAcPy_c *link = dAcPy_c::GetLinkM();
if (link == nullptr) {
return false;
}
field_0x44 = link;
mView.mTarget = link->mPosition + mVec3_c(0.0f, 100.0f, 0.0f);
mVec3_c v(0.0f, 200.0f, 500.0f);
v.rotY(link->mRotation.y - 0x8000);
mView.mPosition = mView.mTarget + v;
mView.mFov = 55.0f;
mView1 = mView;
field_0x3C = sHio.field_0x04;
field_0x40 = 0.0f;
field_0x38 = 0.0f;
field_0x2C = mVec3_c::Zero;
mIsActiveOrAnimating = false;
mIsMovingOut = true;
field_0xB0 = 0;
mTimer = 0;
return true;
}
bool dCameraMap_c::remove() {
return true;
}
bool dCameraMap_c::execute() {
s16 duration = sHio.field_0x28;
if ((sHio.field_0x3C & 0x200) && mIsMovingOut) {
// TODO no-op
unk = sHio.field_0x28;
duration = sHio.field_0x28;
}
field_0x40 = 1.0f;
@@ -107,28 +164,29 @@ bool dCameraMap_c::execute() {
if (sHio.field_0x3C & 0x10) {
if (sHio.field_0x3E == 1) {
// Reorients the main camera to point to north when opening the map without a transition... unused
dPolar polar(mSourceView.mPosition - mSourceView.mTarget);
polar.V.Set(0.0f);
mSourceView.mPosition = mSourceView.mTarget + polar.toCartesian();
}
mTargetView = mSourceView;
field_0xB8 = 1;
mTimer = 1;
}
if (field_0xAC != 0) {
if (field_0xB8 > 0) {
field_0xB8--;
if (field_0xB8 == 0) {
field_0xB4 = 0;
if (mIsMovingOut) {
if (mTimer > 0) {
mTimer--;
if (mTimer == 0) {
mIsActiveOrAnimating = false;
}
}
} else {
if (field_0xB8 < unk) {
field_0xB8++;
if (mTimer < duration) {
mTimer++;
}
}
f32 f = (f32)field_0xB8 / (f32)unk;
f32 f = (f32)mTimer / (f32)duration;
f32 f5 = camEaseInOut(f, sHio.field_0x2C);
f32 f6 = camEaseInOut(f, sHio.field_0x30);
f32 f8 = f5 * 0.99f;
@@ -146,6 +204,37 @@ bool dCameraMap_c::execute() {
return true;
}
bool dCameraMap_c::vt_0x34() {
return true;
}
bool dCameraMap_c::draw() {
return true;
}
bool dCameraMap_c::isActiveOrAnimating() const {
return mIsActiveOrAnimating;
}
void dCameraMap_c::startOut() {
mIsMovingOut = true;
if (sHio.field_0x3C & 0x200) {
mTimer = dLytMap_c::GetInstance()->getOutDuration() + 0.1f;
}
}
void dCameraMap_c::fn_80093340() {
sHio.field_0x3E = 2;
}
void dCameraMap_c::setNoCameraTransition() {
sHio.field_0x3C |= 0x10 | 0x8;
}
void dCameraMap_c::setCameraTransition() {
sHio.field_0x3C &= ~(0x10 | 0x8);
}
void dCameraMap_c::setView(const CamView &view) {
mView1 = view;
mView = view;