v2 / examples / gg / stars.v
131 lines · 122 sloc · 3.21 KB · bbb61ab3687afe512a1fa12492c876d011626107
Raw
1module main
2
3import os.asset
4import gg
5import rand
6import sokol.sgl
7
8const win_width = 800
9const win_height = 600
10const max_stars = 5000
11const max_v_letters = 5
12
13struct Star {
14mut:
15 x f32
16 y f32
17 z f32
18 r f32
19 g f32
20 b f32
21}
22
23struct VLetter {
24mut:
25 x f32
26 y f32
27 z f32
28 w f32
29 h f32
30 angle f32
31 dz f32
32 dangle f32
33}
34
35struct App {
36mut:
37 gg &gg.Context = unsafe { nil }
38 image gg.Image
39 stars []Star
40 v_letters []VLetter
41}
42
43fn main() {
44 mut app := &App{
45 stars: []Star{len: max_stars}
46 v_letters: []VLetter{len: max_v_letters}
47 }
48 app.gg = gg.new_context(
49 bg_color: gg.black
50 width: win_width
51 height: win_height
52 create_window: true
53 window_title: 'Star Vield'
54 frame_fn: frame
55 init_fn: init_images
56 user_data: app
57 )
58 for i in 0 .. max_stars {
59 app.stars[i].x = rand.f32_in_range(-200.0, 200.0) or { -200.0 }
60 app.stars[i].y = rand.f32_in_range(-200.0, 200.0) or { -200.0 }
61 app.stars[i].z = rand.f32_in_range(-200.0, -100.0) or { -200.0 }
62 app.stars[i].r = rand.f32_in_range(0.1, 1.0) or { 0.1 }
63 app.stars[i].g = rand.f32_in_range(0.1, 1.0) or { 0.1 }
64 app.stars[i].b = rand.f32_in_range(0.1, 1.0) or { 0.1 }
65 }
66 for i in 0 .. max_v_letters {
67 app.v_letters[i].x = rand.f32_in_range(-20.0, 20.0) or { -20.0 }
68 app.v_letters[i].y = rand.f32_in_range(-20.0, 20.0) or { -20.0 }
69 app.v_letters[i].z = rand.f32_in_range(-5.0, -1.0) or { -5.0 }
70 app.v_letters[i].w = rand.f32_in_range(5, 20) or { 5 }
71 app.v_letters[i].h = app.v_letters[i].w
72 app.v_letters[i].angle = rand.f32_in_range(0, 6.283184) or { 0 }
73 app.v_letters[i].dangle = rand.f32_in_range(-0.05, 0.05) or { -0.05 }
74 app.v_letters[i].dz = rand.f32_in_range(-0.1, -0.01) or { -0.1 }
75 }
76 app.gg.run()
77}
78
79fn init_images(mut app App) {
80 logo_path := asset.get_path('../assets', 'logo.png')
81 app.image = app.gg.create_image(logo_path) or { panic(err) }
82}
83
84fn frame(mut app App) {
85 app.gg.begin()
86 app.draw()
87 app.gg.end()
88}
89
90// fn C.glPointSize(size f32)
91fn (mut app App) draw() {
92 sgl.defaults()
93 sgl.perspective(sgl.rad(90), 1.0, 1.0, 100.0)
94 // C.glPointSize(3.0)
95 sgl.begin_points()
96 for i in 0 .. app.stars.len {
97 s := app.stars[i]
98 sgl.v3f_c3f(s.x, s.y, s.z, s.r, s.g, s.b)
99 app.stars[i].z += 0.3
100 if app.stars[i].z > -1.0 {
101 app.stars[i].x = rand.f32_in_range(-200.0, 200.0) or { -200.0 }
102 app.stars[i].y = rand.f32_in_range(-200.0, 200.0) or { -200.0 }
103 app.stars[i].z = rand.f32_in_range(-200.0, -100.0) or { -200.0 }
104 }
105 }
106 sgl.end()
107 // ////
108 for i in 0 .. app.v_letters.len {
109 v := app.v_letters[i]
110 sgl.defaults()
111 sgl.perspective(sgl.rad(90), 1.0, 1.0, 100.0)
112 sgl.rotate(v.angle, 0, 0, 1)
113 app.gg.draw_image_3d(v.x, v.y, v.z, v.w, v.h, app.image)
114 //
115 app.v_letters[i].z += app.v_letters[i].dz
116 app.v_letters[i].angle += app.v_letters[i].dangle
117 if app.v_letters[i].z > -60.0 {
118 app.v_letters[i].x += rand.f32_in_range(-0.05, 0.05) or { -0.05 }
119 app.v_letters[i].y += rand.f32_in_range(-0.05, 0.05) or { -0.05 }
120 }
121 if app.v_letters[i].z < -95.0 {
122 app.v_letters[i].h *= 0.8
123 app.v_letters[i].w *= 0.8
124 }
125 if app.v_letters[i].z < -100.0 {
126 app.v_letters[i].z = rand.f32_in_range(-5.0, -1.0) or { -5.0 }
127 app.v_letters[i].h = 10.0
128 app.v_letters[i].w = 10.0
129 }
130 }
131}
132