From: Brendan Hansen Date: Wed, 7 Jul 2021 18:07:31 +0000 (-0500) Subject: scrolling background; better background tiling X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=6932ef4cd7328fd7cb286579ba27dedc298a126b;p=onyx-wasm-analyzer.git scrolling background; better background tiling --- diff --git a/res/images/background_tile.data b/res/images/background_tile.data new file mode 100644 index 0000000..ea5ef21 --- /dev/null +++ b/res/images/background_tile.data @@ -0,0 +1 @@ +µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììµµµµµµìììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììì \ No newline at end of file diff --git a/src/build.onyx b/src/build.onyx index 50c527a..98c6cc3 100644 --- a/src/build.onyx +++ b/src/build.onyx @@ -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 index 0000000..0442386 --- /dev/null +++ b/src/key_handler.onyx @@ -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; +} diff --git a/src/main.onyx b/src/main.onyx index 3bb5e62..cc2494d 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -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(); }