1#include "Library/Camera/CameraPoserFix.h"
2
3#include "Library/Base/StringUtil.h"
4#include "Library/Camera/CameraPoser.h"
5#include "Library/Camera/CameraPoserFunction.h"
6#include "Library/Camera/CameraStartInfo.h"
7#include "Library/Math/MathUtil.h"
8#include "Library/Yaml/ByamlUtil.h"
9
10namespace al {
11
12CameraPoserFix::CameraPoserFix(const char* name) : CameraPoser(name) {
13 if (isEqualString(str1: name, str2: getFixAbsoluteCameraName()))
14 alCameraPoserFunction::invalidateChangeSubjective(this);
15
16 else if (isEqualString(str1: name, str2: getFixDoorwayCameraName())) {
17 alCameraPoserFunction::invalidateChangeSubjective(this);
18 alCameraPoserFunction::initAngleSwing(this);
19
20 } else {
21 alCameraPoserFunction::initAngleSwing(this);
22 alCameraPoserFunction::validateCtrlSubjective(this);
23 }
24 initOrthoProjectionParam();
25}
26
27void CameraPoserFix::init() {
28 alCameraPoserFunction::initSnapShotCameraCtrlZoomAutoReset(this);
29}
30
31void CameraPoserFix::initCameraPosAndLookAtPos(const sead::Vector3f& cameraPos,
32 const sead::Vector3f& lookAtPos) {
33 mLookAtPos.set(lookAtPos);
34 mDistance = (lookAtPos - cameraPos).length();
35 sead::Vector3f viewDir;
36 viewDir.set(cameraPos - lookAtPos);
37 normalize(vec: &viewDir);
38 mAngleV = sead::Mathf::rad2deg(rad: asinf(viewDir.y));
39 sead::Vector3f viewDirPlane = viewDir;
40 viewDirPlane.y = 0;
41 tryNormalizeOrDirZ(vec: &viewDirPlane);
42 mAngleH = calcAngleOnPlaneDegree(a: sead::Vector3f::ez, b: viewDirPlane, vertical: sead::Vector3f::ey);
43}
44
45void CameraPoserFix::loadParam(const ByamlIter& iter) {
46 tryGetByamlV3f(&mLookAtPos, iter, "LookAtPos");
47 tryGetByamlF32(&mDistance, iter, "Distance");
48 tryGetByamlF32(&mAngleV, iter, "AngleV");
49 tryGetByamlF32(&mAngleH, iter, "AngleH");
50 tryGetByamlBool(&mIsCalcNearestAtFromPreAt, iter, "IsCalcNearestAtFromPreAt");
51}
52
53void CameraPoserFix::start(const CameraStartInfo& startInfo) {
54 mPreLookAtPos.set(alCameraPoserFunction::getPreLookAtPos(this));
55 update();
56}
57
58void CameraPoserFix::update() {
59 mCameraUp.set(sead::Vector3f::ez);
60 mTargetTrans.set(mLookAtPos);
61
62 mTargetTrans *= mViewMtx;
63
64 f32 angleH = alCameraPoserFunction::calcZoneRotateAngleH(mAngleH, this);
65 f32 x = sinf(sead::Mathf::deg2rad(deg: angleH)) * cosf(sead::Mathf::deg2rad(deg: mAngleV));
66 f32 y = sinf(sead::Mathf::deg2rad(deg: mAngleV));
67 f32 z = cosf(sead::Mathf::deg2rad(deg: angleH)) * cosf(sead::Mathf::deg2rad(deg: mAngleV));
68 sead::Vector3f viewDir = {x, y, z};
69
70 normalize(vec: &viewDir);
71 mPosition.set((mDistance * viewDir) + mTargetTrans);
72 if (mIsCalcNearestAtFromPreAt) {
73 sead::Vector3f offset = mPreLookAtPos - mPosition;
74 parallelizeVec(&offset, viewDir, offset);
75 if (!isNearZero(vec: offset) && viewDir.dot(t: offset) < 0.0f)
76 mTargetTrans.set(offset + mPosition);
77 }
78}
79
80const char* CameraPoserFix::getFixAbsoluteCameraName() {
81 return "完全固定";
82}
83
84const char* CameraPoserFix::getFixDoorwayCameraName() {
85 return "出入口専用固定";
86}
87} // namespace al
88