00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #if !defined(_XRB_ENGINE2_WORLD_HPP_)
00012 #define _XRB_ENGINE2_WORLD_HPP_
00013
00014 #include "xrb.hpp"
00015
00016 #include <list>
00017 #include <vector>
00018
00019 #include "xrb_engine2_entity.hpp"
00020 #include "xrb_eventhandler.hpp"
00021 #include "xrb_eventqueue.hpp"
00022 #include "xrb_framehandler.hpp"
00023
00024 namespace Xrb
00025 {
00026
00027 class Serializer;
00028
00041 namespace Engine2
00042 {
00043
00044 class ObjectLayer;
00045 class Object;
00046 class PhysicsHandler;
00047 class WorldView;
00048
00049
00050
00051
00052 class World : public EventHandler, public FrameHandler
00053 {
00054 public:
00055
00056 enum
00057 {
00058 MAXIMUM_ENTITY_CAPACITY = ENTITY_IS_NOT_IN_WORLD - 1,
00059 DEFAULT_ENTITY_CAPACITY = 0x1000
00060 };
00061
00062 typedef std::list<ObjectLayer *> ObjectLayerList;
00063
00064 virtual ~World ();
00065
00066 static World *Create (
00067 Serializer &serializer,
00068 CreateEntityFunction CreateEntity,
00069 PhysicsHandler *physics_handler);
00070 static World *CreateEmpty (
00071 PhysicsHandler *physics_handler,
00072 EntityWorldIndex entity_capacity = DEFAULT_ENTITY_CAPACITY);
00073 void Write (Serializer &serializer) const;
00074
00075 inline Uint32 EntityCapacity () const { ASSERT1(m_entity_vector.capacity() == m_entity_vector.size()); return m_entity_vector.size(); }
00076 inline Uint32 EntityCount () const { return m_entity_count; }
00077 inline Entity const *GetEntity (Uint32 index) const { ASSERT1(index < m_entity_vector.size()); return m_entity_vector[index]; }
00078 inline Entity *GetEntity (Uint32 index) { ASSERT1(index < m_entity_vector.size()); return m_entity_vector[index]; }
00079 inline ObjectLayerList &GetObjectLayerList () { return m_object_layer_list; }
00080 virtual ObjectLayer const *MainObjectLayer () const { return m_main_object_layer; }
00081 virtual ObjectLayer *MainObjectLayer () { return m_main_object_layer; }
00082 inline Float Timescale () { return m_timescale; }
00083
00084 inline void SetTimescale (Float timescale)
00085 {
00086 ASSERT1(timescale >= 0.0f);
00087 m_timescale = timescale;
00088 }
00089
00090
00091 void AttachWorldView (WorldView *world_view);
00092
00093 void DetachWorldView (WorldView *world_view);
00094
00095 void AddObjectLayer (ObjectLayer *object_layer);
00096 void SetMainObjectLayer (ObjectLayer *main_object_layer);
00097
00098
00099
00100
00101 void AddStaticObject (Object *static_object, ObjectLayer *object_layer);
00102
00103
00104
00105 void AddDynamicObject (Object *dynamic_object, ObjectLayer *object_layer);
00106
00107
00108 void RemoveDynamicObject (Object *dynamic_object);
00109
00110 protected:
00111
00112 World (
00113 PhysicsHandler *physics_handler,
00114 EntityWorldIndex entity_capacity = DEFAULT_ENTITY_CAPACITY);
00115
00116 virtual Uint32 MainObjectLayerIndex () const;
00117
00118 virtual void SetMainObjectLayerIndex (Uint32 index);
00119
00120
00121 virtual bool HandleEvent (Event const *e);
00122
00123 virtual void HandleFrame ();
00124 void IncrementLowestAvailableEntityIndex ();
00125 void UpdateLowestAvailableEntityIndex (EntityWorldIndex removed_entity_index);
00126
00127
00128 void Read (Serializer &serializer, CreateEntityFunction CreateEntity);
00129
00130
00131
00132 virtual void HandleAttachWorldView (WorldView *world_view) { }
00133
00134
00135 virtual void HandleDetachWorldView (WorldView *world_view) { }
00136
00137 virtual void ReadObjectLayers (
00138 Serializer &serializer,
00139 CreateEntityFunction CreateEntity);
00140 virtual void ReadDynamicObjectsBelongingToLayer (
00141 Serializer &serializer,
00142 ObjectLayer *object_layer,
00143 CreateEntityFunction CreateEntity);
00144
00145 typedef std::list<WorldView *> WorldViewList;
00146
00147
00148 WorldViewList m_world_view_list;
00149
00150 PhysicsHandler *const m_physics_handler;
00151
00152 ObjectLayerList m_object_layer_list;
00153
00154 ObjectLayer *m_main_object_layer;
00155
00156 Float m_timescale;
00157
00158 private:
00159
00160 void WriteObjectLayers (Serializer &serializer) const;
00161 void WriteDynamicObjectsBelongingToLayer (
00162 Serializer &serializer,
00163 ObjectLayer const *object_layer) const;
00164
00165 typedef std::vector<Entity *> EntityVector;
00166
00167
00168 EntityVector m_entity_vector;
00169
00170 EntityWorldIndex m_lowest_available_entity_index;
00171
00172 Uint32 m_entity_count;
00173
00174 EventQueue m_owner_event_queue;
00175 };
00176
00177 }
00178
00179 }
00180
00181 #endif // !defined(_XRB_ENGINE2_WORLD_HPP_)