From 6d8d5329521c9b56e46267c821f60efd57154bdc Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Wed, 6 Aug 2025 10:39:34 +0300 Subject: [PATCH] Added minimum distance between points when creating objects, and also deselecting objects with lasso tool improved --- include/Helpers/MathExtras.hpp | 9 +++++++++ src/DrawingProgram/DrawingProgramToolBase.hpp | 2 ++ src/DrawingProgram/EditTool.hpp | 3 ++- src/DrawingProgram/EllipseDrawTool.cpp | 3 +++ src/DrawingProgram/LassoSelectTool.cpp | 2 ++ src/DrawingProgram/RectDrawTool.cpp | 2 ++ src/DrawingProgram/TextBoxTool.cpp | 2 ++ 7 files changed, 22 insertions(+), 1 deletion(-) diff --git a/include/Helpers/MathExtras.hpp b/include/Helpers/MathExtras.hpp index 695e407..6981a17 100644 --- a/include/Helpers/MathExtras.hpp +++ b/include/Helpers/MathExtras.hpp @@ -275,3 +275,12 @@ template std::string vec_pretty(const Vector& a) { ss << "[" << a.x() << ", " << a.y() << "]"; return ss.str(); } + +template Vector ensure_points_have_distance(const Vector& a, const Vector& b, T d) { + Vector toRet = b; + if(std::abs(a.x() - b.x()) < d) + toRet.x() = a.x() + d; + if(std::abs(a.y() - b.y()) < d) + toRet.y() = a.y() + d; + return toRet; +} diff --git a/src/DrawingProgram/DrawingProgramToolBase.hpp b/src/DrawingProgram/DrawingProgramToolBase.hpp index 4956efe..2f173ec 100644 --- a/src/DrawingProgram/DrawingProgramToolBase.hpp +++ b/src/DrawingProgram/DrawingProgramToolBase.hpp @@ -4,6 +4,8 @@ class DrawingProgram; +#define MINIMUM_DISTANCE_BETWEEN_BOUNDS 10.0f + enum class DrawingProgramToolType : int { BRUSH = 0, ERASER, diff --git a/src/DrawingProgram/EditTool.hpp b/src/DrawingProgram/EditTool.hpp index faf84ce..f7154dc 100644 --- a/src/DrawingProgram/EditTool.hpp +++ b/src/DrawingProgram/EditTool.hpp @@ -7,13 +7,14 @@ class DrawingProgram; + class EditTool : public DrawingProgramToolBase { public: struct HandleData { Vector2f* p; Vector2f* min; Vector2f* max; - float minimumDistanceBetweenBoundsAndPoint = 10.0f; + float minimumDistanceBetweenBoundsAndPoint = MINIMUM_DISTANCE_BETWEEN_BOUNDS; }; EditTool(DrawingProgram& initDrawP); diff --git a/src/DrawingProgram/EllipseDrawTool.cpp b/src/DrawingProgram/EllipseDrawTool.cpp index 0115555..2634635 100644 --- a/src/DrawingProgram/EllipseDrawTool.cpp +++ b/src/DrawingProgram/EllipseDrawTool.cpp @@ -5,6 +5,7 @@ #include "../MainProgram.hpp" #include "../DrawData.hpp" #include "DrawingProgramToolBase.hpp" +#include "Helpers/MathExtras.hpp" #include "Helpers/SCollision.hpp" #include "Helpers/Serializers.hpp" #include "../InputManager.hpp" @@ -46,6 +47,7 @@ void EllipseDrawTool::tool_update() { controls.intermediateItem->d.strokeWidth = drawP.controls.relativeWidth; controls.intermediateItem->d.p1 = controls.startAt; controls.intermediateItem->d.p2 = controls.startAt; + controls.intermediateItem->d.p2 = ensure_points_have_distance(controls.intermediateItem->d.p1, controls.intermediateItem->d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); controls.intermediateItem->d.fillStrokeMode = static_cast(controls.fillStrokeMode); controls.intermediateItem->coords = drawP.world.drawData.cam.c; controls.intermediateItem->lastUpdateTime = std::chrono::steady_clock::now(); @@ -68,6 +70,7 @@ void EllipseDrawTool::tool_update() { } controls.intermediateItem->d.p1 = cwise_vec_min(controls.startAt, newPos); controls.intermediateItem->d.p2 = cwise_vec_max(controls.startAt, newPos); + controls.intermediateItem->d.p2 = ensure_points_have_distance(controls.intermediateItem->d.p1, controls.intermediateItem->d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); controls.intermediateItem->client_send_update(drawP); controls.intermediateItem->commit_update(drawP); } diff --git a/src/DrawingProgram/LassoSelectTool.cpp b/src/DrawingProgram/LassoSelectTool.cpp index 10e88bd..817e02b 100644 --- a/src/DrawingProgram/LassoSelectTool.cpp +++ b/src/DrawingProgram/LassoSelectTool.cpp @@ -93,6 +93,8 @@ void LassoSelectTool::tool_update() { drawP.selection.add_from_cam_coord_collider_to_selection(cC); } } + else if(!drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held && !drawP.world.main.input.key(InputManager::KEY_GENERIC_LALT).held) + drawP.selection.deselect_all(); controls.selectionMode = 0; } break; diff --git a/src/DrawingProgram/RectDrawTool.cpp b/src/DrawingProgram/RectDrawTool.cpp index 855c070..d14d6c0 100644 --- a/src/DrawingProgram/RectDrawTool.cpp +++ b/src/DrawingProgram/RectDrawTool.cpp @@ -43,6 +43,7 @@ void RectDrawTool::tool_update() { controls.intermediateItem->d.strokeWidth = drawP.controls.relativeWidth; controls.intermediateItem->d.p1 = controls.startAt; controls.intermediateItem->d.p2 = controls.startAt; + controls.intermediateItem->d.p2 = ensure_points_have_distance(controls.intermediateItem->d.p1, controls.intermediateItem->d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); controls.intermediateItem->d.fillStrokeMode = static_cast(controls.fillStrokeMode); controls.intermediateItem->coords = drawP.world.drawData.cam.c; controls.intermediateItem->lastUpdateTime = std::chrono::steady_clock::now(); @@ -65,6 +66,7 @@ void RectDrawTool::tool_update() { } controls.intermediateItem->d.p1 = cwise_vec_min(controls.startAt, newPos); controls.intermediateItem->d.p2 = cwise_vec_max(controls.startAt, newPos); + controls.intermediateItem->d.p2 = ensure_points_have_distance(controls.intermediateItem->d.p1, controls.intermediateItem->d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); controls.intermediateItem->client_send_update(drawP); controls.intermediateItem->commit_update(drawP); } diff --git a/src/DrawingProgram/TextBoxTool.cpp b/src/DrawingProgram/TextBoxTool.cpp index d9676cb..78e5247 100644 --- a/src/DrawingProgram/TextBoxTool.cpp +++ b/src/DrawingProgram/TextBoxTool.cpp @@ -39,6 +39,7 @@ void TextBoxTool::tool_update() { controls.startAt = drawP.world.main.input.mouse.pos; controls.endAt = controls.startAt; controls.intermediateItem->d.p1 = controls.intermediateItem->d.p2 = controls.startAt; + controls.intermediateItem->d.p2 = ensure_points_have_distance(controls.intermediateItem->d.p1, controls.intermediateItem->d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); controls.intermediateItem->d.textColor = drawP.controls.foregroundColor; controls.intermediateItem->d.textSize = controls.textRelativeSize; controls.intermediateItem->d.editing = true; @@ -61,6 +62,7 @@ void TextBoxTool::tool_update() { controls.endAt = newPos; controls.intermediateItem->d.p1 = cwise_vec_min(controls.endAt, controls.startAt); controls.intermediateItem->d.p2 = cwise_vec_max(controls.endAt, controls.startAt); + controls.intermediateItem->d.p2 = ensure_points_have_distance(controls.intermediateItem->d.p1, controls.intermediateItem->d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); controls.intermediateItem->lastUpdateTime = std::chrono::steady_clock::now(); if(!drawP.controls.leftClickHeld) { auto editTool = std::make_unique(drawP);