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