From df9e3b50b04190bf19baa1a64b49d31b82952569 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 4 Jan 2026 23:10:29 +0100 Subject: [PATCH 1/8] Some camera stuff --- config/SOUE01/splits.txt | 29 +- config/SOUE01/symbols.txt | 216 ++++----- configure.py | 9 +- include/d/d_bzs_types.h | 3 +- include/d/d_camera.h | 161 +++++-- include/d/d_room.h | 4 + include/d/d_sc_game.h | 10 +- include/d/d_stage_mgr.h | 6 + include/egg/gfx/eggFrustum.h | 4 + include/m/m_angle.h | 3 + include/m/m_frustum.h | 3 + include/toBeSorted/actor_event.h | 2 + include/toBeSorted/attention.h | 11 + include/toBeSorted/d_camera_base.h | 69 +++ include/toBeSorted/d_camera_event.h | 34 ++ include/toBeSorted/d_camera_game.h | 205 +++++++++ include/toBeSorted/d_camera_map.h | 43 ++ include/toBeSorted/d_camera_math.h | 54 +++ include/toBeSorted/deg_angle_util.h | 1 + src/REL/d/t/d_t_gate_to_ground.cpp | 4 +- src/REL/d/t/d_t_spore.cpp | 6 +- src/d/d_camera.cpp | 354 +++++++++++++++ src/d/d_message.cpp | 2 +- src/d/d_stage_mgr.cpp | 2 +- src/d/lyt/d_lyt_map.cpp | 14 +- src/d/lyt/meter/d_lyt_meter_a_btn.cpp | 4 +- src/d/lyt/meter/d_lyt_meter_dowsing.cpp | 21 +- src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp | 4 +- src/d/lyt/meter/d_lyt_meter_z_btn.cpp | 4 +- src/toBeSorted/attention.cpp | 8 +- src/toBeSorted/d_camera_base.cpp | 48 ++ src/toBeSorted/d_camera_event.cpp | 21 + src/toBeSorted/d_camera_game.cpp | 423 ++++++++++++++++++ src/toBeSorted/d_camera_map.cpp | 152 +++++++ src/toBeSorted/d_camera_math.cpp | 127 ++++++ 35 files changed, 1859 insertions(+), 202 deletions(-) create mode 100644 include/toBeSorted/d_camera_base.h create mode 100644 include/toBeSorted/d_camera_event.h create mode 100644 include/toBeSorted/d_camera_game.h create mode 100644 include/toBeSorted/d_camera_map.h create mode 100644 include/toBeSorted/d_camera_math.h create mode 100644 src/d/d_camera.cpp create mode 100644 src/toBeSorted/d_camera_base.cpp create mode 100644 src/toBeSorted/d_camera_event.cpp create mode 100644 src/toBeSorted/d_camera_game.cpp create mode 100644 src/toBeSorted/d_camera_map.cpp create mode 100644 src/toBeSorted/d_camera_math.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 9eaec2c6..0ce2157c 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -410,21 +410,33 @@ toBeSorted/d_enemy_sword_mdl.cpp: .data start:0x8050E060 end:0x8050E090 .sdata2 start:0x80579230 end:0x80579238 -toBeSorted/d_camera.cpp: - .text start:0x8006BBE0 end:0x80083370 align:16 - .ctors start:0x804DB6AC end:0x804DB6B0 - .sbss start:0x80575290 end:0x80575370 +toBeSorted/d_camera_base.cpp: + .text start:0x8006BBE0 end:0x8006BE20 align:16 -toBeSorted/d_event_1.cpp: +toBeSorted/d_camera_game.cpp: + .text start:0x8006BE20 end:0x80083370 align:16 + .ctors start:0x804DB6AC end:0x804DB6B0 + .data start:0x8050E090 end:0x8050EA18 + .sdata start:0x80571D70 end:0x80571ED8 + .sbss start:0x80575290 end:0x80575370 + .sdata2 start:0x80579238 end:0x80579418 + .bss start:0x805A08C8 end:0x805A1660 + +toBeSorted/d_camera_event.cpp: .text start:0x80083370 end:0x800928F0 align:16 .ctors start:0x804DB6B0 end:0x804DB6B4 + .data start:0x8050EA18 end:0x8050F180 -toBeSorted/unk_map_cam.cpp: +toBeSorted/d_camera_map.cpp: .text start:0x800928F0 end:0x8009345C align:16 .ctors start:0x804DB6B4 end:0x804DB6B8 + .data start:0x8050F180 end:0x8050F1C8 + .sdata2 start:0x80579538 end:0x805795A0 + .bss start:0x805A2F18 end:0x805A2F58 -toBeSorted/unk_vec_math_event.cpp: +toBeSorted/d_camera_math.cpp: .text start:0x80093460 end:0x80093A74 align:16 + .sdata2 start:0x805795A0 end:0x80579600 toBeSorted/attention.cpp: .text start:0x80093A80 end:0x80096EAC align:16 @@ -1353,7 +1365,10 @@ d/d_camera.cpp: .text start:0x8019D160 end:0x8019ED0C align:16 .ctors start:0x804DB800 end:0x804DB804 .data start:0x8052C180 end:0x8052C230 + .sdata start:0x80572EA0 end:0x80572EB8 .sbss start:0x80575708 end:0x80575710 + .sdata2 start:0x8057AF50 end:0x8057AFA8 + .bss start:0x805B27A0 end:0x805B27D8 d/d_light_obj.cpp: .text start:0x8019ED10 end:0x801A65C8 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 0aa76de2..562b45b0 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3063,30 +3063,30 @@ fn_8006B810 = .text:0x8006B810; // type:function size:0x5C fn_8006B870 = .text:0x8006B870; // type:function size:0x10 calc__16dEnemySwordMdl_cFRC6mMtx_cRC7mVec3_cb = .text:0x8006B880; // type:function size:0x2A8 entry__16dEnemySwordMdl_cFP12dAcObjBase_cP15dShadowCircle_cP7mQuat_c = .text:0x8006BB30; // type:function size:0xA4 -fn_8006BBE0 = .text:0x8006BBE0; // type:function size:0x70 -fn_8006BC50 = .text:0x8006BC50; // type:function size:0x18 -fn_8006BC70 = .text:0x8006BC70; // type:function size:0xA8 -fn_8006BD20 = .text:0x8006BD20; // type:function size:0x4 -fn_8006BD30 = .text:0x8006BD30; // type:function size:0x24 -fn_8006BD60 = .text:0x8006BD60; // type:function size:0x44 -fn_8006BDB0 = .text:0x8006BDB0; // type:function size:0xC -fn_8006BDC0 = .text:0x8006BDC0; // type:function size:0xC -fn_8006BDD0 = .text:0x8006BDD0; // type:function size:0x8 -fn_8006BDE0 = .text:0x8006BDE0; // type:function size:0x40 -fn_8006BE20 = .text:0x8006BE20; // type:function size:0x40 +doCreate__13dCameraBase_cFl = .text:0x8006BBE0; // type:function size:0x70 +doRemove__13dCameraBase_cFv = .text:0x8006BC50; // type:function size:0x18 +doExecute__13dCameraBase_cFv = .text:0x8006BC70; // type:function size:0xA8 +vt_0x0C__13dCameraBase_cFv = .text:0x8006BD20; // type:function size:0x4 +doDraw__13dCameraBase_cFv = .text:0x8006BD30; // type:function size:0x24 +setView__13dCameraBase_cFRC7CamView = .text:0x8006BD60; // type:function size:0x44 +vt_0x2C__13dCameraBase_cFv = .text:0x8006BDB0; // type:function size:0xC +vt_0x28__13dCameraBase_cFv = .text:0x8006BDC0; // type:function size:0xC +getView__13dCameraBase_cFv = .text:0x8006BDD0; // type:function size:0x8 +__dt__7CamViewFv = .text:0x8006BDE0; // type:function size:0x40 +__dt__17dCameraGame_HIO_cFv = .text:0x8006BE20; // type:function size:0x40 debugNotif = .text:0x8006BE60; // type:function size:0x50 -debugPrintf4 = .text:0x8006BEB0; // type:function size:0x50 +debugPrintf4__FPCce = .text:0x8006BEB0; // type:function size:0x50 debugPrintf6 = .text:0x8006BF00; // type:function size:0x50 fn_8006BF50 = .text:0x8006BF50; // type:function size:0x4 fn_8006BF60 = .text:0x8006BF60; // type:function size:0x8 -GetCameraDatTrendIndex = .text:0x8006BF70; // type:function size:0xF0 -getCurrentRoomId = .text:0x8006C060; // type:function size:0x10 -fn_8006C070 = .text:0x8006C070; // type:function size:0x5C -fn_8006C0D0 = .text:0x8006C0D0; // type:function size:0x10 -fn_8006C0E0 = .text:0x8006C0E0; // type:function size:0x28 -GetCameraDatStyleIdx = .text:0x8006C110; // type:function size:0x48 -SetCameraParamTrendIndexes = .text:0x8006C160; // type:function size:0x208 -initCameraParamData = .text:0x8006C370; // type:function size:0xEC +getTrendIndex__13dCameraGame_cFPCc = .text:0x8006BF70; // type:function size:0xF0 +getCurrentRoomId__Fv = .text:0x8006C060; // type:function size:0x10 +getCam__Fll = .text:0x8006C070; // type:function size:0x5C +getCam__FRC5CamId = .text:0x8006C0D0; // type:function size:0x10 +getCamTrend__FRC5CamId = .text:0x8006C0E0; // type:function size:0x28 +getStyleIndex__13dCameraGame_cFUl = .text:0x8006C110; // type:function size:0x48 +cacheIdxes__13dCameraGame_cFv = .text:0x8006C160; // type:function size:0x208 +initCamParamDat__13dCameraGame_cFv = .text:0x8006C370; // type:function size:0xEC fn_8006C460 = .text:0x8006C460; // type:function size:0x6DC fn_8006CB40 = .text:0x8006CB40; // type:function size:0x9C fn_8006CBE0 = .text:0x8006CBE0; // type:function size:0x8 @@ -3142,33 +3142,33 @@ fn_8007D1C0 = .text:0x8007D1C0; // type:function size:0xADC fn_8007DCA0 = .text:0x8007DCA0; // type:function size:0xE8 fn_8007DD90 = .text:0x8007DD90; // type:function size:0x10 fn_8007DDA0 = .text:0x8007DDA0; // type:function size:0x30 -fn_8007DDD0 = .text:0x8007DDD0; // type:function size:0x33C -fn_8007E110 = .text:0x8007E110; // type:function size:0x4 -fn_8007E120 = .text:0x8007E120; // type:function size:0x4 -fn_8007E130 = .text:0x8007E130; // type:function size:0x7C -fn_8007E1B0 = .text:0x8007E1B0; // type:function size:0x51C -fn_8007E6D0 = .text:0x8007E6D0; // type:function size:0x1CC -fn_8007E8A0 = .text:0x8007E8A0; // type:function size:0x230 -fn_8007EAD0 = .text:0x8007EAD0; // type:function size:0x75C +__ct__17dCameraGame_HIO_cFv = .text:0x8007DDD0; // type:function size:0x33C +create__17dCameraGame_HIO_cFv = .text:0x8007E110; // type:function size:0x4 +remove__17dCameraGame_HIO_cFv = .text:0x8007E120; // type:function size:0x4 +fn_8007E130__12UnkCamChecksFP13dCameraGame_c = .text:0x8007E130; // type:function size:0x7C +fn_8007E1B0__12UnkCamChecksFP12dAcObjBase_c = .text:0x8007E1B0; // type:function size:0x51C +__ct__13dCameraGame_cFv = .text:0x8007E6D0; // type:function size:0x1CC +create__13dCameraGame_cFv = .text:0x8007E8A0; // type:function size:0x230 +execute__13dCameraGame_cFv = .text:0x8007EAD0; // type:function size:0x75C fn_8007F230 = .text:0x8007F230; // type:function size:0x94 fn_8007F2D0 = .text:0x8007F2D0; // type:function size:0x38 fn_8007F310 = .text:0x8007F310; // type:function size:0x1EC -fn_8007F500 = .text:0x8007F500; // type:function size:0xF4 -fn_8007F600 = .text:0x8007F600; // type:function size:0x34 -fn_8007F640 = .text:0x8007F640; // type:function size:0x70 -fn_8007F6B0 = .text:0x8007F6B0; // type:function size:0x130 +linChkAttentionTarget__FRC7mVec3_cRC7mVec3_cR11dBgS_LinChki = .text:0x8007F500; // type:function size:0xF4 +linCross__FR11dBgS_LinChki = .text:0x8007F600; // type:function size:0x34 +camLinChkAttentionTarget__FRC7mVec3_cRC7mVec3_ci = .text:0x8007F640; // type:function size:0x70 +linCrossAttentionTarget__FRC7mVec3_cRC7mVec3_cR7mVec3_c = .text:0x8007F6B0; // type:function size:0x130 fn_8007F7E0 = .text:0x8007F7E0; // type:function size:0x384 fn_8007FB70 = .text:0x8007FB70; // type:function size:0x168 fn_8007FCE0 = .text:0x8007FCE0; // type:function size:0x128 fn_8007FE10 = .text:0x8007FE10; // type:function size:0x268 fn_80080080 = .text:0x80080080; // type:function size:0x10 fn_80080090 = .text:0x80080090; // type:function size:0x86C -fn_80080900 = .text:0x80080900; // type:function size:0x8 -RemoveCameraParamData = .text:0x80080910; // type:function size:0x44 -fn_80080960 = .text:0x80080960; // type:function size:0x118 +draw__13dCameraGame_cFv = .text:0x80080900; // type:function size:0x8 +remove__13dCameraGame_cFv = .text:0x80080910; // type:function size:0x44 +fn_80080960__13dCameraGame_cFllScl = .text:0x80080960; // type:function size:0x118 fn_80080A80 = .text:0x80080A80; // type:function size:0x6C fn_80080AF0 = .text:0x80080AF0; // type:function size:0x10 -fn_80080B00 = .text:0x80080B00; // type:function size:0x6C +clearCamIds__13dCameraGame_cFv = .text:0x80080B00; // type:function size:0x6C fn_80080B70 = .text:0x80080B70; // type:function size:0x220 fn_80080D90 = .text:0x80080D90; // type:function size:0x7C8 getNewStyle = .text:0x80081560; // type:function size:0x34 @@ -3177,16 +3177,16 @@ fn_800819E0 = .text:0x800819E0; // type:function size:0x244 fn_80081C30 = .text:0x80081C30; // type:function size:0x25C doModeChange = .text:0x80081E90; // type:function size:0xEC doStyleChange = .text:0x80081F80; // type:function size:0x58 -fn_80081FE0 = .text:0x80081FE0; // type:function size:0x40 -fn_80082020 = .text:0x80082020; // type:function size:0xB4 -fn_800820E0 = .text:0x800820E0; // type:function size:0xC8 +isCurrentTrend__13dCameraGame_cCFPCc = .text:0x80081FE0; // type:function size:0x40 +setView__13dCameraGame_cFRC7CamView = .text:0x80082020; // type:function size:0xB4 +vt_0x08__13dCameraGame_cFv = .text:0x800820E0; // type:function size:0xC8 fn_800821B0 = .text:0x800821B0; // type:function size:0xC0 fn_80082270 = .text:0x80082270; // type:function size:0x44 fn_800822C0 = .text:0x800822C0; // type:function size:0x10 fn_800822D0 = .text:0x800822D0; // type:function size:0x24 fn_80082300 = .text:0x80082300; // type:function size:0xC -fn_80082310 = .text:0x80082310; // type:function size:0xB0 -fn_800823C0 = .text:0x800823C0; // type:function size:0xCF8 +__dt__13dCameraGame_cFv = .text:0x80082310; // type:function size:0xB0 +__sinit_\d_camera_game_cpp = .text:0x800823C0; // type:function size:0xCF8 fn_800830C0 = .text:0x800830C0; // type:function size:0x60 fn_80083120 = .text:0x80083120; // type:function size:0x60 fn_80083180 = .text:0x80083180; // type:function size:0x60 @@ -3201,8 +3201,8 @@ getActorName = .text:0x80083470; // type:function size:0x8 fn_80083480 = .text:0x80083480; // type:function size:0x14 fn_800834A0 = .text:0x800834A0; // type:function size:0x4 fn_800834B0 = .text:0x800834B0; // type:function size:0x8 -fn_800834C0 = .text:0x800834C0; // type:function size:0x40 -fn_80083500 = .text:0x80083500; // type:function size:0x28 +__dt__18dCameraEvent_HIO_cFv = .text:0x800834C0; // type:function size:0x40 +__ct__18dCameraEvent_HIO_cFv = .text:0x80083500; // type:function size:0x28 fn_80083530 = .text:0x80083530; // type:function size:0xD4 getEventDZevDat = .text:0x80083610; // type:function size:0xC fn_80083620 = .text:0x80083620; // type:function size:0x4 @@ -3277,12 +3277,12 @@ fn_80090AD0 = .text:0x80090AD0; // type:function size:0x48C fn_80090F60 = .text:0x80090F60; // type:function size:0x360 fn_800912C0 = .text:0x800912C0; // type:function size:0x244 getEventSubMgrDefForIndex = .text:0x80091510; // type:function size:0x30 -fn_80091540 = .text:0x80091540; // type:function size:0xD0 +__ct__14dCameraEvent_cFv = .text:0x80091540; // type:function size:0xD0 fn_80091610 = .text:0x80091610; // type:function size:0xC4 fn_800916E0 = .text:0x800916E0; // type:function size:0x8 advanceCameraRelatedEventSubmanagers = .text:0x800916F0; // type:function size:0x134 fn_80091830 = .text:0x80091830; // type:function size:0xA8 -fn_800918E0 = .text:0x800918E0; // type:function size:0xA8 +fn_800918E0__14dCameraEvent_cFls = .text:0x800918E0; // type:function size:0xA8 fn_80091990 = .text:0x80091990; // type:function size:0xF4 fn_80091A90 = .text:0x80091A90; // type:function size:0x44 fn_80091AE0 = .text:0x80091AE0; // type:function size:0xA4 @@ -3290,7 +3290,7 @@ fn_80091B90 = .text:0x80091B90; // type:function size:0x8C fn_80091C20 = .text:0x80091C20; // type:function size:0x8 fn_80091C30 = .text:0x80091C30; // type:function size:0x74 fn_80091CB0 = .text:0x80091CB0; // type:function size:0x40 -initEventRelocationStuff = .text:0x80091CF0; // type:function size:0x6A4 +__sinit_\d_camera_event_cpp = .text:0x80091CF0; // type:function size:0x6A4 ActorReference__ActorReference = .text:0x800923A0; // type:function size:0x14 EventSystemActorRelation__EventSystemActorRelation = .text:0x800923C0; // type:function size:0x44 EventSystemActorRelation____dt = .text:0x80092410; // type:function size:0x60 @@ -3304,31 +3304,31 @@ fn_80092730 = .text:0x80092730; // type:function size:0x60 fn_80092790 = .text:0x80092790; // type:function size:0x60 fn_800927F0 = .text:0x800927F0; // type:function size:0xA0 fn_80092890 = .text:0x80092890; // type:function size:0x60 -fn_800928F0 = .text:0x800928F0; // type:function size:0x40 -fn_80092930 = .text:0x80092930; // type:function size:0x88 -fn_800929C0 = .text:0x800929C0; // type:function size:0x1BC +__dt__16dCameraMap_HIO_cFv = .text:0x800928F0; // type:function size:0x40 +__ct__16dCameraMap_HIO_cFv = .text:0x80092930; // type:function size:0x88 +fn_800929C0__FRC7mVec3_cRC7mVec3_cP12dAcObjBase_c = .text:0x800929C0; // type:function size:0x1BC fn_80092B80 = .text:0x80092B80; // type:function size:0x138 fn_80092CC0 = .text:0x80092CC0; // type:function size:0x50 fn_80092D10 = .text:0x80092D10; // type:function size:0x170 fn_80092E80 = .text:0x80092E80; // type:function size:0x8 -fn_80092E90 = .text:0x80092E90; // type:function size:0x430 +execute__12dCameraMap_cFv = .text:0x80092E90; // type:function size:0x430 fn_800932C0 = .text:0x800932C0; // type:function size:0x8 fn_800932D0 = .text:0x800932D0; // type:function size:0x8 fn_800932E0 = .text:0x800932E0; // type:function size:0x8 fn_800932F0 = .text:0x800932F0; // type:function size:0x4C -fn_80093340 = .text:0x80093340; // type:function size:0x14 -fn_80093360 = .text:0x80093360; // type:function size:0x18 -fn_80093380 = .text:0x80093380; // type:function size:0x18 -fn_800933A0 = .text:0x800933A0; // type:function size:0x64 +fn_80093340__12dCameraMap_cFv = .text:0x80093340; // type:function size:0x14 +fn_80093360__12dCameraMap_cFv = .text:0x80093360; // type:function size:0x18 +fn_80093380__12dCameraMap_cFv = .text:0x80093380; // type:function size:0x18 +setView__12dCameraMap_cFRC7CamView = .text:0x800933A0; // type:function size:0x64 fn_80093410 = .text:0x80093410; // type:function size:0x40 -fn_80093450 = .text:0x80093450; // type:function size:0xC -fn_80093460 = .text:0x80093460; // type:function size:0x18C -fn_800935F0 = .text:0x800935F0; // type:function size:0xD8 -fn_800936D0 = .text:0x800936D0; // type:function size:0xF4 -fn_800937D0 = .text:0x800937D0; // type:function size:0x98 -fn_80093870 = .text:0x80093870; // type:function size:0xA4 -fn_80093920 = .text:0x80093920; // type:function size:0xA4 -fn_800939D0 = .text:0x800939D0; // type:function size:0xA4 +__sinit_\d_camera_map_cpp = .text:0x80093450; // type:function size:0xC +camEaseIn__Fff = .text:0x80093460; // type:function size:0x18C +camEaseInOut__Fff = .text:0x800935F0; // type:function size:0xD8 +camGetPointOnLine__FRC7mVec3_cRC7mVec3_cRC7mVec3_c = .text:0x800936D0; // type:function size:0xF4 +camOffsetPoint__FP12dAcObjBase_cRC7mVec3_c = .text:0x800937D0; // type:function size:0x98 +camOffsetPoint__FP12dAcObjBase_cRC7mVec3_cRC7mAng3_c = .text:0x80093870; // type:function size:0xA4 +camPointToLocal__FP12dAcObjBase_cRC7mVec3_c = .text:0x80093920; // type:function size:0xA4 +camPointToLocal__FP12dAcObjBase_cRC7mVec3_cRC7mAng3_c = .text:0x800939D0; // type:function size:0xA4 getPosCopy3__FRC12dAcObjBase_c = .text:0x80093A80; // type:function size:0x1C __dt__16dAttention_HIO_cFv = .text:0x80093AA0; // type:function size:0x40 init__16dAttention_HIO_cFv = .text:0x80093AE0; // type:function size:0x4 @@ -3510,7 +3510,7 @@ fn_8009C8E0 = .text:0x8009C8E0; // type:function size:0x10 fn_8009C8F0 = .text:0x8009C8F0; // type:function size:0x8 EventRelocTable__processAdvancement2 = .text:0x8009C900; // type:function size:0x4 __ct__17ActorEventRelatedFR9dAcBase_cPv = .text:0x8009C910; // type:function size:0x70 -fn_8009C980 = .text:0x8009C980; // type:function size:0x70 +__ct__17ActorEventRelatedFiPv = .text:0x8009C980; // type:function size:0x70 __dt__17ActorEventRelatedFv = .text:0x8009C9F0; // type:function size:0x70 fn_8009CA60 = .text:0x8009CA60; // type:function size:0x4C fn_8009CAB0 = .text:0x8009CAB0; // type:function size:0x44 @@ -10545,7 +10545,7 @@ StageManager__init2 = .text:0x80198D90; // type:function size:0x25C changeState__80sStateMgr_c<11dStageMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80198FF0; // type:function size:0x10 fn_80199000 = .text:0x80199000; // type:function size:0x110 fn_80199110 = .text:0x80199110; // type:function size:0x8 -fn_80199120 = .text:0x80199120; // type:function size:0x10 +getScreen__11dStageMgr_cFl = .text:0x80199120; // type:function size:0x10 addObjId__11dStageMgr_cFUs = .text:0x80199130; // type:function size:0x8 addStageArcn__11dStageMgr_cFPCc = .text:0x80199140; // type:function size:0x8 addActorId__11dStageMgr_cFUs = .text:0x80199150; // type:function size:0x8 @@ -10588,7 +10588,7 @@ fn_8019A010 = .text:0x8019A010; // type:function size:0xC fn_8019A020 = .text:0x8019A020; // type:function size:0xC fn_8019A030 = .text:0x8019A030; // type:function size:0x1C fn_8019A050 = .text:0x8019A050; // type:function size:0x1C -fn_8019A070 = .text:0x8019A070; // type:function size:0x30 +setGlobalAlpha__11dStageMgr_cFUc = .text:0x8019A070; // type:function size:0x30 getGlobalAlpha__11dStageMgr_cCFv = .text:0x8019A0A0; // type:function size:0x20 fn_8019A0C0 = .text:0x8019A0C0; // type:function size:0x2C8 fn_8019A390 = .text:0x8019A390; // type:function size:0x44 @@ -10701,24 +10701,24 @@ AcLast__destroy = .text:0x8019D050; // type:function size:0x8 AcLast__update = .text:0x8019D060; // type:function size:0x5C AcLast__draw = .text:0x8019D0C0; // type:function size:0x38 AcLast__dtor = .text:0x8019D100; // type:function size:0x5C -fn_8019D160 = .text:0x8019D160; // type:function size:0x40 -fn_8019D1A0 = .text:0x8019D1A0; // type:function size:0x6C -dCamera__ctor = .text:0x8019D210; // type:function size:0x30 -dCamera__ctorCont = .text:0x8019D240; // type:function size:0x234 -dCamera__init = .text:0x8019D480; // type:function size:0x248 -debugWarn2 = .text:0x8019D6D0; // type:function size:0x50 -debugPrintf7 = .text:0x8019D720; // type:function size:0x50 -fn_8019D770 = .text:0x8019D770; // type:function size:0x78 +__dt__13dCamera_HIO_cFv = .text:0x8019D160; // type:function size:0x40 +__ct__13dCamera_HIO_cFv = .text:0x8019D1A0; // type:function size:0x6C +dCamera_c_classInit__Fv = .text:0x8019D210; // type:function size:0x30 +__ct__9dCamera_cFv = .text:0x8019D240; // type:function size:0x234 +create__9dCamera_cFv = .text:0x8019D480; // type:function size:0x248 +debugWarn2__FPCce = .text:0x8019D6D0; // type:function size:0x50 +debugPrintf7__FPCce = .text:0x8019D720; // type:function size:0x50 +doDelete__9dCamera_cFv = .text:0x8019D770; // type:function size:0x78 fn_8019D7F0 = .text:0x8019D7F0; // type:function size:0xA0 -fn_8019D890 = .text:0x8019D890; // type:function size:0x2E8 -fn_8019DB80 = .text:0x8019DB80; // type:function size:0x158 -fn_8019DCE0 = .text:0x8019DCE0; // type:function size:0x140 -fn_8019DE20 = .text:0x8019DE20; // type:function size:0x3C +execute__9dCamera_cFv = .text:0x8019D890; // type:function size:0x2E8 +fn_8019DB80__9dCamera_cFv = .text:0x8019DB80; // type:function size:0x158 +fn_8019DCE0__9dCamera_cFv = .text:0x8019DCE0; // type:function size:0x140 +draw__9dCamera_cFv = .text:0x8019DE20; // type:function size:0x3C isUnderwater__9dCamera_cCFv = .text:0x8019DE60; // type:function size:0xC -fn_8019DE70 = .text:0x8019DE70; // type:function size:0x2A4 +fn_8019DE70__9dCamera_cFv = .text:0x8019DE70; // type:function size:0x2A4 fn_8019E120 = .text:0x8019E120; // type:function size:0xC4 -fn_8019E1F0 = .text:0x8019E1F0; // type:function size:0x10 -fn_8019E200 = .text:0x8019E200; // type:function size:0x18C +fn_8019E1F0__9dCamera_cFv = .text:0x8019E1F0; // type:function size:0x10 +setFrustum__9dCamera_cFfff = .text:0x8019E200; // type:function size:0x18C fn_8019E390 = .text:0x8019E390; // type:function size:0xC getYRot__9dCamera_cCFv = .text:0x8019E3A0; // type:function size:0x8 fn_8019E3B0__9dCamera_cCFv = .text:0x8019E3B0; // type:function size:0xC @@ -10727,21 +10727,21 @@ fn_8019E410__9dCamera_cFv = .text:0x8019E410; // type:function size:0x1C fn_8019E430__9dCamera_cFv = .text:0x8019E430; // type:function size:0x18 fn_8019E450 = .text:0x8019E450; // type:function size:0x7C fn_8019E4D0 = .text:0x8019E4D0; // type:function size:0x5C -fn_8019E530 = .text:0x8019E530; // type:function size:0x130 -fn_8019E660 = .text:0x8019E660; // type:function size:0x8 +updateUnderwaterDepth__9dCamera_cFRC7mVec3_c = .text:0x8019E530; // type:function size:0x130 +isUnderwater___9dCamera_cCFv = .text:0x8019E660; // type:function size:0x8 getUnderwaterDepth__9dCamera_cCFv = .text:0x8019E670; // type:function size:0x8 fn_8019E680 = .text:0x8019E680; // type:function size:0x1D8 fn_8019E860 = .text:0x8019E860; // type:function size:0x1C -fn_8019E880 = .text:0x8019E880; // type:function size:0x8 -fn_8019E890 = .text:0x8019E890; // type:function size:0x40 -fn_8019E8D0 = .text:0x8019E8D0; // type:function size:0x54 -fn_8019E930 = .text:0x8019E930; // type:function size:0xC -fn_8019E940 = .text:0x8019E940; // type:function size:0xC0 +setCamera__Q29dCamera_c11substruct_1FP9dCamera_c = .text:0x8019E880; // type:function size:0x8 +fn_8019E890__Q29dCamera_c11substruct_1Fv = .text:0x8019E890; // type:function size:0x40 +fn_8019E8D0__Q29dCamera_c11substruct_1FRC4mAng = .text:0x8019E8D0; // type:function size:0x54 +fn_8019E930__Q29dCamera_c11substruct_1Fv = .text:0x8019E930; // type:function size:0xC +fn_8019E940__Q29dCamera_c11substruct_1Fv = .text:0x8019E940; // type:function size:0xC0 fn_8019EA00__9dCamera_cFRC7mVec3_cRC7mVec3_cff = .text:0x8019EA00; // type:function size:0x70 fn_8019EA70__9dCamera_cFb = .text:0x8019EA70; // type:function size:0x11C fn_8019EB90 = .text:0x8019EB90; // type:function size:0xC -fn_8019EBA0 = .text:0x8019EBA0; // type:function size:0x160 -fn_8019ED00 = .text:0x8019ED00; // type:function size:0xC +__dt__9dCamera_cFv = .text:0x8019EBA0; // type:function size:0x160 +__sinit_\d_camera_cpp = .text:0x8019ED00; // type:function size:0xC GetInstance__11dObjLight_cFv = .text:0x8019ED10; // type:function size:0x8 ObjLight__ctor = .text:0x8019ED20; // type:function size:0x30 spawnLightObject = .text:0x8019ED50; // type:function size:0x40 @@ -11183,11 +11183,11 @@ setSpawnData__12SpawnInfoExtFPCcUcUcUcRC7mVec3_c4mAng = .text:0x801BB2F0; // typ set__14LinkReloadInfoFUcRC7mVec3_c4mAngUl = .text:0x801BB380; // type:function size:0x34 isCurrentStage__9dScGame_cFPCc = .text:0x801BB3C0; // type:function size:0x10 isStageSkyloftLayer20__9dScGame_cFv = .text:0x801BB3D0; // type:function size:0x54 -isInCredits = .text:0x801BB430; // type:function size:0x54 -isStateLayerWithSeekerStoneHintMenu__9dScGame_cFv = .text:0x801BB490; // type:function size:0x78 +isInCredits__9dScGame_cFv = .text:0x801BB430; // type:function size:0x54 +isSeekerStoneStageAndLayer__9dScGame_cFv = .text:0x801BB490; // type:function size:0x78 copySpawnNextToCurrent__9dScGame_cFv = .text:0x801BB510; // type:function size:0xBC actuallyTriggerEntrance__9dScGame_cFPCcUcUcUciiUcUsSc = .text:0x801BB5D0; // type:function size:0x104 -setCamera = .text:0x801BB6E0; // type:function size:0x10 +setCamera__9dScGame_cFlP9dCamera_c = .text:0x801BB6E0; // type:function size:0x10 getCamera__9dScGame_cFl = .text:0x801BB6F0; // type:function size:0x10 fn_801BB700 = .text:0x801BB700; // type:function size:0x4C fn_801BB750 = .text:0x801BB750; // type:function size:0x4C @@ -17804,7 +17804,7 @@ getStatus__12mFaderBase_cCFv = .text:0x802F0730; // type:function size:0x8 fadeIn__12mFaderBase_cFv = .text:0x802F0740; // type:function size:0x28 fadeOut__12mFaderBase_cFv = .text:0x802F0770; // type:function size:0x2C calc__12mFaderBase_cFv = .text:0x802F07A0; // type:function size:0x7C -mFrustum_c__set = .text:0x802F0820; // type:function size:0xB8 +set__10mFrustum_cFffffRC6mMtx_c = .text:0x802F0820; // type:function size:0xB8 set__10mFrustum_cFffffffRC6mMtx_cb = .text:0x802F08E0; // type:function size:0x370 fn_802F0C50 = .text:0x802F0C50; // type:function size:0x160 fn_802F0DB0 = .text:0x802F0DB0; // type:function size:0x8 @@ -30960,11 +30960,11 @@ lbl_8050EF88 = .data:0x8050EF88; // type:object size:0x31 data:string lbl_8050EFBC = .data:0x8050EFBC; // type:object size:0x14 data:string lbl_8050EFD0 = .data:0x8050EFD0; // type:object size:0x33 data:string lbl_8050F004 = .data:0x8050F004; // type:object size:0x12C -lbl_8050F130 = .data:0x8050F130; // type:object size:0xC -lbl_8050F13C = .data:0x8050F13C; // type:object size:0x34 +__vt__18dCameraEvent_HIO_c = .data:0x8050F130; // type:object size:0xC +__vt__14dCameraEvent_c = .data:0x8050F13C; // type:object size:0x34 lbl_8050F170 = .data:0x8050F170; // type:object size:0x10 -lbl_8050F180 = .data:0x8050F180; // type:object size:0x10 -lbl_8050F190 = .data:0x8050F190; // type:object size:0x38 +__vt__16dCameraMap_HIO_c = .data:0x8050F180; // type:object size:0x10 +__vt__12dCameraMap_c = .data:0x8050F190; // type:object size:0x38 lbl_8050F1C8 = .data:0x8050F1C8; // type:object size:0xA data:string lbl_8050F1D4 = .data:0x8050F1D4; // type:object size:0x9 data:string lbl_8050F1E0 = .data:0x8050F1E0; // type:object size:0x11 data:string @@ -35631,7 +35631,7 @@ lbl_8052C1AC = .data:0x8052C1AC; // type:object size:0xC data:string lbl_8052C1B8 = .data:0x8052C1B8; // type:object size:0x9 data:string lbl_8052C1C4 = .data:0x8052C1C4; // type:object size:0xE data:string lbl_8052C1D4 = .data:0x8052C1D4; // type:object size:0xC -dCamera__vtable = .data:0x8052C1E0; // type:object size:0x50 +__vt__9dCamera_c = .data:0x8052C1E0; // type:object size:0x50 g_profile_LIGHT_OBJECT = .data:0x8052C230; // type:object size:0xC jumptable_8052C23C = .data:0x8052C23C; // type:object size:0x2C scope:local jumptable_8052C268 = .data:0x8052C268; // type:object size:0x24 scope:local @@ -42247,12 +42247,12 @@ lbl_80575338 = .sbss:0x80575338; // type:object size:0x4 lbl_8057533C = .sbss:0x8057533C; // type:object size:0x4 data:4byte lbl_80575340 = .sbss:0x80575340; // type:object size:0x4 data:4byte lbl_80575344 = .sbss:0x80575344; // type:object size:0x4 data:4byte -CAMERA_PARAMETER_DATA = .sbss:0x80575348; // type:object size:0x4 data:4byte -CAMERA_PARAM_FLOAT_START = .sbss:0x8057534C; // type:object size:0x4 data:4byte -CAMERA_PARAM_FLAG_START = .sbss:0x80575350; // type:object size:0x4 data:4byte -CAMERA_PARAM_STYLE_START = .sbss:0x80575354; // type:object size:0x4 data:4byte -CAMERA_PARAM_TREND_START = .sbss:0x80575358; // type:object size:0x4 data:4byte -CAM_STYLE_IDX_TA22 = .sbss:0x8057535C; // type:object size:0x4 data:4byte +sHeader__13dCameraGame_c = .sbss:0x80575348; // type:object size:0x4 data:4byte +sFloats__13dCameraGame_c = .sbss:0x8057534C; // type:object size:0x4 data:4byte +sFlags__13dCameraGame_c = .sbss:0x80575350; // type:object size:0x4 data:4byte +sStyles__13dCameraGame_c = .sbss:0x80575354; // type:object size:0x4 data:4byte +sTrends__13dCameraGame_c = .sbss:0x80575358; // type:object size:0x4 data:4byte +sStyleIdxes__13dCameraGame_c = .sbss:0x8057535C; // type:object size:0x4 data:4byte GROOSENATOR_REF = .sbss:0x80575360; // type:object size:0x4 data:4byte lbl_80575364 = .sbss:0x80575364; // type:object size:0x4 data:4byte lbl_80575368 = .sbss:0x80575368; // type:object size:0x8 data:4byte @@ -51242,7 +51242,7 @@ sRumblePreset10__9dRumble_c = .bss:0x805A07F0; // type:object size:0xC data:4byt @LOCAL@start__9dRumble_cFRC14dRumbleEntry_cUl@rumble_string = .bss:0x805A0840; // type:object size:0x21 scope:local data:byte @LOCAL@getCurrentStageDirectory__22CurrentStageArcManagerFv@sStageDirTmp = .bss:0x805A0868; // type:object size:0x40 scope:local data:byte s_roomArcTmp = .bss:0x805A08A8; // type:object size:0x20 scope:local data:byte -lbl_805A08C8 = .bss:0x805A08C8; // type:object size:0x138 data:2byte +sHio = .bss:0x805A08C8; // type:object size:0x138 scope:local data:2byte lbl_805A0A00 = .bss:0x805A0A00; // type:object size:0x28 data:byte lbl_805A0A28 = .bss:0x805A0A28; // type:object size:0x28 data:byte lbl_805A0A50 = .bss:0x805A0A50; // type:object size:0x28 data:byte @@ -51256,7 +51256,7 @@ lbl_805A0B68 = .bss:0x805A0B68; // type:object size:0x28 data:byte lbl_805A0B90 = .bss:0x805A0B90; // type:object size:0x28 data:byte lbl_805A0BB8 = .bss:0x805A0BB8; // type:object size:0x28 data:byte lbl_805A0BE0 = .bss:0x805A0BE0; // type:object size:0x28 data:byte -CAM_TREND_IDX_BalanceBall = .bss:0x805A0C08; // type:object size:0x90 data:4byte +sTrendIdxes__13dCameraGame_c = .bss:0x805A0C08; // type:object size:0x90 data:4byte lbl_805A0C98 = .bss:0x805A0C98; // type:object size:0x208 data:4byte lbl_805A0EA0 = .bss:0x805A0EA0; // type:object size:0x28 data:byte lbl_805A0EC8 = .bss:0x805A0EC8; // type:object size:0xD0 data:byte @@ -51290,7 +51290,7 @@ lbl_805A2BF0 = .bss:0x805A2BF0; // type:object size:0xB8 data:byte lbl_805A2CA8 = .bss:0x805A2CA8; // type:object size:0x140 data:byte lbl_805A2DE8 = .bss:0x805A2DE8; // type:object size:0xA8 data:byte lbl_805A2E90 = .bss:0x805A2E90; // type:object size:0x88 data:byte -lbl_805A2F18 = .bss:0x805A2F18; // type:object size:0x40 +sHio = .bss:0x805A2F18; // type:object size:0x40 scope:local lbl_805A2F58 = .bss:0x805A2F58; // type:object size:0x10 attnVectors = .bss:0x805A2F68; // type:object size:0x30 sHio = .bss:0x805A2F98; // type:object size:0x18 scope:local @@ -52223,7 +52223,7 @@ StageMgr__STATE_READ_OBJECT_SOUND = .bss:0x805B26B0; // type:object size:0x40 da StageMgr__STATE_SCENE_CHANGE_SAVE = .bss:0x805B26F0; // type:object size:0x40 data:4byte StageMgr__STATE_RESTART_SCENE_WAIT = .bss:0x805B2730; // type:object size:0x40 data:4byte StageMgr__STATE_RESTART_SCENE = .bss:0x805B2770; // type:object size:0x30 data:4byte -lbl_805B27A0 = .bss:0x805B27A0; // type:object size:0x38 +sHio = .bss:0x805B27A0; // type:object size:0x38 scope:local lbl_805B27D8 = .bss:0x805B27D8; // type:object size:0xD8 align:4 data:float lbl_805B28B0 = .bss:0x805B28B0; // type:object size:0x10 WeatherTag__STATE_WAIT = .bss:0x805B28C0; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index 86ce4cf8..4bb8d6c6 100644 --- a/configure.py +++ b/configure.py @@ -484,10 +484,11 @@ config.libs = [ Object(Matching, "toBeSorted/actor_info.cpp"), Object(NonMatching, "toBeSorted/d_sword_swing_effect_mgr.cpp"), Object(NonMatching, "toBeSorted/d_enemy_sword_mdl.cpp"), - Object(NonMatching, "toBeSorted/d_camera.cpp"), - Object(NonMatching, "toBeSorted/d_event_1.cpp"), - Object(NonMatching, "toBeSorted/unk_map_cam.cpp"), - Object(NonMatching, "toBeSorted/unk_vec_math_event.cpp"), + Object(NonMatching, "toBeSorted/d_camera_base.cpp"), + Object(NonMatching, "toBeSorted/d_camera_game.cpp"), + Object(NonMatching, "toBeSorted/d_camera_event.cpp"), + Object(NonMatching, "toBeSorted/d_camera_map.cpp"), + Object(NonMatching, "toBeSorted/d_camera_math.cpp"), Object(NonMatching, "toBeSorted/attention.cpp"), Object(NonMatching, "toBeSorted/d_t_camera.cpp"), Object(Matching, "toBeSorted/dowsing_target.cpp"), diff --git a/include/d/d_bzs_types.h b/include/d/d_bzs_types.h index 74ae0e29..ce11e462 100644 --- a/include/d/d_bzs_types.h +++ b/include/d/d_bzs_types.h @@ -37,7 +37,7 @@ struct CAM { /* 0x04 */ mVec3_c position; /* 0x10 */ f32 angle; /* 0x14 */ u8 _0x14[8]; - /* 0x1C */ char name[16]; + /* 0x1C */ char trendName[16]; }; // Size 0x38 @@ -61,6 +61,7 @@ struct EVNT { // Size 0x??? struct bzsFILE { + /* 0x00 */ s16 field_0x00; // ??? }; diff --git a/include/d/d_camera.h b/include/d/d_camera.h index 059647ba..d3c8aaf4 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -3,84 +3,155 @@ #include "common.h" #include "d/d_base.h" +#include "egg/gfx/eggCamera.h" #include "m/m_angle.h" +#include "m/m_frustum.h" #include "m/m_vec.h" - -extern "C" bool fn_80081FE0(void *, const char *); -extern "C" bool fn_800918E0(void *, s32, s16); -extern "C" void fn_80080960(void *, s32, s32, s8, s32); -extern "C" void fn_80093340(void *); -extern "C" void fn_80093360(void *); -extern "C" void fn_80093380(void *); +#include "toBeSorted/d_camera_base.h" +#include "toBeSorted/d_camera_event.h" +#include "toBeSorted/d_camera_game.h" +#include "toBeSorted/d_camera_map.h" class dCamera_c : public dBase_c { +private: + class substruct_1 { + public: + substruct_1() : mActive(false), mFSStickAngle(0), field_0x04(0) {} + + void setCamera(dCamera_c *cam); + void fn_8019E890(); + mAng fn_8019E930(); + void fn_8019E940(); + + private: + void fn_8019E8D0(const mAng &ang); + + /* 0x00 */ bool mActive; + /* 0x02 */ mAng mFSStickAngle; + /* 0x04 */ mAng field_0x04; + /* 0x08 */ dCamera_c *mpCamera; + }; + + enum CameraIdx_e { + CAM_GAME_0, + CAM_GAME_1, + CAM_EVENT, + CAM_MAP, + + CAM_MAX, + }; + + enum Flags_e { + CAM_FLAGS_0x40 = (1 << 6), + CAM_FLAGS_0x80 = (1 << 7), + CAM_FLAGS_0x100 = (1 << 8), + CAM_FLAGS_0x200 = (1 << 9), + }; + public: - bool isCurrentTrend(const char *name) const { - return fn_80081FE0(field_0xD98, name); + dCamera_c(); + virtual int create() override; + virtual int doDelete() override; + virtual int execute() override; + virtual int draw() override; + + void setFrustum(f32 fov, f32 near, f32 far); + + dCameraGame_c *getGameCam1() { + return static_cast(mpCameras[CAM_GAME_0]); } - void *getField_0xD98() const { - return field_0xD98; + dCameraGame_c *getGameCam2() { + return static_cast(mpCameras[CAM_GAME_1]); + } + + dCameraEvent_c *getEventCam() { + return static_cast(mpCameras[CAM_EVENT]); + } + + dCameraMap_c *getMapCam() { + return static_cast(mpCameras[CAM_MAP]); } const mVec3_c &getPositionMaybe() const { - return mPositionMaybe; + return mView.field_0x00; } const mVec3_c &getField_0x78() const { - return field_0x78; + return mView.field_0x0C; } - f32 getField_0x2A8() const { - return field_0x2A8; + f32 getWaterHeight() const { + return mWaterHeight; } mAng getYRot() const; - bool doFn_800918E0(s32 a1, s16 a2) { - return fn_800918E0(field_0xDA0, a1, a2); - } - - void doFn_80093340() { - fn_80093340(field_0xDA4); - } - - void doFn_80093360() { - fn_80093360(field_0xDA4); - } - - void doFn_80093380() { - fn_80093380(field_0xDA4); - } - void setScreenShakeIntensity(f32 val) { mScreenShakeIntensity = val; } UNKWORD getField_0xDA8() const { - return field_0xDA8; + return mActiveCameraIdx; } bool isUnderwater() const; f32 getUnderwaterDepth() const; - void fn_8019EA00(const mVec3_c&, const mVec3_c&, f32, f32); + void fn_8019EA00(const mVec3_c &, const mVec3_c &, f32, f32); void fn_8019E430(); void fn_8019E410(); mAng fn_8019E3B0() const; void fn_8019EA70(bool); private: - /* 0x068 */ u8 _0x068[0x6C - 0x068]; - /* 0x06C */ mVec3_c mPositionMaybe; - /* 0x078 */ mVec3_c field_0x78; - /* 0x084 */ u8 _0x084[0x2A8 - 0x084]; - /* 0x2A8 */ f32 field_0x2A8; - /* 0x2AC */ u8 _0x2AC[0xD98 - 0x2AC]; - /* 0xD98 */ void *field_0xD98; - /* 0xD9C */ u8 _0xD9C[0xDA0 - 0xD9C]; - /* 0xDA0 */ void *field_0xDA0; - /* 0xDA4 */ void *field_0xDA4; - /* 0xDA8 */ UNKWORD field_0xDA8; - /* 0xDAC */ u8 _0xDAC[0xDB0 - 0xDAC]; + void fn_8019DB80(); + void fn_8019DCE0(); + void fn_8019DE70(); + f32 fn_8019E1F0(); + + void updateUnderwaterDepth(const mVec3_c &pos); + bool isUnderwater_() const; + + /* 0x068 */ s32 mMyCameraIndex; + /* 0x06C */ CamView mView; + /* 0x08C */ mVec3_c field_0x08C; + /* 0x098 */ mAng field_0x098; + /* 0x09A */ mAng field_0x09A; + /* 0x09C */ mFrustum_c mFrustum; + + /* 0x18C */ u8 _0x18C[0x1F8 - 0x18C]; + + /* 0x1F8 */ UNKWORD field_0x1F8; + /* 0x1FC */ u8 field_0x1FC; + /* 0x200 */ EGG::Screen *mpScreen; + /* 0x204 */ EGG::LookAtCamera mLookAtCamera; + + /* 0x28C */ f32 mLetterboxAmount; + /* 0x290 */ f32 field_0x290; + /* 0x294 */ f32 mGlobalAlpha; + /* 0x298 */ u8 field_0x298; + /* 0x299 */ u8 field_0x299; + /* 0x29C */ f32 field_0x29C; + /* 0x2A0 */ u8 field_0x2A0; + /* 0x2A1 */ u8 field_0x2A1; + /* 0x2A4 */ f32 mUnderwaterDepth; + /* 0x2A8 */ f32 mWaterHeight; + /* 0x2AC */ bool mIsUnderwater; + /* 0x2B0 */ u32 mFlags; + /* 0x2B4 */ dCameraGame_c mGameCam1; + /* 0x728 */ dCameraGame_c mGameCam2; + /* 0xB9C */ dCameraEvent_c mEventCam; + /* 0xCDC */ dCameraMap_c mMapCam; + + /* 0xD8C */ u8 _0xD8C[0xD94 - 0xD8C]; + + /* 0xD94 */ f32 field_0xD94; + /* 0xD98 */ dCameraBase_c *mpCameras[CAM_MAX]; + /* 0xDA8 */ s32 mActiveCameraIdx; + /* 0xDAC */ void *field_0xDAC; /* 0xDB0 */ f32 mScreenShakeIntensity; + /* 0xDB4 */ mVec3_c field_0xDB4; + /* 0xDC0 */ substruct_1 field_0xDC0; + /* 0xDCC */ u8 field_0xDCC; + /* 0xDD0 */ CamView mView1; }; #endif diff --git a/include/d/d_room.h b/include/d/d_room.h index c8a04abb..d308201c 100644 --- a/include/d/d_room.h +++ b/include/d/d_room.h @@ -132,6 +132,10 @@ public: mpFile = file; } + const bzsFILE *getFile() const { + return mpFile; + } + void setScen(const SCEN *scen, u16 count) { mScenCount = count; mpScen = scen; diff --git a/include/d/d_sc_game.h b/include/d/d_sc_game.h index 67bbddb4..d05c7454 100644 --- a/include/d/d_sc_game.h +++ b/include/d/d_sc_game.h @@ -34,6 +34,10 @@ public: f32 fn_801BBEC0() const; + void setLetterboxAmount(f32 v) { + mLetterboxAmount = v; + } + private: /* 0x98 */ f32 mLetterboxAmount; }; @@ -152,7 +156,7 @@ public: static bool isCurrentStage(const char *stageName); static bool isStageSkyloftLayer20(); static bool isInCredits(); - static bool isStateLayerWithSeekerStoneHintMenu(); + static bool isSeekerStoneStageAndLayer(); static SpawnInfo currentSpawnInfo; static SpawnInfo nextSpawnInfo; @@ -223,6 +227,10 @@ public: return mFader.isStatus(mFaderBase_c::FADING_IN); } + void setTargetingScreenLetterboxAmount(f32 amt) { + mScreen1.setLetterboxAmount(amt); + } + f32 targetingScreenFn_801BBEC0() const { return mScreen1.fn_801BBEC0(); } diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index f20c541d..64bd6276 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -52,6 +52,7 @@ public: STATE_FUNC_DECLARE(dStageMgr_c, RestartScene); public: + void setGlobalAlpha(u8 alpha); u8 getGlobalAlpha() const; bool isAreaTypeNormal() const; @@ -123,6 +124,10 @@ public: void initUnkWithWater(u32 val, d3d::UnkWithWater *waterThing); void destroyUnkWithWater(u32 val, d3d::UnkWithWater *waterThing); + const STIF *getStif() const { + return mpStif; + } + const RMPL *getRmpl() const { return mpRmpl; } @@ -173,6 +178,7 @@ public: void addActorId(u16 actorId); nw4r::g3d::Camera getCamera(s32 idx); + EGG::Screen *getScreen(s32 idx); void fn_80199B60(u8); diff --git a/include/egg/gfx/eggFrustum.h b/include/egg/gfx/eggFrustum.h index ded3ea33..aac59320 100644 --- a/include/egg/gfx/eggFrustum.h +++ b/include/egg/gfx/eggFrustum.h @@ -110,6 +110,10 @@ public: SetSizeY(size.y); } + f32 GetAspect() const { + return GetSize().x / GetSize().y; + } + void SetNearZ(f32 nearZ) { mNearZ = nearZ; } diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 05842818..1de484bc 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -124,6 +124,9 @@ public: static f32 s2r_c(f32 ang) { return ang * sAngToRad; } + static f32 s2n_c(f32 ang) { + return ang * sAngToNorm; + } static f32 r2s_c(f32 ang) { return ang * sRadToAng; } diff --git a/include/m/m_frustum.h b/include/m/m_frustum.h index baaad91c..4b0b34b9 100644 --- a/include/m/m_frustum.h +++ b/include/m/m_frustum.h @@ -8,7 +8,10 @@ // Bunch of untested assumptions in here class mFrustum_c { public: + void set(f32, f32, f32 near, f32 far, const mMtx_c &mtx); void set(f32, f32, f32, f32, f32 near, f32 far, const mMtx_c &mtx, bool); + + /* 0x00 */ mMtx_c mView; /* 0x30 */ nw4r::math::PLANE mPlane_0x30; /* 0x40 */ nw4r::math::PLANE mPlane_0x40; diff --git a/include/toBeSorted/actor_event.h b/include/toBeSorted/actor_event.h index cbd68422..32288a6b 100644 --- a/include/toBeSorted/actor_event.h +++ b/include/toBeSorted/actor_event.h @@ -8,7 +8,9 @@ class ActorEventRelated { public: + ActorEventRelated(); ActorEventRelated(dAcBase_c &owner, void *); + ActorEventRelated(UNKWORD, void *); ~ActorEventRelated(); bool isThisActorInEvent(); diff --git a/include/toBeSorted/attention.h b/include/toBeSorted/attention.h index 1fd3de94..17cb9b04 100644 --- a/include/toBeSorted/attention.h +++ b/include/toBeSorted/attention.h @@ -222,6 +222,17 @@ public: bool checkLink2() const; + dAcObjBase_c *getTargetedActor() { + if (!isInNormalGameState() || !mTargeted) { + return nullptr; + } + return getTargetedActorUnchecked(); + } + + dAcObjBase_c *getTargetedActorUnchecked() { + return mGroups[1].getOtherPool()->getActor(mModels.mCurrentTargetInfoIdx); + } + private: bool isInNormalGameState() const; bool checkZButtonPressed() const; diff --git a/include/toBeSorted/d_camera_base.h b/include/toBeSorted/d_camera_base.h new file mode 100644 index 00000000..b9faf8c1 --- /dev/null +++ b/include/toBeSorted/d_camera_base.h @@ -0,0 +1,69 @@ +#ifndef TO_BE_SORTED_D_CAMERA_BASE_H +#define TO_BE_SORTED_D_CAMERA_BASE_H + +#include "common.h" +#include "m/m_vec.h" + +// A basic description of a camera perspective, with +// position, target point, a field of view, and something else. +struct CamView { + CamView() : field_0x00(0.0f, 0.0f, 0.0f), field_0x0C(0.0f, 0.0f, 1.0f), mFov(50.0f), field_0x1C(0.0f) {} + ~CamView() {} + + /* 0x00 */ mVec3_c field_0x00; + /* 0x0C */ mVec3_c field_0x0C; + /* 0x18 */ f32 mFov; + /* 0x1C */ f32 field_0x1C; +}; + +// Abstract camera base class. The game camera class will hold various subclasses +// of this base class. +class dCameraBase_c { +protected: + /* 0x00 */ bool mCreated; + /* 0x01 */ u8 field_0x01; + /* 0x02 */ u8 field_0x02; + /* 0x04 */ s32 mIndex; + /* 0x08 */ CamView mView; + +public: + dCameraBase_c() : mCreated(false), field_0x01(0), field_0x02(0), mIndex(-1) {} + + bool doCreate(s32 index); + bool doRemove(); + bool doExecute(); + bool doDraw(); + + // vt at 0x28 + /* vt 0x08 */ virtual void vt_0x08() {} + /* vt 0x0C */ virtual void vt_0x0C() {} + /* vt 0x10 */ virtual bool create() { + return true; + } + /* vt 0x14 */ virtual bool remove() { + return true; + } + /* vt 0x18 */ virtual bool execute() { + return true; + } + /* vt 0x1C */ virtual bool draw() { + return true; + } + /* vt 0x20 */ virtual ~dCameraBase_c() {} + /* vt 0x24 */ virtual CamView &getView() { + // TODO - const? + return mView; + } + /* vt 0x28 */ virtual void vt_0x28() { + field_0x02 = 1; + } + /* vt 0x2C */ virtual void vt_0x2C() { + field_0x02 = 0; + } + /* vt 0x30 */ virtual void setView(const CamView &view) { + // TODO - is this actually a base impl? + mView = view; + } +}; + +#endif diff --git a/include/toBeSorted/d_camera_event.h b/include/toBeSorted/d_camera_event.h new file mode 100644 index 00000000..d4caef6b --- /dev/null +++ b/include/toBeSorted/d_camera_event.h @@ -0,0 +1,34 @@ +#ifndef TO_BE_SORTED_D_CAMERA_EVENT_H +#define TO_BE_SORTED_D_CAMERA_EVENT_H + +#include "toBeSorted/actor_event.h" +#include "toBeSorted/d_camera_base.h" + +class dCameraEvent_c : public dCameraBase_c { +public: + dCameraEvent_c(); + /* vt 0x08 */ virtual void vt_0x08() override; + /* vt 0x0C */ virtual void vt_0x0C() override; + /* vt 0x10 */ virtual bool create() override; + /* vt 0x14 */ virtual bool remove() override; + /* vt 0x18 */ virtual bool execute() override; + /* vt 0x1C */ virtual bool draw() override; + /* vt 0x20 */ virtual ~dCameraEvent_c() {} + + void fn_800918E0(s32, s16); + +private: + /* 0x2C */ u8 field_0x2C[0x48 - 0x2C]; + /* 0x48 */ u8 field_0x48; + /* 0x4A */ s16 field_0x4A; + /* 0x4C */ u8 field_0x4C[0x50 - 0x4C]; + /* 0x50 */ ActorEventRelated mEventRelated; + /* 0xA0 */ u8 field_0xA0; + /* 0xA4 */ s32 field_0xA4; + /* 0xA8 */ u8 field_0xA8[0xAC - 0xA8]; + /* 0xAC */ s32 field_0xAC; + /* 0xB0 */ u8 field_0xB0[0xB4 - 0xB0]; + /* 0xB4 */ CamView mViews[4]; +}; + +#endif diff --git a/include/toBeSorted/d_camera_game.h b/include/toBeSorted/d_camera_game.h new file mode 100644 index 00000000..28c83053 --- /dev/null +++ b/include/toBeSorted/d_camera_game.h @@ -0,0 +1,205 @@ +#ifndef TO_BE_SORTED_D_CAMERA_GAME_H +#define TO_BE_SORTED_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_gnd_chk.h" +#include "m/m_vec.h" +#include "toBeSorted/d_camera_base.h" +#include "toBeSorted/deg_angle_util.h" + +// Size: 0xC +struct CamParamHeader { + /* 0x00 */ u32 magic; + /* 0x04 */ s16 numFloats; + /* 0x06 */ s16 numFlags; + /* 0x08 */ s16 numStyles; + /* 0x0A */ s16 numTrends; +}; + +// Size: 0xA +#pragma pack(push, 2) +struct CamParamStyle { + /* 0x00 */ u32 id; + /* 0x04 */ u8 _0x04[6]; +}; +#pragma pack(pop) + +// Size: 0x24 +struct CamParamTrend { + /* 0x00 */ char name[16]; // not sure + /* 0x10 */ u8 _0x10[0x24 - 0x10]; +}; + +enum CamTrendIndex_e { + CAM_TREND_IDX_BalanceBall, + CAM_TREND_IDX_Swim, + CAM_TREND_IDX_Surface, + CAM_TREND_IDX_SkyDive, + CAM_TREND_IDX_Dive, + CAM_TREND_IDX_Lift, + CAM_TREND_IDX_Crawl, + CAM_TREND_IDX_Field, + CAM_TREND_IDX_Dungeon, + CAM_TREND_IDX_mogu, + CAM_TREND_IDX_Tornade, + CAM_TREND_IDX_Rope, + CAM_TREND_IDX_Tightrope, + CAM_TREND_IDX_Parachute, + CAM_TREND_IDX_DialKey, + CAM_TREND_IDX_BirdRide, + CAM_TREND_IDX_Trolley, + CAM_TREND_IDX_Boomerang, + CAM_TREND_IDX_Room, + CAM_TREND_IDX_AfterCrawl, + CAM_TREND_IDX_TerryShip_Island, + CAM_TREND_IDX_Catapult, + CAM_TREND_IDX_TightropeHang, + CAM_TREND_IDX_BossKey, + CAM_TREND_IDX_SkyDiveNear, + CAM_TREND_IDX_mogu2, + CAM_TREND_IDX_ClawShot, + CAM_TREND_IDX_Town, + CAM_TREND_IDX_Cannon, + CAM_TREND_IDX_BirdRideLD, + CAM_TREND_IDX_Nushi, + CAM_TREND_IDX_Island, + CAM_TREND_IDX_Windmill, + + CAM_TREND_IDX_MAX, +}; + +enum CamStyleIndex_e { + CAM_STYLE_IDX_TA22, + + CAM_STYLE_IDX_MAX, +}; + +class dCameraGame_c; + +struct CamId { + CamId() : roomCamId(-1), roomId(-1), field_0x04(0) {} + s16 roomCamId; + s16 roomId; + s16 field_0x04; + + void clear() { + roomCamId = -1; + roomId = dAcPy_c::GetLinkM()->mRoomID; + field_0x04 = 0; + } + + bool someCheck() const { + if (field_0x04 < 3 && roomId != dAcPy_c::GetLinkM()->mRoomID) { + return false; + } else { + return field_0x04 >= -1 && roomCamId >= 0 && roomCamId < 0xFF; + } + } +}; + +struct UnkCamCheck { + /* 0x000 */ u8 field_0x000; + /* 0x004 */ dBgS_CamGndChk chk; + /* 0x094 */ f32 field_0x094; + /* 0x098 */ CamId camId; +}; + +struct UnkCamRef { + /* 0x00 */ bool field_0x00; + /* 0x04 */ mVec3_c field_0x04; + /* 0x10 */ dAcRef_c mMoveBgActorRef; +}; + +struct UnkCamChecks { + /* 0x000 */ UnkCamCheck mChk1; + /* 0x0A0 */ UnkCamCheck mChk2; + /* 0x140 */ UnkCamRef mRef; + /* 0x15C */ UNKWORD field_0x15C; + /* 0x160 */ UNKWORD field_0x160; + /* 0x164 */ CamId field_0x164; + /* 0x16A */ u8 field_0x16A; + /* 0x16B */ u8 field_0x16B; + /* 0x16C */ CamId field_0x16C; + /* 0x174 */ dCameraGame_c *mpCamera; + + void fn_8007E130(dCameraGame_c *system); + void fn_8007E1B0(dAcObjBase_c *ac); +}; + +class dCameraGame_c : public dCameraBase_c { +public: + static bool initCamParamDat(); + static s32 getTrendIndex(const char *name); + static s32 getStyleIndex(u32 id); + + static s32 sTrendIdxes[CAM_TREND_IDX_MAX]; + static s32 sStyleIdxes[CAM_STYLE_IDX_MAX]; + + dCameraGame_c(); + /* vt 0x08 */ virtual void vt_0x08() override; + /* vt 0x0C */ virtual void vt_0x0C() override; + /* vt 0x10 */ virtual bool create() override; + /* vt 0x14 */ virtual bool remove() override; + /* vt 0x18 */ virtual bool execute() override; + /* vt 0x1C */ virtual bool draw() override; + /* vt 0x20 */ virtual ~dCameraGame_c() {} + /* vt 0x30 */ virtual void setView(const CamView &view) override; + + CamId getCamId0x60() { + return field_0x060; + } + + void clearCamIds(); + + bool isCurrentTrend(const char *name) const; + + void fn_80080960(s32, s32, s8, s32); + +private: + static void cacheIdxes(); + + static CamParamHeader *sHeader; + static f32 *sFloats; + static u16 *sFlags; + static CamParamStyle *sStyles; + static CamParamTrend *sTrends; + + /* 0x02C */ dPolar field_0x02C; + /* 0x038 */ CamView mView2; + /* 0x058 */ UNKWORD field_0x058; + /* 0x05C */ UNKWORD field_0x05C; + /* 0x060 */ CamId field_0x060; + /* 0x068 */ s32 mCurrentTrendIdx; + /* 0x06C */ UNKWORD field_0x06C; + /* 0x070 */ UNKWORD field_0x070; + /* 0x074 */ UNKWORD field_0x074; + /* 0x078 */ u8 field_0x078; + /* 0x079 */ u8 field_0x079; + /* 0x07A */ u8 field_0x07A; + /* 0x07C */ UNKWORD field_0x07C; + /* 0x080 */ CamId field_0x080; + /* 0x086 */ CamId field_0x086; + /* 0x08C */ UNKWORD field_0x08C; + /* 0x090 */ UNKWORD field_0x090; + /* 0x094 */ s16 field_0x094; + /* 0x096 */ s16 field_0x096; + /* 0x098 */ dAcObjBase_c *field_0x098; + /* 0x09C */ dAcRef_c mRef; + /* 0x0A8 */ UNKWORD field_0x0A8; + /* 0x0AC */ f32 field_0x0AC; + /* 0x0B0 */ f32 field_0x0B0; + /* 0x0B4 */ UnkCamChecks mChk; + /* 0x22C */ UNKWORD field_0x22C; + /* 0x230 */ UNKWORD field_0x230; + /* 0x234 */ mVec3_c field_0x234; + /* 0x240 */ mVec3_c field_0x240; + /* 0x24C */ u8 _0x24C[0x264 - 0x24C]; + /* 0x264 */ f32 field_0x264; + /* 0x268 */ f32 field_0x268; + /* 0x26C */ u8 _0x0[0x474 - 0x26C]; +}; + +#endif diff --git a/include/toBeSorted/d_camera_map.h b/include/toBeSorted/d_camera_map.h new file mode 100644 index 00000000..95bb3c69 --- /dev/null +++ b/include/toBeSorted/d_camera_map.h @@ -0,0 +1,43 @@ +#ifndef TO_BE_SORTED_D_CAMERA_MAP_H +#define TO_BE_SORTED_D_CAMERA_MAP_H + +#include "toBeSorted/d_camera_base.h" + +class dAcObjBase_c; + +class dCameraMap_c : public dCameraBase_c { +public: + dCameraMap_c() {} + /* vt 0x08 */ virtual void vt_0x08() override; + /* vt 0x0C */ virtual void vt_0x0C() override; + /* vt 0x10 */ virtual bool create() override; + /* vt 0x14 */ virtual bool remove() override; + /* vt 0x18 */ virtual bool execute() override; + /* vt 0x1C */ virtual bool draw() override; + /* vt 0x20 */ virtual ~dCameraMap_c() {} + /* vt 0x30 */ virtual void setView(const CamView &view) override; + // Not sure what this is... + /* vt 0x34 */ virtual bool vt_0x34() { + return true; + } + + void fn_80093340(); + void fn_80093360(); + void fn_80093380(); + +private: + /* 0x2C */ u8 _0x2C[0x40 - 0x2C]; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ dAcObjBase_c *field_0x44; + /* 0x48 */ CamView mView1; + /* 0x68 */ CamView mView2; + /* 0x88 */ CamView mView3; + /* 0xA8 */ u8 _0xA8[0xAC - 0xA8]; + /* 0xAC */ u8 field_0xAC; + /* 0xAD */ u8 _0xAD[0xB4 - 0xAD]; + /* 0xB4 */ u8 field_0xB4; + /* 0xB5 */ u8 _0xB5[0xB8 - 0xB5]; + /* 0xB8 */ UNKWORD field_0xB8; +}; + +#endif diff --git a/include/toBeSorted/d_camera_math.h b/include/toBeSorted/d_camera_math.h new file mode 100644 index 00000000..ffba9a1b --- /dev/null +++ b/include/toBeSorted/d_camera_math.h @@ -0,0 +1,54 @@ +#ifndef TOBESORTED_D_CAMERA_MATH_H +#define TOBESORTED_D_CAMERA_MATH_H + +#include "common.h" +#include "m/m_angle.h" +#include "m/m_vec.h" + +class dAcObjBase_c; + +/** + * @brief A function that looks like an ease-in tween. + * + * @param arg The time argument in [0, 1] + * @param param The power of the easing function. 0 = linear, 1 = quite powerful + * @return f32 The result in [0, 1] + */ +f32 camEaseIn(f32 arg, f32 param); + +/** + * @brief A function that looks like an ease-in-out tween. + * + * @param arg The time argument in [0, 1] + * @param param The power of the easing function. 0 = linear, 1 = a little bit + * @return f32 The result in [0, 1] + */ +f32 camEaseInOut(f32 arg, f32 param); + +/** + * @brief Get a point on the line from origin to target that is as + * far away from origin as point is away from origin. + */ +mVec3_c camGetPointOnLine(const mVec3_c &target, const mVec3_c &origin, const mVec3_c &point); + +/** + * @brief Get a point relative to ac's position. localOffset is rotated by the actor's XY rotation first. + */ +mVec3_c camOffsetPoint(dAcObjBase_c *ac, const mVec3_c &localOffset); + +/** + * @brief Like the other camOffsetPoint, but with an explicitly passed rotation. + */ +mVec3_c camOffsetPoint(dAcObjBase_c *ac, const mVec3_c &localOffset, const mAng3_c &rot); + +/** + * @brief The inverse of camOffsetPoint + */ +mVec3_c camPointToLocal(dAcObjBase_c *ac, const mVec3_c &pos); + +/** + * @brief The inverse of camOffsetPoint + */ +mVec3_c camPointToLocal(dAcObjBase_c *ac, const mVec3_c &pos, const mAng3_c &rot); + +#endif diff --git a/include/toBeSorted/deg_angle_util.h b/include/toBeSorted/deg_angle_util.h index cb2406a6..ec710748 100644 --- a/include/toBeSorted/deg_angle_util.h +++ b/include/toBeSorted/deg_angle_util.h @@ -43,6 +43,7 @@ public: struct dPolar { public: + dPolar() : R(0.0f), U(0.0f), V(0.0f) {} dPolar(f32 r, f32 u, f32 v); dPolar(const mVec3_c &v); diff --git a/src/REL/d/t/d_t_gate_to_ground.cpp b/src/REL/d/t/d_t_gate_to_ground.cpp index 2a4c62c6..affb3d5e 100644 --- a/src/REL/d/t/d_t_gate_to_ground.cpp +++ b/src/REL/d/t/d_t_gate_to_ground.cpp @@ -39,7 +39,6 @@ int dTgGateToGround_c::doDelete() { int dTgGateToGround_c::actorExecute() { dAcPy_c *player; - dCamera_c *cam; if (params_FF_FF_00_00 != -1 && StoryflagManager::sInstance->getCounterOrFlag(params_FF_FF_00_00) == 0) { return SUCCEEDED; @@ -57,8 +56,7 @@ int dTgGateToGround_c::actorExecute() { } } else { if (params_00_00_00_FF != -1) { - cam = dScGame_c::getCamera(0); - fn_80080960(cam->getField_0xD98(), params_00_00_00_FF, 0, mRoomID, 0); + dScGame_c::getCamera(0)->getGameCam1()->fn_80080960(params_00_00_00_FF, 0, mRoomID, 0); } delayFrames = 0; } diff --git a/src/REL/d/t/d_t_spore.cpp b/src/REL/d/t/d_t_spore.cpp index aa7937eb..ec83f095 100644 --- a/src/REL/d/t/d_t_spore.cpp +++ b/src/REL/d/t/d_t_spore.cpp @@ -158,9 +158,9 @@ void dSporeProc_c::execute() { mSporesPos[i] += point * (field_0x12D8[i] * 5.f); } - f32 camY = pCam->getField_0x2A8(); - if (end != camY && mSporesPos[i].y < camY) { - mSporesPos[i].y = camY; + f32 waterHeight = pCam->getWaterHeight(); + if (end != waterHeight && mSporesPos[i].y < waterHeight) { + mSporesPos[i].y = waterHeight; } } break; } diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp new file mode 100644 index 00000000..baebce3d --- /dev/null +++ b/src/d/d_camera.cpp @@ -0,0 +1,354 @@ +#include "d/d_camera.h" + +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/bg/d_bg_s_roof_chk.h" +#include "d/d_gfx.h" +#include "d/d_pad.h" +#include "d/d_sc_game.h" +#include "d/d_stage_mgr.h" +#include "egg/gfx/eggFrustum.h" +#include "f/f_base.h" +#include "f/f_profile.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "toBeSorted/d_camera_math.h" +#include "toBeSorted/event_manager.h" + +class dCamera_HIO_c { +public: + dCamera_HIO_c(); + virtual ~dCamera_HIO_c(); + + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 field_0x0C; + /* 0x10 */ s16 field_0x10; + /* 0x12 */ s16 field_0x12; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ u16 field_0x18; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ s16 field_0x24; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ s16 field_0x30; +}; + +dCamera_HIO_c::~dCamera_HIO_c() {} +dCamera_HIO_c::dCamera_HIO_c() { + field_0x04 = 1.0f; + field_0x08 = 240000.0f; + field_0x14 = 0.1f; + field_0x18 = 0x1555; + field_0x1C = 30.0f; + field_0x20 = 30.0f; + field_0x24 = 8; + field_0x28 = 0.7f; + field_0x2C = 0.2f; + field_0x30 = 0; + field_0x0C = 1.0f; + field_0x10 = 1; + field_0x12 = 1; +} + +static dCamera_HIO_c sHio; + +SPECIAL_BASE_PROFILE(CAMERA, dCamera_c, fProfile::CAMERA, 0xA, 0x30); + +void debugWarn2(const char *fmt, ...); +void debugPrintf7(const char *fmt, ...); + +dCamera_c::dCamera_c() + : mMyCameraIndex(0), + mpScreen(dStageMgr_c::GetInstance()->getScreen(0)), + field_0x098(0), + field_0x09A(0), + field_0xD94(0.0f), + field_0x1F8(0), + field_0x1FC(0), + mFlags(0) { + field_0xDAC = this; + mScreenShakeIntensity = 0.0f; + field_0xDB4.set(mVec3_c::Zero.x, mVec3_c::Zero.y, mVec3_c::Zero.z); + field_0xDC0.setCamera(this); + field_0x08C = mVec3_c(0.0f, 1.0f, 0.0f); + + mActiveCameraIdx = 0; + for (int i = 0; i < CAM_MAX; i++) { + mpCameras[i] = nullptr; + } +} + +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; + + for (int i = 0; i < CAM_MAX; i++) { + if (mpCameras[i] == nullptr) { + continue; + } + if (!mpCameras[i]->doCreate(i)) { + return NOT_READY; + } + } + + debugWarn2("u can NOT use debug camera!!"); // aww + mActiveCameraIdx = 0; + + mpCameras[0]->vt_0x28(); + + mLetterboxAmount = fn_8019E1F0(); + field_0x290 = 1.0f; + mFlags |= CAM_FLAGS_0x80; + + // TODO maybe struct + inline + mGlobalAlpha = 1.0f; + field_0x298 = field_0x299 = 0; + + field_0x29C = 1.0f; + field_0x2A0 = field_0x2A1 = 0; + + mView1 = mpCameras[mActiveCameraIdx]->getView(); + + field_0xDCC = 0; + field_0x098 = 0; + field_0x09A = 0; + + dScGame_c::setCamera(mMyCameraIndex, this); + fn_8019DCE0(); + fn_8019DE70(); + + const STIF *stif = dStageMgr_c::GetInstance()->getStif(); + if (stif != nullptr) { + sHio.field_0x04 = stif->field_0x00; + sHio.field_0x08 = stif->field_0x04; + } + + field_0x1FC = 0; + if ((dScGame_c::isCurrentStage("F000") && 26 <= dScGame_c::currentSpawnInfo.layer && + dScGame_c::currentSpawnInfo.layer <= 28) || + dScGame_c::isInCredits() || dScGame_c::isSeekerStoneStageAndLayer()) { + mFlags |= 0x200; + dScGame_c::GetInstance()->setTargetingScreenLetterboxAmount(0.0f); + } + + debugPrintf7("create ok!!"); + + return SUCCEEDED; +} + +// Maybe inlines that couldn't be inlined due to variadics... +void debugWarn2(const char *fmt, ...) { + // no-op +} + +void debugPrintf7(const char *fmt, ...) { + // no-op +} + +int dCamera_c::doDelete() { + debugPrintf7("delete!!"); + for (int i = 0; i < CAM_MAX; i++) { + // No null check needed :) + mpCameras[i]->doRemove(); + } + dScGame_c::setCamera(mMyCameraIndex, nullptr); + return SUCCEEDED; +} + +int dCamera_c::execute() { + dAcPy_c *link = dAcPy_c::GetLinkM(); + + fn_8019DB80(); + + for (int i = 0; i < CAM_MAX; i++) { + if (mpCameras[i] != nullptr) { + mpCameras[i]->doExecute(); + } + } + + if (mActiveCameraIdx == CAM_EVENT) { + // hmmmm + static_cast(mpCameras[0])->clearCamIds(); + } + + fn_8019DCE0(); + fn_8019DE70(); + field_0xDC0.fn_8019E940(); + + field_0xDCC = 0; + if (mActiveCameraIdx == CAM_EVENT) { + mFlags |= CAM_FLAGS_0x80; + } + + if ((mFlags & (CAM_FLAGS_0x100 | CAM_FLAGS_0x80)) != 0) { + field_0x290 += (1.0f / sHio.field_0x24); + if (field_0x290 > 1.0f) { + field_0x290 = 1.0f; + } + } else { + field_0x290 = field_0x290 - (1.0f / sHio.field_0x24); + if (field_0x290 < 0.0f) { + field_0x290 = 0.0f; + } + } + + f32 scale = (mFlags & CAM_FLAGS_0x80) != 0 ? fn_8019E1F0() : sHio.field_0x20; + f32 target = camEaseInOut(field_0x290, 1.0f); + mLetterboxAmount += (target * scale - mLetterboxAmount) * 0.5f; + + if (mActiveCameraIdx == CAM_EVENT && (mFlags & CAM_FLAGS_0x200) != 0) { + mLetterboxAmount = 0.0f; + } + + dScGame_c::GetInstance()->setTargetingScreenLetterboxAmount(mLetterboxAmount); + mFlags &= ~(CAM_FLAGS_0x100 | CAM_FLAGS_0x80); + + if (!link->checkActionFlagsCont(0x400000)) { + field_0x299 = 0; + } + + f32 alphaTarget; + f32 alphaUpdateSpeed = sHio.field_0x2C; + if (EventManager::isInEvent()) { + alphaUpdateSpeed = 1.0f; + if (field_0x2A1 != 0) { + alphaTarget = field_0x2A0 ? sHio.field_0x28 : 0.0f; + } else { + alphaTarget = 1.0f; + } + } else { + if (field_0x299 != 0) { + alphaTarget = field_0x298 ? sHio.field_0x28 : 0.0f; + } else { + alphaTarget = 1.0f; + } + } + + mGlobalAlpha += alphaUpdateSpeed * (alphaTarget - mGlobalAlpha); + dStageMgr_c::GetInstance()->setGlobalAlpha((u8)(mGlobalAlpha * 255.1f) & 0xFF); + + return SUCCEEDED; +} + +int dCamera_c::draw() { + if (mpCameras[mActiveCameraIdx] != nullptr) { + mpCameras[mActiveCameraIdx]->doDraw(); + } + return SUCCEEDED; +} + +bool dCamera_c::isUnderwater() const { + return mFlags & CAM_FLAGS_0x40; +} + +void dCamera_c::setFrustum(f32 fov, f32 near, f32 far) { + if (dGfx_c::isTvMode4To3()) { + mpScreen->Reset( + 0.0f, dGfx_c::getEFBHeightDifferenceF(), dGfx_c::getCurrentScreenWidthF(), dGfx_c::getHeightScaledF(), + mpScreen->GetCanvasMode() + ); + } else { + mpScreen->Reset( + 0.0f, 0.0f, dGfx_c::getCurrentScreenWidthF(), dGfx_c::getCurrentScreenHeightF(), mpScreen->GetCanvasMode() + ); + if (dGfx_c::isTvMode4To3()) { + // Unreachable... + fov *= sHio.field_0x0C; + } + } + + mpScreen->SetProjectionType(EGG::Frustum::PROJ_PERSP); + mpScreen->SetNearZ(near); + mpScreen->SetFarZ(far); + mpScreen->SetFovy(fov); + + // Possible fakematch: Either the internals of EGG::Matrix34f allow + // copying the data via compiler-generated struct copies (lwz/stw), + // or this is really what they did. NSMBW symbols confirm that this function + // takes mMtx_c while it's clear that EGG cameras return EGG matrices. + mMtx_c mtx = *(mMtx_c *)&mLookAtCamera.getViewMatrix(); + mFrustum.set(fov, mpScreen->GetAspect(), near, far, mtx); +} + +void dCamera_c::updateUnderwaterDepth(const mVec3_c &pos) { + mVec3_c chkPos = pos; + dBgS_RoofChk roofChk; + roofChk.SetPos(&chkPos); + roofChk.SetUnderwaterRoof(); + roofChk.SetField_0x7C(1); + + f32 f = dBgS::GetInstance()->RoofChk(&roofChk); + if (f != 1e9f) { + chkPos.y = f; + } else { + chkPos.y += 10000.0f; + } + + dBgS_ObjGndChk_Wtr wtrChk; + wtrChk.SetPos(chkPos); + f32 waterHeight = dBgS::GetInstance()->GroundCross(&wtrChk); + if (waterHeight != 1e9f) { + mIsUnderwater = waterHeight > pos.y; + mWaterHeight = waterHeight; + } else { + mIsUnderwater = false; + mWaterHeight = -1e9f; + } + + if (mIsUnderwater) { + mUnderwaterDepth = waterHeight - pos.y; + } else { + mUnderwaterDepth = 0.0f; + } +} + +bool dCamera_c::isUnderwater_() const { + return mIsUnderwater; +} + +f32 dCamera_c::getUnderwaterDepth() const { + return mUnderwaterDepth; +} + +void dCamera_c::substruct_1::setCamera(dCamera_c *cam) { + mpCamera = cam; +} + +void dCamera_c::substruct_1::fn_8019E890() { + fn_8019E8D0(mpCamera->fn_8019E3B0()); +} + +void dCamera_c::substruct_1::fn_8019E8D0(const mAng &ang) { + if (!mActive) { + mActive = true; + field_0x04 = ang; + mFSStickAngle = dPad::getFSStickAngle(); + } +} + +mAng dCamera_c::substruct_1::fn_8019E930() { + return field_0x04; +} + +void dCamera_c::substruct_1::fn_8019E940() { + if (mActive) { + mAng angle = mFSStickAngle - dPad::getFSStickAngle(); + f32 distance = dPad::getFSStickDistance(); + if (distance < sHio.field_0x14 || mAng::abs(angle) > sHio.field_0x18) { + mActive = false; + } + } + + if (!mActive) { + field_0x04 = mpCamera->fn_8019E3B0(); + mFSStickAngle = dPad::getFSStickAngle(); + } +} diff --git a/src/d/d_message.cpp b/src/d/d_message.cpp index ee053763..a00f9865 100644 --- a/src/d/d_message.cpp +++ b/src/d/d_message.cpp @@ -476,7 +476,7 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { case EVENT_CAMERA_42: { s32 p1 = (params1n2 >> 16) & 0xFFFF; s32 p2 = params1n2 & 0xFFFF; - dScGame_c::getCamera(0)->doFn_800918E0(p1, p2); + dScGame_c::getCamera(0)->getEventCam()->fn_800918E0(p1, p2); break; } case EVENT_LYT_MINI_GAME: { diff --git a/src/d/d_stage_mgr.cpp b/src/d/d_stage_mgr.cpp index 2760a45e..eb1eb4cf 100644 --- a/src/d/d_stage_mgr.cpp +++ b/src/d/d_stage_mgr.cpp @@ -134,7 +134,7 @@ void dStageMgr_c::initializeState_ReadLayerObjectRes() { parseBzsStageRoom(roomId, bzs); } - if (dScGame_c::isStateLayerWithSeekerStoneHintMenu()) { + if (dScGame_c::isSeekerStoneStageAndLayer()) { mLayoutArcCtrl2.set(sSeekerStoneLayoutArcs, ARRAY_LENGTH(sSeekerStoneLayoutArcs)); mLayoutArcCtrl2.load(dHeap::work2Heap.heap); addActorId(fProfile::LYT_SEEKER_STONE); diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 5d09b8a0..6c953b62 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -3304,10 +3304,10 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) { } if (mDoCameraTransition) { - dScGame_c::getCamera(0)->doFn_80093380(); + dScGame_c::getCamera(0)->getMapCam()->fn_80093380(); } else { - dScGame_c::getCamera(0)->doFn_80093360(); - dScGame_c::getCamera(0)->doFn_80093340(); + dScGame_c::getCamera(0)->getMapCam()->fn_80093360(); + dScGame_c::getCamera(0)->getMapCam()->fn_80093340(); } dScGame_c::getCamera(0)->fn_8019E410(); dLytMapMain_vt0x10(); @@ -3357,7 +3357,7 @@ void dLytMapMain_c::close() { } } else if (mRoomType == ROOMTYPE_DUNGEON && !field_0x8CAE && !mMapUpDirection) { mDoCameraTransition = false; - dScGame_c::getCamera(0)->doFn_80093340(); + dScGame_c::getCamera(0)->getMapCam()->fn_80093340(); } } @@ -3367,9 +3367,9 @@ void dLytMapMain_c::close() { } if (mDoCameraTransition) { - dScGame_c::getCamera(0)->doFn_80093380(); + dScGame_c::getCamera(0)->getMapCam()->fn_80093380(); } else { - dScGame_c::getCamera(0)->doFn_80093360(); + dScGame_c::getCamera(0)->getMapCam()->fn_80093360(); } if (mMapEvent == MAP_EVENT_NONE) { @@ -5047,7 +5047,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)->doFn_80093360(); + dScGame_c::getCamera(0)->getMapCam()->fn_80093360(); dScGame_c::getCamera(0)->fn_8019E430(); mStateMgr.changeState(StateID_Invisible); } diff --git a/src/d/lyt/meter/d_lyt_meter_a_btn.cpp b/src/d/lyt/meter/d_lyt_meter_a_btn.cpp index 0d3fe86d..bb86fd3e 100644 --- a/src/d/lyt/meter/d_lyt_meter_a_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_a_btn.cpp @@ -268,9 +268,9 @@ bool dLytMeterABtn_c::execute() { field_0x1BC = LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_A); field_0x1C0 = LytDoButtonRelated::getHas(LytDoButtonRelated::DO_BUTTON_A); - if (field_0x1BC == 0x76) { + if (field_0x1BC == LytDoButtonRelated::ACT_IE_ETC_REMOVE_BEACON) { state = true; - } else if (field_0x1BC == 0x57) { + } else if (field_0x1BC == LytDoButtonRelated::ACT_IE_INFO_GRAB_3) { state = false; } diff --git a/src/d/lyt/meter/d_lyt_meter_dowsing.cpp b/src/d/lyt/meter/d_lyt_meter_dowsing.cpp index dde6a0b6..f4eb2ffe 100644 --- a/src/d/lyt/meter/d_lyt_meter_dowsing.cpp +++ b/src/d/lyt/meter/d_lyt_meter_dowsing.cpp @@ -372,7 +372,7 @@ void dLytMeterDowsing_c::executeState_Invisible() { } void dLytMeterDowsing_c::finalizeState_Invisible() { if (getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE && - LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52) { + LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE) { mAnm[DOWSING_ANIM_DECIDE].setToEnd(); mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(true); mLyt.calc(); @@ -404,7 +404,7 @@ void dLytMeterDowsing_c::executeState_Wait() { dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->isInModeMap() && !dLytMeter_c::GetMain()->isInModePause() && getSelectedDowsingSlot() != DowsingTarget::SLOT_LOOK && getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE && - LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52) { + LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE) { mAnm[DOWSING_ANIM_IN].setBackwardsOnce(); mAnm[DOWSING_ANIM_IN].setToEnd2(); mAnm[DOWSING_ANIM_IN].setAnimEnable(true); @@ -498,7 +498,7 @@ void dLytMeterDowsing_c::initializeState_MenuSelectingOut() { mAnm[DOWSING_ANIM_IN].setAnimEnable(true); field_0x550A = 0; if (getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE && - LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52) { + LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE) { if (getSelectedDowsingSlot() != DowsingTarget::SLOT_LOOK) { field_0x550A = 1; } @@ -551,8 +551,9 @@ void dLytMeterDowsing_c::initializeState_ToUse() { mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(true); if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 && - LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) && - !dLytMeter_c::GetMain()->isInModeMap() && !dLytMeter_c::GetMain()->isInModePause()) { + LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE && + dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->isInModeMap() && + !dLytMeter_c::GetMain()->isInModePause()) { mAnm[DOWSING_ANIM_RESET].setAnimEnable(true); mAnm[DOWSING_ANIM_RESET].setBackwardsOnce(); mAnm[DOWSING_ANIM_RESET].setToStart(); @@ -560,8 +561,9 @@ void dLytMeterDowsing_c::initializeState_ToUse() { } void dLytMeterDowsing_c::executeState_ToUse() { if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 && - LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) && - !dLytMeter_c::GetMain()->isInModeMap() && !dLytMeter_c::GetMain()->isInModePause()) { + LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE && + dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->isInModeMap() && + !dLytMeter_c::GetMain()->isInModePause()) { if (mAnm[DOWSING_ANIM_INPUT_0].isStop2()) { if (!mAnm[DOWSING_ANIM_RESET].isEnabled() || mAnm[DOWSING_ANIM_RESET].isStop2()) { mStateMgr.changeState(StateID_Wait); @@ -594,8 +596,9 @@ void dLytMeterDowsing_c::initializeState_ToUnuse() { mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(true); if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 && - LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) && - !dLytMeter_c::GetMain()->isInModeMap() && !dLytMeter_c::GetMain()->isInModePause()) { + LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE && + dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->isInModeMap() && + !dLytMeter_c::GetMain()->isInModePause()) { mAnm[DOWSING_ANIM_RESET].setAnimEnable(true); mAnm[DOWSING_ANIM_RESET].setForwardOnce(); mAnm[DOWSING_ANIM_RESET].setToStart(); diff --git a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp index 448c8cbe..4ffb7d9a 100644 --- a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp +++ b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp @@ -656,8 +656,8 @@ bool dLytMeterGanbariGauge_c::fn_80104760() const { } bool dLytMeterGanbariGauge_c::fn_801047B0() const { - if (fn_80081FE0(dScGame_c::getCamera(0)->getField_0xD98(), "mogu") || - fn_80081FE0(dScGame_c::getCamera(0)->getField_0xD98(), "mogu2")) { + if (dScGame_c::getCamera(0)->getGameCam1()->isCurrentTrend("mogu") || + dScGame_c::getCamera(0)->getGameCam1()->isCurrentTrend("mogu2")) { return true; } return false; diff --git a/src/d/lyt/meter/d_lyt_meter_z_btn.cpp b/src/d/lyt/meter/d_lyt_meter_z_btn.cpp index eeefae52..9d9c6174 100644 --- a/src/d/lyt/meter/d_lyt_meter_z_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_z_btn.cpp @@ -186,9 +186,9 @@ bool dLytMeterZBtn_c::execute() { return true; } field_0x1C4 = true; - if ((!fn_80081FE0(dScGame_c::getCamera(0)->getField_0xD98(), "mogu") || + if ((!dScGame_c::getCamera(0)->getGameCam1()->isCurrentTrend("mogu") || AttentionManager::GetInstance()->checkLink2()) && - LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_Z) == 0x67) { + LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_Z) == LytDoButtonRelated::ACT_IE_ETC_VIEW_SURFACE) { field_0x1C4 = false; LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_NONE); } diff --git a/src/toBeSorted/attention.cpp b/src/toBeSorted/attention.cpp index 2d71fecf..28f5290a 100644 --- a/src/toBeSorted/attention.cpp +++ b/src/toBeSorted/attention.cpp @@ -416,11 +416,9 @@ void AttentionGroup::fn_800964B0() { } } -extern "C" f32 lbl_8057CD9C; - f32 AttentionManager::targetScore(dAcObjBase_c *target, dAcObjBase_c *origin) { s16 angle = cLib::targetAngleY(target->mPosition, origin->mPosition) - origin->mRotation.y.mVal; - f32 viewAngle = fabsf(angle * lbl_8057CD9C); + f32 viewAngle = fabsf(mAng::s2n_c(angle)); if (viewAngle > 0.5f) { return viewAngle; } @@ -429,9 +427,7 @@ f32 AttentionManager::targetScore(dAcObjBase_c *target, dAcObjBase_c *origin) { // Maybe checks if actor is currently targeted bool AttentionManager::fn_80096B40(dAcObjBase_c *actor) { - AttentionPool *refs = mGroups[1].getOtherPool(); - dAcObjBase_c *ac = refs->getActor(mModels.mCurrentTargetInfoIdx); - if (ac == actor) { + if (getTargetedActorUnchecked() == actor) { mHasTarget = 1; } return true; diff --git a/src/toBeSorted/d_camera_base.cpp b/src/toBeSorted/d_camera_base.cpp new file mode 100644 index 00000000..f079e77d --- /dev/null +++ b/src/toBeSorted/d_camera_base.cpp @@ -0,0 +1,48 @@ +#include "toBeSorted/d_camera_base.h" + +#include "common.h" + +// TODO: Weak function order (CamView dtor needs to appear after a bunch of weak functions) +// TODO: I'm not sure why all those weak functions even got emitted here, there's nothing +// that forces the compiler to put anything here so using this as a hack. I really believe the +// text split is correct, and this file doesn't appear to have any other sections. +void CreatedCameraBase_cHack() { + dCameraBase_c *c = new dCameraBase_c(); +} + +bool dCameraBase_c::doCreate(s32 index) { + if (!mCreated) { + if (!create()) { + return false; + } + mCreated = true; + mIndex = index; + } + return true; +} + +bool dCameraBase_c::doRemove() { + field_0x01 = false; + return remove(); +} + +bool dCameraBase_c::doExecute() { + if (field_0x02 && !field_0x01) { + vt_0x08(); + } else if (!field_0x02 && field_0x01) { + vt_0x0C(); + } + field_0x01 = field_0x02; + if (!field_0x02) { + return false; + } else { + return execute(); + } +} + +bool dCameraBase_c::doDraw() { + if (field_0x01) { + return draw(); + } + return false; +} diff --git a/src/toBeSorted/d_camera_event.cpp b/src/toBeSorted/d_camera_event.cpp new file mode 100644 index 00000000..ceb91fb0 --- /dev/null +++ b/src/toBeSorted/d_camera_event.cpp @@ -0,0 +1,21 @@ +#include "toBeSorted/d_camera_event.h" + +#include "common.h" + +class dCameraEvent_HIO_c { +public: + dCameraEvent_HIO_c(); + virtual ~dCameraEvent_HIO_c(); + + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0A */ s16 field_0x0A; +}; + +dCameraEvent_HIO_c::~dCameraEvent_HIO_c() {} +dCameraEvent_HIO_c::dCameraEvent_HIO_c() : field_0x04(0.0f), field_0x08(180.0f), field_0x0A(0) {} + +static dCameraEvent_HIO_c sHio; + +dCameraEvent_c::dCameraEvent_c() + : field_0x48(0), field_0x4A(-1), mEventRelated(1, nullptr), field_0xA0(0), field_0xA4(-1), field_0xAC(-1) {} diff --git a/src/toBeSorted/d_camera_game.cpp b/src/toBeSorted/d_camera_game.cpp new file mode 100644 index 00000000..37767c78 --- /dev/null +++ b/src/toBeSorted/d_camera_game.cpp @@ -0,0 +1,423 @@ + + +#include "toBeSorted/d_camera_game.h" + +#include "common.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/d_bzs_types.h" +#include "d/d_player_act.h" +#include "d/d_room.h" +#include "d/d_sc_game.h" +#include "d/d_stage.h" +#include "m/m_angle.h" +#include "m/m_vec.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/attention.h" + +class dCameraGame_HIO_c { +public: + dCameraGame_HIO_c(); + virtual ~dCameraGame_HIO_c(); + + void create(); + void remove(); + +public: + /* 0x004 */ u8 _0x004[0x0E8 - 0x004]; + + /* 0x0E8 */ f32 field_0x0E8; + + /* 0x0EC */ u8 _0x0EC[0x138 - 0x0EC]; +}; + +static dCameraGame_HIO_c sHio; +dCameraGame_HIO_c::~dCameraGame_HIO_c() {} + +CamParamHeader *dCameraGame_c::sHeader; +f32 *dCameraGame_c::sFloats; +u16 *dCameraGame_c::sFlags; +CamParamStyle *dCameraGame_c::sStyles; +CamParamTrend *dCameraGame_c::sTrends; + +s32 dCameraGame_c::sTrendIdxes[CAM_TREND_IDX_MAX]; +s32 dCameraGame_c::sStyleIdxes[CAM_STYLE_IDX_MAX]; + +void debugPrintf4(const char *fmt, ...) { + // no-op +} + +static s32 getCurrentRoomId() { + return dAcPy_c::GetLinkM()->mRoomID; +} + +const CAM *getCam(s32 camId, s32 roomId) { + if (camId == -1) { + return nullptr; + } + roomId = roomId >= 0 ? roomId : getCurrentRoomId(); + return dStage_c::GetInstance()->getRoom(roomId)->getCamForIndex(camId); +} + +const CAM *getCam(const CamId &id) { + return getCam(id.roomCamId, id.roomId); +} + +s32 getCamTrend(const CamId &id) { + return dCameraGame_c::getTrendIndex(getCam(id)->trendName); +} + +s32 dCameraGame_c::getTrendIndex(const char *name) { + SizedString<32> lName(name); + for (int i = 0; i < sHeader->numTrends; i++) { + // MWCC doesn't complain about this one but clangd doesn't like it + if (lName == sTrends[i].name) { + return i; + } + } + return 0; +} + +s32 dCameraGame_c::getStyleIndex(u32 id) { + for (int i = 0; i < sHeader->numStyles; i++) { + // Temp needed... inline? + s32 otherId = sStyles[i].id; + if (otherId == id) { + return i; + } + } + return -1; +} + +void dCameraGame_c::cacheIdxes() { + sTrendIdxes[CAM_TREND_IDX_BalanceBall] = getTrendIndex("BalanceBall"); + sTrendIdxes[CAM_TREND_IDX_Swim] = getTrendIndex("Swim"); + sTrendIdxes[CAM_TREND_IDX_Surface] = getTrendIndex("Surface"); + sTrendIdxes[CAM_TREND_IDX_SkyDive] = getTrendIndex("SkyDive"); + sTrendIdxes[CAM_TREND_IDX_Dive] = getTrendIndex("Dive"); + sTrendIdxes[CAM_TREND_IDX_Lift] = getTrendIndex("Lift"); + sTrendIdxes[CAM_TREND_IDX_Crawl] = getTrendIndex("Crawl"); + sTrendIdxes[CAM_TREND_IDX_Field] = getTrendIndex("Field"); + sTrendIdxes[CAM_TREND_IDX_Dungeon] = getTrendIndex("Dungeon"); + sTrendIdxes[CAM_TREND_IDX_mogu] = getTrendIndex("mogu"); + sTrendIdxes[CAM_TREND_IDX_mogu2] = getTrendIndex("mogu2"); + sTrendIdxes[CAM_TREND_IDX_Tornade] = getTrendIndex("Tornade"); + sTrendIdxes[CAM_TREND_IDX_Rope] = getTrendIndex("Rope"); + sTrendIdxes[CAM_TREND_IDX_Tightrope] = getTrendIndex("Tightrope"); + sTrendIdxes[CAM_TREND_IDX_Parachute] = getTrendIndex("Parachute"); + sTrendIdxes[CAM_TREND_IDX_DialKey] = getTrendIndex("DialKey"); + sTrendIdxes[CAM_TREND_IDX_BirdRide] = getTrendIndex("BirdRide"); + sTrendIdxes[CAM_TREND_IDX_BirdRideLD] = getTrendIndex("BirdRideLD"); + sTrendIdxes[CAM_TREND_IDX_Trolley] = getTrendIndex("Trolley"); + sTrendIdxes[CAM_TREND_IDX_Boomerang] = getTrendIndex("Boomerang"); + sTrendIdxes[CAM_TREND_IDX_Room] = getTrendIndex("Room"); + sTrendIdxes[CAM_TREND_IDX_AfterCrawl] = getTrendIndex("AfterCrawl"); + if (dScGame_c::currentSpawnInfo.stageName == "F020") { + sTrendIdxes[CAM_TREND_IDX_TerryShip_Island] = getTrendIndex("Island"); + } else { + sTrendIdxes[CAM_TREND_IDX_TerryShip_Island] = getTrendIndex("TerryShip"); + } + sTrendIdxes[CAM_TREND_IDX_Catapult] = getTrendIndex("Catapult"); + sTrendIdxes[CAM_TREND_IDX_TightropeHang] = getTrendIndex("TightropeHang"); + sTrendIdxes[CAM_TREND_IDX_BossKey] = getTrendIndex("BossKey"); + sTrendIdxes[CAM_TREND_IDX_SkyDiveNear] = getTrendIndex("SkyDiveNear"); + sTrendIdxes[CAM_TREND_IDX_ClawShot] = getTrendIndex("ClawShot"); + sTrendIdxes[CAM_TREND_IDX_Town] = getTrendIndex("Town"); + sTrendIdxes[CAM_TREND_IDX_Cannon] = getTrendIndex("Cannon"); + sTrendIdxes[CAM_TREND_IDX_Nushi] = getTrendIndex("Nushi"); + sTrendIdxes[CAM_TREND_IDX_Island] = getTrendIndex("Island"); + sTrendIdxes[CAM_TREND_IDX_Windmill] = getTrendIndex("Windmill"); + + sStyleIdxes[CAM_STYLE_IDX_TA22] = getStyleIndex('TA22'); +} + +bool dCameraGame_c::initCamParamDat() { + void *data = OarcManager::GetInstance()->getData("Camera", "arc/camparam.dat"); + + if (data == nullptr) { + return false; + } + + CamParamHeader *header = (CamParamHeader *)data; + sHeader = header; + sFloats = (f32 *)((u32)data + sizeof(CamParamHeader)); + sFlags = (u16 *)((u32)sFloats + sizeof(f32) * header->numFloats); + sStyles = (CamParamStyle *)((u32)sFlags + sizeof(u16) * header->numFlags); + sTrends = (CamParamTrend *)((u32)sStyles + sizeof(CamParamStyle) * header->numStyles); + debugPrintf4("*** camera parameter data *** ", sTrends); // ??? - need this in r4... + debugPrintf4(" %3d float numbers", sHeader->numFloats); + debugPrintf4(" %3d (x16) flags", sHeader->numFlags); + debugPrintf4(" %3d styles", sHeader->numStyles); + debugPrintf4(" %3d trends", sHeader->numTrends); + cacheIdxes(); + return true; +} + +dCameraGame_HIO_c::dCameraGame_HIO_c() { + // TODO - ... +} + +void dCameraGame_HIO_c::create() { + // no-op +} + +void dCameraGame_HIO_c::remove() { + // no-op +} + +void UnkCamChecks::fn_8007E130(dCameraGame_c *system) { + mChk2.field_0x000 = 0; + mChk1.field_0x000 = 0; + mRef.field_0x00 = false; + mRef.mMoveBgActorRef.unlink(); + field_0x16A = 0; + field_0x16B = 0; + + field_0x164.roomCamId = -1; + field_0x164.roomId = dAcPy_c::GetLinkM()->getRoomId(); + field_0x164.field_0x04 = 0; + mpCamera = system; +} + +void UnkCamChecks::fn_8007E1B0(dAcObjBase_c *ac) { + dAcPy_c *link = dAcPy_c::GetLinkM(); + + mVec3_c pos = ac->mPosition; + if (ac == link && link->checkActionFlags(daPlayerActBase_c::FLG0_CRAWLING)) { + pos = ac->mPositionCopy2; + pos.y = ac->mPosition.y; + } + + mVec3_c pos2 = pos; + pos.y += 20.0f; + + dBgS_RoofChk roofChk; + roofChk.SetUnderwaterRoof(); + roofChk.SetField_0x7C(1); + roofChk.SetPos(&pos2); + f32 rChk = dBgS::GetInstance()->RoofChk(&roofChk); + if (pos2.y < rChk) { + pos2.y = rChk; + } + + mChk2.chk.SetCam(); + mChk2.chk.ClrObj(); + mChk2.chk.SetPos(&pos); + mChk2.field_0x094 = dBgS::GetInstance()->GroundCross(&mChk2.chk); + mChk2.field_0x000 = mChk2.field_0x094 != -1e9f; + field_0x16B = 0; + + bool moveBg = dBgS::GetInstance()->ChkMoveBG(mChk2.chk, true); + if (moveBg && mRef.field_0x00) { + mRef.mMoveBgActorRef.link(const_cast(dBgS::GetInstance()->GetActorPointer(mChk2.chk))); + mVec3_c v_c4 = ac->mPosition; + dBgS::GetInstance()->MoveBgCrrPos(mChk2.chk, true, &v_c4, nullptr, nullptr, 0, 0); + mRef.field_0x04 = v_c4 - ac->mPosition; + } else { + mRef.mMoveBgActorRef.unlink(); + } + mRef.field_0x00 = moveBg; + + mChk1.chk.SetPos(&pos2); + mChk1.field_0x094 = dBgS::GetInstance()->GroundCross(&mChk1.chk); + mChk1.field_0x000 = mChk1.field_0x094 != -1e9f; + + if (link->checkActionFlags(daPlayerActBase_c::FLG0_IN_WATER) && mChk1.field_0x094 < ac->mPositionCopy3.y + 40.0f) { + field_0x16A = 1; + } else if (link->getRidingActorType() != daPlayerActBase_c::RIDING_NONE || + link->checkActionFlags(daPlayerActBase_c::FLG0_HANGING_LEDGE) || + link->checkActionFlags(daPlayerActBase_c::FLG0_ON_VINES)) { + field_0x16A = 1; + } else { + if (ac->mPosition.y - mChk2.field_0x094 > sHio.field_0x0E8) { + field_0x16A = 0; + } else { + field_0x16A = 1; + } + } + + 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()) { + mChk1.camId.clear(); + } + } else { + mChk1.camId.clear(); + } + + if (!field_0x16A) { + mChk2.camId = mpCamera->getCamId0x60(); + } 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()) { + mChk2.camId.clear(); + } + } else { + mChk2.camId.clear(); + } + + s32 roomId = getCurrentRoomId(); + if (roomId >= 0) { + dRoom_c *room = dStage_c::GetInstance()->getRoom(roomId); + if (room->getFile() != nullptr && room->getFile()->field_0x00 != -1) { + field_0x16C.roomCamId = room->getFile()->field_0x00; + field_0x16C.roomId = roomId; + field_0x16C.field_0x04 = 0; + } else { + field_0x16C.clear(); + } + } +} + +dCameraGame_c::dCameraGame_c() + : field_0x058(0), + field_0x05C(0), + mCurrentTrendIdx(-1), + field_0x06C(0), + field_0x070(0xFFFF), + field_0x074(0), + field_0x078(0), + field_0x07C(0), + field_0x08C(-1), + field_0x090(-1), + field_0x094(-1), + field_0x096(0), + field_0x098(0), + field_0x0A8(0), + field_0x0AC(0.0f), + field_0x0B0(0.0f), + field_0x22C(32), + field_0x230(45), + field_0x234(0.0f, 0.0f, 0.0f), + field_0x240(0.0f, 0.0f, 0.0f) {} + +extern "C" void *GROOSENATOR_REF; +extern "C" void *lbl_80575364; + +bool dCameraGame_c::create() { + field_0x098 = dAcPy_c::GetLinkM(); + if (field_0x098 == nullptr) { + return false; + } + + field_0x240 = field_0x234 = field_0x098->mPositionCopy3; + initCamParamDat(); + field_0x060.clear(); + mCurrentTrendIdx = -1; + field_0x06C = 0; + field_0x070 = 0xFFFF; + sHio.create(); + field_0x086.clear(); + field_0x080.clear(); + field_0x08C = -1; + field_0x094 = -1; + field_0x090 = -1; + + field_0x0AC = 0.0f; + field_0x0B0 = 0.0f; + field_0x058 = 0xA00; + field_0x07C = 0; + field_0x096 = 0; + field_0x078 = 0; + + mChk.fn_8007E130(this); + mChk.fn_8007E1B0(field_0x098); + + field_0x22C = 32; + field_0x230 = 45; + + mView.field_0x0C = field_0x098->mPosition; + mView.field_0x0C.y += 150.0f; + + field_0x02C.Set(320.0f, 15.0f, mAng::s2d_c(field_0x098->mRotation.y) + 180.0f); + mView.field_0x00 = mView.field_0x0C + field_0x02C.toCartesian(); + mView.mFov = 60.0f; + mView2 = mView; + + field_0x264 = mView.field_0x00.y; + field_0x268 = mView.field_0x00.y; + + GROOSENATOR_REF = nullptr; + lbl_80575364 = nullptr; + field_0x079 = 0; + field_0x07A = 0; + + return true; +} + +bool dCameraGame_c::draw() { + return true; +} + +// TODO: make these static when they're actually used + +inline bool linChkAttentionTarget_(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 linCross(dBgS_LinChk &chk, UNKWORD _ignored) { + return dBgS::GetInstance()->LineCross(&chk); +} + +bool camLinChkAttentionTarget(const mVec3_c &from, const mVec3_c &to, UNKWORD _ignored) { + dBgS_CamLinChk chk; + return linChkAttentionTarget(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); + if (ret) { + result = chk.GetLinEnd(); + } + return ret; +} + +bool dCameraGame_c::execute() { + // TODO - ... +} + +bool dCameraGame_c::remove() { + sHeader = nullptr; + sFloats = nullptr; + sFlags = nullptr; + sStyles = nullptr; + sTrends = nullptr; + sHio.remove(); + return true; +} + +void dCameraGame_c::clearCamIds() { + field_0x086.clear(); + field_0x080.clear(); + mChk.field_0x164.clear(); + mChk.field_0x16C.clear(); +} + +bool dCameraGame_c::isCurrentTrend(const char *name) const { + return getTrendIndex(name) == mCurrentTrendIdx; +} + +void dCameraGame_c::setView(const CamView &view) { + mView2 = view; + mView = view; + mVec3_c diff = view.field_0x00 - view.field_0x0C; + field_0x02C.setCartesian(diff); + field_0x078 = 0; +} + +void dCameraGame_c::vt_0x08() { + // TODO - ... +} diff --git a/src/toBeSorted/d_camera_map.cpp b/src/toBeSorted/d_camera_map.cpp new file mode 100644 index 00000000..97089a50 --- /dev/null +++ b/src/toBeSorted/d_camera_map.cpp @@ -0,0 +1,152 @@ +#include "toBeSorted/d_camera_map.h" + +#include "common.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/cc/d_cc_s.h" +#include "m/m_vec.h" +#include "toBeSorted/d_camera_math.h" +#include "toBeSorted/deg_angle_util.h" + +class dCameraMap_HIO_c { +public: + dCameraMap_HIO_c(); + virtual ~dCameraMap_HIO_c(); + + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 field_0x0C; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ s16 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ u8 _0x38[0x3C - 0x38]; + /* 0x3C */ u16 field_0x3C; + /* 0x3E */ u16 field_0x3E; +}; + +dCameraMap_HIO_c::~dCameraMap_HIO_c() {} +dCameraMap_HIO_c::dCameraMap_HIO_c() { + field_0x04 = 2000.0f; + field_0x08 = 1000.0f; + field_0x0C = 0.6f; + field_0x10 = 0.75f; + field_0x18 = 10000.0f; + field_0x14 = 2500.0f; + field_0x20 = 89.0f; + field_0x1C = 3.0f; + field_0x24 = 90.0f; + field_0x28 = 5; + field_0x3E = 2; + field_0x2C = 0.7f; + field_0x30 = 0.2f; + field_0x34 = 0.9f; + field_0x3C = 0; +} + +static dCameraMap_HIO_c sHio; + +mVec3_c fn_800929C0(const mVec3_c &p2, const mVec3_c &p3, dAcObjBase_c *obj) { + mVec3_c ret; + + mVec3_c v1 = p3; + + dAcPy_c *link = dAcPy_c::LINK; + + dAcObjBase_c *other = nullptr; + if (obj != nullptr && obj != link) { + other = obj; + } + + mVec3_c v2 = p3; + + dAcObjBase_c *controllingActor = (dAcObjBase_c *)link->getLinkage().mControllingActor.p_owner; + + for (int i = 0; i < 3; i++) { + ret = v1; + if (!dCcS::GetInstance()->ChkCameraPoint(p2, v2, v1, link, other, controllingActor, 15.0f)) { + break; + } + if (p2 == v1) { + break; + } + mVec3_c tmp = p3 - v1; + tmp.normalize(); + v2 = v1 - tmp * 2.0f; + } + + return ret; +} + +bool dCameraMap_c::execute() { + s16 unk = sHio.field_0x28; + + if ((sHio.field_0x3C & 0x200) && field_0xAC) { + // TODO no-op + unk = sHio.field_0x28; + } + field_0x40 = 1.0f; + + if (sHio.field_0x3C & 0x8) { + mView3 = mView2; + } + + dBgS_CamLinChk chk; + chk.Set(&mView2.field_0x00, &mView3.field_0x00, (dAcObjBase_c *)nullptr); + if (dBgS::GetInstance()->LineCross(&chk)) { + mView3 = mView2; + } + + if (sHio.field_0x3C & 0x10) { + if (sHio.field_0x3E == 1) { + dPolar polar(mView2.field_0x00 - mView2.field_0x0C); + polar.V.Set(0.0f); + mView2.field_0x00 = mView2.field_0x0C + polar.toCartesian(); + } + mView3 = mView2; + field_0xB8 = 1; + } + + if (field_0xAC != 0) { + if (field_0xB8 > 0) { + field_0xB8--; + if (field_0xB8 == 0) { + field_0xB4 = 0; + } + } + } else { + if (field_0xB8 < unk) { + field_0xB8++; + } + } + + f32 f = (f32)field_0xB8 / (f32)unk; + f32 f5 = camEaseInOut(f, sHio.field_0x2C); + f32 f6 = camEaseInOut(f, sHio.field_0x30); + f32 f8 = f5 * 0.99f; + f32 f7 = camEaseInOut(f, sHio.field_0x34); + + mView.field_0x0C = mView2.field_0x0C + (mView3.field_0x0C - mView2.field_0x0C) * f5; + mView.field_0x00.x = mView2.field_0x00.x + (mView3.field_0x00.x - mView2.field_0x00.x) * f8; + mView.field_0x00.y = mView2.field_0x00.y + (mView3.field_0x00.y - mView2.field_0x00.y) * f6; + mView.field_0x00.z = mView2.field_0x00.z + (mView3.field_0x00.z - mView2.field_0x00.z) * f8; + + mView.field_0x00 = fn_800929C0(mView.field_0x0C, mView.field_0x00, field_0x44); + mView.mFov = mView2.mFov + (mView3.mFov - mView2.mFov) * f7; + mView.field_0x1C = mView2.field_0x1C + (mView3.field_0x1C - mView2.field_0x1C) * f7; + + return true; +} + +void dCameraMap_c::setView(const CamView &view) { + mView1 = view; + mView = view; +} diff --git a/src/toBeSorted/d_camera_math.cpp b/src/toBeSorted/d_camera_math.cpp new file mode 100644 index 00000000..9d245e12 --- /dev/null +++ b/src/toBeSorted/d_camera_math.cpp @@ -0,0 +1,127 @@ +#include "toBeSorted/d_camera_math.h" + +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "m/m_vec.h" +#include "toBeSorted/deg_angle_util.h" + +#include + +void d_camera_math_float_order() { + // Maybe more functions here + 0.5; + 1.0; + 0.0f; + -1.0; + 2.0; + 4.0; + -1e-7; +} + +f32 camEaseIn(f32 arg, f32 param) { + // TODO - regswaps, maybe equivalent + f64 factor; + if (arg >= 0.0f) { + factor = 1.0; + } else { + factor = -1.0; + arg = -arg; + } + + f64 f1 = 2.0 * arg * param - 2.0 * arg - 2.0 * param; + f64 tmp = (-f1 - 1.0); + f64 f6 = f1 * f1 - tmp * 4.0 * arg; + if (f6 > -1e-7) { + f6 = sqrt(f6); + } else { + f6 = 0.0; + } + + f64 f2 = 2.0 * tmp; + f64 f2_ = (-f1 - f6); + if (f2 > 1e-7 || f2 < -1e-7) { + f2 = f2_ / f2; + f6 = 1.0 - f2; + f6 = f2 * f2 + f6 * f6 + param * 2.0 * f6 * f2; + // What + if (f6 > 1.0000000116860974e-7) { + f6 = (f2 * f2) / f6; + } else { + f6 = 0.0; + } + } else { + f32 a = camEaseIn(arg - 1e-6f, param); + f32 b = camEaseIn(arg + 1e-6f, param); + f6 = (a + b) * 0.5; + } + return f6 * factor; +} + +f32 camEaseInOut(f32 arg, f32 param) { + if (arg <= 0.0f) { + return 0.0f; + } else if (arg >= 1.0f) { + return 1.0f; + } + + f32 f1; + f32 result; + if (arg <= 0.5f) { + f1 = arg * 2.0f; + result = camEaseIn(f1, param) * 0.5f; + } else { + f1 = (1.0f - arg) * 2.0f; + result = (1.0f - camEaseIn(f1, param)) * 0.5f + 0.5f; + } + return result * (1.0f - f1) + arg * f1; +} + +mVec3_c camGetPointOnLine(const mVec3_c &target, const mVec3_c &origin, const mVec3_c &point) { + // NONMATCHING - stack swap between the two temporary vectors + dPolar p(target - origin); + p.R = (point - origin).mag(); + return origin + p.toCartesian(); +} + +mVec3_c camOffsetPoint(dAcObjBase_c *ac, const mVec3_c &localOffset) { + mVec3_c result = localOffset; + if (ac != nullptr) { + result.rotX(ac->mRotation.x); + result.rotY(ac->mRotation.y); + result += ac->mPosition; + } + return result; +} + + +mVec3_c camOffsetPoint(dAcObjBase_c *ac, const mVec3_c &localOffset, const mAng3_c &rot) { + mVec3_c result = localOffset; + if (ac != nullptr) { + result.rotX(rot.x); + result.rotY(rot.y); + result += ac->mPosition; + } + return result; +} + +mVec3_c camPointToLocal(dAcObjBase_c *ac, const mVec3_c &pos) { + mVec3_c result = pos; + if (ac != nullptr) { + result -= ac->mPosition; + // TODO: Shouldn't these be in the opposite order for a true inverse? + result.rotX(-ac->mRotation.x); + result.rotY(-ac->mRotation.y); + } + return result; +} + +mVec3_c camPointToLocal(dAcObjBase_c *ac, const mVec3_c &pos, const mAng3_c &rot) { + mVec3_c result = pos; + if (ac != nullptr) { + result -= ac->mPosition; + // TODO: Shouldn't these be in the opposite order for a true inverse? + result.rotX(-rot.x); + result.rotY(-rot.y); + } + return result; +} From cf8331c5c1af34ee88f3cb56b858cab74d0de876 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 4 Jan 2026 23:41:03 +0100 Subject: [PATCH 2/8] Small fix --- src/toBeSorted/d_camera_game.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/toBeSorted/d_camera_game.cpp b/src/toBeSorted/d_camera_game.cpp index 37767c78..0434c4e8 100644 --- a/src/toBeSorted/d_camera_game.cpp +++ b/src/toBeSorted/d_camera_game.cpp @@ -336,11 +336,12 @@ bool dCameraGame_c::create() { mView.field_0x0C.y += 150.0f; field_0x02C.Set(320.0f, 15.0f, mAng::s2d_c(field_0x098->mRotation.y) + 180.0f); - mView.field_0x00 = mView.field_0x0C + field_0x02C.toCartesian(); + const mVec3_c &v = mView.field_0x0C; // needed to avoid double load... TODO maybe inline? + mView.field_0x00 = v + field_0x02C.toCartesian(); mView.mFov = 60.0f; mView2 = mView; - field_0x264 = mView.field_0x00.y; + field_0x264 = v.y; field_0x268 = mView.field_0x00.y; GROOSENATOR_REF = nullptr; From 02c9e35a5e31d7829b0d4d54b1a2ada58c1eca49 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 4 Jan 2026 23:48:08 +0100 Subject: [PATCH 3/8] Undo a few changes --- include/m/m_frustum.h | 1 - include/toBeSorted/actor_event.h | 1 - 2 files changed, 2 deletions(-) diff --git a/include/m/m_frustum.h b/include/m/m_frustum.h index 4b0b34b9..00b9e584 100644 --- a/include/m/m_frustum.h +++ b/include/m/m_frustum.h @@ -11,7 +11,6 @@ public: void set(f32, f32, f32 near, f32 far, const mMtx_c &mtx); void set(f32, f32, f32, f32, f32 near, f32 far, const mMtx_c &mtx, bool); - /* 0x00 */ mMtx_c mView; /* 0x30 */ nw4r::math::PLANE mPlane_0x30; /* 0x40 */ nw4r::math::PLANE mPlane_0x40; diff --git a/include/toBeSorted/actor_event.h b/include/toBeSorted/actor_event.h index 32288a6b..f12f2678 100644 --- a/include/toBeSorted/actor_event.h +++ b/include/toBeSorted/actor_event.h @@ -8,7 +8,6 @@ class ActorEventRelated { public: - ActorEventRelated(); ActorEventRelated(dAcBase_c &owner, void *); ActorEventRelated(UNKWORD, void *); ~ActorEventRelated(); From 02c46f14241b2d99d9a68399c4197f493212a301 Mon Sep 17 00:00:00 2001 From: robojumper Date: Tue, 6 Jan 2026 01:23:01 +0100 Subject: [PATCH 4/8] progress --- config/SOUE01/symbols.txt | 30 +-- include/d/d_camera.h | 73 ++++-- include/toBeSorted/d_camera_base.h | 23 +- include/toBeSorted/d_camera_game.h | 10 +- include/toBeSorted/d_camera_map.h | 4 +- src/REL/d/a/b/d_a_b_lastboss.cpp | 6 +- src/REL/d/a/e/d_a_e_sm.cpp | 2 +- src/REL/d/t/d_t_spore.cpp | 6 +- src/REL/d/t/d_t_tumble_weed.cpp | 2 +- src/d/d_camera.cpp | 213 ++++++++++++++++-- src/d/lyt/d_lyt_map.cpp | 2 +- src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp | 2 +- src/toBeSorted/d_camera_base.cpp | 8 +- src/toBeSorted/d_camera_game.cpp | 16 +- src/toBeSorted/d_camera_map.cpp | 28 +-- 15 files changed, 314 insertions(+), 111 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 562b45b0..dd0d2ae4 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3069,8 +3069,8 @@ doExecute__13dCameraBase_cFv = .text:0x8006BC70; // type:function size:0xA8 vt_0x0C__13dCameraBase_cFv = .text:0x8006BD20; // type:function size:0x4 doDraw__13dCameraBase_cFv = .text:0x8006BD30; // type:function size:0x24 setView__13dCameraBase_cFRC7CamView = .text:0x8006BD60; // type:function size:0x44 -vt_0x2C__13dCameraBase_cFv = .text:0x8006BDB0; // type:function size:0xC -vt_0x28__13dCameraBase_cFv = .text:0x8006BDC0; // type:function size:0xC +deactivate__13dCameraBase_cFv = .text:0x8006BDB0; // type:function size:0xC +dactivate__13dCameraBase_cFv = .text:0x8006BDC0; // type:function size:0xC getView__13dCameraBase_cFv = .text:0x8006BDD0; // type:function size:0x8 __dt__7CamViewFv = .text:0x8006BDE0; // type:function size:0x40 __dt__17dCameraGame_HIO_cFv = .text:0x8006BE20; // type:function size:0x40 @@ -3226,7 +3226,7 @@ fn_80084060 = .text:0x80084060; // type:function size:0xBC fn_80084120 = .text:0x80084120; // type:function size:0x10A8 fn_800851D0 = .text:0x800851D0; // type:function size:0x49C fn_80085670 = .text:0x80085670; // type:function size:0x1414 -fn_80086A90 = .text:0x80086A90; // type:function size:0x30 +__ct__7CamViewFv = .text:0x80086A90; // type:function size:0x30 fn_80086AC0 = .text:0x80086AC0; // type:function size:0xC80 fn_80087740 = .text:0x80087740; // type:function size:0x8 fn_80087750 = .text:0x80087750; // type:function size:0x128 @@ -10544,7 +10544,7 @@ fn_80198D70 = .text:0x80198D70; // type:function size:0x14 StageManager__init2 = .text:0x80198D90; // type:function size:0x25C changeState__80sStateMgr_c<11dStageMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80198FF0; // type:function size:0x10 fn_80199000 = .text:0x80199000; // type:function size:0x110 -fn_80199110 = .text:0x80199110; // type:function size:0x8 +getCamera__11dStageMgr_cFl = .text:0x80199110; // type:function size:0x8 getScreen__11dStageMgr_cFl = .text:0x80199120; // type:function size:0x10 addObjId__11dStageMgr_cFUs = .text:0x80199130; // type:function size:0x8 addStageArcn__11dStageMgr_cFPCc = .text:0x80199140; // type:function size:0x8 @@ -10709,33 +10709,33 @@ create__9dCamera_cFv = .text:0x8019D480; // type:function size:0x248 debugWarn2__FPCce = .text:0x8019D6D0; // type:function size:0x50 debugPrintf7__FPCce = .text:0x8019D720; // type:function size:0x50 doDelete__9dCamera_cFv = .text:0x8019D770; // type:function size:0x78 -fn_8019D7F0 = .text:0x8019D7F0; // type:function size:0xA0 +setWorldOffset__9dCamera_cFff = .text:0x8019D7F0; // type:function size:0xA0 execute__9dCamera_cFv = .text:0x8019D890; // type:function size:0x2E8 fn_8019DB80__9dCamera_cFv = .text:0x8019DB80; // type:function size:0x158 -fn_8019DCE0__9dCamera_cFv = .text:0x8019DCE0; // type:function size:0x140 +updateView__9dCamera_cFv = .text:0x8019DCE0; // type:function size:0x140 draw__9dCamera_cFv = .text:0x8019DE20; // type:function size:0x3C isUnderwater__9dCamera_cCFv = .text:0x8019DE60; // type:function size:0xC -fn_8019DE70__9dCamera_cFv = .text:0x8019DE70; // type:function size:0x2A4 -fn_8019E120 = .text:0x8019E120; // type:function size:0xC4 +apply__9dCamera_cFv = .text:0x8019DE70; // type:function size:0x2A4 +setActiveCamera__9dCamera_cFl = .text:0x8019E120; // type:function size:0xC4 fn_8019E1F0__9dCamera_cFv = .text:0x8019E1F0; // type:function size:0x10 setFrustum__9dCamera_cFfff = .text:0x8019E200; // type:function size:0x18C -fn_8019E390 = .text:0x8019E390; // type:function size:0xC +getYAngle__9dCamera_cCFv = .text:0x8019E390; // type:function size:0xC getYRot__9dCamera_cCFv = .text:0x8019E3A0; // type:function size:0x8 -fn_8019E3B0__9dCamera_cCFv = .text:0x8019E3B0; // type:function size:0xC +getXZAngle__9dCamera_cCFv = .text:0x8019E3B0; // type:function size:0xC fn_8019E3C0 = .text:0x8019E3C0; // type:function size:0x44 fn_8019E410__9dCamera_cFv = .text:0x8019E410; // type:function size:0x1C fn_8019E430__9dCamera_cFv = .text:0x8019E430; // type:function size:0x18 -fn_8019E450 = .text:0x8019E450; // type:function size:0x7C +applyTilt__9dCamera_cFv = .text:0x8019E450; // type:function size:0x7C fn_8019E4D0 = .text:0x8019E4D0; // type:function size:0x5C updateUnderwaterDepth__9dCamera_cFRC7mVec3_c = .text:0x8019E530; // type:function size:0x130 isUnderwater___9dCamera_cCFv = .text:0x8019E660; // type:function size:0x8 getUnderwaterDepth__9dCamera_cCFv = .text:0x8019E670; // type:function size:0x8 -fn_8019E680 = .text:0x8019E680; // type:function size:0x1D8 -fn_8019E860 = .text:0x8019E860; // type:function size:0x1C +execute__Q29dCamera_c13screen_shakerFv = .text:0x8019E680; // type:function size:0x1D8 +getShakeOffset__Q29dCamera_c13screen_shakerCFv = .text:0x8019E860; // type:function size:0x1C setCamera__Q29dCamera_c11substruct_1FP9dCamera_c = .text:0x8019E880; // type:function size:0x8 fn_8019E890__Q29dCamera_c11substruct_1Fv = .text:0x8019E890; // type:function size:0x40 fn_8019E8D0__Q29dCamera_c11substruct_1FRC4mAng = .text:0x8019E8D0; // type:function size:0x54 -fn_8019E930__Q29dCamera_c11substruct_1Fv = .text:0x8019E930; // type:function size:0xC +fn_8019E930__Q29dCamera_c11substruct_1CFv = .text:0x8019E930; // type:function size:0xC fn_8019E940__Q29dCamera_c11substruct_1Fv = .text:0x8019E940; // type:function size:0xC0 fn_8019EA00__9dCamera_cFRC7mVec3_cRC7mVec3_cff = .text:0x8019EA00; // type:function size:0x70 fn_8019EA70__9dCamera_cFb = .text:0x8019EA70; // type:function size:0x11C @@ -17837,7 +17837,7 @@ XrotS__6mMtx_cFRC4mAng = .text:0x802F16B0; // type:function size:0xBC XrotM__6mMtx_cFRC4mAng = .text:0x802F1770; // type:function size:0x4C YrotS__6mMtx_cFRC4mAng = .text:0x802F17C0; // type:function size:0xBC YrotM__6mMtx_cFRC4mAng = .text:0x802F1880; // type:function size:0x4C -ZrotS__6mMtx_cF4mAng = .text:0x802F18D0; // type:function size:0xBC +ZrotS__6mMtx_cFRC4mAng = .text:0x802F18D0; // type:function size:0xBC ZrotM__6mMtx_cFRC4mAng = .text:0x802F1990; // type:function size:0x4C ZXYrotS__6mMtx_cFRC4mAngRC4mAngRC4mAng = .text:0x802F19E0; // type:function size:0x60 ZXYrotM__6mMtx_cFRC4mAngRC4mAngRC4mAng = .text:0x802F1A40; // type:function size:0x60 diff --git a/include/d/d_camera.h b/include/d/d_camera.h index d3c8aaf4..aa9424c2 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -6,6 +6,7 @@ #include "egg/gfx/eggCamera.h" #include "m/m_angle.h" #include "m/m_frustum.h" +#include "m/m_mtx.h" #include "m/m_vec.h" #include "toBeSorted/d_camera_base.h" #include "toBeSorted/d_camera_event.h" @@ -20,7 +21,7 @@ private: void setCamera(dCamera_c *cam); void fn_8019E890(); - mAng fn_8019E930(); + mAng fn_8019E930() const; void fn_8019E940(); private: @@ -32,6 +33,29 @@ private: /* 0x08 */ dCamera_c *mpCamera; }; + class screen_shaker { + public: + screen_shaker() {} + + void init(dCamera_c *cam) { + mpCamera = cam; + mScreenShakeIntensity = 0.0f; + mShakeOffset = mVec3_c::Zero; + } + + void setScreenShakeIntensity(f32 val) { + mScreenShakeIntensity = val; + } + + bool execute(); + mVec3_c getShakeOffset() const; + + private: + /* 0x00 */ dCamera_c *mpCamera; + /* 0x04 */ f32 mScreenShakeIntensity; + /* 0x08 */ mVec3_c mShakeOffset; + }; + enum CameraIdx_e { CAM_GAME_0, CAM_GAME_1, @@ -42,10 +66,10 @@ private: }; enum Flags_e { - CAM_FLAGS_0x40 = (1 << 6), - CAM_FLAGS_0x80 = (1 << 7), + CAM_FLAGS_UNDERWATER = (1 << 6), + CAM_FLAGS_IN_EVENT = (1 << 7), CAM_FLAGS_0x100 = (1 << 8), - CAM_FLAGS_0x200 = (1 << 9), + CAM_FLAGS_NO_LETTERBOX_IN_EVENT = (1 << 9), }; public: @@ -55,6 +79,7 @@ public: virtual int execute() override; virtual int draw() override; + void setWorldOffset(f32 x, f32 z); void setFrustum(f32 fov, f32 near, f32 far); dCameraGame_c *getGameCam1() { @@ -73,19 +98,22 @@ public: return static_cast(mpCameras[CAM_MAP]); } - const mVec3_c &getPositionMaybe() const { - return mView.field_0x00; + const mVec3_c &getPosition() const { + return mView.mPosition; } - const mVec3_c &getField_0x78() const { - return mView.field_0x0C; + + const mVec3_c &getTarget() const { + return mView.mTarget; } f32 getWaterHeight() const { return mWaterHeight; } + + // TODO what makes this different? mAng getYRot() const; void setScreenShakeIntensity(f32 val) { - mScreenShakeIntensity = val; + mScreenShaker.setScreenShakeIntensity(val); } UNKWORD getField_0xDA8() const { @@ -98,13 +126,18 @@ public: void fn_8019EA00(const mVec3_c &, const mVec3_c &, f32, f32); void fn_8019E430(); void fn_8019E410(); - mAng fn_8019E3B0() const; void fn_8019EA70(bool); + mAng getYAngle() const; + mAng getXZAngle() const; + void apply(); private: + void updateView(); + void applyTilt(); + + s32 setActiveCamera(s32 newCamIdx); + void fn_8019DB80(); - void fn_8019DCE0(); - void fn_8019DE70(); f32 fn_8019E1F0(); void updateUnderwaterDepth(const mVec3_c &pos); @@ -113,11 +146,13 @@ private: /* 0x068 */ s32 mMyCameraIndex; /* 0x06C */ CamView mView; /* 0x08C */ mVec3_c field_0x08C; - /* 0x098 */ mAng field_0x098; - /* 0x09A */ mAng field_0x09A; + /* 0x098 */ mAng mYAngle; + /* 0x09A */ mAng mXZAngle; /* 0x09C */ mFrustum_c mFrustum; + /* 0x18C */ mMtx_c mMtx; + /* 0x1BC */ mMtx_c mMtxInv; - /* 0x18C */ u8 _0x18C[0x1F8 - 0x18C]; + /* 0x1EC */ u8 field_0x1EC[0x1F8 - 0x1EC]; /* 0x1F8 */ UNKWORD field_0x1F8; /* 0x1FC */ u8 field_0x1FC; @@ -139,18 +174,16 @@ private: /* 0x2B4 */ dCameraGame_c mGameCam1; /* 0x728 */ dCameraGame_c mGameCam2; /* 0xB9C */ dCameraEvent_c mEventCam; - /* 0xCDC */ dCameraMap_c mMapCam; + /* 0xCD0 */ dCameraMap_c mMapCam; /* 0xD8C */ u8 _0xD8C[0xD94 - 0xD8C]; /* 0xD94 */ f32 field_0xD94; /* 0xD98 */ dCameraBase_c *mpCameras[CAM_MAX]; /* 0xDA8 */ s32 mActiveCameraIdx; - /* 0xDAC */ void *field_0xDAC; - /* 0xDB0 */ f32 mScreenShakeIntensity; - /* 0xDB4 */ mVec3_c field_0xDB4; + /* 0xDAC */ screen_shaker mScreenShaker; /* 0xDC0 */ substruct_1 field_0xDC0; - /* 0xDCC */ u8 field_0xDCC; + /* 0xDCC */ bool field_0xDCC; /* 0xDD0 */ CamView mView1; }; diff --git a/include/toBeSorted/d_camera_base.h b/include/toBeSorted/d_camera_base.h index b9faf8c1..1bf6eb69 100644 --- a/include/toBeSorted/d_camera_base.h +++ b/include/toBeSorted/d_camera_base.h @@ -4,16 +4,15 @@ #include "common.h" #include "m/m_vec.h" -// A basic description of a camera perspective, with -// position, target point, a field of view, and something else. +// A basic description of a camera perspective, simplified. struct CamView { - CamView() : field_0x00(0.0f, 0.0f, 0.0f), field_0x0C(0.0f, 0.0f, 1.0f), mFov(50.0f), field_0x1C(0.0f) {} + CamView() : mPosition(0.0f, 0.0f, 0.0f), mTarget(0.0f, 0.0f, 1.0f), mFov(50.0f), mTilt(0.0f) {} ~CamView() {} - /* 0x00 */ mVec3_c field_0x00; - /* 0x0C */ mVec3_c field_0x0C; + /* 0x00 */ mVec3_c mPosition; + /* 0x0C */ mVec3_c mTarget; /* 0x18 */ f32 mFov; - /* 0x1C */ f32 field_0x1C; + /* 0x1C */ f32 mTilt; }; // Abstract camera base class. The game camera class will hold various subclasses @@ -22,12 +21,12 @@ class dCameraBase_c { protected: /* 0x00 */ bool mCreated; /* 0x01 */ u8 field_0x01; - /* 0x02 */ u8 field_0x02; + /* 0x02 */ bool mIsActive; /* 0x04 */ s32 mIndex; /* 0x08 */ CamView mView; public: - dCameraBase_c() : mCreated(false), field_0x01(0), field_0x02(0), mIndex(-1) {} + dCameraBase_c() : mCreated(false), field_0x01(0), mIsActive(false), mIndex(-1) {} bool doCreate(s32 index); bool doRemove(); @@ -54,11 +53,11 @@ public: // TODO - const? return mView; } - /* vt 0x28 */ virtual void vt_0x28() { - field_0x02 = 1; + /* vt 0x28 */ virtual void activate() { + mIsActive = true; } - /* vt 0x2C */ virtual void vt_0x2C() { - field_0x02 = 0; + /* vt 0x2C */ virtual void deactivate() { + mIsActive = false; } /* vt 0x30 */ virtual void setView(const CamView &view) { // TODO - is this actually a base impl? diff --git a/include/toBeSorted/d_camera_game.h b/include/toBeSorted/d_camera_game.h index 28c83053..439f2811 100644 --- a/include/toBeSorted/d_camera_game.h +++ b/include/toBeSorted/d_camera_game.h @@ -158,6 +158,14 @@ public: void fn_80080960(s32, s32, s8, s32); + void onFlag(u32 flag) { + mFlags |= flag; + } + + void offFlag(u32 flag) { + mFlags &= ~flag; + } + private: static void cacheIdxes(); @@ -169,7 +177,7 @@ private: /* 0x02C */ dPolar field_0x02C; /* 0x038 */ CamView mView2; - /* 0x058 */ UNKWORD field_0x058; + /* 0x058 */ u32 mFlags; /* 0x05C */ UNKWORD field_0x05C; /* 0x060 */ CamId field_0x060; /* 0x068 */ s32 mCurrentTrendIdx; diff --git a/include/toBeSorted/d_camera_map.h b/include/toBeSorted/d_camera_map.h index 95bb3c69..1d71ec0e 100644 --- a/include/toBeSorted/d_camera_map.h +++ b/include/toBeSorted/d_camera_map.h @@ -30,8 +30,8 @@ private: /* 0x40 */ f32 field_0x40; /* 0x44 */ dAcObjBase_c *field_0x44; /* 0x48 */ CamView mView1; - /* 0x68 */ CamView mView2; - /* 0x88 */ CamView mView3; + /* 0x68 */ CamView mSourceView; + /* 0x88 */ CamView mTargetView; /* 0xA8 */ u8 _0xA8[0xAC - 0xA8]; /* 0xAC */ u8 field_0xAC; /* 0xAD */ u8 _0xAD[0xB4 - 0xAD]; 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 875845d1..718f1cca 100644 --- a/src/REL/d/a/b/d_a_b_lastboss.cpp +++ b/src/REL/d/a/b/d_a_b_lastboss.cpp @@ -3315,11 +3315,11 @@ void dAcBlastboss_c::executeLightningStrike() { } if (field_0x114C != 0) { - mtx.YrotS(cam->fn_8019E3B0()); + mtx.YrotS(cam->getXZAngle()); v.set(0.0f, 10.0f, 10000.0f); MTXMultVec(mtx, v, v); - v.x += cam->getPositionMaybe().x; - v.z += cam->getPositionMaybe().z; + v.x += cam->getPosition().x; + v.z += cam->getPosition().z; mtx.transS(v); v.set(0.7f, 0.7f, 0.7f); mThunderMdl.setScale(v); diff --git a/src/REL/d/a/e/d_a_e_sm.cpp b/src/REL/d/a/e/d_a_e_sm.cpp index 01fb52ae..195289f9 100644 --- a/src/REL/d/a/e/d_a_e_sm.cpp +++ b/src/REL/d/a/e/d_a_e_sm.cpp @@ -1436,7 +1436,7 @@ void dAcEsm_c::fn_187_6C20(bool param0) { if (!param0) { dCamera_c *cam = dScGame_c::getCamera(0); - mAngle.y = cLib::targetAngleY(cam->getPositionMaybe(), cam->getField_0x78()); + mAngle.y = cLib::targetAngleY(cam->getPosition(), cam->getTarget()); mAngle.y += cM::rndFX(16384.f); } diff --git a/src/REL/d/t/d_t_spore.cpp b/src/REL/d/t/d_t_spore.cpp index ec83f095..a81c8b13 100644 --- a/src/REL/d/t/d_t_spore.cpp +++ b/src/REL/d/t/d_t_spore.cpp @@ -76,8 +76,8 @@ void dSporeProc_c::execute() { mVec3_c camPos; mVec3_c camTowards; - camPos = pCam->getPositionMaybe(); - camTowards = pCam->getField_0x78() - camPos; + camPos = pCam->getPosition(); + camTowards = pCam->getTarget() - camPos; if (pCam != nullptr && camTowards.normalizeRS()) { mVec3_c v; @@ -212,7 +212,7 @@ void dSporeProc_c::drawXlu() { ); dCamera_c *pCam = dScGame_c::getCamera(); - mVec3_c pos = pCam->getPositionMaybe(); + mVec3_c pos = pCam->getPosition(); if (dTgSiren_c::isOutOfTime()) { color0.r = 0xFF; diff --git a/src/REL/d/t/d_t_tumble_weed.cpp b/src/REL/d/t/d_t_tumble_weed.cpp index 48525354..8ef40a77 100644 --- a/src/REL/d/t/d_t_tumble_weed.cpp +++ b/src/REL/d/t/d_t_tumble_weed.cpp @@ -119,7 +119,7 @@ void dTgTumbleWeed_c::doSpawnTumbleweed() { pos.rotY(angle); pos *= 600.f; - pos += pCam->getPositionMaybe(); + pos += pCam->getPosition(); if (dBgS_ObjGndChk::CheckPos(pos + mVec3_c::Ey * 100.f)) { pos.y = dBgS_ObjGndChk::GetGroundHeight() + 10.f; diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index baebce3d..d8f8e5ef 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -1,18 +1,25 @@ #include "d/d_camera.h" +#include "c/c_math.h" #include "common.h" #include "d/a/d_a_player.h" #include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/bg/d_bg_s_lin_chk.h" #include "d/col/bg/d_bg_s_roof_chk.h" #include "d/d_gfx.h" #include "d/d_pad.h" #include "d/d_sc_game.h" #include "d/d_stage_mgr.h" +#include "d/snd/d_snd_3d_manager.h" #include "egg/gfx/eggFrustum.h" +#include "egg/math/eggMatrix.h" #include "f/f_base.h" #include "f/f_profile.h" +#include "m/m_angle.h" #include "m/m_mtx.h" #include "m/m_vec.h" +#include "nw4r/g3d/g3d_camera.h" +#include "toBeSorted/d_camera_base.h" #include "toBeSorted/d_camera_math.h" #include "toBeSorted/event_manager.h" @@ -63,15 +70,13 @@ void debugPrintf7(const char *fmt, ...); dCamera_c::dCamera_c() : mMyCameraIndex(0), mpScreen(dStageMgr_c::GetInstance()->getScreen(0)), - field_0x098(0), - field_0x09A(0), + mYAngle(0), + mXZAngle(0), field_0xD94(0.0f), field_0x1F8(0), field_0x1FC(0), mFlags(0) { - field_0xDAC = this; - mScreenShakeIntensity = 0.0f; - field_0xDB4.set(mVec3_c::Zero.x, mVec3_c::Zero.y, mVec3_c::Zero.z); + mScreenShaker.init(this); field_0xDC0.setCamera(this); field_0x08C = mVec3_c(0.0f, 1.0f, 0.0f); @@ -102,11 +107,11 @@ int dCamera_c::create() { debugWarn2("u can NOT use debug camera!!"); // aww mActiveCameraIdx = 0; - mpCameras[0]->vt_0x28(); + mpCameras[0]->activate(); mLetterboxAmount = fn_8019E1F0(); field_0x290 = 1.0f; - mFlags |= CAM_FLAGS_0x80; + mFlags |= CAM_FLAGS_IN_EVENT; // TODO maybe struct + inline mGlobalAlpha = 1.0f; @@ -117,13 +122,13 @@ int dCamera_c::create() { mView1 = mpCameras[mActiveCameraIdx]->getView(); - field_0xDCC = 0; - field_0x098 = 0; - field_0x09A = 0; + field_0xDCC = false; + mYAngle = 0; + mXZAngle = 0; dScGame_c::setCamera(mMyCameraIndex, this); - fn_8019DCE0(); - fn_8019DE70(); + updateView(); + apply(); const STIF *stif = dStageMgr_c::GetInstance()->getStif(); if (stif != nullptr) { @@ -135,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 |= 0x200; + mFlags |= CAM_FLAGS_NO_LETTERBOX_IN_EVENT; dScGame_c::GetInstance()->setTargetingScreenLetterboxAmount(0.0f); } @@ -163,6 +168,19 @@ int dCamera_c::doDelete() { return SUCCEEDED; } +void dCamera_c::setWorldOffset(f32 x, f32 z) { + mView.mPosition.x += x; + mView.mPosition.z += z; + mView.mTarget.x += x; + mView.mTarget.z += z; + // TODO maybe inline + getGameCam1()->setView(mView); + getGameCam1()->onFlag(0x1); + getGameCam1()->onFlag(0x4000); + updateView(); + apply(); +} + int dCamera_c::execute() { dAcPy_c *link = dAcPy_c::GetLinkM(); @@ -179,16 +197,16 @@ int dCamera_c::execute() { static_cast(mpCameras[0])->clearCamIds(); } - fn_8019DCE0(); - fn_8019DE70(); + updateView(); + apply(); field_0xDC0.fn_8019E940(); - field_0xDCC = 0; + field_0xDCC = false; if (mActiveCameraIdx == CAM_EVENT) { - mFlags |= CAM_FLAGS_0x80; + mFlags |= CAM_FLAGS_IN_EVENT; } - if ((mFlags & (CAM_FLAGS_0x100 | CAM_FLAGS_0x80)) != 0) { + if ((mFlags & (CAM_FLAGS_0x100 | CAM_FLAGS_IN_EVENT)) != 0) { field_0x290 += (1.0f / sHio.field_0x24); if (field_0x290 > 1.0f) { field_0x290 = 1.0f; @@ -200,16 +218,16 @@ int dCamera_c::execute() { } } - f32 scale = (mFlags & CAM_FLAGS_0x80) != 0 ? fn_8019E1F0() : sHio.field_0x20; + f32 scale = (mFlags & CAM_FLAGS_IN_EVENT) != 0 ? fn_8019E1F0() : sHio.field_0x20; f32 target = camEaseInOut(field_0x290, 1.0f); mLetterboxAmount += (target * scale - mLetterboxAmount) * 0.5f; - if (mActiveCameraIdx == CAM_EVENT && (mFlags & CAM_FLAGS_0x200) != 0) { + if (mActiveCameraIdx == CAM_EVENT && (mFlags & CAM_FLAGS_NO_LETTERBOX_IN_EVENT) != 0) { mLetterboxAmount = 0.0f; } dScGame_c::GetInstance()->setTargetingScreenLetterboxAmount(mLetterboxAmount); - mFlags &= ~(CAM_FLAGS_0x100 | CAM_FLAGS_0x80); + mFlags &= ~(CAM_FLAGS_0x100 | CAM_FLAGS_IN_EVENT); if (!link->checkActionFlagsCont(0x400000)) { field_0x299 = 0; @@ -238,6 +256,19 @@ int dCamera_c::execute() { return SUCCEEDED; } +void dCamera_c::updateView() { + if (field_0xDCC) { + mView = mView1; + field_0xDCC = 0; + } else { + mView = mpCameras[mActiveCameraIdx]->getView(); + } + + mVec3_c dir = mView.mTarget - mView.mPosition; + mYAngle = cM::atan2s(dir.y, dir.absXZ()); + mXZAngle = cM::atan2s(dir.x, dir.z); +} + int dCamera_c::draw() { if (mpCameras[mActiveCameraIdx] != nullptr) { mpCameras[mActiveCameraIdx]->doDraw(); @@ -246,7 +277,60 @@ int dCamera_c::draw() { } bool dCamera_c::isUnderwater() const { - return mFlags & CAM_FLAGS_0x40; + return mFlags & CAM_FLAGS_UNDERWATER; +} + +void dCamera_c::apply() { + updateUnderwaterDepth(mView.mPosition); + if (isUnderwater_()) { + mFlags |= CAM_FLAGS_UNDERWATER; + } else { + mFlags &= ~CAM_FLAGS_UNDERWATER; + } + + if (mScreenShaker.execute()) { + mView.mPosition += mScreenShaker.getShakeOffset(); + mView.mTarget += mScreenShaker.getShakeOffset(); + } + + mLookAtCamera.mPos = mView.mPosition; + mLookAtCamera.mAt = mView.mTarget; + if (mLookAtCamera.mAt.x == mLookAtCamera.mPos.x && mLookAtCamera.mAt.z == mLookAtCamera.mPos.z) { + mLookAtCamera.mPos.z += 1.0f; + } + mLookAtCamera.mUp = mVec3_c::Ey; + mLookAtCamera.doUpdateMatrix(); + mMtx.copyFrom(mLookAtCamera.getViewMatrix()); + // TODO: Maybe mutating mtx wasn't intended here but it's probably unproblematic + mMtx.inverse(); + mMtxInv = mMtx; + mMtxInv.m[0][3] = 0.0f; + mMtxInv.m[1][3] = 0.0f; + mMtxInv.m[2][3] = 0.0f; + + dSnd3DManager_c::GetInstance()->updateFromCamera(mLookAtCamera); + applyTilt(); + setFrustum(mView.mFov, sHio.field_0x04, sHio.field_0x08); + nw4r::g3d::Camera cam = dStageMgr_c::GetInstance()->getCamera(mMyCameraIndex); + mpScreen->CopyToG3D(cam); + mLookAtCamera.setG3DCamera(cam); +} + +s32 dCamera_c::setActiveCamera(s32 newCamIdx) { + if (mpCameras[newCamIdx] == nullptr) { + return mActiveCameraIdx; + } else if (mActiveCameraIdx == newCamIdx) { + return newCamIdx; + } else { + for (int i = 0; i < CAM_MAX; i++) { + mpCameras[i]->deactivate(); + } + mpCameras[newCamIdx]->activate(); + debugPrintf7("unit %d -> %d", mActiveCameraIdx, newCamIdx); + mActiveCameraIdx = newCamIdx; + return newCamIdx; + } + } void dCamera_c::setFrustum(f32 fov, f32 near, f32 far) { @@ -278,6 +362,25 @@ void dCamera_c::setFrustum(f32 fov, f32 near, f32 far) { mFrustum.set(fov, mpScreen->GetAspect(), near, far, mtx); } +mAng dCamera_c::getYAngle() const { + return mYAngle; +} + +mAng dCamera_c::getYRot() const { + return field_0xDC0.fn_8019E930(); +} + +mAng dCamera_c::getXZAngle() const { + return mXZAngle; +} + +void dCamera_c::applyTilt() { + EGG::Matrix34f &mtx = mLookAtCamera.getViewMatrix(); + mMtx_c rotMtx; + rotMtx.ZrotS(mAng::fromDeg(-mView.mTilt)); + MTXConcat(rotMtx, mtx.m, mtx.m); +} + void dCamera_c::updateUnderwaterDepth(const mVec3_c &pos) { mVec3_c chkPos = pos; dBgS_RoofChk roofChk; @@ -318,12 +421,54 @@ f32 dCamera_c::getUnderwaterDepth() const { return mUnderwaterDepth; } +bool dCamera_c::screen_shaker::execute() { + mShakeOffset = mVec3_c::Zero; + bool ret = false; + if (mScreenShakeIntensity > 0.001f) { + static s32 upOrDown = 0; + upOrDown = upOrDown ^ 1; + + f32 f; + if (upOrDown) { + f = 400.0f; + } else { + f = -400.0f; + } + + mVec3_c shakeOffset(cM::rndFX(100.0f), cM::rndF(f), 0.0f); + shakeOffset.normalize(); + // Note: the difference in coordinates here is due to the camera view using a different + // coordinate convention than game code. + shakeOffset.rotX(mpCamera->getYAngle()); + shakeOffset.rotY(mpCamera->getXZAngle()); + + mVec3_c chckVector = shakeOffset * (mScreenShakeIntensity + 5.0f); + shakeOffset *= mScreenShakeIntensity; + mVec3_c pos = mpCamera->getPosition(); + mVec3_c dest = pos + chckVector; + + dBgS_CamLinChk chk; + chk.Set(&pos, &dest, nullptr); + + if (!dBgS::GetInstance()->LineCross(&chk)) { + mShakeOffset = shakeOffset; + ret = true; + } + } + mScreenShakeIntensity = 0.0f; + return ret; +} + +mVec3_c dCamera_c::screen_shaker::getShakeOffset() const { + return mShakeOffset; +} + void dCamera_c::substruct_1::setCamera(dCamera_c *cam) { mpCamera = cam; } void dCamera_c::substruct_1::fn_8019E890() { - fn_8019E8D0(mpCamera->fn_8019E3B0()); + fn_8019E8D0(mpCamera->getXZAngle()); } void dCamera_c::substruct_1::fn_8019E8D0(const mAng &ang) { @@ -334,7 +479,7 @@ void dCamera_c::substruct_1::fn_8019E8D0(const mAng &ang) { } } -mAng dCamera_c::substruct_1::fn_8019E930() { +mAng dCamera_c::substruct_1::fn_8019E930() const { return field_0x04; } @@ -348,7 +493,25 @@ void dCamera_c::substruct_1::fn_8019E940() { } if (!mActive) { - field_0x04 = mpCamera->fn_8019E3B0(); + field_0x04 = mpCamera->getXZAngle(); mFSStickAngle = dPad::getFSStickAngle(); } } + +bool dCamera_c::fn_8019EA70(bool b) { + CamView view = getEventCam()->getView(); + mVec3_c dest; + + dest = camGetPointOnLine(view.mTarget, view.mPosition, dAcPy_c::GetLinkM()->mPositionCopy3); + view.mTarget = dest; + // TODO maybe inline + getGameCam1()->setView(view); + getGameCam1()->onFlag(0x1); + if (b) { + getGameCam1()->onFlag(0x4000); + } else { + getGameCam1()->offFlag(0x200); + } + + return true; +} diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 6c953b62..fcaddb3a 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -3183,7 +3183,7 @@ void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) { mMarkers.setLinkRot(link->getRotation()); // TODO - mAng nonsense? - field_0x8D68 = dScGame_c::getCamera(0)->fn_8019E3B0(); + field_0x8D68 = dScGame_c::getCamera(0)->getXZAngle(); mpAllPane->SetVisible(false); getGlobal()->setField_0x55(field_0x8CAE); mDoCameraTransition = false; diff --git a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp index 4ffb7d9a..6a2bb9ee 100644 --- a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp +++ b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp @@ -436,7 +436,7 @@ bool dLytMeterGanbariGauge_c::execute() { } } - mVec3_c diff = dAcPy_c::GetLink()->mPositionCopy3 - dScGame_c::getCamera(0)->getPositionMaybe(); + mVec3_c diff = dAcPy_c::GetLink()->mPositionCopy3 - dScGame_c::getCamera(0)->getPosition(); f32 len = diff.mag(); mVec3_c v; d3d::worldToScreen(v, dAcPy_c::GetLink()->mPositionCopy3); diff --git a/src/toBeSorted/d_camera_base.cpp b/src/toBeSorted/d_camera_base.cpp index f079e77d..d8c163d9 100644 --- a/src/toBeSorted/d_camera_base.cpp +++ b/src/toBeSorted/d_camera_base.cpp @@ -27,13 +27,13 @@ bool dCameraBase_c::doRemove() { } bool dCameraBase_c::doExecute() { - if (field_0x02 && !field_0x01) { + if (mIsActie && !field_0x01) { vt_0x08(); - } else if (!field_0x02 && field_0x01) { + } else if (!mIsActie && field_0x01) { vt_0x0C(); } - field_0x01 = field_0x02; - if (!field_0x02) { + field_0x01 = mIsActie; + if (!mIsActie) { return false; } else { return execute(); diff --git a/src/toBeSorted/d_camera_game.cpp b/src/toBeSorted/d_camera_game.cpp index 0434c4e8..23a43e05 100644 --- a/src/toBeSorted/d_camera_game.cpp +++ b/src/toBeSorted/d_camera_game.cpp @@ -276,7 +276,7 @@ void UnkCamChecks::fn_8007E1B0(dAcObjBase_c *ac) { } dCameraGame_c::dCameraGame_c() - : field_0x058(0), + : mFlags(0), field_0x05C(0), mCurrentTrendIdx(-1), field_0x06C(0), @@ -321,7 +321,7 @@ bool dCameraGame_c::create() { field_0x0AC = 0.0f; field_0x0B0 = 0.0f; - field_0x058 = 0xA00; + mFlags = 0xA00; field_0x07C = 0; field_0x096 = 0; field_0x078 = 0; @@ -332,17 +332,17 @@ bool dCameraGame_c::create() { field_0x22C = 32; field_0x230 = 45; - mView.field_0x0C = field_0x098->mPosition; - mView.field_0x0C.y += 150.0f; + mView.mTarget = field_0x098->mPosition; + mView.mTarget.y += 150.0f; field_0x02C.Set(320.0f, 15.0f, mAng::s2d_c(field_0x098->mRotation.y) + 180.0f); - const mVec3_c &v = mView.field_0x0C; // needed to avoid double load... TODO maybe inline? - mView.field_0x00 = v + field_0x02C.toCartesian(); + const mVec3_c &v = mView.mTarget; // needed to avoid double load... TODO maybe inline? + mView.mPosition = v + field_0x02C.toCartesian(); mView.mFov = 60.0f; mView2 = mView; field_0x264 = v.y; - field_0x268 = mView.field_0x00.y; + field_0x268 = mView.mPosition.y; GROOSENATOR_REF = nullptr; lbl_80575364 = nullptr; @@ -414,7 +414,7 @@ bool dCameraGame_c::isCurrentTrend(const char *name) const { void dCameraGame_c::setView(const CamView &view) { mView2 = view; mView = view; - mVec3_c diff = view.field_0x00 - view.field_0x0C; + mVec3_c diff = view.mPosition - view.mTarget; field_0x02C.setCartesian(diff); field_0x078 = 0; } diff --git a/src/toBeSorted/d_camera_map.cpp b/src/toBeSorted/d_camera_map.cpp index 97089a50..81e80eec 100644 --- a/src/toBeSorted/d_camera_map.cpp +++ b/src/toBeSorted/d_camera_map.cpp @@ -96,22 +96,22 @@ bool dCameraMap_c::execute() { field_0x40 = 1.0f; if (sHio.field_0x3C & 0x8) { - mView3 = mView2; + mTargetView = mSourceView; } dBgS_CamLinChk chk; - chk.Set(&mView2.field_0x00, &mView3.field_0x00, (dAcObjBase_c *)nullptr); + chk.Set(&mSourceView.mPosition, &mTargetView.mPosition, (dAcObjBase_c *)nullptr); if (dBgS::GetInstance()->LineCross(&chk)) { - mView3 = mView2; + mTargetView = mSourceView; } if (sHio.field_0x3C & 0x10) { if (sHio.field_0x3E == 1) { - dPolar polar(mView2.field_0x00 - mView2.field_0x0C); + dPolar polar(mSourceView.mPosition - mSourceView.mTarget); polar.V.Set(0.0f); - mView2.field_0x00 = mView2.field_0x0C + polar.toCartesian(); + mSourceView.mPosition = mSourceView.mTarget + polar.toCartesian(); } - mView3 = mView2; + mTargetView = mSourceView; field_0xB8 = 1; } @@ -132,16 +132,16 @@ bool dCameraMap_c::execute() { f32 f5 = camEaseInOut(f, sHio.field_0x2C); f32 f6 = camEaseInOut(f, sHio.field_0x30); f32 f8 = f5 * 0.99f; - f32 f7 = camEaseInOut(f, sHio.field_0x34); + f32 tiltFovInterp = camEaseInOut(f, sHio.field_0x34); - mView.field_0x0C = mView2.field_0x0C + (mView3.field_0x0C - mView2.field_0x0C) * f5; - mView.field_0x00.x = mView2.field_0x00.x + (mView3.field_0x00.x - mView2.field_0x00.x) * f8; - mView.field_0x00.y = mView2.field_0x00.y + (mView3.field_0x00.y - mView2.field_0x00.y) * f6; - mView.field_0x00.z = mView2.field_0x00.z + (mView3.field_0x00.z - mView2.field_0x00.z) * f8; + mView.mTarget = mSourceView.mTarget + (mTargetView.mTarget - mSourceView.mTarget) * f5; + mView.mPosition.x = mSourceView.mPosition.x + (mTargetView.mPosition.x - mSourceView.mPosition.x) * f8; + mView.mPosition.y = mSourceView.mPosition.y + (mTargetView.mPosition.y - mSourceView.mPosition.y) * f6; + mView.mPosition.z = mSourceView.mPosition.z + (mTargetView.mPosition.z - mSourceView.mPosition.z) * f8; - mView.field_0x00 = fn_800929C0(mView.field_0x0C, mView.field_0x00, field_0x44); - mView.mFov = mView2.mFov + (mView3.mFov - mView2.mFov) * f7; - mView.field_0x1C = mView2.field_0x1C + (mView3.field_0x1C - mView2.field_0x1C) * f7; + mView.mPosition = fn_800929C0(mView.mTarget, mView.mPosition, field_0x44); + mView.mFov = mSourceView.mFov + (mTargetView.mFov - mSourceView.mFov) * tiltFovInterp; + mView.mTilt = mSourceView.mTilt + (mTargetView.mTilt - mSourceView.mTilt) * tiltFovInterp; return true; } From ac48f9877b3918e2c41557fad76c37563678643e Mon Sep 17 00:00:00 2001 From: robojumper Date: Tue, 6 Jan 2026 21:05:51 +0100 Subject: [PATCH 5/8] d_camera OK --- config/SOUE01/symbols.txt | 94 +++++++++++++-------------- configure.py | 2 +- include/d/d_camera.h | 28 +++++++- include/toBeSorted/d_camera_base.h | 9 +-- include/toBeSorted/d_camera_event.h | 4 +- include/toBeSorted/d_camera_game.h | 14 +++- include/toBeSorted/d_camera_map.h | 6 +- src/REL/d/a/b/d_a_b_lastboss.cpp | 2 +- src/d/d_camera.cpp | 99 +++++++++++++++++++++++++---- src/d/lyt/d_lyt_map.cpp | 6 +- src/toBeSorted/d_camera_base.cpp | 16 ++--- src/toBeSorted/d_camera_game.cpp | 8 +-- 12 files changed, 198 insertions(+), 90 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index dd0d2ae4..c37f4213 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3066,11 +3066,11 @@ entry__16dEnemySwordMdl_cFP12dAcObjBase_cP15dShadowCircle_cP7mQuat_c = .text:0x8 doCreate__13dCameraBase_cFl = .text:0x8006BBE0; // type:function size:0x70 doRemove__13dCameraBase_cFv = .text:0x8006BC50; // type:function size:0x18 doExecute__13dCameraBase_cFv = .text:0x8006BC70; // type:function size:0xA8 -vt_0x0C__13dCameraBase_cFv = .text:0x8006BD20; // type:function size:0x4 +onBecomeActive__13dCameraBase_cFv = .text:0x8006BD20; // type:function size:0x4 doDraw__13dCameraBase_cFv = .text:0x8006BD30; // type:function size:0x24 setView__13dCameraBase_cFRC7CamView = .text:0x8006BD60; // type:function size:0x44 deactivate__13dCameraBase_cFv = .text:0x8006BDB0; // type:function size:0xC -dactivate__13dCameraBase_cFv = .text:0x8006BDC0; // type:function size:0xC +activate__13dCameraBase_cFv = .text:0x8006BDC0; // type:function size:0xC getView__13dCameraBase_cFv = .text:0x8006BDD0; // type:function size:0x8 __dt__7CamViewFv = .text:0x8006BDE0; // type:function size:0x40 __dt__17dCameraGame_HIO_cFv = .text:0x8006BE20; // type:function size:0x40 @@ -3179,7 +3179,7 @@ doModeChange = .text:0x80081E90; // type:function size:0xEC doStyleChange = .text:0x80081F80; // type:function size:0x58 isCurrentTrend__13dCameraGame_cCFPCc = .text:0x80081FE0; // type:function size:0x40 setView__13dCameraGame_cFRC7CamView = .text:0x80082020; // type:function size:0xB4 -vt_0x08__13dCameraGame_cFv = .text:0x800820E0; // type:function size:0xC8 +onBecomeActive__13dCameraGame_cFv = .text:0x800820E0; // type:function size:0xC8 fn_800821B0 = .text:0x800821B0; // type:function size:0xC0 fn_80082270 = .text:0x80082270; // type:function size:0x44 fn_800822C0 = .text:0x800822C0; // type:function size:0x10 @@ -3314,8 +3314,8 @@ fn_80092E80 = .text:0x80092E80; // type:function size:0x8 execute__12dCameraMap_cFv = .text:0x80092E90; // type:function size:0x430 fn_800932C0 = .text:0x800932C0; // type:function size:0x8 fn_800932D0 = .text:0x800932D0; // type:function size:0x8 -fn_800932E0 = .text:0x800932E0; // type:function size:0x8 -fn_800932F0 = .text:0x800932F0; // type:function size:0x4C +fn_800932E0__12dCameraMap_cCFv = .text:0x800932E0; // type:function size:0x8 +fn_800932F0__12dCameraMap_cFv = .text:0x800932F0; // type:function size:0x4C fn_80093340__12dCameraMap_cFv = .text:0x80093340; // type:function size:0x14 fn_80093360__12dCameraMap_cFv = .text:0x80093360; // type:function size:0x18 fn_80093380__12dCameraMap_cFv = .text:0x80093380; // type:function size:0x18 @@ -10711,22 +10711,22 @@ debugPrintf7__FPCce = .text:0x8019D720; // type:function size:0x50 doDelete__9dCamera_cFv = .text:0x8019D770; // type:function size:0x78 setWorldOffset__9dCamera_cFff = .text:0x8019D7F0; // type:function size:0xA0 execute__9dCamera_cFv = .text:0x8019D890; // type:function size:0x2E8 -fn_8019DB80__9dCamera_cFv = .text:0x8019DB80; // type:function size:0x158 +checkCameraChange__9dCamera_cFv = .text:0x8019DB80; // type:function size:0x158 updateView__9dCamera_cFv = .text:0x8019DCE0; // type:function size:0x140 draw__9dCamera_cFv = .text:0x8019DE20; // type:function size:0x3C isUnderwater__9dCamera_cCFv = .text:0x8019DE60; // type:function size:0xC apply__9dCamera_cFv = .text:0x8019DE70; // type:function size:0x2A4 setActiveCamera__9dCamera_cFl = .text:0x8019E120; // type:function size:0xC4 -fn_8019E1F0__9dCamera_cFv = .text:0x8019E1F0; // type:function size:0x10 +getEventLetterboxAmount__9dCamera_cFv = .text:0x8019E1F0; // type:function size:0x10 setFrustum__9dCamera_cFfff = .text:0x8019E200; // type:function size:0x18C getYAngle__9dCamera_cCFv = .text:0x8019E390; // type:function size:0xC getYRot__9dCamera_cCFv = .text:0x8019E3A0; // type:function size:0x8 getXZAngle__9dCamera_cCFv = .text:0x8019E3B0; // type:function size:0xC -fn_8019E3C0 = .text:0x8019E3C0; // type:function size:0x44 -fn_8019E410__9dCamera_cFv = .text:0x8019E410; // type:function size:0x1C -fn_8019E430__9dCamera_cFv = .text:0x8019E430; // type:function size:0x18 +fn_8019E3C0__9dCamera_cCFv = .text:0x8019E3C0; // type:function size:0x44 +enterMap__9dCamera_cFv = .text:0x8019E410; // type:function size:0x1C +leaveMap__9dCamera_cFv = .text:0x8019E430; // type:function size:0x18 applyTilt__9dCamera_cFv = .text:0x8019E450; // type:function size:0x7C -fn_8019E4D0 = .text:0x8019E4D0; // type:function size:0x5C +fn_8019E4D0__9dCamera_cCFv = .text:0x8019E4D0; // type:function size:0x5C updateUnderwaterDepth__9dCamera_cFRC7mVec3_c = .text:0x8019E530; // type:function size:0x130 isUnderwater___9dCamera_cCFv = .text:0x8019E660; // type:function size:0x8 getUnderwaterDepth__9dCamera_cCFv = .text:0x8019E670; // type:function size:0x8 @@ -10737,11 +10737,11 @@ fn_8019E890__Q29dCamera_c11substruct_1Fv = .text:0x8019E890; // type:function si fn_8019E8D0__Q29dCamera_c11substruct_1FRC4mAng = .text:0x8019E8D0; // type:function size:0x54 fn_8019E930__Q29dCamera_c11substruct_1CFv = .text:0x8019E930; // type:function size:0xC fn_8019E940__Q29dCamera_c11substruct_1Fv = .text:0x8019E940; // type:function size:0xC0 -fn_8019EA00__9dCamera_cFRC7mVec3_cRC7mVec3_cff = .text:0x8019EA00; // type:function size:0x70 +setEventCamView__9dCamera_cFRC7mVec3_cRC7mVec3_cff = .text:0x8019EA00; // type:function size:0x70 fn_8019EA70__9dCamera_cFb = .text:0x8019EA70; // type:function size:0x11C -fn_8019EB90 = .text:0x8019EB90; // type:function size:0xC -__dt__9dCamera_cFv = .text:0x8019EBA0; // type:function size:0x160 -__sinit_\d_camera_cpp = .text:0x8019ED00; // type:function size:0xC +fn_8019EB90__9dCamera_cFv = .text:0x8019EB90; // type:function size:0xC +__dt__9dCamera_cFv = .text:0x8019EBA0; // type:function size:0x160 scope:weak +__sinit_\d_camera_cpp = .text:0x8019ED00; // type:function size:0xC scope:local GetInstance__11dObjLight_cFv = .text:0x8019ED10; // type:function size:0x8 ObjLight__ctor = .text:0x8019ED20; // type:function size:0x30 spawnLightObject = .text:0x8019ED50; // type:function size:0x40 @@ -35626,12 +35626,12 @@ lbl_8052C0F0 = .data:0x8052C0F0; // type:object size:0x38 g_profile_LAST = .data:0x8052C128; // type:object size:0xC AcLast__vtable = .data:0x8052C134; // type:object size:0x4C g_profile_CAMERA = .data:0x8052C180; // type:object size:0xC -lbl_8052C18C = .data:0x8052C18C; // type:object size:0x1D data:string -lbl_8052C1AC = .data:0x8052C1AC; // type:object size:0xC data:string -lbl_8052C1B8 = .data:0x8052C1B8; // type:object size:0x9 data:string -lbl_8052C1C4 = .data:0x8052C1C4; // type:object size:0xE data:string -lbl_8052C1D4 = .data:0x8052C1D4; // type:object size:0xC -__vt__9dCamera_c = .data:0x8052C1E0; // type:object size:0x50 +@28488 = .data:0x8052C18C; // type:object size:0x1D scope:local data:string +@28490 = .data:0x8052C1AC; // type:object size:0xC scope:local data:string +@28503 = .data:0x8052C1B8; // type:object size:0x9 scope:local data:string +@28766 = .data:0x8052C1C4; // type:object size:0xE scope:local data:string +__vt__13dCamera_HIO_c = .data:0x8052C1D4; // type:object size:0xC +__vt__9dCamera_c = .data:0x8052C1E0; // type:object size:0x4C g_profile_LIGHT_OBJECT = .data:0x8052C230; // type:object size:0xC jumptable_8052C23C = .data:0x8052C23C; // type:object size:0x2C scope:local jumptable_8052C268 = .data:0x8052C268; // type:object size:0x24 scope:local @@ -40712,10 +40712,10 @@ lbl_80572E84 = .sdata:0x80572E84; // type:object size:0x5 data:string lbl_80572E8C = .sdata:0x80572E8C; // type:object size:0x5 data:string lbl_80572E94 = .sdata:0x80572E94; // type:object size:0x7 data:string lbl_80572E9C = .sdata:0x80572E9C; // type:object size:0x4 -lbl_80572EA0 = .sdata:0x80572EA0; // type:object size:0x4 data:4byte -lbl_80572EA4 = .sdata:0x80572EA4; // type:object size:0x4 data:4byte -lbl_80572EA8 = .sdata:0x80572EA8; // type:object size:0x5 data:string -lbl_80572EB0 = .sdata:0x80572EB0; // type:object size:0x8 data:string +@26678 = .sdata:0x80572EA0; // type:object size:0x4 scope:local data:4byte +@26679 = .sdata:0x80572EA4; // type:object size:0x4 scope:local data:4byte +@28489 = .sdata:0x80572EA8; // type:object size:0x5 scope:local data:string +@28606 = .sdata:0x80572EB0; // type:object size:0x8 scope:local data:string lbl_80572EB8 = .sdata:0x80572EB8; // type:object size:0x5 data:string lbl_80572EC0 = .sdata:0x80572EC0; // type:object size:0x5 data:string lbl_80572EC8 = .sdata:0x80572EC8; // type:object size:0x6 data:string @@ -42401,7 +42401,7 @@ lbl_805756FE = .sbss:0x805756FE; // type:object size:0x1 data:byte lbl_805756FF = .sbss:0x805756FF; // type:object size:0x1 data:byte lbl_80575700 = .sbss:0x80575700; // type:object size:0x4 data:4byte lbl_80575704 = .sbss:0x80575704; // type:object size:0x4 data:4byte -lbl_80575708 = .sbss:0x80575708; // type:object size:0x8 data:4byte +@LOCAL@execute__Q29dCamera_c13screen_shakerFv@upOrDown = .sbss:0x80575708; // type:object size:0x4 scope:local data:4byte LIGHT_OBJECT = .sbss:0x80575710; // type:object size:0x4 data:4byte lbl_80575714 = .sbss:0x80575714; // type:object size:0x1 data:byte lbl_80575715 = .sbss:0x80575715; // type:object size:0x1 data:byte @@ -47131,26 +47131,26 @@ lbl_8057AF3C = .sdata2:0x8057AF3C; // type:object size:0x4 align:4 data:float lbl_8057AF40 = .sdata2:0x8057AF40; // type:object size:0x4 align:4 data:float lbl_8057AF44 = .sdata2:0x8057AF44; // type:object size:0x4 align:4 data:float lbl_8057AF48 = .sdata2:0x8057AF48; // type:object size:0x4 align:4 data:float -lbl_8057AF50 = .sdata2:0x8057AF50; // type:object size:0x4 align:4 data:float -lbl_8057AF54 = .sdata2:0x8057AF54; // type:object size:0x4 align:4 data:float -lbl_8057AF58 = .sdata2:0x8057AF58; // type:object size:0x4 align:4 data:float -lbl_8057AF5C = .sdata2:0x8057AF5C; // type:object size:0x4 align:4 data:float -lbl_8057AF60 = .sdata2:0x8057AF60; // type:object size:0x4 align:4 data:float -lbl_8057AF64 = .sdata2:0x8057AF64; // type:object size:0x4 align:4 data:float -lbl_8057AF68 = .sdata2:0x8057AF68; // type:object size:0x4 align:4 data:float -lbl_8057AF6C = .sdata2:0x8057AF6C; // type:object size:0x4 align:4 data:float -lbl_8057AF70 = .sdata2:0x8057AF70; // type:object size:0x4 align:4 data:float -lbl_8057AF74 = .sdata2:0x8057AF74; // type:object size:0x4 align:4 data:float -lbl_8057AF78 = .sdata2:0x8057AF78; // type:object size:0x4 align:4 data:float -lbl_8057AF80 = .sdata2:0x8057AF80; // type:object size:0x8 align:8 data:double -lbl_8057AF88 = .sdata2:0x8057AF88; // type:object size:0x4 align:4 data:float -lbl_8057AF8C = .sdata2:0x8057AF8C; // type:object size:0x4 align:4 data:float -lbl_8057AF90 = .sdata2:0x8057AF90; // type:object size:0x4 align:4 data:float -lbl_8057AF94 = .sdata2:0x8057AF94; // type:object size:0x4 align:4 data:float -lbl_8057AF98 = .sdata2:0x8057AF98; // type:object size:0x4 align:4 data:float -lbl_8057AF9C = .sdata2:0x8057AF9C; // type:object size:0x4 align:4 data:float -lbl_8057AFA0 = .sdata2:0x8057AFA0; // type:object size:0x4 align:4 data:float -lbl_8057AFA4 = .sdata2:0x8057AFA4; // type:object size:0x4 align:4 data:float +@28173 = .sdata2:0x8057AF50; // type:object size:0x4 scope:local align:4 data:float +@28174 = .sdata2:0x8057AF54; // type:object size:0x4 scope:local align:4 data:float +@28175 = .sdata2:0x8057AF58; // type:object size:0x4 scope:local align:4 data:float +@28176 = .sdata2:0x8057AF5C; // type:object size:0x4 scope:local align:4 data:float +@28177 = .sdata2:0x8057AF60; // type:object size:0x4 scope:local align:4 data:float +@28178 = .sdata2:0x8057AF64; // type:object size:0x4 scope:local align:4 data:float +@28383 = .sdata2:0x8057AF68; // type:object size:0x4 scope:local align:4 data:float +@28384 = .sdata2:0x8057AF6C; // type:object size:0x4 scope:local align:4 data:float +@28385 = .sdata2:0x8057AF70; // type:object size:0x4 scope:local align:4 data:float +@28568 = .sdata2:0x8057AF74; // type:object size:0x4 scope:local align:4 data:float +@28569 = .sdata2:0x8057AF78; // type:object size:0x4 scope:local align:4 data:float +@28572 = .sdata2:0x8057AF80; // type:object size:0x8 scope:local align:8 data:double +@28883 = .sdata2:0x8057AF88; // type:object size:0x4 scope:local align:4 data:float +@28884 = .sdata2:0x8057AF8C; // type:object size:0x4 scope:local align:4 data:float +@28885 = .sdata2:0x8057AF90; // type:object size:0x4 scope:local align:4 data:float +@28925 = .sdata2:0x8057AF94; // type:object size:0x4 scope:local align:4 data:float +@28926 = .sdata2:0x8057AF98; // type:object size:0x4 scope:local align:4 data:float +@28927 = .sdata2:0x8057AF9C; // type:object size:0x4 scope:local align:4 data:float +@28928 = .sdata2:0x8057AFA0; // type:object size:0x4 scope:local align:4 data:float +@28929 = .sdata2:0x8057AFA4; // type:object size:0x4 scope:local align:4 data:float lbl_8057AFA8 = .sdata2:0x8057AFA8; // type:object size:0x4 align:4 data:float lbl_8057AFAC = .sdata2:0x8057AFAC; // type:object size:0x4 align:4 data:float lbl_8057AFB0 = .sdata2:0x8057AFB0; // type:object size:0x4 align:4 data:float @@ -52223,7 +52223,7 @@ StageMgr__STATE_READ_OBJECT_SOUND = .bss:0x805B26B0; // type:object size:0x40 da StageMgr__STATE_SCENE_CHANGE_SAVE = .bss:0x805B26F0; // type:object size:0x40 data:4byte StageMgr__STATE_RESTART_SCENE_WAIT = .bss:0x805B2730; // type:object size:0x40 data:4byte StageMgr__STATE_RESTART_SCENE = .bss:0x805B2770; // type:object size:0x30 data:4byte -sHio = .bss:0x805B27A0; // type:object size:0x38 scope:local +sHio = .bss:0x805B27A0; // type:object size:0x34 scope:local lbl_805B27D8 = .bss:0x805B27D8; // type:object size:0xD8 align:4 data:float lbl_805B28B0 = .bss:0x805B28B0; // type:object size:0x10 WeatherTag__STATE_WAIT = .bss:0x805B28C0; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index 4bb8d6c6..5c9aa610 100644 --- a/configure.py +++ b/configure.py @@ -618,7 +618,7 @@ config.libs = [ Object(NonMatching, "d/d_hbm.cpp"), Object(NonMatching, "d/d_stage_mgr.cpp"), Object(NonMatching, "d/d_last.cpp"), - Object(NonMatching, "d/d_camera.cpp"), + Object(Matching, "d/d_camera.cpp"), Object(NonMatching, "d/d_light_obj.cpp"), Object(NonMatching, "d/tg/d_t_weather.cpp"), Object(Matching, "d/d_message.cpp"), diff --git a/include/d/d_camera.h b/include/d/d_camera.h index aa9424c2..7c27f8c9 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -66,6 +66,10 @@ private: }; enum Flags_e { + CAM_FLAGS_MAP = (1 << 1), + CAM_FLAGS_0x4 = (1 << 2), + CAM_FLAGS_0x10 = (1 << 4), + CAM_FLAGS_EVENT = (1 << 5), CAM_FLAGS_UNDERWATER = (1 << 6), CAM_FLAGS_IN_EVENT = (1 << 7), CAM_FLAGS_0x100 = (1 << 8), @@ -123,15 +127,31 @@ public: bool isUnderwater() const; f32 getUnderwaterDepth() const; - void fn_8019EA00(const mVec3_c &, const mVec3_c &, f32, f32); - void fn_8019E430(); - void fn_8019E410(); void fn_8019EA70(bool); + bool setEventCamView(const mVec3_c &, const mVec3_c &, f32, f32); mAng getYAngle() const; mAng getXZAngle() const; void apply(); + + bool fn_8019E3C0() const; + void enterMap(); + void leaveMap(); + bool fn_8019E4D0() const; + f32 fn_8019EB90(); private: + void onFlag(u32 flag) { + mFlags |= flag; + } + + void offFlag(u32 flag) { + mFlags &= ~flag; + } + + bool checkFlag(u32 flag) const { + return mFlags & flag; + } + void updateView(); void applyTilt(); @@ -139,6 +159,8 @@ private: void fn_8019DB80(); f32 fn_8019E1F0(); + void checkCameraChange(); + f32 getEventLetterboxAmount(); void updateUnderwaterDepth(const mVec3_c &pos); bool isUnderwater_() const; diff --git a/include/toBeSorted/d_camera_base.h b/include/toBeSorted/d_camera_base.h index 1bf6eb69..53438ea4 100644 --- a/include/toBeSorted/d_camera_base.h +++ b/include/toBeSorted/d_camera_base.h @@ -7,6 +7,7 @@ // A basic description of a camera perspective, simplified. struct CamView { CamView() : mPosition(0.0f, 0.0f, 0.0f), mTarget(0.0f, 0.0f, 1.0f), mFov(50.0f), mTilt(0.0f) {} + CamView(const mVec3_c &pos, const mVec3_c &target, f32 fov, f32 tilt) : mPosition(pos), mTarget(target), mFov(fov), mTilt(tilt) {} ~CamView() {} /* 0x00 */ mVec3_c mPosition; @@ -20,13 +21,13 @@ struct CamView { class dCameraBase_c { protected: /* 0x00 */ bool mCreated; - /* 0x01 */ u8 field_0x01; + /* 0x01 */ u8 mPrevIsActive; /* 0x02 */ bool mIsActive; /* 0x04 */ s32 mIndex; /* 0x08 */ CamView mView; public: - dCameraBase_c() : mCreated(false), field_0x01(0), mIsActive(false), mIndex(-1) {} + dCameraBase_c() : mCreated(false), mPrevIsActive(0), mIsActive(false), mIndex(-1) {} bool doCreate(s32 index); bool doRemove(); @@ -34,8 +35,8 @@ public: bool doDraw(); // vt at 0x28 - /* vt 0x08 */ virtual void vt_0x08() {} - /* vt 0x0C */ virtual void vt_0x0C() {} + /* vt 0x08 */ virtual void onBecomeActive() {} + /* vt 0x0C */ virtual void onBecomeInactive() {} /* vt 0x10 */ virtual bool create() { return true; } diff --git a/include/toBeSorted/d_camera_event.h b/include/toBeSorted/d_camera_event.h index d4caef6b..c83826fb 100644 --- a/include/toBeSorted/d_camera_event.h +++ b/include/toBeSorted/d_camera_event.h @@ -7,8 +7,8 @@ class dCameraEvent_c : public dCameraBase_c { public: dCameraEvent_c(); - /* vt 0x08 */ virtual void vt_0x08() override; - /* vt 0x0C */ virtual void vt_0x0C() override; + /* vt 0x08 */ virtual void onBecomeActive() override; + /* vt 0x0C */ virtual void onBecomeInactive() override; /* vt 0x10 */ virtual bool create() override; /* vt 0x14 */ virtual bool remove() override; /* vt 0x18 */ virtual bool execute() override; diff --git a/include/toBeSorted/d_camera_game.h b/include/toBeSorted/d_camera_game.h index 439f2811..00f7832c 100644 --- a/include/toBeSorted/d_camera_game.h +++ b/include/toBeSorted/d_camera_game.h @@ -139,8 +139,8 @@ public: static s32 sStyleIdxes[CAM_STYLE_IDX_MAX]; dCameraGame_c(); - /* vt 0x08 */ virtual void vt_0x08() override; - /* vt 0x0C */ virtual void vt_0x0C() override; + /* vt 0x08 */ virtual void onBecomeActive() override; + /* vt 0x0C */ virtual void onBecomeInactive() override; /* vt 0x10 */ virtual bool create() override; /* vt 0x14 */ virtual bool remove() override; /* vt 0x18 */ virtual bool execute() override; @@ -152,6 +152,14 @@ public: return field_0x060; } + bool getField_0x078() const { + return field_0x078; + } + + f32 getField_0x0AC() const { + return field_0x0AC; + } + void clearCamIds(); bool isCurrentTrend(const char *name) const; @@ -184,7 +192,7 @@ private: /* 0x06C */ UNKWORD field_0x06C; /* 0x070 */ UNKWORD field_0x070; /* 0x074 */ UNKWORD field_0x074; - /* 0x078 */ u8 field_0x078; + /* 0x078 */ bool field_0x078; /* 0x079 */ u8 field_0x079; /* 0x07A */ u8 field_0x07A; /* 0x07C */ UNKWORD field_0x07C; diff --git a/include/toBeSorted/d_camera_map.h b/include/toBeSorted/d_camera_map.h index 1d71ec0e..4a0f2633 100644 --- a/include/toBeSorted/d_camera_map.h +++ b/include/toBeSorted/d_camera_map.h @@ -8,8 +8,8 @@ class dAcObjBase_c; class dCameraMap_c : public dCameraBase_c { public: dCameraMap_c() {} - /* vt 0x08 */ virtual void vt_0x08() override; - /* vt 0x0C */ virtual void vt_0x0C() override; + /* vt 0x08 */ virtual void onBecomeActive() override; + /* vt 0x0C */ virtual void onBecomeInactive() override; /* vt 0x10 */ virtual bool create() override; /* vt 0x14 */ virtual bool remove() override; /* vt 0x18 */ virtual bool execute() override; @@ -24,6 +24,8 @@ public: void fn_80093340(); void fn_80093360(); void fn_80093380(); + bool fn_800932E0() const; + void fn_800932F0(); private: /* 0x2C */ u8 _0x2C[0x40 - 0x2C]; 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 - ... } From fe54824a8b31d2e3caccfd8726a4a6af53fa3770 Mon Sep 17 00:00:00 2001 From: robojumper Date: Wed, 7 Jan 2026 21:48:44 +0100 Subject: [PATCH 6/8] d_camera_map OK --- config/SOUE01/splits.txt | 2 + config/SOUE01/symbols.txt | 74 +++++++++---------- configure.py | 2 +- include/d/d_camera.h | 4 -- include/d/lyt/d_lyt_map.h | 13 +++- include/toBeSorted/d_camera_map.h | 31 ++++---- src/d/d_camera.cpp | 13 ++-- src/d/lyt/d_lyt_map.cpp | 70 +++++++++--------- src/toBeSorted/d_camera_map.cpp | 115 ++++++++++++++++++++++++++---- 9 files changed, 213 insertions(+), 111 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 0ce2157c..ff5d467b 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -426,6 +426,8 @@ toBeSorted/d_camera_event.cpp: .text start:0x80083370 end:0x800928F0 align:16 .ctors start:0x804DB6B0 end:0x804DB6B4 .data start:0x8050EA18 end:0x8050F180 + .sdata2 start:0x80579418 end:0x80579538 + .bss start:0x805A1660 end:0x805A2F18 toBeSorted/d_camera_map.cpp: .text start:0x800928F0 end:0x8009345C align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index c37f4213..b93183cd 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3307,21 +3307,21 @@ fn_80092890 = .text:0x80092890; // type:function size:0x60 __dt__16dCameraMap_HIO_cFv = .text:0x800928F0; // type:function size:0x40 __ct__16dCameraMap_HIO_cFv = .text:0x80092930; // type:function size:0x88 fn_800929C0__FRC7mVec3_cRC7mVec3_cP12dAcObjBase_c = .text:0x800929C0; // type:function size:0x1BC -fn_80092B80 = .text:0x80092B80; // type:function size:0x138 -fn_80092CC0 = .text:0x80092CC0; // type:function size:0x50 -fn_80092D10 = .text:0x80092D10; // type:function size:0x170 -fn_80092E80 = .text:0x80092E80; // type:function size:0x8 +onBecomeActive__12dCameraMap_cFv = .text:0x80092B80; // type:function size:0x138 +onBecomeInactive__12dCameraMap_cFv = .text:0x80092CC0; // type:function size:0x50 +create__12dCameraMap_cFv = .text:0x80092D10; // type:function size:0x170 +remove__12dCameraMap_cFv = .text:0x80092E80; // type:function size:0x8 execute__12dCameraMap_cFv = .text:0x80092E90; // type:function size:0x430 -fn_800932C0 = .text:0x800932C0; // type:function size:0x8 -fn_800932D0 = .text:0x800932D0; // type:function size:0x8 -fn_800932E0__12dCameraMap_cCFv = .text:0x800932E0; // type:function size:0x8 -fn_800932F0__12dCameraMap_cFv = .text:0x800932F0; // type:function size:0x4C +vt_0x34__12dCameraMap_cFv = .text:0x800932C0; // type:function size:0x8 +draw__12dCameraMap_cFv = .text:0x800932D0; // type:function size:0x8 +isActiveOrAnimating__12dCameraMap_cCFv = .text:0x800932E0; // type:function size:0x8 +startOut__12dCameraMap_cFv = .text:0x800932F0; // type:function size:0x4C fn_80093340__12dCameraMap_cFv = .text:0x80093340; // type:function size:0x14 -fn_80093360__12dCameraMap_cFv = .text:0x80093360; // type:function size:0x18 -fn_80093380__12dCameraMap_cFv = .text:0x80093380; // type:function size:0x18 +setNoCameraTransition__12dCameraMap_cFv = .text:0x80093360; // type:function size:0x18 +setCameraTransition__12dCameraMap_cFv = .text:0x80093380; // type:function size:0x18 setView__12dCameraMap_cFRC7CamView = .text:0x800933A0; // type:function size:0x64 -fn_80093410 = .text:0x80093410; // type:function size:0x40 -__sinit_\d_camera_map_cpp = .text:0x80093450; // type:function size:0xC +__dt__12dCameraMap_cFv = .text:0x80093410; // type:function size:0x40 scope:weak +__sinit_\d_camera_map_cpp = .text:0x80093450; // type:function size:0xC scope:local camEaseIn__Fff = .text:0x80093460; // type:function size:0x18C camEaseInOut__Fff = .text:0x800935F0; // type:function size:0xD8 camGetPointOnLine__FRC7mVec3_cRC7mVec3_cRC7mVec3_c = .text:0x800936D0; // type:function size:0xF4 @@ -7850,7 +7850,7 @@ canCenterCursor1__13dLytMapMain_cCFl = .text:0x8013AC00; // type:function size:0 setCursorType__13dLytMapMain_cFv = .text:0x8013AC10; // type:function size:0x138 fn_8013AD50__13dLytMapMain_cFv = .text:0x8013AD50; // type:function size:0x370 calculateBoundingWorldHitboxes__13dLytMapMain_cFv = .text:0x8013B0C0; // type:function size:0x28C -fn_8013B350 = .text:0x8013B350; // type:function size:0x10 +fn_8013B350__13dLytMapMain_cFv = .text:0x8013B350; // type:function size:0x10 initializeState_Invisible__13dLytMapMain_cFv = .text:0x8013B360; // type:function size:0x4 executeState_Invisible__13dLytMapMain_cFv = .text:0x8013B370; // type:function size:0x4 finalizeState_Invisible__13dLytMapMain_cFv = .text:0x8013B380; // type:function size:0x4 @@ -30963,7 +30963,7 @@ lbl_8050F004 = .data:0x8050F004; // type:object size:0x12C __vt__18dCameraEvent_HIO_c = .data:0x8050F130; // type:object size:0xC __vt__14dCameraEvent_c = .data:0x8050F13C; // type:object size:0x34 lbl_8050F170 = .data:0x8050F170; // type:object size:0x10 -__vt__16dCameraMap_HIO_c = .data:0x8050F180; // type:object size:0x10 +__vt__16dCameraMap_HIO_c = .data:0x8050F180; // type:object size:0xC __vt__12dCameraMap_c = .data:0x8050F190; // type:object size:0x38 lbl_8050F1C8 = .data:0x8050F1C8; // type:object size:0xA data:string lbl_8050F1D4 = .data:0x8050F1D4; // type:object size:0x9 data:string @@ -45180,29 +45180,29 @@ lbl_80579528 = .sdata2:0x80579528; // type:object size:0x4 align:4 data:float lbl_8057952C = .sdata2:0x8057952C; // type:object size:0x4 align:4 data:float lbl_80579530 = .sdata2:0x80579530; // type:object size:0x4 align:4 data:float lbl_80579534 = .sdata2:0x80579534; // type:object size:0x4 align:4 data:float -lbl_80579538 = .sdata2:0x80579538; // type:object size:0x4 align:4 data:float -lbl_8057953C = .sdata2:0x8057953C; // type:object size:0x4 align:4 data:float -lbl_80579540 = .sdata2:0x80579540; // type:object size:0x4 align:4 data:float -lbl_80579544 = .sdata2:0x80579544; // type:object size:0x4 align:4 data:float -lbl_80579548 = .sdata2:0x80579548; // type:object size:0x4 align:4 data:float -lbl_8057954C = .sdata2:0x8057954C; // type:object size:0x4 align:4 data:float -lbl_80579550 = .sdata2:0x80579550; // type:object size:0x4 align:4 data:float -lbl_80579554 = .sdata2:0x80579554; // type:object size:0x4 align:4 data:float -lbl_80579558 = .sdata2:0x80579558; // type:object size:0x4 align:4 data:float -lbl_8057955C = .sdata2:0x8057955C; // type:object size:0x4 align:4 data:float -lbl_80579560 = .sdata2:0x80579560; // type:object size:0x4 align:4 data:float -lbl_80579564 = .sdata2:0x80579564; // type:object size:0x4 align:4 data:float -lbl_80579568 = .sdata2:0x80579568; // type:object size:0x4 align:4 data:float -lbl_8057956C = .sdata2:0x8057956C; // type:object size:0x4 align:4 data:float -lbl_80579570 = .sdata2:0x80579570; // type:object size:0x4 align:4 data:float -lbl_80579574 = .sdata2:0x80579574; // type:object size:0x4 align:4 data:float -lbl_80579578 = .sdata2:0x80579578; // type:object size:0x4 align:4 data:float -lbl_8057957C = .sdata2:0x8057957C; // type:object size:0x4 align:4 data:float -lbl_80579580 = .sdata2:0x80579580; // type:object size:0x4 align:4 data:float -lbl_80579584 = .sdata2:0x80579584; // type:object size:0x4 align:4 data:float -lbl_80579588 = .sdata2:0x80579588; // type:object size:0x4 align:4 data:float -lbl_80579590 = .sdata2:0x80579590; // type:object size:0x8 align:8 data:double -lbl_80579598 = .sdata2:0x80579598; // type:object size:0x4 align:4 data:float +@28181 = .sdata2:0x80579538; // type:object size:0x4 scope:local align:4 data:float +@28182 = .sdata2:0x8057953C; // type:object size:0x4 scope:local align:4 data:float +@28183 = .sdata2:0x80579540; // type:object size:0x4 scope:local align:4 data:float +@28184 = .sdata2:0x80579544; // type:object size:0x4 scope:local align:4 data:float +@28185 = .sdata2:0x80579548; // type:object size:0x4 scope:local align:4 data:float +@28186 = .sdata2:0x8057954C; // type:object size:0x4 scope:local align:4 data:float +@28187 = .sdata2:0x80579550; // type:object size:0x4 scope:local align:4 data:float +@28188 = .sdata2:0x80579554; // type:object size:0x4 scope:local align:4 data:float +@28189 = .sdata2:0x80579558; // type:object size:0x4 scope:local align:4 data:float +@28190 = .sdata2:0x8057955C; // type:object size:0x4 scope:local align:4 data:float +@28191 = .sdata2:0x80579560; // type:object size:0x4 scope:local align:4 data:float +@28192 = .sdata2:0x80579564; // type:object size:0x4 scope:local align:4 data:float +@28243 = .sdata2:0x80579568; // type:object size:0x4 scope:local align:4 data:float +@28244 = .sdata2:0x8057956C; // type:object size:0x4 scope:local align:4 data:float +@28283 = .sdata2:0x80579570; // type:object size:0x4 scope:local align:4 data:float +@28337 = .sdata2:0x80579574; // type:object size:0x4 scope:local align:4 data:float +@28338 = .sdata2:0x80579578; // type:object size:0x4 scope:local align:4 data:float +@28339 = .sdata2:0x8057957C; // type:object size:0x4 scope:local align:4 data:float +@28340 = .sdata2:0x80579580; // type:object size:0x4 scope:local align:4 data:float +@28414 = .sdata2:0x80579584; // type:object size:0x4 scope:local align:4 data:float +@28415 = .sdata2:0x80579588; // type:object size:0x4 scope:local align:4 data:float +@28418 = .sdata2:0x80579590; // type:object size:0x8 scope:local align:8 data:double +@28432 = .sdata2:0x80579598; // type:object size:0x4 scope:local align:4 data:float lbl_805795A0 = .sdata2:0x805795A0; // type:object size:0x8 align:8 data:double lbl_805795A8 = .sdata2:0x805795A8; // type:object size:0x8 align:8 data:double lbl_805795B0 = .sdata2:0x805795B0; // type:object size:0x4 align:4 data:float diff --git a/configure.py b/configure.py index 5c9aa610..b686b70b 100644 --- a/configure.py +++ b/configure.py @@ -487,7 +487,7 @@ config.libs = [ Object(NonMatching, "toBeSorted/d_camera_base.cpp"), Object(NonMatching, "toBeSorted/d_camera_game.cpp"), Object(NonMatching, "toBeSorted/d_camera_event.cpp"), - Object(NonMatching, "toBeSorted/d_camera_map.cpp"), + Object(Matching, "toBeSorted/d_camera_map.cpp"), Object(NonMatching, "toBeSorted/d_camera_math.cpp"), Object(NonMatching, "toBeSorted/attention.cpp"), Object(NonMatching, "toBeSorted/d_t_camera.cpp"), diff --git a/include/d/d_camera.h b/include/d/d_camera.h index 7c27f8c9..50a86f1d 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -197,10 +197,6 @@ private: /* 0x728 */ dCameraGame_c mGameCam2; /* 0xB9C */ dCameraEvent_c mEventCam; /* 0xCD0 */ dCameraMap_c mMapCam; - - /* 0xD8C */ u8 _0xD8C[0xD94 - 0xD8C]; - - /* 0xD94 */ f32 field_0xD94; /* 0xD98 */ dCameraBase_c *mpCameras[CAM_MAX]; /* 0xDA8 */ s32 mActiveCameraIdx; /* 0xDAC */ screen_shaker mScreenShaker; diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 69289ffd..30ec9379 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -587,6 +587,7 @@ public: void queueMapEvent(s32 mapEvent, s32 surfaceProvince, s32 c); void startMapEvent(s32 mapEvent, s32 surfaceProvince, s32 c); bool isVisibleNoIntro() const; + void fn_8013B350(); const dMapSaveObjDefinition *getSaveObjDefinition(s32 province, s32 statueIdx) const; @@ -836,7 +837,7 @@ private: /* 0x8C84 */ u8 field_0x8C84; /* 0x8C88 */ f32 field_0x8C88; - /* 0x8C8C */ f32 field_0x8C8C; + /* 0x8C8C */ f32 mOutDuration; /* 0x8C90 */ bool mMapUpDirection; /* 0x8C91 */ bool mNextMapUpDirection; /* 0x8C92 */ bool mMapUpDirectionAfterZoomToDetail; @@ -850,7 +851,7 @@ private: /* 0x8CA8 */ s32 mNextMapMode; /* 0x8CAC */ u8 field_0x8CAC; - /* 0x8CAD */ bool mDoCameraTransition; + /* 0x8CAD */ bool mCameraTransitionPossible; /* 0x8CAE */ bool field_0x8CAE; /* 0x8CB0 */ u32 mEventTimer; @@ -958,6 +959,14 @@ public: return mMapMain.isVisibleNoIntro(); } + void doFn_8013B350() { + mMapMain.fn_8013B350(); + } + + f32 getOutDuration() const { + return mMapMain.mOutDuration; + } + bool build(); bool remove(); bool execute(); diff --git a/include/toBeSorted/d_camera_map.h b/include/toBeSorted/d_camera_map.h index 4a0f2633..cd78c839 100644 --- a/include/toBeSorted/d_camera_map.h +++ b/include/toBeSorted/d_camera_map.h @@ -1,13 +1,15 @@ #ifndef TO_BE_SORTED_D_CAMERA_MAP_H #define TO_BE_SORTED_D_CAMERA_MAP_H +#include "common.h" +#include "m/m_vec.h" #include "toBeSorted/d_camera_base.h" class dAcObjBase_c; class dCameraMap_c : public dCameraBase_c { public: - dCameraMap_c() {} + dCameraMap_c() : field_0xC4(0.0f) {} /* vt 0x08 */ virtual void onBecomeActive() override; /* vt 0x0C */ virtual void onBecomeInactive() override; /* vt 0x10 */ virtual bool create() override; @@ -17,29 +19,30 @@ public: /* vt 0x20 */ virtual ~dCameraMap_c() {} /* vt 0x30 */ virtual void setView(const CamView &view) override; // Not sure what this is... - /* vt 0x34 */ virtual bool vt_0x34() { - return true; - } + /* vt 0x34 */ virtual bool vt_0x34(); void fn_80093340(); - void fn_80093360(); - void fn_80093380(); - bool fn_800932E0() const; - void fn_800932F0(); + void setNoCameraTransition(); + void setCameraTransition(); + bool isActiveOrAnimating() const; + void startOut(); private: - /* 0x2C */ u8 _0x2C[0x40 - 0x2C]; + /* 0x2C */ mVec3_c field_0x2C; + /* 0x38 */ f32 field_0x38; + /* 0x3C */ f32 field_0x3C; /* 0x40 */ f32 field_0x40; /* 0x44 */ dAcObjBase_c *field_0x44; /* 0x48 */ CamView mView1; /* 0x68 */ CamView mSourceView; /* 0x88 */ CamView mTargetView; /* 0xA8 */ u8 _0xA8[0xAC - 0xA8]; - /* 0xAC */ u8 field_0xAC; - /* 0xAD */ u8 _0xAD[0xB4 - 0xAD]; - /* 0xB4 */ u8 field_0xB4; - /* 0xB5 */ u8 _0xB5[0xB8 - 0xB5]; - /* 0xB8 */ UNKWORD field_0xB8; + /* 0xAC */ bool mIsMovingOut; + /* 0xB0 */ UNKWORD field_0xB0; + /* 0xB4 */ bool mIsActiveOrAnimating; + /* 0xB8 */ s32 mTimer; + /* 0xBC */ u8 _0xBC[0xC4 - 0xBC]; + /* 0xC4 */ f32 field_0xC4; }; #endif diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 589d8c8a..59a5bdc1 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -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(); } } diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 8357b510..6b268ef5 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -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); } diff --git a/src/toBeSorted/d_camera_map.cpp b/src/toBeSorted/d_camera_map.cpp index 81e80eec..7adec892 100644 --- a/src/toBeSorted/d_camera_map.cpp +++ b/src/toBeSorted/d_camera_map.cpp @@ -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; From 1ec9c01b837174c82d9f9d081fff4e05f5556748 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 11 Jan 2026 00:24:23 +0100 Subject: [PATCH 7/8] Progress on game cam --- config/SOUE01/symbols.txt | 235 ++++---- configure.py | 2 +- include/d/col/bg/d_bg_s_sph_chk.h | 2 +- include/d/col/cc/d_cc_s.h | 4 +- include/toBeSorted/d_camera_base.h | 16 +- include/toBeSorted/d_camera_game.h | 72 ++- src/REL/d/t/d_t_gate_to_ground.cpp | 3 +- src/d/col/bg/d_bg_s_acch.cpp | 2 +- src/d/col/cc/d_cc_s.cpp | 7 +- src/toBeSorted/d_camera_base.cpp | 21 +- src/toBeSorted/d_camera_game.cpp | 873 ++++++++++++++++++++++++++++- src/toBeSorted/d_camera_map.cpp | 2 +- 12 files changed, 1085 insertions(+), 154 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index b93183cd..7666fe4b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3066,13 +3066,13 @@ entry__16dEnemySwordMdl_cFP12dAcObjBase_cP15dShadowCircle_cP7mQuat_c = .text:0x8 doCreate__13dCameraBase_cFl = .text:0x8006BBE0; // type:function size:0x70 doRemove__13dCameraBase_cFv = .text:0x8006BC50; // type:function size:0x18 doExecute__13dCameraBase_cFv = .text:0x8006BC70; // type:function size:0xA8 -onBecomeActive__13dCameraBase_cFv = .text:0x8006BD20; // type:function size:0x4 +onBecomeActive__13dCameraBase_cFv = .text:0x8006BD20; // type:function size:0x4 scope:weak doDraw__13dCameraBase_cFv = .text:0x8006BD30; // type:function size:0x24 -setView__13dCameraBase_cFRC7CamView = .text:0x8006BD60; // type:function size:0x44 -deactivate__13dCameraBase_cFv = .text:0x8006BDB0; // type:function size:0xC -activate__13dCameraBase_cFv = .text:0x8006BDC0; // type:function size:0xC -getView__13dCameraBase_cFv = .text:0x8006BDD0; // type:function size:0x8 -__dt__7CamViewFv = .text:0x8006BDE0; // type:function size:0x40 +setView__13dCameraBase_cFRC7CamView = .text:0x8006BD60; // type:function size:0x44 scope:weak +deactivate__13dCameraBase_cFv = .text:0x8006BDB0; // type:function size:0xC scope:weak +activate__13dCameraBase_cFv = .text:0x8006BDC0; // type:function size:0xC scope:weak +getView__13dCameraBase_cFv = .text:0x8006BDD0; // type:function size:0x8 scope:weak +__dt__7CamViewFv = .text:0x8006BDE0; // type:function size:0x40 scope:weak __dt__17dCameraGame_HIO_cFv = .text:0x8006BE20; // type:function size:0x40 debugNotif = .text:0x8006BE60; // type:function size:0x50 debugPrintf4__FPCce = .text:0x8006BEB0; // type:function size:0x50 @@ -3088,60 +3088,60 @@ getStyleIndex__13dCameraGame_cFUl = .text:0x8006C110; // type:function size:0x48 cacheIdxes__13dCameraGame_cFv = .text:0x8006C160; // type:function size:0x208 initCamParamDat__13dCameraGame_cFv = .text:0x8006C370; // type:function size:0xEC fn_8006C460 = .text:0x8006C460; // type:function size:0x6DC -fn_8006CB40 = .text:0x8006CB40; // type:function size:0x9C -fn_8006CBE0 = .text:0x8006CBE0; // type:function size:0x8 -fn_8006CBF0 = .text:0x8006CBF0; // type:function size:0x78 -fn_8006CC70 = .text:0x8006CC70; // type:function size:0x10 -fn_8006CC80 = .text:0x8006CC80; // type:function size:0x8 +doInit__17GameCameraHandlerFP13dCameraGame_cUsi = .text:0x8006CB40; // type:function size:0x9C +init__17GameCameraHandlerFv = .text:0x8006CBE0; // type:function size:0x8 +doExecute__17GameCameraHandlerFv = .text:0x8006CBF0; // type:function size:0x78 +vt_0x0C__17GameCameraHandlerFv = .text:0x8006CC70; // type:function size:0x10 +vt_0x10__17GameCameraHandlerFv = .text:0x8006CC80; // type:function size:0x8 fn_8006CC90 = .text:0x8006CC90; // type:function size:0x48 fn_8006CCE0 = .text:0x8006CCE0; // type:function size:0x164 searchForBossActor = .text:0x8006CE50; // type:function size:0xD8 -fn_8006CF30 = .text:0x8006CF30; // type:function size:0x2F4 -fn_8006D230 = .text:0x8006D230; // type:function size:0x1618 +init__19GameCameraHandler03Fv = .text:0x8006CF30; // type:function size:0x2F4 +vt_0x10__19GameCameraHandler03Fv = .text:0x8006D230; // type:function size:0x1618 fn_8006E850 = .text:0x8006E850; // type:function size:0x130 fn_8006E980 = .text:0x8006E980; // type:function size:0x108 fn_8006EA90 = .text:0x8006EA90; // type:function size:0x294 -fn_8006ED30 = .text:0x8006ED30; // type:function size:0x2F8 -fn_8006F030 = .text:0x8006F030; // type:function size:0x814 -fn_8006F850 = .text:0x8006F850; // type:function size:0x1F04 -fn_80071760 = .text:0x80071760; // type:function size:0x340 -fn_80071AA0 = .text:0x80071AA0; // type:function size:0x198 -fn_80071C40 = .text:0x80071C40; // type:function size:0x10F4 +init__19GameCameraHandler01Fv = .text:0x8006ED30; // type:function size:0x2F8 +vt_0x0C__19GameCameraHandler01Fv = .text:0x8006F030; // type:function size:0x814 +vt_0x10__19GameCameraHandler01Fv = .text:0x8006F850; // type:function size:0x1F04 +init__19GameCameraHandler02Fv = .text:0x80071760; // type:function size:0x340 +vt_0x0C__19GameCameraHandler02Fv = .text:0x80071AA0; // type:function size:0x198 +vt_0x10__19GameCameraHandler02Fv = .text:0x80071C40; // type:function size:0x10F4 fn_80072D40 = .text:0x80072D40; // type:function size:0x4E8 fn_80073230 = .text:0x80073230; // type:function size:0x414 -fn_80073650 = .text:0x80073650; // type:function size:0x384 -fn_800739E0 = .text:0x800739E0; // type:function size:0x1F0 -fn_80073BD0 = .text:0x80073BD0; // type:function size:0x760 -fn_80074330 = .text:0x80074330; // type:function size:0x698 -fn_800749D0 = .text:0x800749D0; // type:function size:0x748 +init__19GameCameraHandler04Fv = .text:0x80073650; // type:function size:0x384 +vt_0x10__19GameCameraHandler04Fv = .text:0x800739E0; // type:function size:0x1F0 +init__19GameCameraHandler05Fv = .text:0x80073BD0; // type:function size:0x760 +vt_0x0C__19GameCameraHandler05Fv = .text:0x80074330; // type:function size:0x698 +vt_0x10__19GameCameraHandler05Fv = .text:0x800749D0; // type:function size:0x748 fn_80075120 = .text:0x80075120; // type:function size:0x14 fn_80075140 = .text:0x80075140; // type:function size:0x14 fn_80075160 = .text:0x80075160; // type:function size:0x78 -fn_800751E0 = .text:0x800751E0; // type:function size:0x3C4 -fn_800755B0 = .text:0x800755B0; // type:function size:0xAE8 -fn_800760A0 = .text:0x800760A0; // type:function size:0x1BD4 -fn_80077C80 = .text:0x80077C80; // type:function size:0x2EC -fn_80077F70 = .text:0x80077F70; // type:function size:0x2D0 -fn_80078240 = .text:0x80078240; // type:function size:0x2F4 -fn_80078540 = .text:0x80078540; // type:function size:0x13C -fn_80078680 = .text:0x80078680; // type:function size:0x2E4 -fn_80078970 = .text:0x80078970; // type:function size:0x954 +init__19GameCameraHandler06Fv = .text:0x800751E0; // type:function size:0x3C4 +vt_0x0C__19GameCameraHandler06Fv = .text:0x800755B0; // type:function size:0xAE8 +vt_0x10__19GameCameraHandler06Fv = .text:0x800760A0; // type:function size:0x1BD4 +init__19GameCameraHandler07Fv = .text:0x80077C80; // type:function size:0x2EC +vt_0x0C__19GameCameraHandler07Fv = .text:0x80077F70; // type:function size:0x2D0 +vt_0x10__19GameCameraHandler07Fv = .text:0x80078240; // type:function size:0x2F4 +init__19GameCameraHandler08Fv = .text:0x80078540; // type:function size:0x13C +vt_0x0C__19GameCameraHandler08Fv = .text:0x80078680; // type:function size:0x2E4 +vt_0x10__19GameCameraHandler08Fv = .text:0x80078970; // type:function size:0x954 fn_800792D0 = .text:0x800792D0; // type:function size:0x254 -fn_80079530 = .text:0x80079530; // type:function size:0x28C -fn_800797C0 = .text:0x800797C0; // type:function size:0x56C -fn_80079D30 = .text:0x80079D30; // type:function size:0x1128 -fn_8007AE60 = .text:0x8007AE60; // type:function size:0x34 -fn_8007AEA0 = .text:0x8007AEA0; // type:function size:0x8 -fn_8007AEB0 = .text:0x8007AEB0; // type:function size:0x10 +init__19GameCameraHandler09Fv = .text:0x80079530; // type:function size:0x28C +vt_0x0C__19GameCameraHandler09Fv = .text:0x800797C0; // type:function size:0x56C +vt_0x10__19GameCameraHandler09Fv = .text:0x80079D30; // type:function size:0x1128 +init__19GameCameraHandler10Fv = .text:0x8007AE60; // type:function size:0x34 +vt_0x0C__19GameCameraHandler10Fv = .text:0x8007AEA0; // type:function size:0x8 +vt_0x10__19GameCameraHandler10Fv = .text:0x8007AEB0; // type:function size:0x10 fn_8007AEC0 = .text:0x8007AEC0; // type:function size:0xFC -fn_8007AFC0 = .text:0x8007AFC0; // type:function size:0x2E8 -fn_8007B2B0 = .text:0x8007B2B0; // type:function size:0x684 -fn_8007B940 = .text:0x8007B940; // type:function size:0x17CC -fn_8007D110 = .text:0x8007D110; // type:function size:0xAC -fn_8007D1C0 = .text:0x8007D1C0; // type:function size:0xADC -fn_8007DCA0 = .text:0x8007DCA0; // type:function size:0xE8 -fn_8007DD90 = .text:0x8007DD90; // type:function size:0x10 -fn_8007DDA0 = .text:0x8007DDA0; // type:function size:0x30 +init__19GameCameraHandler11Fv = .text:0x8007AFC0; // type:function size:0x2E8 +vt_0x0C__19GameCameraHandler11Fv = .text:0x8007B2B0; // type:function size:0x684 +vt_0x10__19GameCameraHandler11Fv = .text:0x8007B940; // type:function size:0x17CC +init__19GameCameraHandler12Fv = .text:0x8007D110; // type:function size:0xAC +vt_0x10__19GameCameraHandler12Fv = .text:0x8007D1C0; // type:function size:0xADC +loadStyle__8CamStyleFUs = .text:0x8007DCA0; // type:function size:0xE8 +getFloat__8CamStyleCFl = .text:0x8007DD90; // type:function size:0x10 +getFlag__8CamStyleCFl = .text:0x8007DDA0; // type:function size:0x30 __ct__17dCameraGame_HIO_cFv = .text:0x8007DDD0; // type:function size:0x33C create__17dCameraGame_HIO_cFv = .text:0x8007E110; // type:function size:0x4 remove__17dCameraGame_HIO_cFv = .text:0x8007E120; // type:function size:0x4 @@ -3150,26 +3150,26 @@ fn_8007E1B0__12UnkCamChecksFP12dAcObjBase_c = .text:0x8007E1B0; // type:function __ct__13dCameraGame_cFv = .text:0x8007E6D0; // type:function size:0x1CC create__13dCameraGame_cFv = .text:0x8007E8A0; // type:function size:0x230 execute__13dCameraGame_cFv = .text:0x8007EAD0; // type:function size:0x75C -fn_8007F230 = .text:0x8007F230; // type:function size:0x94 -fn_8007F2D0 = .text:0x8007F2D0; // type:function size:0x38 -fn_8007F310 = .text:0x8007F310; // type:function size:0x1EC -linChkAttentionTarget__FRC7mVec3_cRC7mVec3_cR11dBgS_LinChki = .text:0x8007F500; // type:function size:0xF4 +chkCamera__FR7mVec3_cR7mVec3_cP12dAcObjBase_c = .text:0x8007F230; // type:function size:0x94 +chkCo__FRC7mVec3_c = .text:0x8007F2D0; // type:function size:0x38 +chkCameraPoint__FRC7mVec3_cRC7mVec3_cR7mVec3_cP12dAcObjBase_c = .text:0x8007F310; // type:function size:0x1EC +linCrossAttentionTarget__FRC7mVec3_cRC7mVec3_cR11dBgS_LinChki = .text:0x8007F500; // type:function size:0xF4 linCross__FR11dBgS_LinChki = .text:0x8007F600; // type:function size:0x34 -camLinChkAttentionTarget__FRC7mVec3_cRC7mVec3_ci = .text:0x8007F640; // type:function size:0x70 +linCrossAttentionTarget__FRC7mVec3_cRC7mVec3_ci = .text:0x8007F640; // type:function size:0x70 linCrossAttentionTarget__FRC7mVec3_cRC7mVec3_cR7mVec3_c = .text:0x8007F6B0; // type:function size:0x130 -fn_8007F7E0 = .text:0x8007F7E0; // type:function size:0x384 -fn_8007FB70 = .text:0x8007FB70; // type:function size:0x168 -fn_8007FCE0 = .text:0x8007FCE0; // type:function size:0x128 -fn_8007FE10 = .text:0x8007FE10; // type:function size:0x268 +unkCamLineChk__FR14dBgS_CamLinChkR14dBgS_CamLinChkUl = .text:0x8007F7E0; // type:function size:0x384 +unkCamCallback1__FP11dBgS_SphChkP10cBgD_Vtx_tiiiP8cM3dGPlaPv = .text:0x8007FB70; // type:function size:0x168 +unkCamCallback2__FP11dBgS_SphChkP10cBgD_Vtx_tiiiP8cM3dGPlaPv = .text:0x8007FCE0; // type:function size:0x128 +fn_8007FE10__FR7mVec3_cR7mVec3_cR7mVec3_cf = .text:0x8007FE10; // type:function size:0x268 fn_80080080 = .text:0x80080080; // type:function size:0x10 fn_80080090 = .text:0x80080090; // type:function size:0x86C draw__13dCameraGame_cFv = .text:0x80080900; // type:function size:0x8 remove__13dCameraGame_cFv = .text:0x80080910; // type:function size:0x44 -fn_80080960__13dCameraGame_cFllScl = .text:0x80080960; // type:function size:0x118 -fn_80080A80 = .text:0x80080A80; // type:function size:0x6C -fn_80080AF0 = .text:0x80080AF0; // type:function size:0x10 +overrideCam__13dCameraGame_cFllsb = .text:0x80080960; // type:function size:0x118 +setCam__13dCameraGame_cFss = .text:0x80080A80; // type:function size:0x6C +setCam__13dCameraGame_cFRC5CamId = .text:0x80080AF0; // type:function size:0x10 clearCamIds__13dCameraGame_cFv = .text:0x80080B00; // type:function size:0x6C -fn_80080B70 = .text:0x80080B70; // type:function size:0x220 +getCamId__13dCameraGame_cFv = .text:0x80080B70; // type:function size:0x220 fn_80080D90 = .text:0x80080D90; // type:function size:0x7C8 getNewStyle = .text:0x80081560; // type:function size:0x34 getNewMode = .text:0x800815A0; // type:function size:0x440 @@ -3180,20 +3180,20 @@ doStyleChange = .text:0x80081F80; // type:function size:0x58 isCurrentTrend__13dCameraGame_cCFPCc = .text:0x80081FE0; // type:function size:0x40 setView__13dCameraGame_cFRC7CamView = .text:0x80082020; // type:function size:0xB4 onBecomeActive__13dCameraGame_cFv = .text:0x800820E0; // type:function size:0xC8 -fn_800821B0 = .text:0x800821B0; // type:function size:0xC0 +onBecomeInactive__13dCameraGame_cFv = .text:0x800821B0; // type:function size:0xC0 fn_80082270 = .text:0x80082270; // type:function size:0x44 fn_800822C0 = .text:0x800822C0; // type:function size:0x10 fn_800822D0 = .text:0x800822D0; // type:function size:0x24 fn_80082300 = .text:0x80082300; // type:function size:0xC __dt__13dCameraGame_cFv = .text:0x80082310; // type:function size:0xB0 __sinit_\d_camera_game_cpp = .text:0x800823C0; // type:function size:0xCF8 -fn_800830C0 = .text:0x800830C0; // type:function size:0x60 -fn_80083120 = .text:0x80083120; // type:function size:0x60 -fn_80083180 = .text:0x80083180; // type:function size:0x60 -fn_800831E0 = .text:0x800831E0; // type:function size:0x70 -fn_80083250 = .text:0x80083250; // type:function size:0x60 -fn_800832B0 = .text:0x800832B0; // type:function size:0x60 -fn_80083310 = .text:0x80083310; // type:function size:0x60 +__dt__19GameCameraHandler06Fv = .text:0x800830C0; // type:function size:0x60 +__dt__19GameCameraHandler08Fv = .text:0x80083120; // type:function size:0x60 +__dt__19GameCameraHandler02Fv = .text:0x80083180; // type:function size:0x60 +__dt__19GameCameraHandler03Fv = .text:0x800831E0; // type:function size:0x70 +__dt__19GameCameraHandler05Fv = .text:0x80083250; // type:function size:0x60 +__dt__19GameCameraHandler07Fv = .text:0x800832B0; // type:function size:0x60 +__dt__19GameCameraHandler11Fv = .text:0x80083310; // type:function size:0x60 debugPrintf = .text:0x80083370; // type:function size:0x50 debugErrorf = .text:0x800833C0; // type:function size:0x50 debugPrintMaybe = .text:0x80083410; // type:function size:0x54 @@ -19761,8 +19761,8 @@ CalcParticleAngle__4dCcSFP8cCcD_ObjP8cCcD_ObjP7mAng3_cb = .text:0x80356D20; // t fn_80356fd0__4dCcSFP7mVec3_cP8cCcD_ObjP8cCcD_Obj = .text:0x80356FD0; // type:function size:0x184 ProcAtTgHitmark__4dCcSFP8cCcD_ObjP8cCcD_ObjP7mVec3_cUlP7mVec3_c = .text:0x80357160; // type:function size:0x21C SetAtTgObjInf__4dCcSFbbP8cCcD_ObjP8cCcD_ObjP7mVec3_cb = .text:0x80357380; // type:function size:0x274 -ChkCamera__4dCcSFR7mVec3_cR7mVec3_cP12dAcObjBase_cP12dAcObjBase_cP12dAcObjBase_cf = .text:0x80357600; // type:function size:0x1E8 -ChkCameraPoint__4dCcSFRC7mVec3_cRC7mVec3_cR7mVec3_cP12dAcObjBase_cP12dAcObjBase_cP12dAcObjBase_cf = .text:0x803577F0; // type:function size:0x2D4 +ChkCamera__4dCcSFR7mVec3_cR7mVec3_cfP12dAcObjBase_cP12dAcObjBase_cP12dAcObjBase_c = .text:0x80357600; // type:function size:0x1E8 +ChkCameraPoint__4dCcSFRC7mVec3_cRC7mVec3_cR7mVec3_cfP12dAcObjBase_cP12dAcObjBase_cP12dAcObjBase_c = .text:0x803577F0; // type:function size:0x2D4 ChkCo__4dCcSFRC7mVec3_cP12dAcObjBase_c = .text:0x80357AD0; // type:function size:0x1B4 fn_80357c90__4dCcSFRC7mVec3_cRC7mVec3_cUlPPv = .text:0x80357C90; // type:function size:0x218 Set__4dCcSFP8cCcD_Obj = .text:0x80357EB0; // type:function size:0x13C @@ -30925,7 +30925,7 @@ lbl_8050E678 = .data:0x8050E678; // type:object size:0x40 lbl_8050E6B8 = .data:0x8050E6B8; // type:object size:0x7C lbl_8050E734 = .data:0x8050E734; // type:object size:0xA data:string lbl_8050E740 = .data:0x8050E740; // type:object size:0xB data:string -lbl_8050E750 = .data:0x8050E750; // type:object size:0xD0 +sCamDefs = .data:0x8050E750; // type:object size:0xD0 lbl_8050E820 = .data:0x8050E820; // type:object size:0xB data:string lbl_8050E82C = .data:0x8050E82C; // type:object size:0xE data:string lbl_8050E83C = .data:0x8050E83C; // type:object size:0x1D data:string @@ -30933,10 +30933,23 @@ lbl_8050E85C = .data:0x8050E85C; // type:object size:0x16 data:string lbl_8050E874 = .data:0x8050E874; // type:object size:0x15 data:string lbl_8050E88C = .data:0x8050E88C; // type:object size:0x16 data:string lbl_8050E8A4 = .data:0x8050E8A4; // type:object size:0xE data:string -lbl_8050E8B4 = .data:0x8050E8B4; // type:object size:0x110 -lbl_8050E9C4 = .data:0x8050E9C4; // type:object size:0xC -lbl_8050E9D0 = .data:0x8050E9D0; // type:object size:0x34 -lbl_8050EA04 = .data:0x8050EA04; // type:object size:0x14 +lbl_8050E8B4 = .data:0x8050E8B4; // type:object size:0xA data:string +__vt__19GameCameraHandler12 = .data:0x8050E8C0; // type:object size:0x14 +__vt__19GameCameraHandler11 = .data:0x8050E8D4; // type:object size:0x14 +__vt__19GameCameraHandler10 = .data:0x8050E8E8; // type:object size:0x14 +__vt__19GameCameraHandler09 = .data:0x8050E8FC; // type:object size:0x14 +__vt__19GameCameraHandler08 = .data:0x8050E910; // type:object size:0x14 +__vt__19GameCameraHandler07 = .data:0x8050E924; // type:object size:0x14 +__vt__19GameCameraHandler06 = .data:0x8050E938; // type:object size:0x14 +__vt__19GameCameraHandler05 = .data:0x8050E94C; // type:object size:0x14 +__vt__19GameCameraHandler04 = .data:0x8050E960; // type:object size:0x14 +__vt__19GameCameraHandler02 = .data:0x8050E974; // type:object size:0x14 +__vt__19GameCameraHandler01 = .data:0x8050E988; // type:object size:0x14 +__vt__19GameCameraHandler03 = .data:0x8050E99C; // type:object size:0x14 +__vt__17GameCameraHandler = .data:0x8050E9B0; // type:object size:0x14 +__vt__17dCameraGame_HIO_c = .data:0x8050E9C4; // type:object size:0xC +__vt__13dCameraGame_c = .data:0x8050E9D0; // type:object size:0x34 +__vt__19GameCameraHandler00 = .data:0x8050EA04; // type:object size:0x14 lbl_8050EA18 = .data:0x8050EA18; // type:object size:0x13 data:string lbl_8050EA2C = .data:0x8050EA2C; // type:object size:0x60 lbl_8050EA8C = .data:0x8050EA8C; // type:object size:0x54 @@ -51243,34 +51256,50 @@ sRumblePreset10__9dRumble_c = .bss:0x805A07F0; // type:object size:0xC data:4byt @LOCAL@getCurrentStageDirectory__22CurrentStageArcManagerFv@sStageDirTmp = .bss:0x805A0868; // type:object size:0x40 scope:local data:byte s_roomArcTmp = .bss:0x805A08A8; // type:object size:0x20 scope:local data:byte sHio = .bss:0x805A08C8; // type:object size:0x138 scope:local data:2byte -lbl_805A0A00 = .bss:0x805A0A00; // type:object size:0x28 data:byte -lbl_805A0A28 = .bss:0x805A0A28; // type:object size:0x28 data:byte -lbl_805A0A50 = .bss:0x805A0A50; // type:object size:0x28 data:byte -lbl_805A0A78 = .bss:0x805A0A78; // type:object size:0x28 data:byte -lbl_805A0AA0 = .bss:0x805A0AA0; // type:object size:0x28 data:byte -lbl_805A0AC8 = .bss:0x805A0AC8; // type:object size:0x28 data:byte -lbl_805A0AF0 = .bss:0x805A0AF0; // type:object size:0x28 data:byte -lbl_805A0B18 = .bss:0x805A0B18; // type:object size:0x28 data:byte -lbl_805A0B40 = .bss:0x805A0B40; // type:object size:0x28 data:byte -lbl_805A0B68 = .bss:0x805A0B68; // type:object size:0x28 data:byte -lbl_805A0B90 = .bss:0x805A0B90; // type:object size:0x28 data:byte -lbl_805A0BB8 = .bss:0x805A0BB8; // type:object size:0x28 data:byte -lbl_805A0BE0 = .bss:0x805A0BE0; // type:object size:0x28 data:byte -sTrendIdxes__13dCameraGame_c = .bss:0x805A0C08; // type:object size:0x90 data:4byte -lbl_805A0C98 = .bss:0x805A0C98; // type:object size:0x208 data:4byte -lbl_805A0EA0 = .bss:0x805A0EA0; // type:object size:0x28 data:byte -lbl_805A0EC8 = .bss:0x805A0EC8; // type:object size:0xD0 data:byte -lbl_805A0F98 = .bss:0x805A0F98; // type:object size:0x120 data:byte -lbl_805A10B8 = .bss:0x805A10B8; // type:object size:0xA8 data:byte -lbl_805A1160 = .bss:0x805A1160; // type:object size:0x84 data:byte -lbl_805A11E4 = .bss:0x805A11E4; // type:object size:0x9C data:byte -lbl_805A1280 = .bss:0x805A1280; // type:object size:0xC8 data:byte -lbl_805A1348 = .bss:0x805A1348; // type:object size:0x78 data:byte -lbl_805A13C0 = .bss:0x805A13C0; // type:object size:0xA0 data:byte -lbl_805A1460 = .bss:0x805A1460; // type:object size:0xA0 data:byte -lbl_805A1500 = .bss:0x805A1500; // type:object size:0x38 data:byte -lbl_805A1538 = .bss:0x805A1538; // type:object size:0xD8 data:byte -lbl_805A1610 = .bss:0x805A1610; // type:object size:0x50 data:byte +style00 = .bss:0x805A0A00; // type:object size:0x28 data:byte +style01 = .bss:0x805A0A28; // type:object size:0x28 data:byte +style02 = .bss:0x805A0A50; // type:object size:0x28 data:byte +style03 = .bss:0x805A0A78; // type:object size:0x28 data:byte +style04 = .bss:0x805A0AA0; // type:object size:0x28 data:byte +style05 = .bss:0x805A0AC8; // type:object size:0x28 data:byte +style06 = .bss:0x805A0AF0; // type:object size:0x28 data:byte +style07 = .bss:0x805A0B18; // type:object size:0x28 data:byte +style08 = .bss:0x805A0B40; // type:object size:0x28 data:byte +style09 = .bss:0x805A0B68; // type:object size:0x28 data:byte +style10 = .bss:0x805A0B90; // type:object size:0x28 data:byte +style11 = .bss:0x805A0BB8; // type:object size:0x28 data:byte +style12 = .bss:0x805A0BE0; // type:object size:0x28 data:byte +sTrendIdxes__13dCameraGame_c = .bss:0x805A0C08; // type:object size:0x84 data:4byte +lbl_805A0C8C = .bss:0x805A0C8C; // type:object size:0xC data:4byte +sRef = .bss:0x805A0C98; // type:object size:0xC scope:local data:4byte +sVecs1 = .bss:0x805A0CA8; // type:object size:0x20 scope:local data:4byte +sVecs2 = .bss:0x805A0CC8; // type:object size:0x20 scope:local data:4byte +sVecs3 = .bss:0x805A0CE8; // type:object size:0x20 scope:local data:4byte +sVecs4 = .bss:0x805A0D08; // type:object size:0x20 scope:local data:4byte +lbl_805A0D28 = .bss:0x805A0D28; // type:object size:0xC data:4byte +camHandlerUnused00 = .bss:0x805A0D38; // type:object size:0xB8 data:4byte +lbl_805A0DF0 = .bss:0x805A0DF0; // type:object size:0xC data:byte +camHandlerUnused01 = .bss:0x805A0E00; // type:object size:0xA0 data:byte +camHandler00 = .bss:0x805A0EA0; // type:object size:0x28 data:byte +camHandler01 = .bss:0x805A0EC8; // type:object size:0xC0 data:byte +lbl_805A0F88 = .bss:0x805A0F88; // type:object size:0xC data:byte +camHandler02 = .bss:0x805A0F98; // type:object size:0x110 data:byte +lbl_805A10A8 = .bss:0x805A10A8; // type:object size:0xC data:byte +camHandler03 = .bss:0x805A10B8; // type:object size:0xA8 data:byte +camHandler04 = .bss:0x805A1160; // type:object size:0x78 data:byte +lbl_805A11D8 = .bss:0x805A11D8; // type:object size:0xC data:byte +camHandler05 = .bss:0x805A11E4; // type:object size:0x8C data:byte +lbl_805A1270 = .bss:0x805A1270; // type:object size:0xC data:byte +camHandler06 = .bss:0x805A1280; // type:object size:0xB8 data:byte +lbl_805A1338 = .bss:0x805A1338; // type:object size:0xC data:byte +camHandler07 = .bss:0x805A1348; // type:object size:0x68 data:byte +lbl_805A13B0 = .bss:0x805A13B0; // type:object size:0xC data:byte +camHandler08 = .bss:0x805A13C0; // type:object size:0xA0 data:byte +camHandler09 = .bss:0x805A1460; // type:object size:0xA0 data:byte +camHandler10 = .bss:0x805A1500; // type:object size:0x28 data:byte +lbl_805A1528 = .bss:0x805A1528; // type:object size:0xC data:byte +camHandler11 = .bss:0x805A1538; // type:object size:0xD8 data:byte +camHandler12 = .bss:0x805A1610; // type:object size:0x50 data:byte lbl_805A1660 = .bss:0x805A1660; // type:object size:0x20 lbl_805A1680 = .bss:0x805A1680; // type:object size:0xF68 lbl_805A25E8 = .bss:0x805A25E8; // type:object size:0x50 diff --git a/configure.py b/configure.py index b686b70b..73b8c9be 100644 --- a/configure.py +++ b/configure.py @@ -484,7 +484,7 @@ config.libs = [ Object(Matching, "toBeSorted/actor_info.cpp"), Object(NonMatching, "toBeSorted/d_sword_swing_effect_mgr.cpp"), Object(NonMatching, "toBeSorted/d_enemy_sword_mdl.cpp"), - Object(NonMatching, "toBeSorted/d_camera_base.cpp"), + Object(Matching, "toBeSorted/d_camera_base.cpp"), Object(NonMatching, "toBeSorted/d_camera_game.cpp"), Object(NonMatching, "toBeSorted/d_camera_event.cpp"), Object(Matching, "toBeSorted/d_camera_map.cpp"), diff --git a/include/d/col/bg/d_bg_s_sph_chk.h b/include/d/col/bg/d_bg_s_sph_chk.h index b7c3a592..969918e3 100644 --- a/include/d/col/bg/d_bg_s_sph_chk.h +++ b/include/d/col/bg/d_bg_s_sph_chk.h @@ -8,7 +8,7 @@ struct cBgD_Vtx_t; class dBgS_SphChk; -typedef void *(*SphChk_Callback)(dBgS_SphChk *, cBgD_Vtx_t *, int, int, int, cM3dGPla *, void *); +typedef void (*SphChk_Callback)(dBgS_SphChk *, cBgD_Vtx_t *, int, int, int, cM3dGPla *, void *); class dBgS_SphChk : public cM3dGSph, public cBgS_PolyInfo, public cBgS_Chk, public dBgS_Chk { public: diff --git a/include/d/col/cc/d_cc_s.h b/include/d/col/cc/d_cc_s.h index 54f53be1..65b6d518 100644 --- a/include/d/col/cc/d_cc_s.h +++ b/include/d/col/cc/d_cc_s.h @@ -64,9 +64,9 @@ public: static u32 ProcAtTgHitmark(cCcD_Obj *, cCcD_Obj *, mVec3_c *, u32, mVec3_c *); static void SetAtTgObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *, mVec3_c *, bool); - bool ChkCamera(mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32); + bool ChkCamera(mVec3_c &, mVec3_c &, f32, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *); bool - ChkCameraPoint(const mVec3_c &, const mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32); + ChkCameraPoint(const mVec3_c &, const mVec3_c &, mVec3_c &, f32, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *); bool ChkCo(const mVec3_c &, dAcObjBase_c *); bool fn_80357c90(const mVec3_c &, const mVec3_c &, u32, cCcD_ShapeAttr **, f32); diff --git a/include/toBeSorted/d_camera_base.h b/include/toBeSorted/d_camera_base.h index 53438ea4..1cff0e82 100644 --- a/include/toBeSorted/d_camera_base.h +++ b/include/toBeSorted/d_camera_base.h @@ -37,18 +37,10 @@ public: // vt at 0x28 /* vt 0x08 */ virtual void onBecomeActive() {} /* vt 0x0C */ virtual void onBecomeInactive() {} - /* vt 0x10 */ virtual bool create() { - return true; - } - /* vt 0x14 */ virtual bool remove() { - return true; - } - /* vt 0x18 */ virtual bool execute() { - return true; - } - /* vt 0x1C */ virtual bool draw() { - return true; - } + /* vt 0x10 */ virtual bool create(); + /* vt 0x14 */ virtual bool remove(); + /* vt 0x18 */ virtual bool execute(); + /* vt 0x1C */ virtual bool draw(); /* vt 0x20 */ virtual ~dCameraBase_c() {} /* vt 0x24 */ virtual CamView &getView() { // TODO - const? diff --git a/include/toBeSorted/d_camera_game.h b/include/toBeSorted/d_camera_game.h index 00f7832c..422451d7 100644 --- a/include/toBeSorted/d_camera_game.h +++ b/include/toBeSorted/d_camera_game.h @@ -10,6 +10,8 @@ #include "toBeSorted/d_camera_base.h" #include "toBeSorted/deg_angle_util.h" +class dCamera_c; + // Size: 0xC struct CamParamHeader { /* 0x00 */ u32 magic; @@ -22,8 +24,10 @@ struct CamParamHeader { // Size: 0xA #pragma pack(push, 2) struct CamParamStyle { - /* 0x00 */ u32 id; - /* 0x04 */ u8 _0x04[6]; + /* 0x00 */ u8 id[4]; + /* 0x04 */ u8 _0x04[2]; + /* 0x06 */ u16 floatParamOffset; + /* 0x08 */ u16 flagParamOffset; }; #pragma pack(pop) @@ -91,7 +95,7 @@ struct CamId { field_0x04 = 0; } - bool someCheck() const { + bool isValid() const { if (field_0x04 < 3 && roomId != dAcPy_c::GetLinkM()->mRoomID) { return false; } else { @@ -129,6 +133,44 @@ struct UnkCamChecks { void fn_8007E1B0(dAcObjBase_c *ac); }; +class CamStyle { +public: + void loadStyle(u16 styleIdx); + f32 getFloat(s32 idx) const; + bool getFlag(s32 idx) const; + + // TODO: Probably wrong + CamStyle(const UNKWORD &u1, const UNKWORD &u2, f32 *pFloats, s32 numFloats, u16 *pFlags, s32 numFlags) + : field_0x08(u1), + mpFloats(pFloats), + mpParamFloats(pFloats), + mNumFloats(numFloats), + mpFlags(pFlags), + mpParamFlags(pFlags), + mNumFlags(numFlags), + field_0x18(u1) { + mId[0] = '?'; + // TODO maybe implicitly generated + mId[4] = '\0'; + mId[3] = '\0'; + mId[2] = '\0'; + mId[1] = '\0'; + mStyleIndex = -1; + } + +private: + /* 0x00 */ u8 mId[5]; + /* 0x06 */ u16 mStyleIndex; + /* 0x08 */ UNKWORD field_0x08; + /* 0x0C */ f32 *mpFloats; + /* 0x10 */ const f32 *mpParamFloats; + /* 0x14 */ s32 mNumFloats; + /* 0x18 */ UNKWORD field_0x18; + /* 0x1C */ u16 *mpFlags; + /* 0x20 */ const u16 *mpParamFlags; + /* 0x24 */ s32 mNumFlags; +}; + class dCameraGame_c : public dCameraBase_c { public: static bool initCamParamDat(); @@ -138,6 +180,18 @@ public: static s32 sTrendIdxes[CAM_TREND_IDX_MAX]; static s32 sStyleIdxes[CAM_STYLE_IDX_MAX]; + static const CamParamStyle *getStyle(s32 idx) { + return &sStyles[idx]; + } + + static const f32 *getFloats(s32 idx) { + return &sFloats[idx]; + } + + static const u16 *getFlags(s32 idx) { + return &sFlags[idx]; + } + dCameraGame_c(); /* vt 0x08 */ virtual void onBecomeActive() override; /* vt 0x0C */ virtual void onBecomeInactive() override; @@ -155,16 +209,14 @@ public: bool getField_0x078() const { return field_0x078; } - + f32 getField_0x0AC() const { return field_0x0AC; } void clearCamIds(); - - bool isCurrentTrend(const char *name) const; - void fn_80080960(s32, s32, s8, s32); + bool isCurrentTrend(const char *name) const; void onFlag(u32 flag) { mFlags |= flag; @@ -174,7 +226,13 @@ public: mFlags &= ~flag; } + void overrideCam(s32 camId, s32 priority, s16 roomId, bool unk); + private: + CamId getCamId(); + void setCam(const CamId &id); + void setCam(s16 roomCamId, s16 roomId); + static void cacheIdxes(); static CamParamHeader *sHeader; diff --git a/src/REL/d/t/d_t_gate_to_ground.cpp b/src/REL/d/t/d_t_gate_to_ground.cpp index affb3d5e..281109b3 100644 --- a/src/REL/d/t/d_t_gate_to_ground.cpp +++ b/src/REL/d/t/d_t_gate_to_ground.cpp @@ -56,7 +56,8 @@ int dTgGateToGround_c::actorExecute() { } } else { if (params_00_00_00_FF != -1) { - dScGame_c::getCamera(0)->getGameCam1()->fn_80080960(params_00_00_00_FF, 0, mRoomID, 0); + // TODO Cast is maybe fake but I can't get overrideCam to match otherwise + dScGame_c::getCamera(0)->getGameCam1()->overrideCam(params_00_00_00_FF, 0, (u16)mRoomID, false); } delayFrames = 0; } diff --git a/src/d/col/bg/d_bg_s_acch.cpp b/src/d/col/bg/d_bg_s_acch.cpp index 39bc610a..63242f60 100644 --- a/src/d/col/bg/d_bg_s_acch.cpp +++ b/src/d/col/bg/d_bg_s_acch.cpp @@ -401,7 +401,7 @@ void dBgS_Acch::LineCheck(dBgS &bgs) { } while (i < GetTblSize()); } -extern "C" void *fn_80359C80(dBgS_SphChk *, cBgD_Vtx_t *, int, int, int, cM3dGPla *, void *); +extern "C" void fn_80359C80(dBgS_SphChk *, cBgD_Vtx_t *, int, int, int, cM3dGPla *, void *); void dBgS_Acch::SphCheck() { f32 height = field_0x1D0; diff --git a/src/d/col/cc/d_cc_s.cpp b/src/d/col/cc/d_cc_s.cpp index 01e67d6a..e5789bcd 100644 --- a/src/d/col/cc/d_cc_s.cpp +++ b/src/d/col/cc/d_cc_s.cpp @@ -98,11 +98,10 @@ u32 dCcS::ProcAtTgHitmark(cCcD_Obj *, cCcD_Obj *, mVec3_c *, u32, mVec3_c *) {} void dCcS::SetAtTgObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *, mVec3_c *, bool) {} -bool dCcS::ChkCamera(mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32) {} +bool dCcS::ChkCamera(mVec3_c &, mVec3_c &, f32, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *) {} -bool dCcS::ChkCameraPoint( - const mVec3_c &, const mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32 -) {} +bool dCcS:: + ChkCameraPoint(const mVec3_c &, const mVec3_c &, mVec3_c &, f32, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *) {} bool dCcS::ChkCo(const mVec3_c &, dAcObjBase_c *) {} diff --git a/src/toBeSorted/d_camera_base.cpp b/src/toBeSorted/d_camera_base.cpp index 7949c539..986ba226 100644 --- a/src/toBeSorted/d_camera_base.cpp +++ b/src/toBeSorted/d_camera_base.cpp @@ -2,12 +2,21 @@ #include "common.h" -// TODO: Weak function order (CamView dtor needs to appear after a bunch of weak functions) -// TODO: I'm not sure why all those weak functions even got emitted here, there's nothing -// that forces the compiler to put anything here so using this as a hack. I really believe the -// text split is correct, and this file doesn't appear to have any other sections. -void CreatedCameraBase_cHack() { - dCameraBase_c *c = new dCameraBase_c(); +// All of these base functions and the vtable got stripped +bool dCameraBase_c::create() { + return true; +} + +bool dCameraBase_c::remove() { + return true; +} + +bool dCameraBase_c::execute() { + return true; +} + +bool dCameraBase_c::draw() { + return true; } bool dCameraBase_c::doCreate(s32 index) { 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 field_0x28; + /* 0x34 */ dAcRef_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 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 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 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 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 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 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 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(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(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; } diff --git a/src/toBeSorted/d_camera_map.cpp b/src/toBeSorted/d_camera_map.cpp index 7adec892..9e29822e 100644 --- a/src/toBeSorted/d_camera_map.cpp +++ b/src/toBeSorted/d_camera_map.cpp @@ -74,7 +74,7 @@ mVec3_c fn_800929C0(const mVec3_c &p2, const mVec3_c &p3, dAcObjBase_c *obj) { for (int i = 0; i < 3; i++) { ret = v1; - if (!dCcS::GetInstance()->ChkCameraPoint(p2, v2, v1, link, other, controllingActor, 15.0f)) { + if (!dCcS::GetInstance()->ChkCameraPoint(p2, v2, v1, 15.0f, link, other, controllingActor)) { break; } if (p2 == v1) { From 43ec1eaa357ff943efc3faad31dad3f0fa80ea0d Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 1 Mar 2026 21:05:31 +0100 Subject: [PATCH 8/8] Rebase fixes --- include/d/d_camera.h | 2 +- src/REL/d/a/b/d_a_b_lastboss.cpp | 12 ++++++------ src/REL/d/a/obj/d_a_obj_soil.cpp | 2 +- src/d/tg/d_t_mass_object.cpp | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/d/d_camera.h b/include/d/d_camera.h index 50a86f1d..06f1308d 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -127,7 +127,7 @@ public: bool isUnderwater() const; f32 getUnderwaterDepth() const; - void fn_8019EA70(bool); + bool fn_8019EA70(bool); bool setEventCamView(const mVec3_c &, const mVec3_c &, f32, f32); mAng getYAngle() const; mAng getXZAngle() const; 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 fd5656b9..d6a115c3 100644 --- a/src/REL/d/a/b/d_a_b_lastboss.cpp +++ b/src/REL/d/a/b/d_a_b_lastboss.cpp @@ -3095,12 +3095,12 @@ void dAcBlastboss_c::executeLightningStrike() { field_0x2CFC = 60.0f; mLightingStrikeState = LIGHTNING_STRIKE_DEMO; // huh - field_0x2D10.x = cam->getField_0x78().x; - field_0x2D10.y = cam->getField_0x78().y; - field_0x2D10.z = cam->getField_0x78().z; - field_0x2D04.x = cam->getPositionMaybe().x; - field_0x2D04.y = cam->getPositionMaybe().y; - field_0x2D04.z = cam->getPositionMaybe().z; + field_0x2D10.x = cam->getTarget().x; + field_0x2D10.y = cam->getTarget().y; + field_0x2D10.z = cam->getTarget().z; + field_0x2D04.x = cam->getPosition().x; + field_0x2D04.y = cam->getPosition().y; + field_0x2D04.z = cam->getPosition().z; mIsPhaseTwo = -1; // fall-through } else { diff --git a/src/REL/d/a/obj/d_a_obj_soil.cpp b/src/REL/d/a/obj/d_a_obj_soil.cpp index a6e582be..15b1dc78 100644 --- a/src/REL/d/a/obj/d_a_obj_soil.cpp +++ b/src/REL/d/a/obj/d_a_obj_soil.cpp @@ -570,7 +570,7 @@ void dAcOsoil_c::handleModelsOpacities() { if (dAcPy_c::LINK->mPosition.squareDistance(mPosition) < 1000000.f) { dCamera_c* camera = dScGame_c::getCamera(); if (camera != nullptr) { - f32 dist = (camera->getPositionMaybe() - mPosition).y * (1.f / 80.f); + f32 dist = (camera->getPosition() - mPosition).y * (1.f / 80.f); if (dist < 0.1f) { dist = 0.f; } else if (dist > 1) { diff --git a/src/d/tg/d_t_mass_object.cpp b/src/d/tg/d_t_mass_object.cpp index 15cc73b2..6c58db5b 100644 --- a/src/d/tg/d_t_mass_object.cpp +++ b/src/d/tg/d_t_mass_object.cpp @@ -1056,12 +1056,12 @@ bool dTgMassObjInstance::checkForHit( param_5->mCutCounter++; mVec3_c local16C(mGroundHeight.x, mGroundHeight.y, mGroundHeight.z); mColor local17C = 0xFFFFFFFF; - f32 camField2A8 = dScGame_c::getCamera()->getField_0x2A8(); + f32 waterHeight = dScGame_c::getCamera()->getWaterHeight(); local17C.r = mTevColor.r; local17C.g = mTevColor.g; local17C.b = mTevColor.b; local17C.a = mTevColor.a; - if (local16C.y + 100.f < camField2A8 && mMassObjSubtype <= 5) { + if (local16C.y + 100.f < waterHeight && mMassObjSubtype <= 5) { if (dScGame_c::isCurrentStage("D100")) { mMassObjSubtype = 6; } else { @@ -1424,7 +1424,7 @@ extern void LoadMaterial( ); void GrassModelData::draw(f32 param_1, f32 param_2, nw4r::math::MTX34 *pMtx) { - mVec3_c cameraPosition = dScGame_c::getCamera()->getPositionMaybe(); + mVec3_c cameraPosition = dScGame_c::getCamera()->getPosition(); bool isInFaronWoods = dScGame_c::isCurrentStage("F100"); nw4r::g3d::ResMatMisc miscData(mResMat.GetResMatMisc()); miscData.SetLightSetIdx(1);