mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-30 12:35:12 +00:00
58 lines
1.9 KiB
C++
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
|