1#include "ObjectCollidable.hh"
3#include "game/field/ObjectCollisionBox.hh"
4#include "game/field/ObjectCollisionCylinder.hh"
5#include "game/field/ObjectCollisionSphere.hh"
6#include "game/field/ObjectDirector.hh"
8#include "game/kart/KartObject.hh"
14 : ObjectBase(params), m_collision(nullptr) {}
17ObjectCollidable::~ObjectCollidable() {
22void ObjectCollidable::load() {
33 ObjectDirector::Instance()->addObject(
this);
37void ObjectCollidable::calcCollisionTransform() {
39 m_collision->transform(m_transform, m_scale, getCollisionTranslation());
46f32 ObjectCollidable::getCollisionRadius()
const {
47 const auto &flowTable = ObjectDirector::Instance()->flowTable();
48 const auto *collisionSet = flowTable.set(flowTable.slot(m_id));
50 f32 zRadius = m_scale.z *
static_cast<f32
>(parse<s16>(collisionSet->params.box.z));
51 f32 xRadius = m_scale.x *
static_cast<f32
>(parse<s16>(collisionSet->params.box.x));
53 return std::max(xRadius, zRadius);
57void ObjectCollidable::loadAABB(f32 maxSpeed) {
58 loadAABB(getCollisionRadius(), maxSpeed);
62void ObjectCollidable::loadAABB(f32 radius, f32 maxSpeed) {
63 auto *boxColMgr = BoxColManager::Instance();
65 bool alwaysRecalc = loadFlags() & 0x5;
66 m_boxColUnit = boxColMgr->insertObject(radius, maxSpeed, &pos, alwaysRecalc,
this);
71 Kart::Reaction &reactionOnKart, Kart::Reaction &reactionOnObj) {
73 if (kartObj->speedRatioCapped() < 0.5f) {
74 if (reactionOnKart == Kart::Reaction::SpinSomeSpeed) {
75 reactionOnKart = Kart::Reaction::WallAllSpeed;
76 }
else if (reactionOnKart == Kart::Reaction::SpinHitSomeSpeed) {
77 reactionOnKart = Kart::Reaction::None;
80 if (reactionOnKart == Kart::Reaction::SpinHitSomeSpeed) {
81 reactionOnKart = Kart::Reaction::SpinSomeSpeed;
86 if (reactionOnObj == Kart::Reaction::UNK_3 || reactionOnObj == Kart::Reaction::UNK_4) {
87 reactionOnObj = Kart::Reaction::None;
92bool ObjectCollidable::checkCollision(ObjectCollisionBase *lhs,
EGG::Vector3f &dist) {
93 return lhs->check(*collision(), dist);
97void ObjectCollidable::createCollision() {
98 const auto &flowTable = ObjectDirector::Instance()->flowTable();
99 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
102 PANIC(
"Invalid object ID when creating primitive collision! ID: %d",
103 static_cast<size_t>(m_id));
106 switch (
static_cast<CollisionMode>(parse<s16>(collisionSet->mode))) {
107 case CollisionMode::Sphere:
108 m_collision =
new ObjectCollisionSphere(parse<s16>(collisionSet->params.sphere.radius),
111 case CollisionMode::Cylinder:
112 m_collision =
new ObjectCollisionCylinder(parse<s16>(collisionSet->params.cylinder.radius),
113 parse<s16>(collisionSet->params.cylinder.height), collisionCenter());
115 case CollisionMode::Box:
116 m_collision =
new ObjectCollisionBox(parse<s16>(collisionSet->params.box.x),
117 parse<s16>(collisionSet->params.box.y), parse<s16>(collisionSet->params.box.z),
121 PANIC(
"Invalid collision mode when creating primitive collision! ID: %d; Mode: %d",
122 static_cast<size_t>(m_id), parse<s16>(collisionSet->mode));
The highest level abstraction for a kart.
CollisionMode
Maps to SObjectCollisionSet::mode. Determines what type of collision an object has.