Pyrogenesis  trunk
Classes | Public Types | Public Member Functions | Private Types | Private Member Functions | Private Attributes | Friends | List of all members
CComponentManager Class Reference

#include <ComponentManager.h>

Collaboration diagram for CComponentManager:
Collaboration graph
[legend]

Classes

struct  ComponentType
 

Public Types

typedef int InterfaceId
 
typedef int ComponentTypeId
 
typedef int MessageTypeId
 
using InterfacePair = std::pair< entity_id_t, IComponent * >
 
using InterfaceList = std::vector< InterfacePair >
 
using InterfaceListUnordered = std::unordered_map< entity_id_t, IComponent * >
 

Public Member Functions

 CComponentManager (CSimContext &, std::shared_ptr< ScriptContext > cx, bool skipScriptFunctions=false)
 
 ~CComponentManager ()
 
void LoadComponentTypes ()
 
bool LoadScript (const VfsPath &filename, bool hotload=false)
 Load a script and execute it in a new function scope. More...
 
void RegisterMessageType (MessageTypeId mtid, const char *name)
 
void RegisterComponentType (InterfaceId, ComponentTypeId, AllocFunc, DeallocFunc, const char *, const std::string &schema)
 
void RegisterComponentTypeScriptWrapper (InterfaceId, ComponentTypeId, AllocFunc, DeallocFunc, const char *, const std::string &schema)
 
void MarkScriptedComponentForSystemEntity (CComponentManager::ComponentTypeId cid)
 
void SubscribeToMessageType (MessageTypeId mtid)
 Subscribe the current component type to the given message type. More...
 
void SubscribeGloballyToMessageType (MessageTypeId mtid)
 Subscribe the current component type to all messages of the given message type. More...
 
void DynamicSubscriptionNonsync (MessageTypeId mtid, IComponent *component, bool enabled)
 Subscribe the given component instance to all messages of the given message type. More...
 
ComponentTypeId LookupCID (const std::string &cname) const
 
std::string LookupComponentTypeName (ComponentTypeId cid) const
 
void InitSystemEntity ()
 Set up an empty SYSTEM_ENTITY. More...
 
CEntityHandle GetSystemEntity ()
 Returns a CEntityHandle with id SYSTEM_ENTITY. More...
 
CEntityHandle LookupEntityHandle (entity_id_t ent, bool allowCreate=false)
 Returns a CEntityHandle with id ent. More...
 
bool EntityExists (entity_id_t ent) const
 Returns true if the entity with id ent exists. More...
 
entity_id_t AllocateNewEntity ()
 Returns a new entity ID that has never been used before. More...
 
entity_id_t AllocateNewLocalEntity ()
 Returns a new local entity ID that has never been used before. More...
 
entity_id_t AllocateNewEntity (entity_id_t preferredId)
 Returns a new entity ID that has never been used before. More...
 
bool AddComponent (CEntityHandle ent, ComponentTypeId cid, const CParamNode &paramNode)
 Constructs a component of type 'cid', initialised with data 'paramNode', and attaches it to entity 'ent'. More...
 
void AddSystemComponents (bool skipScriptedComponents, bool skipAI)
 Add all system components to the system entity (skip the scripted components or the AI components on demand) More...
 
void AddMockComponent (CEntityHandle ent, InterfaceId iid, IComponent &component)
 Adds an externally-created component, so that it is returned by QueryInterface but does not get destroyed and does not receive messages from the component manager. More...
 
IComponentConstructComponent (CEntityHandle ent, ComponentTypeId cid)
 Allocates a component object of type 'cid', and attaches it to entity 'ent'. More...
 
entity_id_t AddEntity (const std::wstring &templateName, entity_id_t ent)
 Constructs an entity based on the given template, and adds it the world with entity ID ent. More...
 
void DestroyComponentsSoon (entity_id_t ent)
 Destroys all the components belonging to the specified entity when FlushDestroyedComponents is called. More...
 
void FlushDestroyedComponents ()
 Does the actual destruction of components from DestroyComponentsSoon. More...
 
IComponentQueryInterface (entity_id_t ent, InterfaceId iid) const
 
InterfaceList GetEntitiesWithInterface (InterfaceId iid) const
 
const InterfaceListUnorderedGetEntitiesWithInterfaceUnordered (InterfaceId iid) const
 
void PostMessage (entity_id_t ent, const CMessage &msg)
 Send a message, targeted at a particular entity. More...
 
void BroadcastMessage (const CMessage &msg)
 Send a message, not targeted at any particular entity. More...
 
void ResetState ()
 Resets the dynamic simulation state (deletes all entities, resets entity ID counters; doesn't unload/reload component scripts). More...
 
void SetRNGSeed (u32 seed)
 Initializes the random number generator with a seed determined by the host. More...
 
bool ComputeStateHash (std::string &outHash, bool quick) const
 
bool DumpDebugState (std::ostream &stream, bool includeDebugInfo) const
 
bool SerializeState (std::ostream &stream) const
 
bool DeserializeState (std::istream &stream)
 
std::string GenerateSchema () const
 
ScriptInterfaceGetScriptInterface ()
 

Private Types

enum  EComponentTypeType { CT_Native, CT_ScriptWrapper, CT_Script }
 
using AllocFunc = IComponent::AllocFunc
 
using DeallocFunc = IComponent::DeallocFunc
 

Private Member Functions

 NONCOPYABLE (CComponentManager)
 
void Script_RegisterComponentType_Common (int iid, const std::string &cname, JS::HandleValue ctor, bool reRegister, bool systemComponent)
 
void Script_RegisterComponentType (int iid, const std::string &cname, JS::HandleValue ctor)
 
void Script_RegisterSystemComponentType (int iid, const std::string &cname, JS::HandleValue ctor)
 
void Script_ReRegisterComponentType (int iid, const std::string &cname, JS::HandleValue ctor)
 
void Script_RegisterInterface (const std::string &name)
 
void Script_RegisterMessageType (const std::string &name)
 
void Script_RegisterGlobal (const std::string &name, JS::HandleValue value)
 
std::vector< int > Script_GetEntitiesWithInterface (int iid)
 
std::vector< IComponent * > Script_GetComponentsWithInterface (int iid)
 
void Script_PostMessage (int ent, int mtid, JS::HandleValue data)
 
void Script_BroadcastMessage (int mtid, JS::HandleValue data)
 
int Script_AddEntity (const std::wstring &templateName)
 
int Script_AddLocalEntity (const std::wstring &templateName)
 
const CParamNodeScript_GetTemplate (const std::string &templateName)
 
CMessageConstructMessage (int mtid, JS::HandleValue data)
 
void SendGlobalMessage (entity_id_t ent, const CMessage &msg)
 
void FlattenDynamicSubscriptions ()
 
void RemoveComponentDynamicSubscriptions (IComponent *component)
 
ComponentTypeId GetScriptWrapper (InterfaceId iid)
 
CEntityHandle AllocateEntityHandle (entity_id_t ent)
 

Private Attributes

ScriptInterface m_ScriptInterface
 
CSimContextm_SimContext
 
CEntityHandle m_SystemEntity
 
ComponentTypeId m_CurrentComponent
 
bool m_CurrentlyHotloading
 
std::map< ComponentTypeId, ComponentTypem_ComponentTypesById
 
std::vector< CComponentManager::ComponentTypeIdm_ScriptedSystemComponents
 
std::vector< std::unordered_map< entity_id_t, IComponent * > > m_ComponentsByInterface
 
std::map< ComponentTypeId, std::map< entity_id_t, IComponent * > > m_ComponentsByTypeId
 
std::map< MessageTypeId, std::vector< ComponentTypeId > > m_LocalMessageSubscriptions
 
std::map< MessageTypeId, std::vector< ComponentTypeId > > m_GlobalMessageSubscriptions
 
std::map< std::string, ComponentTypeIdm_ComponentTypeIdsByName
 
std::map< std::string, MessageTypeIdm_MessageTypeIdsByName
 
std::map< MessageTypeId, std::string > m_MessageTypeNamesById
 
std::map< std::string, InterfaceIdm_InterfaceIdsByName
 
std::map< MessageTypeId, CDynamicSubscriptionm_DynamicMessageSubscriptionsNonsync
 
std::map< IComponent *, std::set< MessageTypeId > > m_DynamicMessageSubscriptionsNonsyncByComponent
 
std::unordered_map< entity_id_t, SEntityComponentCache * > m_ComponentCaches
 
std::vector< entity_id_tm_DestructionQueue
 
ComponentTypeId m_NextScriptComponentTypeId
 
entity_id_t m_NextEntityId
 
entity_id_t m_NextLocalEntityId
 
boost::rand48 m_RNG
 

Friends

class TestComponentManager
 

Member Typedef Documentation

◆ AllocFunc

◆ ComponentTypeId

◆ DeallocFunc

◆ InterfaceId

◆ InterfaceList

◆ InterfaceListUnordered

◆ InterfacePair

◆ MessageTypeId

Member Enumeration Documentation

◆ EComponentTypeType

Enumerator
CT_Native 
CT_ScriptWrapper 
CT_Script 

Constructor & Destructor Documentation

◆ CComponentManager()

CComponentManager::CComponentManager ( CSimContext context,
std::shared_ptr< ScriptContext cx,
bool  skipScriptFunctions = false 
)

◆ ~CComponentManager()

CComponentManager::~CComponentManager ( )

Member Function Documentation

◆ AddComponent()

bool CComponentManager::AddComponent ( CEntityHandle  ent,
ComponentTypeId  cid,
const CParamNode paramNode 
)

Constructs a component of type 'cid', initialised with data 'paramNode', and attaches it to entity 'ent'.

Returns
true on success; false on failure, and logs an error message

◆ AddEntity()

entity_id_t CComponentManager::AddEntity ( const std::wstring &  templateName,
entity_id_t  ent 
)

Constructs an entity based on the given template, and adds it the world with entity ID ent.

There should not be any existing components with that entity ID.

Returns
ent, or INVALID_ENTITY on error

◆ AddMockComponent()

void CComponentManager::AddMockComponent ( CEntityHandle  ent,
InterfaceId  iid,
IComponent component 
)

Adds an externally-created component, so that it is returned by QueryInterface but does not get destroyed and does not receive messages from the component manager.

(This is intended for unit tests that need to add mock objects the tested components expect to exist.)

◆ AddSystemComponents()

void CComponentManager::AddSystemComponents ( bool  skipScriptedComponents,
bool  skipAI 
)

Add all system components to the system entity (skip the scripted components or the AI components on demand)

◆ AllocateEntityHandle()

CEntityHandle CComponentManager::AllocateEntityHandle ( entity_id_t  ent)
private

◆ AllocateNewEntity() [1/2]

entity_id_t CComponentManager::AllocateNewEntity ( )

Returns a new entity ID that has never been used before.

This affects the simulation state so it must only be called in network-synchronised ways.

◆ AllocateNewEntity() [2/2]

entity_id_t CComponentManager::AllocateNewEntity ( entity_id_t  preferredId)

Returns a new entity ID that has never been used before.

If possible, returns preferredId, and ensures this ID won't be allocated again. This affects the simulation state so it must only be called in network-synchronised ways.

◆ AllocateNewLocalEntity()

entity_id_t CComponentManager::AllocateNewLocalEntity ( )

Returns a new local entity ID that has never been used before.

This entity will not be synchronised over the network, stored in saved games, etc.

◆ BroadcastMessage()

void CComponentManager::BroadcastMessage ( const CMessage msg)

Send a message, not targeted at any particular entity.

The message will be received by any components that subscribed (either globally or not) to the message type.

◆ ComputeStateHash()

bool CComponentManager::ComputeStateHash ( std::string &  outHash,
bool  quick 
) const

◆ ConstructComponent()

IComponent * CComponentManager::ConstructComponent ( CEntityHandle  ent,
ComponentTypeId  cid 
)

Allocates a component object of type 'cid', and attaches it to entity 'ent'.

(The component's Init is not called here - either Init or Deserialize must be called before using the returned object.)

◆ ConstructMessage()

CMessage * CComponentManager::ConstructMessage ( int  mtid,
JS::HandleValue  data 
)
private

◆ DeserializeState()

bool CComponentManager::DeserializeState ( std::istream &  stream)

◆ DestroyComponentsSoon()

void CComponentManager::DestroyComponentsSoon ( entity_id_t  ent)

Destroys all the components belonging to the specified entity when FlushDestroyedComponents is called.

Has no effect if the entity does not exist, or has already been added to the destruction queue.

◆ DumpDebugState()

bool CComponentManager::DumpDebugState ( std::ostream &  stream,
bool  includeDebugInfo 
) const

◆ DynamicSubscriptionNonsync()

void CComponentManager::DynamicSubscriptionNonsync ( MessageTypeId  mtid,
IComponent component,
bool  enabled 
)

Subscribe the given component instance to all messages of the given message type.

The component's HandleMessage will be called on any BroadcastMessage or PostMessage of this message type, regardless of the entity.

This can be called at any time (including inside the HandleMessage callback for this message type).

The component type must not have statically subscribed to this message type in its ClassInit.

The subscription status is not saved or network-synchronised. Components must remember to resubscribe in their Deserialize methods if they still want the message.

This is primarily intended for Interpolate and RenderSubmit messages, to avoid the cost of sending the message to components that do not currently need to do any rendering.

◆ EntityExists()

bool CComponentManager::EntityExists ( entity_id_t  ent) const

Returns true if the entity with id ent exists.

◆ FlattenDynamicSubscriptions()

void CComponentManager::FlattenDynamicSubscriptions ( )
private

◆ FlushDestroyedComponents()

void CComponentManager::FlushDestroyedComponents ( )

Does the actual destruction of components from DestroyComponentsSoon.

This must not be called if the component manager is on the call stack (since it will break internal iterators).

◆ GenerateSchema()

std::string CComponentManager::GenerateSchema ( ) const

◆ GetEntitiesWithInterface()

CComponentManager::InterfaceList CComponentManager::GetEntitiesWithInterface ( InterfaceId  iid) const

◆ GetEntitiesWithInterfaceUnordered()

const CComponentManager::InterfaceListUnordered & CComponentManager::GetEntitiesWithInterfaceUnordered ( InterfaceId  iid) const

◆ GetScriptInterface()

ScriptInterface& CComponentManager::GetScriptInterface ( )
inline

◆ GetScriptWrapper()

CComponentManager::ComponentTypeId CComponentManager::GetScriptWrapper ( InterfaceId  iid)
private

◆ GetSystemEntity()

CEntityHandle CComponentManager::GetSystemEntity ( )
inline

Returns a CEntityHandle with id SYSTEM_ENTITY.

◆ InitSystemEntity()

void CComponentManager::InitSystemEntity ( )

Set up an empty SYSTEM_ENTITY.

Must be called after ResetState() and before GetSystemEntity().

◆ LoadComponentTypes()

void CComponentManager::LoadComponentTypes ( )

◆ LoadScript()

bool CComponentManager::LoadScript ( const VfsPath filename,
bool  hotload = false 
)

Load a script and execute it in a new function scope.

Parameters
filenameVFS path to load
hotloadset to true if this script has been loaded before, and redefinitions of existing components should not be considered errors

◆ LookupCID()

CComponentManager::ComponentTypeId CComponentManager::LookupCID ( const std::string &  cname) const
Parameters
cnameRequested component type name (not including any "CID" or "CCmp" prefix)
Returns
The component type id, or CID__Invalid if not found

◆ LookupComponentTypeName()

std::string CComponentManager::LookupComponentTypeName ( ComponentTypeId  cid) const
Returns
The name of the given component type, or "" if not found

◆ LookupEntityHandle()

CEntityHandle CComponentManager::LookupEntityHandle ( entity_id_t  ent,
bool  allowCreate = false 
)

Returns a CEntityHandle with id ent.

If allowCreate is true and there is no existing CEntityHandle, a new handle will be allocated.

◆ MarkScriptedComponentForSystemEntity()

void CComponentManager::MarkScriptedComponentForSystemEntity ( CComponentManager::ComponentTypeId  cid)

◆ NONCOPYABLE()

CComponentManager::NONCOPYABLE ( CComponentManager  )
private

◆ PostMessage()

void CComponentManager::PostMessage ( entity_id_t  ent,
const CMessage msg 
)

Send a message, targeted at a particular entity.

The message will be received by any components of that entity which subscribed to the message type, and by any other components that subscribed globally to the message type.

◆ QueryInterface()

IComponent * CComponentManager::QueryInterface ( entity_id_t  ent,
InterfaceId  iid 
) const

◆ RegisterComponentType()

void CComponentManager::RegisterComponentType ( InterfaceId  iid,
ComponentTypeId  cid,
AllocFunc  alloc,
DeallocFunc  dealloc,
const char *  name,
const std::string &  schema 
)

◆ RegisterComponentTypeScriptWrapper()

void CComponentManager::RegisterComponentTypeScriptWrapper ( InterfaceId  iid,
ComponentTypeId  cid,
AllocFunc  alloc,
DeallocFunc  dealloc,
const char *  name,
const std::string &  schema 
)

◆ RegisterMessageType()

void CComponentManager::RegisterMessageType ( MessageTypeId  mtid,
const char *  name 
)

◆ RemoveComponentDynamicSubscriptions()

void CComponentManager::RemoveComponentDynamicSubscriptions ( IComponent component)
private

◆ ResetState()

void CComponentManager::ResetState ( )

Resets the dynamic simulation state (deletes all entities, resets entity ID counters; doesn't unload/reload component scripts).

◆ Script_AddEntity()

int CComponentManager::Script_AddEntity ( const std::wstring &  templateName)
private

◆ Script_AddLocalEntity()

int CComponentManager::Script_AddLocalEntity ( const std::wstring &  templateName)
private

◆ Script_BroadcastMessage()

void CComponentManager::Script_BroadcastMessage ( int  mtid,
JS::HandleValue  data 
)
private

◆ Script_GetComponentsWithInterface()

std::vector< IComponent * > CComponentManager::Script_GetComponentsWithInterface ( int  iid)
private

◆ Script_GetEntitiesWithInterface()

std::vector< int > CComponentManager::Script_GetEntitiesWithInterface ( int  iid)
private

◆ Script_GetTemplate()

const CParamNode & CComponentManager::Script_GetTemplate ( const std::string &  templateName)
private

◆ Script_PostMessage()

void CComponentManager::Script_PostMessage ( int  ent,
int  mtid,
JS::HandleValue  data 
)
private

◆ Script_RegisterComponentType()

void CComponentManager::Script_RegisterComponentType ( int  iid,
const std::string &  cname,
JS::HandleValue  ctor 
)
private

◆ Script_RegisterComponentType_Common()

void CComponentManager::Script_RegisterComponentType_Common ( int  iid,
const std::string &  cname,
JS::HandleValue  ctor,
bool  reRegister,
bool  systemComponent 
)
private

◆ Script_RegisterGlobal()

void CComponentManager::Script_RegisterGlobal ( const std::string &  name,
JS::HandleValue  value 
)
private

◆ Script_RegisterInterface()

void CComponentManager::Script_RegisterInterface ( const std::string &  name)
private

◆ Script_RegisterMessageType()

void CComponentManager::Script_RegisterMessageType ( const std::string &  name)
private

◆ Script_RegisterSystemComponentType()

void CComponentManager::Script_RegisterSystemComponentType ( int  iid,
const std::string &  cname,
JS::HandleValue  ctor 
)
private

◆ Script_ReRegisterComponentType()

void CComponentManager::Script_ReRegisterComponentType ( int  iid,
const std::string &  cname,
JS::HandleValue  ctor 
)
private

◆ SendGlobalMessage()

void CComponentManager::SendGlobalMessage ( entity_id_t  ent,
const CMessage msg 
)
private

◆ SerializeState()

bool CComponentManager::SerializeState ( std::ostream &  stream) const

◆ SetRNGSeed()

void CComponentManager::SetRNGSeed ( u32  seed)

Initializes the random number generator with a seed determined by the host.

◆ SubscribeGloballyToMessageType()

void CComponentManager::SubscribeGloballyToMessageType ( MessageTypeId  mtid)

Subscribe the current component type to all messages of the given message type.

Each component's HandleMessage will be called on any BroadcastMessage or PostMessage of this message type, regardless of the entity. Must only be called by a component type's ClassInit.

◆ SubscribeToMessageType()

void CComponentManager::SubscribeToMessageType ( MessageTypeId  mtid)

Subscribe the current component type to the given message type.

Each component's HandleMessage will be called on any BroadcastMessage of this message type, or on any PostMessage of this type targeted at the component's entity. Must only be called by a component type's ClassInit.

Friends And Related Function Documentation

◆ TestComponentManager

friend class TestComponentManager
friend

Member Data Documentation

◆ m_ComponentCaches

std::unordered_map<entity_id_t, SEntityComponentCache*> CComponentManager::m_ComponentCaches
private

◆ m_ComponentsByInterface

std::vector<std::unordered_map<entity_id_t, IComponent*> > CComponentManager::m_ComponentsByInterface
private

◆ m_ComponentsByTypeId

std::map<ComponentTypeId, std::map<entity_id_t, IComponent*> > CComponentManager::m_ComponentsByTypeId
private

◆ m_ComponentTypeIdsByName

std::map<std::string, ComponentTypeId> CComponentManager::m_ComponentTypeIdsByName
private

◆ m_ComponentTypesById

std::map<ComponentTypeId, ComponentType> CComponentManager::m_ComponentTypesById
private

◆ m_CurrentComponent

ComponentTypeId CComponentManager::m_CurrentComponent
private

◆ m_CurrentlyHotloading

bool CComponentManager::m_CurrentlyHotloading
private

◆ m_DestructionQueue

std::vector<entity_id_t> CComponentManager::m_DestructionQueue
private

◆ m_DynamicMessageSubscriptionsNonsync

std::map<MessageTypeId, CDynamicSubscription> CComponentManager::m_DynamicMessageSubscriptionsNonsync
private

◆ m_DynamicMessageSubscriptionsNonsyncByComponent

std::map<IComponent*, std::set<MessageTypeId> > CComponentManager::m_DynamicMessageSubscriptionsNonsyncByComponent
private

◆ m_GlobalMessageSubscriptions

std::map<MessageTypeId, std::vector<ComponentTypeId> > CComponentManager::m_GlobalMessageSubscriptions
private

◆ m_InterfaceIdsByName

std::map<std::string, InterfaceId> CComponentManager::m_InterfaceIdsByName
private

◆ m_LocalMessageSubscriptions

std::map<MessageTypeId, std::vector<ComponentTypeId> > CComponentManager::m_LocalMessageSubscriptions
private

◆ m_MessageTypeIdsByName

std::map<std::string, MessageTypeId> CComponentManager::m_MessageTypeIdsByName
private

◆ m_MessageTypeNamesById

std::map<MessageTypeId, std::string> CComponentManager::m_MessageTypeNamesById
private

◆ m_NextEntityId

entity_id_t CComponentManager::m_NextEntityId
private

◆ m_NextLocalEntityId

entity_id_t CComponentManager::m_NextLocalEntityId
private

◆ m_NextScriptComponentTypeId

ComponentTypeId CComponentManager::m_NextScriptComponentTypeId
private

◆ m_RNG

boost::rand48 CComponentManager::m_RNG
private

◆ m_ScriptedSystemComponents

std::vector<CComponentManager::ComponentTypeId> CComponentManager::m_ScriptedSystemComponents
private

◆ m_ScriptInterface

ScriptInterface CComponentManager::m_ScriptInterface
private

◆ m_SimContext

CSimContext& CComponentManager::m_SimContext
private

◆ m_SystemEntity

CEntityHandle CComponentManager::m_SystemEntity
private

The documentation for this class was generated from the following files: