1#include "ObjectDirector.hh"
3#include "game/field/BoxColManager.hh"
4#include "game/field/ObjectDrivableDirector.hh"
5#include "game/field/obj/ObjectRegistry.hh"
7#include "game/kart/KartObject.hh"
9#include "game/system/CourseMap.hh"
14void ObjectDirector::init() {
20 ObjectDrivableDirector::Instance()->init();
24void ObjectDirector::calc() {
33 ObjectDrivableDirector::Instance()->calc();
37void ObjectDirector::addObject(ObjectCollidable *obj) {
38 u32 loadFlags = obj->loadFlags();
44 const auto *set = m_flowTable.set(m_flowTable.slot(obj->id()));
48 if (set && set->mode != 0) {
49 if (obj->collision()) {
57void ObjectDirector::addObjectNoImpl(ObjectNoImpl *obj) {
63 ObjectCollisionConvexHull *convexHull) {
66 while (ObjectCollidable *obj = BoxColManager::Instance()->getNextObject()) {
67 auto *objCollision = obj->collision();
72 obj->calcCollisionTransform();
73 if (!obj->checkCollision(convexHull, m_hitDepths[count])) {
79 Kart::Reaction reactionOnKart = m_hitTableKart.reaction(m_hitTableKart.slot(obj->id()));
80 Kart::Reaction reactionOnObj =
81 m_hitTableKartObject.reaction(m_hitTableKartObject.slot(obj->id()));
84 obj->processKartReactions(kartObj, reactionOnKart, reactionOnObj);
86 Kart::Reaction reaction =
87 obj->onCollision(kartObj, reactionOnKart, reactionOnObj, m_hitDepths[count]);
88 m_reactions[count] = reaction;
90 if (reaction == Kart::Reaction::WallAllSpeed || reaction == Kart::Reaction::WallSpark) {
91 obj->onWallCollision(kartObj, m_hitDepths[count]);
93 obj->onObjectCollision(kartObj);
97 if (m_hitDepths[count].y < 0.0f) {
98 m_hitDepths[count].y = 0.0f;
108ObjectDirector *ObjectDirector::CreateInstance() {
110 s_instance =
new ObjectDirector;
112 ObjectDrivableDirector::CreateInstance();
114 s_instance->createObjects();
120void ObjectDirector::DestroyInstance() {
122 auto *instance = s_instance;
123 s_instance =
nullptr;
126 ObjectDrivableDirector::DestroyInstance();
130ObjectDirector::ObjectDirector()
131 : m_flowTable(
"ObjFlow.bin"), m_hitTableKart(
"GeoHitTableKart.bin"),
132 m_hitTableKartObject(
"GeoHitTableKartObj.bin") {}
135ObjectDirector::~ObjectDirector() {
137 s_instance =
nullptr;
138 WARN(
"ObjectDirector instance not explicitly handled!");
141 for (
auto *&obj : m_objects) {
147void ObjectDirector::createObjects() {
148 const auto *courseMap = System::CourseMap::Instance();
149 size_t objectCount = courseMap->getGeoObjCount();
153 size_t maxCount = std::min(objectCount, MAX_UNIT_COUNT);
154 m_objects.reserve(maxCount);
155 m_calcObjects.reserve(maxCount);
156 m_collisionObjects.reserve(maxCount);
158 for (
size_t i = 0; i < objectCount; ++i) {
159 const auto *pObj = courseMap->getGeoObj(i);
163 if (!(pObj->presenceFlag() & 1)) {
168 if (IsObjectBlacklisted(pObj->id())) {
172 ObjectBase *
object = createObject(*pObj);
179 ObjectId
id =
static_cast<ObjectId
>(params.id());
181 case ObjectId::WLWallGC:
182 return new ObjectWLWallGC(params);
183 case ObjectId::Boble:
184 return new ObjectBoble(params);
185 case ObjectId::DokanSFC:
186 return new ObjectDokan(params);
187 case ObjectId::OilSFC:
188 return new ObjectOilSFC(params);
189 case ObjectId::ParasolR:
190 return new ObjectParasolR(params);
191 case ObjectId::Kuribo:
192 return new ObjectKuribo(params);
193 case ObjectId::WLFirebarGC:
194 return new ObjectFirebar(params);
195 case ObjectId::WLFireRingGC:
196 return new ObjectFireRing(params);
197 case ObjectId::PuchiPakkun:
199 case ObjectId::KinokoUd:
200 return new ObjectKinokoUd(params);
201 case ObjectId::KinokoBend:
202 return new ObjectKinokoBend(params);
203 case ObjectId::KinokoNm:
204 return new ObjectKinokoNm(params);
205 case ObjectId::Aurora:
206 return new ObjectAurora(params);
209 case ObjectId::DummyPole:
210 case ObjectId::CastleTree1c:
211 case ObjectId::PalmTree:
212 case ObjectId::DKtreeA64c:
213 case ObjectId::TownTreeDsc:
214 return new ObjectCollidable(params);
215 case ObjectId::WLDokanGC:
216 case ObjectId::Mdush:
217 return new ObjectKCL(params);
219 return new ObjectNoImpl(params);
223ObjectDirector *ObjectDirector::s_instance =
nullptr;
std::vector< ObjectBase * > m_objects
All objects live here.
std::vector< ObjectBase * > m_collisionObjects
Objects having collision live here too.
std::array< ObjectCollidable *, MAX_UNIT_COUNT > m_collidingObjects
Objects we are currently colliding with.
std::vector< ObjectBase * > m_calcObjects
Objects needing calc() live here too.
The highest level abstraction for a kart.
ObjectDokan ObjectPuchiPakkun
This is just to help with readability. The rMR piranhas are really just pipes.