summaryrefslogtreecommitdiff
path: root/src/toBeSorted/d_camera_game.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2026-01-11 00:24:23 +0100
committerrobojumper <robojumper@gmail.com>2026-03-01 21:00:16 +0100
commit1ec9c01b837174c82d9f9d081fff4e05f5556748 (patch)
treea353c11bee20811774aec5094458f784db42730b /src/toBeSorted/d_camera_game.cpp
parentfe54824a8b31d2e3caccfd8726a4a6af53fa3770 (diff)
Progress on game cam
Diffstat (limited to 'src/toBeSorted/d_camera_game.cpp')
-rw-r--r--src/toBeSorted/d_camera_game.cpp873
1 files changed, 858 insertions, 15 deletions
diff --git a/src/toBeSorted/d_camera_game.cpp b/src/toBeSorted/d_camera_game.cpp
index ba8677c3..4fc7d1a0 100644
--- a/src/toBeSorted/d_camera_game.cpp
+++ b/src/toBeSorted/d_camera_game.cpp
@@ -3,11 +3,14 @@
#include "toBeSorted/d_camera_game.h"
#include "common.h"
+#include "d/a/d_a_base.h"
#include "d/a/d_a_player.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/col/bg/d_bg_s.h"
#include "d/col/bg/d_bg_s_lin_chk.h"
#include "d/col/bg/d_bg_s_roof_chk.h"
+#include "d/col/bg/d_bg_s_sph_chk.h"
+#include "d/col/cc/d_cc_s.h"
#include "d/d_bzs_types.h"
#include "d/d_player_act.h"
#include "d/d_room.h"
@@ -15,6 +18,7 @@
#include "d/d_stage.h"
#include "m/m_angle.h"
#include "m/m_vec.h"
+#include "nw4r/math/math_types.h"
#include "sized_string.h"
#include "toBeSorted/arc_managers/oarc_manager.h"
#include "toBeSorted/attention.h"
@@ -28,15 +32,333 @@ public:
void remove();
public:
- /* 0x004 */ u8 _0x004[0x0E8 - 0x004];
+ /* 0x004 */ u8 _0x004[0x0CE - 0x004];
+
+ /* 0x0CE */ s16 field_0x0CE;
+
+ /* 0x0D0 */ u8 _0x0D0[0x0E8 - 0x0D0];
/* 0x0E8 */ f32 field_0x0E8;
/* 0x0EC */ u8 _0x0EC[0x138 - 0x0EC];
};
-static dCameraGame_HIO_c sHio;
dCameraGame_HIO_c::~dCameraGame_HIO_c() {}
+static dCameraGame_HIO_c sHio;
+
+class GameCameraHandler {
+public:
+ GameCameraHandler() : field_0x00(false), mStyleIdx(0), field_0x0C(0), mCounter(0) {}
+
+ bool doInit(dCameraGame_c *cam, u16 u3, UNKWORD u4);
+ bool doExecute();
+
+protected:
+ /* 0x00 */ bool field_0x00;
+ // vtable at 0x04
+ /* vt 0x08 */ virtual bool init() {
+ return true;
+ }
+ /* vt 0x0C */ virtual bool vt_0x0C() {
+ return vt_0x10();
+ }
+ /* vt 0x10 */ virtual bool vt_0x10() {
+ return true;
+ }
+
+ /* 0x08 */ u16 mStyleIdx;
+ /* 0x0C */ UNKWORD field_0x0C;
+ /* 0x10 */ CamId field_0x10;
+ /* 0x18 */ dCamera_c *mpCamera;
+ /* 0x1C */ dCameraGame_c *mpGameCamera;
+ /* 0x20 */ dAcObjBase_c *field_0x20;
+ /* 0x24 */ UNKWORD mCounter;
+};
+
+// "Lockon"
+class GameCameraHandler03 : public GameCameraHandler {
+public:
+ GameCameraHandler03() {}
+
+ virtual bool init() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ dAcRef_c<dAcObjBase_c> field_0x28;
+ /* 0x34 */ dAcRef_c<dAcObjBase_c> field_0x34;
+ /* 0x40 */ dPolar field_0x40;
+ /* 0x4C */ u8 _0x4C[0xA8 - 0x4C];
+};
+
+class GameCameraHandler00 : public GameCameraHandler {
+public:
+private:
+};
+
+// "Chase"
+class GameCameraHandler01 : public GameCameraHandler {
+public:
+ GameCameraHandler01() : field_0x2C(0.0f), field_0xAC(0.0f), field_0xB0(0.0f) {}
+
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ u8 _0x28[0x2C - 0x28];
+ /* 0x2C */ f32 field_0x2C;
+ /* 0x30 */ u8 _0x30[0xAC - 0x30];
+ /* 0xAC */ f32 field_0xAC;
+ /* 0xB0 */ f32 field_0xB0;
+ /* 0xB4 */ u8 _0xB4[0xC0 - 0xB4];
+};
+
+class GameCameraHandler02 : public GameCameraHandler {
+public:
+ GameCameraHandler02() : field_0x6C(0.0f, 0.0f, 0.0f) {}
+
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+ struct UnkStruct {
+ UnkStruct() : field_0x04(0.0f), field_0x08(0.0f), field_0x0C(0.0f) {}
+
+ /* 0x00 */ u8 _0x00[0x04 - 0x00];
+ /* 0x04 */ f32 field_0x04;
+ /* 0x08 */ f32 field_0x08;
+ /* 0x0C */ f32 field_0x0C;
+ /* 0x10 */ u8 _0x10[0x18 - 0x10];
+ };
+
+ /* 0x28 */ u8 _0x28[0x6C - 0x28];
+ /* 0x6C */ mVec3_c field_0x6C;
+ /* 0x78 */ u8 _0x88[0x88 - 0x78];
+ /* 0x88 */ dAcRef_c<dAcObjBase_c> mRef; // not sure
+ /* 0x94 */ u8 _0x94[0xB0 - 0x94];
+ /* 0xB0 */ UnkStruct field_0xB0[4];
+};
+
+class GameCameraHandler04 : public GameCameraHandler {
+public:
+ virtual bool init() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ u8 _0x28[0x6C - 0x28];
+ /* 0x6C */ dPolar field_0x6C;
+};
+
+class GameCameraHandler05 : public GameCameraHandler {
+public:
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ u8 _0x28[0x6C - 0x28];
+ /* 0x6C */ dPolar field_0x6C;
+ /* 0x78 */ dAcRef_c<dAcObjBase_c> field_0x78;
+ /* 0x84 */ u8 _0x84[0x8C - 0x84];
+};
+
+class GameCameraHandler06 : public GameCameraHandler {
+public:
+ GameCameraHandler06() : field_0x70(0.0f), field_0x9C(0.0f), field_0xA0(0.0f) {}
+
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ dAcRef_c<dAcObjBase_c> field_0x28;
+ /* 0x34 */ u8 _0x34[0x4C - 0x34];
+ /* 0x4C */ dPolar field_0x4C;
+ /* 0x58 */ u8 _0x58[0x70 - 0x58];
+ /* 0x70 */ f32 field_0x70;
+ /* 0x74 */ u8 _0x74[0x9C - 0x74];
+ /* 0x9C */ f32 field_0x9C;
+ /* 0xA0 */ f32 field_0xA0;
+ /* 0xA4 */ u8 _0xA4[0xB8 - 0xA4];
+};
+
+class GameCameraHandler07 : public GameCameraHandler {
+public:
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ dAcRef_c<dAcObjBase_c> field_0x28;
+ /* 0x34 */ u8 _0x34[0x68 - 0x34];
+};
+
+class GameCameraHandler08 : public GameCameraHandler {
+public:
+ GameCameraHandler08() : field_0x78(0.0f) {}
+
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ dAcRef_c<dAcObjBase_c> field_0x28;
+ /* 0x34 */ u8 _0x34[0x4C - 0x34];
+ /* 0x4C */ dPolar field_0x4C;
+ /* 0x58 */ u8 _0x58[0x78 - 0x58];
+ /* 0x78 */ f32 field_0x78;
+ /* 0x7C */ u8 _0x7C[0x94 - 0x7C];
+ /* 0x94 */ dPolar field_0x94;
+};
+
+class GameCameraHandler09 : public GameCameraHandler {
+public:
+ GameCameraHandler09() : field_0x2C(0.0f) {}
+
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ u8 _0x28[0x2C - 0x28];
+ /* 0x2C */ f32 field_0x2C;
+ /* 0x30 */ u8 _0x30[0xA0 - 0x30];
+};
+
+class GameCameraHandler10 : public GameCameraHandler {
+public:
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+};
+
+class GameCameraHandler11 : public GameCameraHandler {
+public:
+ GameCameraHandler11() : field_0x38(0.0f), field_0xC4(0.0f) {}
+
+ virtual bool init() override;
+ virtual bool vt_0x0C() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ dAcRef_c<dAcObjBase_c> field_0x28;
+ /* 0x34 */ u8 _0x34[0x38 - 0x24];
+ /* 0x38 */ f32 field_0x38;
+ /* 0x3C */ u8 _0x3C[0xC4 - 0x3C];
+ /* 0xC4 */ f32 field_0xC4;
+};
+
+class GameCameraHandler12 : public GameCameraHandler {
+public:
+ virtual bool init() override;
+ virtual bool vt_0x10() override;
+
+private:
+ /* 0x28 */ u8 _0x28[0x50 - 0x28];
+};
+
+// TODO this sinit function is awful
+
+f32 floats00[] = {0.0f};
+u16 flags00[] = {0};
+CamStyle style00(0, 0, floats00, ARRAY_LENGTH(floats00), flags00, 1);
+static UNKWORD word00;
+
+f32 floats01[] = {
+ 0.0f, 400.0f, 400.0f, 0.5f, 20.0f, 20.0f, 0.25f, 10.0f, 10.0f, 0.25f,
+ 60.0f, 60.0f, 0.15f, 0.4f, 0.5f, 1.0f, 25.0f, 0.0f, 1.0f,
+};
+u16 flags01[] = {0x96};
+CamStyle style01(0, 0, floats01, ARRAY_LENGTH(floats01), flags01, 16);
+static UNKWORD word01;
+
+f32 floats02[] = {
+ 0.0f, 0.0f, 20.0f, 0.0f, 50.0f, 0.0f, 20.0f, 8.0f,
+};
+u16 flags02[] = {0};
+CamStyle style02(0, 0, floats02, ARRAY_LENGTH(floats02), flags02, 14);
+static UNKWORD word02;
+
+f32 floats03[] = {
+ 0.0f, 100.0f, 1000.0f, 0.1f, 400.0f, 400.0f, 0.2f, 0.0f, 0.0f, 0.4f, 10.0f, 10.0f,
+ 0.2f, 50.0f, 20.0f, 0.2f, 50.0f, 50.0f, 0.2f, 0.6f, 0.0f, 1.0f, 0.0f,
+};
+u16 flags03[] = {0x4A};
+CamStyle style03(0, 0, floats03, ARRAY_LENGTH(floats03), flags03, 8);
+static UNKWORD word03;
+
+f32 floats04[] = {
+ 0.0f, 1.0f, 1.0f, 0.5f, 40.0f, 1000.0f,
+};
+u16 flags04[] = {0x00};
+CamStyle style04(0, 0, floats04, ARRAY_LENGTH(floats04), flags04, 2);
+static UNKWORD word04;
+
+f32 floats05[] = {
+ 0.0f,
+ 50.0f,
+ 1.0f,
+ 1.0f,
+};
+u16 flags05[] = {0x2};
+CamStyle style05(0, 0, floats05, ARRAY_LENGTH(floats05), flags05, 4);
+static UNKWORD word05;
+
+f32 floats06[] = {
+ 0.0f, 5.0f, 20.0f, 400.0f, 400.0f, 0.5f, 20.0f, 20.0f, 0.25f, 10.0f, 10.0f, 0.25f, 60.0f,
+ 60.0f, 0.15f, 0.4f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.2f,
+};
+u16 flags06[] = {0x202};
+CamStyle style06(0, 0, floats06, ARRAY_LENGTH(floats06), flags06, 14);
+static UNKWORD word06;
+
+f32 floats07[] = {
+ 0.0f, -1.0f, 0.0f, 1.0f, 0.5f,
+};
+u16 flags07[] = {0x2};
+CamStyle style07(0, 0, floats07, ARRAY_LENGTH(floats07), flags07, 4);
+static UNKWORD word07;
+
+f32 floats08[] = {
+ 0.0f, 5.0f, 20.0f, 400.0f, 400.0f, 0.5f, 20.0f, 20.0f, 0.25f, 10.0f, 10.0f,
+ 0.25f, 60.0f, 60.0f, 0.15f, 0.4f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f,
+};
+u16 flags08[] = {0x6};
+CamStyle style08(0, 0, floats08, ARRAY_LENGTH(floats08), flags08, 3);
+static UNKWORD word08;
+
+f32 floats09[] = {
+ 0.0f, 400.0f, 400.0f, 0.5f, 20.0f, 20.0f, 0.25f, 60.0f, 10.0f, 0.25f, 60.0f, 60.0f,
+ 0.15f, 0.4f, 0.5f, 0.75f, 25.0f, 1.0f, 500.0f, 150.0f, 250.0f, 0.0f, 150.0f, 1.0f,
+};
+u16 flags09[] = {0x46};
+CamStyle style09(0, 0, floats09, ARRAY_LENGTH(floats09), flags09, 7);
+static UNKWORD word09;
+
+f32 floats10[] = {
+ 0.0f,
+};
+u16 flags10[] = {0x00};
+CamStyle style10(0, 0, floats10, ARRAY_LENGTH(floats10), flags10, 1);
+static UNKWORD word10;
+
+f32 floats11[] = {
+ 0.0f, 1000.0f, 5000.0f, 400.0f, 400.0f, 0.5f, 20.0f, 20.0f, 0.25f, 10.0f, 10.0f, 0.25f, 60.0f,
+ 60.0f, 0.15f, 0.4f, 0.5f, 1.0f, 25.0f, 0.0f, 1.0f, 75.0f, 0.0f, 0.0f, 300.0f, 1500.0f,
+};
+u16 flags11[] = {0x116};
+CamStyle style11(0, 0, floats11, ARRAY_LENGTH(floats11), flags11, 10);
+static UNKWORD word11;
+
+f32 floats12[] = {
+ 0.0f, 500.0f, 50.0f, 0.4f, 0.1f, 0.25f,
+};
+u16 flags12[] = {0x00};
+CamStyle style12(0, 0, floats12, ARRAY_LENGTH(floats12), flags12, 2);
+static UNKWORD word12;
CamParamHeader *dCameraGame_c::sHeader;
f32 *dCameraGame_c::sFloats;
@@ -47,10 +369,55 @@ CamParamTrend *dCameraGame_c::sTrends;
s32 dCameraGame_c::sTrendIdxes[CAM_TREND_IDX_MAX];
s32 dCameraGame_c::sStyleIdxes[CAM_STYLE_IDX_MAX];
+dAcRef_c<dAcObjBase_c> sRef;
+
+struct CamVecBundleNotSure {
+ CamVecBundleNotSure(mVec3_c _00, mVec3_c _01, f32 _02, f32 _03)
+ : field_0x00(_00), field_0x0C(_01), field_0x18(_02), field_0x1C(_03) {}
+ /* 0x00 */ mVec3_c field_0x00;
+ /* 0x0C */ mVec3_c field_0x0C;
+ /* 0x18 */ f32 field_0x18;
+ /* 0x1C */ f32 field_0x1C;
+};
+
+CamVecBundleNotSure sVecs1(mVec3_c(-550.0f, 500.0f, -1000.0f), mVec3_c(-150.0f, 320.0f, -350.0f), 60.0f, 0.0f);
+CamVecBundleNotSure sVecs2(mVec3_c(-550.0f, 500.0f, -1000.0f), mVec3_c(-150.0f, -100.0f, -350.0f), 60.0f, 0.0f);
+CamVecBundleNotSure sVecs3(mVec3_c(-900.0f, 680.0f, 850.0f), mVec3_c(-440.0f, 380.0f, 280.0f), 60.0f, 0.0f);
+CamVecBundleNotSure sVecs4(mVec3_c(-90.0f, 80.0f, -285.0f), mVec3_c(0.0f, 100.0f, 0.0f), 55.0f, 0.0f);
+
+GameCameraHandler06 camHandlerUnused00;
+GameCameraHandler08 camHandlerUnused01;
+
+GameCameraHandler00 camHandler00;
+GameCameraHandler01 camHandler01;
+GameCameraHandler02 camHandler02;
+GameCameraHandler03 camHandler03;
+GameCameraHandler04 camHandler04;
+GameCameraHandler05 camHandler05;
+GameCameraHandler06 camHandler06;
+GameCameraHandler07 camHandler07;
+GameCameraHandler08 camHandler08;
+GameCameraHandler09 camHandler09;
+GameCameraHandler10 camHandler10;
+GameCameraHandler11 camHandler11;
+GameCameraHandler12 camHandler12;
+
+// clang-format off
+/////////////////////////////////////////////////////////////////
+// //
+// START ACTUAL CODE //
+// //
+/////////////////////////////////////////////////////////////////
+// clang-format on
+
void debugPrintf4(const char *fmt, ...) {
// no-op
}
+void debugPrintf6(UNKWORD a, UNKWORD b, const char *fmt, ...) {
+ // no-op
+}
+
static s32 getCurrentRoomId() {
return dAcPy_c::GetLinkM()->mRoomID;
}
@@ -84,8 +451,8 @@ s32 dCameraGame_c::getTrendIndex(const char *name) {
s32 dCameraGame_c::getStyleIndex(u32 id) {
for (int i = 0; i < sHeader->numStyles; i++) {
- // Temp needed... inline?
- s32 otherId = sStyles[i].id;
+ // Temp needed...
+ u32 otherId = *(u32 *)sStyles[i].id;
if (otherId == id) {
return i;
}
@@ -157,6 +524,246 @@ bool dCameraGame_c::initCamParamDat() {
return true;
}
+bool GameCameraHandler::doInit(dCameraGame_c *cam, u16 u3, UNKWORD u4) {
+ mStyleIdx = u3;
+ field_0x0C = u4;
+ mCounter = 0;
+ field_0x00 = 0;
+ field_0x20 = dAcPy_c::GetLinkM();
+ mpCamera = dScGame_c::getCamera();
+ mpGameCamera = cam;
+ field_0x10 = cam->getCamId0x60();
+ init();
+ return true;
+}
+
+bool GameCameraHandler::doExecute() {
+ field_0x20 = dAcPy_c::GetLinkM();
+ if (!field_0x00) {
+ field_0x00 = vt_0x0C();
+ } else {
+ field_0x00 = vt_0x10();
+ }
+ mCounter++;
+ return field_0x00;
+}
+
+bool GameCameraHandler03::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler03::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler01::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler01::vt_0x0C() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler01::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler02::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler02::vt_0x0C() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler02::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler04::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler04::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler05::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler05::vt_0x0C() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler05::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler06::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler06::vt_0x0C() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler06::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler07::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler07::vt_0x0C() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler07::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler08::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler08::vt_0x0C() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler08::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler09::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler09::vt_0x0C() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler09::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler10::init() {
+ // TODO - ...
+ // style10.loadStyle(mStyleIdx);
+ return true;
+}
+
+bool GameCameraHandler10::vt_0x0C() {
+ return true;
+}
+
+bool GameCameraHandler10::vt_0x10() {
+ field_0x20 = dAcPy_c::GetLinkM();
+ return true;
+}
+
+bool GameCameraHandler11::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler11::vt_0x0C() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler11::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler12::init() {
+ // TODO - ...
+ return true;
+}
+
+bool GameCameraHandler12::vt_0x10() {
+ // TODO - ...
+ return true;
+}
+
+struct CameraDefinition {
+ /* 0x00 */ GameCameraHandler *pHandler;
+ /* 0x04 */ UNKWORD id;
+ /* 0x08 */ UNKWORD unk;
+ /* 0x0C */ CamStyle *pStyle;
+};
+
+CameraDefinition sCamDefs[] = {
+ {&camHandler00, 0, word00, &style00},
+ {&camHandler01, 1, word01, &style01},
+ {&camHandler02, 2, word02, &style02},
+ {&camHandler03, 3, word03, &style03},
+ {&camHandler04, 4, word04, &style04},
+ {&camHandler05, 5, word05, &style05},
+ {&camHandler06, 6, word06, &style06},
+ {&camHandler07, 7, word07, &style07},
+ {&camHandler08, 8, word08, &style08},
+ {&camHandler09, 9, word09, &style09},
+ {&camHandler10, 10, word10, &style10},
+ {&camHandler11, 11, word11, &style11},
+ {&camHandler12, 12, word12, &style12},
+};
+
+void CamStyle::loadStyle(u16 styleIdx) {
+ mStyleIndex = styleIdx;
+ mId[0] = dCameraGame_c::getStyle(styleIdx)->id[0];
+ mId[1] = dCameraGame_c::getStyle(styleIdx)->id[1];
+ mId[2] = dCameraGame_c::getStyle(styleIdx)->id[2];
+ mId[3] = dCameraGame_c::getStyle(styleIdx)->id[3];
+ mId[4] = '\0';
+ mpParamFloats = dCameraGame_c::getFloats(dCameraGame_c::getStyle(styleIdx)->floatParamOffset);
+ mpParamFlags = dCameraGame_c::getFlags(dCameraGame_c::getStyle(styleIdx)->flagParamOffset);
+
+ for (int i = 0; i < mNumFloats; i++) {
+ mpFloats[i] = mpParamFloats[i];
+ }
+
+ // TODO: Why 14???
+ for (int i = 0; i < mNumFlags; i += 14) {
+ mpFlags[i] = mpParamFlags[i];
+ }
+}
+
+f32 CamStyle::getFloat(s32 idx) const {
+ return mpFloats[idx];
+}
+
+bool CamStyle::getFlag(s32 flag) const {
+ return ((1 << (flag & ((1 << 14) - 1))) & mpFlags[flag >> 14]) != 0;
+}
+
dCameraGame_HIO_c::dCameraGame_HIO_c() {
// TODO - ...
}
@@ -243,7 +850,7 @@ void UnkCamChecks::fn_8007E1B0(dAcObjBase_c *ac) {
if (mChk1.field_0x000 && ac == link && link->checkActionFlags(daPlayerActBase_c::FLG0_IN_WATER)) {
mChk1.camId.roomCamId = dBgS::GetInstance()->GetRoomCamId(mChk1.chk);
mChk1.camId.roomId = dBgS::GetInstance()->GetRoomId(mChk1.chk);
- if (!mChk1.camId.someCheck()) {
+ if (!mChk1.camId.isValid()) {
mChk1.camId.clear();
}
} else {
@@ -255,7 +862,7 @@ void UnkCamChecks::fn_8007E1B0(dAcObjBase_c *ac) {
} else if (mChk2.field_0x000) {
mChk2.camId.roomCamId = dBgS::GetInstance()->GetRoomCamId(mChk2.chk);
mChk2.camId.roomId = dBgS::GetInstance()->GetRoomId(mChk2.chk);
- if (!mChk2.camId.someCheck()) {
+ if (!mChk2.camId.isValid()) {
mChk2.camId.clear();
}
} else {
@@ -352,42 +959,221 @@ bool dCameraGame_c::create() {
return true;
}
-bool dCameraGame_c::draw() {
- return true;
+bool dCameraGame_c::execute() {
+ // TODO - ...
}
// TODO: make these static when they're actually used
-inline bool linChkAttentionTarget_(const mVec3_c &from, const mVec3_c &to, dBgS_LinChk &chk) {
+bool chkCamera(mVec3_c &v1, mVec3_c &v2, dAcObjBase_c *obj) {
+ dAcPy_c *link = dAcPy_c::GetLinkM();
+ bool isNotLink = obj != nullptr && obj != link;
+ return dCcS::GetInstance()->ChkCamera(
+ v1, v2, 15.0f, link, isNotLink ? obj : nullptr, (dAcObjBase_c *)link->getLinkage().mControllingActor.p_owner
+ );
+}
+
+bool chkCo(const mVec3_c &v1) {
+ dAcPy_c *link = dAcPy_c::GetLinkM();
+ return dCcS::GetInstance()->ChkCo(v1, link);
+}
+
+bool chkCameraPoint(const mVec3_c &p2, const mVec3_c &p3, mVec3_c &result, dAcObjBase_c *obj) {
+ mVec3_c v1 = p3;
+
+ // This matches but not sure about regalloc...
+ dAcPy_c *link = dAcPy_c::LINK;
+ int i;
+
+ dAcObjBase_c *other = nullptr;
+
+ if (obj != nullptr && obj != link) {
+ other = obj;
+ }
+
+ mVec3_c v2 = p3;
+
+ bool found;
+ dAcObjBase_c *controllingActor = (dAcObjBase_c *)link->getLinkage().mControllingActor.p_owner;
+ found = false;
+
+ mVec3_c ret;
+ mVec3_c v3 = v2 - p2;
+ v3.normalize();
+ v3 *= 2.0f;
+
+ for (i = 0; i < 10; i++) {
+ ret = v1;
+ if (!dCcS::GetInstance()->ChkCameraPoint(p2, v2, v1, 15.0f, link, other, controllingActor)) {
+ break;
+ }
+
+ if (p2 == v1) {
+ break;
+ }
+ found = true;
+ v2 = v1 - v3;
+ }
+
+ if (found) {
+ debugPrintf6(400, 300, "CO %d", i);
+ result = ret;
+ }
+ return found;
+}
+
+inline bool linCrossAttentionTarget_(const mVec3_c &from, const mVec3_c &to, dBgS_LinChk &chk) {
dAcObjBase_c *ac = AttentionManager::GetInstance()->getTargetedActor();
chk.Set(&from, &to, ac);
return dBgS::GetInstance()->LineCross(&chk);
}
-bool linChkAttentionTarget(const mVec3_c &from, const mVec3_c &to, dBgS_LinChk &chk, UNKWORD _ignored) {
- return linChkAttentionTarget_(from, to, chk);
+bool linCrossAttentionTarget(const mVec3_c &from, const mVec3_c &to, dBgS_LinChk &chk, UNKWORD _ignored) {
+ return linCrossAttentionTarget_(from, to, chk);
}
bool linCross(dBgS_LinChk &chk, UNKWORD _ignored) {
return dBgS::GetInstance()->LineCross(&chk);
}
-bool camLinChkAttentionTarget(const mVec3_c &from, const mVec3_c &to, UNKWORD _ignored) {
+bool linCrossAttentionTarget(const mVec3_c &from, const mVec3_c &to, UNKWORD _ignored) {
dBgS_CamLinChk chk;
- return linChkAttentionTarget(from, to, chk, _ignored);
+ return linCrossAttentionTarget(from, to, chk, _ignored);
}
bool linCrossAttentionTarget(const mVec3_c &from, const mVec3_c &to, mVec3_c &result) {
dBgS_CamLinChk chk;
- bool ret = linChkAttentionTarget_(from, to, chk);
+ bool ret = linCrossAttentionTarget_(from, to, chk);
if (ret) {
result = chk.GetLinEnd();
}
return ret;
}
-bool dCameraGame_c::execute() {
+u8 unkCamLineChk(dBgS_CamLinChk &chk1, dBgS_CamLinChk &chk2, u32 flags) {
// TODO - ...
+ return 'W';
+}
+
+struct UnkCallbackArg {
+ UnkCallbackArg() : field_0x08(nullptr) {}
+
+ void set(mVec3_c *v1, mVec3_c *v3, f32 f) {
+ field_0x00 = v1;
+ field_0x10 = v3;
+ field_0x14 = mVec3_c::Zero;
+ field_0x20 = mVec3_c::Zero;
+ field_0x04 = f;
+ field_0x08 = 0;
+ field_0x0C = 0.0f;
+ }
+
+ /* 0x00 */ mVec3_c *field_0x00;
+ /* 0x04 */ f32 field_0x04;
+ /* 0x08 */ UNKWORD field_0x08;
+ /* 0x0C */ f32 field_0x0C;
+ /* 0x10 */ mVec3_c *field_0x10;
+ /* 0x14 */ mVec3_c field_0x14;
+ /* 0x20 */ mVec3_c field_0x20;
+};
+
+
+void unkCamCallback1(dBgS_SphChk *, cBgD_Vtx_t *, int, int, int, cM3dGPla *plane, void *cbArg) {
+ UnkCallbackArg *arg = static_cast<UnkCallbackArg*>(cbArg);
+ f32 f = cM3d_SignedLenPlaAndPos(plane, arg->field_0x00);
+
+ // TODO Regswap
+ if (plane->mD + nw4r::math::VEC3Dot(plane->mNormal, arg->field_0x10) >= -2.0f && f > -arg->field_0x04 && f < arg->field_0x04) {
+ mVec3_c n = plane->mNormal;
+ f32 t2 = (arg->field_0x04 + 0.001f - f);
+
+ if (arg->field_0x0C < t2) {
+ arg->field_0x0C = t2;
+ }
+
+ mVec3_c tmp = n * t2;
+ arg->field_0x08++;
+ if (tmp.x > arg->field_0x14.x) {
+ arg->field_0x14.x = tmp.x;
+ }
+ if (tmp.y > arg->field_0x14.y) {
+ arg->field_0x14.y = tmp.y;
+ }
+ if (tmp.z > arg->field_0x14.z) {
+ arg->field_0x14.z = tmp.z;
+ }
+ if (tmp.x < arg->field_0x20.x) {
+ arg->field_0x20.x = tmp.x;
+ }
+ if (tmp.y < arg->field_0x20.y) {
+ arg->field_0x20.y = tmp.y;
+ }
+ if (tmp.z < arg->field_0x20.z) {
+ arg->field_0x20.z = tmp.z;
+ }
+ }
+}
+
+void unkCamCallback2(dBgS_SphChk *, cBgD_Vtx_t *, int, int, int, cM3dGPla *plane, void *cbArg) {
+ UnkCallbackArg *arg = static_cast<UnkCallbackArg*>(cbArg);
+ f32 f = cM3d_SignedLenPlaAndPos(plane, arg->field_0x00);
+
+ // TODO Regswap
+ if (plane->mD + nw4r::math::VEC3Dot(plane->mNormal, arg->field_0x10) >= -2.0f && f > -arg->field_0x04 && f < arg->field_0x04) {
+ mVec3_c n = plane->mNormal;
+ mVec3_c tmp = n * (arg->field_0x04 + 0.001f - f);
+ arg->field_0x08++;
+ if (std::fabsf(tmp.x) > arg->field_0x14.x) {
+ arg->field_0x14.x = tmp.x;
+ }
+ if (std::fabsf(tmp.y) > arg->field_0x14.y) {
+ arg->field_0x14.y = tmp.y;
+ }
+ if (std::fabsf(tmp.z) > arg->field_0x14.z) {
+ arg->field_0x14.z = tmp.z;
+ }
+ }
+}
+
+
+void fn_8007FE10(mVec3_c &v1, mVec3_c &v2, mVec3_c &v3, f32 f) {
+ v1 = v2;
+
+ dBgS_CamSphChk chk;
+ UnkCallbackArg arg;
+
+ chk.mCallback = unkCamCallback1;
+
+ for (int i = 0; i < sHio.field_0x0CE; i++) {
+ arg.set(&v1, &v3, f);
+
+ chk.Set(&v1, f);
+
+ if (!dBgS::GetInstance()->SphChk(&chk, &arg)) {
+ break;
+ }
+
+ if (arg.field_0x0C < 0.0f) {
+ break;
+ }
+
+ arg.field_0x14 += arg.field_0x20;
+ arg.field_0x14.normalize();
+ arg.field_0x14 *= arg.field_0x0C;
+ v1 += arg.field_0x14;
+ }
+
+ chk.mCallback = unkCamCallback2;
+ chk.Set(&v1, f);
+ arg.set(&v1, &v3, f);
+
+ if (dBgS::GetInstance()->SphChk(&chk, &arg)) {
+ v1 += arg.field_0x14;
+ }
+}
+
+bool dCameraGame_c::draw() {
+ return true;
}
bool dCameraGame_c::remove() {
@@ -400,6 +1186,46 @@ bool dCameraGame_c::remove() {
return true;
}
+void dCameraGame_c::overrideCam(s32 camId, s32 priority, s16 roomId, bool unk) {
+ if (priority < field_0x094) {
+ return;
+ }
+
+ field_0x094 = priority;
+ if (roomId < 0) {
+ roomId = getCurrentRoomId();
+ }
+
+ if (camId == -1) {
+ if (field_0x086.isValid()) {
+ field_0x086.clear();
+ }
+ } else {
+ (void)getCam(camId, roomId);
+ field_0x086.roomCamId = camId;
+ field_0x086.roomId = roomId;
+ s16 val = 1;
+ if (unk) {
+ val = 2;
+ }
+ field_0x086.field_0x04 = val;
+ }
+}
+
+void dCameraGame_c::setCam(s16 roomCamId, s16 roomId) {
+ if (roomId < 0) {
+ roomId = getCurrentRoomId();
+ }
+ (void)getCam(roomCamId, roomId);
+ field_0x080.roomCamId = roomCamId;
+ field_0x080.roomId = roomId;
+ field_0x080.field_0x04 = 3;
+}
+
+void dCameraGame_c::setCam(const CamId &id) {
+ setCam(id.roomCamId, id.roomId);
+}
+
void dCameraGame_c::clearCamIds() {
field_0x086.clear();
field_0x080.clear();
@@ -407,6 +1233,23 @@ void dCameraGame_c::clearCamIds() {
mChk.field_0x16C.clear();
}
+CamId dCameraGame_c::getCamId() {
+ CamId ret = field_0x060;
+ if (field_0x080.isValid()) {
+ ret = field_0x080;
+ } else if (field_0x086.isValid()) {
+ ret = field_0x086;
+ } else if (mChk.field_0x164.isValid()) {
+ ret = mChk.field_0x164;
+ } else if (mChk.field_0x16C.isValid()) {
+ ret = mChk.field_0x16C;
+ } else {
+ ret.clear();
+ }
+
+ return ret;
+}
+
bool dCameraGame_c::isCurrentTrend(const char *name) const {
return getTrendIndex(name) == mCurrentTrendIdx;
}