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 }