mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-23 09:04:21 +00:00
88 lines
3 KiB
C++
88 lines
3 KiB
C++
#include "Library/Camera/CameraPoserFix.h"
|
|
|
|
#include "Library/Base/StringUtil.h"
|
|
#include "Library/Camera/CameraPoser.h"
|
|
#include "Library/Camera/CameraPoserFunction.h"
|
|
#include "Library/Camera/CameraStartInfo.h"
|
|
#include "Library/Math/MathUtil.h"
|
|
#include "Library/Yaml/ByamlUtil.h"
|
|
|
|
namespace al {
|
|
|
|
CameraPoserFix::CameraPoserFix(const char* name) : CameraPoser(name) {
|
|
if (isEqualString(name, getFixAbsoluteCameraName()))
|
|
alCameraPoserFunction::invalidateChangeSubjective(this);
|
|
|
|
else if (isEqualString(name, getFixDoorwayCameraName())) {
|
|
alCameraPoserFunction::invalidateChangeSubjective(this);
|
|
alCameraPoserFunction::initAngleSwing(this);
|
|
|
|
} else {
|
|
alCameraPoserFunction::initAngleSwing(this);
|
|
alCameraPoserFunction::validateCtrlSubjective(this);
|
|
}
|
|
initOrthoProjectionParam();
|
|
}
|
|
|
|
void CameraPoserFix::init() {
|
|
alCameraPoserFunction::initSnapShotCameraCtrlZoomAutoReset(this);
|
|
}
|
|
|
|
void CameraPoserFix::initCameraPosAndLookAtPos(const sead::Vector3f& cameraPos,
|
|
const sead::Vector3f& lookAtPos) {
|
|
mLookAtPos.set(lookAtPos);
|
|
mDistance = (lookAtPos - cameraPos).length();
|
|
sead::Vector3f viewDir;
|
|
viewDir.set(cameraPos - lookAtPos);
|
|
normalize(&viewDir);
|
|
mAngleV = sead::Mathf::rad2deg(asinf(viewDir.y));
|
|
sead::Vector3f viewDirPlane = viewDir;
|
|
viewDirPlane.y = 0;
|
|
tryNormalizeOrDirZ(&viewDirPlane);
|
|
mAngleH = calcAngleOnPlaneDegree(sead::Vector3f::ez, viewDirPlane, sead::Vector3f::ey);
|
|
}
|
|
|
|
void CameraPoserFix::loadParam(const ByamlIter& iter) {
|
|
tryGetByamlV3f(&mLookAtPos, iter, "LookAtPos");
|
|
tryGetByamlF32(&mDistance, iter, "Distance");
|
|
tryGetByamlF32(&mAngleV, iter, "AngleV");
|
|
tryGetByamlF32(&mAngleH, iter, "AngleH");
|
|
tryGetByamlBool(&mIsCalcNearestAtFromPreAt, iter, "IsCalcNearestAtFromPreAt");
|
|
}
|
|
|
|
void CameraPoserFix::start(const CameraStartInfo& startInfo) {
|
|
mPreLookAtPos.set(alCameraPoserFunction::getPreLookAtPos(this));
|
|
update();
|
|
}
|
|
|
|
void CameraPoserFix::update() {
|
|
mCameraUp.set(sead::Vector3f::ey);
|
|
mTargetTrans.set(mLookAtPos);
|
|
|
|
mTargetTrans *= mViewMtx;
|
|
|
|
f32 angleH = alCameraPoserFunction::calcZoneRotateAngleH(mAngleH, this);
|
|
f32 x = sinf(sead::Mathf::deg2rad(angleH)) * cosf(sead::Mathf::deg2rad(mAngleV));
|
|
f32 y = sinf(sead::Mathf::deg2rad(mAngleV));
|
|
f32 z = cosf(sead::Mathf::deg2rad(angleH)) * cosf(sead::Mathf::deg2rad(mAngleV));
|
|
sead::Vector3f viewDir = {x, y, z};
|
|
|
|
normalize(&viewDir);
|
|
mPosition.set((mDistance * viewDir) + mTargetTrans);
|
|
if (mIsCalcNearestAtFromPreAt) {
|
|
sead::Vector3f offset = mPreLookAtPos - mPosition;
|
|
parallelizeVec(&offset, viewDir, offset);
|
|
if (!isNearZero(offset) && viewDir.dot(offset) < 0.0f)
|
|
mTargetTrans.set(offset + mPosition);
|
|
}
|
|
}
|
|
|
|
const char* CameraPoserFix::getFixAbsoluteCameraName() {
|
|
return "完全固定";
|
|
}
|
|
|
|
const char* CameraPoserFix::getFixDoorwayCameraName() {
|
|
return "出入口専用固定";
|
|
}
|
|
} // namespace al
|