From eb1e8d12dec743819dfd6cb5fff79d155e3fdcde Mon Sep 17 00:00:00 2001 From: Anselme Date: Wed, 7 Dec 2016 19:42:58 +0100 Subject: [PATCH] fixed some graphical node issues --- src/engine.cpp | 3 ++- src/scene/graphicalcontainernode.cpp | 7 +++++ src/scene/graphicalcontainernode.h | 4 +++ src/scene/graphicalnode.cpp | 2 +- src/scene/graphicalnode.h | 2 +- src/scene/lightnode.h | 5 +--- src/scene/scenetree.cpp | 11 +++----- src/scene/scenetree.h | 2 +- src/test/main.cpp | 40 ++++++++++++++-------------- 9 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/engine.cpp b/src/engine.cpp index ce48edc..04ce708 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -110,7 +110,8 @@ void Engine::setScene(SceneTree *scene) m_renderer->setScene(m_scene); m_renderer->resizeGL(m_window->getSize().x, m_window->getSize().y); m_sparrowshell->setSceneTree(scene); - scene->addObject(scene->getRootObject(), m_sparrowshell); + scene->getRootObject()->addChild(m_sparrowshell); + scene->updateShaders(); } void Engine::outputShell(std::string str) diff --git a/src/scene/graphicalcontainernode.cpp b/src/scene/graphicalcontainernode.cpp index 8173ddf..02191c2 100644 --- a/src/scene/graphicalcontainernode.cpp +++ b/src/scene/graphicalcontainernode.cpp @@ -5,6 +5,13 @@ GraphicalContainerNode::GraphicalContainerNode() } +void GraphicalContainerNode::setSceneTree(SceneTree* tree) +{ + SceneNode::setSceneTree(tree); + for(auto child : m_children) + child->setSceneTree(tree); +} + void GraphicalContainerNode::addChild(GraphicalNode *node) { if(node != nullptr) diff --git a/src/scene/graphicalcontainernode.h b/src/scene/graphicalcontainernode.h index de79ab1..90ab947 100644 --- a/src/scene/graphicalcontainernode.h +++ b/src/scene/graphicalcontainernode.h @@ -10,6 +10,10 @@ class GraphicalContainerNode : public GraphicalNode protected: std::vector m_children; public: + virtual void update() {} + + virtual void setSceneTree(SceneTree* tree); + GraphicalContainerNode(); void addChild(GraphicalNode* node); void removeChild(GraphicalNode* node); diff --git a/src/scene/graphicalnode.cpp b/src/scene/graphicalnode.cpp index 78c0c97..24bc571 100644 --- a/src/scene/graphicalnode.cpp +++ b/src/scene/graphicalnode.cpp @@ -8,7 +8,7 @@ GraphicalNode::GraphicalNode() : m_visible(true) void GraphicalNode::setSceneTree(SceneTree *tree){ SceneNode::setSceneTree(tree); - if (tree) + if(tree) tree->addToIndex(this); } diff --git a/src/scene/graphicalnode.h b/src/scene/graphicalnode.h index b3f5d81..f0e1223 100644 --- a/src/scene/graphicalnode.h +++ b/src/scene/graphicalnode.h @@ -16,7 +16,7 @@ public: GraphicalNode(); void toggleVisibility(); - void setSceneTree(SceneTree* tree); + virtual void setSceneTree(SceneTree* tree); void setTransform(const glm::mat4 &transform) { m_transform = transform; } const glm::mat4& getTransform() { return m_transform; } diff --git a/src/scene/lightnode.h b/src/scene/lightnode.h index 5461a8b..f19d6be 100644 --- a/src/scene/lightnode.h +++ b/src/scene/lightnode.h @@ -11,10 +11,7 @@ class LightNode : public GraphicalNode public: LightNode(Light* light) : m_light(light) {} - virtual void update() - { - - } + virtual void update() {} virtual Light* getLight() { return m_light; } }; diff --git a/src/scene/scenetree.cpp b/src/scene/scenetree.cpp index f0dadf1..66e2fdd 100644 --- a/src/scene/scenetree.cpp +++ b/src/scene/scenetree.cpp @@ -43,13 +43,6 @@ void SceneTree::update() m_root.update(); } -void SceneTree::addObject(ContainerNode *parent, SceneNode *node) -{ - parent->addChild(node); - node->setSceneTree(this); - ((DeferredPipeline*) m_pipeline)->refreshScene(this); -} - void SceneTree::addToIndex(SceneNode* node){ Light *light = node->getLight(); GeometryNode *geometrynode = node->getGeometryNode(); @@ -76,3 +69,7 @@ void SceneTree::removeFromIndex(SceneNode *node){ } } +void SceneTree::updateShaders() +{ + ((DeferredPipeline*) m_pipeline)->refreshScene(this); +} diff --git a/src/scene/scenetree.h b/src/scene/scenetree.h index fa8a6e3..1836b3c 100644 --- a/src/scene/scenetree.h +++ b/src/scene/scenetree.h @@ -33,10 +33,10 @@ public: void setMainCamera(CameraNode *camera); ContainerNode* getRootObject(){return &m_root;} - void addObject(ContainerNode *parent, SceneNode *node); void addToIndex(SceneNode* node); void removeObject(ContainerNode* parent,SceneNode *node); void removeFromIndex(SceneNode *node); + void updateShaders(); private: ContainerNode m_root; std::vector m_lights; diff --git a/src/test/main.cpp b/src/test/main.cpp index 2dc282f..c946cf2 100644 --- a/src/test/main.cpp +++ b/src/test/main.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -89,20 +90,20 @@ public: float height = getHeight(x+6.7, z+15.7, 2.5f); height += getHeight(x+5.76, z+2.14, 5.4f); height += getHeight(x, z, 10.f); - return y - height; + return y+8.f - height; } }; void generateTerrain(SceneTree *scene) { - ContainerNode* terrainContainer = new ContainerNode(); - scene->addObject(scene->getRootObject(), terrainContainer); + GraphicalContainerNode* terrainContainer = new GraphicalContainerNode(); + scene->getRootObject()->addChild(terrainContainer); TestGen gen; PhongMaterial *mat = new PhongMaterial(); mat->emission = glm::vec3(0.5f, 0.1f, 0.1f); - for(int x=-8; x<8; ++x) - for(int y=-4; y<4; ++y) - for(int z=-8; z<8; ++z) + for(int x=-6; x<6; ++x) + for(int y=-3; y<3; ++y) + for(int z=-6; z<6; ++z) { Chunk *chunk = new Chunk(&gen); // ! WARNING ! : chunk pointer is lost and never deleted glm::vec3 pos(x, y, z); @@ -114,8 +115,8 @@ void generateTerrain(SceneTree *scene) chunk->mesh->setMaterial(mat); chunk->mesh->initGL(); MeshNode *node = new MeshNode(chunk->mesh); - node->setTransform(glm::translate(glm::mat4(), pos*8.f)); - scene->addObject(terrainContainer, node); + node->setTransform(glm::translate(glm::scale(glm::mat4(), glm::vec3(2.f)), pos*8.f)); + terrainContainer->addChild(node); } } } @@ -130,13 +131,13 @@ int main(){ CameraNode *cam = new CameraNode(engine.getInput()); cam->setInputs(myKeysMap::MOVE_CAMERA, myKeysMap::ROTATE_CAMERA); - scene.addObject(scene.getRootObject(), cam); + scene.getRootObject()->addChild(cam); scene.setMainCamera(cam); LightNode *sunLight = new LightNode(new DirectionnalLight(glm::vec3(5, 8, -2), glm::vec3(1.f))); LightNode *ambientLight = new LightNode(new AmbientLight()); - scene.addObject(scene.getRootObject(), ambientLight); - scene.addObject(scene.getRootObject(), sunLight); + scene.getRootObject()->addChild(ambientLight); + scene.getRootObject()->addChild(sunLight); /* Exemple creation mesh 2D * @@ -147,13 +148,13 @@ int main(){ mesh->setMaterial(mat); mesh->setDepth(1); mesh->initGL(); - scene.addObject(scene.getRootObject(),new MeshNode(mesh)); + scene.getRootObject()->addChild(new MeshNode(mesh)); */ /* Exemple ajout d'un objet a la scene * SparrowShell *shell = new SparrowShell(engine.getWindow(),engine.getInput()); - scene.addObject(scene.getRootObject(),shell); + scene.getRootObject()->addChild(shell); */ // the pipeline needs to updates his shaders because the scene changed @@ -165,13 +166,13 @@ int main(){ RESOURCE_ADD(fonte_des_neiges,Font,"shellfont"); TextNode* tnode/* = new MeshNode(fonte_des_neiges->getTextMesh("Hello World!")); - scene.addObject(scene.getRootObject(),mnode)*/; + scene.getRootObject()->addChild(mnode)*/; // mnode = new MeshNode(fonte_des_neiges->getTextMesh("Portez ce vieux whisky au juge blond qui fume.", glm::vec3(0.5, 0.7, 0.2))); // mnode->setTransform(glm::rotate(glm::translate(glm::mat4(), glm::vec3(70, 30, 0)), 0.4f, glm::vec3(0, 0, 1))); // utils::setPosition2D(mnode,glm::vec2(0, 400)); // utils::rotate2D(mnode, glm::vec2(10,10),0.5); -// scene.addObject(scene.getRootObject(),mnode); +// scene.getRootObject()->addChild(mnode); tnode = fonte_des_neiges->getTextNode("Such Text", glm::vec3(0.7, 0.4, 0.2), 32.f); @@ -181,25 +182,24 @@ int main(){ tnode->m_movement = glm::translate(glm::rotate(glm::translate(glm::mat4(), glm::vec3(240, 180, 0)), 0.03f, glm::vec3(0, 0, 1)), glm::vec3(-240, -180, 0)); // mnode->setTransform(glm::rotate(glm::translate(glm::mat4(), glm::vec3(200, 170, 0)), -0.5f, glm::vec3(0, 0, 1))); - scene.addObject(scene.getRootObject(),(SceneNode*)tnode); + scene.getRootObject()->addChild((SceneNode*)tnode); //tnode = fonte_des_neiges->getTextNode("Such Text", glm::vec3(0.7, 0.4, 0.2)); //tnode->setTransform(glm::rotate(glm::translate(glm::mat4(), glm::vec3(200, 170, 0)), -0.5f, glm::vec3(0, 0, 1))); - //scene.addObject(scene.getRootObject(),tnode); + //scene.getRootObject()->addChild(tnode); // mnode = new MeshNode(fonte_des_neiges->getTextMesh("Very font", glm::vec3(0.7, 0.2, 0.8))); // mnode->setTransform(glm::rotate(glm::translate(glm::mat4(), glm::vec3(180, 400, 0)), 0.1f, glm::vec3(0, 0, 1))); - // scene.addObject(scene.getRootObject(),mnode); + // scene.getRootObject()->addChild(mnode); // mnode = new MeshNode(fonte_des_neiges->getTextMesh("Much animation", glm::vec3(0.3, 0.3, 0.8))); // mnode->setTransform(glm::translate(glm::mat4(), glm::vec3(400, 250, 0))); // mnode->m_movement = glm::translate(glm::rotate(glm::translate(glm::mat4(), glm::vec3(580, 280, 0)), 0.03f, glm::vec3(0, 0, 1)), glm::vec3(-580, -280, 0)); - // scene.addObject(scene.getRootObject(),mnode); + // scene.getRootObject()->addChild(mnode); generateTerrain(&scene); - engine.setScene(&scene); engine.outputShell("Hello World!");