Use float for timing in particle system
Also, update the assets_loader due to thisscene_man
parent
6bcccf7412
commit
204329d2aa
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue