diff --git a/engine/particle_sys.c b/engine/particle_sys.c index ad5569a..8316fa8 100644 --- a/engine/particle_sys.c +++ b/engine/particle_sys.c @@ -20,6 +20,14 @@ uint16_t get_number_of_free_emitter(ParticleSystem_t* system) return sc_queue_size(&system->free_list); } +static inline float generate_randrange(float lo, float hi) +{ + float val = hi - lo; + val *= (float)rand() / (float)RAND_MAX; + val += lo; + return val; +} + static inline void spawn_particle(ParticleEmitter_t* emitter, uint32_t idx) { uint32_t lifetime = (emitter->config->particle_lifetime[1] - emitter->config->particle_lifetime[0]); @@ -27,21 +35,22 @@ static inline void spawn_particle(ParticleEmitter_t* emitter, uint32_t idx) emitter->particles[idx].timer += rand() % lifetime; emitter->particles[idx].alive = true; - float angle = emitter->config->launch_range[1] - emitter->config->launch_range[0]; - angle *= (float)rand() / (float)RAND_MAX; - angle += emitter->config->launch_range[0]; + float angle = generate_randrange(emitter->config->launch_range[0], emitter->config->launch_range[1]); if(angle > 360) angle -= 360; if(angle < -360) angle += 360; - float speed = emitter->config->speed_range[1] - emitter->config->speed_range[0]; - speed *= (float)rand() / (float)RAND_MAX; - speed += emitter->config->speed_range[0]; + float speed = generate_randrange(emitter->config->speed_range[0], emitter->config->speed_range[1]); emitter->particles[idx].velocity.x = speed * cos(angle * PI / 180); emitter->particles[idx].velocity.y = speed * sin(angle * PI / 180); emitter->particles[idx].position = emitter->position; - emitter->particles[idx].rotation = angle; - emitter->particles[idx].angular_vel = -10 + 20 * (float)rand() / (float)RAND_MAX; + + emitter->particles[idx].rotation = generate_randrange( + emitter->config->angle_range[0], emitter->config->angle_range[1] + ); + emitter->particles[idx].angular_vel = generate_randrange( + emitter->config->rotation_range[0], emitter->config->rotation_range[1] + ); emitter->particles[idx].size = 10 + 20 * (float)rand() / (float)RAND_MAX; emitter->particles[idx].spawned = true; ; diff --git a/engine/particle_sys.h b/engine/particle_sys.h index 9d5dc04..4a18e70 100644 --- a/engine/particle_sys.h +++ b/engine/particle_sys.h @@ -36,6 +36,8 @@ typedef struct EmitterConfig { float launch_range[2]; float speed_range[2]; + float angle_range[2]; + float rotation_range[2]; uint32_t particle_lifetime[2]; uint32_t initial_spawn_delay; PartEmitterType_t type; diff --git a/particle_test.c b/particle_test.c index 1a5dd7c..61d08d1 100644 --- a/particle_test.c +++ b/particle_test.c @@ -74,6 +74,8 @@ int main(void) .one_shot = true, .launch_range = {0, 360}, .speed_range = {400, 2000}, + .angle_range = {0, 360}, + .rotation_range = {-10, 10}, .particle_lifetime = {30, 110}, .type = EMITTER_BURST, }; @@ -91,6 +93,8 @@ int main(void) .launch_range = {45, 135}, //.launch_range = {0, 360}, .speed_range = {300, 800}, + .angle_range = {0, 1}, + .rotation_range = {0, 1}, .particle_lifetime = {15, 30}, .initial_spawn_delay = 5, .type = EMITTER_STREAM, diff --git a/scenes/assets_loader.c b/scenes/assets_loader.c index 2e4967c..fcaff98 100644 --- a/scenes/assets_loader.c +++ b/scenes/assets_loader.c @@ -41,15 +41,17 @@ 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,%u-%u,%u,%c", + emitter_info_str, "%c,%f-%f,%f-%f,%f-%f,%f-%f,%u-%u,%u,%c", &emitter_type, conf->launch_range, conf->launch_range + 1, conf->speed_range, conf->speed_range + 1, + conf->angle_range, conf->angle_range + 1, + conf->rotation_range, conf->rotation_range + 1, conf->particle_lifetime, conf->particle_lifetime + 1, &conf->initial_spawn_delay, &one_shot ); - if (data_count == 9) + if (data_count == 13) { conf->type = EMITTER_UNKNOWN; if (emitter_type == 'b') @@ -62,7 +64,7 @@ static bool parse_emitter_info(char* emitter_info_str, EmitterConfig_t* conf) } conf->one_shot = (one_shot == '1'); } - return data_count == 9; + return data_count == 13; } static inline AssetInfoType_t get_asset_type(const char* str)