1#include "Library/LiveActor/ActorPoseKeeper.h"
2
3#include "Library/Math/MathUtil.h"
4#include "Library/Matrix/MatrixUtil.h"
5
6namespace al {
7
8static void rotationAndTranslationFromMatrix(sead::Vector3f* trans, sead::Vector3f* rot,
9 const sead::Matrix34f* mtx) {
10 sead::Vector3f tmp;
11 mtx->getRotation(o&: tmp);
12 rot->set(x_: sead::Mathf::rad2deg(rad: tmp.x), y_: sead::Mathf::rad2deg(rad: tmp.y), z_: sead::Mathf::rad2deg(rad: tmp.z));
13 mtx->getTranslation(o&: *trans);
14}
15
16ActorPoseKeeperBase::ActorPoseKeeperBase() = default;
17
18void ActorPoseKeeperBase::copyPose(const ActorPoseKeeperBase* other) {
19 sead::Matrix34f mtx;
20 mtx = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0};
21 other->calcBaseMtx(mtx: &mtx);
22 updatePoseMtx(mtx: &mtx);
23}
24
25ActorPoseKeeperTFSV::ActorPoseKeeperTFSV() = default;
26
27void ActorPoseKeeperTFSV::updatePoseTrans(const sead::Vector3f& trans) {
28 mTrans = trans;
29}
30
31void ActorPoseKeeperTFSV::updatePoseRotate(const sead::Vector3f& rot) {
32 sead::Quatf quat;
33 quat.setRPY(roll: sead::Mathf::deg2rad(deg: rot.x), pitch: sead::Mathf::deg2rad(deg: rot.y),
34 yaw: sead::Mathf::deg2rad(deg: rot.z));
35 calcQuatFront(out: &mFront, quat);
36}
37
38void ActorPoseKeeperTFSV::updatePoseQuat(const sead::Quatf& quat) {
39 calcQuatFront(out: &mFront, quat);
40}
41
42void ActorPoseKeeperTFSV::updatePoseMtx(const sead::Matrix34f* mtx) {
43 mtx->getBase(o&: mFront, axis: 2);
44 mtx->getBase(o&: mTrans, axis: 3);
45}
46
47void ActorPoseKeeperTFSV::calcBaseMtx(sead::Matrix34f* mtx) const {
48 makeMtxFrontUpPos(outMtx: mtx, front: mFront, up: -getGravity(), pos: mTrans);
49}
50
51ActorPoseKeeperTFGSV::ActorPoseKeeperTFGSV() = default;
52
53void ActorPoseKeeperTFGSV::updatePoseTrans(const sead::Vector3f& trans) {
54 ActorPoseKeeperTFSV::updatePoseTrans(trans);
55}
56
57void ActorPoseKeeperTFGSV::updatePoseRotate(const sead::Vector3f& rot) {
58 sead::Quatf quat;
59 quat.setRPY(roll: sead::Mathf::deg2rad(deg: rot.x), pitch: sead::Mathf::deg2rad(deg: rot.y),
60 yaw: sead::Mathf::deg2rad(deg: rot.z));
61
62 ActorPoseKeeperTFSV::updatePoseQuat(quat);
63 calcQuatUp(out: &mGravity, quat);
64 mGravity *= -1;
65}
66
67void ActorPoseKeeperTFGSV::updatePoseQuat(const sead::Quatf& quat) {
68 ActorPoseKeeperTFSV::updatePoseQuat(quat);
69 calcQuatUp(out: &mGravity, quat);
70 mGravity *= -1;
71}
72
73void ActorPoseKeeperTFGSV::updatePoseMtx(const sead::Matrix34f* mtx) {
74 ActorPoseKeeperTFSV::updatePoseMtx(mtx);
75 mtx->getBase(o&: mGravity, axis: 1);
76 mGravity *= -1;
77}
78
79void ActorPoseKeeperTFGSV::calcBaseMtx(sead::Matrix34f* mtx) const {
80 makeMtxUpFrontPos(outMtx: mtx, up: -getGravity(), front: getFront(), pos: mTrans);
81}
82
83ActorPoseKeeperTFUSV::ActorPoseKeeperTFUSV() = default;
84
85void ActorPoseKeeperTFUSV::updatePoseTrans(const sead::Vector3f& trans) {
86 ActorPoseKeeperTFSV::updatePoseTrans(trans);
87}
88
89void ActorPoseKeeperTFUSV::updatePoseRotate(const sead::Vector3f& rot) {
90 sead::Quatf quat;
91 quat.setRPY(roll: sead::Mathf::deg2rad(deg: rot.x), pitch: sead::Mathf::deg2rad(deg: rot.y),
92 yaw: sead::Mathf::deg2rad(deg: rot.z));
93
94 ActorPoseKeeperTFSV::updatePoseQuat(quat);
95 calcQuatUp(out: &mUp, quat);
96}
97
98void ActorPoseKeeperTFUSV::updatePoseQuat(const sead::Quatf& quat) {
99 ActorPoseKeeperTFSV::updatePoseQuat(quat);
100 calcQuatUp(out: &mUp, quat);
101}
102
103void ActorPoseKeeperTFUSV::updatePoseMtx(const sead::Matrix34f* mtx) {
104 ActorPoseKeeperTFSV::updatePoseMtx(mtx);
105 mtx->getBase(o&: mUp, axis: 1);
106}
107
108void ActorPoseKeeperTFUSV::calcBaseMtx(sead::Matrix34f* mtx) const {
109 if (mIsFrontUp)
110 makeMtxFrontUpPos(outMtx: mtx, front: getFront(), up: getUp(), pos: mTrans);
111 else
112 makeMtxUpFrontPos(outMtx: mtx, up: getUp(), front: getFront(), pos: mTrans);
113}
114
115ActorPoseKeeperTQSV::ActorPoseKeeperTQSV() = default;
116
117void ActorPoseKeeperTQSV::updatePoseTrans(const sead::Vector3f& trans) {
118 mTrans = trans;
119}
120
121void ActorPoseKeeperTQSV::updatePoseRotate(const sead::Vector3f& rot) {
122 mQuat.setRPY(roll: sead::Mathf::deg2rad(deg: rot.x), pitch: sead::Mathf::deg2rad(deg: rot.y),
123 yaw: sead::Mathf::deg2rad(deg: rot.z));
124}
125
126void ActorPoseKeeperTQSV::updatePoseQuat(const sead::Quatf& quat) {
127 mQuat.x = quat.x;
128 mQuat.y = quat.y;
129 mQuat.z = quat.z;
130 mQuat.w = quat.w;
131}
132
133void ActorPoseKeeperTQSV::updatePoseMtx(const sead::Matrix34f* mtx) {
134 mtx->toQuat(q&: mQuat);
135 mtx->getBase(o&: mTrans, axis: 3);
136}
137
138void ActorPoseKeeperTQSV::calcBaseMtx(sead::Matrix34f* mtx) const {
139 mtx->makeQT(q: mQuat, t: mTrans);
140}
141
142ActorPoseKeeperTQGSV::ActorPoseKeeperTQGSV() = default;
143
144void ActorPoseKeeperTQGSV::updatePoseTrans(const sead::Vector3f& trans) {
145 mTrans = trans;
146}
147
148void ActorPoseKeeperTQGSV::updatePoseRotate(const sead::Vector3f& rot) {
149 mQuat.setRPY(roll: sead::Mathf::deg2rad(deg: rot.x), pitch: sead::Mathf::deg2rad(deg: rot.y),
150 yaw: sead::Mathf::deg2rad(deg: rot.z));
151}
152
153void ActorPoseKeeperTQGSV::updatePoseQuat(const sead::Quatf& quat) {
154 mQuat.x = quat.x;
155 mQuat.y = quat.y;
156 mQuat.z = quat.z;
157 mQuat.w = quat.w;
158}
159
160void ActorPoseKeeperTQGSV::updatePoseMtx(const sead::Matrix34f* mtx) {
161 mtx->toQuat(q&: mQuat);
162 mtx->getTranslation(o&: mTrans);
163}
164
165void ActorPoseKeeperTQGSV::calcBaseMtx(sead::Matrix34f* mtx) const {
166 mtx->makeQT(q: mQuat, t: mTrans);
167}
168
169ActorPoseKeeperTQGMSV::ActorPoseKeeperTQGMSV() = default;
170
171void ActorPoseKeeperTQGMSV::updatePoseTrans(const sead::Vector3f& trans) {
172 mTrans = trans;
173 mMtx.makeQT(q: mQuat, t: mTrans);
174}
175
176void ActorPoseKeeperTQGMSV::updatePoseRotate(const sead::Vector3f& rot) {
177 mQuat.setRPY(roll: sead::Mathf::deg2rad(deg: rot.x), pitch: sead::Mathf::deg2rad(deg: rot.y),
178 yaw: sead::Mathf::deg2rad(deg: rot.z));
179 mMtx.makeQT(q: mQuat, t: mTrans);
180}
181
182void ActorPoseKeeperTQGMSV::updatePoseQuat(const sead::Quatf& quat) {
183 mQuat.x = quat.x;
184 mQuat.y = quat.y;
185 mQuat.z = quat.z;
186 mQuat.w = quat.w;
187 mMtx.makeQT(q: mQuat, t: mTrans);
188}
189
190void ActorPoseKeeperTQGMSV::updatePoseMtx(const sead::Matrix34f* mtx) {
191 mtx->toQuat(q&: mQuat);
192 mtx->getTranslation(o&: mTrans);
193 mMtx.makeQT(q: mQuat, t: mTrans);
194}
195
196void ActorPoseKeeperTQGMSV::calcBaseMtx(sead::Matrix34f* mtx) const {
197 *mtx = mMtx;
198}
199
200ActorPoseKeeperTRSV::ActorPoseKeeperTRSV() = default;
201
202void ActorPoseKeeperTRSV::updatePoseTrans(const sead::Vector3f& trans) {
203 mTrans = trans;
204}
205
206void ActorPoseKeeperTRSV::updatePoseRotate(const sead::Vector3f& rot) {
207 mRotate = rot;
208}
209
210void ActorPoseKeeperTRSV::updatePoseQuat(const sead::Quatf& quat) {
211 sead::Vector3f tmp;
212 quat.calcRPY(vec&: tmp);
213 mRotate = {sead::Mathf::rad2deg(rad: tmp.x), sead::Mathf::rad2deg(rad: tmp.y),
214 sead::Mathf::rad2deg(rad: tmp.z)};
215}
216
217void ActorPoseKeeperTRSV::updatePoseMtx(const sead::Matrix34f* mtx) {
218 rotationAndTranslationFromMatrix(trans: &mTrans, rot: &mRotate, mtx);
219}
220
221void ActorPoseKeeperTRSV::calcBaseMtx(sead::Matrix34f* mtx) const {
222 makeMtxRotateTrans(outMtx: mtx, rotate: getRotate(), trans: mTrans);
223}
224
225ActorPoseKeeperTRMSV::ActorPoseKeeperTRMSV() {
226 mMtx = sead::Matrix34f::ident;
227}
228
229void ActorPoseKeeperTRMSV::updatePoseTrans(const sead::Vector3f& trans) {
230 mTrans = trans;
231 sead::Vector3f rot = getRotate() * (sead::numbers::pi / 180);
232 mMtx.makeRT(r: rot, t: mTrans);
233}
234
235void ActorPoseKeeperTRMSV::updatePoseRotate(const sead::Vector3f& rot) {
236 mRotate = rot;
237 sead::Vector3f rot2 = getRotate() * (sead::numbers::pi / 180);
238 mMtx.makeRT(r: rot2, t: mTrans);
239}
240
241void ActorPoseKeeperTRMSV::updatePoseQuat(const sead::Quatf& quat) {
242 sead::Vector3f tmp;
243 quat.calcRPY(vec&: tmp);
244 mRotate = tmp * (180 / sead::numbers::pi);
245 sead::Vector3f rot = getRotate() * (sead::numbers::pi / 180);
246 mMtx.makeRT(r: rot, t: mTrans);
247}
248
249void ActorPoseKeeperTRMSV::updatePoseMtx(const sead::Matrix34f* mtx) {
250 mMtx = *mtx;
251 rotationAndTranslationFromMatrix(trans: &mTrans, rot: &mRotate, mtx);
252}
253
254void ActorPoseKeeperTRMSV::calcBaseMtx(sead::Matrix34f* mtx) const {
255 *mtx = mMtx;
256}
257
258// NON_MATCHING: mismatch about storing mGravity
259ActorPoseKeeperTRGMSV::ActorPoseKeeperTRGMSV() {
260 mMtx = sead::Matrix34f::ident;
261}
262
263void ActorPoseKeeperTRGMSV::updatePoseTrans(const sead::Vector3f& trans) {
264 mTrans = trans;
265 sead::Vector3f rot = getRotate() * (sead::numbers::pi / 180);
266 mMtx.makeRT(r: rot, t: mTrans);
267}
268
269void ActorPoseKeeperTRGMSV::updatePoseRotate(const sead::Vector3f& rot) {
270 mRotate = rot;
271 sead::Vector3f rot2 = getRotate() * (sead::numbers::pi / 180);
272 mMtx.makeRT(r: rot2, t: mTrans);
273}
274
275void ActorPoseKeeperTRGMSV::updatePoseQuat(const sead::Quatf& quat) {
276 sead::Vector3f tmp;
277 quat.calcRPY(vec&: tmp);
278 mRotate = tmp * (180 / sead::numbers::pi);
279 sead::Vector3f rot = getRotate() * (sead::numbers::pi / 180);
280 mMtx.makeRT(r: rot, t: mTrans);
281}
282
283void ActorPoseKeeperTRGMSV::updatePoseMtx(const sead::Matrix34f* mtx) {
284 mMtx = *mtx;
285 rotationAndTranslationFromMatrix(trans: &mTrans, rot: &mRotate, mtx);
286}
287
288void ActorPoseKeeperTRGMSV::calcBaseMtx(sead::Matrix34f* mtx) const {
289 *mtx = mMtx;
290}
291
292} // namespace al
293