os_js.odin 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package vendor_wgpu_example_triangle
  2. import "vendor:wgpu"
  3. import "vendor:wasm/js"
  4. OS :: struct {
  5. initialized: bool,
  6. }
  7. @(private="file")
  8. g_os: ^OS
  9. os_init :: proc(os: ^OS) {
  10. g_os = os
  11. assert(js.add_window_event_listener(.Resize, nil, size_callback))
  12. }
  13. // NOTE: frame loop is done by the runtime.js repeatedly calling `step`.
  14. os_run :: proc(os: ^OS) {
  15. os.initialized = true
  16. }
  17. os_get_render_bounds :: proc(os: ^OS) -> (width, height: u32) {
  18. rect := js.get_bounding_client_rect("body")
  19. return u32(rect.width), u32(rect.height)
  20. }
  21. os_get_surface :: proc(os: ^OS, instance: wgpu.Instance) -> wgpu.Surface {
  22. return wgpu.InstanceCreateSurface(
  23. instance,
  24. &wgpu.SurfaceDescriptor{
  25. nextInChain = &wgpu.SurfaceDescriptorFromCanvasHTMLSelector{
  26. sType = .SurfaceDescriptorFromCanvasHTMLSelector,
  27. selector = "#wgpu-canvas",
  28. },
  29. },
  30. )
  31. }
  32. @(private="file", export)
  33. step :: proc(dt: f32) -> bool {
  34. if !g_os.initialized {
  35. return true
  36. }
  37. frame(dt)
  38. return true
  39. }
  40. @(private="file", fini)
  41. os_fini :: proc() {
  42. js.remove_window_event_listener(.Resize, nil, size_callback)
  43. finish()
  44. }
  45. @(private="file")
  46. size_callback :: proc(e: js.Event) {
  47. resize()
  48. }