#include "scene/scenetree.h" #include "resourcemanager.h" #include #include #include #include // Scene #include #include #include "scene/scenenode.h" #include "scene/cameranode.h" SceneTree::SceneTree(const Engine &engine) : Scene(), m_engine(engine), m_skybox(NULL) { DeferredPipeline *pipeline = new DeferredPipeline(); m_pipeline = pipeline; pipeline->setRenderTarget(FrameBuffer::screen); m_root.setSceneTree(this); } SceneTree::~SceneTree() { } void SceneTree::setMainCamera(CameraNode *camNode) { ((DeferredPipeline*)m_pipeline)->setCamera(camNode->getCamera()); sf::Vector2u size = getEngine().getWindow()->getSize(); camNode->getCamera()->resize(size.x, size.y); } SceneIterator* SceneTree::getLights() { return new ArrayIterator(m_lights); } SceneIterator* SceneTree::getGeometry() { return new ArrayIterator(m_geometries); } void SceneTree::update() { m_root.update(); } void SceneTree::addToIndex(SceneNode* node){ Light *light = node->getLight(); GeometryNode *geometrynode = node->getGeometryNode(); //TODO : Check for doublon in m_lights et m_geometries => not necessary if correctly removed ? if (light != nullptr) m_lights.push_back(light); if (geometrynode != nullptr) m_geometries.push_back(geometrynode); } void SceneTree::removeFromIndex(SceneNode *node){ Light *light = node->getLight(); GeometryNode *geometrynode = node->getGeometryNode(); if(light != nullptr) { auto it_l = std::find(m_lights.begin(),m_lights.end(),node->getLight()); if (it_l != m_lights.end()){ std::iter_swap(it_l,m_lights.end()-1); m_lights.pop_back(); } } if(geometrynode != nullptr) { auto it_g = std::find(m_geometries.begin(),m_geometries.end(),node->getGeometryNode()); if (it_g != m_geometries.end()){ std::iter_swap(it_g,m_geometries.end()-1); m_geometries.pop_back(); } } } void SceneTree::updateShaders() { ((DeferredPipeline*) m_pipeline)->refreshScene(this); }