added aligning entity size and position to grid
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 23 Feb 2022 04:05:03 +0000 (22:05 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 23 Feb 2022 04:05:03 +0000 (22:05 -0600)
run_tree/scenes/quick_save.scene
src/entity/editor.onyx
src/utils/vecmath.onyx

index dfd385540cc4344a4cc46234cb4fd552b6da81e0..5015cbbb7a9f9b21e20e1ca87160f7f8e5510ebb 100644 (file)
@@ -1,26 +1,26 @@
 :Wall
 entity.id = 10
 entity.flags = 2
-entity.pos.x = 178.0000
-entity.pos.y = 312.0000
-entity.size.x = 355.0000
-entity.size.y = 28.0000
+entity.pos.x = 168.0000
+entity.pos.y = 320.0000
+entity.size.x = 336.0000
+entity.size.y = 32.0000
 
 :Wall
 entity.id = 11
 entity.flags = 2
-entity.pos.x = 447.0000
-entity.pos.y = 165.0000
-entity.size.x = 31.0000
-entity.size.y = 328.0000
+entity.pos.x = 448.0000
+entity.pos.y = 168.0000
+entity.size.x = 32.0000
+entity.size.y = 336.0000
 
 :Player
 entity.id = 12
 entity.flags = 2
-entity.pos.x = 237.4579
-entity.pos.y = 133.2012
-entity.size.x = 32.0000
-entity.size.y = 32.0000
+entity.pos.x = 200.0000
+entity.pos.y = 152.0000
+entity.size.x = 48.0000
+entity.size.y = 48.0000
 holding = 0
 controls.up = 87
 controls.down = 83
@@ -37,18 +37,18 @@ facing = 4
 :Door
 entity.id = 13
 entity.flags = 7
-entity.pos.x = 353.0000
-entity.pos.y = 312.0000
-entity.size.x = 156.0000
-entity.size.y = 30.0000
+entity.pos.x = 352.0000
+entity.pos.y = 320.0000
+entity.size.x = 160.0000
+entity.size.y = 32.0000
 target_openness = 0.0000
 
 :Item_Entity
 entity.id = 14
 entity.flags = 4
-entity.pos.x = 269.4578
-entity.pos.y = 133.2012
-entity.size.x = 24.0000
-entity.size.y = 24.0000
+entity.pos.x = 272.0000
+entity.pos.y = 144.0000
+entity.size.x = 32.0000
+entity.size.y = 32.0000
 item = "beer"
 
index 27d98bd259ab6d755d071cf329ec92d808daab06..109c4063ae29935bccff514cec4bcd01801766e4 100644 (file)
@@ -98,7 +98,19 @@ editor_update :: (dt: f32) {
         selected_entity := scene->get(selected_entity_id);
 
         if dragging {
-            selected_entity.pos += mouse_get_delta_vector();
+            if editor_grid_shown {
+                new_top_left := mouse_get_position_vector();
+                new_top_left.x = editor_grid_size * math.floor(new_top_left.x / editor_grid_size);
+                new_top_left.y = editor_grid_size * math.floor(new_top_left.y / editor_grid_size);
+
+                rect := scene.entity_types[selected_entity.type].get_rect(selected_entity);
+                new_rect := Rect.{ new_top_left.x, new_top_left.y, rect.w, rect.h };
+                selected_entity.pos = Rect.center(new_rect);
+
+            } else {
+                selected_entity.pos += mouse_get_delta_vector();
+            }
+
         } else {
             if is_key_down(GLFW_KEY_UP)    do selected_entity.pos.y -= 32 * dt;
             if is_key_down(GLFW_KEY_DOWN)  do selected_entity.pos.y += 32 * dt;
@@ -107,7 +119,20 @@ editor_update :: (dt: f32) {
         }
 
         if resizing {
-            selected_entity.size += mouse_get_delta_vector();
+            if editor_grid_shown {
+                E :: macro (e: ^Entity) => scene.entity_types[e.type];
+
+                rect := E(selected_entity).get_rect(selected_entity);
+                new_size := mouse_get_position_vector() - Rect.top_left(rect);
+                new_size.x = editor_grid_size * math.floor(new_size.x / editor_grid_size);
+                new_size.y = editor_grid_size * math.floor(new_size.y / editor_grid_size);
+                new_rect := Rect.{ rect.x, rect.y, new_size.x, new_size.y };
+                selected_entity.pos = Rect.center(new_rect);
+                selected_entity.size = new_size;
+
+            } else {
+                selected_entity.size += mouse_get_delta_vector();
+            }
         }
 
         if is_key_just_down(GLFW_KEY_DELETE) {
index ad3937c0c6813b0d7c4cdcf52608d2e446134514..07423f56411fa3c14efb5268c1db7630a6cb43a9 100644 (file)
@@ -91,4 +91,11 @@ Rect :: struct {
         return r.x <= p.x && r.x + r.w >= p.x
             && r.y <= p.y && r.y + r.h >= p.y;
     }
+
+    center :: macro (use r: Rect) => Vector2.{ r.x+r.w/2, r.y+r.h/2 };
+
+    top_left     :: macro (use r: Rect) => Vector2.{ r.x,   r.y   };
+    top_right    :: macro (use r: Rect) => Vector2.{ r.x+r.w, r.y   };
+    bottom_left  :: macro (use r: Rect) => Vector2.{ r.x,   r.y+r.h };
+    bottom_right :: macro (use r: Rect) => Vector2.{ r.x+r.w, r.y+r.h };
 }