prime/src/MetroidPrime/CRumbleManager.cpp

41 lines
1.2 KiB
C++

#include "MetroidPrime/CRumbleManager.hpp"
#include "MetroidPrime/CStateManager.hpp"
#include "MetroidPrime/Player/CGameState.hpp"
#include "MetroidPrime/Player/CPlayer.hpp"
#include "MetroidPrime/RumbleFxTable.hpp"
#include "Kyoto/Math/CloseEnough.hpp"
CRumbleManager::CRumbleManager() {}
CRumbleManager::~CRumbleManager() { x0_rumbleGenerator.HardStopAll(); }
short CRumbleManager::Rumble(CStateManager& mgr, ERumbleFxId fx, float gain,
ERumblePriority priority) {
if (gpGameState->GameOptions().GetIsRumbleEnabled())
return x0_rumbleGenerator.Rumble(skRumbleFxTable[size_t(fx)], gain, priority, kIOP_Player1);
return -1;
}
short CRumbleManager::Rumble(CStateManager& mgr, const CVector3f& pos, ERumbleFxId fx, float dist,
ERumblePriority priority) {
if (!close_enough(dist, 0.f))
{
CVector3f delta = mgr.GetPlayer()->GetTranslation() - pos;
if (delta.MagSquared() < dist * dist)
return Rumble(mgr, fx, 1.f - delta.Magnitude() / dist, priority);
}
return -1;
}
void CRumbleManager::StopRumble(short id) {
if (id == -1)
return;
x0_rumbleGenerator.Stop(id, kIOP_Player1);
}
void CRumbleManager::Update(float dt) { x0_rumbleGenerator.Update(dt); }