1#include "CollisionGroup.hh"
6void CollisionData::reset() {
13 roadVelocity.setZero();
21 colPerpendicularity = 0.0f;
25 bInvisibleWall =
false;
29 bInvisibleWallOnly =
false;
35 bWallAtLeftCloser =
false;
36 bWallAtRightCloser =
false;
41Hitbox::Hitbox() : m_bspHitbox(nullptr), m_ownsBSP(false) {}
55 if (scale.y < totalScale) {
56 fVar1 = (totalScale - scale.y) * m_bspHitbox->radius;
60 scaledPos.y = (m_bspHitbox->position.y + sinkDepth) * scale.y + fVar1;
63 m_worldPos = m_relPos + pos;
75 f32 yScaleFactor = scale.y;
77 scaledPos.x *= scale.x;
78 scaledPos.z *= scale.z;
80 if (scale.y != scale.z && scale.y < 1.0f) {
81 scaledPos.y += (1.0f - scale.y) * m_radius;
82 yScaleFactor = scale.z;
85 scaledPos.y *= yScaleFactor;
90CollisionGroup::CollisionGroup() : m_hitboxScale(1.0f) {
91 m_collisionData.reset();
94CollisionGroup::~CollisionGroup() =
default;
104 u16 bspHitboxCount = 0;
106 for (
const auto &hitbox : hitboxes) {
107 if (parse<u16>(hitbox.enable)) {
115 for (
const auto &bspHitbox : hitboxes) {
116 if (parse<u16>(bspHitbox.enable)) {
117 m_hitboxes[hitboxIdx++].setBspHitbox(&bspHitbox);
130 for (
const auto &hitbox : m_hitboxes) {
133 if (bspHitbox->
enable == 0) {
141 f32 maxComponent = max.z;
143 if (max.x <= max.y) {
145 maxComponent = max.y;
147 }
else if (max.z < max.x) {
148 maxComponent = max.x;
151 m_boundingRadius = maxComponent;
164 for (
auto &hitbox : m_hitboxes) {
167 hitbox.setBspHitbox(bspHitbox,
true);
169 bspHitbox->radius = radius;
170 hitbox.setRadius(radius);
172 m_boundingRadius = radius;
176void CollisionGroup::reset() {
177 m_collisionData.reset();
179 for (
auto &hitbox : m_hitboxes) {
181 hitbox.setRadius(hitbox.bspHitbox()->radius * m_hitboxScale);
185void CollisionGroup::resetCollision() {
186 m_collisionData.reset();
190void CollisionGroup::setHitboxScale(f32 scale) {
191 m_hitboxScale = scale;
193 for (
auto &hitbox : m_hitboxes) {
194 hitbox.setRadius(hitbox.bspHitbox()->radius * m_hitboxScale);
constexpr Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
f32 computeCollisionLimits()
Sets the bounding radius.
f32 initHitboxes(const std::array< BSP::Hitbox, 16 > &hitboxes)
Initializes the hitbox array based on the KartParam's BSP hitboxes.
void createSingleHitbox(f32 radius, const EGG::Vector3f &relPos)
Creates a hitbox to represent a tire.
A contiguous storage container that manages the lifecycle of a buffer of a given size.
Pertains to kart-related functionality.
A quaternion, used to represent 3D rotation.
constexpr Vector3f rotateVector(const Vector3f &vec) const
Rotates a vector based on the quat.
constexpr Vector3f abs() const
Returns the absolute value of each element of the vector.
constexpr Vector3f maximize(const Vector3f &rhs) const
Returns a vector whose elements are the max of the elements of both vectors.
Represents one of the many hitboxes that make up a vehicle.
EGG::Vector3f position
The relative position of the hitbox.
u16 enable
Specifies if this is an active hitbox (since BSP always has 16).
bool bWall3
Set if colliding with COL_TYPE_WALL_2.
Field::KCLTypeMask closestFloorFlags
The colliding floor KCL flag's KColType.
bool bMovingWaterDecaySpeed
Player speed will drop if not in mushroom.
bool bMovingWaterStickyRoad
KC pipe vertical water section.
s32 intensity
The KCL flag's "wheel depth".
bool bMovingWaterVertical
KC last turn vertical water.
bool bMovingWaterMomentum
Player will maintain speed for a bit after leaving KCL.
bool bFloor
Set if colliding with KCL which satisfies KCL_TYPE_FLOOR.
bool bMovingWaterDisableAccel
KC last turn prevents mini-turbo acceleration.
u32 closestFloorSettings
The colliding floor KCL flag's "variant".
bool bWall
Set if colliding with KCL which satisfies KCL_TYPE_WALL.
Field::KCLTypeMask closestWallFlags
The colliding wall KCL flag's KColType.