diff --git a/config/GM8E01_00/symbols.txt b/config/GM8E01_00/symbols.txt index 0f0a0c99..f21df0cd 100644 --- a/config/GM8E01_00/symbols.txt +++ b/config/GM8E01_00/symbols.txt @@ -13656,7 +13656,7 @@ GetRotation__12CTransform4fCFv = .text:0x80312C40; // type:function size:0x5C sc GetQuickInverse__12CTransform4fCFv = .text:0x80312C9C; // type:function size:0x8C scope:global __eq__FRC12CTransform4fRC12CTransform4f = .text:0x80312D28; // type:function size:0xD0 scope:global FromColumns__12CTransform4fFRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3f = .text:0x80312DF8; // type:function size:0x64 scope:global -__ct__12CTransform4fFRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3f_0 = .text:0x80312E5C; // type:function size:0x64 scope:global +__ct__12CTransform4fFRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3f = .text:0x80312E5C; // type:function size:0x64 scope:global ScaleBy__12CTransform4fFf = .text:0x80312EC0; // type:function size:0x70 scope:global MultiplyIgnoreTranslation__12CTransform4fCFRC12CTransform4f = .text:0x80312F30; // type:function size:0x1C4 scope:global BuildMatrix3f__12CTransform4fCFv = .text:0x803130F4; // type:function size:0x4C scope:global diff --git a/config/GM8E01_01/symbols.txt b/config/GM8E01_01/symbols.txt index c232eabb..f3e71a3b 100644 --- a/config/GM8E01_01/symbols.txt +++ b/config/GM8E01_01/symbols.txt @@ -13671,7 +13671,7 @@ GetRotation__12CTransform4fCFv = .text:0x80312D20; // type:function size:0x5C sc GetQuickInverse__12CTransform4fCFv = .text:0x80312D7C; // type:function size:0x8C scope:global __eq__FRC12CTransform4fRC12CTransform4f = .text:0x80312E08; // type:function size:0xD0 scope:global FromColumns__12CTransform4fFRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3f = .text:0x80312ED8; // type:function size:0x64 scope:global -__ct__12CTransform4fFRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3f_0 = .text:0x80312F3C; // type:function size:0x64 scope:global +__ct__12CTransform4fFRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3f = .text:0x80312F3C; // type:function size:0x64 scope:global ScaleBy__12CTransform4fFf = .text:0x80312FA0; // type:function size:0x70 scope:global MultiplyIgnoreTranslation__12CTransform4fCFRC12CTransform4f = .text:0x80313010; // type:function size:0x1C4 scope:global BuildMatrix3f__12CTransform4fCFv = .text:0x803131D4; // type:function size:0x4C scope:global diff --git a/include/MetroidPrime/CActorLights.hpp b/include/MetroidPrime/CActorLights.hpp index 3e1c5e6d..188365a1 100644 --- a/include/MetroidPrime/CActorLights.hpp +++ b/include/MetroidPrime/CActorLights.hpp @@ -20,16 +20,18 @@ class CActorLights { public: static const float kDefaultPositionUpdateThreshold; - CActorLights(const uint areaUpdateFramePeriod, CVector3f lightingPositionOffset, const int maxDynamicLights, - const int maxAreaLights, float positionUpdateThreshold, const bool ambientChannelOverflow, - const bool useLightSet2, const bool disableWorldLights); + CActorLights(const uint areaUpdateFramePeriod, CVector3f lightingPositionOffset, + const int maxDynamicLights, const int maxAreaLights, + float positionUpdateThreshold = kDefaultPositionUpdateThreshold, + const bool ambientChannelOverflow = false, const bool useLightSet2 = false, + const bool disableWorldLights = false); ~CActorLights(); void BuildConstantAmbientLighting(); void BuildConstantAmbientLighting(const CColor&); bool BuildAreaLightList(const CStateManager& mgr, const CGameArea& area, const CAABox& bounds); void BuildDynamicLightList(const CStateManager& mgr, const CAABox& bounds); - void BuildFakeLightList(const rstl::vector&, const CColor&); + void BuildFakeLightList(const rstl::vector< CLight >&, const CColor&); void BuildFaceLightList(const CStateManager& mgr, const CGameArea& area, const CAABox& aabb); void ActivateLights() const; diff --git a/include/MetroidPrime/Player/CSamusFaceReflection.hpp b/include/MetroidPrime/Player/CSamusFaceReflection.hpp index 17830235..b162b576 100644 --- a/include/MetroidPrime/Player/CSamusFaceReflection.hpp +++ b/include/MetroidPrime/Player/CSamusFaceReflection.hpp @@ -15,10 +15,10 @@ class CActorLights; class CSamusFaceReflection { public: - explicit CSamusFaceReflection(const CStateManager& stateMgr); - void PreDraw(const CStateManager& stateMgr); - void Draw(const CStateManager& stateMgr) const; - void Update(float dt, const CStateManager& stateMgr, CRandom16& rand); + explicit CSamusFaceReflection(const CStateManager& mgr); + void PreDraw(const CStateManager& mgr); + void Draw(const CStateManager& mgr) const; + void Update(float dt, const CStateManager& mgr, CRandom16& rand); private: CModelData x0_modelData; @@ -29,5 +29,4 @@ private: bool x70_hidden; }; - #endif // _CSAMUSFACEREFLECTION diff --git a/src/MetroidPrime/Player/CSamusFaceReflection.cpp b/src/MetroidPrime/Player/CSamusFaceReflection.cpp index c23fd704..bc5619a4 100644 --- a/src/MetroidPrime/Player/CSamusFaceReflection.cpp +++ b/src/MetroidPrime/Player/CSamusFaceReflection.cpp @@ -13,25 +13,23 @@ #include "MetroidPrime/Tweaks/CTweakGui.hpp" #include "MetroidPrime/Tweaks/CTweakPlayer.hpp" - #include "Kyoto/CResFactory.hpp" #include "Kyoto/Graphics/CGraphics.hpp" #include "Kyoto/Graphics/CModelFlags.hpp" #include "Kyoto/Math/CRelAngle.hpp" - -static const CTransform4f PreXf = +static const char* const skFaceAssetIdName = "ACS_SamusFace"; +static const CTransform4f skFaceModelViewAdjust = CTransform4f::Scale(0.3f) * CTransform4f::Translate(CVector3f(0.f, 0.5f, 0.f)); -CSamusFaceReflection::CSamusFaceReflection(const CStateManager& stateMgr) -: x0_modelData(CModelData(CAnimRes(gpResourceFactory->GetResourceIdByName("ACS_SamusFace")->id, +CSamusFaceReflection::CSamusFaceReflection(const CStateManager& mgr) +: x0_modelData(CModelData(CAnimRes(gpResourceFactory->GetResourceIdByName(skFaceAssetIdName)->id, CAnimRes::kDefaultCharIdx, CVector3f(1.f, 1.f, 1.f), 0, true))) -, x4c_lights(new CActorLights(8, CVector3f::Zero(), 4, 4, 0.1f, false, false, false)) +, x4c_lights(new CActorLights(8, CVector3f::Zero(), 4, 4)) , x50_lookRot(CQuaternion::NoRotation()) , x60_lookDir(CVector3f::Forward()) , x6c_(0) , x70_hidden(true) { - CAnimPlaybackParms parms(0, -1, 1.f, true); x0_modelData.AnimationData()->SetAnimation(parms, false); } @@ -41,17 +39,19 @@ void CSamusFaceReflection::Update(float dt, const CStateManager& mgr, CRandom16& TCastToConstPtr< CFirstPersonCamera >(mgr.GetCameraManager()->GetCurrentCamera(mgr))) { CVector3f camTrans = fpCam->GetTranslation(); x0_modelData.AdvanceAnimationIgnoreParticles(dt, rand, true); - x4c_lights->SetFindShadowLight(false); + + CActorLights* lights = x4c_lights.get(); + lights->SetFindShadowLight(false); + TAreaId areaId = mgr.GetPlayer()->GetCurrentAreaId(); if (areaId == kInvalidAreaId) return; - CAABox aabb( - CVector3f(camTrans.GetX() - 0.125f, camTrans.GetY() - 0.125f, camTrans.GetZ() - 0.125f), - CVector3f(camTrans.GetX() + 0.125f, camTrans.GetY() + 0.125f, camTrans.GetZ() + 0.125f)); + const CVector3f offset(0.125f, 0.125f, 0.125f); + CAABox aabb(camTrans - offset, camTrans + offset); const CGameArea& area = mgr.GetWorld()->GetAreaAlways(areaId); - x4c_lights->BuildFaceLightList(mgr, area, aabb); + lights->BuildFaceLightList(mgr, mgr.GetWorld()->GetAreaAlways(areaId), aabb); CMatrix3f matrix = fpCam->GetTransform().BuildMatrix3f(); CUnitVector3f lookDir(matrix.GetColumn(kDY)); @@ -68,17 +68,12 @@ void CSamusFaceReflection::Update(float dt, const CStateManager& mgr, CRandom16& float freeLookSpeed = dt * gpTweakPlayer->GetFreeLookSpeed() * 0.5f; - if (fabsf(lookDot) >= 1.f) - lookDot = 1.f; + float lookAng = acos(CMath::Limit(lookDot, 1.f)); - float lookAng = acos(lookDot); - - float f = 0.0f; - if (lookAng > 0.0f) { - f = freeLookSpeed / lookAng; - } - x50_lookRot = + float f = lookAng > 0.0f ? freeLookSpeed / lookAng : 0.0f; + xfLook2 = CQuaternion::SlerpLocal(x50_lookRot, xfLook2, CMath::Clamp(0.0f, dt * 18.0f * f, 1.0f)); + x50_lookRot = xfLook2; x60_lookDir = lookDir; } } @@ -119,12 +114,11 @@ void CSamusFaceReflection::Draw(const CStateManager& mgr) const { CVector3f camZHeight = height * camZcol; CVector3f camYDist = dist * camYcol; - CVector3f vec1( - camTranslation.GetX() + camYDist.GetX() + camZHeight.GetX(), - camTranslation.GetY() + camYDist.GetY() + camZHeight.GetY(), - camTranslation.GetZ() + camYDist.GetZ() + camZHeight.GetZ()); - ; - CTransform4f modelXf = CTransform4f((camRot * x50_lookRot).BuildTransform(), vec1) * PreXf; + CVector3f vec1(camTranslation.GetX() + camYDist.GetX() + camZHeight.GetX(), + camTranslation.GetY() + camYDist.GetY() + camZHeight.GetY(), + camTranslation.GetZ() + camYDist.GetZ() + camZHeight.GetZ()); + CTransform4f modelXf = + CTransform4f((camRot * x50_lookRot).BuildTransform(), vec1) * skFaceModelViewAdjust; CGraphics::SetViewPointMatrix(fpCam->GetTransform()); CGraphics::SetOrtho(aspect * -orthoWidth, aspect * orthoWidth, orthoHeight, -orthoHeight, -10.f, @@ -141,8 +135,10 @@ void CSamusFaceReflection::Draw(const CStateManager& mgr) const { else transFactor = 0.f; if (transFactor > 0.f) { - x0_modelData.Render(mgr, modelXf, nullptr, CModelFlags::Additive(CColor::Black()).DepthCompareUpdate(true, true)); - x0_modelData.Render(mgr, modelXf, lights, CModelFlags::Additive(transFactor).DepthCompareUpdate(true, false)); + x0_modelData.Render(mgr, modelXf, nullptr, + CModelFlags::Additive(CColor::Black()).DepthCompareUpdate(true, true)); + x0_modelData.Render(mgr, modelXf, lights, + CModelFlags::Additive(transFactor).DepthCompareUpdate(true, false)); } } }