1 #include <Engine/Rendering/RenderObjectManager.hpp>
3 #include <Engine/RadiumEngine.hpp>
5 #include <Engine/Scene/Component.hpp>
6 #include <Engine/Scene/Entity.hpp>
8 #include <Engine/Data/Mesh.hpp>
9 #include <Engine/Rendering/RenderObject.hpp>
11 #include <Engine/Scene/SignalManager.hpp>
19 RenderObjectManager::RenderObjectManager() =
default;
21 RenderObjectManager::~RenderObjectManager() =
default;
23 bool RenderObjectManager::exists(
const Core::Utils::Index& index )
const {
24 return ( index.isValid() && m_renderObjects.contains( index ) );
27 Core::Utils::Index RenderObjectManager::addRenderObject( Rendering::RenderObject* renderObject ) {
29 std::lock_guard<std::mutex> lock( m_doubleBufferMutex );
31 std::shared_ptr<Rendering::RenderObject> newRenderObject( renderObject );
32 Core::Utils::Index index = m_renderObjects.insert( newRenderObject );
34 newRenderObject->setIndex( index );
36 auto type = renderObject->getType();
38 m_renderObjectByType[(int)type].insert( index );
40 Engine::RadiumEngine::getInstance()->getSignalManager()->fireRenderObjectAdded(
42 renderObject->getComponent()->getEntity(), renderObject->getComponent(), index ) );
46 void RenderObjectManager::removeRenderObject(
const Core::Utils::Index& index ) {
47 CORE_ASSERT( exists( index ),
"Trying to access a render object which doesn't exist" );
50 std::shared_ptr<Rendering::RenderObject> renderObject = m_renderObjects.at( index );
52 Engine::RadiumEngine::getInstance()->getSignalManager()->fireRenderObjectRemoved(
54 renderObject->getComponent()->getEntity(), renderObject->getComponent(), index ) );
57 std::lock_guard<std::mutex> lock( m_doubleBufferMutex );
58 m_renderObjects.remove( index );
60 auto type = renderObject->getType();
61 m_renderObjectByType[(int)type].erase( index );
65 size_t RenderObjectManager::getRenderObjectsCount() {
66 return m_renderObjects.size();
69 std::shared_ptr<Rendering::RenderObject>
70 RenderObjectManager::getRenderObject(
const Core::Utils::Index& index ) {
71 CORE_ASSERT( exists( index ),
"Trying to access a render object which doesn't exist" );
72 return m_renderObjects.at( index );
75 const Core::Utils::IndexMap<std::shared_ptr<Rendering::RenderObject>>&
76 RenderObjectManager::getRenderObjects()
const {
77 return m_renderObjects;
80 void RenderObjectManager::getRenderObjectsByType(
81 std::vector<std::shared_ptr<Rendering::RenderObject>>& objectsOut,
82 const Rendering::RenderObjectType& type )
const {
84 std::lock_guard<std::mutex> lock( m_doubleBufferMutex );
88 m_renderObjectByType[(
int)type].begin(),
89 m_renderObjectByType[(
int)type].end(),
90 std::back_inserter( objectsOut ),
91 [
this](
const Core::Utils::Index& i ) {
return this->m_renderObjects.at( i ); } );
94 void RenderObjectManager::renderObjectExpired(
const Core::Utils::Index& idx ) {
95 std::lock_guard<std::mutex> lock( m_doubleBufferMutex );
97 auto ro = m_renderObjects.at( idx );
98 m_renderObjects.remove( idx );
100 auto type = ro->getType();
102 m_renderObjectByType[size_t( type )].erase( idx );
109 size_t RenderObjectManager::getNumFaces()
const {
111 size_t result = std::accumulate(
112 m_renderObjects.begin(),
113 m_renderObjects.end(),
115 [](
size_t a,
const std::shared_ptr<Rendering::RenderObject>& ro ) ->
size_t {
116 if ( ro->isVisible() && ro->getType() == Rendering::RenderObjectType::Geometry ) {
117 return a + ro->getMesh()->getNumFaces();
124 size_t RenderObjectManager::getNumVertices()
const {
126 size_t result = std::accumulate(
127 m_renderObjects.begin(),
128 m_renderObjects.end(),
130 [](
size_t a,
const std::shared_ptr<Rendering::RenderObject>& ro ) ->
size_t {
131 if ( ro->isVisible() && ro->getType() == Rendering::RenderObjectType::Geometry ) {
132 return a + ro->getMesh()->getNumVertices();