#include "scene/scenetree.h" #include "resourcemanager.h" #include #include #include #include // Scene #include #include #include "scene/scenenode.h" #include "scene/cameranode.h" #include SceneTree::SceneTree(const Engine &engine) : Scene(), m_engine(engine), m_shaderRefreshRequired(false), m_camera(nullptr) { DeferredPipeline *pipeline = new DeferredPipeline(); m_pipeline = pipeline; pipeline->setRenderTarget(FrameBuffer::screen); m_root.setSceneTree(this); } SceneTree::~SceneTree() { if(m_world != NULL) delete m_world; } void SceneTree::setMainCamera(CameraNode *camNode) { m_camera = camNode->getCamera(); ((DeferredPipeline*)m_pipeline)->setCamera(m_camera); sf::Vector2u size = getEngine().getWindow()->getSize(); m_camera->resize(size.x, size.y); } SceneIterator* SceneTree::getLights() { return new ArrayIterator(m_lights); } SceneIterator* SceneTree::getGeometry() { return new ArrayIterator(m_geometries); } void SceneTree::getMeshTypes(std::vector &meshTypes) { for(unsigned int type : m_meshTypes) meshTypes.push_back(type); } void SceneTree::getLightTypes(std::vector &lightTypes) { for(unsigned int type : m_lightTypes) lightTypes.push_back(type); } void SceneTree::update() { m_root.update(); } void SceneTree::initPhysics() { btDefaultCollisionConfiguration *collisionConfiguration = new btDefaultCollisionConfiguration(); btBroadphaseInterface *broadPhase = new btAxisSweep3(btVector3(-1000, -1000, -1000), btVector3(1000, 1000, 1000)); btCollisionDispatcher *dispatcher = new btCollisionDispatcher(collisionConfiguration); btSequentialImpulseConstraintSolver *solver = new btSequentialImpulseConstraintSolver(); m_world = new btDiscreteDynamicsWorld(dispatcher, broadPhase, solver, collisionConfiguration); m_world->setGravity(btVector3(0, -9.81f, 0)); } void SceneTree::registerMeshType(unsigned int meshType) { auto ret = m_meshTypes.emplace(meshType); if(ret.second) m_shaderRefreshRequired = true; } void SceneTree::registerLightType(unsigned int lightType) { auto ret = m_lightTypes.emplace(lightType); if(ret.second) m_shaderRefreshRequired = true; } 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() { if(m_shaderRefreshRequired) { ((DeferredPipeline*) m_pipeline)->refreshScene(this); m_shaderRefreshRequired = false; } }