00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "xrb_engine2_world.hpp"
00012
00013 #include <algorithm>
00014
00015 #include "xrb_engine2_events.hpp"
00016 #include "xrb_engine2_objectlayer.hpp"
00017 #include "xrb_engine2_physicshandler.hpp"
00018 #include "xrb_engine2_visibilityquadtree.hpp"
00019 #include "xrb_engine2_worldview.hpp"
00020 #include "xrb_eventqueue.hpp"
00021 #include "xrb_serializer.hpp"
00022
00023 namespace Xrb
00024 {
00025
00026 Engine2::World::~World ()
00027 {
00028 ASSERT1(m_world_view_list.empty() && "all WorldView objects must be detached before destroying World");
00029
00030
00031
00032 for (EntityWorldIndex i = 0;
00033 i < static_cast<EntityWorldIndex>(m_entity_vector.size());
00034 ++i)
00035 {
00036 Entity *entity = m_entity_vector[i];
00037 if (entity != NULL)
00038 {
00039 RemoveDynamicObject(entity->OwnerObject());
00040 delete entity->OwnerObject();
00041 }
00042 }
00043 ASSERT1(m_entity_count == 0);
00044
00045
00046 delete m_physics_handler;
00047
00048
00049 for (ObjectLayerList::iterator it = m_object_layer_list.begin(),
00050 it_end = m_object_layer_list.end();
00051 it != it_end;
00052 ++it)
00053 {
00054 ObjectLayer *object_layer = *it;
00055 ASSERT1(object_layer != NULL);
00056 Delete(object_layer);
00057 }
00058 m_object_layer_list.clear();
00059
00060
00061
00062
00063 SetOwnerEventQueue(NULL);
00064 }
00065
00066 Engine2::World *Engine2::World::Create (
00067 Serializer &serializer,
00068 CreateEntityFunction CreateEntity,
00069 PhysicsHandler *const physics_handler)
00070 {
00071 ASSERT1(serializer.IsOpen());
00072 ASSERT1(serializer.GetIODirection() == IOD_READ);
00073
00074 Uint16 entity_capacity = serializer.ReadUint32();
00075 World *retval = new World(physics_handler, entity_capacity);
00076
00077 retval->Read(serializer, NULL);
00078
00079 return retval;
00080 }
00081
00082 Engine2::World *Engine2::World::CreateEmpty (
00083 PhysicsHandler *const physics_handler,
00084 EntityWorldIndex const entity_capacity)
00085 {
00086 return new World(physics_handler, entity_capacity);
00087 }
00088
00089 void Engine2::World::Write (Serializer &serializer) const
00090 {
00091 serializer.WriteUint32(EntityCapacity());
00092 serializer.WriteUint32(MainObjectLayerIndex());
00093 WriteObjectLayers(serializer);
00094 }
00095
00096 void Engine2::World::AttachWorldView (WorldView *const world_view)
00097 {
00098 ASSERT1(world_view != NULL);
00099 ASSERT1(world_view->GetWorld() == NULL);
00100 ASSERT1(std::find(m_world_view_list.begin(), m_world_view_list.end(), world_view)
00101 ==
00102 m_world_view_list.end());
00103 world_view->SetWorld(this);
00104 m_world_view_list.push_back(world_view);
00105 HandleAttachWorldView(world_view);
00106 }
00107
00108 void Engine2::World::DetachWorldView (WorldView *const world_view)
00109 {
00110 ASSERT1(world_view != NULL);
00111 ASSERT1(world_view->GetWorld() == this);
00112 HandleDetachWorldView(world_view);
00113 WorldViewList::iterator it =
00114 std::find(m_world_view_list.begin(), m_world_view_list.end(), world_view);
00115 ASSERT1(it != m_world_view_list.end());
00116 m_world_view_list.erase(it);
00117 world_view->SetWorld(NULL);
00118 }
00119
00120 void Engine2::World::AddObjectLayer (Engine2::ObjectLayer *const object_layer)
00121 {
00122 ASSERT1(object_layer != NULL);
00123 m_object_layer_list.push_back(object_layer);
00124 if (m_physics_handler != NULL)
00125 m_physics_handler->AddObjectLayer(object_layer);
00126 }
00127
00128 void Engine2::World::SetMainObjectLayer (Engine2::ObjectLayer *main_object_layer)
00129 {
00130 ASSERT1(main_object_layer != NULL);
00131 ASSERT1(main_object_layer->OwnerWorld() == this);
00132 m_main_object_layer = main_object_layer;
00133 if (m_physics_handler != NULL)
00134 m_physics_handler->SetMainObjectLayer(m_main_object_layer);
00135 }
00136
00137 void Engine2::World::AddStaticObject (
00138 Engine2::Object *const static_object,
00139 Engine2::ObjectLayer *const object_layer)
00140 {
00141 ASSERT1(static_object != NULL);
00142 ASSERT1(object_layer != NULL);
00143 ASSERT1(!static_object->IsDynamic());
00144
00145 object_layer->AddObject(static_object);
00146 }
00147
00148 void Engine2::World::AddDynamicObject (
00149 Engine2::Object *const dynamic_object,
00150 Engine2::ObjectLayer *const object_layer)
00151 {
00152 ASSERT1(dynamic_object != NULL);
00153 ASSERT1(object_layer != NULL);
00154 ASSERT1(dynamic_object->IsDynamic());
00155 Entity *entity = dynamic_object->GetEntity();
00156 ASSERT1(entity != NULL);
00157 ASSERT1(!entity->IsInWorld());
00158
00159 if (m_lowest_available_entity_index == static_cast<EntityWorldIndex>(m_entity_vector.size()))
00160 {
00161 ASSERT0(false && "World::AddDynamicObject(); dynamic object array full");
00162 return;
00163 }
00164
00165
00166 object_layer->AddObject(dynamic_object);
00167
00168
00169 m_entity_vector[m_lowest_available_entity_index] = entity;
00170
00171 entity->SetWorldIndex(static_cast<EntityWorldIndex>(m_lowest_available_entity_index));
00172
00173 IncrementLowestAvailableEntityIndex();
00174
00175 ASSERT1(m_entity_count < UINT32_UPPER_BOUND);
00176 ++m_entity_count;
00177
00178
00179
00180 if (m_physics_handler != NULL)
00181 m_physics_handler->AddEntity(entity);
00182 }
00183
00184 void Engine2::World::RemoveDynamicObject (Engine2::Object *const dynamic_object)
00185 {
00186 ASSERT1(dynamic_object != NULL);
00187 ASSERT1(dynamic_object->IsDynamic());
00188 Entity *entity = dynamic_object->GetEntity();
00189 ASSERT1(entity != NULL);
00190 ASSERT1(entity->IsInWorld());
00191 EntityWorldIndex entity_index = entity->WorldIndex();
00192 ASSERT1(entity_index < static_cast<EntityWorldIndex>(m_entity_vector.size()));
00193 ASSERT1(m_entity_vector[entity_index] == entity);
00194
00195
00196 dynamic_object->GetObjectLayer()->RemoveObject(dynamic_object);
00197
00198 m_entity_vector[entity_index] = NULL;
00199
00200
00201 if (entity_index < m_lowest_available_entity_index)
00202 m_lowest_available_entity_index = entity_index;
00203
00204 entity->ResetWorldIndex();
00205
00206 ASSERT1(m_entity_count > 0);
00207 --m_entity_count;
00208
00209
00210 OwnerEventQueue()->ScheduleMatchingEventsForDeletion(
00211 Engine2::MatchEntity,
00212 entity);
00213
00214
00215 if (m_physics_handler != NULL)
00216 m_physics_handler->RemoveEntity(entity);
00217 }
00218
00219 Engine2::World::World (
00220 PhysicsHandler *const physics_handler,
00221 EntityWorldIndex const entity_capacity)
00222 :
00223 EventHandler(NULL),
00224 FrameHandler(),
00225 m_physics_handler(physics_handler)
00226 {
00227 SetOwnerEventQueue(&m_owner_event_queue);
00228
00229 if (m_physics_handler != NULL)
00230 m_physics_handler->SetOwnerWorld(this);
00231 m_main_object_layer = NULL;
00232 m_timescale = 1.0f;
00233 ASSERT1(entity_capacity > 0);
00234 m_entity_vector.resize(Min(entity_capacity, static_cast<EntityWorldIndex>(MAXIMUM_ENTITY_CAPACITY)));
00235 std::fill(m_entity_vector.begin(), m_entity_vector.end(), static_cast<Entity *>(NULL));
00236 m_lowest_available_entity_index = 0;
00237 m_entity_count = 0;
00238 }
00239
00240 Uint32 Engine2::World::MainObjectLayerIndex () const
00241 {
00242 Uint32 index = 0;
00243 for (ObjectLayerList::const_iterator it = m_object_layer_list.begin(),
00244 it_end = m_object_layer_list.end();
00245 it != it_end;
00246 ++it)
00247 {
00248 ObjectLayer *object_layer = *it;
00249 ASSERT1(object_layer != NULL);
00250 if (object_layer == MainObjectLayer())
00251 return index;
00252 }
00253
00254 ASSERT0(false && "No main object layer");
00255 return UINT32_UPPER_BOUND;
00256 }
00257
00258 void Engine2::World::SetMainObjectLayerIndex (Uint32 const index)
00259 {
00260 Uint32 i = 0;
00261 for (ObjectLayerList::iterator it = m_object_layer_list.begin(),
00262 it_end = m_object_layer_list.end();
00263 it != it_end;
00264 ++it)
00265 {
00266 ObjectLayer *object_layer = *it;
00267 ASSERT1(object_layer != NULL);
00268 if (i == index) {
00269 m_main_object_layer = object_layer;
00270 if (m_physics_handler != NULL)
00271 m_physics_handler->SetMainObjectLayer(m_main_object_layer);
00272 return;
00273 }
00274 }
00275
00276 ASSERT0(false && "Invalid index (higher than the highest object layer index)");
00277 }
00278
00279 bool Engine2::World::HandleEvent (Event const *const e)
00280 {
00281 ASSERT1(e != NULL);
00282 switch (e->GetEventType())
00283 {
00284 case Event::ENGINE2_DELETE_ENTITY:
00285 {
00286 EventEntity const *event_entity =
00287 DStaticCast<EventEntity const *>(e);
00288 Entity *entity = event_entity->GetEntity();
00289 ASSERT1(entity != NULL);
00290 ASSERT1(entity->IsInWorld() &&
00291 "You shouldn't schedule removed entities "
00292 "for deletion -- just delete them");
00293 ASSERT1(entity->OwnerObject()->GetWorld() == this);
00294 RemoveDynamicObject(entity->OwnerObject());
00295 delete entity->OwnerObject();
00296 event_entity->NullifyEntity();
00297 break;
00298 }
00299
00300 case Event::ENGINE2_REMOVE_ENTITY_FROM_WORLD:
00301 {
00302 EventEntity const *event_entity =
00303 DStaticCast<EventEntity const *>(e);
00304 Entity *entity = event_entity->GetEntity();
00305 ASSERT1(entity != NULL);
00306 ASSERT1(entity->IsInWorld() &&
00307 "You can only remove entities already in the world");
00308 ASSERT1(entity->OwnerObject()->GetWorld() == this);
00309 RemoveDynamicObject(entity->OwnerObject());
00310 event_entity->NullifyEntity();
00311 break;
00312 }
00313
00314 default:
00315 break;
00316 }
00317
00318 return true;
00319 }
00320
00321 void Engine2::World::HandleFrame ()
00322 {
00323 ASSERT1(m_main_object_layer != NULL);
00324 if (m_physics_handler != NULL)
00325 m_physics_handler->ProcessFrame(FrameTime());
00326 m_owner_event_queue.ProcessFrame(FrameTime());
00327 }
00328
00329 void Engine2::World::IncrementLowestAvailableEntityIndex ()
00330 {
00331 EntityWorldIndex max = static_cast<EntityWorldIndex>(m_entity_vector.size());
00332 while (m_lowest_available_entity_index < max &&
00333 m_entity_vector[m_lowest_available_entity_index] != NULL)
00334 {
00335 ++m_lowest_available_entity_index;
00336 }
00337 }
00338
00339 void Engine2::World::UpdateLowestAvailableEntityIndex (
00340 EntityWorldIndex const removed_entity_index)
00341 {
00342 if (removed_entity_index < m_lowest_available_entity_index)
00343 m_lowest_available_entity_index = removed_entity_index;
00344 }
00345
00346 void Engine2::World::Read (Serializer &serializer, CreateEntityFunction CreateEntity)
00347 {
00348 ASSERT1(m_object_layer_list.empty());
00349
00350 Uint32 main_object_layer_index = serializer.ReadUint32();
00351 ReadObjectLayers(serializer, CreateEntity);
00352 SetMainObjectLayerIndex(main_object_layer_index);
00353 }
00354
00355 void Engine2::World::ReadObjectLayers (
00356 Serializer &serializer,
00357 CreateEntityFunction CreateEntity)
00358 {
00359 Uint32 object_layer_list_size = serializer.ReadUint32();
00360 for (Uint32 i = 0; i < object_layer_list_size; ++i)
00361 {
00362 ObjectLayer *object_layer = ObjectLayer::Create(serializer, this);
00363 AddObjectLayer(object_layer);
00364 ReadDynamicObjectsBelongingToLayer(serializer, object_layer, CreateEntity);
00365 }
00366 ASSERT1(serializer.HasFewerThan8BitsLeft());
00367 }
00368
00369 void Engine2::World::ReadDynamicObjectsBelongingToLayer (
00370 Serializer &serializer,
00371 Engine2::ObjectLayer *const object_layer,
00372 CreateEntityFunction CreateEntity)
00373 {
00374 ASSERT1(object_layer != NULL);
00375
00376 Uint32 dynamic_object_count = serializer.ReadUint32();
00377 while (dynamic_object_count > 0)
00378 {
00379 Object *dynamic_object = Object::Create(serializer, CreateEntity);
00380 ASSERT1(dynamic_object != NULL);
00381 ASSERT1(dynamic_object->IsDynamic());
00382 AddDynamicObject(dynamic_object, object_layer);
00383 --dynamic_object_count;
00384 }
00385 }
00386
00387 void Engine2::World::WriteObjectLayers (Serializer &serializer) const
00388 {
00389 serializer.WriteUint32(m_object_layer_list.size());
00390 for (ObjectLayerList::const_iterator it = m_object_layer_list.begin(),
00391 it_end = m_object_layer_list.end();
00392 it != it_end;
00393 ++it)
00394 {
00395 ObjectLayer const *object_layer = *it;
00396 ASSERT1(object_layer != NULL);
00397 object_layer->Write(serializer);
00398 WriteDynamicObjectsBelongingToLayer(serializer, object_layer);
00399 }
00400 }
00401
00402 void Engine2::World::WriteDynamicObjectsBelongingToLayer (
00403 Serializer &serializer,
00404 Engine2::ObjectLayer const *const object_layer) const
00405 {
00406 ASSERT1(object_layer != NULL);
00407
00408
00409 Uint32 dynamic_object_count = 0;
00410 for (EntityVector::const_iterator it = m_entity_vector.begin(),
00411 it_end = m_entity_vector.end();
00412 it != it_end;
00413 ++it)
00414 {
00415 Entity const *entity = *it;
00416 if (entity != NULL)
00417 {
00418 ASSERT1(entity->GetObjectLayer() != NULL);
00419 ASSERT1(entity->IsInWorld());
00420
00421
00422 if (entity->GetObjectLayer() == object_layer)
00423 ++dynamic_object_count;
00424 }
00425 }
00426
00427
00428 serializer.WriteUint32(dynamic_object_count);
00429
00430 if (dynamic_object_count == 0)
00431 return;
00432
00433 for (EntityVector::const_iterator it = m_entity_vector.begin(),
00434 it_end = m_entity_vector.end();
00435 it != it_end;
00436 ++it)
00437 {
00438 Entity const *entity = *it;
00439 if (entity != NULL)
00440 {
00441 ASSERT1(entity->GetObjectLayer() != NULL);
00442 ASSERT1(entity->IsInWorld());
00443
00444
00445 if (entity->GetObjectLayer() == object_layer)
00446 {
00447 entity->OwnerObject()->Write(serializer);
00448 --dynamic_object_count;
00449 }
00450 }
00451 }
00452 ASSERT1(dynamic_object_count == 0);
00453 }
00454
00455 }