diff --git a/Shader/particle_update.gs b/Shader/particle_update.gs index 6627ca4..4976da3 100644 --- a/Shader/particle_update.gs +++ b/Shader/particle_update.gs @@ -29,7 +29,7 @@ uniform vec3 spawn_color; uniform float spawn_size; uniform float spawn_lifetime_min, spawn_lifetime_range; // Life of new particle - from min to (min+range) -uniform float time_passed; // Time passed since last frame +uniform float delta; // Time passed since last frame uniform vec3 random_seed; // Seed number for our random number function vec3 local_seed; @@ -55,11 +55,11 @@ void main() { position_out = position_pass[0]; velocity_out = velocity_pass[0]; - if(type_pass[0] != 0.0) position_out += velocity_out * time_passed; - if(type_pass[0] != 0.0) velocity_out += spawn_gravity * time_passed; + if(type_pass[0] != 0.0) position_out += velocity_out * delta; + if(type_pass[0] != 0.0) velocity_out += spawn_gravity * delta; color_out = color_pass[0]; - lifetime_out = lifetime_pass[0] - time_passed; + lifetime_out = lifetime_pass[0] - delta; size_out = size_pass[0]; type_out = type_pass[0]; diff --git a/cpp/ParticleSystem.cpp b/cpp/ParticleSystem.cpp index d1a70a4..d3c4612 100644 --- a/cpp/ParticleSystem.cpp +++ b/cpp/ParticleSystem.cpp @@ -52,7 +52,7 @@ ParticleSystem::ParticleSystem() { void ParticleSystem::update(float delta) { update_shader.use(); - update_shader.setFloat("time_passed", elapsed_time); + update_shader.setFloat("delta", delta); update_shader.setVec3("spawn_position", spawn_position); update_shader.setVec3("spawn_velocity_min", spawn_velocity_min); update_shader.setVec3("spawn_velocity_range", spawn_velocity_range); diff --git a/test/particle-demo/main.cpp b/test/particle-demo/main.cpp index 17fbeab..0600932 100644 --- a/test/particle-demo/main.cpp +++ b/test/particle-demo/main.cpp @@ -1,3 +1,4 @@ +#include "Gedeng/Input.h" #include "Gedeng/Logger.h" #include "Gedeng/ParticleSystem.h" #include "Gedeng/QuadMesh.h" @@ -11,8 +12,8 @@ class ParticleApp : public Gedeng::Application { public: ParticleApp(unsigned long ms_per_update, unsigned int window_size_x, unsigned int window_size_y, Gedeng::String window_name) - : Application(ms_per_update, window_size_x, window_size_y, window_name), number_of_steps(10.0), - number_of_refinement_steps(10.0), bump_depth(0.1), + : Application(ms_per_update, window_size_x, window_size_y, window_name), particle_interval(0.1), + number_of_steps(10.0), number_of_refinement_steps(10.0), bump_depth(0.1), render_shader(Gedeng::Shader("Shader/bump.vs", "Shader/bump.fs")), camera(Gedeng::FPSCamera(90, 1920, 1080, 0.1, 1000.0)), albedo("Resources/Textures/PavingStones/PavingStones070_2K_Color.jpg", Gedeng::Texture::Settings()), @@ -25,7 +26,7 @@ class ParticleApp : public Gedeng::Application { particles.set_color(glm::vec3(0.0f, 0.5f, 1.0f)); particles.set_lifetime(1.0f, 1.5f); particles.set_size(0.1); - particles.set_interval(0.05f); + particles.set_interval(particle_interval); particles.set_number_of_particles(1); particles.set_texture(&albedo); @@ -36,11 +37,15 @@ class ParticleApp : public Gedeng::Application { ~ParticleApp() = default; void fixed_update(double delta) override { - // camera.rotate(delta * 180, glm::vec3(0.0, 1.0, 0.0)); camera.update(delta); if (Gedeng::Input::is_mouse_down(GLFW_MOUSE_BUTTON_LEFT)) particles.set_position(camera.get_view_ray().get_plane_collision().collision_position); + + if (Gedeng::Input::is_key_down(GLFW_KEY_2)) particle_interval = fmax(particle_interval + 0.1 * delta, 0.02); + if (Gedeng::Input::is_key_down(GLFW_KEY_1)) particle_interval = fmax(particle_interval - 0.1 * delta, 0.02); + + particles.set_interval(particle_interval); } void dynamic_update(double delta) override { @@ -76,6 +81,8 @@ class ParticleApp : public Gedeng::Application { } private: + float particle_interval; + float number_of_steps; float number_of_refinement_steps; float bump_depth;