From a13fdc136b2dcac879e3ba92f8d92123f024fbf9 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:40:12 +0000 Subject: [PATCH] fps_patches: fix Egg Dragoon drill missile rotating incorrectly (#378) Co-authored-by: Skyth (Asilkan) <19259897+blueskythlikesclouds@users.noreply.github.com> --- UnleashedRecomp/api/Hedgehog/Math/Matrix.h | 27 +++++++++++++++++++ .../api/Hedgehog/Math/Quaternion.h | 15 +++++++++++ .../MirageCore/MatrixNode/hhMatrixNode.h | 16 +++++++++++ .../Hedgehog/MirageCore/Misc/hhTransform.h | 19 +++++++++++++ UnleashedRecomp/api/SWA.h | 6 +++++ .../Object/BossEggDragoonDrillMissile.h | 16 +++++++++++ .../api/SWA/System/MatrixNodeTransform.h | 17 ++++++++++++ UnleashedRecomp/patches/fps_patches.cpp | 17 ++++++++++++ UnleashedRecompLib/config/SWA.toml | 5 ++++ 9 files changed, 138 insertions(+) create mode 100644 UnleashedRecomp/api/Hedgehog/Math/Matrix.h create mode 100644 UnleashedRecomp/api/Hedgehog/Math/Quaternion.h create mode 100644 UnleashedRecomp/api/Hedgehog/MirageCore/MatrixNode/hhMatrixNode.h create mode 100644 UnleashedRecomp/api/Hedgehog/MirageCore/Misc/hhTransform.h create mode 100644 UnleashedRecomp/api/SWA/Boss/EggDragoon/Object/BossEggDragoonDrillMissile.h create mode 100644 UnleashedRecomp/api/SWA/System/MatrixNodeTransform.h diff --git a/UnleashedRecomp/api/Hedgehog/Math/Matrix.h b/UnleashedRecomp/api/Hedgehog/Math/Matrix.h new file mode 100644 index 0000000..a279836 --- /dev/null +++ b/UnleashedRecomp/api/Hedgehog/Math/Matrix.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +namespace Hedgehog::Math +{ + class CMatrix + { + public: + be m_M00; + be m_M01; + be m_M02; + be m_M03; + be m_M10; + be m_M11; + be m_M12; + be m_M13; + be m_M20; + be m_M21; + be m_M22; + be m_M23; + be m_M30; + be m_M31; + be m_M32; + be m_M33; + }; +} diff --git a/UnleashedRecomp/api/Hedgehog/Math/Quaternion.h b/UnleashedRecomp/api/Hedgehog/Math/Quaternion.h new file mode 100644 index 0000000..b0bc577 --- /dev/null +++ b/UnleashedRecomp/api/Hedgehog/Math/Quaternion.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +namespace Hedgehog::Math +{ + class CQuaternion + { + public: + be X; + be Y; + be Z; + be W; + }; +} diff --git a/UnleashedRecomp/api/Hedgehog/MirageCore/MatrixNode/hhMatrixNode.h b/UnleashedRecomp/api/Hedgehog/MirageCore/MatrixNode/hhMatrixNode.h new file mode 100644 index 0000000..5304186 --- /dev/null +++ b/UnleashedRecomp/api/Hedgehog/MirageCore/MatrixNode/hhMatrixNode.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace Hedgehog::Mirage +{ + class CMatrixNodeListener; + + class CMatrixNode : public Base::CObject + { + public: + SWA_INSERT_PADDING(0x60); + }; + + SWA_ASSERT_SIZEOF(CMatrixNode, 0x60); +} diff --git a/UnleashedRecomp/api/Hedgehog/MirageCore/Misc/hhTransform.h b/UnleashedRecomp/api/Hedgehog/MirageCore/Misc/hhTransform.h new file mode 100644 index 0000000..751598b --- /dev/null +++ b/UnleashedRecomp/api/Hedgehog/MirageCore/Misc/hhTransform.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace Hedgehog::Mirage +{ + class CTransform + { + public: + Math::CQuaternion m_Rotation; + Math::CVector m_Position; + Math::CMatrix m_Matrix; + }; + + SWA_ASSERT_OFFSETOF(CTransform, m_Rotation, 0x00); + SWA_ASSERT_OFFSETOF(CTransform, m_Position, 0x10); + SWA_ASSERT_OFFSETOF(CTransform, m_Matrix, 0x20); + SWA_ASSERT_SIZEOF(CTransform, 0x60); +} diff --git a/UnleashedRecomp/api/SWA.h b/UnleashedRecomp/api/SWA.h index d0c82c6..fecf2ad 100644 --- a/UnleashedRecomp/api/SWA.h +++ b/UnleashedRecomp/api/SWA.h @@ -27,7 +27,11 @@ #include "Hedgehog/Base/Type/hhSharedString.h" #include "Hedgehog/Base/hhObject.h" #include "Hedgehog/Database/System/hhDatabaseData.h" +#include "Hedgehog/Math/Matrix.h" +#include "Hedgehog/Math/Quaternion.h" #include "Hedgehog/Math/Vector.h" +#include "Hedgehog/MirageCore/MatrixNode/hhMatrixNode.h" +#include "Hedgehog/MirageCore/Misc/hhTransform.h" #include "Hedgehog/MirageCore/Misc/hhVertexDeclarationPtr.h" #include "Hedgehog/MirageCore/RenderData/hhMaterialData.h" #include "Hedgehog/MirageCore/RenderData/hhMeshData.h" @@ -55,6 +59,7 @@ #include "SWA/Achievement/AchievementID.h" #include "SWA/Achievement/AchievementManager.h" #include "SWA/Achievement/AchievementTest.h" +#include "SWA/Boss/EggDragoon/Object/BossEggDragoonDrillMissile.h" #include "SWA/CSD/CsdDatabaseWrapper.h" #include "SWA/CSD/CsdProject.h" #include "SWA/CSD/CsdTexListMirage.h" @@ -116,6 +121,7 @@ #include "SWA/System/GameParameter.h" #include "SWA/System/GammaController.h" #include "SWA/System/InputState.h" +#include "SWA/System/MatrixNodeTransform.h" #include "SWA/System/PadState.h" #include "SWA/System/World.h" #include "boost/smart_ptr/make_shared_object.h" diff --git a/UnleashedRecomp/api/SWA/Boss/EggDragoon/Object/BossEggDragoonDrillMissile.h b/UnleashedRecomp/api/SWA/Boss/EggDragoon/Object/BossEggDragoonDrillMissile.h new file mode 100644 index 0000000..cbb3294 --- /dev/null +++ b/UnleashedRecomp/api/SWA/Boss/EggDragoon/Object/BossEggDragoonDrillMissile.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include "SWA/System/MatrixNodeTransform.h" + +namespace SWA::Boss::EggDragoon::DrillMissile +{ + class CMissile + { + public: + SWA_INSERT_PADDING(0xC4); + xpointer m_pMatrixNodeTransform; + SWA_INSERT_PADDING(0x68); + be m_Speed; + }; +} diff --git a/UnleashedRecomp/api/SWA/System/MatrixNodeTransform.h b/UnleashedRecomp/api/SWA/System/MatrixNodeTransform.h new file mode 100644 index 0000000..887c161 --- /dev/null +++ b/UnleashedRecomp/api/SWA/System/MatrixNodeTransform.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace SWA +{ + class CMatrixNodeTransform : public Hedgehog::Mirage::CMatrixNode + { + public: + Hedgehog::Mirage::CTransform m_Transform; + Hedgehog::Math::CMatrix m_WorldMatrix; + }; + + SWA_ASSERT_OFFSETOF(CMatrixNodeTransform, m_Transform, 0x60); + SWA_ASSERT_OFFSETOF(CMatrixNodeTransform, m_WorldMatrix, 0xC0); + SWA_ASSERT_SIZEOF(CMatrixNodeTransform, 0x100); +} diff --git a/UnleashedRecomp/patches/fps_patches.cpp b/UnleashedRecomp/patches/fps_patches.cpp index 47ecd2e..afd0726 100644 --- a/UnleashedRecomp/patches/fps_patches.cpp +++ b/UnleashedRecomp/patches/fps_patches.cpp @@ -171,6 +171,23 @@ PPC_FUNC(sub_82B00D00) *pElapsedTime = std::max(*pElapsedTime, 0.0f); } +// Fix for Egg Dragoon's drill missile attack rotating 90 degrees at HFR. +void BossEggDragoonDrillMissileCMissileSetRotationMidAsmHook(PPCRegister& r4) +{ + auto pRotation = (Hedgehog::Math::CQuaternion*)g_memory.Translate(r4.u32); + auto magnitude = std::sqrt(pRotation->X * pRotation->X + pRotation->Y * pRotation->Y + pRotation->Z * pRotation->Z + pRotation->W * pRotation->W); + + if (magnitude < 0.0f) + return; + + auto magnitudeNrm = 1.0f / magnitude; + + pRotation->X = pRotation->X * magnitudeNrm; + pRotation->Y = pRotation->Y * magnitudeNrm; + pRotation->Z = pRotation->Z * magnitudeNrm; + pRotation->W = pRotation->W * magnitudeNrm; +} + bool SparkleLocusMidAsmHook() { // There is an epsilon check in sparkle locus particle code that seems to never pass at high frame rates, which causes vertex corruption. diff --git a/UnleashedRecompLib/config/SWA.toml b/UnleashedRecompLib/config/SWA.toml index 51c38c7..55745fa 100644 --- a/UnleashedRecompLib/config/SWA.toml +++ b/UnleashedRecompLib/config/SWA.toml @@ -979,3 +979,8 @@ jump_address_on_true = 0x82E96808 name = "HighFrameRateDeltaTimeFixVectorMidAsmHook" address = 0x827673CC registers = ["v62"] + +[[midasm_hook]] +name = "BossEggDragoonDrillMissileCMissileSetRotationMidAsmHook" +address = 0x82A9BADC +registers = ["r4"]