From 24ee9b7144336b506b4f06a77ae0e0d934003082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9au?= <theau.baton@etu.univ-amu.fr> Date: Fri, 24 May 2024 14:58:27 +0200 Subject: [PATCH] Refactoring manager and renderer --- ParticleGenerator/res/config/imgui.ini | 4 ++-- ParticleGenerator/src/Interface/Manager.cpp | 19 +++++++++++++-- ...eshGenerator.cpp.old => MeshGenerator.cpp} | 0 ...eshGenerator.hpp.old => MeshGenerator.hpp} | 0 .../{MeshScene.cpp.old => MeshScene.cpp} | 0 .../{MeshScene.hpp.old => MeshScene.hpp} | 0 .../{PathScene.cpp.old => PathScene.cpp} | 0 .../{PathScene.hpp.old => PathScene.hpp} | 0 .../{PhysicScene.cpp.old => PhysicScene.cpp} | 0 .../{PhysicScene.hpp.old => PhysicScene.hpp} | 0 ParticleGenerator/src/Mesh/Trajectory.cpp | 1 + ParticleGenerator/src/Scene/Manager.cpp | 18 +++++---------- ParticleGenerator/src/Scene/Manager.hpp | 6 ++--- ParticleGenerator/src/Scene/Renderer.cpp | 1 + ParticleGenerator/src/Scene/Scenes/Grid.hpp | 1 + .../Scene/Scenes/{Mesh.cpp.old => Mesh.cpp} | 4 ---- .../Scene/Scenes/{Mesh.hpp.old => Mesh.hpp} | 3 ++- ...eshGenerator.cpp.old => MeshGenerator.cpp} | 0 ...eshGenerator.hpp.old => MeshGenerator.hpp} | 6 ++--- .../Scene/Scenes/{Path.cpp.old => Path.cpp} | 0 .../Scene/Scenes/{Path.hpp.old => Path.hpp} | 3 ++- .../Scenes/{Physic.cpp.old => Physic.cpp} | 0 .../Scenes/{Physic.hpp.old => Physic.hpp} | 2 ++ ParticleGenerator/src/Scene/Scenes/Scene.hpp | 2 +- ParticleGenerator/src/main.cpp | 23 +++++++++++-------- 25 files changed, 54 insertions(+), 39 deletions(-) rename ParticleGenerator/src/Interface/Scene/{MeshGenerator.cpp.old => MeshGenerator.cpp} (100%) rename ParticleGenerator/src/Interface/Scene/{MeshGenerator.hpp.old => MeshGenerator.hpp} (100%) rename ParticleGenerator/src/Interface/Scene/{MeshScene.cpp.old => MeshScene.cpp} (100%) rename ParticleGenerator/src/Interface/Scene/{MeshScene.hpp.old => MeshScene.hpp} (100%) rename ParticleGenerator/src/Interface/Scene/{PathScene.cpp.old => PathScene.cpp} (100%) rename ParticleGenerator/src/Interface/Scene/{PathScene.hpp.old => PathScene.hpp} (100%) rename ParticleGenerator/src/Interface/Scene/{PhysicScene.cpp.old => PhysicScene.cpp} (100%) rename ParticleGenerator/src/Interface/Scene/{PhysicScene.hpp.old => PhysicScene.hpp} (100%) rename ParticleGenerator/src/Scene/Scenes/{Mesh.cpp.old => Mesh.cpp} (99%) rename ParticleGenerator/src/Scene/Scenes/{Mesh.hpp.old => Mesh.hpp} (89%) rename ParticleGenerator/src/Scene/Scenes/{MeshGenerator.cpp.old => MeshGenerator.cpp} (100%) rename ParticleGenerator/src/Scene/Scenes/{MeshGenerator.hpp.old => MeshGenerator.hpp} (88%) rename ParticleGenerator/src/Scene/Scenes/{Path.cpp.old => Path.cpp} (100%) rename ParticleGenerator/src/Scene/Scenes/{Path.hpp.old => Path.hpp} (89%) rename ParticleGenerator/src/Scene/Scenes/{Physic.cpp.old => Physic.cpp} (100%) rename ParticleGenerator/src/Scene/Scenes/{Physic.hpp.old => Physic.hpp} (88%) diff --git a/ParticleGenerator/res/config/imgui.ini b/ParticleGenerator/res/config/imgui.ini index d59a5fd..18995ef 100644 --- a/ParticleGenerator/res/config/imgui.ini +++ b/ParticleGenerator/res/config/imgui.ini @@ -3,6 +3,6 @@ Pos=60,60 Size=400,400 [Window][Particle Generator] -Pos=60,60 -Size=504,424 +Pos=83,81 +Size=864,632 diff --git a/ParticleGenerator/src/Interface/Manager.cpp b/ParticleGenerator/src/Interface/Manager.cpp index 57b2e8d..0fcb484 100644 --- a/ParticleGenerator/src/Interface/Manager.cpp +++ b/ParticleGenerator/src/Interface/Manager.cpp @@ -32,10 +32,25 @@ namespace pg::interface { this->_historical.count(current_time); if(ImGui::Begin(this->_title.c_str())) { + + auto current = this->_manager.current(); if(ImGui::BeginTabBar("")) { if(ImGui::BeginTabItem("Scene")) { - auto current = this->_manager.current(); - if(current.has_value()) { + if(!this->_manager.getScenes().empty()) { + std::string name = !current.has_value() ? (*this->_manager.getScenes().begin())->name() : (*current)->name(); + if(ImGui::BeginCombo("Current Scene", name.c_str())) { + for(auto & scene : this->_manager.getScenes()) { + bool is_selected = (scene->name() == name); + if(ImGui::Selectable(scene->name().c_str(), is_selected)) { + this->_manager.setCurrent(*scene); + } + } + ImGui::EndCombo(); + } + ImGui::Separator(); + } + + if(current.has_value() && (*current)->interface().has_value()) { (*(*current)->interface())->render(current_time); } diff --git a/ParticleGenerator/src/Interface/Scene/MeshGenerator.cpp.old b/ParticleGenerator/src/Interface/Scene/MeshGenerator.cpp similarity index 100% rename from ParticleGenerator/src/Interface/Scene/MeshGenerator.cpp.old rename to ParticleGenerator/src/Interface/Scene/MeshGenerator.cpp diff --git a/ParticleGenerator/src/Interface/Scene/MeshGenerator.hpp.old b/ParticleGenerator/src/Interface/Scene/MeshGenerator.hpp similarity index 100% rename from ParticleGenerator/src/Interface/Scene/MeshGenerator.hpp.old rename to ParticleGenerator/src/Interface/Scene/MeshGenerator.hpp diff --git a/ParticleGenerator/src/Interface/Scene/MeshScene.cpp.old b/ParticleGenerator/src/Interface/Scene/MeshScene.cpp similarity index 100% rename from ParticleGenerator/src/Interface/Scene/MeshScene.cpp.old rename to ParticleGenerator/src/Interface/Scene/MeshScene.cpp diff --git a/ParticleGenerator/src/Interface/Scene/MeshScene.hpp.old b/ParticleGenerator/src/Interface/Scene/MeshScene.hpp similarity index 100% rename from ParticleGenerator/src/Interface/Scene/MeshScene.hpp.old rename to ParticleGenerator/src/Interface/Scene/MeshScene.hpp diff --git a/ParticleGenerator/src/Interface/Scene/PathScene.cpp.old b/ParticleGenerator/src/Interface/Scene/PathScene.cpp similarity index 100% rename from ParticleGenerator/src/Interface/Scene/PathScene.cpp.old rename to ParticleGenerator/src/Interface/Scene/PathScene.cpp diff --git a/ParticleGenerator/src/Interface/Scene/PathScene.hpp.old b/ParticleGenerator/src/Interface/Scene/PathScene.hpp similarity index 100% rename from ParticleGenerator/src/Interface/Scene/PathScene.hpp.old rename to ParticleGenerator/src/Interface/Scene/PathScene.hpp diff --git a/ParticleGenerator/src/Interface/Scene/PhysicScene.cpp.old b/ParticleGenerator/src/Interface/Scene/PhysicScene.cpp similarity index 100% rename from ParticleGenerator/src/Interface/Scene/PhysicScene.cpp.old rename to ParticleGenerator/src/Interface/Scene/PhysicScene.cpp diff --git a/ParticleGenerator/src/Interface/Scene/PhysicScene.hpp.old b/ParticleGenerator/src/Interface/Scene/PhysicScene.hpp similarity index 100% rename from ParticleGenerator/src/Interface/Scene/PhysicScene.hpp.old rename to ParticleGenerator/src/Interface/Scene/PhysicScene.hpp diff --git a/ParticleGenerator/src/Mesh/Trajectory.cpp b/ParticleGenerator/src/Mesh/Trajectory.cpp index edcd892..e8f0d3a 100644 --- a/ParticleGenerator/src/Mesh/Trajectory.cpp +++ b/ParticleGenerator/src/Mesh/Trajectory.cpp @@ -56,6 +56,7 @@ namespace pg { } void Trajectory::draw(const Camera & camera, double current_time) { + glEnable(GL_LINE_SMOOTH); this->_vao.bind(); glEnable(GL_PROGRAM_POINT_SIZE); diff --git a/ParticleGenerator/src/Scene/Manager.cpp b/ParticleGenerator/src/Scene/Manager.cpp index 8f93c28..6616635 100644 --- a/ParticleGenerator/src/Scene/Manager.cpp +++ b/ParticleGenerator/src/Scene/Manager.cpp @@ -5,35 +5,29 @@ namespace pg { Manager::Manager(const Window & window) - : _current(this->_scenes.begin()), + : _current(), _sceneRenderer(window, *this) {} Manager::~Manager() { - if(this->_current != this->_scenes.end()) { + if(this->_current.has_value()) { (*this->_current)->destroy(); } } std::optional<scene::Scene *> Manager::current() const { - return this->_current != this->_scenes.end() ? std::optional<scene::Scene *>((*this->_current).get()) : std::optional<scene::Scene *>(); + return this->_current; } void Manager::setCurrent(scene::Scene & scene) { - if(this->_current != this->_scenes.end()) { + if(this->_current.has_value()) { (*this->_current)->destroy(); } - auto ptr = std::shared_ptr<scene::Scene>(&scene); - if(!this->_scenes.contains(ptr)) { - this->_scenes.insert(ptr); - } - - this->_current = std::find(this->_scenes.begin(), this->_scenes.end(), ptr); + this->_current = std::optional<scene::Scene*>(&scene); (*this->_current)->initialize(); } void Manager::render(const Camera & camera, double current_time) { - auto current = this->current(); - this->_sceneRenderer.render(current, camera, current_time); + this->_sceneRenderer.render(this->_current, camera, current_time); } } \ No newline at end of file diff --git a/ParticleGenerator/src/Scene/Manager.hpp b/ParticleGenerator/src/Scene/Manager.hpp index ca30daf..4e05e8b 100644 --- a/ParticleGenerator/src/Scene/Manager.hpp +++ b/ParticleGenerator/src/Scene/Manager.hpp @@ -9,12 +9,12 @@ #include "../Renderer/Camera/Camera.hpp" namespace pg { - using SceneContainer = std::set<std::shared_ptr<scene::Scene>>; + using SceneContainer = std::set<scene::Scene *>; class Manager { private: SceneContainer _scenes; - SceneContainer::iterator _current; + std::optional<scene::Scene *> _current; scene::Renderer _sceneRenderer; @@ -26,7 +26,7 @@ namespace pg { inline const SceneContainer & getScenes() const {return this->_scenes;} inline const scene::Renderer & getSceneRenderer() const {return this->_sceneRenderer;} - inline void add(scene::Scene * scene) {this->_scenes.insert(std::shared_ptr<scene::Scene>(scene));} + inline void add(scene::Scene * scene) {this->_scenes.insert(scene);} std::optional<scene::Scene *> current() const; diff --git a/ParticleGenerator/src/Scene/Renderer.cpp b/ParticleGenerator/src/Scene/Renderer.cpp index c826499..4bb3736 100644 --- a/ParticleGenerator/src/Scene/Renderer.cpp +++ b/ParticleGenerator/src/Scene/Renderer.cpp @@ -39,6 +39,7 @@ namespace pg::scene { this->_grid.render(camera, current_time); if(scene.has_value()) { + (*scene)->update(current_time); (*scene)->render(camera, current_time); } diff --git a/ParticleGenerator/src/Scene/Scenes/Grid.hpp b/ParticleGenerator/src/Scene/Scenes/Grid.hpp index bc2f71e..faa1e52 100644 --- a/ParticleGenerator/src/Scene/Scenes/Grid.hpp +++ b/ParticleGenerator/src/Scene/Scenes/Grid.hpp @@ -25,5 +25,6 @@ namespace pg::scene void destroy() override; std::string name() const override; + std::optional<interface::Interface *> interface() override {return std::optional<interface::Interface *>();} }; } \ No newline at end of file diff --git a/ParticleGenerator/src/Scene/Scenes/Mesh.cpp.old b/ParticleGenerator/src/Scene/Scenes/Mesh.cpp similarity index 99% rename from ParticleGenerator/src/Scene/Scenes/Mesh.cpp.old rename to ParticleGenerator/src/Scene/Scenes/Mesh.cpp index c80904f..ccf2f55 100644 --- a/ParticleGenerator/src/Scene/Scenes/Mesh.cpp.old +++ b/ParticleGenerator/src/Scene/Scenes/Mesh.cpp @@ -189,10 +189,6 @@ namespace pg::scene return "Mesh Scene"; } - interface::Interface* Mesh::interface() { - return &this->_interface; - } - void Mesh::setMesh(const std::string & path) { Model gridModel(path); this->_mesh.generate(gridModel.getMeshGeometry().vertices, gridModel.getMeshGeometry().indices); diff --git a/ParticleGenerator/src/Scene/Scenes/Mesh.hpp.old b/ParticleGenerator/src/Scene/Scenes/Mesh.hpp similarity index 89% rename from ParticleGenerator/src/Scene/Scenes/Mesh.hpp.old rename to ParticleGenerator/src/Scene/Scenes/Mesh.hpp index 385128e..586e5e8 100644 --- a/ParticleGenerator/src/Scene/Scenes/Mesh.hpp.old +++ b/ParticleGenerator/src/Scene/Scenes/Mesh.hpp @@ -43,6 +43,7 @@ namespace pg::scene public: Mesh(ct::CurveGenerator *, const ct::Curve &); + virtual ~Mesh() = default; void initialize() override; void update(double) override; @@ -50,7 +51,7 @@ namespace pg::scene void destroy() override; std::string name() const override; - interface::Interface* interface() override; + virtual std::optional<interface::Interface *> interface() {return std::optional<interface::Interface *>(&this->_interface);} void setMesh(const std::string &); void setTexture(const std::string &); diff --git a/ParticleGenerator/src/Scene/Scenes/MeshGenerator.cpp.old b/ParticleGenerator/src/Scene/Scenes/MeshGenerator.cpp similarity index 100% rename from ParticleGenerator/src/Scene/Scenes/MeshGenerator.cpp.old rename to ParticleGenerator/src/Scene/Scenes/MeshGenerator.cpp diff --git a/ParticleGenerator/src/Scene/Scenes/MeshGenerator.hpp.old b/ParticleGenerator/src/Scene/Scenes/MeshGenerator.hpp similarity index 88% rename from ParticleGenerator/src/Scene/Scenes/MeshGenerator.hpp.old rename to ParticleGenerator/src/Scene/Scenes/MeshGenerator.hpp index 9bbefc8..58609cf 100644 --- a/ParticleGenerator/src/Scene/Scenes/MeshGenerator.hpp.old +++ b/ParticleGenerator/src/Scene/Scenes/MeshGenerator.hpp @@ -30,9 +30,7 @@ namespace pg::scene { public: MeshGenerator(); - /*virtual ~MeshGenerator() { - - };*/ + virtual ~MeshGenerator() = default; virtual void initialize(); virtual void update(double); @@ -40,7 +38,7 @@ namespace pg::scene { virtual void destroy(); virtual std::string name() const {return "Mesh Generator Scene";}; - virtual interface::Interface * interface() {return &this->_interface;} + virtual std::optional<interface::Interface *> interface() {return std::optional<interface::Interface *>(&this->_interface);} void changeMesh(const std::string &); void changeTexture(const std::string &); diff --git a/ParticleGenerator/src/Scene/Scenes/Path.cpp.old b/ParticleGenerator/src/Scene/Scenes/Path.cpp similarity index 100% rename from ParticleGenerator/src/Scene/Scenes/Path.cpp.old rename to ParticleGenerator/src/Scene/Scenes/Path.cpp diff --git a/ParticleGenerator/src/Scene/Scenes/Path.hpp.old b/ParticleGenerator/src/Scene/Scenes/Path.hpp similarity index 89% rename from ParticleGenerator/src/Scene/Scenes/Path.hpp.old rename to ParticleGenerator/src/Scene/Scenes/Path.hpp index b50c5a4..f89c30c 100644 --- a/ParticleGenerator/src/Scene/Scenes/Path.hpp.old +++ b/ParticleGenerator/src/Scene/Scenes/Path.hpp @@ -26,6 +26,7 @@ namespace pg::scene { public: Path(ct::CurveGenerator *, const ct::Curve &); + virtual ~Path() = default; virtual void initialize(); virtual void render(const Camera &, double); @@ -39,7 +40,7 @@ namespace pg::scene { void changeParticletexture(const std::string &); virtual std::string name() const {return "Path Scene";} - virtual interface::Interface * interface() {return &this->_interface;} + virtual std::optional<interface::Interface *> interface() {return std::optional<interface::Interface *>(&this->_interface);} friend class pg::interface::PathScene; }; diff --git a/ParticleGenerator/src/Scene/Scenes/Physic.cpp.old b/ParticleGenerator/src/Scene/Scenes/Physic.cpp similarity index 100% rename from ParticleGenerator/src/Scene/Scenes/Physic.cpp.old rename to ParticleGenerator/src/Scene/Scenes/Physic.cpp diff --git a/ParticleGenerator/src/Scene/Scenes/Physic.hpp.old b/ParticleGenerator/src/Scene/Scenes/Physic.hpp similarity index 88% rename from ParticleGenerator/src/Scene/Scenes/Physic.hpp.old rename to ParticleGenerator/src/Scene/Scenes/Physic.hpp index 65d1c99..419c40a 100644 --- a/ParticleGenerator/src/Scene/Scenes/Physic.hpp.old +++ b/ParticleGenerator/src/Scene/Scenes/Physic.hpp @@ -23,6 +23,7 @@ namespace pg::scene { public: Physic(); + virtual ~Physic() = default; inline const Program & getProgram() const {return this->_program;} inline const Material & getTexture() const {return this->_texture;} @@ -31,6 +32,7 @@ namespace pg::scene { void changeParticletexture(const std::string &); virtual std::string name() const {return "Physic Scene";} + virtual std::optional<interface::Interface *> interface() {return std::optional<interface::Interface *>(&this->_interface);} virtual void initialize(); virtual void render(const Camera &, double); diff --git a/ParticleGenerator/src/Scene/Scenes/Scene.hpp b/ParticleGenerator/src/Scene/Scenes/Scene.hpp index 454a9dc..a9f08bd 100644 --- a/ParticleGenerator/src/Scene/Scenes/Scene.hpp +++ b/ParticleGenerator/src/Scene/Scenes/Scene.hpp @@ -13,7 +13,7 @@ namespace pg::scene { virtual ~Scene() = default; virtual std::string name() const {return "Scene";} - virtual std::optional<interface::Interface *> interface() const {return std::optional<interface::Interface *>();} + virtual std::optional<interface::Interface *> interface() = 0;// const {return std::optional<interface::Interface *>();} virtual void initialize() = 0; virtual void update(double) = 0; diff --git a/ParticleGenerator/src/main.cpp b/ParticleGenerator/src/main.cpp index 2822606..efa5244 100644 --- a/ParticleGenerator/src/main.cpp +++ b/ParticleGenerator/src/main.cpp @@ -7,10 +7,11 @@ #include "Scene/Manager.hpp" #include "Interface/Manager.hpp" -//#include "Scene/Scenes/Physic.hpp" -//#include "Scene/Scenes/Path.hpp" -//#include "Scene/Scenes/Mesh.hpp" -//#include "Scene/Scenes/MeshGenerator.hpp" +#include "Scene/Scenes/Physic.hpp" +#include "Scene/Scenes/Path.hpp" +#include "Scene/Scenes/Mesh.hpp" +#include "Scene/Scenes/MeshGenerator.hpp" +#include "Scene/Scenes/Grid.hpp" #include "Interface/Manager.hpp" @@ -73,14 +74,18 @@ int main(int argc, const char * argv[]) { ct::BezierGenerator bezier(ctrlPoints.size()); - //pg::scene::Physic physic; - //pg::scene::MeshGenerator meshGenerator; - //pg::scene::Path path(&bezier, ctrlPoints); - //pg::scene::Mesh mesh(&bezier, ctrlPoints); + pg::scene::Physic physic; + pg::scene::MeshGenerator meshGenerator; + pg::scene::Path path(&bezier, ctrlPoints); + pg::scene::Mesh mesh(&bezier, ctrlPoints); pg::Manager manager(window); pg::interface::Manager imanager(window, manager); - //pg::interface::Global interface(window, manager, "Particle Generator Settings"); + + manager.add(&path); + manager.add(&physic); + manager.add(&meshGenerator); + manager.add(&mesh); while(window.isOpen()) { double current_time = glfwGetTime(); -- GitLab