From 04b10a68ab4865f1e89db2b6897b7a386918158f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9au?= <theau.baton@etu.univ-amu.fr>
Date: Thu, 30 May 2024 12:52:59 +0200
Subject: [PATCH] Change background to white

---
 ParticleGenerator/res/config/imgui.ini        |   4 +-
 .../scene/Billboard-Sprite-Little.vert        |  25 +++++
 .../res/shaders/scene/Billboard-Sprite.frag   |   8 +-
 .../res/shaders/scene/Phong.frag              |   2 +-
 ParticleGenerator/res/textures/glow2bgb.png   | Bin 0 -> 7952 bytes
 ParticleGenerator/res/textures/mastergig.png  | Bin 0 -> 2498 bytes
 .../src/Interface/Scene/SceneParticle.cpp     |   2 +-
 .../src/Particle/generator/Generator.hpp      |  18 +++-
 ParticleGenerator/src/Scene/Renderer.cpp      |   3 +-
 .../src/Scene/Scenes/BillboardTest.cpp        |  99 ++++++++++++++++++
 .../src/Scene/Scenes/BillboardTest.hpp        |  26 +++++
 .../src/System/FrameHistorical.cpp            |   2 +-
 ParticleGenerator/src/main.cpp                |   3 +
 13 files changed, 184 insertions(+), 8 deletions(-)
 create mode 100644 ParticleGenerator/res/shaders/scene/Billboard-Sprite-Little.vert
 create mode 100644 ParticleGenerator/res/textures/glow2bgb.png
 create mode 100644 ParticleGenerator/res/textures/mastergig.png
 create mode 100644 ParticleGenerator/src/Scene/Scenes/BillboardTest.cpp
 create mode 100644 ParticleGenerator/src/Scene/Scenes/BillboardTest.hpp

diff --git a/ParticleGenerator/res/config/imgui.ini b/ParticleGenerator/res/config/imgui.ini
index 17856c7..b577497 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=733,329
+Pos=13,14
+Size=505,662
 
diff --git a/ParticleGenerator/res/shaders/scene/Billboard-Sprite-Little.vert b/ParticleGenerator/res/shaders/scene/Billboard-Sprite-Little.vert
new file mode 100644
index 0000000..3cbbd8c
--- /dev/null
+++ b/ParticleGenerator/res/shaders/scene/Billboard-Sprite-Little.vert
@@ -0,0 +1,25 @@
+#version 460 core
+
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec2 aTex;
+
+uniform mat4 uView;
+uniform mat4 uProj;
+uniform mat4 uModels[16];
+uniform vec4 uFrames[16];
+
+out vec2 zTex;
+out vec4 zFrame;
+
+void main() { 
+    vec3 cameraRight = vec3(uView[0][0], uView[1][0], uView[2][0]);
+	vec3 cameraUp = vec3(uView[0][1], uView[1][1], uView[2][1]);
+	vec3 particlePosition = vec3(uModels[gl_InstanceID][0][3], uModels[gl_InstanceID][1][3], uModels[gl_InstanceID][2][3]);
+	vec2 particleSize = vec2(1.0, 1.0);
+
+	vec3 vertexPosition = particlePosition + cameraRight * aPos.x * particleSize.x + cameraUp * aPos.y * particleSize.y;
+
+    gl_Position = uProj * uView * uModels[gl_InstanceID] * vec4(vertexPosition, 1.0);
+    zTex = aTex;
+    zFrame = uFrames[gl_InstanceID];
+}
\ No newline at end of file
diff --git a/ParticleGenerator/res/shaders/scene/Billboard-Sprite.frag b/ParticleGenerator/res/shaders/scene/Billboard-Sprite.frag
index 1c62949..2b1ef0f 100644
--- a/ParticleGenerator/res/shaders/scene/Billboard-Sprite.frag
+++ b/ParticleGenerator/res/shaders/scene/Billboard-Sprite.frag
@@ -13,5 +13,11 @@ void main() {
         (zFrame.x / uSize.x) + (zFrame.z / uSize.x) * zTex.x, 
         (zFrame.y / uSize.y) + (zFrame.w / uSize.y) * zTex.y  
     );
-    FragColor = texture(uTexture, coord) * uColor;
+
+    vec4 color = texture(uTexture, coord);
+    if(color.a < 0.1) {
+        discard;
+    }
+
+    FragColor = color * uColor;
 }
\ No newline at end of file
diff --git a/ParticleGenerator/res/shaders/scene/Phong.frag b/ParticleGenerator/res/shaders/scene/Phong.frag
index 1e211fc..6b061f5 100644
--- a/ParticleGenerator/res/shaders/scene/Phong.frag
+++ b/ParticleGenerator/res/shaders/scene/Phong.frag
@@ -12,7 +12,7 @@ uniform vec4 uColor;
 uniform sampler2D uSlot;
 
 void main() {
-    float ambientStrength = 0.25;
+    float ambientStrength = 1.0;
     vec4 ambient = ambientStrength * uColor;
   	 
     vec3 norm = normalize(zNormal);
diff --git a/ParticleGenerator/res/textures/glow2bgb.png b/ParticleGenerator/res/textures/glow2bgb.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c55b4430e4d1e3c2be3d44d33db8586e14778c5
GIT binary patch
literal 7952
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
Hl+XkK>^&1M

literal 0
HcmV?d00001

diff --git a/ParticleGenerator/res/textures/mastergig.png b/ParticleGenerator/res/textures/mastergig.png
new file mode 100644
index 0000000000000000000000000000000000000000..af64cd11b1f7e7acf2abd9e18405a5b8ac294406
GIT binary patch
literal 2498
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

literal 0
HcmV?d00001

diff --git a/ParticleGenerator/src/Interface/Scene/SceneParticle.cpp b/ParticleGenerator/src/Interface/Scene/SceneParticle.cpp
index 0f7a62d..3179ac7 100644
--- a/ParticleGenerator/src/Interface/Scene/SceneParticle.cpp
+++ b/ParticleGenerator/src/Interface/Scene/SceneParticle.cpp
@@ -26,7 +26,7 @@ namespace pg::interface {
             color = ImVec4(0.75f, 0.75f, 0.15f, 1.f);
         }
         
-        ImGui::TextColored(color, "Particule Number : %i / %i", count, max);
+        ImGui::TextColored(color, "Particules Number : %i / %i", count, max);
         ImGui::ProgressBar(pc);
         if(ImGui::Button("Spawn", ImVec2(size.x * 0.5f, 25))) {
             this->_scene->spawn(1, current_time);
diff --git a/ParticleGenerator/src/Particle/generator/Generator.hpp b/ParticleGenerator/src/Particle/generator/Generator.hpp
index 6416090..b1f6f6b 100644
--- a/ParticleGenerator/src/Particle/generator/Generator.hpp
+++ b/ParticleGenerator/src/Particle/generator/Generator.hpp
@@ -40,4 +40,20 @@ namespace pg::particle {
 			virtual std::vector<std::unique_ptr<T>> generate(size_t count, size_t birth = 0) const = 0;
 			inline std::vector<std::unique_ptr<T>> operator()(size_t count, size_t birth = 0) const {return this->generate(count, birth);}
 	};
-}
\ No newline at end of file
+}
+
+template <typename T>
+using ParticleContainer = std::vector<T>;
+
+using Vec3 = glm::vec3;
+
+template <typename T>
+class Generator {
+	private:
+		Vec3 position;
+		Vec3 positionVariation;
+		Vec3 rotation;
+
+	public:
+		virtual Container<T> generate(unsigned int number, long when) const = 0;
+};
\ No newline at end of file
diff --git a/ParticleGenerator/src/Scene/Renderer.cpp b/ParticleGenerator/src/Scene/Renderer.cpp
index 4bb3736..6cb112b 100644
--- a/ParticleGenerator/src/Scene/Renderer.cpp
+++ b/ParticleGenerator/src/Scene/Renderer.cpp
@@ -31,7 +31,8 @@ namespace pg::scene {
     }
 
     void Renderer::render(std::optional<Scene *> scene, const Camera & camera, double current_time) {
-        glClearColor(0.f, 0.f, 0.f, 1.f);
+        //glClearColor(0.f, 0.f, 0.f, 1.f);
+        glClearColor(1.f, 1.f, 1.f, 1.0f);
         glEnable(GL_BLEND);
         glEnable(GL_MULTISAMPLE);
         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
diff --git a/ParticleGenerator/src/Scene/Scenes/BillboardTest.cpp b/ParticleGenerator/src/Scene/Scenes/BillboardTest.cpp
new file mode 100644
index 0000000..47c4bff
--- /dev/null
+++ b/ParticleGenerator/src/Scene/Scenes/BillboardTest.cpp
@@ -0,0 +1,99 @@
+#include "BillboardTest.hpp"
+
+namespace pg::scene {
+    BillboardTest::BillboardTest()
+    : SceneParticle(1) {}
+
+
+    void BillboardTest::initialize() {
+        this->_billboards.initialize();
+        if(!this->_program.usable()) {
+            pg::Source vertices("res/shaders/scene/Billboard-Sprite-Little.vert", pg::Source::Categorie::VERTEX);
+            pg::Source fragment("res/shaders/scene/Billboard-Sprite.frag", pg::Source::Categorie::FRAGMENT);
+
+            this->_program << vertices;
+            this->_program << fragment;
+
+            this->_program.link();
+
+            vertices.release();
+            fragment.release();
+        }
+
+        this->_texture.load("res/textures/mastergig.png"); 
+        this->_frames.clear();
+        this->_frames.push_back(glm::vec4(0,   0, 16, 16));
+        this->_frames.push_back(glm::vec4(16,  0, 16, 16));
+        this->_frames.push_back(glm::vec4(32,  0, 16, 16));
+        this->_frames.push_back(glm::vec4(48,  0, 16, 16));
+        this->_frames.push_back(glm::vec4(64,  0, 16, 16));
+        this->_frames.push_back(glm::vec4(80,  0, 16, 16));
+        this->_frames.push_back(glm::vec4(96,  0, 16, 16));
+        this->_frames.push_back(glm::vec4(112,  0, 16, 16));
+        this->_frames.push_back(glm::vec4(96,  0, 16, 16));
+
+        glClearColor(0.25f, 0.f, 0.15f, 1.0f);
+    }
+
+    void BillboardTest::update(double) {
+
+    }
+
+    void BillboardTest::render(const Camera & camera, double current_time) {
+        glClearColor(1.f, 1.f, 1.f, 1.0f);
+        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+        const glm::mat4 VIEW_MATRIX = camera.getViewMatrix();
+        const glm::mat4 PROJECTION_MATRIX = camera.getViewFrustum().getProjectionMatrix();
+
+        std::vector<glm::mat4> models;
+        std::vector<glm::vec4> frames;
+
+        float x = 6.f;
+        float y = 1.f;
+        for(size_t i = 0; i < 9; i++) {
+            glm::mat4 model = glm::mat4(1.f);
+            model = glm::translate(model, glm::vec3(x, y , 0.0));
+            
+            models.push_back(model);
+            
+            frames.push_back(this->_frames.at(i%this->_frames.size()));
+            
+            x += -2.f;
+
+            if(i == 5) {
+                y -= 3.f;
+                x = 3.f;
+            }
+        }
+        
+
+        this->_texture.bind(0);
+        this->_program.use();
+                
+        this->_program.setUniform("uView", VIEW_MATRIX);
+        this->_program.setUniform("uProj", PROJECTION_MATRIX); 
+        this->_program.setUniform("uModels", models);
+        this->_program.setUniform("uFrames", frames);
+
+        this->_program.setUniform("uSlot", 0);
+        this->_program.setUniform("uSize", glm::vec2(128.f, 16.f));
+        this->_program.setUniform("uColor", glm::vec4(1.f));
+
+        if(this->isRenderEnable()) {
+            this->_billboards.draw(13);
+        }
+
+        pg::error::OpenGLError::check();
+
+        glDisable(GL_DEPTH_TEST);
+    }
+
+    void BillboardTest::destroy() {
+
+    }
+
+    void BillboardTest::spawn(int count, double current_time) {
+
+    }
+}
\ No newline at end of file
diff --git a/ParticleGenerator/src/Scene/Scenes/BillboardTest.hpp b/ParticleGenerator/src/Scene/Scenes/BillboardTest.hpp
new file mode 100644
index 0000000..1cad17b
--- /dev/null
+++ b/ParticleGenerator/src/Scene/Scenes/BillboardTest.hpp
@@ -0,0 +1,26 @@
+#pragma once 
+
+#include "../Scene.hpp"
+#include "../../Mesh/Billboard.hpp"
+
+namespace pg::scene {
+    class BillboardTest : public scene::SceneParticle {
+        private:
+            Billboard _billboards;
+            Material _texture;
+            Program _program;
+            std::vector<glm::vec4> _frames;
+
+        public:
+            BillboardTest();
+   virtual ~BillboardTest() = default;
+
+            virtual void initialize();
+            virtual void render(const Camera &, double);
+            virtual void update(double);
+            virtual void destroy();
+
+            virtual void spawn(int, double);
+            virtual std::string name() const {return "Billboard Test Scene";}
+    };
+}
\ No newline at end of file
diff --git a/ParticleGenerator/src/System/FrameHistorical.cpp b/ParticleGenerator/src/System/FrameHistorical.cpp
index 7636911..b8e911d 100644
--- a/ParticleGenerator/src/System/FrameHistorical.cpp
+++ b/ParticleGenerator/src/System/FrameHistorical.cpp
@@ -20,7 +20,7 @@ namespace pg::interface {
 
         if(!this->_frames.empty()) {
             float max = *std::max_element(this->_frames.begin(), this->_frames.end());
-            ImGui::Text("Frame Per Second : %f", this->getFramePerSecond());
+            ImGui::Text("Frames Per Seconds : %f", this->getFramePerSecond());
             ImGui::PlotLines("", this->_frames.data(), static_cast<int>(this->_frames.size()), 0, NULL, 0.0f, max * 1.1f, ImVec2(0, 80));
         }
     }
diff --git a/ParticleGenerator/src/main.cpp b/ParticleGenerator/src/main.cpp
index 5581746..0158653 100644
--- a/ParticleGenerator/src/main.cpp
+++ b/ParticleGenerator/src/main.cpp
@@ -16,6 +16,7 @@
 #include "Scene/Scenes/MeshGeneratorModel.hpp"
 #include "Scene/Scenes/PathPregenerated.hpp"
 #include "Scene/Scenes/PathAnimated.hpp"
+#include "Scene/Scenes/BillboardTest.hpp"
 
 #include "Interface/Manager.hpp"
 
@@ -88,6 +89,7 @@ int main(int argc, const char * argv[]) {
         pg::scene::MeshGeneratorModel meshGeneratorModel;
         pg::scene::PathPregenerated pathPregenerated(&bezier, ctrlPoints);
         pg::scene::PathAnimated pathAnimated(&bezier);
+        pg::scene::BillboardTest billboardTest;
         
         pg::Manager manager(window);
         pg::interface::Manager imanager(window, manager);
@@ -100,6 +102,7 @@ int main(int argc, const char * argv[]) {
         manager.add(&meshGeneratorModel);
         manager.add(&pathPregenerated);
         manager.add(&pathAnimated);
+        manager.add(&billboardTest);
 
         while(window.isOpen()) {
             double current_time = glfwGetTime();
-- 
GitLab