1 module examples.user_data;
2 
3 private:
4 
5 import sg = sokol.gfx;
6 import sapp = sokol.app;
7 import log = sokol.log;
8 import sglue = sokol.glue;
9 
10 extern (C):
11 
12 struct ExampleUserData
13 {
14     ubyte data;
15     int[ubyte] map; // need druntime
16 }
17 
18 void init() @safe
19 {
20     sg.Desc gfx = {
21         environment: sglue.environment,
22         logger: {func: &log.slog_func}
23     };
24     sg.setup(gfx);
25 }
26 
27 void frame_userdata(scope void* userdata) @trusted
28 {
29     auto state = cast(ExampleUserData*) userdata;
30 
31     state.data++;
32     version (WebAssembly)
33     {
34         // TODO support
35     }
36     else
37     {
38         if (state.data % 13 == 0)
39         {
40             state.map[state.data] = state.data * 13 / 3;
41         }
42         if (state.data % 12 == 0 && state.data % 15 == 0)
43         {
44             state.map.clear();
45         }
46         debug
47         {
48             import std.stdio : writeln;
49 
50             try
51             {
52                 foreach (k, v; state.map)
53                 {
54                     writeln("ExampleUserData[", k, "] = ", v);
55                 }
56             }
57             catch (Exception)
58             {
59             }
60         }
61     }
62 
63     sg.Pass pass = {swapchain: sglue.swapchain};
64     sg.beginPass(pass);
65     sg.endPass();
66     sg.commit();
67 }
68 
69 void cleanup() @safe
70 {
71     sg.shutdown();
72 }
73 
74 void main()
75 {
76     auto userData = ExampleUserData(0, null);
77     sapp.Desc runner = {
78         window_title: "user-data.d",
79         init_cb: &init,
80         frame_userdata_cb: &frame_userdata,
81         cleanup_cb: &cleanup,
82         user_data: &userData,
83         width: 640,
84         height: 480,
85         sample_count: 4,
86         win32: {console_attach: true},
87         icon: {sokol_default: true},
88         logger: {func: &log.func}
89     };
90     sapp.run(runner);
91 }
92 
93 version (WebAssembly)
94 {
95     debug
96     {
97         import emscripten.assertd;
98     }
99 }