mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-26 18:44:33 +00:00
56 lines
1.7 KiB
C++
56 lines
1.7 KiB
C++
#include "Library/Controller/SpinInputAnalyzer.h"
|
|
|
|
#include "Library/Math/MathUtil.h"
|
|
|
|
namespace al {
|
|
|
|
SpinInputAnalyzer::SpinInputAnalyzer() {
|
|
mChangeHistory.allocBufferAssert(128, nullptr);
|
|
mChangeHistory.fill(0.0f);
|
|
|
|
mInputHistory.allocBufferAssert(128, nullptr);
|
|
mInputHistory.fill(sead::Vector2f::zero);
|
|
}
|
|
|
|
void SpinInputAnalyzer::update(const sead::Vector2f& controllerInput) {
|
|
s32 prevIndex = (mCurrentIndex - 1 + 128) % 128;
|
|
|
|
mInputHistory[mCurrentIndex].set(controllerInput);
|
|
mChangeHistory[mCurrentIndex] =
|
|
mInputHistory[prevIndex].cross(mInputHistory[mCurrentIndex]) * 0.5f;
|
|
|
|
sead::Vector2f currentInput = mInputHistory[mCurrentIndex];
|
|
tryNormalizeOrZero(¤tInput);
|
|
|
|
f32 sumOfChanges = 0.0f;
|
|
for (s32 i = 0; (u32)i < 70 && i < mNumUsableEntries; i++) {
|
|
s32 indexMinusI = (mCurrentIndex + (128 - i)) % 128;
|
|
|
|
sead::Vector2f iPrevInput = mInputHistory[indexMinusI];
|
|
tryNormalizeOrZero(&iPrevInput);
|
|
if ((u32)i >= 30) {
|
|
if (sead::Mathf::abs(sumOfChanges) >= 5.0f && iPrevInput.dot(currentInput) > 0.7f) {
|
|
f32 spinDirection = sign(sumOfChanges);
|
|
mNumUsableEntries = 0;
|
|
mSpinDirection = (s32)spinDirection;
|
|
mSpinTimer = 31; // actually, it ends up being 30 due to subtracting one below
|
|
break;
|
|
}
|
|
}
|
|
|
|
sumOfChanges += mChangeHistory[indexMinusI];
|
|
}
|
|
|
|
if (mSpinTimer >= 1) {
|
|
mSpinTimer--;
|
|
if (mSpinTimer == 0)
|
|
mSpinDirection = 0;
|
|
}
|
|
|
|
mCurrentIndex = (mCurrentIndex + 1) % 128;
|
|
if (mNumUsableEntries <= 127)
|
|
mNumUsableEntries++;
|
|
}
|
|
|
|
} // namespace al
|