--- /dev/null
+
+#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;
+}
#private_file ui :: package ui
#private_file config :: package config
+keys : Key_Handler;
+
+background_tile_texture : gfx.Texture;
+
main :: (args: [] cstr) {
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
} else {
ui.key_up(event.keyboard.keycode, modifiers); @KeycodeIsWrong // see above
}
+
+ key_handler_notify(^keys, ^event.keyboard);
}
case .Resize {
}
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 :: () {
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);
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);
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();
}