Use float for timing in particle system

Also, update the assets_loader due to this
scene_man
En Yi 2024-04-24 21:47:58 +08:00
parent 6bcccf7412
commit 204329d2aa
3 changed files with 16 additions and 12 deletions

View File

@ -1,8 +1,8 @@
#include "particle_sys.h" #include "particle_sys.h"
#include "assets.h" #include "assets.h"
#include "raymath.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h>
void init_particle_system(ParticleSystem_t* system) 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) 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 = 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; emitter->particles[idx].alive = true;
float angle = generate_randrange(emitter->config->launch_range[0], emitter->config->launch_range[1]); 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 // TODO: deal with stream type
//spawn_particle(emitter, 0); //spawn_particle(emitter, 0);
uint32_t incr = 0; float incr = 0;
for (uint32_t i = 0; i < emitter->n_particles; ++i) for (uint32_t i = 0; i < emitter->n_particles; ++i)
{ {
emitter->particles[i].timer = incr; 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--; emitter->particles[i].timer -= delta_time;
if (emitter->particles[i].timer == 0) if (emitter->particles[i].timer <= 0.0f)
{ {
if (emitter->particles[i].spawned) if (emitter->particles[i].spawned)
{ {
@ -222,6 +222,10 @@ void update_particle_system(ParticleSystem_t* system, float delta_time)
{ {
emitter->finished = true; emitter->finished = true;
} }
}
if (emitter->finished)
{
system->emitter_list[prev_idx].next = system->emitter_list[emitter_idx].next; system->emitter_list[prev_idx].next = system->emitter_list[emitter_idx].next;
system->emitter_list[emitter_idx].next = 0; system->emitter_list[emitter_idx].next = 0;
system->emitter_list[emitter_idx].playing = false; system->emitter_list[emitter_idx].playing = false;

View File

@ -22,7 +22,7 @@ typedef struct Particle
float rotation; float rotation;
float angular_vel; float angular_vel;
float size; float size;
uint32_t timer; float timer;
bool alive; bool alive;
bool spawned; bool spawned;
}Particle_t; }Particle_t;
@ -38,8 +38,8 @@ typedef struct EmitterConfig
float speed_range[2]; float speed_range[2];
float angle_range[2]; float angle_range[2];
float rotation_range[2]; float rotation_range[2];
uint32_t particle_lifetime[2]; float particle_lifetime[2];
uint32_t initial_spawn_delay; float initial_spawn_delay;
PartEmitterType_t type; PartEmitterType_t type;
bool one_shot; bool one_shot;
}EmitterConfig_t; }EmitterConfig_t;
@ -51,7 +51,7 @@ struct ParticleEmitter
Vector2 position; Vector2 position;
Particle_t particles[MAX_PARTICLES]; Particle_t particles[MAX_PARTICLES];
uint32_t n_particles; uint32_t n_particles;
uint32_t timer; float timer;
bool finished; bool finished;
bool active; bool active;
void* user_data; void* user_data;

View File

@ -41,7 +41,7 @@ static bool parse_emitter_info(char* emitter_info_str, EmitterConfig_t* conf)
char emitter_type; char emitter_type;
uint8_t one_shot; uint8_t one_shot;
int data_count = sscanf( 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, &emitter_type,
conf->launch_range, conf->launch_range + 1, conf->launch_range, conf->launch_range + 1,
conf->speed_range, conf->speed_range + 1, conf->speed_range, conf->speed_range + 1,