diff --git a/src/forwardmodule.h b/src/forwardmodule.h index dd81b62..9112df0 100644 --- a/src/forwardmodule.h +++ b/src/forwardmodule.h @@ -4,6 +4,7 @@ #include "glew.h" #include "module.h" #include +#include #include #include "shadersource.h" #include "material.h" @@ -38,7 +39,7 @@ public: private: ShaderSource* shaderSources; - std::vector shaders; + std::set shaders; std::vector geometryFlagList; std::vector lightFlagList; const FrameBuffer* renderTarget; diff --git a/src/light.h b/src/light.h index ca65004..e0d0569 100644 --- a/src/light.h +++ b/src/light.h @@ -56,7 +56,7 @@ public: glm::mat4 getProjectionMatrix() {return projectionMatrix;} glm::mat4 getViewMatrix() {return viewMatrix;} // does nothing, just required for inheriting Camera - void resize(int width, int height) {} + void resize(int width, int height) {} static unsigned int getFlags(Light* l); private: diff --git a/src/mesh.h b/src/mesh.h index 68e2486..19e9918 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -77,8 +77,7 @@ public: * @brief Mesh builds an empty mesh, to be renderable, a mesh must have vertices and a material. */ Mesh(); - - virtual ~Mesh(); + ~Mesh(); /** * OpenGL methods : diff --git a/src/scene.cpp b/src/scene.cpp index 24d0fb7..5eb92be 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -2,7 +2,8 @@ #include "mesh.h" #include -std::vector getMeshTypes() + +std::vector Scene::getMeshTypes() { std::set typesSet; std::vector types; @@ -15,3 +16,67 @@ std::vector getMeshTypes() types.push_back(type); return types; } + +std::vector Scene::getLightTypes() +{ + std::set typesSet; + std::vector types; + for(SceneIterator* lightIt = scene->getLights(); + lightIt->isValid(); lightIt->next()) + { + typesSet.emplace(getFlags(geometryIt->getItem())); + } + for(unsigned int type : typesSet) + types.push_back(type); + return types; +} + +ArrayScene::~ArrayScene() +{ + clearScene(); +} + +void ArrayScene::addMesh(GeometryNode* node) +{ + Node n; + n.geometry = node; + unsigned int flags = node->mesh->getFlags(); + if(nodes.count(flags) > 0) + nodes[m->getFlags()]->push_back(n); + else + { + std::vector *vec = new std::vector(); + vec->push_back(n); + nodes[m->getFlags()] = vec; + } +} + +void ArrayScene::addMesh(Mesh* m, glm::mat4 transform) +{ + GeometryNode *gn = new GeometryNode(m, transform); + allocations.push_back(gn); + addMesh(gn); +} + +void ArrayScene::clearScene() +{ + for(auto it : nodes) + delete it; + for(GeometryNode *gn : allocations) + delete gn; + allocations.clear(); + nodes.clear(); +} + +SceneIterator ArrayScene::getLights(unsigned int flags) +{ + if(nodes.count(flags)) + return ArrayIterator(*(nodes[flags])); +} + +SceneIterator ArrayScene::getGeometry(unsigned int flags) +{ + if(nodes.count(flags)) + return ArrayIterator(*(nodes[flags])); +} + diff --git a/src/scene.h b/src/scene.h index 99afa1d..95693dc 100644 --- a/src/scene.h +++ b/src/scene.h @@ -3,6 +3,7 @@ #include #include +#include #include "light.h" class Camera; @@ -26,6 +27,8 @@ struct GeometryNode { Mesh* mesh; glm::mat4 modelMatrix; + + GeometryNode(Mesh* m, glm::mat4 transform) : mesh(m), modelMatrix(transform) {} }; class Scene @@ -38,21 +41,22 @@ public: Pipeline* getPipeline() {return m_pipeline;} - virtual SceneIterator* getLights() = 0; - virtual SceneIterator* getGeometry() = 0; + virtual SceneIterator getLights(unsigned int flags) = 0; + virtual SceneIterator getGeometry(unsigned int flags) = 0; - std::vector getMeshTypes(); + virtual void getMeshTypes(std::vector &meshTypes); + virtual void getLightTypes(std::vector &lightTypes); }; // A basic implementation : template -class ArraySceneIterator : public SceneIterator +class ArrayIterator : public SceneIterator { std::vector &vec; unsigned int id; public: - ArraySceneIterator(std::vector &myVec, int myId=0) : vec(myVec), id(myId) {} + ArrayIterator(std::vector &myVec, int myId=0) : vec(myVec), id(myId) {} virtual SceneIterator& operator++() {++id; return *this;} virtual T operator*() {return vec[id];} virtual bool isValid() {return id < vec.size();} @@ -61,22 +65,28 @@ public: class ArrayScene : public Scene { protected: - std::vector lights; - std::vector geometry; + union Node + { + Light* light; + GeometryNode* geometry; + }; + + std::unordered_map*> nodes; + + std::vector allocations; public: ArrayScene() : Scene() {} + ~ArrayScene(); void setPipeline(Pipeline *pipeline) {m_pipeline = pipeline;} - - void clearLights() {lights.clear();} - void clearEntities() {geometry.clear();} - void clearScene() {clearLights(); clearEntities();} - void addMesh(GeometryNode* node) {geometry.push_back(node);} + void clearScene(); + void addMesh(GeometryNode* node); + void addMesh(Mesh* m, glm::mat4 transform); void addLight(Light* myLight) {lights.push_back(myLight);} Mesh* getMesh(int id) {return geometry[id]->mesh;} - SceneIterator* getLights() {return new ArraySceneIterator(lights);} - SceneIterator* getGeometry() {return new ArraySceneIterator(geometry);} + SceneIterator getLights(unsigned int flags); + SceneIterator getGeometry(unsigned int flags); }; #endif // SCENE_H