mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2025-04-28 13:27:58 +03:00
Switched to CFreeCamera instead of CReplayFreeCamera
This commit is contained in:
parent
0aa1a256dd
commit
5f32e2495f
29 changed files with 484 additions and 195 deletions
|
@ -21,3 +21,5 @@ namespace Hedgehog::Base
|
|||
void operator delete(void* in_pMem, void* in_pObj);
|
||||
};
|
||||
}
|
||||
|
||||
#include "hhObject.inl"
|
||||
|
|
39
UnleashedRecomp/api/Hedgehog/Base/hhObject.inl
Normal file
39
UnleashedRecomp/api/Hedgehog/Base/hhObject.inl
Normal file
|
@ -0,0 +1,39 @@
|
|||
namespace Hedgehog::Base
|
||||
{
|
||||
inline CObject::CObject()
|
||||
{
|
||||
}
|
||||
|
||||
inline CObject::CObject(const swa_null_ctor&)
|
||||
{
|
||||
}
|
||||
|
||||
inline void* CObject::operator new(const size_t in_Size)
|
||||
{
|
||||
return __HH_ALLOC(in_Size);
|
||||
}
|
||||
|
||||
// inline void* CObject::operator new(const size_t in_Size, const size_t in_Align)
|
||||
// {
|
||||
// return __HH_ALLOCALIGN(in_Size, in_Align);
|
||||
// }
|
||||
|
||||
inline void CObject::operator delete(void* in_pMem)
|
||||
{
|
||||
return __HH_FREE(in_pMem);
|
||||
}
|
||||
|
||||
inline void* CObject::operator new(const size_t in_Size, void* in_pObj)
|
||||
{
|
||||
return in_pObj;
|
||||
}
|
||||
|
||||
inline void* CObject::operator new(const size_t in_Size, const size_t in_Align, void* in_pObj)
|
||||
{
|
||||
return in_pObj;
|
||||
}
|
||||
|
||||
inline void CObject::operator delete(void* in_pMem, void* in_pObj)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -18,6 +18,16 @@ namespace Hedgehog::Math
|
|||
be<float> Y;
|
||||
be<float> Z;
|
||||
be<float> W;
|
||||
|
||||
CVector operator*(const float& scalar) const
|
||||
{
|
||||
return { X * scalar, Y * scalar, Z * scalar };
|
||||
}
|
||||
|
||||
CVector operator+(const CVector& v) const
|
||||
{
|
||||
return { X + v.X, Y + v.Y, Z + v.Z };
|
||||
}
|
||||
};
|
||||
|
||||
class CVector4
|
||||
|
|
19
UnleashedRecomp/api/Hedgehog/Universe/Engine/hhMessage.h
Normal file
19
UnleashedRecomp/api/Hedgehog/Universe/Engine/hhMessage.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
#include <Hedgehog/Base/hhObject.h>
|
||||
#include <boost/smart_ptr/shared_ptr.h>
|
||||
|
||||
namespace Hedgehog::Universe
|
||||
{
|
||||
class Message : public Base::CObject
|
||||
{
|
||||
public:
|
||||
be<uint32_t> m_pVftable;
|
||||
be<uint32_t> m_SenderActorID;
|
||||
boost::shared_ptr<Message> m_spSelf;
|
||||
};
|
||||
|
||||
class MessageTypeGet : public Message {};
|
||||
class MessageTypeSet : public Message {};
|
||||
}
|
|
@ -49,6 +49,7 @@
|
|||
#include "Hedgehog/MirageCore/RenderData/hhVertexShaderData.h"
|
||||
#include "Hedgehog/MirageCore/Renderable/hhRenderable.h"
|
||||
#include "Hedgehog/Sparkle/hhParticleMaterial.h"
|
||||
#include "Hedgehog/Universe/Engine/hhMessage.h"
|
||||
#include "Hedgehog/Universe/Engine/hhMessageActor.h"
|
||||
#include "Hedgehog/Universe/Engine/hhMessageProcess.h"
|
||||
#include "Hedgehog/Universe/Engine/hhStateMachineBase.h"
|
||||
|
@ -65,7 +66,8 @@
|
|||
#include "SWA/CSD/CsdTexListMirage.h"
|
||||
#include "SWA/CSD/GameObjectCSD.h"
|
||||
#include "SWA/Camera/Camera.h"
|
||||
#include "SWA/Camera/CameraController.h"
|
||||
#include "SWA/Camera/Controller/CameraController.h"
|
||||
#include "SWA/Camera/Controller/FreeCamera.h"
|
||||
#include "SWA/CharacterUtility/CharacterProxy.h"
|
||||
#include "SWA/ExtraStage/Tails/Enemy/Boss/ExStageBoss.h"
|
||||
#include "SWA/ExtraStage/Tails/Enemy/Boss/State/StateBase.h"
|
||||
|
@ -87,13 +89,19 @@
|
|||
#include "SWA/Inspire/InspireTextureOverlay.h"
|
||||
#include "SWA/Inspire/InspireTextureOverlayInfo.h"
|
||||
#include "SWA/Menu/MenuWindowBase.h"
|
||||
#include "SWA/Message/MsgCameraPauseMove.h"
|
||||
#include "SWA/Message/MsgPopCameraController.h"
|
||||
#include "SWA/Message/MsgSetPosition.h"
|
||||
#include "SWA/Message/MsgSetVelocity.h"
|
||||
#include "SWA/Movie/MovieDisplayer.h"
|
||||
#include "SWA/Movie/MovieManager.h"
|
||||
#include "SWA/Object/Common/DashPanel/ObjDashPanel.h"
|
||||
#include "SWA/Object/SonicStage/EU/RollingBarrel/ObjRollingBarrel.h"
|
||||
#include "SWA/Player/Character/Base/PlayerContext.h"
|
||||
#include "SWA/Player/Character/EvilSonic/EvilSonic.h"
|
||||
#include "SWA/Player/Character/EvilSonic/EvilSonicContext.h"
|
||||
#include "SWA/Player/Character/EvilSonic/Hud/EvilHudGuide.h"
|
||||
#include "SWA/Player/Character/Speed/PlayerSpeedContext.h"
|
||||
#include "SWA/Replay/Camera/ReplayFreeCamera.h"
|
||||
#include "SWA/Sequence/Unit/SequenceUnitBase.h"
|
||||
#include "SWA/Sequence/Unit/SequenceUnitPlayMovie.h"
|
||||
|
@ -125,5 +133,6 @@
|
|||
#include "SWA/System/MatrixNodeTransform.h"
|
||||
#include "SWA/System/PadState.h"
|
||||
#include "SWA/System/World.h"
|
||||
#include "SWA/Tool/FreeCameraTool/FreeCameraTool.h"
|
||||
#include "boost/smart_ptr/make_shared_object.h"
|
||||
#include "boost/smart_ptr/shared_ptr.h"
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CCameraController
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x64);
|
||||
be<float> m_FieldOfView;
|
||||
SWA_INSERT_PADDING(0x68);
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CCameraController, m_FieldOfView, 0x64);
|
||||
SWA_ASSERT_SIZEOF(CCameraController, 0xD0);
|
||||
}
|
24
UnleashedRecomp/api/SWA/Camera/Controller/CameraController.h
Normal file
24
UnleashedRecomp/api/SWA/Camera/Controller/CameraController.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CCameraController
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x08);
|
||||
xpointer<CCamera> m_pCamera;
|
||||
SWA_INSERT_PADDING(0x58);
|
||||
be<float> m_FieldOfView;
|
||||
SWA_INSERT_PADDING(0x08);
|
||||
Hedgehog::Math::CVector m_Position;
|
||||
Hedgehog::Math::CVector m_UpVector;
|
||||
Hedgehog::Math::CQuaternion m_Rotation;
|
||||
SWA_INSERT_PADDING(0x30);
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CCameraController, m_pCamera, 0x08);
|
||||
SWA_ASSERT_OFFSETOF(CCameraController, m_FieldOfView, 0x64);
|
||||
SWA_ASSERT_SIZEOF(CCameraController, 0xD0);
|
||||
}
|
16
UnleashedRecomp/api/SWA/Camera/Controller/FreeCamera.h
Normal file
16
UnleashedRecomp/api/SWA/Camera/Controller/FreeCamera.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
#include "SWA/Camera/Controller/CameraController.h"
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CFreeCamera : public CCameraController
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x10);
|
||||
be<float> m_Speed;
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CFreeCamera, m_Speed, 0xE0);
|
||||
}
|
|
@ -9,6 +9,9 @@ namespace SWA
|
|||
// ms_DrawLightFieldSamplingPoint: サンプリング点をデバッグ表示
|
||||
static inline bool* ms_DrawLightFieldSamplingPoint;
|
||||
|
||||
// N/A
|
||||
static inline be<float>* ms_FreeCameraSpeed;
|
||||
|
||||
// N/A
|
||||
static inline bool* ms_IsAutoSaveWarningShown;
|
||||
|
||||
|
@ -60,6 +63,7 @@ namespace SWA
|
|||
static void Init()
|
||||
{
|
||||
ms_DrawLightFieldSamplingPoint = (bool*)MmGetHostAddress(0x83367BCE);
|
||||
ms_FreeCameraSpeed = (be<float>*)MmGetHostAddress(0x83366DF8);
|
||||
ms_IgnoreLightFieldData = (bool*)MmGetHostAddress(0x83367BCF);
|
||||
ms_IsAutoSaveWarningShown = (bool*)MmGetHostAddress(0x83367BC1);
|
||||
ms_IsCollisionRender = (bool*)MmGetHostAddress(0x833678A6);
|
||||
|
|
17
UnleashedRecomp/api/SWA/Message/MsgCameraPauseMove.h
Normal file
17
UnleashedRecomp/api/SWA/Message/MsgCameraPauseMove.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA::Message
|
||||
{
|
||||
class MsgCameraPauseMove : public Hedgehog::Universe::MessageTypeSet
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x08);
|
||||
bool m_isPaused;
|
||||
|
||||
MsgCameraPauseMove(bool in_isPaused) : m_isPaused(in_isPaused) {}
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(MsgCameraPauseMove, m_isPaused, 0x18);
|
||||
}
|
32
UnleashedRecomp/api/SWA/Message/MsgPopCameraController.h
Normal file
32
UnleashedRecomp/api/SWA/Message/MsgPopCameraController.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA::Message
|
||||
{
|
||||
class MsgPopCameraController : public Hedgehog::Universe::MessageTypeSet
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x08);
|
||||
xpointer<CCameraController> m_pCameraController;
|
||||
SWA_INSERT_PADDING(0x08);
|
||||
xpointer<Hedgehog::Base::CSharedString> m_pCameraName;
|
||||
be<float> m_InterpolateTime;
|
||||
bool m_Field2C;
|
||||
bool m_Field2D;
|
||||
bool m_Field2E;
|
||||
|
||||
MsgPopCameraController(CCameraController* in_pCameraController, float in_interpolateTime)
|
||||
: m_pCameraController(in_pCameraController), m_InterpolateTime(in_interpolateTime) {}
|
||||
|
||||
MsgPopCameraController(Hedgehog::Base::CSharedString* in_pCameraName, float in_interpolateTime)
|
||||
: m_pCameraName(in_pCameraName), m_InterpolateTime(in_interpolateTime) {}
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_pCameraController, 0x18);
|
||||
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_pCameraName, 0x24);
|
||||
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_InterpolateTime, 0x28);
|
||||
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_Field2C, 0x2C);
|
||||
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_Field2D, 0x2D);
|
||||
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_Field2E, 0x2E);
|
||||
}
|
18
UnleashedRecomp/api/SWA/Message/MsgSetPosition.h
Normal file
18
UnleashedRecomp/api/SWA/Message/MsgSetPosition.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA::Message
|
||||
{
|
||||
class MsgSetPosition : public Hedgehog::Universe::MessageTypeSet
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x10);
|
||||
Hedgehog::Math::CVector m_Position;
|
||||
|
||||
MsgSetPosition(const Hedgehog::Math::CVector& in_rPosition) : m_Position(in_rPosition) {}
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(MsgSetPosition, m_Position, 0x20);
|
||||
SWA_ASSERT_SIZEOF(MsgSetPosition, 0x30);
|
||||
}
|
18
UnleashedRecomp/api/SWA/Message/MsgSetVelocity.h
Normal file
18
UnleashedRecomp/api/SWA/Message/MsgSetVelocity.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA::Message
|
||||
{
|
||||
class MsgSetVelocity : public Hedgehog::Universe::MessageTypeSet
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x10);
|
||||
Hedgehog::Math::CVector m_Velocity;
|
||||
|
||||
MsgSetVelocity(const Hedgehog::Math::CVector& in_rVelocity) : m_Velocity(in_rVelocity) {}
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(MsgSetVelocity, m_Velocity, 0x20);
|
||||
SWA_ASSERT_SIZEOF(MsgSetVelocity, 0x30);
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
#include "boost/smart_ptr/shared_ptr.h"
|
||||
|
||||
namespace SWA::Player
|
||||
{
|
||||
class CPlayer;
|
||||
|
||||
class CPlayerContext
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x10);
|
||||
boost::shared_ptr<CMatrixNodeTransform> m_spMatrixNode;
|
||||
SWA_INSERT_PADDING(0x18);
|
||||
boost::anonymous_shared_ptr m_spRayCastCollision;
|
||||
SWA_INSERT_PADDING(0xC8);
|
||||
xpointer<CPlayer> m_pPlayer;
|
||||
SWA_INSERT_PADDING(0xF8);
|
||||
boost::shared_ptr<void> m_spParameter;
|
||||
SWA_INSERT_PADDING(0x0C);
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CPlayerContext, m_spMatrixNode, 0x10);
|
||||
SWA_ASSERT_OFFSETOF(CPlayerContext, m_spRayCastCollision, 0x30);
|
||||
SWA_ASSERT_OFFSETOF(CPlayerContext, m_pPlayer, 0x100);
|
||||
SWA_ASSERT_OFFSETOF(CPlayerContext, m_spParameter, 0x1FC);
|
||||
SWA_ASSERT_SIZEOF(CPlayerContext, 0x210);
|
||||
}
|
|
@ -5,19 +5,26 @@
|
|||
|
||||
namespace SWA::Player
|
||||
{
|
||||
class CEvilSonicContext // : public CPlayerContext
|
||||
class CEvilSonicContext : public CPlayerContext
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x688);
|
||||
SWA_INSERT_PADDING(0x478);
|
||||
be<float> m_DarkGaiaEnergy;
|
||||
SWA_INSERT_PADDING(0x138);
|
||||
be<uint32_t> m_AnimationID;
|
||||
SWA_INSERT_PADDING(0x38);
|
||||
be<float> m_UnkHudGuideF32;
|
||||
be<uint32_t> m_UnkHudGuideU32;
|
||||
be<float> m_Field800; // Related to EvilHudGuide
|
||||
be<uint32_t> m_Field804; // Related to EvilHudGuide
|
||||
SWA_INSERT_PADDING(0x18);
|
||||
be<EGuideType> m_GuideType;
|
||||
SWA_INSERT_PADDING(0xA8);
|
||||
be<uint32_t> m_OutOfControlCount;
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_DarkGaiaEnergy, 0x688);
|
||||
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_AnimationID, 0x7C4);
|
||||
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_Field800, 0x800);
|
||||
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_Field804, 0x804);
|
||||
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_GuideType, 0x820);
|
||||
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_OutOfControlCount, 0x8CC);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA::Player
|
||||
{
|
||||
class CPlayerSpeedContext : public CPlayerContext
|
||||
{
|
||||
public:
|
||||
// TODO: Hedgehog::Base::TSynchronizedPtr<CGameDocument>
|
||||
static CPlayerSpeedContext* GetInstance();
|
||||
};
|
||||
}
|
||||
|
||||
#include "PlayerSpeedContext.inl"
|
|
@ -0,0 +1,7 @@
|
|||
namespace SWA::Player
|
||||
{
|
||||
inline CPlayerSpeedContext* CPlayerSpeedContext::GetInstance()
|
||||
{
|
||||
return *(xpointer<CPlayerSpeedContext>*)MmGetHostAddress(0x83362F98);
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
#include "SWA/Camera/CameraController.h"
|
||||
#include "SWA/Camera/Controller/CameraController.h"
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
|
|
|
@ -36,7 +36,9 @@ namespace SWA
|
|||
xpointer<CSoundAdministrator> m_pSoundAdministrator;
|
||||
SWA_INSERT_PADDING(0x48);
|
||||
xpointer<CGeneralWindow> m_pGeneralWindow;
|
||||
SWA_INSERT_PADDING(0xD8);
|
||||
SWA_INSERT_PADDING(0xC0);
|
||||
boost::anonymous_shared_ptr m_spPlayerSwitchManager;
|
||||
SWA_INSERT_PADDING(0x10);
|
||||
SScoreInfo m_ScoreInfo;
|
||||
SWA_INSERT_PADDING(0x0C);
|
||||
};
|
||||
|
@ -63,6 +65,7 @@ namespace SWA
|
|||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_StageName, 0xAC);
|
||||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_pSoundAdministrator, 0xB0);
|
||||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_pGeneralWindow, 0xFC);
|
||||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_spPlayerSwitchManager, 0x1C0);
|
||||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_ScoreInfo, 0x1D8);
|
||||
SWA_ASSERT_SIZEOF(CGameDocument::CMember, 0x230);
|
||||
|
||||
|
|
15
UnleashedRecomp/api/SWA/Tool/FreeCameraTool/FreeCameraTool.h
Normal file
15
UnleashedRecomp/api/SWA/Tool/FreeCameraTool/FreeCameraTool.h
Normal file
|
@ -0,0 +1,15 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CFreeCameraTool : public CGameObject
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x04);
|
||||
xpointer<CFreeCamera> m_pFreeCamera;
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CFreeCameraTool, m_pFreeCamera, 0xC0);
|
||||
}
|
|
@ -5,6 +5,7 @@
|
|||
#include <kernel/function.h>
|
||||
#include <os/process.h>
|
||||
#include <patches/audio_patches.h>
|
||||
#include <patches/free_camera_patches.h>
|
||||
#include <patches/inspire_patches.h>
|
||||
#include <ui/game_window.h>
|
||||
#include <user/config.h>
|
||||
|
@ -73,6 +74,7 @@ PPC_FUNC(sub_822C1130)
|
|||
}
|
||||
|
||||
AudioPatches::Update(App::s_deltaTime);
|
||||
FreeCameraPatches::Update();
|
||||
InspirePatches::Update();
|
||||
|
||||
// Apply subtitles option.
|
||||
|
@ -94,3 +96,11 @@ PPC_FUNC(sub_822C1130)
|
|||
__imp__sub_822C1130(ctx, base);
|
||||
}
|
||||
|
||||
// SWA::CGameModeStage::CGameModeStage
|
||||
PPC_FUNC_IMPL(__imp__sub_82541138);
|
||||
PPC_FUNC(sub_82541138)
|
||||
{
|
||||
App::s_pGameModeStage = (SWA::CGameModeStage*)g_memory.Translate(ctx.r3.u32);
|
||||
|
||||
__imp__sub_82541138(ctx, base);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <api/SWA.h>
|
||||
#include <user/config.h>
|
||||
|
||||
class App
|
||||
|
@ -8,9 +9,11 @@ public:
|
|||
static inline bool s_isInit;
|
||||
static inline bool s_isMissingDLC;
|
||||
static inline bool s_isLoading;
|
||||
static inline bool s_isWerehog;
|
||||
static inline bool s_isSaveDataCorrupt;
|
||||
|
||||
static inline SWA::CGameModeStage* s_pGameModeStage;
|
||||
static inline SWA::Player::CEvilSonicContext* s_pEvilSonicContext;
|
||||
|
||||
static inline ELanguage s_language;
|
||||
|
||||
static inline double s_deltaTime;
|
||||
|
|
|
@ -210,7 +210,7 @@ int HID_OnSDLEvent(void*, SDL_Event* event)
|
|||
|
||||
g_controllers[freeIndex] = controller;
|
||||
|
||||
SetControllerTimeOfDayLED(controller, App::s_isWerehog);
|
||||
SetControllerTimeOfDayLED(controller, App::s_pEvilSonicContext);
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
|
@ -8,19 +8,20 @@
|
|||
#define DEGREES_TO_RADIANS(x) (float)(x / 180.0f * M_PI)
|
||||
#define RADIANS_TO_DEGREES(x) (float)(x / M_PI * 180.0f)
|
||||
|
||||
constexpr float DEFAULT_SPEED = 0.5f;
|
||||
constexpr float DEFAULT_FOV = 45.0f;
|
||||
constexpr float DEFAULT_SPEED = 1.0f;
|
||||
constexpr float DEFAULT_FIELD_OF_VIEW = 45.0f;
|
||||
constexpr float MOVE_SPEED_SLOW = 0.075f;
|
||||
constexpr float MOVE_SPEED_FAST = 8.0f;
|
||||
constexpr float MOVE_SPEED_MODIFIER_RATIO = 0.02f;
|
||||
constexpr float FOV_MODIFIER_RATIO = 1.0f;
|
||||
|
||||
static float g_baseSpeed = DEFAULT_SPEED;
|
||||
static float g_baseFOV = DEFAULT_FOV;
|
||||
static float g_baseFieldOfView = DEFAULT_FIELD_OF_VIEW;
|
||||
|
||||
static bool g_isDisablingFreeCamera;
|
||||
static bool g_isCameraLocked;
|
||||
static float g_speed;
|
||||
static float g_fov;
|
||||
static float g_fieldOfView;
|
||||
|
||||
static void ResetParameters()
|
||||
{
|
||||
|
@ -28,90 +29,22 @@ static void ResetParameters()
|
|||
g_speed = g_baseSpeed = DEFAULT_SPEED;
|
||||
|
||||
*SWA::SGlobals::ms_IsRenderDepthOfField = true;
|
||||
FreeCameraPatches::s_fieldOfView = g_fov = g_baseFOV = DEFAULT_FOV;
|
||||
FreeCameraPatches::s_fieldOfView = g_fieldOfView = g_baseFieldOfView = DEFAULT_FIELD_OF_VIEW;
|
||||
}
|
||||
|
||||
bool EnableFreeCameraMidAsmHook()
|
||||
bool FreeCameraActiveMidAsmHook()
|
||||
{
|
||||
return Config::EnableFreeCamera;
|
||||
return Config::EnableFreeCamera && FreeCameraPatches::s_isActive;
|
||||
}
|
||||
|
||||
bool FreeCameraNullInputMidAsmHook()
|
||||
{
|
||||
return Config::EnableFreeCamera;
|
||||
}
|
||||
|
||||
// Original input: D-Pad Up
|
||||
bool FreeCameraActivationInputMidAsmHook(PPCRegister& r11, PPCRegister& r27, PPCRegister& r28)
|
||||
bool FreeCameraSpeedInputMidAsmHook(PPCRegister& r31, PPCRegister& r29, PPCRegister& f0)
|
||||
{
|
||||
if (!Config::EnableFreeCamera)
|
||||
return false;
|
||||
|
||||
static auto isChangedCameraMode = false;
|
||||
|
||||
if ((r11.u32 & SWA::eKeyState_Select) != 0)
|
||||
{
|
||||
if (++r28.u32 >= 2)
|
||||
r28.u32 = 0;
|
||||
|
||||
isChangedCameraMode = true;
|
||||
}
|
||||
|
||||
FreeCameraPatches::s_isActive = r28.u32 > 0;
|
||||
|
||||
if (isChangedCameraMode)
|
||||
{
|
||||
ResetParameters();
|
||||
|
||||
switch (r28.u32)
|
||||
{
|
||||
case 0:
|
||||
LOGN("[Free Camera] Disabled");
|
||||
break;
|
||||
|
||||
case 1:
|
||||
LOGN("[Free Camera] Enabled");
|
||||
break;
|
||||
}
|
||||
|
||||
isChangedCameraMode = false;
|
||||
|
||||
if (FreeCameraPatches::s_isActive && *SWA::SGlobals::ms_IsRenderHud)
|
||||
{
|
||||
*SWA::SGlobals::ms_IsRenderHud = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
*SWA::SGlobals::ms_IsRenderHud = true;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Original input: D-Pad Left
|
||||
void FreeCameraTeleportToPlayerInputMidAsmHook(PPCRegister& r4)
|
||||
{
|
||||
if (Config::EnableFreeCamera)
|
||||
r4.u32 = SWA::eKeyState_RightStick;
|
||||
}
|
||||
|
||||
// Original inputs: X (Square) / Y (Triangle)
|
||||
bool FreeCameraSpeedInputMidAsmHook(PPCRegister& r31)
|
||||
{
|
||||
if (!Config::EnableFreeCamera)
|
||||
return false;
|
||||
|
||||
auto pCamera = (SWA::CReplayFreeCamera*)g_memory.Translate(r31.u32);
|
||||
auto pInputState = SWA::CInputState::GetInstance();
|
||||
|
||||
if (!pInputState)
|
||||
return false;
|
||||
|
||||
auto& rPadState = pInputState->GetPadState();
|
||||
|
||||
auto pCamera = (SWA::CFreeCamera*)g_memory.Translate(r31.u32);
|
||||
auto pPadState = (SWA::SPadState*)g_memory.Translate(r29.u32);
|
||||
auto factor = App::s_deltaTime / (1.0f / 60.0f);
|
||||
auto aspectRatio = (float)GameWindow::s_width / (float)GameWindow::s_height;
|
||||
|
||||
if (g_isCameraLocked)
|
||||
{
|
||||
|
@ -122,7 +55,7 @@ bool FreeCameraSpeedInputMidAsmHook(PPCRegister& r31)
|
|||
static auto isLeftTriggerSpeedModifier = false;
|
||||
static auto isRightTriggerSpeedModifier = false;
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_LeftTrigger))
|
||||
if (pPadState->IsDown(SWA::eKeyState_LeftTrigger))
|
||||
{
|
||||
g_speed = MOVE_SPEED_SLOW;
|
||||
isLeftTriggerSpeedModifier = true;
|
||||
|
@ -133,7 +66,7 @@ bool FreeCameraSpeedInputMidAsmHook(PPCRegister& r31)
|
|||
isLeftTriggerSpeedModifier = false;
|
||||
}
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_RightTrigger))
|
||||
if (pPadState->IsDown(SWA::eKeyState_RightTrigger))
|
||||
{
|
||||
g_speed = MOVE_SPEED_FAST;
|
||||
isRightTriggerSpeedModifier = true;
|
||||
|
@ -147,10 +80,10 @@ bool FreeCameraSpeedInputMidAsmHook(PPCRegister& r31)
|
|||
if (isLeftTriggerSpeedModifier && isRightTriggerSpeedModifier)
|
||||
g_speed = MOVE_SPEED_FAST / 3;
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_A))
|
||||
if (pPadState->IsDown(SWA::eKeyState_A))
|
||||
g_speed = g_baseSpeed = DEFAULT_SPEED;
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_B))
|
||||
if (pPadState->IsDown(SWA::eKeyState_B))
|
||||
{
|
||||
g_baseSpeed -= MOVE_SPEED_MODIFIER_RATIO * factor;
|
||||
g_speed = g_baseSpeed;
|
||||
|
@ -158,7 +91,7 @@ bool FreeCameraSpeedInputMidAsmHook(PPCRegister& r31)
|
|||
LOGFN("[Free Camera] Speed: {}", g_speed);
|
||||
}
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_X))
|
||||
if (pPadState->IsDown(SWA::eKeyState_X))
|
||||
{
|
||||
g_baseSpeed += MOVE_SPEED_MODIFIER_RATIO * factor;
|
||||
g_speed = g_baseSpeed;
|
||||
|
@ -166,57 +99,152 @@ bool FreeCameraSpeedInputMidAsmHook(PPCRegister& r31)
|
|||
LOGFN("[Free Camera] Speed: {}", g_speed);
|
||||
}
|
||||
|
||||
auto isResetFOV = rPadState.IsDown(SWA::eKeyState_Y);
|
||||
auto isIncreaseFOV = rPadState.IsDown(SWA::eKeyState_DpadUp);
|
||||
auto isDecreaseFOV = rPadState.IsDown(SWA::eKeyState_DpadDown);
|
||||
|
||||
auto fovScaleFactor = 0.0f;
|
||||
|
||||
if (isIncreaseFOV)
|
||||
{
|
||||
fovScaleFactor = FOV_MODIFIER_RATIO;
|
||||
}
|
||||
else if (isDecreaseFOV)
|
||||
{
|
||||
fovScaleFactor = -FOV_MODIFIER_RATIO;
|
||||
}
|
||||
|
||||
g_speed = std::clamp(g_speed, 0.01f, 20.0f);
|
||||
g_fov = fmodf(isResetFOV ? DEFAULT_FOV : g_fov + fovScaleFactor * App::s_deltaTime * 60.0f, 180.0f);
|
||||
}
|
||||
|
||||
if (rPadState.IsTapped(SWA::eKeyState_DpadLeft))
|
||||
{
|
||||
g_isCameraLocked = !g_isCameraLocked;
|
||||
g_speed = g_baseSpeed;
|
||||
|
||||
if (g_isCameraLocked)
|
||||
{
|
||||
LOGN("[Free Camera] Locked");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGN("[Free Camera] Unlocked");
|
||||
}
|
||||
}
|
||||
|
||||
if (rPadState.IsTapped(SWA::eKeyState_DpadRight))
|
||||
{
|
||||
*SWA::SGlobals::ms_IsRenderDepthOfField = !*SWA::SGlobals::ms_IsRenderDepthOfField;
|
||||
|
||||
if (*SWA::SGlobals::ms_IsRenderDepthOfField)
|
||||
{
|
||||
LOGN("[Free Camera] Depth of Field ON");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGN("[Free Camera] Depth of Field OFF");
|
||||
}
|
||||
}
|
||||
|
||||
pCamera->m_Speed = g_speed;
|
||||
|
||||
FreeCameraPatches::s_fieldOfView = 2.0f * atan(tan(DEGREES_TO_RADIANS(g_fov / 2.0f) * (16.0f / 9.0f / std::min(aspectRatio, 16.0f / 9.0f))));
|
||||
f0.f64 = g_speed;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// SWA::CFreeCamera::Update
|
||||
PPC_FUNC_IMPL(__imp__sub_82472A18);
|
||||
PPC_FUNC(sub_82472A18)
|
||||
{
|
||||
if (Config::EnableFreeCamera)
|
||||
{
|
||||
auto pCamera = (SWA::CFreeCamera*)g_memory.Translate(ctx.r3.u32);
|
||||
auto aspectRatio = (float)GameWindow::s_width / (float)GameWindow::s_height;
|
||||
|
||||
if (auto pInputState = SWA::CInputState::GetInstance())
|
||||
{
|
||||
auto& rPadState = pInputState->GetPadState();
|
||||
|
||||
// Deactivate.
|
||||
if (rPadState.IsTapped(SWA::eKeyState_Select))
|
||||
{
|
||||
guest_stack_var<SWA::Message::MsgPopCameraController> msgPopCameraController(pCamera, 0.0f);
|
||||
guest_stack_var<SWA::Message::MsgCameraPauseMove> msgCameraPauseMove(false);
|
||||
|
||||
// Process SWA::Message::MsgPopCameraController.
|
||||
GuestToHostFunction<int>(sub_8246A840, pCamera->m_pCamera.get(), msgPopCameraController.get());
|
||||
|
||||
// Process SWA::Message::MsgFinishFreeCamera.
|
||||
GuestToHostFunction<int>(sub_8253ADB8, App::s_pGameModeStage);
|
||||
|
||||
// Process SWA::Message::MsgCameraPauseMove.
|
||||
GuestToHostFunction<int>(sub_824679C0, pCamera->m_pCamera.get(), msgCameraPauseMove.get());
|
||||
|
||||
FreeCameraPatches::s_isActive = false;
|
||||
*SWA::SGlobals::ms_IsRenderHud = true;
|
||||
|
||||
LOGN("[Free Camera] Disabled");
|
||||
|
||||
g_isDisablingFreeCamera = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Teleport player to camera.
|
||||
if (rPadState.IsTapped(SWA::eKeyState_LeftStick))
|
||||
{
|
||||
guest_stack_var<SWA::Message::MsgSetPosition> msgSetPosition(pCamera->m_Position);
|
||||
guest_stack_var<SWA::Message::MsgSetVelocity> msgSetVelocity(Hedgehog::Math::CVector(0.0f, 0.0f, 0.0f));
|
||||
|
||||
if (auto pPlayerSpeedContext = SWA::Player::CPlayerSpeedContext::GetInstance())
|
||||
{
|
||||
// Process SWA::Message::MsgSetPosition.
|
||||
GuestToHostFunction<int>(sub_82303100, pPlayerSpeedContext->m_pPlayer.get(), msgSetPosition.get());
|
||||
|
||||
// Process SWA::Message::MsgSetVelocity.
|
||||
GuestToHostFunction<int>(sub_82311820, pPlayerSpeedContext->m_pPlayer.get(), msgSetVelocity.get());
|
||||
}
|
||||
else if (App::s_pEvilSonicContext)
|
||||
{
|
||||
// Process SWA::Message::MsgSetPosition.
|
||||
GuestToHostFunction<int>(sub_82303100, App::s_pEvilSonicContext->m_pPlayer.get(), msgSetPosition.get());
|
||||
}
|
||||
}
|
||||
|
||||
// Lock camera.
|
||||
if (rPadState.IsTapped(SWA::eKeyState_DpadLeft))
|
||||
{
|
||||
g_isCameraLocked = !g_isCameraLocked;
|
||||
|
||||
if (g_isCameraLocked)
|
||||
{
|
||||
LOGN("[Free Camera] Locked");
|
||||
}
|
||||
else
|
||||
{
|
||||
g_speed = g_baseSpeed;
|
||||
|
||||
LOGN("[Free Camera] Unlocked");
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle depth of field.
|
||||
if (rPadState.IsTapped(SWA::eKeyState_DpadRight))
|
||||
{
|
||||
*SWA::SGlobals::ms_IsRenderDepthOfField = !*SWA::SGlobals::ms_IsRenderDepthOfField;
|
||||
|
||||
if (*SWA::SGlobals::ms_IsRenderDepthOfField)
|
||||
{
|
||||
LOGN("[Free Camera] Depth of Field ON");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGN("[Free Camera] Depth of Field OFF");
|
||||
}
|
||||
}
|
||||
|
||||
auto isResetFOV = rPadState.IsDown(SWA::eKeyState_Y);
|
||||
auto isIncreaseFOV = rPadState.IsDown(SWA::eKeyState_DpadUp);
|
||||
auto isDecreaseFOV = rPadState.IsDown(SWA::eKeyState_DpadDown);
|
||||
|
||||
auto fovScaleFactor = 0.0f;
|
||||
|
||||
if (isIncreaseFOV)
|
||||
{
|
||||
fovScaleFactor = FOV_MODIFIER_RATIO;
|
||||
}
|
||||
else if (isDecreaseFOV)
|
||||
{
|
||||
fovScaleFactor = -FOV_MODIFIER_RATIO;
|
||||
}
|
||||
|
||||
g_fieldOfView = fmodf(isResetFOV ? DEFAULT_FIELD_OF_VIEW : g_fieldOfView + fovScaleFactor * App::s_deltaTime * 60.0f, 180.0f);
|
||||
|
||||
FreeCameraPatches::s_fieldOfView = 2.0f * atan(tan(DEGREES_TO_RADIANS(g_fieldOfView / 2.0f) * (16.0f / 9.0f / std::min(aspectRatio, 16.0f / 9.0f))));
|
||||
}
|
||||
}
|
||||
|
||||
__imp__sub_82472A18(ctx, base);
|
||||
}
|
||||
|
||||
void FreeCameraPatches::Update()
|
||||
{
|
||||
if (!Config::EnableFreeCamera || !App::s_pGameModeStage)
|
||||
return;
|
||||
|
||||
if (auto pInputState = SWA::CInputState::GetInstance())
|
||||
{
|
||||
auto& rPadState = pInputState->GetPadState();
|
||||
|
||||
if (rPadState.IsTapped(SWA::eKeyState_Select) && !FreeCameraPatches::s_isActive && !g_isDisablingFreeCamera)
|
||||
{
|
||||
ResetParameters();
|
||||
|
||||
// Process SWA::Message::MsgStartFreeCamera.
|
||||
GuestToHostFunction<int>(sub_8253ACB8, App::s_pGameModeStage);
|
||||
|
||||
FreeCameraPatches::s_isActive = true;
|
||||
*SWA::SGlobals::ms_IsRenderHud = false;
|
||||
|
||||
LOGN("[Free Camera] Enabled");
|
||||
}
|
||||
|
||||
if (rPadState.IsReleased(SWA::eKeyState_Select) && !FreeCameraPatches::s_isActive)
|
||||
g_isDisablingFreeCamera = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,4 +6,6 @@ public:
|
|||
static inline bool s_isActive;
|
||||
|
||||
static inline float s_fieldOfView;
|
||||
|
||||
static void Update();
|
||||
};
|
||||
|
|
|
@ -57,7 +57,7 @@ PPC_FUNC(sub_82B98D30)
|
|||
g_pScene = nullptr;
|
||||
InspirePatches::s_sceneName.clear();
|
||||
|
||||
SDL_User_EvilSonic(App::s_isWerehog);
|
||||
SDL_User_EvilSonic(App::s_pEvilSonicContext);
|
||||
|
||||
g_loadedMouthExplosionAnimation = false;
|
||||
g_hideMorphModels = false;
|
||||
|
|
|
@ -104,9 +104,9 @@ void SetXButtonHomingMidAsmHook(PPCRegister& r30)
|
|||
PPC_FUNC_IMPL(__imp__sub_823B49D8);
|
||||
PPC_FUNC(sub_823B49D8)
|
||||
{
|
||||
__imp__sub_823B49D8(ctx, base);
|
||||
App::s_pEvilSonicContext = (SWA::Player::CEvilSonicContext*)g_memory.Translate(ctx.r3.u32);
|
||||
|
||||
App::s_isWerehog = true;
|
||||
__imp__sub_823B49D8(ctx, base);
|
||||
|
||||
SDL_User_EvilSonic(true);
|
||||
}
|
||||
|
@ -115,9 +115,9 @@ PPC_FUNC(sub_823B49D8)
|
|||
PPC_FUNC_IMPL(__imp__sub_823B4590);
|
||||
PPC_FUNC(sub_823B4590)
|
||||
{
|
||||
__imp__sub_823B4590(ctx, base);
|
||||
App::s_pEvilSonicContext = nullptr;
|
||||
|
||||
App::s_isWerehog = false;
|
||||
__imp__sub_823B4590(ctx, base);
|
||||
|
||||
SDL_User_EvilSonic(false);
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ PPC_FUNC(sub_824DCF38)
|
|||
if (Config::TimeOfDayTransition == ETimeOfDayTransition::PlayStation)
|
||||
{
|
||||
ctx.r4.u32 = SWA::eLoadingDisplayType_ChangeTimeOfDay;
|
||||
pLoading->m_IsNightToDay = App::s_isWerehog;
|
||||
pLoading->m_IsNightToDay = App::s_pEvilSonicContext;
|
||||
}
|
||||
|
||||
if (Config::UseArrowsForTimeOfDayTransition)
|
||||
|
|
|
@ -1087,41 +1087,20 @@ name = "AnimationDataMakeMidAsmHook"
|
|||
address = 0x82BB38E4
|
||||
registers = ["r31", "r29", "r28"]
|
||||
|
||||
[[midasm_hook]]
|
||||
name = "EnableFreeCameraMidAsmHook"
|
||||
address = 0x825389F0
|
||||
jump_address_on_true = 0x825389F4
|
||||
|
||||
[[midasm_hook]]
|
||||
name = "EnableFreeCameraMidAsmHook"
|
||||
address = 0x82538A18
|
||||
jump_address_on_true = 0x82538A1C
|
||||
|
||||
[[midasm_hook]]
|
||||
name = "FreeCameraActivationInputMidAsmHook"
|
||||
address = 0x824569BC
|
||||
registers = ["r11", "r27", "r28"]
|
||||
jump_address_on_true = 0x824569D4
|
||||
|
||||
[[midasm_hook]]
|
||||
name = "FreeCameraTeleportToPlayerInputMidAsmHook"
|
||||
address = 0x8245C21C
|
||||
registers = ["r4"]
|
||||
|
||||
[[midasm_hook]]
|
||||
name = "FreeCameraSpeedInputMidAsmHook"
|
||||
address = 0x8245C318
|
||||
registers = ["r31"]
|
||||
jump_address_on_true = 0x8245C38C
|
||||
address = 0x82472A7C
|
||||
registers = ["r31", "r29", "f0"]
|
||||
jump_address_on_true = 0x82472AC4
|
||||
|
||||
# Disable "change to free camera" input.
|
||||
# Disable start/end tool input.
|
||||
[[midasm_hook]]
|
||||
name = "FreeCameraNullInputMidAsmHook"
|
||||
address = 0x8245BCE4
|
||||
jump_address_on_true = 0x8245BDB4
|
||||
name = "FreeCameraActiveMidAsmHook"
|
||||
address = 0x825D7690
|
||||
jump_address_on_true = 0x825D7704
|
||||
|
||||
# Disable "change to pan camera" input.
|
||||
# Disable deactivation input.
|
||||
[[midasm_hook]]
|
||||
name = "FreeCameraNullInputMidAsmHook"
|
||||
address = 0x8245BDC4
|
||||
jump_address_on_true = 0x8245BEAC
|
||||
name = "FreeCameraActiveMidAsmHook"
|
||||
address = 0x825D745C
|
||||
jump_address_on_true = 0x825D768C
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue