// Copyright(C) 2019 Lars Pontoppidan. All rights reserved. // Use of this source code is governed by an MIT license file distributed with this software package module particle import vec2 import rand import sokol.sgl pub struct SystemConfig { pool int } pub struct System { width int height int mut: pool []&Particle bin []&Particle } pub fn (mut s System) init(sc SystemConfig) { for i := 0; i < sc.pool; i++ { p := particle.new( vec2.Vec2{f32(s.width)*0.5, f32(s.height)*0.5} ) s.pool << p } } pub fn (mut s System) update(dt f64) { mut p := &Particle(0) for i := 0; i < s.pool.len; i++ { p = s.pool[i] p.update(dt) if p.is_dead() { s.bin << p s.pool.delete(i) } } } pub fn (s System) draw() { sgl.begin_quads() for p in s.pool { p.draw() } sgl.end() } pub fn (mut s System) reset() { for p in s.pool { p.reset() p.life_time = 0 } for p_ in s.bin { p_.reset() p_.life_time = 0 } } pub fn (mut s System) explode(x f32, y f32) { mut reserve := 500 center := vec2.Vec2{x,y} mut p := &Particle(0) for i := 0; i < s.bin.len && reserve > 0; i++ { p = s.bin[i] p.reset() p.location.from(center) p.acceleration = vec2.Vec2{rand.f32_in_range(-0.5,0.5),rand.f32_in_range(-0.5,0.5)} p.velocity = vec2.Vec2{rand.f32_in_range(-0.5,0.5),rand.f32_in_range(-0.5,0.5)} p.life_time = rand.f64_in_range(500,2000) s.pool << p s.bin.delete(i) reserve-- } } pub fn (mut s System) free() { for p in s.pool { if p == 0 { print(ptr_str(p)+' ouch') continue } unsafe{ free(p) } } s.pool.clear() for p in s.bin { if p == 0 { print(ptr_str(p)+' ouch') continue } unsafe{ //println('Freeing from bin') free(p) } } s.bin.clear() }