1#include "ObjectDrivableDirector.hh"
6void ObjectDrivableDirector::init() {
14void ObjectDrivableDirector::calc() {
25void ObjectDrivableDirector::addObject(ObjectDrivable *obj) {
26 if (obj->loadFlags() & 1) {
41bool ObjectDrivableDirector::checkSpherePartial(f32 radius,
const EGG::Vector3f &pos,
48 bool hasCollision =
false;
49 auto *boxColMgr = BoxColManager::Instance();
50 boxColMgr->search(radius, pos, eBoxColFlag::Drivable);
52 while (ObjectDrivable *obj = boxColMgr->getNextDrivable()) {
54 obj->checkSpherePartial(radius, pos, prevPos, mask, info, maskOut, timeOffset);
61bool ObjectDrivableDirector::checkSpherePartialPush(f32 radius,
const EGG::Vector3f &pos,
62 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
63 KCLTypeMask *maskOut,
u32 timeOffset) {
68 bool hasCollision =
false;
69 auto *boxColMgr = BoxColManager::Instance();
70 boxColMgr->search(radius, pos, eBoxColFlag::Drivable);
72 while (ObjectDrivable *obj = boxColMgr->getNextDrivable()) {
74 obj->checkSpherePartialPush(radius, pos, prevPos, mask, info, maskOut, timeOffset);
81bool ObjectDrivableDirector::checkSphereFull(f32 radius,
const EGG::Vector3f &pos,
82 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
88 bool hasCollision =
false;
89 auto *boxColMgr = BoxColManager::Instance();
90 boxColMgr->search(radius, pos, eBoxColFlag::Drivable);
92 while (ObjectDrivable *obj = boxColMgr->getNextDrivable()) {
93 hasCollision |= obj->checkSphereFull(radius, pos, prevPos, mask, info, maskOut, timeOffset);
100bool ObjectDrivableDirector::checkSphereFullPush(f32 radius,
const EGG::Vector3f &pos,
101 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
107 bool hasCollision =
false;
108 auto *boxColMgr = BoxColManager::Instance();
109 boxColMgr->search(radius, pos, eBoxColFlag::Drivable);
111 while (ObjectDrivable *obj = boxColMgr->getNextDrivable()) {
113 obj->checkSphereFullPush(radius, pos, prevPos, mask, info, maskOut, timeOffset);
120bool ObjectDrivableDirector::checkSphereCachedPartial(f32 radius,
const EGG::Vector3f &pos,
121 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
122 KCLTypeMask *maskOut,
u32 timeOffset) {
127 auto *boxColMgr = BoxColManager::Instance();
129 if (boxColMgr->isSphereInSpatialCache(radius, pos, eBoxColFlag::Drivable)) {
130 boxColMgr->resetIterators();
132 bool hasCollision =
false;
133 while (ObjectDrivable *obj = boxColMgr->getNextDrivable()) {
134 hasCollision |= obj->checkSphereCachedPartial(radius, pos, prevPos, mask, info, maskOut,
141 return checkSpherePartial(radius, pos, prevPos, mask, info, maskOut, timeOffset);
145bool ObjectDrivableDirector::checkSphereCachedPartialPush(f32 radius,
const EGG::Vector3f &pos,
146 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
147 KCLTypeMask *maskOut,
u32 timeOffset) {
152 auto *boxColMgr = BoxColManager::Instance();
154 if (boxColMgr->isSphereInSpatialCache(radius, pos, eBoxColFlag::Drivable)) {
155 boxColMgr->resetIterators();
157 bool hasCollision =
false;
158 while (ObjectDrivable *obj = boxColMgr->getNextDrivable()) {
159 hasCollision |= obj->checkSphereCachedPartialPush(radius, pos, prevPos, mask, info,
160 maskOut, timeOffset);
166 return checkSpherePartialPush(radius, pos, prevPos, mask, info, maskOut, timeOffset);
170bool ObjectDrivableDirector::checkSphereCachedFullPush(f32 radius,
const EGG::Vector3f &pos,
171 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
177 auto *boxColMgr = BoxColManager::Instance();
179 if (boxColMgr->isSphereInSpatialCache(radius, pos, eBoxColFlag::Drivable)) {
180 bool hasCollision =
false;
181 boxColMgr->resetIterators();
183 while (ObjectDrivable *obj = boxColMgr->getNextDrivable()) {
184 hasCollision |= obj->checkSphereCachedFullPush(radius, pos, prevPos, mask, info,
185 maskOut, timeOffset);
191 return checkSphereFullPush(radius, pos, prevPos, mask, info, maskOut, timeOffset);
195void ObjectDrivableDirector::colNarScLocal(f32 radius,
const EGG::Vector3f &pos, KCLTypeMask mask,
201 auto *boxColMgr = BoxColManager::Instance();
202 boxColMgr->search(radius, pos, eBoxColFlag::Drivable);
204 while (ObjectDrivable *obj = boxColMgr->getNextDrivable()) {
205 obj->narrScLocal(radius, pos, mask, timeOffset);
210ObjectDrivableDirector *ObjectDrivableDirector::CreateInstance() {
212 s_instance =
new ObjectDrivableDirector;
217void ObjectDrivableDirector::DestroyInstance() {
219 auto *instance = s_instance;
220 s_instance =
nullptr;
225ObjectDrivableDirector::ObjectDrivableDirector() : m_obakeManager(nullptr) {}
228ObjectDrivableDirector::~ObjectDrivableDirector() {
230 s_instance =
nullptr;
231 WARN(
"ObjectDrivableDirector instance not explicitly handled!");
239ObjectDrivableDirector *ObjectDrivableDirector::s_instance =
nullptr;
std::vector< ObjectDrivable * > m_objects
All objects live here.
ObjectObakeManager * m_obakeManager
Manages rGV2 blocks and spatial indexing.
void createObakeManager(const System::MapdataGeoObj ¶ms)
Creates the rGV2 block manager. Also implicitly adds the block represented by params.
std::vector< ObjectDrivable * > m_calcObjects
Objects needing calc() live here too.
The manager class for SNES Ghost Valley 2 blocks.