scrolling background; better background tiling
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 7 Jul 2021 18:07:31 +0000 (13:07 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 7 Jul 2021 18:07:31 +0000 (13:07 -0500)
res/images/background_tile.data [new file with mode: 0644]
src/build.onyx
src/key_handler.onyx [new file with mode: 0644]
src/main.onyx

diff --git a/res/images/background_tile.data b/res/images/background_tile.data
new file mode 100644 (file)
index 0000000..ea5ef21
--- /dev/null
@@ -0,0 +1 @@
+µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµìììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììì
\ No newline at end of file
index 50c527a1b8836b5c3d1e2e3b985d8f74f34f4450..98c6cc32a2c5700b7b3ccbe955eea671ae45da2d 100644 (file)
@@ -13,6 +13,7 @@
     #load "modules/bmfont/module"
 
     #load "src/main"
+    #load "src/key_handler"
 }
 
 #if (package runtime).Runtime == (package runtime).Runtime_Wasi {
diff --git a/src/key_handler.onyx b/src/key_handler.onyx
new file mode 100644 (file)
index 0000000..0442386
--- /dev/null
@@ -0,0 +1,49 @@
+
+#private_file events :: package js_events
+
+Key_Count :: 256
+
+Key_State :: enum (u8) {
+    Up;
+    Down;
+    Just_Up;
+    Just_Down;
+}
+
+Key_Handler :: struct {
+    state : [Key_Count] Key_State;
+}
+
+key_handler_notify :: (use handler: ^Key_Handler, event: ^events.KeyboardEvent) {
+    transition_table :: Key_State.[
+                    /* KeyUp */   /* KeyDown */
+        /* Up */        .Up,       .Just_Down,
+        /* Down */      .Just_Up,  .Down,
+        /* Just_Up */   .Up,       .Just_Down,
+        /* Just_Down */ .Just_Up,  .Down,
+    ]
+
+    event_idx := 0 if event.kind == .KeyUp else 1;
+
+    state[event.keycode] = transition_table[cast(i32) state[event.keycode] * 2 + event_idx];
+}
+
+key_handler_is_down :: (use handler: ^Key_Handler, keycode: u32) -> bool {
+    ks := state[keycode];
+    return ks == .Down || ks == .Just_Down;
+}
+
+key_handler_is_up :: (use handler: ^Key_Handler, keycode: u32) -> bool {
+    ks := state[keycode];
+    return ks == .Up || ks == .Just_Up;
+}
+
+key_handler_just_down :: (use handler: ^Key_Handler, keycode: u32) -> bool {
+    ks := state[keycode];
+    return ks == .Just_Down;
+}
+
+key_handler_just_up :: (use handler: ^Key_Handler, keycode: u32) -> bool {
+    ks := state[keycode];
+    return ks == .Just_Up;
+}
index 3bb5e625f8f658f5cec2a0292792aa80b4070537..cc2494d10730c2e6b42d2059c507f116f089ce8a 100644 (file)
@@ -7,6 +7,10 @@ use package core
 #private_file ui     :: package ui
 #private_file config :: package config
 
+keys : Key_Handler;
+
+background_tile_texture : gfx.Texture;
+
 main :: (args: [] cstr) {
     init();
 
@@ -22,9 +26,23 @@ init :: () {
 
     ui.init_ui();
 
+    search_buffer = string.buffer_make(memory.make_slice(u8, 256));
+
     gl.enable(gl.BLEND);
     gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
 
+    {
+        background_tile_texture = gfx.load_texture(32, 32, #file_contents "res/images/background_tile.data", gl.RGB, gl.RGB);
+        gl.bindTexture(gl.TEXTURE_2D, background_tile_texture.texture);
+
+        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
+        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
+
+        gl.bindTexture(gl.TEXTURE_2D, -1);
+    }
+
     load_colors :: () {
         json :: package json
 
@@ -128,6 +146,8 @@ poll_events :: () -> bool {
                 } else {
                     ui.key_up(event.keyboard.keycode, modifiers);    @KeycodeIsWrong // see above
                 }
+
+                key_handler_notify(^keys, ^event.keyboard);
             }
 
             case .Resize {
@@ -144,6 +164,34 @@ poll_events :: () -> bool {
 }
 
 update :: (dt: f32) {
+    speed :: 200.0f;
+    scale_speed :: 0.02f;
+
+    transform := gfx.global_renderer->get_transform();
+    if key_handler_is_down(^keys, 38)  do transform.translation.y += speed * dt;
+    if key_handler_is_down(^keys, 40)  do transform.translation.y -= speed * dt;
+    if key_handler_is_down(^keys, 39)  do transform.translation.x -= speed * dt;
+    if key_handler_is_down(^keys, 37)  do transform.translation.x += speed * dt;
+    if key_handler_is_down(^keys, 187) {
+        transform.translation.x += ~~(window_width / 2) * transform.scale.x;
+        transform.translation.y += ~~(window_height / 2) * transform.scale.y;
+
+        transform.scale.x *= 1 + scale_speed;
+        transform.scale.y *= 1 + scale_speed;
+
+        transform.translation.x -= ~~(window_width / 2) * transform.scale.x;
+        transform.translation.y -= ~~(window_height / 2) * transform.scale.y;
+    }
+    if key_handler_is_down(^keys, 189) {
+        transform.translation.x += ~~(window_width / 2) * transform.scale.x;
+        transform.translation.y += ~~(window_height / 2) * transform.scale.y;
+
+        transform.scale.x /= 1 + scale_speed;
+        transform.scale.y /= 1 + scale_speed;
+
+        transform.translation.x -= ~~(window_width / 2) * transform.scale.x;
+        transform.translation.y -= ~~(window_height / 2) * transform.scale.y;
+    }
 }
 
 draw :: () {
@@ -153,13 +201,28 @@ draw :: () {
 
     window_rectangle := ui.Rectangle.{ 0, 0, ~~window_width, ~~window_height };
 
-    draw_background_lines(~~window_width, ~~window_height, 0, 0, line_color=config.Colors.dark_background);
+    draw_background_lines(~~window_width, ~~window_height, line_color=config.Colors.background);
+
+    random.set_seed(32185);
+    for i: 100 {
+        x := cast(f32) random.between(0, 4000);
+        y := cast(f32) random.between(0, 4000);
+        w := cast(f32) random.between(100, 400);
+        h := cast(f32) random.between(100, 400);
+        gfx.rect(.{ x, y }, .{ w, h }, color=config.Colors.primary);
+    }
+
+    gfx.push_matrix();
+    gfx.identity();
     draw_menu_bar(window_rectangle);
+    gfx.pop_matrix();
 
     gfx.flush();
     ui.clear_buttons();
 }
 
+search_buffer: string.String_Buffer;
+
 #private_file
 draw_menu_bar :: (window_rectangle: ui.Rectangle) {
     menu_bar, _ := ui.Flow.split_horizontal(window_rectangle, top_height=32);
@@ -170,6 +233,10 @@ draw_menu_bar :: (window_rectangle: ui.Rectangle) {
     menu_button_theme.border_width = 2;
     menu_button_theme.font_size = .9;
 
+    menu_textbox_theme := ui.default_textbox_theme;
+    menu_textbox_theme.border_width = 2;
+    menu_textbox_theme.font_size = .9;
+
     button_rect : ui.Rectangle;
 
     button_rect, menu_bar = ui.Flow.split_vertical(menu_bar, left_width=100);
@@ -180,33 +247,26 @@ draw_menu_bar :: (window_rectangle: ui.Rectangle) {
     ui.button(button_rect, "View", theme=^menu_button_theme);
     button_rect, menu_bar = ui.Flow.split_vertical(menu_bar, left_width=100);
     ui.button(button_rect, "Help", theme=^menu_button_theme);
+
+    search_rect: ui.Rectangle;
+    menu_bar, search_rect = ui.Flow.split_vertical(menu_bar, right_width=300);
+    ui.textbox(search_rect, ^search_buffer, theme=^menu_textbox_theme);
 }
 
 #private_file
-draw_background_lines :: (width: f32, height: f32, offset_x: f32, offset_y: f32, line_color := gfx.Color4.{0.2, 0.2, 0.2}, line_spacing := 32.0f) {
+draw_background_lines :: (width: f32, height: f32, line_color := gfx.Color4.{0.2, 0.2, 0.2}, line_spacing := 32.0f) {
     gl :: package gl
 
-    gfx.set_mode(.Lines);
-    gfx.set_texture();
-    gl.lineWidth(4);
-
-    // "Modulus" to the nearest (-line_spacing, line_spacing) for both x and y.
-    offset_x /= line_spacing;
-    offset_y /= line_spacing;
-    offset_x = line_spacing * (offset_x - math.trunc(offset_x));
-    offset_y = line_spacing * (offset_y - math.trunc(offset_y));
-
-    for i: cast(i32) (math.ceil(width / line_spacing)) + 1 {
-        x := offset_x + ~~i * line_spacing;
-        gfx.vertex(.{ x, 0 }, line_color);
-        gfx.vertex(.{ x, height }, line_color);
-    }
-
-    for i: cast(i32) (math.ceil(height / line_spacing)) + 1 {
-        y := offset_y + ~~i * line_spacing;
-        gfx.vertex(.{ 0, y }, line_color);
-        gfx.vertex(.{ width, y }, line_color);
-    }
-
-    gfx.set_mode(.Triangles);
+    trans := gfx.global_renderer->get_transform();
+    sx    := trans.scale.x * line_spacing;
+    sy    := trans.scale.y * line_spacing;
+    tx    := -trans.translation.x / sx;
+    ty    := -trans.translation.y / sy;
+
+    gfx.push_matrix();
+    gfx.identity();
+    gfx.set_texture(^background_tile_texture);
+    gfx.textured_rect(.{ 0, 0 }, .{ width, height }, .{ tx, ty }, .{ width / sx, height / sy }, color=line_color); 
+    gfx.set_texture(); 
+    gfx.pop_matrix();
 }