Improve particle system

Add support for texture and rotation
scene_man
En Yi 2023-11-01 22:18:40 +08:00
parent 7c86e0b3c5
commit edf78412dc
3 changed files with 35 additions and 4 deletions

View File

@ -52,6 +52,8 @@ void add_particle_emitter(ParticleSystem_t* system, const ParticleEmitter_t* in_
emitter->particles[i].velocity.x = speed * cos(angle);
emitter->particles[i].velocity.y = speed * sin(angle);
emitter->particles[i].position = emitter->position;
emitter->particles[i].rotation = angle;
emitter->particles[i].angular_vel = -10 + 20 * (float)rand() / (float)RAND_MAX;
}
}
void update_particle_system(ParticleSystem_t* system)
@ -110,11 +112,33 @@ void draw_particle_system(ParticleSystem_t* system)
{
ParticleEmitter_t* emitter = system->emitters + emitter_idx;
for (uint32_t i = 0; i < emitter->n_particles; ++i)
Particle_t* part = emitter->particles;
for (uint32_t i = 0; i < emitter->n_particles; ++i, ++part)
{
if (emitter->particles[i].alive)
if (part->alive)
{
DrawCircleV(emitter->particles[i].position, 5, BLACK);
if (emitter->tex == NULL)
{
DrawCircleV(part->position, 5, BLACK);
}
else
{
Rectangle source = {
0.0f, 0.0f,
(float)emitter->tex->width, (float)emitter->tex->height
};
Rectangle dest = {
part->position.x, part->position.y,
(float)emitter->tex->width, (float)emitter->tex->height
};
Vector2 origin = { (float)emitter->tex->width / 2, (float)emitter->tex->height / 2 };
DrawTexturePro(
*emitter->tex,
source, dest, origin,
part->rotation, WHITE
);
}
}
}
emitter_idx = system->emitter_list[emitter_idx].next;

View File

@ -13,11 +13,11 @@ typedef enum PartEmitterType
typedef struct Particle
{
Texture2D* tex;
Vector2 position;
Vector2 velocity;
Vector2 accleration;
float rotation;
float angular_vel;
float size;
uint32_t timer;
bool alive;
@ -41,6 +41,7 @@ typedef struct ParticleEmitter
Vector2 position;
Particle_t particles[MAX_PARTICLES];
uint32_t n_particles;
Texture2D* tex;
uint32_t timer;
bool one_shot;
bool finished;

View File

@ -10,6 +10,8 @@ void simple_particle_system_update(Particle_t* part, void* user_data)
{
float delta_time = DELTA_T; // TODO: Will need to think about delta time handling
part->rotation += part->angular_vel;
part->velocity =
Vector2Add(
part->velocity,
@ -49,6 +51,7 @@ int main(void)
static ParticleSystem_t part_sys = {0};
init_particle_system(&part_sys);
Texture2D tex = LoadTexture("res/bomb.png");
EmitterConfig_t conf ={
.launch_range = {0, 360},
@ -61,6 +64,7 @@ int main(void)
.config = conf,
.n_particles = MAX_PARTICLES,
.one_shot = true,
.tex = &tex,
};
bool key_press = false;
@ -83,5 +87,7 @@ int main(void)
draw_particle_system(&part_sys);
EndDrawing();
}
UnloadTexture(tex);
CloseWindow();
deinit_particle_system(&part_sys);
}