improving the editor
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 4 Mar 2022 21:16:32 +0000 (15:16 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 4 Mar 2022 21:16:32 +0000 (15:16 -0600)
run_tree/scenes/level1.scene [new file with mode: 0644]
run_tree/scenes/quick_save_new.scene
src/entity/editor.onyx
src/game.onyx
src/gfx/immediate.onyx
src/gfx/ui.onyx

diff --git a/run_tree/scenes/level1.scene b/run_tree/scenes/level1.scene
new file mode 100644 (file)
index 0000000..20d7bc6
--- /dev/null
@@ -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"
+
index 4b0bc41ef4edfa955944f8e17be4e0821a9e7525..ec3f4eeffc722ec92ec941ea3cb89fe9f78c17ef 100644 (file)
@@ -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"
+
index 9058033503cdf9be40123eb88e83238c36d3ff59..0fd955db4cda920346d93da78d9a490c66f9d017 100644 (file)
@@ -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;
 }
index ff76e243173cacf42a8f8bce5eb328c54b9ea753..b15a23a0e0a3b3f92f095174bf8741c981879d72 100644 (file)
@@ -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);
 
index a4720176282c9efd6d05402470107001451e776f..be486f4e51073bc4897f4ba6f011aff2ac081463 100644 (file)
@@ -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;
index 839b1989fb3c6d3c2ca32d40286eb37ce1f96bab..a58f30b7649a60b8a5ffe71a95d613e8ab2b2cd5 100644 (file)
@@ -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;