Fix bug in time handling in Particle Update shader

This commit is contained in:
karl 2021-05-09 23:04:41 +02:00
parent 616be9e5fc
commit 7c469c9c3c
3 changed files with 16 additions and 9 deletions

View File

@ -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];

View File

@ -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);

View File

@ -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;