From 204329d2aa498b1fbf78a7cc75975bc545daf85b Mon Sep 17 00:00:00 2001 From: En Yi Date: Wed, 24 Apr 2024 21:47:58 +0800 Subject: [PATCH] Use float for timing in particle system Also, update the assets_loader due to this --- engine/particle_sys.c | 18 +++++++++++------- engine/particle_sys.h | 8 ++++---- scenes/assets_loader.c | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/engine/particle_sys.c b/engine/particle_sys.c index acc7da4..e5cbf81 100644 --- a/engine/particle_sys.c +++ b/engine/particle_sys.c @@ -1,8 +1,8 @@ #include "particle_sys.h" #include "assets.h" +#include "raymath.h" #include #include -#include void init_particle_system(ParticleSystem_t* system) { @@ -30,9 +30,9 @@ static inline float generate_randrange(float lo, float hi) static inline void spawn_particle(ParticleEmitter_t* emitter, uint32_t idx) { - uint32_t lifetime = (emitter->config->particle_lifetime[1] - emitter->config->particle_lifetime[0]); + float lifetime = (emitter->config->particle_lifetime[1] - emitter->config->particle_lifetime[0]); emitter->particles[idx].timer = emitter->config->particle_lifetime[0]; - emitter->particles[idx].timer += rand() % lifetime; + emitter->particles[idx].timer += lifetime * rand()/ (float)RAND_MAX; emitter->particles[idx].alive = true; float angle = generate_randrange(emitter->config->launch_range[0], emitter->config->launch_range[1]); @@ -92,7 +92,7 @@ void play_emitter_handle(ParticleSystem_t* system, uint16_t handle) { // TODO: deal with stream type //spawn_particle(emitter, 0); - uint32_t incr = 0; + float incr = 0; for (uint32_t i = 0; i < emitter->n_particles; ++i) { emitter->particles[i].timer = incr; @@ -179,9 +179,9 @@ void update_particle_system(ParticleSystem_t* system, float delta_time) } } - // Lifetime update - if (emitter->particles[i].timer > 0) emitter->particles[i].timer--; - if (emitter->particles[i].timer == 0) + + emitter->particles[i].timer -= delta_time; + if (emitter->particles[i].timer <= 0.0f) { if (emitter->particles[i].spawned) { @@ -222,6 +222,10 @@ void update_particle_system(ParticleSystem_t* system, float delta_time) { emitter->finished = true; } + } + + if (emitter->finished) + { system->emitter_list[prev_idx].next = system->emitter_list[emitter_idx].next; system->emitter_list[emitter_idx].next = 0; system->emitter_list[emitter_idx].playing = false; diff --git a/engine/particle_sys.h b/engine/particle_sys.h index beab1a0..591d948 100644 --- a/engine/particle_sys.h +++ b/engine/particle_sys.h @@ -22,7 +22,7 @@ typedef struct Particle float rotation; float angular_vel; float size; - uint32_t timer; + float timer; bool alive; bool spawned; }Particle_t; @@ -38,8 +38,8 @@ typedef struct EmitterConfig float speed_range[2]; float angle_range[2]; float rotation_range[2]; - uint32_t particle_lifetime[2]; - uint32_t initial_spawn_delay; + float particle_lifetime[2]; + float initial_spawn_delay; PartEmitterType_t type; bool one_shot; }EmitterConfig_t; @@ -51,7 +51,7 @@ struct ParticleEmitter Vector2 position; Particle_t particles[MAX_PARTICLES]; uint32_t n_particles; - uint32_t timer; + float timer; bool finished; bool active; void* user_data; diff --git a/scenes/assets_loader.c b/scenes/assets_loader.c index fcaff98..cc57211 100644 --- a/scenes/assets_loader.c +++ b/scenes/assets_loader.c @@ -41,7 +41,7 @@ static bool parse_emitter_info(char* emitter_info_str, EmitterConfig_t* conf) char emitter_type; uint8_t one_shot; int data_count = sscanf( - emitter_info_str, "%c,%f-%f,%f-%f,%f-%f,%f-%f,%u-%u,%u,%c", + emitter_info_str, "%c,%f-%f,%f-%f,%f-%f,%f-%f,%f-%f,%f,%c", &emitter_type, conf->launch_range, conf->launch_range + 1, conf->speed_range, conf->speed_range + 1,