SparrowEngine/src/scene/scenetree.cpp

79 lines
1.9 KiB
C++

#include "scene/scenetree.h"
#include "resourcemanager.h"
#include <pipeline.h>
#include <deferredpipeline.h>
#include <algorithm>
// Scene
#include <mesh.h>
#include <iostream>
#include "scene/scenenode.h"
SceneTree::SceneTree() :
Scene(),
m_skybox(NULL)
{
DeferredPipeline *pipeline = new DeferredPipeline();
m_pipeline = pipeline;
pipeline->setRenderTarget(FrameBuffer::screen);
}
SceneTree::~SceneTree()
{
}
void SceneTree::setMainCamera(CameraNode *camera)
{
//m_pipeline->setCamera(camera);
}
SceneIterator<Light*>* SceneTree::getLights()
{
return new ArrayIterator<Light*>(m_lights);
}
SceneIterator<GeometryNode*>* SceneTree::getGeometry()
{
return new ArrayIterator<GeometryNode*>(m_geometries);
}
void SceneTree::update()
{
m_root.update();
}
void SceneTree::addObject(ContainerNode *parent, SceneNode *node)
{
parent->addChild(node);
addToIndex(node);
node->setSceneTree(this);
((DeferredPipeline*) m_pipeline)->refreshScene(this);
}
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) m_lights.push_back(light);
if (geometrynode) m_geometries.push_back(geometrynode);
}
void SceneTree::removeObject(ContainerNode* parent,SceneNode *node){
parent->removeChild(node);
removeFromIndex(node);
}
void SceneTree::removeFromIndex(SceneNode *node){
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();
}
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();
}
}