From ea06b027f8e19cb5001845cd8178de2e40f0493a Mon Sep 17 00:00:00 2001 From: Lendemor Date: Fri, 7 Oct 2016 15:10:41 +0200 Subject: [PATCH] added folder scene for differents nodes --- CMakeLists.txt | 4 +- src/engine.cpp | 3 +- src/scene/cameranode.cpp | 1 + src/scene/cameranode.h | 16 +++++ src/scene/containernode.cpp | 39 +++++++++++ src/scene/containernode.h | 34 ++++++++++ src/scene/meshnode.cpp | 12 ++++ src/scene/meshnode.h | 37 +++++++++++ src/scene/scenenode.h | 19 ++++++ src/{ => scene}/scenetree.cpp | 46 ++----------- src/scene/scenetree.h | 47 ++++++++++++++ src/scene/textnode.cpp | 6 ++ src/scene/textnode.h | 15 +++++ src/scenetree.h | 119 ---------------------------------- src/sparrowshell.cpp | 46 +++++++------ src/sparrowshell.h | 12 ++-- src/test/main.cpp | 19 +++--- src/tools/font.cpp | 13 ++-- src/tools/font.h | 5 +- src/tools/utils.cpp | 4 +- 20 files changed, 293 insertions(+), 204 deletions(-) create mode 100644 src/scene/cameranode.cpp create mode 100644 src/scene/cameranode.h create mode 100644 src/scene/containernode.cpp create mode 100644 src/scene/containernode.h create mode 100644 src/scene/meshnode.cpp create mode 100644 src/scene/meshnode.h create mode 100644 src/scene/scenenode.h rename src/{ => scene}/scenetree.cpp (69%) create mode 100644 src/scene/scenetree.h create mode 100644 src/scene/textnode.cpp create mode 100644 src/scene/textnode.h delete mode 100644 src/scenetree.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 53b00c7..1723a8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,8 +7,8 @@ SET(VERSION_MINOR 1) set(EXTRA_INCLUDES ${PROJECT_SOURCE_DIR}/src) # choose source file -file(GLOB LIB_SRC_LIST src/*.cpp src/tools/*.cpp) -file(GLOB LIB_HEAD_LIST src/*.h src/tools/*.h) +file(GLOB LIB_SRC_LIST src/*.cpp src/tools/*.cpp src/scene/*.cpp) +file(GLOB LIB_HEAD_LIST src/*.h src/tools/*.h src/scene/*.h) set(EXEC_SRC_LIST src/test/main.cpp) #set compilation option diff --git a/src/engine.cpp b/src/engine.cpp index 8c595df..eed2c55 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -8,7 +8,7 @@ #include #include #include "resourcemanager.h" -#include "scenetree.h" +#include "scene/scenetree.h" #include "sparrowshell.h" Engine::Engine() : @@ -108,6 +108,7 @@ void Engine::setScene(SceneTree *scene) m_scene = scene; m_renderer->setScene(m_scene); m_renderer->resizeGL(m_window->getSize().x, m_window->getSize().y); + m_sparrowshell->setScene(scene); scene->addObject(scene->getRootObject(), m_sparrowshell); } diff --git a/src/scene/cameranode.cpp b/src/scene/cameranode.cpp new file mode 100644 index 0000000..fdc6113 --- /dev/null +++ b/src/scene/cameranode.cpp @@ -0,0 +1 @@ +#include "cameranode.h" diff --git a/src/scene/cameranode.h b/src/scene/cameranode.h new file mode 100644 index 0000000..49123e8 --- /dev/null +++ b/src/scene/cameranode.h @@ -0,0 +1,16 @@ +#ifndef CAMERANODE_H +#define CAMERANODE_H + +#include "scenenode.h" +#include "trackballcamera.h" + +/** + * @brief The CameraNode class is a scene node that can be used by the renderer + */ +class CameraNode : public TrackBallCamera, SceneNode +{ +public: + CameraNode() {} +}; + +#endif // CAMERANODE_H diff --git a/src/scene/containernode.cpp b/src/scene/containernode.cpp new file mode 100644 index 0000000..585667b --- /dev/null +++ b/src/scene/containernode.cpp @@ -0,0 +1,39 @@ +#include "containernode.h" + +// Container Node +void ContainerNode::update() +{ + for(SceneNode* sn : m_children) + sn->update(); +} + +void ContainerNode::addChild(SceneNode* node) +{ + if(node != nullptr) + { + m_children.push_back(node); + node->m_parent = this; + } +} + +void ContainerNode::removeChild(SceneNode* node) +{ + if(node != nullptr) + { + for(auto it = m_children.begin(); it != m_children.end(); ++it) + { + if(*it == node) + { + m_children.erase(it); + break; + } + } + } +} + +void ContainerNode::setSceneTree(SceneTree *tree) +{ + SceneNode::setSceneTree(tree); + for(auto child : m_children) + child->setSceneTree(tree); +} diff --git a/src/scene/containernode.h b/src/scene/containernode.h new file mode 100644 index 0000000..f3a0259 --- /dev/null +++ b/src/scene/containernode.h @@ -0,0 +1,34 @@ +#ifndef CONTAINERNODE_H +#define CONTAINERNODE_H + +#include "scenenode.h" +#include + +/** + * @brief The ContainerNode class represents a node which main use is to contain a collection of nodes + */ +class ContainerNode : public SceneNode +{ +public: + virtual void update(); + /** + * @brief addChild adds node in the ContainerNode's children list + */ + void addChild(SceneNode* node); + + /** + * @brief removeChild removes the first iteration of node of the children list + */ + void removeChild(SceneNode* node); + /** + * @brief addedToSceneTree is called when this node is added to a SceneTree + * + * @param tree + */ + void setSceneTree(SceneTree *tree); + +protected: + std::vector m_children; +}; + +#endif // CONTAINERNODE_H diff --git a/src/scene/meshnode.cpp b/src/scene/meshnode.cpp new file mode 100644 index 0000000..84ffb34 --- /dev/null +++ b/src/scene/meshnode.cpp @@ -0,0 +1,12 @@ +#include "meshnode.h" +#include "mesh.h" +#include "scenetree.h" + +void MeshNode::setDepth(float depth){ + geometry.mesh->setDepth(depth); +} + +void MeshNode::setSceneTree(SceneTree *tree){ + SceneNode::setSceneTree(tree); + tree->addToIndex(this); +} diff --git a/src/scene/meshnode.h b/src/scene/meshnode.h new file mode 100644 index 0000000..83f7df8 --- /dev/null +++ b/src/scene/meshnode.h @@ -0,0 +1,37 @@ +#ifndef MESHNODE_H +#define MESHNODE_H + +#include "scenenode.h" +#include "glm/mat4x4.hpp" +#include "scene.h" + +/** + * @brief The MeshNode class holds a mesh + */ + +class MeshNode : public SceneNode +{ + GeometryNode geometry; +public: + // temp + glm::mat4 m_movement; + glm::mat4 m_acceleration; + + MeshNode(Mesh* mesh) : geometry(mesh, glm::mat4()) {} + + virtual void update() + { + m_movement = m_acceleration * m_movement; + geometry.modelMatrix = m_movement * geometry.modelMatrix; + } + + void setSceneTree(SceneTree *tree); + + void setTransform(const glm::mat4 &transform) { geometry.modelMatrix = transform; } + const glm::mat4& getTransform() { return geometry.modelMatrix; } + void setDepth(float depth); + + GeometryNode* getGeometryNode() { return &geometry; } +}; + +#endif // MESHNODE_H diff --git a/src/scene/scenenode.h b/src/scene/scenenode.h new file mode 100644 index 0000000..bbb9563 --- /dev/null +++ b/src/scene/scenenode.h @@ -0,0 +1,19 @@ +#ifndef SCENENODE_H +#define SCENENODE_H + +class SceneTree; +class Light; +class GeometryNode; + +class SceneNode +{ +public: + SceneNode* m_parent; + SceneTree* m_scene; + virtual void update() = 0; + virtual Light* getLight() {return nullptr;} + virtual GeometryNode* getGeometryNode() {return nullptr;} + virtual void setSceneTree(SceneTree* tree){m_scene = tree;} +}; + +#endif // SCENENODE_H diff --git a/src/scenetree.cpp b/src/scene/scenetree.cpp similarity index 69% rename from src/scenetree.cpp rename to src/scene/scenetree.cpp index d822a27..6a6d587 100644 --- a/src/scenetree.cpp +++ b/src/scene/scenetree.cpp @@ -1,10 +1,12 @@ -#include "scenetree.h" +#include "scene/scenetree.h" #include "resourcemanager.h" #include #include #include // Scene +#include #include +#include "scene/scenenode.h" SceneTree::SceneTree() : Scene(), @@ -44,7 +46,7 @@ void SceneTree::addObject(ContainerNode *parent, SceneNode *node) { parent->addChild(node); addToIndex(node); - node->addedToSceneTree(this); + node->setSceneTree(this); ((DeferredPipeline*) m_pipeline)->refreshScene(this); } @@ -74,43 +76,3 @@ void SceneTree::removeFromIndex(SceneNode *node){ } } -// Container Node - -void ContainerNode::update() -{ - for(SceneNode* sn : m_children) - sn->update(); -} - -void ContainerNode::addChild(SceneNode* node) -{ - if(node != NULL) - { - m_children.push_back(node); - node->m_parent = this; - } -} - -void ContainerNode::removeChild(SceneNode* node) -{ - if(node != NULL) - { - for(auto it = m_children.begin(); it != m_children.end(); ++it) - { - if(*it == node) - { - m_children.erase(it); - break; - } - } - } -} - -void ContainerNode::addedToSceneTree(SceneTree *tree) -{ - for(auto child : m_children) - { - tree->addToIndex(child); - child->addedToSceneTree(tree); - } -} diff --git a/src/scene/scenetree.h b/src/scene/scenetree.h new file mode 100644 index 0000000..fa8a6e3 --- /dev/null +++ b/src/scene/scenetree.h @@ -0,0 +1,47 @@ +#ifndef SCENETREE_H +#define SCENETREE_H + +#include +#include +#include "scene.h" +#include "light.h" +#include "resourcemanager.h" + +#include "containernode.h" + +class CameraNode; + +/** + * @brief The SceneNode class represents a class of the game + * that will be updated or used for rendering every frame + */ + +class SceneTree : public Scene +{ +public: + SceneTree(); + ~SceneTree(); + + virtual SceneIterator* getLights(); + virtual SceneIterator* getGeometry(); + + void update(); + + Texture* getSkybox() {return m_skybox;} + void setSkybox(Texture* skybox) {m_skybox = skybox;} + + 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); +private: + ContainerNode m_root; + std::vector m_lights; + std::vector m_geometries; + Texture* m_skybox; +}; + +#endif // SCENETREE_H diff --git a/src/scene/textnode.cpp b/src/scene/textnode.cpp new file mode 100644 index 0000000..e0fe1cb --- /dev/null +++ b/src/scene/textnode.cpp @@ -0,0 +1,6 @@ +#include "textnode.h" + +/*TextNode::TextNode() +{ + +}*/ diff --git a/src/scene/textnode.h b/src/scene/textnode.h new file mode 100644 index 0000000..5fc666f --- /dev/null +++ b/src/scene/textnode.h @@ -0,0 +1,15 @@ +#ifndef TEXTNODE_H +#define TEXTNODE_H + +#include "meshnode.h" + +class TextNode : public MeshNode +{ +private: + float m_fontSize; +public: + TextNode(Mesh* mesh,float fontSize) : MeshNode(mesh),m_fontSize(fontSize) {} + float getFontSize(){return m_fontSize;} +}; + +#endif // TEXTNODE_H diff --git a/src/scenetree.h b/src/scenetree.h deleted file mode 100644 index b19ea0c..0000000 --- a/src/scenetree.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef SCENETREE_H -#define SCENETREE_H - -#include -#include -#include "scene.h" -#include "light.h" -#include "resourcemanager.h" -#include - -class SceneTree; - -/** - * @brief The SceneNode class represents a class of the game - * that will be updated or used for rendering every frame - */ -class SceneNode -{ -public: - SceneNode* m_parent; - virtual void update() = 0; - virtual Light* getLight() {return nullptr;} - virtual GeometryNode* getGeometryNode() {return nullptr;} - virtual void addedToSceneTree(SceneTree* tree){} -}; - -/** - * @brief The ContainerNode class represents a node which main use is to contain a collection of nodes - */ -class ContainerNode : public SceneNode -{ -public: - virtual void update(); - - /** - * @brief addChild adds node in the ContainerNode's children list - */ - void addChild(SceneNode* node); - - /** - * @brief removeChild removes the first iteration of node of the children list - */ - void removeChild(SceneNode* node); - /** - * @brief addedToSceneTree is called when this node is added to a SceneTree - * - * @param tree - */ - void addedToSceneTree(SceneTree *tree); - -protected: - std::vector m_children; -}; - -/** - * @brief The MeshNode class holds a mesh - */ -class MeshNode : public SceneNode -{ - GeometryNode geometry; -public: - // temp - glm::mat4 m_movement; - glm::mat4 m_acceleration; - - MeshNode(Mesh* mesh) : geometry(mesh, glm::mat4()) {} - - virtual void update() - { - m_movement = m_acceleration * m_movement; - geometry.modelMatrix = m_movement * geometry.modelMatrix; - } - - void setTransform(const glm::mat4 &transform) { geometry.modelMatrix = transform; } - const glm::mat4& getTransform() { return geometry.modelMatrix; } - - GeometryNode* getGeometryNode() { return &geometry; } -}; - -/** - * @brief The CameraNode class is a scene node that can be used by the renderer - */ -class CameraNode : public TrackBallCamera, SceneNode -{ -public: - CameraNode() {} -}; - -class SceneTree : public Scene -{ -public: - SceneTree(); - ~SceneTree(); - - virtual SceneIterator* getLights(); - virtual SceneIterator* getGeometry(); - - void update(); - - Texture* getSkybox() {return m_skybox;} - void setSkybox(Texture* skybox) {m_skybox = skybox;} - - 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); -private: - ContainerNode m_root; - std::vector m_lights; - std::vector m_geometries; - Texture* m_skybox; -}; - -// Additionnal Nodes : - -#endif // SCENETREE_H diff --git a/src/sparrowshell.cpp b/src/sparrowshell.cpp index 0cd0f16..40e2443 100644 --- a/src/sparrowshell.cpp +++ b/src/sparrowshell.cpp @@ -2,7 +2,9 @@ #include "message.h" #include "input.h" -#include "scenetree.h" +#include "scene/scenetree.h" +#include "scene/meshnode.h" +#include "scene/textnode.h" #include "mesh.h" #include "phongmaterial.h" #include "tools/utils.h" @@ -42,31 +44,38 @@ void SparrowShell::out(std::string s) } void SparrowShell::scrollUp(){ - if (m_index + BUFFER_DISPLAYED_NUMBER < m_buffer.size()) m_index++; -// std::cout << "scroll up" << std::endl; + if (m_index + BUFFER_DISPLAYED_NUMBER < m_buffer.size()){ + m_index++; + m_indexMoved = true; + } } void SparrowShell::scrollDown(){ - if (m_index > 0) m_index--; -// std::cout << "scroll down" << std::endl; + if (m_index > 0){ + m_index--; + m_indexMoved = true; + } } void SparrowShell::update() { - //TODO : update TextMesh Font *shellfont = RESOURCE_GET(Font,"shellfont"); - MeshNode* mnode; + TextNode* mnode; glm::vec2 text_pos(0); //std::vector textMeshes; - for(auto textMesh: m_textMeshes) - removeChild(textMesh); - m_textMeshes.clear(); - for(unsigned int i = m_index;igetTextMesh(m_buffer[i],glm::vec3(0.7,1,0.3))); - utils::setPosition2D(mnode,text_pos); - text_pos.y += shellfont->getLineHeight(); - m_textMeshes.push_back(mnode); - addChild(mnode); + if(m_indexMoved){ + for(auto textMesh: m_textMeshes) + m_currentScene->removeObject(this,textMesh); + m_textMeshes.clear(); + for(unsigned int i = m_index;igetTextNode(m_buffer[i],glm::vec3(0.7,1,0.3),12.f); + utils::setPosition2D((TextNode*)mnode,text_pos); + text_pos.y += shellfont->getLineHeight(); + mnode->setDepth(SHELL_DEPTH+1); + m_textMeshes.push_back(mnode); + m_currentScene->addObject(this,mnode); + } + m_indexMoved = false; } m_scrollbar.update(); } @@ -80,8 +89,6 @@ void SparrowShell::ShellBuffer::push(std::string s){ m_buffer.push_back(s); } -//SparrowShell::ScrollBar::ScrollBar(); - SparrowShell::ScrollBar::ScrollBar(SparrowShell* shell):m_shell(shell){ m_position = glm::ivec2(m_shell->m_dimension.x - SparrowShell::SCROLLBAR_PIXEL_WIDTH,0); m_dimension = glm::ivec2(SparrowShell::SCROLLBAR_PIXEL_WIDTH,m_shell->m_dimension.y); @@ -110,5 +117,6 @@ void SparrowShell::ScrollBar::update(){ utils::resize2D(m_mesh,m_dimension,new_dim); m_shell->m_resizeScrollBar = false; } - utils::setPosition2D(m_mesh,new_pos); + if (m_shell->m_resizeScrollBar || m_shell->m_indexMoved) + utils::setPosition2D(m_mesh,new_pos); } diff --git a/src/sparrowshell.h b/src/sparrowshell.h index 8072886..153b53c 100644 --- a/src/sparrowshell.h +++ b/src/sparrowshell.h @@ -4,10 +4,11 @@ #include #include "system.h" -#include "scenetree.h" +#include "scene/scenetree.h" #include "glm/glm.hpp" class Input; +class MeshNode; namespace sf { class Window; @@ -16,9 +17,9 @@ class Window; class SparrowShell : public ContainerNode { private: - class BackGround : public MeshNode { + //class BackGround : public MeshNode { - }; +// }; class ScrollBar{ SparrowShell* m_shell; @@ -52,13 +53,15 @@ private: sf::Window* m_window; Input* m_input; + SceneTree* m_currentScene; + glm::ivec2 m_position; glm::ivec2 m_dimension; std::vector m_textMeshes; ShellBuffer m_buffer; int m_index = 0; bool m_resizeScrollBar = false; - + bool m_indexMoved = false; //textMesh MeshNode* m_background; ScrollBar m_scrollbar; @@ -67,6 +70,7 @@ public: SparrowShell(sf::Window*, Input*); void update(); + void setScene(SceneTree *scene){m_currentScene = scene;} void scrollUp(); void scrollDown(); diff --git a/src/test/main.cpp b/src/test/main.cpp index 4a024c8..d927fc0 100644 --- a/src/test/main.cpp +++ b/src/test/main.cpp @@ -6,9 +6,10 @@ #include #include #include -#include #include + +#include #include #include #include @@ -52,7 +53,7 @@ int main(){ Font* fonte_des_neiges = Loader::loadFont("../data/consolas.fnt","../data/consolas.png"); RESOURCE_ADD(fonte_des_neiges,Font,"shellfont"); - MeshNode* mnode/* = new MeshNode(fonte_des_neiges->getTextMesh("Hello World!")); + TextNode* tnode/* = new MeshNode(fonte_des_neiges->getTextMesh("Hello World!")); scene.addObject(scene.getRootObject(),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))); @@ -61,17 +62,17 @@ int main(){ // utils::rotate2D(mnode, glm::vec2(10,10),0.5); // scene.addObject(scene.getRootObject(),mnode); - mnode = new MeshNode(fonte_des_neiges->getTextMesh("Such Text", glm::vec3(0.7, 0.4, 0.2))); + tnode = fonte_des_neiges->getTextNode("Such Text", glm::vec3(0.7, 0.4, 0.2)); - utils::setPosition2D(mnode,glm::vec2(200, 170)); - utils::rotate2D(mnode, glm::vec2(0),-0.5); + utils::setPosition2D((MeshNode*)tnode,glm::vec2(200, 170)); + utils::rotate2D((MeshNode*)tnode, glm::vec2(0),-0.5); // mnode->setTransform(glm::rotate(glm::translate(glm::mat4(), glm::vec3(200, 170, 0)), -0.5f, glm::vec3(0, 0, 1))); - scene.addObject(scene.getRootObject(),mnode); + scene.addObject(scene.getRootObject(),(SceneNode*)tnode); - mnode = new MeshNode(fonte_des_neiges->getTextMesh("Such Text", glm::vec3(0.7, 0.4, 0.2))); - mnode->setTransform(glm::rotate(glm::translate(glm::mat4(), glm::vec3(200, 170, 0)), -0.5f, glm::vec3(0, 0, 1))); - scene.addObject(scene.getRootObject(),mnode); + //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); // mnode = new MeshNode(fonte_des_neiges->getTextMesh("Very font", glm::vec3(0.7, 0.2, 0.8))); diff --git a/src/tools/font.cpp b/src/tools/font.cpp index 35567d9..e8518b9 100644 --- a/src/tools/font.cpp +++ b/src/tools/font.cpp @@ -1,14 +1,16 @@ #include "font.h" #include +#include "mesh.h" +#include "scene/textnode.h" Font::Font() { } -Mesh* Font::getTextMesh(std::string s, glm::vec3 color) +TextNode* Font::getTextNode(std::string s, glm::vec3 color, float font_size) { - Mesh* text = new Mesh(); + Mesh* textmesh = new Mesh(); glm::ivec2 current_pos; for(char c : s){ if(c == '\n') @@ -19,7 +21,7 @@ Mesh* Font::getTextMesh(std::string s, glm::vec3 color) else { CharInfo charInfo = m_charTable[c]; - text->addRectangle2D(current_pos + charInfo.offset, + textmesh->addRectangle2D(current_pos + charInfo.offset, charInfo.dim, glm::vec2(charInfo.pos)/m_scale, glm::vec2(charInfo.dim)/m_scale); @@ -30,7 +32,8 @@ Mesh* Font::getTextMesh(std::string s, glm::vec3 color) // TODO : delete this material somewhere (garbage collector ?) mat->setTexture(PhongMaterial::ALPHA_SLOT, m_tex, "font_texture"); mat->diffuse = color; - text->setMaterial((Material*)mat); - text->initGL(); + textmesh->setMaterial((Material*)mat); + textmesh->initGL(); + TextNode *text = new TextNode(textmesh,font_size); return text; } diff --git a/src/tools/font.h b/src/tools/font.h index 3f93ef4..c01879f 100644 --- a/src/tools/font.h +++ b/src/tools/font.h @@ -3,9 +3,10 @@ #include #include -#include "mesh.h" +#include class Texture; +class TextNode; class Font { @@ -30,7 +31,7 @@ public: void setScale(glm::vec2 scale){m_scale = scale;} void setTexture(Texture *tex){m_tex = tex;} - Mesh* getTextMesh(std::string s, glm::vec3 color = glm::vec3(1)); + TextNode* getTextNode(std::string s, glm::vec3 color = glm::vec3(1),float font_size = 0); private: std::string m_name; Texture *m_tex; diff --git a/src/tools/utils.cpp b/src/tools/utils.cpp index 28ee472..509e5b2 100644 --- a/src/tools/utils.cpp +++ b/src/tools/utils.cpp @@ -1,5 +1,7 @@ #include "utils.h" -#include "scenetree.h" +#include "glm/ext.hpp" +//#include "scene/scenetree.h" +#include "scene/meshnode.h" std::vector utils::split(const std::string &line, char sep){ std::vector tokens;