3#include "game/field/CollisionDirector.hh"
5#include "game/system/RaceManager.hh"
7#include <egg/math/Math.hh>
15ObjectAmi::~ObjectAmi() =
default;
19 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut) {
20 return checkSpherePartialImpl(0.0f, v0, v1, flags, pInfo, pFlagsOut, 0);
25 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut) {
26 return checkSpherePartialPushImpl(0.0f, v0, v1, flags, pInfo, pFlagsOut, 0);
31 CollisionInfo *pInfo, KCLTypeMask *pFlagsOut) {
32 return checkSphereFullImpl(0.0f, v0, v1, flags, pInfo, pFlagsOut, 0);
37 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut) {
38 return checkSphereFullPushImpl(0.0f, v0, v1, flags, pInfo, pFlagsOut, 0);
43 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut,
u32 timeOffset) {
44 return checkSpherePartialImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
49 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut,
u32 timeOffset) {
50 return checkSpherePartialPushImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
55 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
u32 timeOffset) {
56 return checkSphereFullImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
61 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
u32 timeOffset) {
62 return checkSphereFullPushImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
67 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut) {
68 return checkSpherePartialImpl(0.0f, v0, v1, flags, pInfo, pFlagsOut, 0);
73 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut) {
74 return checkSpherePartialPushImpl(0.0f, v0, v1, flags, pInfo, pFlagsOut, 0);
79 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut) {
80 return checkSphereFullImpl(0.0f, v0, v1, flags, pInfo, pFlagsOut, 0);
85 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut) {
86 return checkSphereFullPushImpl(0.0f, v0, v1, flags, pInfo, pFlagsOut, 0);
90bool ObjectAmi::checkSphereCachedPartial(f32 radius,
const EGG::Vector3f &v0,
91 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
92 KCLTypeMask *pFlagsOut,
u32 timeOffset) {
93 return checkSpherePartialImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
97bool ObjectAmi::checkSphereCachedPartialPush(f32 radius,
const EGG::Vector3f &v0,
98 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
99 KCLTypeMask *pFlagsOut,
u32 timeOffset) {
100 return checkSpherePartialPushImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
105 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
u32 timeOffset) {
106 return checkSphereFullImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
110bool ObjectAmi::checkSphereCachedFullPush(f32 radius,
const EGG::Vector3f &v0,
111 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
113 return checkSphereFullPushImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
118 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut,
u32 timeOffset) {
119 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
false);
123bool ObjectAmi::checkSpherePartialPushImpl(f32 radius,
const EGG::Vector3f &v0,
124 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
125 KCLTypeMask *pFlagsOut,
u32 timeOffset) {
126 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
true);
131 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
u32 timeOffset) {
132 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
false);
136bool ObjectAmi::checkSphereFullPushImpl(f32 radius,
const EGG::Vector3f &v0,
137 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
139 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
true);
148 requires std::is_same_v<T, CollisionInfo> || std::is_same_v<T, CollisionInfoPartial>
159 if (posDelta.z < 0.0f || posDelta.z > DIMS.z || EGG::Mathf::abs(posDelta.x) > DIMS.x) {
163 u32 t = timeOffset + System::RaceManager::Instance()->timer();
168 if (!checkCollision(radius, posDelta, t, bbox, fnrm, dist)) {
173 pInfo->bbox.min = pInfo->bbox.min.minimize(bbox);
174 pInfo->bbox.max = pInfo->bbox.max.maximize(bbox);
176 if constexpr (std::is_same_v<T, CollisionInfo>) {
177 pInfo->updateFloor(dist, fnrm);
183 auto *colDirector = CollisionDirector::Instance();
186 colDirector->setCurrentCollisionVariant(0);
187 colDirector->setCurrentCollisionTrickable(
true);
192 if (posDelta.z > DIMS.z) {
201bool ObjectAmi::checkCollision(f32 radius,
const EGG::Vector3f &posDelta, u32 time,
204 constexpr f32 Z_SLOPE = 910.0f;
206 f32 zPhase = F_PI * (2.0f * posDelta.z) / DIMS.z;
207 f32 depth = radius - (posDelta.y - (SpatialSin(zPhase) * TemporalSin(time) - Z_SLOPE * zPhase));
210 if (depth <= 0.0f || depth >= 600.0f) {
214 if (depth >= 300.0f) {
230f32 ObjectAmi::SpatialSin(f32 phase) {
231 return 550.0f * EGG::Mathf::SinFIdx(RAD2FIDX * (phase * 0.5f));
236f32 ObjectAmi::TemporalSin(
u32 t) {
237 return EGG::Mathf::SinFIdx(RAD2FIDX * (F_PI *
static_cast<f32
>(t) / 35.0f));
@ COL_TYPE_BOOST_RAMP
Trickable. Variant affects boost duration.
@ COL_TYPE_ROTATING_ROAD
Chain Chomp Roulette.
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.