Add angle and rotation range for particle system
parent
26eeec5638
commit
05e58677a5
|
@ -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;
|
||||
;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue