Files
Odin/vendor/wgpu/example/os_js.odin
2024-06-12 17:22:02 +02:00

61 lines
1.1 KiB
Odin

package vendor_wgpu_example_triangle
import "vendor:wgpu"
import "vendor:wasm/js"
OS :: struct {
initialized: bool,
}
@(private="file")
g_os: ^OS
os_init :: proc(os: ^OS) {
g_os = os
assert(js.add_window_event_listener(.Resize, nil, size_callback))
}
// NOTE: frame loop is done by the runtime.js repeatedly calling `step`.
os_run :: proc(os: ^OS) {
os.initialized = true
}
os_get_render_bounds :: proc(os: ^OS) -> (width, height: u32) {
rect := js.get_bounding_client_rect("body")
return u32(rect.width), u32(rect.height)
}
os_get_surface :: proc(os: ^OS, instance: wgpu.Instance) -> wgpu.Surface {
return wgpu.InstanceCreateSurface(
instance,
&wgpu.SurfaceDescriptor{
nextInChain = &wgpu.SurfaceDescriptorFromCanvasHTMLSelector{
sType = .SurfaceDescriptorFromCanvasHTMLSelector,
selector = "#wgpu-canvas",
},
},
)
}
@(private="file", export)
step :: proc(dt: f32) -> bool {
if !g_os.initialized {
return true
}
frame(dt)
return true
}
@(private="file", fini)
os_fini :: proc() {
js.remove_window_event_listener(.Resize, nil, size_callback)
finish()
}
@(private="file")
size_callback :: proc(e: js.Event) {
resize()
}