v / examples / gg
Raw file | 135 loc (126 sloc) | 3.19 KB | Latest commit hash 8b962f844
1module main
2
3import os
4import gg
5import gx
6import rand
7import sokol.sgl
8
9const (
10 win_width = 800
11 win_height = 600
12 max_stars = 5000
13 max_v_letters = 5
14)
15
16struct Star {
17mut:
18 x f32
19 y f32
20 z f32
21 r f32
22 g f32
23 b f32
24}
25
26struct VLetter {
27mut:
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
38struct App {
39mut:
40 gg &gg.Context = unsafe { nil }
41 image gg.Image
42 stars []Star
43 v_letters []VLetter
44}
45
46fn 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
83fn 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
88fn frame(mut app App) {
89 app.gg.begin()
90 app.draw()
91 app.gg.end()
92}
93
94// fn C.glPointSize(size f32)
95fn (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}