61 lines
1.2 KiB
Odin
61 lines
1.2 KiB
Odin
package main
|
|
|
|
import "core:rexcode/isa/x86/tablegen/generated"
|
|
import rl "vendor:raylib"
|
|
|
|
Particle :: union {
|
|
SpriteParticle,
|
|
LineParticle,
|
|
}
|
|
|
|
SpriteParticle :: struct {
|
|
pos: rl.Vector2,
|
|
texture: rl.Texture2D,
|
|
tint: rl.Color,
|
|
lifetime: f32,
|
|
}
|
|
LineParticle :: struct {
|
|
pos1: rl.Vector2,
|
|
pos2: rl.Vector2,
|
|
tint: rl.Color,
|
|
lifetime: f32,
|
|
}
|
|
|
|
particles: [dynamic]Particle
|
|
|
|
spawn_particle :: proc(particle: Particle) {
|
|
append(&particles, particle)
|
|
}
|
|
|
|
run_particle_system :: proc() {
|
|
for &p, i in particles {
|
|
draw_particle(&p, i)
|
|
}
|
|
}
|
|
|
|
draw_particle :: proc(particle: ^Particle, index: int) {
|
|
switch &p in particle {
|
|
case SpriteParticle:
|
|
draw_sprite_particle(&p, index)
|
|
|
|
case LineParticle:
|
|
draw_line_particle(&p, index)
|
|
}
|
|
}
|
|
|
|
draw_sprite_particle :: proc(particle: ^SpriteParticle, index: int) {
|
|
rl.DrawTexture(particle.texture, i32(particle.pos.x), i32(particle.pos.y), particle.tint)
|
|
particle.lifetime -= rl.GetFrameTime()
|
|
if particle.lifetime <= 0 {
|
|
particles[index] = nil
|
|
}
|
|
}
|
|
|
|
draw_line_particle :: proc(particle: ^LineParticle, index: int) {
|
|
rl.DrawLineV(particle.pos1, particle.pos2, particle.tint)
|
|
particle.lifetime -= rl.GetFrameTime()
|
|
if particle.lifetime <= 0 {
|
|
particles[index] = nil
|
|
}
|
|
}
|