package main import "core:math/rand" import "core:time" import "zephr" Particle :: struct { pos: zephr.Vec2, vel: zephr.Vec2, color: zephr.Color, size: f32, life: time.Duration, } ParticleEmitter :: struct { pos: zephr.Vec2, particles: [dynamic]Particle, duration: time.Duration, spawn_rate: u32, } @private last_emitted_particle_idx: int = 0 // restricts emission rate to 60fps @private particle_time: time.Duration = 0 @private update_particles :: proc(delta_t: time.Duration, particles: ^[dynamic]Particle, start_pos: zephr.Vec2) { delta_t_f := cast(f32)time.duration_seconds(delta_t) for p in particles { p.life -= delta_t if p.life <= 0 { continue } // NOTE: fades faster on higher framerates. don't feel like fixing it p.color.a -= 1 p.size -= delta_t_f p.vel.x += (p.pos.x + p.vel.x / 7) * delta_t_f p.vel.y -= (p.pos.y + p.vel.y / 7) * delta_t_f p.pos += p.vel * -delta_t_f } } @private find_first_dead_particle :: proc(particles: [dynamic]Particle) -> int { // search from last emitted particle, should return almost immediately for i in last_emitted_particle_idx.. 0 { emitter.duration -= delta_t if emitter.duration <= 0 { return } particle_time += delta_t for particle_time >= time.Millisecond * 16 { for i in 0..