added main loop
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 16 Feb 2021 22:39:16 +0000 (16:39 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 16 Feb 2021 22:39:16 +0000 (16:39 -0600)
dist/index.js
src/events.onyx
src/prez.onyx

index 60eb8b4e68813502e612a75880107a64def73dcc..1877084bb9df9d2098a5f64c9089bb67a403d874 100644 (file)
@@ -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,
index 5dd66316fafe0841a13034f980587c47e8165033..543486f361c83f3f0a527ce33fb1af3006891268 100644 (file)
@@ -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
index 0ccc2636d18eda2dad7e929b487970716be2fe81..9703b200ede47e4dd233bdff322be132921588b5 100644 (file)
@@ -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();
 }