A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
KartObjectProxy.cc
1#include "KartObjectProxy.hh"
2
3#include "game/kart/CollisionGroup.hh"
4#include "game/kart/KartObject.hh"
5#include "game/kart/KartObjectManager.hh"
6#include "game/kart/KartState.hh"
7#include "game/kart/KartSub.hh"
8#include "game/kart/KartSuspension.hh"
9#include "game/kart/KartTire.hh"
10
11#include "game/system/CourseMap.hh"
12#include "game/system/RaceManager.hh"
13#include "game/system/map/MapdataCannonPoint.hh"
14
15#include <egg/math/Math.hh>
16
17#include <algorithm>
18
19namespace Kart {
20
22KartObjectProxy::KartObjectProxy() : m_accessor(nullptr) {
23 s_proxyList.push_back(this);
24}
25
26KartObjectProxy::~KartObjectProxy() = default;
27
29void KartObjectProxy::setPos(const EGG::Vector3f &pos) {
30 dynamics()->setPos(pos);
31}
32
34void KartObjectProxy::setRot(const EGG::Quatf &q) {
35 dynamics()->setFullRot(q);
36 dynamics()->setMainRot(q);
37}
38
40void KartObjectProxy::setInertiaScale(const EGG::Vector3f &scale) {
41 const EGG::Vector3f *cuboids = bsp().cuboids;
42 dynamics()->setInertia(cuboids[0] * scale, cuboids[1] * scale);
43}
44
46KartAction *KartObjectProxy::action() {
47 return m_accessor->action;
48}
49
51const KartAction *KartObjectProxy::action() const {
52 return m_accessor->action;
53}
54
56KartBody *KartObjectProxy::body() {
57 return m_accessor->body;
58}
59
61const KartBody *KartObjectProxy::body() const {
62 return m_accessor->body;
63}
64
66KartCollide *KartObjectProxy::collide() {
67 return m_accessor->collide;
68}
69
71const KartCollide *KartObjectProxy::collide() const {
72 return m_accessor->collide;
73}
74
76CollisionGroup *KartObjectProxy::collisionGroup() {
77 return m_accessor->body->physics()->hitboxGroup();
78}
79
81const CollisionGroup *KartObjectProxy::collisionGroup() const {
82 return m_accessor->body->physics()->hitboxGroup();
83}
84
86KartMove *KartObjectProxy::move() {
87 return m_accessor->move;
88}
89
91const KartMove *KartObjectProxy::move() const {
92 return m_accessor->move;
93}
94
95KartHalfPipe *KartObjectProxy::halfPipe() {
96 return m_accessor->move->halfPipe();
97}
98
99const KartHalfPipe *KartObjectProxy::halfPipe() const {
100 return m_accessor->move->halfPipe();
101}
102
103KartScale *KartObjectProxy::kartScale() {
104 return m_accessor->move->kartScale();
105}
106
107const KartScale *KartObjectProxy::kartScale() const {
108 return m_accessor->move->kartScale();
109}
110
112KartJump *KartObjectProxy::jump() {
113 return m_accessor->move->jump();
114}
115
117const KartJump *KartObjectProxy::jump() const {
118 return m_accessor->move->jump();
119}
120
122KartParam *KartObjectProxy::param() {
123 return m_accessor->param;
124}
125
127const KartParam *KartObjectProxy::param() const {
128 return m_accessor->param;
129}
130
132const BSP &KartObjectProxy::bsp() const {
133 return param()->bsp();
134}
135
137KartPhysics *KartObjectProxy::physics() {
138 return body()->physics();
139}
140
142const KartPhysics *KartObjectProxy::physics() const {
143 return body()->physics();
144}
145
147KartDynamics *KartObjectProxy::dynamics() {
148 return physics()->dynamics();
149}
150
152const KartDynamics *KartObjectProxy::dynamics() const {
153 return physics()->dynamics();
154}
155
156KartState *KartObjectProxy::state() {
157 return m_accessor->state;
158}
159
160const KartState *KartObjectProxy::state() const {
161 return m_accessor->state;
162}
163
165KartSub *KartObjectProxy::sub() {
166 return m_accessor->sub;
167}
168
170const KartSub *KartObjectProxy::sub() const {
171 return m_accessor->sub;
172}
173
175KartSuspension *KartObjectProxy::suspension(u16 suspIdx) {
176 return m_accessor->suspensions[suspIdx];
177}
178
180const KartSuspension *KartObjectProxy::suspension(u16 suspIdx) const {
181 return m_accessor->suspensions[suspIdx];
182}
183
185KartSuspensionPhysics *KartObjectProxy::suspensionPhysics(u16 suspIdx) {
186 return m_accessor->suspensions[suspIdx]->suspPhysics();
187}
188
190const KartSuspensionPhysics *KartObjectProxy::suspensionPhysics(u16 suspIdx) const {
191 return m_accessor->suspensions[suspIdx]->suspPhysics();
192}
193
195KartTire *KartObjectProxy::tire(u16 tireIdx) {
196 return m_accessor->tires[tireIdx];
197}
198
200const KartTire *KartObjectProxy::tire(u16 tireIdx) const {
201 return m_accessor->tires[tireIdx];
202}
203
205WheelPhysics *KartObjectProxy::tirePhysics(u16 tireIdx) {
206 return tire(tireIdx)->wheelPhysics();
207}
208
210const WheelPhysics *KartObjectProxy::tirePhysics(u16 tireIdx) const {
211 return m_accessor->tires[tireIdx]->wheelPhysics();
212}
213
215CollisionData &KartObjectProxy::collisionData() {
216 return physics()->hitboxGroup()->collisionData();
217}
218
220const CollisionData &KartObjectProxy::collisionData() const {
221 return m_accessor->body->physics()->hitboxGroup()->collisionData();
222}
223
225const System::KPad *KartObjectProxy::inputs() const {
226 return System::RaceManager::Instance()->player().inputs();
227}
228
230Render::KartModel *KartObjectProxy::model() {
231 return m_accessor->model;
232}
233
235const Render::KartModel *KartObjectProxy::model() const {
236 return m_accessor->model;
237}
238
240Field::ObjectCollisionKart *KartObjectProxy::objectCollisionKart() {
241 return m_accessor->objectCollisionKart;
242}
243
245const Field::ObjectCollisionKart *KartObjectProxy::objectCollisionKart() const {
246 return m_accessor->objectCollisionKart;
247}
248
250Field::BoxColUnit *KartObjectProxy::boxColUnit() {
251 return m_accessor->boxColUnit;
252}
253
255const Field::BoxColUnit *KartObjectProxy::boxColUnit() const {
256 return m_accessor->boxColUnit;
257}
258
260CollisionData &KartObjectProxy::collisionData(u16 tireIdx) {
261 return tirePhysics(tireIdx)->hitboxGroup()->collisionData();
262}
263
265const CollisionData &KartObjectProxy::collisionData(u16 tireIdx) const {
266 return m_accessor->tires[tireIdx]->wheelPhysics()->hitboxGroup()->collisionData();
267}
268
270const EGG::Vector3f &KartObjectProxy::scale() const {
271 return move()->scale();
272}
273
275const EGG::Matrix34f &KartObjectProxy::pose() const {
276 return physics()->pose();
277}
278
281EGG::Vector3f KartObjectProxy::bodyFront() const {
282 const EGG::Matrix34f &mtx = pose();
283 return EGG::Vector3f(mtx[0, 2], mtx[1, 2], mtx[2, 2]);
284}
285
288EGG::Vector3f KartObjectProxy::bodyForward() const {
289 const EGG::Matrix34f &mtx = pose();
290 return EGG::Vector3f(mtx[0, 0], mtx[1, 0], mtx[2, 0]);
291}
292
295EGG::Vector3f KartObjectProxy::bodyUp() const {
296 const EGG::Matrix34f &mtx = pose();
297 return EGG::Vector3f(mtx[0, 1], mtx[1, 1], mtx[2, 1]);
298}
299
301const EGG::Vector3f &KartObjectProxy::componentXAxis() const {
302 return physics()->xAxis();
303}
304
306const EGG::Vector3f &KartObjectProxy::componentYAxis() const {
307 return physics()->yAxis();
308}
309
311const EGG::Vector3f &KartObjectProxy::componentZAxis() const {
312 return physics()->zAxis();
313}
314
316const EGG::Vector3f &KartObjectProxy::pos() const {
317 return dynamics()->pos();
318}
319
321const EGG::Vector3f &KartObjectProxy::prevPos() const {
322 return physics()->pos();
323}
324
325const EGG::Quatf &KartObjectProxy::fullRot() const {
326 return dynamics()->fullRot();
327}
328
329const EGG::Vector3f &KartObjectProxy::extVel() const {
330 return dynamics()->extVel();
331}
332
333const EGG::Vector3f &KartObjectProxy::intVel() const {
334 return dynamics()->intVel();
335}
336
337const EGG::Vector3f &KartObjectProxy::velocity() const {
338 return dynamics()->velocity();
339}
340
342f32 KartObjectProxy::speed() const {
343 return move()->speed();
344}
345
346f32 KartObjectProxy::acceleration() const {
347 return move()->acceleration();
348}
349
350f32 KartObjectProxy::softSpeedLimit() const {
351 return move()->softSpeedLimit();
352}
353
354const EGG::Quatf &KartObjectProxy::mainRot() const {
355 return dynamics()->mainRot();
356}
357
358const EGG::Vector3f &KartObjectProxy::angVel2() const {
359 return dynamics()->angVel2();
360}
361
363bool KartObjectProxy::isBike() const {
364 return param()->isBike();
365}
366
368u16 KartObjectProxy::suspCount() const {
369 return param()->suspCount();
370}
371
373u16 KartObjectProxy::tireCount() const {
374 return param()->tireCount();
375}
376
378bool KartObjectProxy::hasFloorCollision(const WheelPhysics *wheelPhysics) const {
379 return wheelPhysics->hitboxGroup()->collisionData().bFloor;
380}
381
383std::pair<EGG::Vector3f, EGG::Vector3f> KartObjectProxy::getCannonPosRot() {
384 auto *cannon = System::CourseMap::Instance()->getCannonPoint(state()->cannonPointId());
385 const EGG::Vector3f &cannonPos = cannon->pos();
386 EGG::Vector3f cannonRot = cannon->rot();
387 EGG::Vector3f radRot = cannon->rot() * DEG2RAD;
388 EGG::Matrix34f rotMat;
389 rotMat.makeR(radRot);
390 cannonRot = rotMat.multVector33(EGG::Vector3f::ez);
391 EGG::Vector3f distance_to_cannon = this->pos() - cannonPos;
392 distance_to_cannon.y = 0.0f;
393 EGG::Vector3f local60 = EGG::Vector3f::ey.cross(cannonRot);
394 f32 temp0 = local60.dot(distance_to_cannon);
395 return std::pair(cannonPos + local60 * temp0, cannonRot);
396}
397
399f32 KartObjectProxy::speedRatio() const {
400 return move()->speedRatio();
401}
402
404f32 KartObjectProxy::speedRatioCapped() const {
405 return move()->speedRatioCapped();
406}
407
409bool KartObjectProxy::isInRespawn() const {
410 return move()->respawnTimer() > 0 || move()->respawnPostLandTimer() > 0;
411}
412
414Field::KCLTypeMask KartObjectProxy::wallKclType() const {
415 return collisionData().closestWallFlags;
416}
417
419u32 KartObjectProxy::wallKclVariant() const {
420 return collisionData().closestWallSettings;
421}
422
424void KartObjectProxy::apply(size_t idx) {
425 m_accessor = KartObjectManager::Instance()->object(idx)->accessor();
426}
427
431void KartObjectProxy::ApplyAll(const KartAccessor *pointers) {
432 for (auto iter = s_proxyList.begin(); iter != s_proxyList.end(); ++iter) {
433 (*iter)->m_accessor = pointers;
434 }
435}
436
437std::list<KartObjectProxy *> KartObjectProxy::s_proxyList;
438
439} // namespace Kart
A 3 x 4 matrix.
Definition Matrix.hh:8
Vector3f multVector33(const Vector3f &vec) const
Multiplies a 3x3 matrix by a vector.
Definition Matrix.cc:236
void makeR(const Vector3f &r)
Sets 3x3 rotation matrix from a vector of Euler angles.
Definition Matrix.cc:98
Relates a KartObject with its convex hull representation.
Included in Kinoko because it mysteriously sets an angle member variable in KartBody.
Definition KartModel.hh:9
Pertains to kart-related functionality.
A quaternion, used to represent 3D rotation.
Definition Quat.hh:12
A 3D float vector.
Definition Vector.hh:87
f32 dot(const Vector3f &rhs) const
The dot product between two vectors.
Definition Vector.hh:186
A representation of the boundaries of an entity that has dynamic collision.
Shared between classes who inherit KartObjectProxy so they can access one another.