1#include "Library/Camera/CameraUtil.h"
2
3#include "Library/Camera/CameraDirector.h"
4#include "Library/Camera/CameraViewInfo.h"
5#include "Library/Camera/IUseCamera.h"
6#include "Library/Camera/SceneCameraInfo.h"
7#include "Library/Math/MathUtil.h"
8#include "Library/Projection/Projection.h"
9
10namespace al {
11
12inline CameraDirector* getCameraDirector(const IUseCamera* user) {
13 return user->getCameraDirector();
14}
15
16SceneCameraInfo* getSceneCameraInfo(const IUseCamera* user) {
17 return getCameraDirector(user)->getSceneCameraInfo();
18}
19
20s32 getViewNumMax(const IUseCamera* user) {
21 return getViewNumMax(info: getSceneCameraInfo(user));
22}
23
24s32 getViewNumMax(const SceneCameraInfo* info) {
25 return info->getViewNumMax();
26}
27
28bool isValidView(const IUseCamera* user, s32 viewIdx) {
29 return isValidView(info: getSceneCameraInfo(user), viewIdx);
30}
31
32bool isValidView(const SceneCameraInfo* info, s32 viewIdx) {
33 return info->getViewAt(viewIdx)->isValid();
34}
35
36const char* getViewName(const IUseCamera* user, s32 viewIdx) {
37 return getViewName(info: getSceneCameraInfo(user), viewIdx);
38}
39
40const char* getViewName(const SceneCameraInfo* info, s32 viewIdx) {
41 return info->getViewName(num: viewIdx);
42}
43
44const sead::Matrix34f& getViewMtx(const IUseCamera* user, s32 viewIdx) {
45 return getViewMtx(info: getSceneCameraInfo(user), viewIdx);
46}
47
48const sead::Matrix34f& getViewMtx(const SceneCameraInfo* info, s32 viewIdx) {
49 return getLookAtCamera(info, viewIdx).getMatrix();
50}
51
52const sead::Matrix34f* getViewMtxPtr(const IUseCamera* user, s32 viewIdx) {
53 return getViewMtxPtr(info: getSceneCameraInfo(user), viewIdx);
54}
55
56const sead::Matrix34f* getViewMtxPtr(const SceneCameraInfo* info, s32 viewIdx) {
57 return &getViewMtx(info, viewIdx);
58}
59
60const sead::Matrix44f& getProjectionMtx(const IUseCamera* user, s32 viewIdx) {
61 return getProjectionMtx(info: getSceneCameraInfo(user), viewIdx);
62}
63
64const sead::Matrix44f& getProjectionMtx(const SceneCameraInfo* info, s32 viewIdx) {
65 return info->getViewAt(viewIdx)->getProjMtx();
66}
67
68const sead::LookAtCamera& getLookAtCamera(const IUseCamera* user, s32 viewIdx) {
69 return getLookAtCamera(info: getSceneCameraInfo(user), viewIdx);
70}
71
72const sead::LookAtCamera& getLookAtCamera(const SceneCameraInfo* info, s32 viewIdx) {
73 return info->getViewAt(viewIdx)->getLookAtCam();
74}
75
76const sead::Projection& getProjectionSead(const IUseCamera* user, s32 viewIdx) {
77 return getProjectionSead(info: getSceneCameraInfo(user), viewIdx);
78}
79
80const sead::Projection& getProjectionSead(const SceneCameraInfo* info, s32 viewIdx) {
81 return info->getViewAt(viewIdx)->getProjectionSead();
82}
83
84const Projection& getProjection(const IUseCamera* user, s32 viewIdx) {
85 return getProjection(info: getSceneCameraInfo(user), viewIdx);
86}
87
88const Projection& getProjection(const SceneCameraInfo* info, s32 viewIdx) {
89 return info->getViewAt(viewIdx)->getProjection();
90}
91
92const sead::Vector3f& getCameraPos(const IUseCamera* user, s32 viewIdx) {
93 return getCameraPos(info: getSceneCameraInfo(user), viewIdx);
94}
95
96const sead::Vector3f& getCameraPos(const SceneCameraInfo* info, s32 viewIdx) {
97 return getLookAtCamera(info, viewIdx).getPos();
98}
99
100const sead::Vector3f& getCameraAt(const IUseCamera* user, s32 viewIdx) {
101 return getCameraAt(info: getSceneCameraInfo(user), viewIdx);
102}
103
104const sead::Vector3f& getCameraAt(const SceneCameraInfo* info, s32 viewIdx) {
105 return getLookAtCamera(info, viewIdx).getAt();
106}
107
108const sead::Vector3f& getCameraUp(const IUseCamera* user, s32 viewIdx) {
109 return getCameraUp(info: getSceneCameraInfo(user), viewIdx);
110}
111
112const sead::Vector3f& getCameraUp(const SceneCameraInfo* info, s32 viewIdx) {
113 return getLookAtCamera(info, viewIdx).getUp();
114}
115
116f32 getFovyDegree(const IUseCamera* user, s32 viewIdx) {
117 return getFovyDegree(info: getSceneCameraInfo(user), viewIdx);
118}
119
120f32 getFovyDegree(const SceneCameraInfo* info, s32 viewIdx) {
121 return sead::Mathf::rad2deg(rad: getFovy(info, viewIdx));
122}
123
124f32 getFovy(const IUseCamera* user, s32 viewIdx) {
125 return getFovy(info: getSceneCameraInfo(user), viewIdx);
126}
127
128f32 getFovy(const SceneCameraInfo* info, s32 viewIdx) {
129 return info->getViewAt(viewIdx)->getProjection().getFovy();
130}
131
132f32 getNear(const IUseCamera* user, s32 viewIdx) {
133 return getNear(info: getSceneCameraInfo(user), viewIdx);
134}
135
136f32 getNear(const SceneCameraInfo* info, s32 viewIdx) {
137 return info->getViewAt(viewIdx)->getNear();
138}
139
140f32 getFar(const IUseCamera* user, s32 viewIdx) {
141 return getFar(info: getSceneCameraInfo(user), viewIdx);
142}
143
144f32 getFar(const SceneCameraInfo* info, s32 viewIdx) {
145 return info->getViewAt(viewIdx)->getFar();
146}
147
148f32 calcCameraDistance(const IUseCamera* user, s32 viewIdx) {
149 sead::Vector3f diff = getCameraPos(user, viewIdx) - getCameraAt(user, viewIdx);
150
151 return diff.length();
152}
153
154f32 calcFovxDegree(const IUseCamera* user, s32 viewIdx) {
155 f32 aspect = getSceneCameraInfo(user)->getViewAt(viewIdx)->getAspect();
156
157 return aspect * getFovyDegree(user, viewIdx);
158}
159
160f32 calcCurrentFovyRate(const IUseCamera* user, s32 viewIdx) {
161 f32 fovy = getFovyDegree(user, viewIdx);
162 f32 fovy2 = getCameraDirector(user)->getSceneFovyDegree();
163
164 if (isNearZero(value: fovy) || isNearZero(value: fovy2))
165 return 0;
166
167 return fovy / fovy2;
168}
169} // namespace al
170