1#pragma once
2
3#include <basis/seadTypes.h>
4#include <math/seadQuat.h>
5#include <math/seadVector.h>
6
7namespace al {
8struct ActorInitInfo;
9class IUseRail;
10class LiveActor;
11class LiveActorGroup;
12class PlacementInfo;
13class RailPlacementCallBack;
14
15void setRailPosToStart(IUseRail* railHolder);
16void setRailPosToEnd(IUseRail* railHolder);
17void setRailPosToNearestPos(IUseRail* railHolder, const sead::Vector3f&);
18void setRailPosToCoord(IUseRail* railHolder, f32);
19void setRailPosToRailPoint(IUseRail* railHolder, s32);
20void setSyncRailToStart(LiveActor* actor);
21void syncRailTrans(LiveActor* actor);
22void setSyncRailToEnd(LiveActor* actor);
23void setSyncRailToNearestPos(LiveActor* actor, const sead::Vector3f&);
24void setSyncRailToNearestRailControlPoint(LiveActor* actor);
25void setSyncRailToNearestPos(LiveActor* actor);
26void setSyncRailToCoord(LiveActor* actor, f32 coord);
27void setSyncRailToRailPoint(LiveActor* actor, s32);
28bool moveRail(IUseRail* railHolder, f32);
29bool isRailReachedGoal(const IUseRail* railHolder);
30bool moveRailLoop(IUseRail* railHolder, f32);
31f32 getRailCoord(const IUseRail* railHolder);
32bool isRailGoingToEnd(const IUseRail* railHolder);
33f32 getRailTotalLength(const IUseRail* railHolder);
34bool moveRailTurn(IUseRail* railHolder, f32, f32);
35void reverseRail(IUseRail* railHolder);
36bool isRailReachedNearGoal(const IUseRail* railHolder, f32);
37bool turnToRailDir(LiveActor* actor, f32);
38void calcRailMoveDir(sead::Vector3f*, const IUseRail* railHolder);
39bool turnToRailDirImmediately(LiveActor* actor);
40const sead::Vector3f& getRailPos(const IUseRail* railHolder);
41bool moveSyncRail(LiveActor* actor, f32);
42bool moveSyncRailLoop(LiveActor* actor, f32 speed);
43bool moveSyncRailTurn(LiveActor* actor, f32 speed);
44f32 calcNearestRailCoord(const IUseRail* railHolder, const sead::Vector3f&);
45f32 calcNearestRailPos(sead::Vector3f*, const IUseRail* railHolder, const sead::Vector3f&);
46void calcNearestRailDir(sead::Vector3f*, const IUseRail* railHolder, const sead::Vector3f&);
47void calcNearestRailPosAndDir(sead::Vector3f*, sead::Vector3f*, const IUseRail* railHolder,
48 const sead::Vector3f&);
49void calcRailPosDir(sead::Vector3f*, sead::Vector3f*, const IUseRail* railHolder, f32);
50void calcRailPointPos(sead::Vector3f*, const IUseRail* railHolder, s32);
51s32 calcNearestRailPointNo(const IUseRail* railHolder, const sead::Vector3f&);
52s32 calcNearestRailPointNo(const IUseRail* railHolder);
53s32 calcCoordNearestRailPointNo(const IUseRail* railHolder);
54s32 getRailPartIndex(const IUseRail* railHolder);
55f32 calcRailPartRate(const IUseRail* railHolder);
56bool isLoopRail(const IUseRail* railHolder);
57s32 getRailPointNum(const IUseRail* railHolder);
58f32 calcNearestRailPointPosCoord(const IUseRail* railHolder, const sead::Vector3f&);
59f32 calcRailCoordByPoint(const IUseRail* railHolder, s32);
60void calcRailUp(sead::Vector3f*, const IUseRail* railHolder);
61PlacementInfo* getRailPointInfo(const IUseRail* railHolder, s32);
62s32 getRailPointNo(const IUseRail* railHolder);
63s32 getNextRailPointNo(const IUseRail* railHolder);
64f32 calcRailToGoalLength(const IUseRail* railHolder);
65f32 calcRailTotalRate(const IUseRail* railHolder);
66f32 calcRailToNextRailPointLength(const IUseRail* railHolder);
67f32 calcRailToPreviousRailPointLength(const IUseRail* railHolder);
68s32 getRailNum(const IUseRail* railHolder);
69const sead::Vector3f& getRailDir(const IUseRail* railHolder);
70bool isRailReachedEnd(const IUseRail* railHolder);
71f32 getRailPartLength(const IUseRail* railHolder, s32);
72bool tryGetCurrentRailPointArg(f32*, const IUseRail* railHolder, const char*);
73bool tryGetNextRailPointArg(f32*, const IUseRail* railHolder, const char*);
74bool tryGetCurrentRailPointArg(s32*, const IUseRail* railHolder, const char*);
75bool tryGetNextRailPointArg(s32*, const IUseRail* railHolder, const char*);
76bool tryGetCurrentRailPointArg(bool*, const IUseRail* railHolder, const char*);
77bool tryGetNextRailPointArg(bool*, const IUseRail* railHolder, const char*);
78bool tryGetCurrentRailPointArg(const char**, const IUseRail* railHolder, const char*);
79bool tryGetNextRailPointArg(const char**, const IUseRail* railHolder, const char*);
80bool isExistRail(const IUseRail* railHolder);
81bool isRailReachedStart(const IUseRail* railHolder);
82bool isRailReachedNearGoal(const IUseRail* railHolder, f32, f32);
83bool isRailReachedEdge(const IUseRail* railHolder);
84bool isRailReachedNearRailPoint(const IUseRail* railHolder, f32);
85bool isRailIncludeBezierPart(const IUseRail* railHolder);
86bool isRailBezierPart(const IUseRail* railHolder, s32);
87bool isRailPlusDir(const IUseRail* railHolder, const sead::Vector3f&);
88bool isRailPlusPoseSide(const LiveActor* actor);
89bool isRailPlusPoseUp(const LiveActor* actor);
90bool isRailPlusPoseFront(const LiveActor* actor);
91void calcRailPosAtCoord(sead::Vector3f*, const IUseRail* railHolder, f32);
92void calcRailDirAtCoord(sead::Vector3f*, const IUseRail* railHolder, f32);
93void calcRailPosFront(sead::Vector3f*, const IUseRail* railHolder, f32);
94void calcRailDirFront(sead::Vector3f*, const IUseRail* railHolder, f32);
95void calcRailPointPose(sead::Quatf*, const IUseRail* railHolder, s32);
96s32 calcRailPointNum(const IUseRail* railHolder, f32, f32);
97s32 calcForwardRailPointNo(const IUseRail* railHolder, s32);
98s32 calcPreviousRailPointNo(const IUseRail* railHolder, s32);
99void calcRailClippingInfo(sead::Vector3f*, f32*, const IUseRail* railHolder, f32, f32);
100void setRailClippingInfo(sead::Vector3f*, LiveActor* actor, f32, f32);
101void calcAndSyncMoveFitRailDir(IUseRail* railHolder, sead::Vector3f*, f32, const sead::Vector3f&,
102 const sead::Vector3f&, bool);
103void calcAndSyncMoveFitRailDir(LiveActor* actor, sead::Vector3f*, f32, bool);
104LiveActorGroup* createRailModelGroup(const IUseRail* railHolder, const ActorInitInfo&, const char*,
105 const char*);
106s32 calcRailDivideNum(const IUseRail* railHolder, f32, bool);
107s32 calcRailDivideForcePointNum(const IUseRail* railHolder, f32);
108s32 calcRailDivideEquallyNum(const IUseRail* railHolder, f32);
109void placementRailDivide(const IUseRail* railHolder, f32, bool, const RailPlacementCallBack&);
110void placementRailDivideForcePoint(const IUseRail* railHolder, f32, const RailPlacementCallBack&);
111void placementRailDivideEqually(const IUseRail* railHolder, f32, const RailPlacementCallBack&);
112} // namespace al
113