v / examples / gg
Raw file | 63 loc (53 sloc) | 1.25 KB | Latest commit hash e81e0ac70
1import gg
2import time
3
4const pwidth = 800
5
6const pheight = 600
7
8const pbytes = 4
9
10struct AppState {
11mut:
12 gg &gg.Context = unsafe { nil }
13 istream_idx int
14 pixels [pheight][pwidth]u32
15}
16
17[direct_array_access]
18fn (mut state AppState) update() {
19 mut rcolor := u64(state.gg.frame)
20 for {
21 for y in 0 .. pheight {
22 for x in 0 .. pwidth {
23 rcolor = rcolor * 1664525 + 1013904223
24 state.pixels[y][x] = u32(rcolor & 0x0000_0000_FFFF_FFFF) | 0x1010AFFF
25 }
26 }
27 time.sleep(33 * time.millisecond)
28 }
29}
30
31fn (mut state AppState) draw() {
32 mut istream_image := state.gg.get_cached_image_by_idx(state.istream_idx)
33 istream_image.update_pixel_data(unsafe { &u8(&state.pixels) })
34 size := gg.window_size()
35 state.gg.draw_image(0, 0, size.width, size.height, istream_image)
36}
37
38// gg callbacks:
39
40fn graphics_init(mut state AppState) {
41 state.istream_idx = state.gg.new_streaming_image(pwidth, pheight, pbytes, pixel_format: .rgba8)
42}
43
44fn graphics_frame(mut state AppState) {
45 state.gg.begin()
46 state.draw()
47 state.gg.end()
48}
49
50fn main() {
51 mut state := &AppState{}
52 state.gg = gg.new_context(
53 width: 800
54 height: 600
55 create_window: true
56 window_title: 'Random Static'
57 init_fn: graphics_init
58 frame_fn: graphics_frame
59 user_data: state
60 )
61 spawn state.update()
62 state.gg.run()
63}