v2 / examples / pendulum-simulation / modules / sim / anim / app.v
64 lines · 55 sloc · 1.3 KB · bbb61ab3687afe512a1fa12492c876d011626107
Raw
1module anim
2
3import gg
4import sim
5import sim.args as simargs
6
7const bg_color = gg.white
8
9struct Pixel {
10 x f32
11 y f32
12 color gg.Color
13}
14
15pub struct App {
16pub:
17 args simargs.ParallelArgs
18 request_chan chan &sim.SimRequest
19 result_chan chan &sim.SimResult
20pub mut:
21 gg &gg.Context = unsafe { nil }
22 iidx int
23 pixels []u32
24}
25
26pub fn new_app(args simargs.ParallelArgs) &App {
27 total_pixels := args.grid.height * args.grid.width
28
29 mut app := &App{
30 args: args
31 pixels: []u32{len: total_pixels}
32 request_chan: chan &sim.SimRequest{cap: args.grid.width}
33 }
34 app.gg = gg.new_context(
35 width: args.grid.width
36 height: args.grid.height
37 create_window: true
38 window_title: 'V Pendulum Simulation'
39 user_data: app
40 bg_color: bg_color
41 frame_fn: frame
42 init_fn: init
43 )
44 return app
45}
46
47fn init(mut app App) {
48 app.iidx = app.gg.new_streaming_image(app.args.grid.width, app.args.grid.height, 4,
49 pixel_format: .rgba8
50 )
51 spawn pixels_worker(mut app)
52}
53
54fn frame(mut app App) {
55 app.gg.begin()
56 app.draw()
57 app.gg.end()
58}
59
60fn (mut app App) draw() {
61 mut istream_image := app.gg.get_cached_image_by_idx(app.iidx)
62 istream_image.update_pixel_data(unsafe { &u8(&app.pixels[0]) })
63 app.gg.draw_image(0, 0, app.args.grid.width, app.args.grid.height, istream_image)
64}
65