SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
ActorMovementUtil.cpp
1#include "Game/Util.hpp"
2#include "Game/LiveActor/Binder.hpp"
3#include "Game/LiveActor/HitSensor.hpp"
4#include "Game/LiveActor/LiveActor.hpp"
5#include "Game/LiveActor/ShadowController.hpp"
6#include "Game/Scene/SceneObjHolder.hpp"
7#include "JSystem/JGeometry.hpp"
8#include "JSystem/JMath/JMath.hpp"
9#include "math_types.hpp"
10
11namespace MR {
12 f32 calcDistance(const HitSensor *pSensor1, const HitSensor *pSensor2, TVec3f *a3) {
13 TVec3f sensor2_pos(pSensor2->mPosition);
14 JMathInlineVEC::PSVECSubtract((Vec*)&sensor2_pos, (Vec*)&pSensor1->mPosition, (Vec*)&sensor2_pos);
15
16 f32 mag = PSVECMag((Vec*)&sensor2_pos);
17
18 if (a3) {
19 if (mag > 0.0f) {
20 PSVECScale((Vec*)&sensor2_pos, (Vec*)a3, 1.0f / mag);
21 }
22 else {
23 a3->zero();
24 }
25 }
26
27 return mag;
28 }
29
30 f32 calcDistance(const LiveActor *pActor, const TVec3f &rVec) {
31 return PSVECDistance((Vec*)&pActor->mPosition, &(const Vec &)rVec);
32 }
33
34 f32 calcDistanceHorizontal(const LiveActor *pActor, const TVec3f &a2, const TVec3f &a3) {
35 TVec3f stack_8(a2);
36 JMathInlineVEC::PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
37 MR::vecKillElement(stack_8, a3, &stack_8);
38 return PSVECMag((Vec*)&stack_8);
39 }
40
41 f32 calcDistanceVertical(const LiveActor *pActor, const TVec3f &a2, const TVec3f &a3) {
42 TVec3f stack_8(a2);
43 JMathInlineVEC::PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
44 stack_8.scale(a3.dot(stack_8), a3);
45 return PSVECMag((Vec*)&stack_8);
46 }
47
48 f32 calcDistanceVertical(const LiveActor *pActor, const TVec3f &a2) {
49 const TVec3f &grav = pActor->mGravity;
50 TVec3f stack_8(a2);
51 JMathInlineVEC::PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
52 stack_8.scale(grav.dot(stack_8), grav);
53 return PSVECMag((Vec*)&stack_8);
54 }
55
56 f32 calcDistanceToPlayer(const LiveActor *pActor) {
57 return (!MR::isExistSceneObj(SceneObj_MarioHolder) ? FLOAT_MAX : PSVECDistance((Vec*)&pActor->mPosition, (Vec*)MR::getPlayerPos()));
58 }
59
60 f32 calcDistanceToPlayerH(const LiveActor *pActor) {
61 if (MR::isExistSceneObj(SceneObj_MarioHolder) == false) {
62 return FLOAT_MAX;
63 }
64 TVec3f stack_8(*MR::getPlayerPos());
65 JMathInlineVEC::PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
66 MR::vecKillElement(stack_8, pActor->mGravity, &stack_8);
67 return PSVECMag((Vec*)&stack_8);
68 }
69
70 bool isNear(const HitSensor *pSensor_1, const HitSensor *pSensor_2, f32 dist) {
71 f32 sqr = pSensor_1->mPosition.squared(pSensor_2->mPosition);
72 return sqr < (dist * dist);
73 }
74
75 bool isNear(const LiveActor *pActor_1, const LiveActor *pActor_2, f32 dist) {
76 f32 sqr = pActor_1->mPosition.squared(pActor_2->mPosition);
77 return sqr < (dist * dist);
78 }
79
80 bool isNear(const LiveActor *pActor, const TVec3f &rVec, f32 dist) {
81 f32 sqr = pActor->mPosition.squared(rVec);
82 return sqr < (dist * dist);
83 }
84
85 bool isNearPlayer(const LiveActor *pActor, f32 dist) {
86 return (MR::isPlayerHidden() ? false : MR::isNearPlayerAnyTime(pActor, dist));
87 }
88
89 bool isNearPlayerAnyTime(const LiveActor *pActor, f32 dist) {
90 f32 sqr = pActor->mPosition.squared(*MR::getPlayerPos());
91 return sqr < (dist * dist);
92 }
93
94 bool isNearPlayer(const TVec3f &rPos, f32 dist) {
95 if (MR::isPlayerHidden()) {
96 return false;
97 }
98
99 f32 sqr = MR::getPlayerPos()->squared(rPos);
100 return sqr < (dist * dist);
101 }
102
103 // MR::isNearPlayerPose((LiveActor const *, float, float))
104 // MR::isNearPlayerHorizontal((LiveActor const *, float))
105
106 void calcFrontVec(TVec3f *pFrontVec, const LiveActor *pActor) {
107 MtxPtr mtx = pActor->getBaseMtx();
108 pFrontVec->set(mtx[0][2], mtx[1][2], mtx[2][2]);
109 }
110
111 void calcUpVec(TVec3f *pUpVec, const LiveActor *pActor) {
112 MtxPtr mtx = pActor->getBaseMtx();
113 pUpVec->set(mtx[0][1], mtx[1][1], mtx[2][1]);
114 }
115
116 void calcSideVec(TVec3f *pSideVec, const LiveActor *pActor) {
117 MtxPtr mtx = pActor->getBaseMtx();
118 pSideVec->set(mtx[0][0], mtx[1][0], mtx[2][0]);
119 }
120
121 void calcPositionUpOffset(TVec3f *a1, const LiveActor *pActor, f32 a3) {
122 TVec3f stack_8;
123 TVec3f *stack_c = a1;
124 MR::calcUpVec(&stack_8, pActor);
125
126 JMAVECScaleAdd((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)stack_c, a3);
127 }
128
129 void calcVecToPlayerH(TVec3f *pToPlayerHVec, const LiveActor *pActor, const TVec3f *a3) {
130 calcVecToTargetPosH(pToPlayerHVec, pActor, *MR::getPlayerPos(), a3);
131 }
132
133 void calcVecFromPlayerH(TVec3f *pFromPlayerHVec, const LiveActor *pActor) {
134 calcVecToTargetPosH(pFromPlayerHVec, pActor, *MR::getPlayerPos(), nullptr);
135 pFromPlayerHVec->scale(-1.0f);
136 }
137
138 void calcVecToTargetPosH(TVec3f *pToTargetHVec, const LiveActor *pActor, const TVec3f &a3, const TVec3f *a4) {
139 pToTargetHVec->set(a3);
140
141 TVec3f *vec = pToTargetHVec;
142 PSVECSubtract((Vec*)vec, (Vec*)&pActor->mPosition, (Vec*)vec);
143
144 if (a4 == nullptr) {
145 MR::vecKillElement(*pToTargetHVec, pActor->mGravity, pToTargetHVec);
146 }
147 else {
148 MR::vecKillElement(*pToTargetHVec, *a4, pToTargetHVec);
149 }
150
151 MR::normalizeOrZero(pToTargetHVec);
152 }
153
154 void calcVecFromTargetPosH(TVec3f *pFromTargetHVec, const LiveActor *pActor, const TVec3f &a3, const TVec3f *a4) {
155 calcVecToTargetPosH(pFromTargetHVec, pActor, a3, a4);
156 pFromTargetHVec->scale(-1.0f);
157 }
158
159 bool isFaceToTargetDegree(const LiveActor *pActor, const TVec3f &a2, const TVec3f &a3, float a4) {
160 TVec3f stack_8(a2);
161
162 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
163
164 return MR::isNearAngleDegree(stack_8, a3, a4);
165 }
166
167 bool isFaceToPlayerDegree(const LiveActor *pActor, const TVec3f &a2, float a3) {
168 TVec3f stack_8(*MR::getPlayerPos());
169
170 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
171
172 return MR::isNearAngleDegree(stack_8, a2, a3);
173 }
174
175 bool isFaceToTargetDegree(const LiveActor *pActor, const TVec3f &a2, float a3) {
176 TVec3f stack_14;
177 MR::calcFrontVec(&stack_14, pActor);
178
179 TVec3f stack_8(a2);
180 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
181
182 return MR::isNearAngleDegree(stack_8, stack_14, a3);
183 }
184
185 bool isFaceToPlayerDegree(const LiveActor *pActor, float a2) {
186 TVec3f stack_14;
187 MR::calcFrontVec(&stack_14, pActor);
188
189 TVec3f stack_8(*MR::getPlayerPos());
190 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
191
192 return MR::isNearAngleDegree(stack_8, stack_14, a2);
193 }
194
195 bool isFaceToPlayerDegreeHV(const LiveActor *pActor, const TVec3f &a2, float a3, float a4) {
196 TVec3f stack_8(*MR::getPlayerPos());
197
198 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
199
200 return MR::isNearAngleDegreeHV(stack_8, a2, pActor->mGravity, a3, a4);
201 }
202
203 bool isFaceToTargetHorizontalDegree(const LiveActor *pActor, const TVec3f &a2, const TVec3f &a3, float a4) {
204 TVec3f stack_20;
205 TVec3f stack_14;
206
207 TVec3f stack_8(a2);
208 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->mPosition, (Vec*)&stack_8);
209
210 const TVec3f *grav = &pActor->mGravity;
211 JMAVECScaleAdd((Vec*)grav, (Vec*)&stack_8, (Vec*)&stack_20, -pActor->mGravity.dot(stack_8));
212 JMAVECScaleAdd((Vec*)grav, (Vec*)&a3, (Vec*)&stack_14, -pActor->mGravity.dot(a3));
213
214 return MR::isNearAngleDegree(stack_20, stack_14, a4);
215 }
216
217 bool isFaceToPlayerHorizontalDegree(const LiveActor *pActor, const TVec3f &a2, float a3) {
218 return MR::isFaceToTargetHorizontalDegree(pActor, *MR::getPlayerPos(), a2, a3);
219 }
220
221 bool isInWater(const LiveActor *pActor, const TVec3f &rOffset) {
222 TVec3f stack_8(pActor->mPosition);
223 stack_8.add(rOffset);
224
225 return MR::isInWater(stack_8);
226 }
227
228 bool isInDeath(const LiveActor *pActor, const TVec3f &rOffset) {
229 TVec3f stack_8(pActor->mPosition);
230 stack_8.add(rOffset);
231
232 return MR::isInDeath(stack_8);
233 }
234
235 void makeMtxTR(MtxPtr mtx, const LiveActor *pActor) {
236 MR::makeMtxTR(mtx,
237 pActor->mPosition.x, pActor->mPosition.y, pActor->mPosition.z,
238 pActor->mRotation.x, pActor->mRotation.y, pActor->mRotation.z);
239 }
240
241 void makeMtxTRS(MtxPtr mtx, const LiveActor *pActor) {
242 MR::makeMtxTRS(mtx,
243 pActor->mPosition.x, pActor->mPosition.y, pActor->mPosition.z,
244 pActor->mRotation.x, pActor->mRotation.y, pActor->mRotation.z,
245 pActor->mScale.x, pActor->mScale.y, pActor->mScale.z);
246 }
247
248 void makeMtxTransRotateY(MtxPtr mtx, const LiveActor *pActor) {
249 MR::makeMtxTransRotateY(mtx,
250 pActor->mPosition.x, pActor->mPosition.y, pActor->mPosition.z,
251 pActor->mRotation.y);
252 }
253
254 void blendQuatFromGroundAndFront(TQuat4f *a1, const LiveActor *pActor, const TVec3f &a3, float a4, float a5) {
255 MR::blendQuatUpFront(a1, MR::isBindedGround(pActor) ? *MR::getGroundNormal(pActor) : -pActor->mGravity, a3, a4, a5);
256 }
257
258 void resetPosition(LiveActor *pActor) {
259 MR::clearHitSensors(pActor);
260
261 if (pActor->mBinder != nullptr) {
262 pActor->mBinder->clear();
263 }
264
265 if (MR::isCalcGravity(pActor)) {
266 MR::calcGravity(pActor);
267 }
268
269 MR::calcAnimDirect(pActor);
270
271 if (pActor->mCollisionParts != nullptr) {
272 MR::resetAllCollisionMtx(pActor);
273 }
274
275 MR::requestCalcActorShadowAppear(pActor);
276 }
277
278 void resetPosition(LiveActor *pActor, const TVec3f &rPosition) {
279 pActor->mPosition.set(rPosition);
280
281 MR::resetPosition(pActor);
282 }
283
284 void resetPosition(LiveActor *pActor, const char *a2) {
285 TVec3f pos(0.0f, 0.0f, 0.0f);
286 TVec3f rot(0.0f, 0.0f, 0.0f);
287 MR::findNamePos(a2, &pos, &rot);
288
289 pActor->mPosition.set(pos);
290 pActor->mRotation.set(rot);
291
292 MR::resetPosition(pActor);
293 }
294};
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
TVec3f mRotation
3D vector of the actor's rotation.
Definition LiveActor.hpp:96
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95
TVec3f mScale
3D vector of the actor's scale.
Definition LiveActor.hpp:97
TVec3f mGravity
3D vector of the actor's gravity.
Definition LiveActor.hpp:99
virtual MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.