OdysseyDecomp/lib/al/Project/Camera/CameraAngleSwingInfo.cpp

58 lines
1.9 KiB
C++

#include "Project/Camera/CameraAngleSwingInfo.h"
#include "Library/Math/MathUtil.h"
#include "Library/Yaml/ByamlUtil.h"
namespace al {
CameraAngleSwingInfo::CameraAngleSwingInfo() {
// these need to be explicit in this constructor, otherwise mismatch
mCurrentAngle = {0.0f, 0.0f};
_14 = 0.3f;
_18 = 0.1f;
}
void CameraAngleSwingInfo::load(const ByamlIter& iter) {
tryGetByamlBool(&mIsInvalidSwing, iter, "IsInvalidSwing");
if (mIsInvalidSwing)
return;
tryGetByamlF32(&mMaxSwingDegreeH, iter, "MaxSwingDegreeH");
tryGetByamlF32(&mMaxSwingDegreeV, iter, "MaxSwingDegreeV");
}
void CameraAngleSwingInfo::update(const sead::Vector2f& stickInput, f32 stickSensitivity) {
if (mIsInvalidSwing) {
mCurrentAngle = {0.0f, 0.0f};
return;
}
sead::Vector2f swingDegrees = {
-stickInput.x * mMaxSwingDegreeH,
stickInput.y * mMaxSwingDegreeV,
};
lerpVec(&swingDegrees, mCurrentAngle, swingDegrees, _14 * stickSensitivity);
lerpVec(&mCurrentAngle, mCurrentAngle, swingDegrees, _18);
}
void CameraAngleSwingInfo::makeLookAtCamera(sead::LookAtCamera* camera) const {
sead::Vector3f cameraLookDirection = camera->getAt() - camera->getPos();
f32 cameraLookDistance = cameraLookDirection.length();
normalize(&cameraLookDirection);
sead::Vector3f cameraLookHDir = sead::Vector3f::ey;
verticalizeVec(&cameraLookHDir, cameraLookDirection, cameraLookHDir);
if (!tryNormalizeOrZero(&cameraLookHDir))
return;
rotateVectorDegree(&cameraLookDirection, cameraLookDirection, cameraLookHDir, mCurrentAngle.x);
normalize(&cameraLookDirection);
sead::Vector3f cameraSideDir;
cameraSideDir.setCross(cameraLookDirection, cameraLookHDir);
normalize(&cameraSideDir);
rotateVectorDegree(&cameraLookDirection, cameraLookDirection, cameraSideDir, mCurrentAngle.y);
camera->setAt((cameraLookDistance * cameraLookDirection) + camera->getPos());
}
} // namespace al