diff options
author | Indrajith K L | 2022-12-03 17:00:20 +0530 |
---|---|---|
committer | Indrajith K L | 2022-12-03 17:00:20 +0530 |
commit | f5c4671bfbad96bf346bd7e9a21fc4317b4959df (patch) | |
tree | 2764fc62da58f2ba8da7ed341643fc359873142f /v_windows/v/examples/sokol/particles/modules/particle | |
download | cli-tools-windows-f5c4671bfbad96bf346bd7e9a21fc4317b4959df.tar.gz cli-tools-windows-f5c4671bfbad96bf346bd7e9a21fc4317b4959df.tar.bz2 cli-tools-windows-f5c4671bfbad96bf346bd7e9a21fc4317b4959df.zip |
Diffstat (limited to 'v_windows/v/examples/sokol/particles/modules/particle')
7 files changed, 302 insertions, 0 deletions
diff --git a/v_windows/v/examples/sokol/particles/modules/particle/LICENSE b/v_windows/v/examples/sokol/particles/modules/particle/LICENSE new file mode 100644 index 0000000..1595a57 --- /dev/null +++ b/v_windows/v/examples/sokol/particles/modules/particle/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Lars Pontoppidan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/v_windows/v/examples/sokol/particles/modules/particle/color.v b/v_windows/v/examples/sokol/particles/modules/particle/color.v new file mode 100644 index 0000000..535e48a --- /dev/null +++ b/v_windows/v/examples/sokol/particles/modules/particle/color.v @@ -0,0 +1,12 @@ +// 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 + +// * Color +pub struct Color { +mut: + r byte + g byte + b byte + a byte +} diff --git a/v_windows/v/examples/sokol/particles/modules/particle/particle.v b/v_windows/v/examples/sokol/particles/modules/particle/particle.v new file mode 100644 index 0000000..ac172b9 --- /dev/null +++ b/v_windows/v/examples/sokol/particles/modules/particle/particle.v @@ -0,0 +1,81 @@ +// 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 sokol.sgl + +const ( + default_life_time = 1000 + default_v_color = Color{93, 136, 193, 255} +) + +// * Module public +pub fn new(location vec2.Vec2) &Particle { + p := &Particle{ + location: location + velocity: vec2.Vec2{0, 0} + acceleration: vec2.Vec2{0, 0} + color: particle.default_v_color + life_time: particle.default_life_time + life_time_init: particle.default_life_time + } + return p +} + +fn remap(v f64, min f64, max f64, new_min f64, new_max f64) f64 { + return (((v - min) * (new_max - new_min)) / (max - min)) + new_min +} + +// Particle +pub struct Particle { +mut: + location vec2.Vec2 + velocity vec2.Vec2 + acceleration vec2.Vec2 + color Color + life_time f64 + life_time_init f64 +} + +pub fn (mut p Particle) update(dt f64) { + mut acc := p.acceleration + acc.multiply_f64(dt) + p.velocity = p.velocity.add(acc) + p.location = p.location.add(p.velocity) + lt := p.life_time - (1000 * dt) + if lt > 0 { + p.life_time = lt + p.color.r = p.color.r - 1 // byte(remap(p.life_time,0.0,p.life_time_init,0,p.color.r)) + p.color.g = p.color.g - 1 // byte(remap(p.life_time,0.0,p.life_time_init,0,p.color.g)) + p.color.b = p.color.b - 1 // byte(remap(p.life_time,0.0,p.life_time_init,0,p.color.b)) + p.color.a = byte(int(remap(p.life_time, 0.0, p.life_time_init, 0, 255))) - 10 + } else { + p.life_time = 0 + } +} + +pub fn (p Particle) is_dead() bool { + return p.life_time <= 0.0 +} + +pub fn (p Particle) draw() { + l := p.location + sgl.c4b(p.color.r, p.color.g, p.color.b, p.color.a) + lx := f32(l.x) + ly := f32(l.y) + sgl.v2f(lx, ly) + sgl.v2f(lx + 2, ly) + sgl.v2f(lx + 2, ly + 2) + sgl.v2f(lx, ly + 2) +} + +pub fn (mut p Particle) reset() { + p.location.zero() + p.acceleration.zero() + p.velocity.zero() + // p.color = Color{93, 136, 193, 255} + p.color = particle.default_v_color + p.life_time = particle.default_life_time + p.life_time_init = p.life_time +} 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() +} diff --git a/v_windows/v/examples/sokol/particles/modules/particle/v.mod b/v_windows/v/examples/sokol/particles/modules/particle/v.mod new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/v_windows/v/examples/sokol/particles/modules/particle/v.mod diff --git a/v_windows/v/examples/sokol/particles/modules/particle/vec2/v.mod b/v_windows/v/examples/sokol/particles/modules/particle/vec2/v.mod new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/v_windows/v/examples/sokol/particles/modules/particle/vec2/v.mod diff --git a/v_windows/v/examples/sokol/particles/modules/particle/vec2/vec2.v b/v_windows/v/examples/sokol/particles/modules/particle/vec2/vec2.v new file mode 100644 index 0000000..ec41485 --- /dev/null +++ b/v_windows/v/examples/sokol/particles/modules/particle/vec2/vec2.v @@ -0,0 +1,89 @@ +// 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 vec2 + +pub struct Vec2 { +pub mut: + x f64 + y f64 +} + +pub fn (mut v Vec2) zero() { + v.x = 0.0 + v.y = 0.0 +} + +pub fn (mut v Vec2) from(src Vec2) { + v.x = src.x + v.y = src.y +} + +// * Addition +// + operator overload. Adds two vectors +pub fn (v1 Vec2) + (v2 Vec2) Vec2 { + return Vec2{v1.x + v2.x, v1.y + v2.y} +} + +pub fn (v Vec2) add(vector Vec2) Vec2 { + return Vec2{v.x + vector.x, v.y + vector.y} +} + +pub fn (v Vec2) add_f64(scalar f64) Vec2 { + return Vec2{v.x + scalar, v.y + scalar} +} + +pub fn (mut v Vec2) plus(vector Vec2) { + v.x += vector.x + v.y += vector.y +} + +pub fn (mut v Vec2) plus_f64(scalar f64) { + v.x += scalar + v.y += scalar +} + +// * Subtraction +pub fn (v1 Vec2) - (v2 Vec2) Vec2 { + return Vec2{v1.x - v2.x, v1.y - v2.y} +} + +pub fn (v Vec2) sub(vector Vec2) Vec2 { + return Vec2{v.x - vector.x, v.y - vector.y} +} + +pub fn (v Vec2) sub_f64(scalar f64) Vec2 { + return Vec2{v.x - scalar, v.y - scalar} +} + +pub fn (mut v Vec2) subtract(vector Vec2) { + v.x -= vector.x + v.y -= vector.y +} + +pub fn (mut v Vec2) subtract_f64(scalar f64) { + v.x -= scalar + v.y -= scalar +} + +// * Multiplication +pub fn (v1 Vec2) * (v2 Vec2) Vec2 { + return Vec2{v1.x * v2.x, v1.y * v2.y} +} + +pub fn (v Vec2) mul(vector Vec2) Vec2 { + return Vec2{v.x * vector.x, v.y * vector.y} +} + +pub fn (v Vec2) mul_f64(scalar f64) Vec2 { + return Vec2{v.x * scalar, v.y * scalar} +} + +pub fn (mut v Vec2) multiply(vector Vec2) { + v.x *= vector.x + v.y *= vector.y +} + +pub fn (mut v Vec2) multiply_f64(scalar f64) { + v.x *= scalar + v.y *= scalar +} |