aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/sokol/particles/modules/particle/system.v
diff options
context:
space:
mode:
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.v99
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()
+}