From f2630fd153d573d4f8d450343c697cd64c615fbd Mon Sep 17 00:00:00 2001 From: Brett Laptop Date: Sat, 7 Jun 2025 22:08:20 -0400 Subject: [PATCH] silly pineapples --- CMakeLists.txt | 2 +- include/shaders/particle.frag | 7 +++---- include/shaders/particle.vert | 14 ++++++++++---- src/main.cpp | 28 ++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d4c64aa..62e1407 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.25) -project(gpu-particles VERSION 0.0.4) +project(gpu-particles VERSION 0.0.5) option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF) option(ENABLE_UBSAN "Enable the ub sanitizer" OFF) diff --git a/include/shaders/particle.frag b/include/shaders/particle.frag index 96d01a4..af9de9c 100644 --- a/include/shaders/particle.frag +++ b/include/shaders/particle.frag @@ -4,14 +4,13 @@ const std::string shader_particle_2d_frag = R"(" #version 300 es precision mediump float; -layout (location = 0) in vec4 position_uv; +uniform sampler2D tex; -out vec2 UVs; +layout (location = 0) out vec4 FragColor; void main() { - gl_Position = vec4(position_uv.x, position_uv.y, 0.0, 1.0); - UVs = position_uv.zw; + FragColor = texture(tex, gl_PointCoord); } ")"; diff --git a/include/shaders/particle.vert b/include/shaders/particle.vert index 8de5756..f2e6ddb 100644 --- a/include/shaders/particle.vert +++ b/include/shaders/particle.vert @@ -4,14 +4,20 @@ const std::string shader_particle_2d_vert = R"(" #version 300 es precision mediump float; -layout (location = 0) in vec4 position_uv; +layout (location = 0) in vec2 position; -out vec2 UVs; +layout (std140) uniform GlobalMatrices +{ + mat4 projection; + mat4 ortho; + mat4 view; + mat4 pvm; + mat4 ovm; +}; void main() { - gl_Position = vec4(position_uv.x, position_uv.y, 0.0, 1.0); - UVs = position_uv.zw; + gl_Position = ovm * vec4(position.x, position.y, 0.0, 1.0); } ")"; diff --git a/src/main.cpp b/src/main.cpp index b0f6737..b93fe96 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,9 +18,13 @@ #include "blt/gfx/renderer/resource_manager.h" #include "blt/gfx/renderer/batch_2d_renderer.h" #include "blt/gfx/renderer/camera.h" +#include #include #include #include +#include + +constexpr blt::size_t PARTICLE_COUNT = 8192; blt::gfx::matrix_state_manager global_matrices; blt::gfx::resource_manager resources; @@ -32,6 +36,12 @@ struct particle_t blt::vec2 position; blt::vec2 velocity; blt::vec2 acceleration; + + static particle_t make_particle() + { + blt::random::random_t random{std::random_device()()}; + return {blt::vec2{random.get(0.0f, 500.0f), random.get(0.0f, 500.0f)}, blt::vec2{}, blt::vec2{}}; + } }; std::unique_ptr particle_vao; @@ -49,6 +59,24 @@ void init(const blt::gfx::window_data&) particle_shader = std::unique_ptr(shader_t::make(shader_particle_2d_vert, shader_particle_2d_frag)); + for (blt::size_t i = 0; i < PARTICLE_COUNT; i++) + { + particles.push_back(particle_t::make_particle()); + alive_particles.push_back(i); + } + + particle_vbo = std::make_unique(); + particle_vbo->create(GL_ARRAY_BUFFER); + particle_vbo->allocate(sizeof(particle_t) * particles.size(), GL_DYNAMIC_DRAW, particles.data()); + + alive_particles_ebo = std::make_unique(); + alive_particles_ebo->create(); + alive_particles_ebo->allocate(sizeof(blt::u32) * alive_particles.size(), GL_DYNAMIC_DRAW, alive_particles.data()); + + particle_vao = std::make_unique(); + particle_vao->bindVBO(*particle_vbo, 0, 2, GL_FLOAT, sizeof(particle_t), 0); + particle_vao->bindElement(*alive_particles_ebo); + global_matrices.create_internals(); resources.load_resources(); renderer_2d.create();