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);
|
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)
|
static inline void spawn_particle(ParticleEmitter_t* emitter, uint32_t idx)
|
||||||
{
|
{
|
||||||
uint32_t lifetime = (emitter->config->particle_lifetime[1] - emitter->config->particle_lifetime[0]);
|
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].timer += rand() % lifetime;
|
||||||
emitter->particles[idx].alive = true;
|
emitter->particles[idx].alive = true;
|
||||||
|
|
||||||
float angle = emitter->config->launch_range[1] - emitter->config->launch_range[0];
|
float angle = generate_randrange(emitter->config->launch_range[0], emitter->config->launch_range[1]);
|
||||||
angle *= (float)rand() / (float)RAND_MAX;
|
|
||||||
angle += emitter->config->launch_range[0];
|
|
||||||
if(angle > 360) angle -= 360;
|
if(angle > 360) angle -= 360;
|
||||||
if(angle < -360) angle += 360;
|
if(angle < -360) angle += 360;
|
||||||
|
|
||||||
float speed = emitter->config->speed_range[1] - emitter->config->speed_range[0];
|
float speed = generate_randrange(emitter->config->speed_range[0], emitter->config->speed_range[1]);
|
||||||
speed *= (float)rand() / (float)RAND_MAX;
|
|
||||||
speed += emitter->config->speed_range[0];
|
|
||||||
|
|
||||||
emitter->particles[idx].velocity.x = speed * cos(angle * PI / 180);
|
emitter->particles[idx].velocity.x = speed * cos(angle * PI / 180);
|
||||||
emitter->particles[idx].velocity.y = speed * sin(angle * PI / 180);
|
emitter->particles[idx].velocity.y = speed * sin(angle * PI / 180);
|
||||||
emitter->particles[idx].position = emitter->position;
|
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].size = 10 + 20 * (float)rand() / (float)RAND_MAX;
|
||||||
emitter->particles[idx].spawned = true;
|
emitter->particles[idx].spawned = true;
|
||||||
;
|
;
|
||||||
|
|
|
@ -36,6 +36,8 @@ typedef struct EmitterConfig
|
||||||
{
|
{
|
||||||
float launch_range[2];
|
float launch_range[2];
|
||||||
float speed_range[2];
|
float speed_range[2];
|
||||||
|
float angle_range[2];
|
||||||
|
float rotation_range[2];
|
||||||
uint32_t particle_lifetime[2];
|
uint32_t particle_lifetime[2];
|
||||||
uint32_t initial_spawn_delay;
|
uint32_t initial_spawn_delay;
|
||||||
PartEmitterType_t type;
|
PartEmitterType_t type;
|
||||||
|
|
|
@ -74,6 +74,8 @@ int main(void)
|
||||||
.one_shot = true,
|
.one_shot = true,
|
||||||
.launch_range = {0, 360},
|
.launch_range = {0, 360},
|
||||||
.speed_range = {400, 2000},
|
.speed_range = {400, 2000},
|
||||||
|
.angle_range = {0, 360},
|
||||||
|
.rotation_range = {-10, 10},
|
||||||
.particle_lifetime = {30, 110},
|
.particle_lifetime = {30, 110},
|
||||||
.type = EMITTER_BURST,
|
.type = EMITTER_BURST,
|
||||||
};
|
};
|
||||||
|
@ -91,6 +93,8 @@ int main(void)
|
||||||
.launch_range = {45, 135},
|
.launch_range = {45, 135},
|
||||||
//.launch_range = {0, 360},
|
//.launch_range = {0, 360},
|
||||||
.speed_range = {300, 800},
|
.speed_range = {300, 800},
|
||||||
|
.angle_range = {0, 1},
|
||||||
|
.rotation_range = {0, 1},
|
||||||
.particle_lifetime = {15, 30},
|
.particle_lifetime = {15, 30},
|
||||||
.initial_spawn_delay = 5,
|
.initial_spawn_delay = 5,
|
||||||
.type = EMITTER_STREAM,
|
.type = EMITTER_STREAM,
|
||||||
|
|
|
@ -41,15 +41,17 @@ 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,%u-%u,%u,%c",
|
emitter_info_str, "%c,%f-%f,%f-%f,%f-%f,%f-%f,%u-%u,%u,%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,
|
||||||
|
conf->angle_range, conf->angle_range + 1,
|
||||||
|
conf->rotation_range, conf->rotation_range + 1,
|
||||||
conf->particle_lifetime, conf->particle_lifetime + 1,
|
conf->particle_lifetime, conf->particle_lifetime + 1,
|
||||||
&conf->initial_spawn_delay, &one_shot
|
&conf->initial_spawn_delay, &one_shot
|
||||||
);
|
);
|
||||||
|
|
||||||
if (data_count == 9)
|
if (data_count == 13)
|
||||||
{
|
{
|
||||||
conf->type = EMITTER_UNKNOWN;
|
conf->type = EMITTER_UNKNOWN;
|
||||||
if (emitter_type == 'b')
|
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');
|
conf->one_shot = (one_shot == '1');
|
||||||
}
|
}
|
||||||
return data_count == 9;
|
return data_count == 13;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline AssetInfoType_t get_asset_type(const char* str)
|
static inline AssetInfoType_t get_asset_type(const char* str)
|
||||||
|
|
Loading…
Reference in New Issue