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