Loading [MathJax]/extensions/TeX/AMSmath.js
Radium Engine  1.5.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
EntityManager.cpp
1 #include <Engine/Scene/EntityManager.hpp>
2 
3 #include <Core/Utils/Log.hpp>
4 
5 #include <Engine/RadiumEngine.hpp>
6 #include <Engine/Scene/SignalManager.hpp>
7 #include <Engine/Scene/SystemDisplay.hpp>
8 
9 namespace Ra {
10 namespace Engine {
11 namespace Scene {
12 
13 using namespace Core::Utils; // log
14 
15 EntityManager::EntityManager() {
16  auto idx = m_entities.emplace( SystemEntity::createInstance() );
17  auto& ent = m_entities[idx];
18  ent->setIndex( idx );
19  CORE_ASSERT( ent.get() == SystemEntity::getInstance(), "Invalid singleton instanciation" );
20  m_entitiesName.insert( { ent->getName(), ent->getIndex() } );
21  RadiumEngine::getInstance()->getSignalManager()->fireEntityCreated(
22  ItemEntry( SystemEntity::getInstance() ) );
23 }
24 
25 EntityManager::~EntityManager() {
26  auto& ent = m_entities[0];
27  ent.release();
28  SystemEntity::destroyInstance();
29 }
30 
31 Entity* EntityManager::createEntity( const std::string& name ) {
32  auto idx = m_entities.emplace( new Entity( name ) );
33  auto& ent = m_entities[idx];
34  ent->setIndex( idx );
35 
36  std::string entityName = name;
37  if ( name.empty() ) {
38  entityName = "Entity_" + std::to_string( idx.getValue() );
39  ent->rename( entityName );
40  }
41  else {
42  int i = 1;
43  bool mustRename = false;
44  while ( entityExists( entityName ) ) {
45  LOG( logWARNING ) << "Entity `" << entityName << "` already exists";
46  entityName = name + "_" + std::to_string( i++ );
47  mustRename = true;
48  }
49  if ( mustRename ) { ent->rename( entityName ); }
50  }
51 
52  m_entitiesName.insert( { ent->getName(), idx } );
53  RadiumEngine::getInstance()->getSignalManager()->fireEntityCreated( ItemEntry( ent.get() ) );
54  return ent.get();
55 }
56 
57 bool EntityManager::entityExists( const std::string& name ) const {
58  return m_entitiesName.find( name ) != m_entitiesName.end();
59 }
60 
61 void EntityManager::removeEntity( Core::Utils::Index idx ) {
62  CORE_ASSERT( idx.isValid() && m_entities.contains( idx ),
63  "Trying to remove an entity that has not been added to the manager." );
64 
65  auto& ent = m_entities[idx];
66  std::string name = ent->getName();
67  m_entities.remove( idx );
68  m_entitiesName.erase( name );
69 }
70 
71 void EntityManager::removeEntity( Entity* entity ) {
72  removeEntity( entity->getIndex() );
73 }
74 
75 Entity* EntityManager::getEntity( Core::Utils::Index idx ) const {
76  CORE_ASSERT( idx.isValid(), "Trying to access an invalid component." );
77 
78  Entity* ent = nullptr;
79 
80  if ( m_entities.contains( idx ) ) { ent = m_entities[idx].get(); }
81 
82  return ent;
83 }
84 
85 std::vector<Entity*> EntityManager::getEntities() const {
86  std::vector<Entity*> entities;
87  entities.resize( m_entities.size() );
88  std::transform( m_entities.begin(), m_entities.end(), entities.begin(), []( const auto& e ) {
89  return e.get();
90  } );
91 
92  return entities;
93 }
94 
95 Entity* EntityManager::getEntity( const std::string& name ) const {
96  auto idx = m_entitiesName.find( name );
97  if ( idx == m_entitiesName.end() ) {
98  LOG( logDEBUG ) << "Trying to access an invalid entity (named: " + name + ")";
99  return nullptr;
100  }
101  return m_entities.at( idx->second ).get();
102 }
103 
104 void EntityManager::swapBuffers() {
105  for ( auto& e : m_entities ) {
106  e->swapTransformBuffers();
107  }
108 }
109 
110 void EntityManager::deleteEntities() {
111  std::vector<Core::Utils::Index> indices;
112  indices.reserve( m_entities.size() - 1 );
113  for ( size_t i = 1; i < m_entities.size(); ++i ) {
114  indices.push_back( m_entities.index( i ) );
115  }
116  for ( const auto& idx : indices ) {
117  removeEntity( idx );
118  }
119 }
120 } // namespace Scene
121 } // namespace Engine
122 } // namespace Ra
Definition: Cage.cpp:3