aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/sokol/particles/modules/particle/system.v
blob: 4f0382beffc5ef8a862c2a0757353d83494623cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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()
}