From b5f239081ef74e78c4a6b04869b934ebfc8bda28 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 4 Mar 2022 15:16:32 -0600 Subject: [PATCH] improving the editor --- run_tree/scenes/level1.scene | 579 +++++++++++++++++++++++++++ run_tree/scenes/quick_save_new.scene | 54 ++- src/entity/editor.onyx | 58 ++- src/game.onyx | 11 +- src/gfx/immediate.onyx | 2 + src/gfx/ui.onyx | 19 +- 6 files changed, 693 insertions(+), 30 deletions(-) create mode 100644 run_tree/scenes/level1.scene diff --git a/run_tree/scenes/level1.scene b/run_tree/scenes/level1.scene new file mode 100644 index 0000000..20d7bc6 --- /dev/null +++ b/run_tree/scenes/level1.scene @@ -0,0 +1,579 @@ +[Background] +id = 100 +flags = 0 +pos.x = 0.0000 +pos.y = 0.0000 +size.x = 0.0000 +size.y = 0.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Wall] +id = 10 +flags = 2 +pos.x = 192.0000 +pos.y = 104.0000 +size.x = 352.0000 +size.y = 16.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Wall] +id = 11 +flags = 3 +pos.x = 456.0000 +pos.y = 64.0000 +size.x = 16.0000 +size.y = 96.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Door] +id = 13 +flags = 3 +pos.x = 368.0000 +pos.y = 104.0000 +size.x = 160.0000 +size.y = 16.0000 +:DoorComponent +max_openness = 0.8000 +target_openness = 0.8000 +openness = 0.8000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Wall] +id = 25 +flags = 2 +pos.x = 408.0000 +pos.y = 8.0000 +size.x = 816.0000 +size.y = 16.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Wall] +id = 27 +flags = 2 +pos.x = 8.0000 +pos.y = 312.0000 +size.x = 16.0000 +size.y = 592.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Wall] +id = 28 +flags = 2 +pos.x = 792.0000 +pos.y = 312.0000 +size.x = 16.0000 +size.y = 592.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 30 +flags = 2 +pos.x = 136.0000 +pos.y = 336.0000 +size.x = 16.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 0 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 32.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 16.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 31 +flags = 2 +pos.x = 184.0000 +pos.y = 336.0000 +size.x = 16.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 0 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 48.0000 +sprite.pos.y = 32.0000 +sprite.size.x = -16.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 32 +flags = 2 +pos.x = 160.0000 +pos.y = 336.0000 +size.x = 32.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 1 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 48.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 32.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 40 +flags = 2 +pos.x = 136.0000 +pos.y = 256.0000 +size.x = 16.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 0 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 32.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 16.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 41 +flags = 2 +pos.x = 184.0000 +pos.y = 256.0000 +size.x = 16.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 0 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 48.0000 +sprite.pos.y = 32.0000 +sprite.size.x = -16.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 42 +flags = 2 +pos.x = 160.0000 +pos.y = 256.0000 +size.x = 32.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 1 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 48.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 32.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 55 +flags = 2 +pos.x = 536.0000 +pos.y = 256.0000 +size.x = 16.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 0 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 32.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 16.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 54 +flags = 2 +pos.x = 584.0000 +pos.y = 256.0000 +size.x = 16.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 0 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 48.0000 +sprite.pos.y = 32.0000 +sprite.size.x = -16.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 53 +flags = 2 +pos.x = 560.0000 +pos.y = 256.0000 +size.x = 32.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 1 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 48.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 32.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 52 +flags = 2 +pos.x = 536.0000 +pos.y = 336.0000 +size.x = 16.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 0 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 32.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 16.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 51 +flags = 2 +pos.x = 584.0000 +pos.y = 336.0000 +size.x = 16.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 0 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 48.0000 +sprite.pos.y = 32.0000 +sprite.size.x = -16.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Furniture] +id = 50 +flags = 2 +pos.x = 560.0000 +pos.y = 336.0000 +size.x = 32.0000 +size.y = 32.0000 +:FurnitureComponent +furniture_type = 1 +taken = false +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 48.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 32.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Wall] +id = 35 +flags = 2 +pos.x = 192.0000 +pos.y = 592.0000 +size.x = 352.0000 +size.y = 32.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Wall] +id = 36 +flags = 2 +pos.x = 608.0000 +pos.y = 592.0000 +size.x = 352.0000 +size.y = 32.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Wall] +id = 37 +flags = 2 +pos.x = 140.0000 +pos.y = -142.0000 +size.x = 16.0000 +size.y = 16.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Tap] +id = 14 +flags = 3 +pos.x = 240.0000 +pos.y = 32.0000 +size.x = 32.0000 +size.y = 32.0000 +:SpriteRenderComponent +sprite.sheet = "./assets/images/spritesheet.png" +sprite.pos.x = 0.0000 +sprite.pos.y = 32.0000 +sprite.size.x = 32.0000 +sprite.size.y = 32.0000 +sprite.color.r = 1.0000 +sprite.color.g = 1.0000 +sprite.color.b = 1.0000 +sprite.color.a = 1.0000 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 +:DispenserComponent +item = "beer" +max_timeout = 2.0000 + +[Player] +id = 152 +flags = 2 +pos.x = 276.7525 +pos.y = 229.4652 +size.x = 16.0000 +size.y = 32.0000 +:MovementComponent +controls.up = 265 +controls.down = 264 +controls.left = 263 +controls.right = 262 +controls.interact = 44 +controls.pick_up = 46 +facing = 1 +velocity.x = 0.0000 +velocity.y = -0.0000 +:PlayerComponent +holding = 155 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 0.0000 +color.b = 1.0000 +color.a = 1.0000 + +[Player] +id = 12 +flags = 2 +pos.x = 334.4180 +pos.y = 246.6519 +size.x = 16.0000 +size.y = 32.0000 +:MovementComponent +controls.up = 87 +controls.down = 83 +controls.left = 65 +controls.right = 68 +controls.interact = 70 +controls.pick_up = 71 +facing = 3 +velocity.x = -0.0000 +velocity.y = 0.0000 +:PlayerComponent +holding = 150 +:RenderComponent +layer = 10 +color.r = 0.0000 +color.g = 1.0000 +color.b = 0.0000 +color.a = 1.0000 + +[Item_Entity] +id = 150 +flags = 6 +pos.x = 334.4180 +pos.y = 222.6519 +size.x = 16.0000 +size.y = 16.0000 +:RenderComponent +layer = 10 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 +:ItemComponent +item = "burger" + +[Item_Entity] +id = 155 +flags = 0 +pos.x = 276.7525 +pos.y = 205.4652 +size.x = 16.0000 +size.y = 16.0000 +:RenderComponent +layer = 10 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 +:ItemComponent +item = "beer" + diff --git a/run_tree/scenes/quick_save_new.scene b/run_tree/scenes/quick_save_new.scene index 4b0bc41..ec3f4ee 100644 --- a/run_tree/scenes/quick_save_new.scene +++ b/run_tree/scenes/quick_save_new.scene @@ -493,11 +493,37 @@ color.a = 1.0000 item = "beer" max_timeout = 2.0000 +[Player] +id = 152 +flags = 2 +pos.x = 276.7493 +pos.y = 229.5119 +size.x = 16.0000 +size.y = 32.0000 +:MovementComponent +controls.up = 265 +controls.down = 264 +controls.left = 263 +controls.right = 262 +controls.interact = 44 +controls.pick_up = 46 +facing = 1 +velocity.x = 0.0268 +velocity.y = -0.3748 +:PlayerComponent +holding = 155 +:RenderComponent +layer = 0 +color.r = 1.0000 +color.g = 0.0000 +color.b = 1.0000 +color.a = 1.0000 + [Player] id = 12 flags = 2 -pos.x = 312.4880 -pos.y = 271.0974 +pos.x = 334.4181 +pos.y = 246.6520 size.x = 16.0000 size.y = 32.0000 :MovementComponent @@ -508,8 +534,8 @@ controls.right = 68 controls.interact = 70 controls.pick_up = 71 facing = 3 -velocity.x = 0.0000 -velocity.y = 0.0000 +velocity.x = -0.0001 +velocity.y = -0.0000 :PlayerComponent holding = 150 :RenderComponent @@ -522,8 +548,8 @@ color.a = 1.0000 [Item_Entity] id = 150 flags = 6 -pos.x = 312.4880 -pos.y = 247.0973 +pos.x = 334.4181 +pos.y = 222.6520 size.x = 16.0000 size.y = 16.0000 :RenderComponent @@ -535,3 +561,19 @@ color.a = 1.0000 :ItemComponent item = "burger" +[Item_Entity] +id = 155 +flags = 0 +pos.x = 276.7484 +pos.y = 205.5248 +size.x = 16.0000 +size.y = 16.0000 +:RenderComponent +layer = 10 +color.r = 1.0000 +color.g = 1.0000 +color.b = 1.0000 +color.a = 1.0000 +:ItemComponent +item = "beer" + diff --git a/src/entity/editor.onyx b/src/entity/editor.onyx index 9058033..0fd955d 100644 --- a/src/entity/editor.onyx +++ b/src/entity/editor.onyx @@ -20,6 +20,11 @@ editor_init :: () { editor_font = font_lookup(.{"./assets/fonts/calibri.ttf", 18}); editor_big_font = font_lookup(.{"./assets/fonts/calibri.ttf", 24}); selected_entity_id = Entity_Nothing; + + array.ensure_capacity(^save_path, 512); + save_path.count = 512; + s := conv.format(save_path, "./scenes/level1.scene"); + save_path.count = s.count; } editor_shown :: () => editor_openness != 0.0f || editor_target_openness != 0.0f; @@ -34,8 +39,9 @@ editor_toggle :: () { editor_update :: (dt: f32) { move_towards(^editor_openness, editor_target_openness, dt * 6); - if is_key_just_up(GLFW_KEY_1) do clicked_tab = .Edit; - if is_key_just_up(GLFW_KEY_2) do clicked_tab = .Create; + if is_key_just_up(GLFW_KEY_1) do clicked_tab = .File; + if is_key_just_up(GLFW_KEY_2) do clicked_tab = .Edit; + if is_key_just_up(GLFW_KEY_3) do clicked_tab = .Create; if is_key_just_up(GLFW_KEY_G) do editor_grid_shown = !editor_grid_shown; handle_clicking_tab(dt); @@ -56,7 +62,7 @@ editor_update :: (dt: f32) { if active_index < 0 do return; mouse_pos := mouse_get_position_vector() - scene_render_offset; - if is_button_just_down(GLFW_MOUSE_BUTTON_LEFT) && mouse_pos.x < ~~window_width - sidebar_width { + if is_button_just_up(GLFW_MOUSE_BUTTON_LEFT) && mouse_pos.x < ~~window_width - sidebar_width { schematic := scene.schematics.entries[active_index].value; entity := schematic.create(^scene); entity.schematic = schematic.type; @@ -72,19 +78,19 @@ editor_update :: (dt: f32) { mouse_pos := mouse_get_position_vector() - scene_render_offset; if mouse_pos.x < ~~window_width - sidebar_width { - if is_button_just_up(GLFW_MOUSE_BUTTON_LEFT) || is_button_just_up(GLFW_MOUSE_BUTTON_RIGHT) { + if is_button_just_down(GLFW_MOUSE_BUTTON_LEFT) || is_button_just_down(GLFW_MOUSE_BUTTON_RIGHT) { if active_tab == .Edit do active_index = -1; selected_entity_id = Entity_Nothing; for scene.entities { if Entity.get_rect(it) |> Rect.contains(mouse_pos) { selected_entity_id = it.id; - // break_just_up; + // break; } } - dragging = is_button_just_up(GLFW_MOUSE_BUTTON_LEFT) && selected_entity_id != Entity_Nothing; - resizing = is_button_just_up(GLFW_MOUSE_BUTTON_RIGHT) && selected_entity_id != Entity_Nothing; + dragging = is_button_just_down(GLFW_MOUSE_BUTTON_LEFT) && selected_entity_id != Entity_Nothing; + resizing = is_button_just_down(GLFW_MOUSE_BUTTON_RIGHT) && selected_entity_id != Entity_Nothing; } } @@ -149,7 +155,7 @@ editor_draw :: () { xcount := cast(i32) math.ceil(height / editor_grid_size); ycount := cast(i32) math.ceil(width / editor_grid_size); - immediate_set_color(.{1,1,0}); + immediate_set_color(.{1,1,0, 0.4}); for xcount { y := ~~it * editor_grid_size + scene_render_offset.y; immediate_line(scene_render_offset.x, y, width + scene_render_offset.x, y); @@ -212,6 +218,19 @@ editor_draw :: () { immediate_rectangle(x, y, w, h); switch active_tab { + case .File { + @Relocate + draw_textbox(.{ x, y, w, 40 }, ^save_path); + + if draw_button(.{ x, y + 40, w / 2, 40 }, "Save") { + scene->save_to_file(save_path); + } + + if draw_button(.{ x + w / 2, y + 40, w / 2, 40 }, "Load") { + scene->load_from_file(save_path); + } + } + case .Create { render_create_sidebar(x, y, w, h); } @@ -241,24 +260,23 @@ editor_draw :: () { active_index = i; } } - - #persist test : [..] u8; - if test.data == null { - test << #char "t"; - test << #char "e"; - test << #char "s"; - test << #char "t"; - } - - draw_textbox(.{x, y + 72.0f, w / 2.0f, 36.0f}, ^test); } #local render_entity_list :: (x, y, w, h: f32) { + #persist search_value: [..] u8; + draw_textbox(.{x, y, w, 40}, ^search_value); + h -= 40; + y += 40; + scrolling_region_start(.{x, y, w, h}); buf: [256] u8; for scene.entities { msg := conv.format(buf, "{} ({})", it.schematic, cast(u32) it.id); + if search_value.count != 0 { + if !string.contains(msg, search_value) do continue; + } + if draw_button(.{ x, y, w, 32 }, msg, increment=~~it) { selected_entity_id = it.id; } @@ -369,6 +387,7 @@ editor_draw :: () { } else { value_buf: [1024] u8; value_str := conv.format_va(value_buf, "{}", .[member_any]); + font_set_color(.{1,1,1}); font_print(editor_font, x + w - font_get_width(editor_font, value_str) - 2, y + Field_Height - 2, value_str); } } @@ -456,6 +475,7 @@ editor_draw :: () { Tabs :: enum { None; + File; Edit; Create; } @@ -469,4 +489,6 @@ editor_draw :: () { editor_grid_shown := false; editor_grid_size := 16.0f; @TODO // This should be configurable + + save_path: [..] u8; } diff --git a/src/game.onyx b/src/game.onyx index ff76e24..b15a23a 100644 --- a/src/game.onyx +++ b/src/game.onyx @@ -29,7 +29,7 @@ game_init :: () { load_assets(); scene = scene_create(); - scene->load_from_file(quick_save_file); + // scene->load_from_file(quick_save_file); item_store = item_store_make(); item_store->load_items_from_file("scenes/default.items"); @@ -83,12 +83,13 @@ game_draw :: () { texture := canvas_to_texture(^scene_canvas); view_rect: Rect; - view_rect.x = math.lerp(editor_open_percent(), cast(f32) ((window_width - scene_canvas.width) / 2), 0); - view_rect.y = ~~ ((window_height - scene_canvas.height) / 2); - view_rect.w = ~~ scene_canvas.width; - view_rect.h = ~~ scene_canvas.height; if !editor_shown() { view_rect = Rect.{0, 0, ~~window_width, ~~window_height}; + } else { + view_rect.x = math.lerp(editor_open_percent(), cast(f32) ((window_width - scene_canvas.width) / 2), cast(f32) ((window_width - scene_canvas.width - 400) / 2)); + view_rect.y = ~~ ((window_height - scene_canvas.height) / 2); + view_rect.w = ~~ scene_canvas.width; + view_rect.h = ~~ scene_canvas.height; } scene_render_offset = Rect.top_left(view_rect); diff --git a/src/gfx/immediate.onyx b/src/gfx/immediate.onyx index a472017..be486f4 100644 --- a/src/gfx/immediate.onyx +++ b/src/gfx/immediate.onyx @@ -125,6 +125,8 @@ immediate_subimage :: (image: ^Texture, x, y, w, h: f32, tx, ty, tw, th: f32) { immediate_ellipse :: () {} immediate_push_scissor :: (x, y, w, h: f32) { + if vertex_count > 0 do immediate_flush(); + // Assuming that x, y, w, and h are in screen (window) coordinates. x += offset.x; y += offset.y; diff --git a/src/gfx/ui.onyx b/src/gfx/ui.onyx index 839b198..a58f30b 100644 --- a/src/gfx/ui.onyx +++ b/src/gfx/ui.onyx @@ -23,6 +23,11 @@ ui_end_frame :: () { for^ animation_states.entries { it.value.accessed_this_frame = false; } + + if active_countdown > 0 { + active_countdown -= 1; + if active_countdown == 0 do set_active_item(0); + } } // @@ -54,6 +59,7 @@ draw_button :: (use r: Rect, text: str, theme := ^default_button_theme, site := contains := Rect.contains(r, .{~~mx, ~~my}); if is_active_item(hash) { + renew_active_item(hash); if is_button_just_up(GLFW_MOUSE_BUTTON_LEFT) { if is_hot_item(hash) && contains { result = true; @@ -171,6 +177,7 @@ draw_textbox :: (use r: Rect, text_buffer: ^[..] u8, placeholder := null_str, th } if is_active_item(hash) { + renew_active_item(hash); if is_button_just_down(GLFW_MOUSE_BUTTON_LEFT) && !contains { set_active_item(0); input_release_keys(); @@ -353,6 +360,7 @@ draw_checkbox :: (use r: Rect, value: ^bool, text: str, theme := ^default_checkb contains := Rect.contains(r, .{~~mx, ~~my}); if is_active_item(hash) { + renew_active_item(hash); if is_button_just_up(GLFW_MOUSE_BUTTON_LEFT) { if is_hot_item(hash) && contains { result = true; @@ -446,17 +454,26 @@ scrolling_region_stop :: () { #local { hot_item : UI_Id = 0 - active_item : UI_Id = 0 hot_item_was_set := false hot_item_depth := 0; hot_item_depth_needed := 0; + active_item : UI_Id = 0 + active_countdown := 0 + set_active_item :: (id: UI_Id) -> bool { active_item = id; + active_countdown = 2; return true; } + renew_active_item :: (id: UI_Id) { + if active_item == id { + active_countdown = 2; + } + } + set_hot_item :: (id: UI_Id, force := false) -> bool { if active_item != 0 do return false; -- 2.25.1