A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectBelt.cc
1#include "ObjectBelt.hh"
2
3#include "game/field/CollisionDirector.hh"
4
5#include "game/system/RaceManager.hh"
6
7namespace Field {
8
10ObjectBelt::ObjectBelt(const System::MapdataGeoObj &params)
11 : ObjectDrivable(params), m_roadVel(32.0f) {}
12
14ObjectBelt::~ObjectBelt() = default;
15
17bool ObjectBelt::calcCollision(const EGG::Vector3f &v0, const EGG::Vector3f & /*v1*/,
18 KCLTypeMask /*mask*/, CollisionInfo *info, KCLTypeMask *maskOut, u32 timeOffset) {
19 if ((*maskOut & KCL_TYPE_BIT(COL_TYPE_MOVING_ROAD)) == 0) {
20 return false;
21 }
22
23 auto *colDir = CollisionDirector::Instance();
24 if (!colDir->findClosestCollisionEntry(maskOut, KCL_TYPE_BIT(COL_TYPE_MOVING_ROAD))) {
25 return false;
26 }
27
28 const auto *entry = colDir->closestCollisionEntry();
29 if (!isMoving(KCL_VARIANT_TYPE(entry->attribute), v0)) {
30 return false;
31 }
32
33 if (entry->dist > info->movingFloorDist) {
34 info->movingFloorDist = entry->dist;
35 info->roadVelocity = calcRoadVelocity(KCL_VARIANT_TYPE(entry->attribute), v0,
36 System::RaceManager::Instance()->timer() - timeOffset);
37 }
38
39 return true;
40}
41
42} // namespace Field
@ COL_TYPE_MOVING_ROAD
TF conveyers and CM escalators.
#define KCL_VARIANT_TYPE(x)
Extracts the "Variant" portion of the 2 byte KCL flag. It's the 3 bits before the "Bast Type".
#define KCL_TYPE_BIT(x)
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87