summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/editor.c114
-rw-r--r--src/math_helper.c4
-rw-r--r--src/objects.c18
3 files changed, 116 insertions, 20 deletions
diff --git a/src/editor.c b/src/editor.c
index 5166cc1..c43ea31 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -251,7 +251,6 @@ void draw_lighting_panel(platform_window* window) {
typedef enum t_object_editor_state {
OBJECT_EDITOR_SELECTING,
- OBJECT_EDITOR_MOVING,
OBJECT_EDITOR_PLACING,
} object_editor_state;
@@ -260,6 +259,98 @@ object_type object_to_place = OBJECT_NONE;
vec2 select_start = {0,0};
vec2 select_end = {0,0};
static bool is_selecting = false;
+static bool is_dragging = false;
+
+void update_object_selection(platform_window* window, vec2 cursor_pos) {
+ static int drag_start_x = 0;
+ static int drag_start_y = 0;
+ static vec2 drag_select_start = {0,0};
+ static vec2 drag_select_end = {0,0};
+
+ if (is_left_clicked()) {
+ if (rect_contains_point(cursor_pos, select_start, select_end)) {
+ is_dragging = true;
+ drag_start_x = cursor_pos.x;
+ drag_start_y = cursor_pos.y;
+ drag_select_start = select_start;
+ drag_select_end = select_end;
+ }
+ else {
+ select_start = cursor_pos;
+ select_end = cursor_pos;
+ is_selecting = true;
+ }
+ }
+
+ if (is_selecting) {
+ if (is_left_down()) {
+ select_end = cursor_pos;
+ }
+ if (is_left_released()) {
+ select_end = cursor_pos;
+ is_selecting = false;
+ }
+ }
+ if (is_dragging) {
+ if (is_left_down()) {
+ vec2 newpos = cursor_pos;
+ int diffx = newpos.x - drag_start_x;
+ int diffy = newpos.y - drag_start_y;
+
+ select_start.x += diffx;
+ select_start.y += diffy;
+ select_end.x += diffx;
+ select_end.y += diffy;
+
+ array l = array_create(sizeof(object*));
+ array_reserve(&l, 200);
+ for (int y = select_start.y; y <= select_end.y; y++)
+ {
+ for (int x = select_start.x; x <= select_end.x; x++)
+ {
+ object* obj = get_pobject_at_tile(x, y);
+ if (obj) {
+ bool already_moved = false;
+ for (int i = 0; i < l.length; i++) {
+ object* existing_obj = *(object**)array_at(&l, i);
+ if (existing_obj == obj) already_moved = true;
+ }
+ if (already_moved) continue;
+
+ array_push(&l, (void*)obj);
+ obj->position.x += diffx;
+ obj->position.y += diffy;
+ }
+ }
+ }
+
+ array_destroy(&l);
+
+ drag_start_x = newpos.x;
+ drag_start_y = newpos.y;
+ }
+ else {
+
+ load_mapdata_into_world();
+ is_dragging = false;
+ }
+ }
+
+
+ if (!is_selecting) {
+ if (keyboard_is_key_down(KEY_DELETE)) {
+ for (int y = select_start.y; y <= select_end.y; y++)
+ {
+ for (int x = select_start.x; x <= select_end.x; x++)
+ {
+ object* obj = get_object_at_tile_from_mapfile(x, y);
+ if (obj) obj->active = false;
+ }
+ }
+ load_mapdata_into_world();
+ }
+ }
+}
void update_object_editor(platform_window* window) {
map_info info = get_map_info(window);
@@ -285,25 +376,8 @@ void update_object_editor(platform_window* window) {
}
break;
- case OBJECT_EDITOR_MOVING:
- if (is_left_clicked()) {
-
- }
- break;
-
case OBJECT_EDITOR_SELECTING:
- if (is_left_clicked()) {
- select_start = pos;
- select_end = pos;
- is_selecting = true;
- }
- if (is_selecting && is_left_down()) {
- select_end = pos;
- }
- if (is_selecting && is_left_released()) {
- select_end = pos;
- is_selecting = false;
- }
+ update_object_selection(window, pos);
break;
default:
@@ -334,7 +408,7 @@ void draw_object_panel(platform_window* window) {
if (object_edit_state == OBJECT_EDITOR_SELECTING)
{
vec2f start = world_pos_to_screen_pos(window, select_start.x, select_start.y, 0);
- vec2f end = world_pos_to_screen_pos(window, select_end.x - select_start.x, select_end.y - select_start.y, 0);
+ vec2f end = world_pos_to_screen_pos(window, select_end.x - select_start.x+1, select_end.y - select_start.y+1, 0);
renderer->render_rectangle(start.x, start.y, end.x, end.y, rgba(255,0,0,100));
}
}
diff --git a/src/math_helper.c b/src/math_helper.c
index 51db867..900b8aa 100644
--- a/src/math_helper.c
+++ b/src/math_helper.c
@@ -140,4 +140,8 @@ box get_render_box_of_square(platform_window* window, vec3f position, vec3f size
vec2f renderbl2 = (vec2f){render_x + info.px_incline*size.x, info.tile_height * position.y + info.tile_height*size.y - position.z*info.px_raised_per_h};
return (box){rendertl, rendertr, renderbl, renderbr, rendertl2, rendertr2, renderbl2, renderbr2};
+}
+
+bool rect_contains_point(vec2 point, vec2 tl, vec2 br) {
+ return (point.x >= tl.x && point.y >= tl.y && point.x <= br.x && point.y <= br.y);
} \ No newline at end of file
diff --git a/src/objects.c b/src/objects.c
index 2723fed..32a2dc7 100644
--- a/src/objects.c
+++ b/src/objects.c
@@ -29,6 +29,24 @@ void render_quad_with_outline(vec2f tl, vec2f tr, vec2f bl, vec2f br, color c) {
renderer->render_line(bl.x, bl.y, br.x, br.y, 1, rgba(0,0,255, c.a)); // bottom
}
+object* get_object_at_tile_from_mapfile(float x, float y) {
+ for (int i = 0; i < MAX_OBJECTS; i++) {
+ object o = map_to_load.objects[i];
+ if (!o.active) continue;
+ if (x >= o.position.x && x < o.position.x + o.size.x && y >= o.position.y && y < o.position.y + o.size.y) return &map_to_load.objects[i];
+ }
+ return 0;
+}
+
+object* get_pobject_at_tile(float x, float y) {
+ for (int i = 0; i < MAX_OBJECTS; i++) {
+ object o = loaded_map.objects[i];
+ if (!o.active) continue;
+ if (x >= o.position.x && x < o.position.x + o.size.x && y >= o.position.y && y < o.position.y + o.size.y) return &loaded_map.objects[i];
+ }
+ return 0;
+}
+
object get_object_at_tile(float x, float y) {
for (int i = 0; i < MAX_OBJECTS; i++) {
object o = loaded_map.objects[i];