1#pragma once
2
3#include <math/seadMatrix.h>
4#include <math/seadQuat.h>
5#include <math/seadVector.h>
6
7namespace al {
8
9class ActorPoseKeeperBase {
10public:
11 ActorPoseKeeperBase();
12
13 virtual const sead::Vector3f& getRotate() const { return sead::Vector3f::zero; }
14
15 virtual const sead::Vector3f& getScale() const { return sead::Vector3f::ones; }
16
17 virtual const sead::Vector3f& getVelocity() const { return sead::Vector3f::zero; }
18
19 virtual const sead::Vector3f& getFront() const { return sead::Vector3f::ez; }
20
21 virtual const sead::Vector3f& getUp() const { return sead::Vector3f::ey; }
22
23 virtual const sead::Quatf& getQuat() const { return sead::Quatf::unit; }
24
25 virtual const sead::Vector3f& getGravity() const { return sDefaultVelocity; }
26
27 virtual const sead::Matrix34f& getMtx() const { return sead::Matrix34f::ident; }
28
29 virtual sead::Vector3f* getRotatePtr() { return nullptr; }
30
31 virtual sead::Vector3f* getScalePtr() { return nullptr; }
32
33 virtual sead::Vector3f* getVelocityPtr() { return nullptr; }
34
35 virtual sead::Vector3f* getFrontPtr() { return nullptr; }
36
37 virtual sead::Vector3f* getUpPtr() { return nullptr; }
38
39 virtual sead::Quatf* getQuatPtr() { return nullptr; }
40
41 virtual sead::Vector3f* getGravityPtr() { return nullptr; }
42
43 virtual sead::Matrix34f* getMtxPtr() { return nullptr; }
44
45 virtual void updatePoseTrans(const sead::Vector3f& trans) = 0;
46 virtual void updatePoseRotate(const sead::Vector3f& rot) = 0;
47 virtual void updatePoseQuat(const sead::Quatf& quat) = 0;
48 virtual void updatePoseMtx(const sead::Matrix34f* mtx) = 0;
49 virtual void copyPose(const ActorPoseKeeperBase* other);
50 virtual void calcBaseMtx(sead::Matrix34f* mtx) const = 0;
51
52 const sead::Vector3f& getTrans() const { return mTrans; }
53
54 sead::Vector3f* getTransPtr() { return &mTrans; }
55
56protected: // protected so it's visible to all sub-classes (TFSV, TFGSV, ...)
57 sead::Vector3f mTrans = {0, 0, 0};
58
59 static sead::Vector3f sDefaultVelocity;
60};
61
62class ActorPoseKeeperTFSV : public ActorPoseKeeperBase {
63public:
64 ActorPoseKeeperTFSV();
65
66 const sead::Vector3f& getFront() const override { return mFront; }
67
68 sead::Vector3f* getFrontPtr() override { return &mFront; }
69
70 const sead::Vector3f& getScale() const override { return mScale; }
71
72 sead::Vector3f* getScalePtr() override { return &mScale; }
73
74 const sead::Vector3f& getVelocity() const override { return mVelocity; }
75
76 sead::Vector3f* getVelocityPtr() override { return &mVelocity; }
77
78 void updatePoseTrans(const sead::Vector3f& trans) override;
79 void updatePoseRotate(const sead::Vector3f& rot) override;
80 void updatePoseQuat(const sead::Quatf& quat) override;
81 void updatePoseMtx(const sead::Matrix34f* mtx) override;
82 void calcBaseMtx(sead::Matrix34f* mtx) const override;
83
84protected: // protected so it's visible to all sub-classes (TFGSV, TFUSV)
85 sead::Vector3f mFront = sead::Vector3f::ez;
86 sead::Vector3f mScale = {1.0, 1.0, 1.0};
87 sead::Vector3f mVelocity = {0.0, 0.0, 0.0};
88};
89
90class ActorPoseKeeperTFGSV : public ActorPoseKeeperTFSV {
91public:
92 ActorPoseKeeperTFGSV();
93
94 const sead::Vector3f& getGravity() const override { return mGravity; }
95
96 sead::Vector3f* getGravityPtr() override { return &mGravity; }
97
98 void updatePoseTrans(const sead::Vector3f& trans) override;
99 void updatePoseRotate(const sead::Vector3f& rot) override;
100 void updatePoseQuat(const sead::Quatf& quat) override;
101 void updatePoseMtx(const sead::Matrix34f* mtx) override;
102 void calcBaseMtx(sead::Matrix34f* mtx) const override;
103
104private:
105 sead::Vector3f mGravity = {0.0, -1.0, 0.0};
106};
107
108class ActorPoseKeeperTFUSV : public ActorPoseKeeperTFSV {
109public:
110 ActorPoseKeeperTFUSV();
111
112 const sead::Vector3f& getUp() const override { return mUp; }
113
114 sead::Vector3f* getUpPtr() override { return &mUp; }
115
116 void updatePoseTrans(const sead::Vector3f& trans) override;
117 void updatePoseRotate(const sead::Vector3f& rot) override;
118 void updatePoseQuat(const sead::Quatf& quat) override;
119 void updatePoseMtx(const sead::Matrix34f* mtx) override;
120 void calcBaseMtx(sead::Matrix34f* mtx) const override;
121
122 void setFrontUp(bool isFrontUp) { mIsFrontUp = isFrontUp; }
123
124private:
125 sead::Vector3f mUp = sead::Vector3f::ey;
126 bool mIsFrontUp = false;
127};
128
129class ActorPoseKeeperTQSV : public ActorPoseKeeperBase {
130public:
131 ActorPoseKeeperTQSV();
132
133 const sead::Quatf& getQuat() const override { return mQuat; }
134
135 sead::Quatf* getQuatPtr() override { return &mQuat; }
136
137 const sead::Vector3f& getScale() const override { return mScale; }
138
139 sead::Vector3f* getScalePtr() override { return &mScale; }
140
141 const sead::Vector3f& getVelocity() const override { return mVelocity; }
142
143 sead::Vector3f* getVelocityPtr() override { return &mVelocity; }
144
145 void updatePoseTrans(const sead::Vector3f& trans) override;
146 void updatePoseRotate(const sead::Vector3f& rot) override;
147 void updatePoseQuat(const sead::Quatf& quat) override;
148 void updatePoseMtx(const sead::Matrix34f* mtx) override;
149 void calcBaseMtx(sead::Matrix34f* mtx) const override;
150
151private:
152 sead::Quatf mQuat = sead::Quatf::unit;
153 sead::Vector3f mScale = {1.0, 1.0, 1.0};
154 sead::Vector3f mVelocity = {0.0, 0.0, 0.0};
155};
156
157class ActorPoseKeeperTQGSV : public ActorPoseKeeperBase {
158public:
159 ActorPoseKeeperTQGSV();
160
161 const sead::Quatf& getQuat() const override { return mQuat; }
162
163 sead::Quatf* getQuatPtr() override { return &mQuat; }
164
165 const sead::Vector3f& getGravity() const override { return mGravity; }
166
167 sead::Vector3f* getGravityPtr() override { return &mGravity; }
168
169 const sead::Vector3f& getScale() const override { return mScale; }
170
171 sead::Vector3f* getScalePtr() override { return &mScale; }
172
173 const sead::Vector3f& getVelocity() const override { return mVelocity; }
174
175 sead::Vector3f* getVelocityPtr() override { return &mVelocity; }
176
177 void updatePoseTrans(const sead::Vector3f& trans) override;
178 void updatePoseRotate(const sead::Vector3f& rot) override;
179 void updatePoseQuat(const sead::Quatf& quat) override;
180 void updatePoseMtx(const sead::Matrix34f* mtx) override;
181 void calcBaseMtx(sead::Matrix34f* mtx) const override;
182
183private:
184 sead::Quatf mQuat = sead::Quatf::unit;
185 sead::Vector3f mGravity = {0.0, -1.0, 0.0};
186 sead::Vector3f mScale = {1.0, 1.0, 1.0};
187 sead::Vector3f mVelocity = {0.0, 0.0, 0.0};
188};
189
190class ActorPoseKeeperTQGMSV : public ActorPoseKeeperBase {
191public:
192 ActorPoseKeeperTQGMSV();
193
194 const sead::Quatf& getQuat() const override { return mQuat; }
195
196 sead::Quatf* getQuatPtr() override { return &mQuat; }
197
198 const sead::Vector3f& getGravity() const override { return mGravity; }
199
200 sead::Vector3f* getGravityPtr() override { return &mGravity; }
201
202 const sead::Matrix34f& getMtx() const override { return mMtx; }
203
204 sead::Matrix34f* getMtxPtr() override { return &mMtx; }
205
206 const sead::Vector3f& getScale() const override { return mScale; }
207
208 sead::Vector3f* getScalePtr() override { return &mScale; };
209
210 const sead::Vector3f& getVelocity() const override { return mVelocity; }
211
212 sead::Vector3f* getVelocityPtr() override { return &mVelocity; }
213
214 void updatePoseTrans(const sead::Vector3f& trans) override;
215 void updatePoseRotate(const sead::Vector3f& rot) override;
216 void updatePoseQuat(const sead::Quatf& quat) override;
217 void updatePoseMtx(const sead::Matrix34f* mtx) override;
218 void calcBaseMtx(sead::Matrix34f* mtx) const override;
219
220private:
221 sead::Quatf mQuat = sead::Quatf::unit;
222 sead::Vector3f mGravity = {0.0, -1.0, 0.0};
223 sead::Vector3f mScale = {1.0, 1.0, 1.0};
224 sead::Vector3f mVelocity = {0.0, 0.0, 0.0};
225 sead::Matrix34f mMtx = sead::Matrix34f::ident;
226};
227
228class ActorPoseKeeperTRSV : public ActorPoseKeeperBase {
229public:
230 ActorPoseKeeperTRSV();
231
232 const sead::Vector3f& getRotate() const override { return mRotate; }
233
234 sead::Vector3f* getRotatePtr() override { return &mRotate; }
235
236 const sead::Vector3f& getScale() const override { return mScale; }
237
238 sead::Vector3f* getScalePtr() override { return &mScale; }
239
240 const sead::Vector3f& getVelocity() const override { return mVelocity; }
241
242 sead::Vector3f* getVelocityPtr() override { return &mVelocity; }
243
244 void updatePoseTrans(const sead::Vector3f& trans) override;
245 void updatePoseRotate(const sead::Vector3f& rot) override;
246 void updatePoseQuat(const sead::Quatf& quat) override;
247 void updatePoseMtx(const sead::Matrix34f* mtx) override;
248 void calcBaseMtx(sead::Matrix34f* mtx) const override;
249
250private:
251 sead::Vector3f mRotate = {0.0, 0.0, 0.0};
252 sead::Vector3f mScale = {1.0, 1.0, 1.0};
253 sead::Vector3f mVelocity = {0.0, 0.0, 0.0};
254};
255
256class ActorPoseKeeperTRMSV : public ActorPoseKeeperBase {
257public:
258 ActorPoseKeeperTRMSV();
259
260 const sead::Vector3f& getRotate() const override { return mRotate; }
261
262 sead::Vector3f* getRotatePtr() override { return &mRotate; }
263
264 const sead::Matrix34f& getMtx() const override { return mMtx; }
265
266 sead::Matrix34f* getMtxPtr() override { return &mMtx; }
267
268 const sead::Vector3f& getScale() const override { return mScale; }
269
270 sead::Vector3f* getScalePtr() override { return &mScale; }
271
272 const sead::Vector3f& getVelocity() const override { return mVelocity; }
273
274 sead::Vector3f* getVelocityPtr() override { return &mVelocity; }
275
276 __attribute__((flatten)) void updatePoseTrans(const sead::Vector3f& trans) override;
277 void updatePoseRotate(const sead::Vector3f& rot) override;
278 void updatePoseQuat(const sead::Quatf& quat) override;
279 void updatePoseMtx(const sead::Matrix34f* mtx) override;
280 void calcBaseMtx(sead::Matrix34f* mtx) const override;
281
282private:
283 sead::Vector3f mRotate = {0.0, 0.0, 0.0};
284 sead::Vector3f mScale = {1.0, 1.0, 1.0};
285 sead::Vector3f mVelocity = {0.0, 0.0, 0.0};
286 sead::Matrix34f mMtx; // manually set in the ctor
287};
288
289class ActorPoseKeeperTRGMSV : public ActorPoseKeeperBase {
290public:
291 ActorPoseKeeperTRGMSV();
292
293 const sead::Vector3f& getRotate() const override { return mRotate; }
294
295 sead::Vector3f* getRotatePtr() override { return &mRotate; }
296
297 const sead::Vector3f& getGravity() const override { return mGravity; }
298
299 sead::Vector3f* getGravityPtr() override { return &mGravity; }
300
301 const sead::Matrix34f& getMtx() const override { return mMtx; }
302
303 sead::Matrix34f* getMtxPtr() override { return &mMtx; }
304
305 const sead::Vector3f& getScale() const override { return mScale; }
306
307 sead::Vector3f* getScalePtr() override { return &mScale; }
308
309 const sead::Vector3f& getVelocity() const override { return mVelocity; }
310
311 sead::Vector3f* getVelocityPtr() override { return &mVelocity; }
312
313 void updatePoseTrans(const sead::Vector3f& trans) override;
314 void updatePoseRotate(const sead::Vector3f& rot) override;
315 void updatePoseQuat(const sead::Quatf& quat) override;
316 void updatePoseMtx(const sead::Matrix34f* mtx) override;
317 void calcBaseMtx(sead::Matrix34f* mtx) const override;
318
319private:
320 sead::Vector3f mRotate = {0.0, 0.0, 0.0};
321 sead::Vector3f mGravity = -sead::Vector3f::ey;
322 sead::Vector3f mScale = {1.0, 1.0, 1.0};
323 sead::Vector3f mVelocity = {0.0, 0.0, 0.0};
324 sead::Matrix34f mMtx;
325};
326
327} // namespace al
328