Added minimum distance between points when creating objects, and also deselecting objects with lasso tool improved

This commit is contained in:
Yousef Khadadeh 2025-08-06 10:39:34 +03:00
parent 7ffa039061
commit 6d8d532952
7 changed files with 22 additions and 1 deletions

View file

@ -275,3 +275,12 @@ template <typename T> std::string vec_pretty(const Vector<T, 2>& a) {
ss << "[" << a.x() << ", " << a.y() << "]";
return ss.str();
}
template <typename T> Vector<T, 2> ensure_points_have_distance(const Vector<T, 2>& a, const Vector<T, 2>& b, T d) {
Vector<T, 2> 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;
}

View file

@ -4,6 +4,8 @@
class DrawingProgram;
#define MINIMUM_DISTANCE_BETWEEN_BOUNDS 10.0f
enum class DrawingProgramToolType : int {
BRUSH = 0,
ERASER,

View file

@ -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);

View file

@ -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<uint8_t>(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);
}

View file

@ -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;

View file

@ -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<uint8_t>(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);
}

View file

@ -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<EditTool>(drawP);