// EntityManager.h // // Last modified: 22 May 04, Mark Thompson mot20@cam.ac.uk / mark@wildfiregames.com // // Maintains entity id->object mappings. Does most of the work involved in creating an entity. // // Usage: Do not attempt to directly instantiate an entity class. // HEntity bob = g_EntityManager.create( unit_class_name, position, orientation ); // or HEntity jim = g_EntityManager.create( pointer_to_unit_class, position, orientation ); // // Perform updates on all world entities by g_EntityManager.updateAll( timestep ) // Dispatch an identical message to all world entities by g_EntityManager.dispatchAll( message_pointer ) // Get an STL vector container of all entities with a certain property with g_EntityManager.matches( predicate ) // or just get all entities with g_EntityManager.getActive(). // // Those last two functions - caller has responsibility for deleting the collection when you're done with it. #ifndef ENTITY_MANAGER_INCLUDED #define ENTITY_MANAGER_INCLUDED #include "Singleton.h" #include "Entity.h" #include "EntityHandles.h" #include "EntityMessage.h" #define MAX_HANDLES 4096 #define g_EntityManager CEntityManager::GetSingleton() class CEntityManager : public Singleton { friend class HEntity; friend class CHandle; CHandle m_entities[MAX_HANDLES]; std::vector m_reaper; int m_nextalloc; static bool m_extant; void destroy( u16 handle ); public: typedef bool (*EntityPredicate)( CEntity* target ); CEntityManager(); ~CEntityManager(); HEntity create( CBaseEntity* base, CVector3D position, float orientation ); HEntity create( CStr templatename, CVector3D position, float orientation ); HEntity* getByHandle( u16 index ); void kill( HEntity ent ); void updateAll( float timestep ); void dispatchAll( CMessage* msg ); void renderAll(); std::vector* matches( EntityPredicate predicate ); std::vector* getActive(); static inline bool extant() // True if the singleton is actively maintaining handles. When false, system is shutting down, handles are quietly dumped. { return( m_extant ); } }; #endif