diff --git a/src/engine.h b/src/engine.h index ca01b74..29265b5 100644 --- a/src/engine.h +++ b/src/engine.h @@ -30,6 +30,7 @@ public: void stop(); Input* getInput() {return m_input;} + sf::Window* getWindow(){return m_window;} SparrowRenderer* getRenderer() {return m_renderer;} btDiscreteDynamicsWorld* getPhysics() {return m_world;} diff --git a/src/main.cpp b/src/main.cpp index 7411fbb..8e4fdb4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,8 @@ #include "tools/pathfinder.h" #include "tools/loader.h" +#include "sparrowshell.h" + int main(){ Engine engine; @@ -20,8 +22,9 @@ int main(){ engine.createWindow("test"); SceneTree scene; - // creating a 2D mesh +/* // creating a 2D mesh Mesh* mesh = new Mesh(); + mesh->addRectangle2D(50,50,100,100); // first triangle mesh->addVertex(glm::vec2(50, 50), glm::vec2(0, 0)); // 2D position and then texture coordinates mesh->addVertex(glm::vec2(50, 150), glm::vec2(0, 1)); @@ -33,6 +36,7 @@ int main(){ // in the case you don't want to worry about if you defined the triangles in the right order, // you can call this : mesh->setIsDoubleSided(true); + // creating the material PhongMaterial *mat = new PhongMaterial(); // setting an arbitrary color to the square : (orange) @@ -49,6 +53,10 @@ int main(){ // creating the scene node MeshNode *node = new MeshNode(mesh); scene.addObject(scene.getRootObject(), node); +*/ + + SparrowShell *shell = new SparrowShell(engine.getWindow(),engine.getInput()); + scene.addObject(scene.getRootObject(),shell); // the pipeline needs to updates his shaders because the scene changed // this should be handled somewhere else in the future diff --git a/src/scenetree.cpp b/src/scenetree.cpp index 10ec6c2..e3eae12 100644 --- a/src/scenetree.cpp +++ b/src/scenetree.cpp @@ -4,6 +4,7 @@ #include #include // Scene +#include SceneTree::SceneTree() : Scene(), @@ -41,6 +42,11 @@ void SceneTree::update() void SceneTree::addObject(ContainerNode *parent, SceneNode *node) { parent->addChild(node); + addToIndex(node); + node->addedToSceneTree(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 ? @@ -50,6 +56,10 @@ void SceneTree::addObject(ContainerNode *parent, SceneNode *node) 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); @@ -62,7 +72,6 @@ void SceneTree::removeObject(ContainerNode* parent,SceneNode *node){ } } - // Container Node void ContainerNode::update() @@ -95,3 +104,11 @@ void ContainerNode::removeChild(SceneNode* node) } } +void ContainerNode::addedToSceneTree(SceneTree *tree) +{ + for(auto child : m_children) + { + tree->addToIndex(child); + child->addedToSceneTree(tree); + } +} diff --git a/src/scenetree.h b/src/scenetree.h index 9fceb51..1d6ff26 100644 --- a/src/scenetree.h +++ b/src/scenetree.h @@ -9,6 +9,7 @@ #include class SimplePipeline; +class SceneTree; /** * @brief The SceneNode class represents a class of the game @@ -21,6 +22,7 @@ public: virtual void update() = 0; virtual Light* getLight() {return nullptr;} virtual GeometryNode* getGeometryNode() {return nullptr;} + virtual void addedToSceneTree(SceneTree* tree){} }; /** @@ -40,6 +42,13 @@ public: * @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; }; @@ -88,7 +97,9 @@ public: 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; diff --git a/src/sparrowshell.cpp b/src/sparrowshell.cpp index 30bfb5b..114cfd7 100644 --- a/src/sparrowshell.cpp +++ b/src/sparrowshell.cpp @@ -2,6 +2,9 @@ #include "message.h" #include "input.h" +#include "scenetree.h" +#include "mesh.h" +#include "phongmaterial.h" const unsigned int SparrowShell::BUFFER_MAX_LENGTH = 50; const unsigned int SparrowShell::BUFFER_DISPLAYED_NUMBER = 10; @@ -9,7 +12,15 @@ const unsigned int SparrowShell::SCROLLBAR_PIXEL_WIDTH = 2; SparrowShell::SparrowShell(sf::Window* window, Input* input): m_window(window),m_input(input),m_position(glm::ivec2(0,0)),m_scrollbar(this) { - //m_dimension = glm::ivec2();// + sf::Vector2u size = m_window->getSize(); + m_dimension = glm::ivec2(size.x,size.y/2); + Mesh* mesh = new Mesh(); + mesh->addRectangle2D(m_position,m_dimension); + PhongMaterial *mat = new PhongMaterial(); + mat->diffuse = glm::vec3(0,0.5,0.5); + mesh->setMaterial(mat); + mesh->initGL(); + this->addChild(new MeshNode(mesh)); } void SparrowShell::out(std::string s) @@ -33,6 +44,12 @@ void SparrowShell::update() m_scrollbar.update(); } +//GeometryNode* SparrowShell::getGeometryNode() +//{ +// return geometry; +//} + + SparrowShell::ScrollBar::ScrollBar(SparrowShell* shell):m_shell(shell){ m_position = glm::ivec2(m_shell->m_dimension.x - SCROLLBAR_PIXEL_WIDTH,0); m_dimension = glm::ivec2(SCROLLBAR_PIXEL_WIDTH,m_shell->m_dimension.y); diff --git a/src/sparrowshell.h b/src/sparrowshell.h index ebe5892..38de311 100644 --- a/src/sparrowshell.h +++ b/src/sparrowshell.h @@ -13,9 +13,13 @@ namespace sf { class Window; } -class SparrowShell : public SceneNode +class SparrowShell : public ContainerNode { private: + class BackGround : public MeshNode { + + }; + class ScrollBar{ SparrowShell* m_shell; glm::ivec2 m_position; @@ -47,6 +51,7 @@ public: SparrowShell(sf::Window*, Input*); void update(); + void scrollUp(); void scrollDown(); void out(std::string);