From: Brendan Hansen Date: Tue, 16 Feb 2021 22:39:16 +0000 (-0600) Subject: added main loop X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=4f869d6dde4728e31be7a451b4a734d0a4f7eb18;p=onyx-prez.git added main loop --- diff --git a/dist/index.js b/dist/index.js index 60eb8b4..1877084 100644 --- a/dist/index.js +++ b/dist/index.js @@ -90,6 +90,11 @@ let canvas_import_obj = { get_width(canvas) { return canvasElem.width; }, get_height(canvas) { return canvasElem.height; }, + set_size(canvas, width, height) { + canvasElem.width = width; + canvasElem.height = height; + }, + setFont(canvas, font_name, font_length) { const data = new Uint8Array(wasm_instance.exports.memory.buffer, font_name, font_length); const str = new TextDecoder().decode(data); @@ -135,7 +140,16 @@ let import_obj = { console.log(str); }, - exit(status) { console.warn("Attempted to call host.exit()."); } + exit(status) { console.warn("Attempted to call host.exit()."); }, + + start_loop() { + let loop = () => { + wasm_instance.exports.loop(); + window.requestAnimationFrame(loop); + }; + + window.requestAnimationFrame(loop); + }, }, canvas: canvas_import_obj, diff --git a/src/events.onyx b/src/events.onyx index 5dd6631..543486f 100644 --- a/src/events.onyx +++ b/src/events.onyx @@ -1,8 +1,3 @@ -// This is a simple buffered system to receive events from the webbrowser -// in a buffer that you can poll and consume all of the events. It is not -// direclty used by the immediate mode graphics, but it makes standing up -// a simple application much easier. - package event #private_file Num_Buffered_Events :: 16 diff --git a/src/prez.onyx b/src/prez.onyx index 0ccc263..9703b20 100644 --- a/src/prez.onyx +++ b/src/prez.onyx @@ -10,15 +10,18 @@ Canvas :: struct { get_width :: (handle: Handle) -> u32 #foreign "canvas" "get_width" --- get_height :: (handle: Handle) -> u32 #foreign "canvas" "get_height" --- + set_size :: (handle: Handle, width: u32, height: u32) -> void #foreign "canvas" "set_size" --- + set_font :: (handle: Handle, font_name: str) -> u32 #foreign "canvas" "setFont" --- TextMetrics :: struct { - width: f32; + width : f32; + box : Box; - box: struct { + Box :: struct { left, right : f32; top, bottom : f32; - }; + } } measure_text :: (handle: Handle, text: str, measurements: ^TextMetrics) -> void #foreign "canvas" "measureText" --- @@ -57,14 +60,42 @@ draw_centered_text :: (text: str, y_baseline: f32) { fill_text(canvas, text, x, y_baseline); } +dirty_display := true + poll_events :: () { - use event.DomEventKind; + use event.DomEventKind ev: event.Event; while event.poll(^ev) do switch ev.kind { case Resize { - printf("New window size: %i, %i", ev.resize.width, ev.resize.height); + printf("New window size: %i, %i\n", ev.resize.width, ev.resize.height); + dirty_display = true; + + use Canvas; + set_size(canvas, ev.resize.width, ev.resize.height); } + + case MouseDown { + printf("Mouse down: %i, %i\n", ev.mouse.pos_x, ev.mouse.pos_y); + + use Canvas + fill_rect(canvas, ~~ ev.mouse.pos_x, ~~ ev.mouse.pos_y, 32, 32, 1, 0, 0); + } + } +} + +loop :: () -> void #export "loop" { + poll_events(); + + if dirty_display { + dirty_display = false; + + Canvas.clear(canvas, 0.1, 0.1, 0.1); + Canvas.set_font(canvas, "bold 72px Arial"); + draw_centered_text("Hello, World! This is a long title!", 100); + + Canvas.set_font(canvas, "bold 48px Arial"); + draw_centered_text("This is some more text.", 170); } } @@ -72,7 +103,6 @@ main :: (args: [] cstr) { setup_canvas(); event.init(); - draw_centered_text("Hello, World! This is a long title!", 100); - - poll_events(); + start_loop :: () -> void #foreign "host" "start_loop" --- + start_loop(); }