From 133335a8f8d829d4a82ac1c3e2c680c21394d7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9au?= <theau.baton@etu.univ-amu.fr> Date: Mon, 27 May 2024 11:28:49 +0200 Subject: [PATCH] Add interface for MeshGeneratorModel scene --- ParticleGenerator/res/config/imgui.ini | 11 ++- .../Interface/Scene/MeshGeneratorModel.cpp | 69 +++++++++++++++++++ .../Interface/Scene/MeshGeneratorModel.hpp | 24 +++++++ .../src/Scene/Scenes/MeshGeneratorModel.cpp | 3 +- .../src/Scene/Scenes/MeshGeneratorModel.hpp | 13 +++- 5 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 ParticleGenerator/src/Interface/Scene/MeshGeneratorModel.cpp create mode 100644 ParticleGenerator/src/Interface/Scene/MeshGeneratorModel.hpp diff --git a/ParticleGenerator/res/config/imgui.ini b/ParticleGenerator/res/config/imgui.ini index d4e4896..62657f2 100644 --- a/ParticleGenerator/res/config/imgui.ini +++ b/ParticleGenerator/res/config/imgui.ini @@ -2,13 +2,12 @@ Pos=60,60 Size=400,400 +[Window][Particle Generator] +Pos=60,60 +Size=704,561 + [Window][Dear ImGui Demo] -Pos=1051,35 +Pos=971,50 Size=550,680 Collapsed=1 -[Window][Particle Generator] -Pos=7,9 -Size=476,521 -Collapsed=1 - diff --git a/ParticleGenerator/src/Interface/Scene/MeshGeneratorModel.cpp b/ParticleGenerator/src/Interface/Scene/MeshGeneratorModel.cpp new file mode 100644 index 0000000..da290ba --- /dev/null +++ b/ParticleGenerator/src/Interface/Scene/MeshGeneratorModel.cpp @@ -0,0 +1,69 @@ +#include "MeshGeneratorModel.hpp" + +#include <imgui.h> +#include "../../Scene/Scenes/MeshGeneratorModel.hpp" +#include "../../tfd/tinyfiledialogs.h" + +namespace pg::interface { + MeshGeneratorModel::MeshGeneratorModel(scene::MeshGeneratorModel * parent) + : Scene(parent), SceneParticle(parent), _interface(nullptr) {} + + void MeshGeneratorModel::draw(double current_time) { + SceneParticle::draw(current_time); + ImGui::SeparatorText("Mesh"); + if(ImGui::Button("Change Model")) { + char const * imagePatterns[1] = {"*.obj"}; + std::string path = tinyfd_openFileDialog("Model Browser", "", 1, imagePatterns, "Model File", false); + this->parent()->changeMesh(path); + } + + ImGui::SeparatorText("Particles"); + + ImGui::PushID(1); + if(ImGui::Button("Change Model")) { + char const * imagePatterns[1] = {"*.obj"}; + std::string path = tinyfd_openFileDialog("Model Browser", "", 1, imagePatterns, "Model File", false); + this->parent()->changeMeshParticle(path); + } + + ImGui::SameLine(); + + if(ImGui::Button("Texture")) { + char const * imagePatterns[1] = {"*.png"}; + std::string path = tinyfd_openFileDialog("Model Browser", "", 1, imagePatterns, "Image File", false); + this->parent()->changeTexture(path); + } + + ImGui::SameLine(); + ImGui::ColorEdit4("Color : ", &this->parent()->_color[0]); + + ImGui::SeparatorText("Position"); + ImGui::DragFloat3("Position", &this->parent()->_meshPosition[0]); + ImGui::DragFloat3("Rotation", &this->parent()->_meshRotation[0]); + ImGui::PopID(); + + ImGui::SeparatorText("Generators"); + + if(!this->parent()->_generators.empty()) { + std::string name = std::to_string(reinterpret_cast<intptr_t>(&this->parent()->_generators.front())); + if(this->_interface.parent() != nullptr) { + name = std::to_string(reinterpret_cast<intptr_t>(this->_interface.parent())); + } + + if(ImGui::BeginCombo("Current Generator", name.c_str())) { + for(auto & generator : this->parent()->_generators) { + bool is_selected = std::to_string(reinterpret_cast<intptr_t>(&generator)) == std::to_string(reinterpret_cast<intptr_t>(this->_interface.parent())); + if(ImGui::Selectable(std::to_string(reinterpret_cast<intptr_t>(&generator)).c_str(), is_selected)) { + this->_interface.setParent(&generator); + } + + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + } + ImGui::EndCombo(); + } + } + this->_interface.draw(current_time); + } +} \ No newline at end of file diff --git a/ParticleGenerator/src/Interface/Scene/MeshGeneratorModel.hpp b/ParticleGenerator/src/Interface/Scene/MeshGeneratorModel.hpp new file mode 100644 index 0000000..94611fb --- /dev/null +++ b/ParticleGenerator/src/Interface/Scene/MeshGeneratorModel.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "../Interface.hpp" +#include "SceneParticle.hpp" + +#include "../Generator/PhysicGenerator.hpp" + +namespace pg::scene { + class MeshGeneratorModel; +} + +namespace pg::interface { + class MeshGeneratorModel : public Scene<scene::MeshGeneratorModel>, public SceneParticle { + private: + PhysicGenerator _interface; + + public: + MeshGeneratorModel(scene::MeshGeneratorModel *); + virtual ~MeshGeneratorModel() = default; + + void draw(double = 0.0) override; + inline std::string title() const override final {return "Mesh Generator Model Scene Interface";} + }; +} \ No newline at end of file diff --git a/ParticleGenerator/src/Scene/Scenes/MeshGeneratorModel.cpp b/ParticleGenerator/src/Scene/Scenes/MeshGeneratorModel.cpp index d3db9ab..8803b22 100644 --- a/ParticleGenerator/src/Scene/Scenes/MeshGeneratorModel.cpp +++ b/ParticleGenerator/src/Scene/Scenes/MeshGeneratorModel.cpp @@ -18,7 +18,8 @@ namespace pg::scene { _meshParticleTexture(), _meshParticleProgram(), _ubo(0), - _color(1.f) {} + _color(1.f), + _interface(this) {} void MeshGeneratorModel::initialize() { if(!this->_mesh.isGenerated()) { diff --git a/ParticleGenerator/src/Scene/Scenes/MeshGeneratorModel.hpp b/ParticleGenerator/src/Scene/Scenes/MeshGeneratorModel.hpp index 811943c..11ee44f 100644 --- a/ParticleGenerator/src/Scene/Scenes/MeshGeneratorModel.hpp +++ b/ParticleGenerator/src/Scene/Scenes/MeshGeneratorModel.hpp @@ -10,6 +10,12 @@ #include "../../Renderer/Renderer.hpp" #include "../../Particle/generator/PhysicsGenerator.hpp" +#include "../../Interface/Scene/MeshGeneratorModel.hpp" + +namespace pg::interface { + class MeshGeneratorModel; +} + namespace pg::scene { class MeshGeneratorModel : public SceneParticle { private: @@ -25,6 +31,8 @@ namespace pg::scene { GLuint _ubo; glm::vec4 _color; + interface::MeshGeneratorModel _interface; + public: MeshGeneratorModel(); virtual ~MeshGeneratorModel() = default; @@ -34,12 +42,15 @@ namespace pg::scene { virtual void render(const Camera &, double); virtual void destroy(); - virtual std::string name() const {return "Mesh Generator Model Scene";}; + virtual std::string name() const {return "Mesh Generator Model Scene";} + virtual std::optional<interface::Interface *> interface() {return std::optional<interface::Interface *>(&this->_interface);} void changeMesh(const std::string &); void changeMeshParticle(const std::string &); void changeTexture(const std::string &); void spawn(int count, double current_time); + + friend class interface::MeshGeneratorModel; }; } \ No newline at end of file -- GitLab