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;
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) {
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();
226 return System::RaceManager::Instance()->player().inputs();
231 return m_accessor->model;
236 return m_accessor->model;
241 return m_accessor->objectCollisionKart;
246 return m_accessor->objectCollisionKart;
251 return m_accessor->boxColUnit;
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();
271 return move()->scale();
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();
317 return dynamics()->pos();
322 return physics()->pos();
325const EGG::Quatf &KartObjectProxy::fullRot()
const {
326 return dynamics()->fullRot();
330 return dynamics()->extVel();
334 return dynamics()->intVel();
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();
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());
389 rotMat.
makeR(radRot);
392 distance_to_cannon.y = 0.0f;
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;
415 return collisionData().closestWallFlags;
419u32 KartObjectProxy::wallKclVariant()
const {
420 return collisionData().closestWallSettings;
424void KartObjectProxy::apply(
size_t idx) {
425 m_accessor = KartObjectManager::Instance()->object(idx)->accessor();
432 for (
auto iter = s_proxyList.begin(); iter != s_proxyList.end(); ++iter) {
433 (*iter)->m_accessor = pointers;
437std::list<KartObjectProxy *> KartObjectProxy::s_proxyList;
Vector3f multVector33(const Vector3f &vec) const
Multiplies a 3x3 matrix by a vector.
void makeR(const Vector3f &r)
Sets 3x3 rotation matrix from a vector of Euler angles.
Relates a KartObject with its convex hull representation.
Included in Kinoko because it mysteriously sets an angle member variable in KartBody.
Pertains to kart-related functionality.
A quaternion, used to represent 3D rotation.
f32 dot(const Vector3f &rhs) const
The dot product between two vectors.
A representation of the boundaries of an entity that has dynamic collision.
Shared between classes who inherit KartObjectProxy so they can access one another.