diff --git a/MarathonRecomp/CMakeLists.txt b/MarathonRecomp/CMakeLists.txt index 27828f767..23fe0325a 100644 --- a/MarathonRecomp/CMakeLists.txt +++ b/MarathonRecomp/CMakeLists.txt @@ -136,7 +136,8 @@ set(MARATHON_RECOMP_HID_CXX_SOURCES set(MARATHON_RECOMP_PATCHES_CXX_SOURCES "patches/aspect_ratio_patches.cpp" - "patches/audio_patches.cpp" + "patches/audio_patches.cpp" + "patches/camera_patches.cpp" "patches/frontend_listener.cpp" "patches/misc_patches.cpp" "patches/TitleTask_patches.cpp" diff --git a/MarathonRecomp/api/CSD/Manager/csdmResourceBase.h b/MarathonRecomp/api/CSD/Manager/csdmResourceBase.h index 094ed06f3..ae6c5740b 100644 --- a/MarathonRecomp/api/CSD/Manager/csdmResourceBase.h +++ b/MarathonRecomp/api/CSD/Manager/csdmResourceBase.h @@ -15,7 +15,7 @@ namespace Chao::CSD }; xpointer m_pVftable; - RCPtr m_rcResourceHolder; + MARATHON_INSERT_PADDING(4); xpointer m_pResource; ~CResourceBase(); diff --git a/MarathonRecomp/api/Marathon.h b/MarathonRecomp/api/Marathon.h index b7ee1c2a8..b7f1aab4f 100644 --- a/MarathonRecomp/api/Marathon.h +++ b/MarathonRecomp/api/Marathon.h @@ -15,7 +15,11 @@ #include "CSD/Manager/csdmSceneObserver.h" #include "CSD/Manager/csdmSubjectBase.h" #include "CSD/Platform/csdTexList.h" +#include "Sonicteam/Actor.h" #include "Sonicteam/AppMarathon.h" +#include "Sonicteam/Camera/CameraMode.h" +#include "Sonicteam/Camera/Cameraman.h" +#include "Sonicteam/Camera/SonicCamera.h" #include "Sonicteam/DocMarathonImp.h" #include "Sonicteam/DocMarathonState.h" #include "Sonicteam/SoX/Component.h" diff --git a/MarathonRecomp/api/Sonicteam/Actor.h b/MarathonRecomp/api/Sonicteam/Actor.h new file mode 100644 index 000000000..4739d1b5d --- /dev/null +++ b/MarathonRecomp/api/Sonicteam/Actor.h @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +namespace Sonicteam +{ + class Actor : public SoX::Engine::Task {}; +} diff --git a/MarathonRecomp/api/Sonicteam/Camera/CameraMode.h b/MarathonRecomp/api/Sonicteam/Camera/CameraMode.h new file mode 100644 index 000000000..a2490fa75 --- /dev/null +++ b/MarathonRecomp/api/Sonicteam/Camera/CameraMode.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +namespace Sonicteam::Camera +{ + class CameraMode : public SoX::MessageReceiver + { + public: + MARATHON_INSERT_PADDING(0x24); + }; +} diff --git a/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h b/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h new file mode 100644 index 000000000..dc44a527e --- /dev/null +++ b/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace Sonicteam::Camera +{ + class Cameraman : Actor + { + public: + MARATHON_INSERT_PADDING(0x28); + boost::anonymous_shared_ptr m_spMyInputObj; + MARATHON_INSERT_PADDING(0x34); + be m_FOV; + MARATHON_INSERT_PADDING(0x04); + boost::anonymous_shared_ptr m_spKynapseControl; + }; +} diff --git a/MarathonRecomp/api/Sonicteam/Camera/SonicCamera.h b/MarathonRecomp/api/Sonicteam/Camera/SonicCamera.h new file mode 100644 index 000000000..ba4f99464 --- /dev/null +++ b/MarathonRecomp/api/Sonicteam/Camera/SonicCamera.h @@ -0,0 +1,19 @@ +#pragma once + +namespace Sonicteam::Camera +{ + class SonicCamera : public CameraMode + { + public: + MARATHON_INSERT_PADDING(0x1C); + be m_SpringK; + be m_DampingK; + MARATHON_INSERT_PADDING(0x08); + be m_AzDriveK; + be m_AzDampingK; + be m_AltDriveK; + be m_AltDampingK; + MARATHON_INSERT_PADDING(0x3C); + be m_FovY; + }; +} diff --git a/MarathonRecomp/api/Sonicteam/SoX/Component.h b/MarathonRecomp/api/Sonicteam/SoX/Component.h index e74a4fe2b..5730e5a11 100644 --- a/MarathonRecomp/api/Sonicteam/SoX/Component.h +++ b/MarathonRecomp/api/Sonicteam/SoX/Component.h @@ -8,6 +8,6 @@ namespace Sonicteam::SoX class Component : public Object { public: - MARATHON_INSERT_PADDING(0x20); + MARATHON_INSERT_PADDING(0x1C); }; } diff --git a/MarathonRecomp/api/Sonicteam/SoX/Engine/Doc.h b/MarathonRecomp/api/Sonicteam/SoX/Engine/Doc.h index 059b02218..068a62c73 100644 --- a/MarathonRecomp/api/Sonicteam/SoX/Engine/Doc.h +++ b/MarathonRecomp/api/Sonicteam/SoX/Engine/Doc.h @@ -7,6 +7,7 @@ namespace Sonicteam::SoX::Engine class Doc { public: - MARATHON_INSERT_PADDING(0x5C); + xpointer m_pVftable; + MARATHON_INSERT_PADDING(0x58); }; } diff --git a/MarathonRecomp/api/Sonicteam/SoX/Engine/Task.h b/MarathonRecomp/api/Sonicteam/SoX/Engine/Task.h index f44470302..861c78bf8 100644 --- a/MarathonRecomp/api/Sonicteam/SoX/Engine/Task.h +++ b/MarathonRecomp/api/Sonicteam/SoX/Engine/Task.h @@ -9,6 +9,6 @@ namespace Sonicteam::SoX::Engine class Task : public Component, public MessageReceiver { public: - MARATHON_INSERT_PADDING(0x4C); + MARATHON_INSERT_PADDING(0x28); }; } diff --git a/MarathonRecomp/api/Sonicteam/SoX/MessageReceiver.h b/MarathonRecomp/api/Sonicteam/SoX/MessageReceiver.h index 95c110a2e..284906c71 100644 --- a/MarathonRecomp/api/Sonicteam/SoX/MessageReceiver.h +++ b/MarathonRecomp/api/Sonicteam/SoX/MessageReceiver.h @@ -2,5 +2,9 @@ namespace Sonicteam::SoX { - class MessageReceiver {}; + class MessageReceiver + { + public: + xpointer m_pVftable; + }; } diff --git a/MarathonRecomp/api/Sonicteam/SoX/Object.h b/MarathonRecomp/api/Sonicteam/SoX/Object.h index 6effcf63b..a67641a00 100644 --- a/MarathonRecomp/api/Sonicteam/SoX/Object.h +++ b/MarathonRecomp/api/Sonicteam/SoX/Object.h @@ -2,5 +2,9 @@ namespace Sonicteam::SoX { - class Object {}; + class Object + { + public: + xpointer m_pVftable; + }; } diff --git a/MarathonRecomp/api/Sonicteam/TitleTask.h b/MarathonRecomp/api/Sonicteam/TitleTask.h index 6d626db80..5baccb43f 100644 --- a/MarathonRecomp/api/Sonicteam/TitleTask.h +++ b/MarathonRecomp/api/Sonicteam/TitleTask.h @@ -5,10 +5,10 @@ namespace Sonicteam { - class TitleTask : public Sonicteam::SoX::Engine::Task + class TitleTask : public SoX::Engine::Task { public: - MARATHON_INSERT_PADDING(0x10); + MARATHON_INSERT_PADDING(0x30); be m_SelectedIndex; }; } diff --git a/MarathonRecomp/api/boost/smart_ptr/shared_ptr.h b/MarathonRecomp/api/boost/smart_ptr/shared_ptr.h index 4ff5625b1..5b31c4518 100644 --- a/MarathonRecomp/api/boost/smart_ptr/shared_ptr.h +++ b/MarathonRecomp/api/boost/smart_ptr/shared_ptr.h @@ -2,6 +2,7 @@ #include #include +#include namespace boost { diff --git a/MarathonRecomp/app.cpp b/MarathonRecomp/app.cpp index fa2bd48cc..091934010 100644 --- a/MarathonRecomp/app.cpp +++ b/MarathonRecomp/app.cpp @@ -112,7 +112,7 @@ PPC_FUNC(sub_82582648) } #if _DEBUG -// Sonicteam::SoX::Thread +// Sonicteam::SoX::Thread::Thread PPC_FUNC_IMPL(__imp__sub_825867A8); PPC_FUNC(sub_825867A8) { diff --git a/MarathonRecomp/patches/camera_patches.cpp b/MarathonRecomp/patches/camera_patches.cpp new file mode 100644 index 000000000..23520fd9e --- /dev/null +++ b/MarathonRecomp/patches/camera_patches.cpp @@ -0,0 +1,18 @@ +#include +#include + +// Load Sonicteam::Camera::SonicCamera parameters +PPC_FUNC_IMPL(__imp__sub_82192218); +PPC_FUNC(sub_82192218) +{ + auto pSonicCamera = (Sonicteam::Camera::SonicCamera*)g_memory.Translate(ctx.r3.u32); + + __imp__sub_82192218(ctx, base); + + // X axis is inverted by default. + if (Config::HorizontalCamera == ECameraRotationMode::Normal) + pSonicCamera->m_AzDriveK = -pSonicCamera->m_AzDriveK; + + if (Config::VerticalCamera == ECameraRotationMode::Reverse) + pSonicCamera->m_AltDriveK = -pSonicCamera->m_AltDriveK; +} diff --git a/MarathonRecomp/user/config_def.h b/MarathonRecomp/user/config_def.h index 6f0f7108c..574fe9196 100644 --- a/MarathonRecomp/user/config_def.h +++ b/MarathonRecomp/user/config_def.h @@ -10,7 +10,7 @@ CONFIG_DEFINE_LOCALISED("System", bool, AchievementNotifications, true); CONFIG_DEFINE_ENUM_LOCALISED("System", ETimeOfDayTransition, TimeOfDayTransition, ETimeOfDayTransition::Xbox); CONFIG_DEFINE("System", bool, ShowConsole, false); -CONFIG_DEFINE_ENUM_LOCALISED("Input", ECameraRotationMode, HorizontalCamera, ECameraRotationMode::Normal); +CONFIG_DEFINE_ENUM_LOCALISED("Input", ECameraRotationMode, HorizontalCamera, ECameraRotationMode::Reverse); CONFIG_DEFINE_ENUM_LOCALISED("Input", ECameraRotationMode, VerticalCamera, ECameraRotationMode::Normal); CONFIG_DEFINE_LOCALISED("Input", bool, Vibration, true); CONFIG_DEFINE_LOCALISED("Input", bool, AllowBackgroundInput, false);