1#include "KartObjectProxy.hh"
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"
11#include "game/system/CourseMap.hh"
12#include "game/system/RaceManager.hh"
13#include "game/system/map/MapdataCannonPoint.hh"
15#include <egg/math/Math.hh>
22KartObjectProxy::KartObjectProxy() : m_accessor(nullptr) {
23 s_proxyList.push_back(
this);
26KartObjectProxy::~KartObjectProxy() =
default;
29void KartObjectProxy::setPos(
const EGG::Vector3f &pos) {
30 dynamics()->setPos(pos);
34void KartObjectProxy::setRot(
const EGG::Quatf &q) {
35 dynamics()->setFullRot(q);
36 dynamics()->setMainRot(q);
40void KartObjectProxy::setInertiaScale(
const EGG::Vector3f &scale) {
41 const EGG::Vector3f *cuboids = bsp().cuboids;
42 dynamics()->setInertia(cuboids[0] * scale, cuboids[1] * scale);
46KartAction *KartObjectProxy::action() {
47 return m_accessor->action;
51const KartAction *KartObjectProxy::action()
const {
52 return m_accessor->action;
56KartBody *KartObjectProxy::body() {
57 return m_accessor->body;
61const KartBody *KartObjectProxy::body()
const {
62 return m_accessor->body;
66KartCollide *KartObjectProxy::collide() {
67 return m_accessor->collide;
71const KartCollide *KartObjectProxy::collide()
const {
72 return m_accessor->collide;
76CollisionGroup *KartObjectProxy::collisionGroup() {
77 return m_accessor->body->physics()->hitboxGroup();
81const CollisionGroup *KartObjectProxy::collisionGroup()
const {
82 return m_accessor->body->physics()->hitboxGroup();
86KartMove *KartObjectProxy::move() {
87 return m_accessor->move;
91const KartMove *KartObjectProxy::move()
const {
92 return m_accessor->move;
95KartHalfPipe *KartObjectProxy::halfPipe() {
96 return m_accessor->move->halfPipe();
99const KartHalfPipe *KartObjectProxy::halfPipe()
const {
100 return m_accessor->move->halfPipe();
103KartScale *KartObjectProxy::kartScale() {
104 return m_accessor->move->kartScale();
107const KartScale *KartObjectProxy::kartScale()
const {
108 return m_accessor->move->kartScale();
112KartJump *KartObjectProxy::jump() {
113 return m_accessor->move->jump();
117const KartJump *KartObjectProxy::jump()
const {
118 return m_accessor->move->jump();
122KartParam *KartObjectProxy::param() {
123 return m_accessor->param;
127const KartParam *KartObjectProxy::param()
const {
128 return m_accessor->param;
132const BSP &KartObjectProxy::bsp()
const {
133 return param()->bsp();
137KartPhysics *KartObjectProxy::physics() {
138 return body()->physics();
142const KartPhysics *KartObjectProxy::physics()
const {
143 return body()->physics();
147KartDynamics *KartObjectProxy::dynamics() {
148 return physics()->dynamics();
152const KartDynamics *KartObjectProxy::dynamics()
const {
153 return physics()->dynamics();
156KartState *KartObjectProxy::state() {
157 return m_accessor->state;
160const KartState *KartObjectProxy::state()
const {
161 return m_accessor->state;
165KartSub *KartObjectProxy::sub() {
166 return m_accessor->sub;
170const KartSub *KartObjectProxy::sub()
const {
171 return m_accessor->sub;
175KartSuspension *KartObjectProxy::suspension(u16 suspIdx) {
176 return m_accessor->suspensions[suspIdx];
180const KartSuspension *KartObjectProxy::suspension(u16 suspIdx)
const {
181 return m_accessor->suspensions[suspIdx];
185KartSuspensionPhysics *KartObjectProxy::suspensionPhysics(u16 suspIdx) {
186 return m_accessor->suspensions[suspIdx]->suspPhysics();
190const KartSuspensionPhysics *KartObjectProxy::suspensionPhysics(u16 suspIdx)
const {
191 return m_accessor->suspensions[suspIdx]->suspPhysics();
195KartTire *KartObjectProxy::tire(u16 tireIdx) {
196 return m_accessor->tires[tireIdx];
200const KartTire *KartObjectProxy::tire(u16 tireIdx)
const {
201 return m_accessor->tires[tireIdx];
205WheelPhysics *KartObjectProxy::tirePhysics(u16 tireIdx) {
206 return tire(tireIdx)->wheelPhysics();
210const WheelPhysics *KartObjectProxy::tirePhysics(u16 tireIdx)
const {
211 return m_accessor->tires[tireIdx]->wheelPhysics();
215CollisionData &KartObjectProxy::collisionData() {
216 return physics()->hitboxGroup()->collisionData();
220const CollisionData &KartObjectProxy::collisionData()
const {
221 return m_accessor->body->physics()->hitboxGroup()->collisionData();
225const System::KPad *KartObjectProxy::inputs()
const {
226 return System::RaceManager::Instance()->player().inputs();
230Render::KartModel *KartObjectProxy::model() {
231 return m_accessor->model;
235const Render::KartModel *KartObjectProxy::model()
const {
236 return m_accessor->model;
240Field::ObjectCollisionKart *KartObjectProxy::objectCollisionKart() {
241 return m_accessor->objectCollisionKart;
245const Field::ObjectCollisionKart *KartObjectProxy::objectCollisionKart()
const {
246 return m_accessor->objectCollisionKart;
250Field::BoxColUnit *KartObjectProxy::boxColUnit() {
251 return m_accessor->boxColUnit;
255const Field::BoxColUnit *KartObjectProxy::boxColUnit()
const {
256 return m_accessor->boxColUnit;
260CollisionData &KartObjectProxy::collisionData(u16 tireIdx) {
261 return tirePhysics(tireIdx)->hitboxGroup()->collisionData();
265const CollisionData &KartObjectProxy::collisionData(u16 tireIdx)
const {
266 return m_accessor->tires[tireIdx]->wheelPhysics()->hitboxGroup()->collisionData();
270const EGG::Vector3f &KartObjectProxy::scale()
const {
271 return move()->scale();
275const EGG::Matrix34f &KartObjectProxy::pose()
const {
276 return physics()->pose();
301const EGG::Vector3f &KartObjectProxy::componentXAxis()
const {
302 return physics()->xAxis();
306const EGG::Vector3f &KartObjectProxy::componentYAxis()
const {
307 return physics()->yAxis();
311const EGG::Vector3f &KartObjectProxy::componentZAxis()
const {
312 return physics()->zAxis();
316const EGG::Vector3f &KartObjectProxy::pos()
const {
317 return dynamics()->pos();
321const EGG::Vector3f &KartObjectProxy::prevPos()
const {
322 return physics()->pos();
325const EGG::Quatf &KartObjectProxy::fullRot()
const {
326 return dynamics()->fullRot();
329const EGG::Vector3f &KartObjectProxy::extVel()
const {
330 return dynamics()->extVel();
333const EGG::Vector3f &KartObjectProxy::intVel()
const {
334 return dynamics()->intVel();
337const EGG::Vector3f &KartObjectProxy::velocity()
const {
338 return dynamics()->velocity();
342f32 KartObjectProxy::speed()
const {
343 return move()->speed();
346f32 KartObjectProxy::acceleration()
const {
347 return move()->acceleration();
350f32 KartObjectProxy::softSpeedLimit()
const {
351 return move()->softSpeedLimit();
354const EGG::Quatf &KartObjectProxy::mainRot()
const {
355 return dynamics()->mainRot();
358const EGG::Vector3f &KartObjectProxy::angVel2()
const {
359 return dynamics()->angVel2();
363bool KartObjectProxy::isBike()
const {
364 return param()->isBike();
368u16 KartObjectProxy::suspCount()
const {
369 return param()->suspCount();
373u16 KartObjectProxy::tireCount()
const {
374 return param()->tireCount();
378bool KartObjectProxy::hasFloorCollision(
const WheelPhysics *wheelPhysics)
const {
379 return wheelPhysics->hitboxGroup()->collisionData().bFloor;
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);
399f32 KartObjectProxy::speedRatio()
const {
400 return move()->speedRatio();
404f32 KartObjectProxy::speedRatioCapped()
const {
405 return move()->speedRatioCapped();
409bool KartObjectProxy::isInRespawn()
const {
410 return move()->respawnTimer() > 0 || move()->respawnPostLandTimer() > 0;
414Field::KCLTypeMask KartObjectProxy::wallKclType()
const {
415 return collisionData().closestWallFlags;
419u32 KartObjectProxy::wallKclVariant()
const {
420 return collisionData().closestWallSettings;
423Status &KartObjectProxy::status() {
424 return state()->status();
427const Status &KartObjectProxy::status()
const {
428 return state()->status();
432const EGG::Vector3f &KartObjectProxy::wheelPos(u16 idx)
const {
433 return tirePhysics(idx)->pos();
437const EGG::Vector3f &KartObjectProxy::wheelEdgePos(u16 idx)
const {
438 return tirePhysics(idx)->wheelEdgePos();
442f32 KartObjectProxy::cameraDistY()
const {
444 return param()->bikeDisp().m_cameraDistY;
446 return param()->kartDisp().m_cameraDistY;
451s32 KartObjectProxy::hopStickX()
const {
452 return move()->hopStickX();
456KartParam::Stats::DriftType KartObjectProxy::vehicleType()
const {
457 return param()->stats().driftType;
461void KartObjectProxy::apply(
size_t idx) {
462 m_accessor = KartObjectManager::Instance()->object(idx)->accessor();
469 for (
auto iter = s_proxyList.begin(); iter != s_proxyList.end(); ++iter) {
470 (*iter)->m_accessor = pointers;
474std::list<KartObjectProxy *> KartObjectProxy::s_proxyList;
Pertains to kart-related functionality.
Shared between classes who inherit KartObjectProxy so they can access one another.