1#include "CollisionGroup.hh"
6void CollisionData::reset() {
13 roadVelocity.setZero();
21 colPerpendicularity = 0.0f;
25 bInvisibleWall =
false;
27 bInvisibleWallOnly =
false;
31 bWallAtLeftCloser =
false;
32 bWallAtRightCloser =
false;
36Hitbox::Hitbox() : m_bspHitbox(nullptr), m_ownsBSP(false) {}
50 if (scale.y < totalScale) {
51 fVar1 = (totalScale - scale.y) * m_bspHitbox->radius;
55 scaledPos.y = (m_bspHitbox->position.y + sinkDepth) * scale.y + fVar1;
58 m_worldPos = m_relPos + pos;
70 f32 yScaleFactor = scale.y;
72 scaledPos.x *= scale.x;
73 scaledPos.z *= scale.z;
75 if (scale.y != scale.z && scale.y < 1.0f) {
76 scaledPos.y += (1.0f - scale.y) * m_radius;
77 yScaleFactor = scale.z;
80 scaledPos.y *= yScaleFactor;
85CollisionGroup::CollisionGroup() : m_hitboxScale(1.0f) {
86 m_collisionData.reset();
89CollisionGroup::~CollisionGroup() {
90 delete[] m_hitboxes.data();
101 u16 bspHitboxCount = 0;
103 for (
const auto &hitbox : hitboxes) {
104 if (parse<u16>(hitbox.enable)) {
109 m_hitboxes = std::span<Hitbox>(
new Hitbox[bspHitboxCount], bspHitboxCount);
112 for (
const auto &bspHitbox : hitboxes) {
113 if (parse<u16>(bspHitbox.enable)) {
114 m_hitboxes[hitboxIdx++].setBspHitbox(&bspHitbox);
127 for (
const auto &hitbox : m_hitboxes) {
130 if (bspHitbox->
enable == 0) {
138 f32 maxComponent = max.z;
140 if (max.x <= max.y) {
142 maxComponent = max.y;
144 }
else if (max.z < max.x) {
145 maxComponent = max.x;
148 m_boundingRadius = maxComponent;
157 m_hitboxes = std::span<Hitbox>(
new Hitbox[1], 1);
161 for (
auto &hitbox : m_hitboxes) {
164 hitbox.setBspHitbox(bspHitbox,
true);
166 bspHitbox->radius = radius;
167 hitbox.setRadius(radius);
169 m_boundingRadius = radius;
173void CollisionGroup::reset() {
174 m_collisionData.reset();
176 for (
auto &hitbox : m_hitboxes) {
178 hitbox.setRadius(hitbox.bspHitbox()->radius * m_hitboxScale);
182void CollisionGroup::resetCollision() {
183 m_collisionData.reset();
187void CollisionGroup::setHitboxScale(f32 scale) {
188 m_hitboxScale = scale;
190 for (
auto &hitbox : m_hitboxes) {
191 hitbox.setRadius(hitbox.bspHitbox()->radius * m_hitboxScale);
Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
void createSingleHitbox(f32 radius, const EGG::Vector3f &relPos)
Creates a hitbox to represent a tire.
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.
Represents a hitbox for the kart body or a wheel.
Pertains to kart-related functionality.
A quaternion, used to represent 3D rotation.
Vector3f rotateVector(const Vector3f &vec) const
Rotates a vector based on the quat.
Vector3f abs() const
Returns the absolute value of each element of the vector.
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.
u16 enable
Specifies if this is an active hitbox (since BSP always has 16).
EGG::Vector3f position
The relative position of the hitbox.
Field::KCLTypeMask closestWallFlags
The colliding wall KCL flag's KColType.
u32 closestFloorSettings
The colliding floor KCL flag's "variant".
bool bFloor
Set if colliding with KCL which satisfies KCL_TYPE_FLOOR.
bool bWall3
Set if colliding with COL_TYPE_WALL_2.
bool bWall
Set if colliding with KCL which satisfies KCL_TYPE_WALL.
Field::KCLTypeMask closestFloorFlags
The colliding floor KCL flag's KColType.
s32 intensity
The KCL flag's "wheel depth".