1#pragma once
2
3#include <basis/seadTypes.h>
4#include <gfx/seadCamera.h>
5#include <math/seadMatrix.h>
6#include <math/seadVector.h>
7
8namespace al {
9class CameraTicket;
10class ICameraInput;
11struct CameraFlagCtrl;
12class IUseCamera;
13class CameraSubTargetBase;
14class CameraSubTargetTurnParam;
15class SceneCameraInfo;
16class PlacementId;
17class Resource;
18struct ActorInitInfo;
19class LiveActor;
20class PlacementInfo;
21class CameraPoser;
22struct CameraPoseInfo;
23class CameraTargetBase;
24class Projection;
25class SimpleCameraInput;
26class ActorCameraTarget;
27class ActorMatrixCameraTarget;
28class ActorCameraSubTarget;
29class ActorBackAroundCameraSubTarget;
30class TransCameraSubTarget;
31class CameraDistanceCurve;
32
33SceneCameraInfo* getSceneCameraInfo(const IUseCamera* user);
34s32 getViewNumMax(const IUseCamera* user);
35s32 getViewNumMax(const SceneCameraInfo* info);
36bool isValidView(const IUseCamera* user, s32 viewIdx);
37bool isValidView(const SceneCameraInfo* info, s32 viewIdx);
38const char* getViewName(const IUseCamera* user, s32 viewIdx);
39const char* getViewName(const SceneCameraInfo* info, s32 viewIdx);
40const sead::Matrix34f& getViewMtx(const IUseCamera* user, s32 viewIdx);
41const sead::Matrix34f& getViewMtx(const SceneCameraInfo* info, s32 viewIdx);
42const sead::Matrix34f* getViewMtxPtr(const IUseCamera* user, s32 viewIdx);
43const sead::Matrix34f* getViewMtxPtr(const SceneCameraInfo* info, s32 viewIdx);
44const sead::Matrix44f& getProjectionMtx(const IUseCamera* user, s32 viewIdx);
45const sead::Matrix44f& getProjectionMtx(const SceneCameraInfo* info, s32 viewIdx);
46const sead::Matrix44f* getProjectionMtxPtr(const IUseCamera* user, s32 viewIdx);
47const sead::Matrix44f* getProjectionMtxPtr(const SceneCameraInfo* info, s32 viewIdx);
48const sead::LookAtCamera& getLookAtCamera(const IUseCamera* user, s32 viewIdx);
49const sead::LookAtCamera& getLookAtCamera(const SceneCameraInfo* info, s32 viewIdx);
50const sead::Projection& getProjectionSead(const IUseCamera* user, s32 viewIdx);
51const sead::Projection& getProjectionSead(const SceneCameraInfo* info, s32 viewIdx);
52const Projection& getProjection(const IUseCamera* user, s32 viewIdx);
53const Projection& getProjection(const SceneCameraInfo* info, s32 viewIdx);
54const sead::Vector3f& getCameraPos(const IUseCamera* user, s32 viewIdx);
55const sead::Vector3f& getCameraPos(const SceneCameraInfo* info, s32 viewIdx);
56const sead::Vector3f& getCameraAt(const IUseCamera* user, s32 viewIdx);
57const sead::Vector3f& getCameraAt(const SceneCameraInfo* info, s32 viewIdx);
58const sead::Vector3f& getCameraUp(const IUseCamera* user, s32 viewIdx);
59const sead::Vector3f& getCameraUp(const SceneCameraInfo* info, s32 viewIdx);
60f32 getFovyDegree(const IUseCamera* user, s32 viewIdx);
61f32 getFovyDegree(const SceneCameraInfo* info, s32 viewIdx);
62f32 getFovy(const IUseCamera* user, s32 viewIdx);
63f32 getFovy(const SceneCameraInfo* info, s32 viewIdx);
64f32 getNear(const IUseCamera* user, s32 viewIdx);
65f32 getNear(const SceneCameraInfo* info, s32 viewIdx);
66f32 getFar(const IUseCamera* user, s32 viewIdx);
67f32 getFar(const SceneCameraInfo* info, s32 viewIdx);
68f32 calcCameraDistance(const IUseCamera* user, s32 viewIdx);
69f32 calcFovxDegree(const IUseCamera* user, s32 viewIdx);
70f32 calcCurrentFovyRate(const IUseCamera* user, s32 viewIdx);
71void calcCameraFront(sead::Vector3f*, const IUseCamera* user, s32 viewIdx);
72void setNearClipDistance(const IUseCamera* user, f32 distance, s32 updaterIdx);
73void setFarClipDistance(const IUseCamera* user, f32 distance, s32 updaterIdx);
74void setCurrentCameraPose(CameraPoseInfo* poseInfo, const IUseCamera* user);
75void calcCameraDir(sead::Vector3f* dir, const IUseCamera* user, s32 viewIdx);
76void calcCameraLookDir(sead::Vector3f* lookDir, const IUseCamera* user, s32 viewIdx);
77void calcCameraSideDir(sead::Vector3f* sideDir, const IUseCamera* user, s32 viewIdx);
78void calcCameraUpDir(sead::Vector3f* upDir, const IUseCamera* user, s32 viewIdx);
79bool tryCalcCameraDir(sead::Vector3f* dir, const SceneCameraInfo* info, s32 viewIdx);
80bool tryCalcCameraDirH(sead::Vector3f* dirH, const SceneCameraInfo* info,
81 const sead::Vector3f& upDir, s32 viewIdx);
82bool tryCalcCameraLookDirH(sead::Vector3f* lookDirH, const SceneCameraInfo* info,
83 const sead::Vector3f& upDir, s32 viewIdx);
84void startCamera(const IUseCamera* user, CameraTicket* ticket, s32 unk = -1);
85void startCameraSub(const IUseCamera* user, CameraTicket* ticket, s32 unk = -1);
86void startAnimCamera(const IUseCamera* user, CameraTicket* ticket, const char* animName,
87 s32 unk = 0);
88void startAnimCameraAnim(CameraTicket* ticket, const char*, s32, s32, s32);
89void startAnimCameraWithStartStepAndEndStepAndPlayStep(const IUseCamera* user, CameraTicket* ticket,
90 const char* animName, s32, s32, s32, s32);
91void endCamera(const IUseCamera* user, CameraTicket* ticket, s32, bool);
92void endCameraWithNextCameraPose(const IUseCamera* user, CameraTicket* ticket,
93 const CameraPoseInfo* poseInfo, s32);
94void endCameraSub(const IUseCamera* user, CameraTicket* ticket, s32);
95bool isActiveCamera(const CameraTicket* ticket);
96CameraTicket* initObjectCamera(const IUseCamera* user, const PlacementInfo& placementInfo,
97 const char*, const char*);
98CameraTicket* initObjectCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
99 const char*, const char*);
100CameraTicket* initObjectCameraNoPlacementInfo(const IUseCamera* user, const char*, const char*);
101CameraTicket* initFixCamera(const IUseCamera* user, const char*, const sead::Vector3f&,
102 const sead::Vector3f& lookAtPos);
103CameraTicket* initFixDoorwayCamera(const IUseCamera* user, const char*, const sead::Vector3f&,
104 const sead::Vector3f& lookAtPos);
105CameraTicket* initFixActorCamera(const LiveActor* actor, const ActorInitInfo& actorInitInfo,
106 const char*, const sead::Vector3f&, f32, f32, f32, bool);
107CameraTicket* initFixLookCamera(LiveActor* actor, const ActorInitInfo& actorInitInfo, const char*);
108CameraTicket* initFixTalkCamera(const LiveActor* actor, const ActorInitInfo& actorInitInfo,
109 const char*, const sead::Vector3f&, f32, f32, f32, bool);
110CameraTicket* initFixFishingCamera(const LiveActor* actor, const ActorInitInfo& actorInitInfo,
111 const char*, const sead::Vector3f&, const sead::Vector3f&, f32,
112 f32, f32, bool);
113CameraTicket* initFixPointCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
114 const char*, bool);
115CameraTicket* initLookDownCamera(const LiveActor* actor, const ActorInitInfo& actorInitInfo,
116 const char*);
117CameraTicket* initProgramableCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
118 const char*, const sead::Vector3f*, const sead::Vector3f*,
119 const sead::Vector3f*);
120CameraTicket* initProgramableCamera(const IUseCamera* user, const char*, const sead::Vector3f*,
121 const sead::Vector3f*, const sead::Vector3f*);
122CameraTicket* initProgramableCameraWithCollider(const IUseCamera* user,
123 const ActorInitInfo& actorInitInfo, const char*,
124 const sead::Vector3f*, const sead::Vector3f*,
125 const sead::Vector3f*);
126CameraTicket* initProgramableAngleCamera(const IUseCamera* user, const PlacementInfo& placementInfo,
127 const char*, const sead::Vector3f*, const f32*, const f32*,
128 const f32*);
129CameraTicket* initProgramableCameraKeepColliderPreCamera(const IUseCamera* user,
130 const ActorInitInfo& actorInitInfo,
131 const char*, const sead::Vector3f*,
132 const sead::Vector3f*,
133 const sead::Vector3f*);
134CameraTicket* initShooterCameraSingle(const IUseCamera* user, const char*);
135CameraTicket* initTowerCameraWithSave(const IUseCamera* user, const sead::Vector3f*,
136 const ActorInitInfo& actorInitInfo, const char*);
137CameraTicket* initTowerCamera(const IUseCamera* user, const sead::Vector3f*,
138 const ActorInitInfo& actorInitInfo, const char*);
139CameraTicket* initBossBattleCamera(const IUseCamera* user, const sead::Vector3f*,
140 const ActorInitInfo& actorInitInfo, const char*);
141void initProgramableCameraAngleSwing(CameraTicket* ticket);
142CameraTicket* initFollowCameraSimple(const IUseCamera* user, const char*);
143CameraTicket* initFollowCameraSimple(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
144 const char*);
145CameraTicket* initDemoObjectCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
146 const char*, const char*);
147CameraTicket* initDemoProgramableCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
148 const char*, const sead::Vector3f*, const sead::Vector3f*,
149 const sead::Vector3f*);
150CameraTicket* initDemoProgramableCameraKeepColliderPreCamera(const IUseCamera* user,
151 const ActorInitInfo& actorInitInfo,
152 const char*, const sead::Vector3f*,
153 const sead::Vector3f*,
154 const sead::Vector3f*);
155CameraTicket* initDemoAnimCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
156 const Resource*, const sead::Matrix34f*, const char*);
157CameraTicket* initAnimCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
158 const Resource*, const sead::Matrix34f*, const char*);
159CameraTicket* initDemoAnimCamera(const LiveActor* actor, const ActorInitInfo& actorInitInfo,
160 const char*);
161void loadActorCameraParam(CameraTicket* ticket, const LiveActor* actor, const char*, const char*);
162void loadActorCameraParamInitFile(CameraTicket* ticket, const LiveActor* actor, const char*);
163void setFixActorCameraTarget(CameraTicket* ticket, const LiveActor* actor);
164void setFixActorCameraAngleH(CameraTicket* ticket, f32 angleH);
165void setTowerCameraDistance(CameraTicket* ticket, f32 distance);
166void setTowerCameraStartAngleV(CameraTicket* ticket, f32 startAngleV);
167void setTowerCameraUserMarginAngleH(CameraTicket* ticket, f32 angleH);
168void resetTowerCameraUserMarginAngleH(CameraTicket* ticket);
169void resetTowerCameraInputRotate(CameraTicket* ticket, f32, s32);
170CameraTicket* initSubjectiveCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
171 const char*);
172CameraTicket* initSubjectiveCameraNoSave(const IUseCamera* user, const char*);
173f32 getSubjectiveCameraOffsetUp(const CameraTicket* ticket);
174f32 getSubjectiveCameraOffsetFront();
175void setSubjectiveCameraStartAngleH(const CameraTicket* ticket, f32 angleH);
176void validateSubjectiveCameraResetAngleH(CameraTicket* ticket);
177void requestSubjectiveCameraZoomIn(CameraTicket* ticket);
178CameraTicket* initParallelCamera(const IUseCamera* user, const char*);
179CameraTicket* initParallelCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
180 const char*);
181void setParallelCameraLookAtOffset(const CameraTicket* ticket, const sead::Vector3f& offset);
182void setParallelCameraDistance(const CameraTicket* ticket, f32 distance);
183void setParallelCameraAngleH(const CameraTicket* ticket, f32 angleH);
184void setParallelCameraAngleV(const CameraTicket* ticket, f32 angleV);
185CameraTicket* initQuickTurnCamera(const IUseCamera* user, const char*);
186void setQuickTurnCameraFollow(CameraTicket* ticket);
187void setQuickTurnCameraRotateFast(CameraTicket* ticket);
188CameraTicket* initRaceCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
189 const char*);
190void setRaceCameraFrontDirPtr(const CameraTicket* ticket, const sead::Vector3f* frontDirPtr);
191void setRaceCameraDistance(const CameraTicket* ticket, f32 distance);
192void setRaceCameraOffsetY(const CameraTicket* ticket, f32 offsetY);
193void setRaceCameraAngleDegreeV(const CameraTicket* ticket, f32 angleV);
194CameraTicket* initCartCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
195 const char*);
196void stopCartCamera(const CameraTicket* ticket);
197void restartCartCamera(const CameraTicket* ticket);
198CameraTicket* initActorRailParallelCamera(const LiveActor* actor,
199 const ActorInitInfo& actorInitInfo, const char*);
200CameraTicket* initKinopioBrigadeCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
201 const char*);
202CameraTicket* initAnimCamera(const LiveActor* actor, const ActorInitInfo& actorInitInfo,
203 const char*);
204void validateAnimCameraAngleSwing(CameraTicket* ticket);
205void invalidateAnimCameraAngleSwing(CameraTicket* ticket);
206void setAnimCameraBaseMtxPtr(CameraTicket* ticket, const sead::Matrix34f* baseMtxPtr);
207CameraTicket* initEntranceCamera(const IUseCamera* user, const PlacementInfo& placementInfo,
208 const char*);
209CameraTicket* initEntranceCamera(const IUseCamera* user, const ActorInitInfo& actorInitInfo,
210 const char*);
211CameraTicket* initEntranceCameraNoSave(const IUseCamera* user, const PlacementInfo& placementInfo,
212 const char*);
213void setEntranceCameraParam(CameraTicket* ticket, f32, const sead::Vector3f&,
214 const sead::Vector3f&);
215void setEntranceCameraLookAt(CameraTicket* ticket, const sead::Vector3f& lookAt);
216void invalidateEndEntranceCamera(LiveActor* actor);
217void invalidateEndEntranceCameraWithName(IUseCamera* user, const char* name);
218void validateEndEntranceCamera(IUseCamera* user);
219bool isPlayingEntranceCamera(const IUseCamera* user, s32 updaterIdx);
220void setCameraInterpoleStep(CameraTicket* ticket, s32 step);
221void setCameraFovyDegree(CameraTicket* ticket, f32 fovy);
222SimpleCameraInput* createSimpleCameraInput(s32 port);
223void setCameraInput(IUseCamera* user, const ICameraInput* cameraInput);
224void setViewCameraInput(IUseCamera* user, const ICameraInput* cameraInput, s32 inputIdx);
225bool isExistCameraInputAtDisableTiming(const IUseCamera* user, s32 inputIdx);
226ActorCameraTarget* createActorCameraTarget(const LiveActor* actor, f32);
227ActorCameraTarget* createActorCameraTarget(const LiveActor* actor, const sead::Vector3f*);
228ActorMatrixCameraTarget* createActorJointCameraTarget(const LiveActor* actor,
229 const char* jointName);
230ActorMatrixCameraTarget* createActorMatrixCameraTarget(const LiveActor* actor,
231 const sead::Matrix34f* matrix);
232bool isActiveCameraTarget(const CameraTargetBase* target);
233void setCameraTarget(IUseCamera* user, CameraTargetBase* target);
234void resetCameraTarget(IUseCamera* user, CameraTargetBase* target);
235ActorCameraSubTarget* createActorCameraSubTarget(const LiveActor* actor, const sead::Vector3f*);
236ActorBackAroundCameraSubTarget* createActorBackAroundCameraSubTarget(const LiveActor* actor,
237 const sead::Vector3f*);
238TransCameraSubTarget* createTransCameraSubTarget(const char*, const sead::Vector3f*);
239void initCameraSubTargetTurnParam(CameraSubTargetBase* target,
240 const CameraSubTargetTurnParam* turnParam);
241bool isActiveCameraSubTarget(const CameraSubTargetBase* target);
242void setCameraSubTarget(IUseCamera* user, CameraSubTargetBase* target);
243void resetCameraSubTarget(IUseCamera* user, CameraSubTargetBase* target);
244void setCameraPlacementSubTarget(IUseCamera* user, CameraSubTargetBase* target);
245void resetCameraPlacementSubTarget(IUseCamera* user, CameraSubTargetBase* target);
246const CameraDistanceCurve* getCameraDistanceRocketFlowerCurve();
247void setViewCameraTarget(IUseCamera* user, CameraTargetBase* target, s32);
248void startCameraShakeByAction(const LiveActor* actor, const char*, const char*, s32, s32);
249void startCameraShakeByHitReaction(const IUseCamera* user, const char*, const char*, const char*,
250 s32, s32);
251void requestCameraLoopShakeWeak(const IUseCamera* user);
252bool isActiveCameraInterpole(const IUseCamera* user, s32);
253bool isActiveCameraInterpole(const SceneCameraInfo* info, s32);
254void startCameraInterpole(const IUseCamera* user, s32, s32);
255void requestCancelCameraInterpole(const IUseCamera* user, s32);
256bool tryCalcCameraPoseWithoutInterpole(sead::LookAtCamera* camera, const IUseCamera* user, s32);
257void invalidateCameraPoserVerticalAbsorber(CameraTicket* ticket);
258void requestStopCameraVerticalAbsorb(IUseCamera* user);
259void validateSnapShotCameraZoomFovy(CameraTicket* ticket);
260void validateSnapShotCameraRoll(CameraTicket* ticket);
261bool isSnapShotOrientationRotate90(const IUseCamera* user);
262bool isSnapShotOrientationRotate270(const IUseCamera* user);
263bool isValidCameraGyro(const IUseCamera* user);
264bool isInvalidChangeSubjectiveCamera(const IUseCamera* user);
265bool isCurrentCameraZooming(const IUseCamera* user, s32);
266void onCameraRideObj(const LiveActor* actor);
267void offCameraRideObj(const LiveActor* actor);
268bool isExistAnimCameraData(const CameraTicket* ticket, const char*);
269bool isEndAnimCamera(const CameraTicket* ticket);
270bool isAnimCameraPlaying(const CameraTicket* ticket);
271bool isAnimCameraAnimPlaying(const CameraTicket* ticket, const char*);
272s32 getAnimCameraStepMax(const CameraTicket* ticket);
273s32 getAnimCameraStep(const CameraTicket* ticket);
274s32 calcAnimCameraAnimStepMax(const CameraTicket* ticket, const char*);
275void setAnimCameraRotateBaseUp(const CameraTicket* ticket);
276} // namespace al
277
278namespace alCameraFunction {
279al::CameraTicket* initCameraNoPlacementInfoNoSave(al::CameraPoser* poser,
280 const al::IUseCamera* user,
281 const al::PlacementId* placementId, const char*,
282 s32, const sead::Matrix34f&);
283al::CameraTicket* initCameraNoSave(al::CameraPoser* poser, const al::IUseCamera* user,
284 const al::ActorInitInfo& actorInitInfo, const char*, s32);
285al::CameraTicket* initCamera(al::CameraPoser* poser, const al::IUseCamera* user,
286 const al::ActorInitInfo& actorInitInfo, const char*, s32);
287al::CameraTicket* initCameraNoSave(al::CameraPoser* poser, const al::IUseCamera* user,
288 const al::PlacementInfo& placementInfo, const char*, s32);
289al::CameraTicket* initCameraNoPlacementInfo(al::CameraPoser* poser, const al::IUseCamera* user,
290 const al::PlacementId* placementId, const char*, s32,
291 const sead::Matrix34f&);
292void requestCameraShakeLoop(const al::IUseCamera* user, const char*);
293al::CameraTicket* initCamera(al::CameraPoser* poser, const al::IUseCamera* user,
294 const al::PlacementInfo& placementInfo, const char*, s32);
295al::CameraTicket* initAreaCamera(const al::IUseCamera* user, const al::PlacementInfo& placementInfo,
296 const char*);
297al::CameraTicket* initForceAreaCamera(const al::IUseCamera* user,
298 const al::PlacementInfo& placementInfo, const char*);
299void initPriorityBossField(al::CameraTicket* ticket);
300void initPriorityCapture(al::CameraTicket* ticket);
301void initPriorityObject(al::CameraTicket* ticket);
302void initPrioritySafetyPointRecovery(al::CameraTicket* ticket);
303void initPriorityDemoTalk(al::CameraTicket* ticket);
304void initPriorityDemo(al::CameraTicket* ticket);
305void initPriorityDemo2(al::CameraTicket* ticket);
306bool isCurrentCameraPriorityPlayer(const al::IUseCamera* user, s32);
307void setPoserNearClipDistance(al::CameraTicket* ticket, f32 distance);
308f32 getNearClipDistance(const al::IUseCamera* user, s32);
309void validateCameraArea2D(al::IUseCamera* user);
310void invalidateCameraArea2D(al::IUseCamera* user);
311void validateCameraAreaKids(al::IUseCamera* user);
312bool isValidCameraAreaKids(const al::CameraFlagCtrl* flagCtrl);
313void onSeparatePlayMode(al::IUseCamera* user);
314void offSeparatePlayMode(al::IUseCamera* user);
315void validateResetPoseNextCamera(al::CameraTicket* ticket);
316void validateKeepPreSelfPoseNextCamera(al::CameraTicket* ticket);
317void validateCameraInterpoleEaseOut(al::CameraTicket* ticket);
318void onForceCollideAtStartInterpole(al::CameraTicket* ticket);
319void initCameraSettingCloudSea(al::IUseCamera* user, f32);
320al::CameraTicket* initMirrorAreaCamera(const al::IUseCamera* user,
321 const al::PlacementInfo& placementInfo, const char*);
322} // namespace alCameraFunction
323
324void validateFixPointCameraUsePreCameraPos(al::CameraTicket* ticket);
325