Add angle and rotation range for particle system

scene_man
En Yi 2023-11-22 23:18:08 +08:00
parent 26eeec5638
commit 05e58677a5
4 changed files with 28 additions and 11 deletions

View File

@ -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;
;

View File

@ -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;

View File

@ -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,

View File

@ -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)