diff options
Diffstat (limited to 'v_windows/v/examples/sokol/particles/modules/particle/system.v')
-rw-r--r-- | v_windows/v/examples/sokol/particles/modules/particle/system.v | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/v_windows/v/examples/sokol/particles/modules/particle/system.v b/v_windows/v/examples/sokol/particles/modules/particle/system.v new file mode 100644 index 0000000..4f0382b --- /dev/null +++ b/v_windows/v/examples/sokol/particles/modules/particle/system.v @@ -0,0 +1,99 @@ +// 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 particle.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 := new(vec2.Vec2{f32(s.width) * 0.5, f32(s.height) * 0.5}) + s.bin << 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 i in 0 .. s.pool.len { + mut p := s.pool[i] + p.reset() + p.life_time = 0 + } + for i in 0 .. s.bin.len { + mut p := s.pool[i] + 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() +} |