From b4babf978eeda6d5b6bd8c21fe4b73d3142726d4 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Mon, 4 Aug 2025 13:30:47 +0300 Subject: [PATCH] Fixed broken scale transform --- src/CoordSpaceHelperTransform.cpp | 6 +++ src/CoordSpaceHelperTransform.hpp | 3 ++ .../DrawingProgramSelection.cpp | 47 ++++++++++++++----- .../DrawingProgramSelection.hpp | 4 +- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/CoordSpaceHelperTransform.cpp b/src/CoordSpaceHelperTransform.cpp index 722fe42..28e0539 100644 --- a/src/CoordSpaceHelperTransform.cpp +++ b/src/CoordSpaceHelperTransform.cpp @@ -61,3 +61,9 @@ void CoordSpaceHelperTransform::scale_about(const WorldVec& scalePos, const Worl WorldVec mVec = pos - scalePos; pos = scalePos + FixedPoint::multiplier_vec_div(mVec, scaleAmount); } + +std::ostream& operator<<(std::ostream& os, const CoordSpaceHelperTransform& a) { + return os << "pos: [" << a.pos.x() << " " << a.pos.y() << "]\n" + << "inverseScale: " << static_cast(a.inverseScale) << "\n" + << "rotation: " << a.rotation << "\n"; +} diff --git a/src/CoordSpaceHelperTransform.hpp b/src/CoordSpaceHelperTransform.hpp index c23e257..2902d61 100644 --- a/src/CoordSpaceHelperTransform.hpp +++ b/src/CoordSpaceHelperTransform.hpp @@ -33,3 +33,6 @@ class CoordSpaceHelperTransform { WorldMultiplier inverseScale{1}; double rotation = 0.0; }; + +std::ostream& operator<<(std::ostream& os, const CoordSpaceHelperTransform& a); + diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index 286c05f..bb13c11 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -92,7 +92,7 @@ void DrawingProgramSelection::calculate_aabb() { } } -void DrawingProgramSelection::deselect_all() { +void DrawingProgramSelection::deselect_all(bool readdObjectsToCache) { if(is_something_selected()) { std::vector a(selectedSet.begin(), selectedSet.end()); std::vector> transformsFrom; @@ -106,11 +106,14 @@ void DrawingProgramSelection::deselect_all() { obj->obj->coords = selectionTransformCoords.other_coord_space_from_this_space(obj->obj->coords); obj->obj->commit_transform(drawP, false); }, isSingleThread); - if(!isSingleThread) - drawP.force_rebuild_cache(); - else { - for(auto& obj : a) - drawP.compCache.add_component(obj); + + if(readdObjectsToCache) { + if(!isSingleThread) + drawP.force_rebuild_cache(); + else { + for(auto& obj : a) + drawP.compCache.add_component(obj); + } } reset_transform_data(); @@ -176,6 +179,12 @@ void DrawingProgramSelection::deselect_all() { } } +void DrawingProgramSelection::commit_transform_selection() { + auto selectedSetTemp = selectedSet; + deselect_all(false); + set_to_selection(selectedSetTemp); +} + void DrawingProgramSelection::invalidate_cache_at_optional_aabb_before_pos(const std::optional>& aabb, uint64_t placementToInvalidateAt) { cache.invalidate_cache_at_optional_aabb_before_pos(aabb, placementToInvalidateAt); } @@ -259,8 +268,8 @@ void DrawingProgramSelection::update() { selectionTransformCoords.translate(drawP.world.get_mouse_world_pos() - translateData.startPos); } else { - transformOpHappening = TransformOperation::NONE; - calculate_initial_rotate_center_location(); + commit_transform_selection(); + return; } break; case TransformOperation::SCALE: @@ -275,6 +284,7 @@ void DrawingProgramSelection::update() { WorldScalar centerToScaleStartNorm = centerToScaleStart.norm(); WorldScalar centerToScaleCurrentNorm = centerToScaleCurrent.norm(); bool isAnyNumberZero = centerToScaleCurrentNorm == WorldScalar(0) || centerToScaleStartNorm == WorldScalar(0); + if(!isAnyNumberZero) { WorldMultiplier scaleAmount = WorldMultiplier(centerToScaleStartNorm) / WorldMultiplier(centerToScaleCurrentNorm); @@ -283,8 +293,8 @@ void DrawingProgramSelection::update() { } } else { - transformOpHappening = TransformOperation::NONE; - calculate_initial_rotate_center_location(); + commit_transform_selection(); + return; } break; case TransformOperation::ROTATE_RELOCATE_CENTER: @@ -300,8 +310,10 @@ void DrawingProgramSelection::update() { selectionTransformCoords = startingSelectionTransformCoords; selectionTransformCoords.rotate_about(selectionTransformCoords.from_space_world(rotateData.centerPos), rotateData.rotationAngle); } - else - transformOpHappening = TransformOperation::NONE; + else { + commit_transform_selection(); + return; + } break; } @@ -391,6 +403,17 @@ Vector2f DrawingProgramSelection::get_rotation_point_pos_from_angle(double angle void DrawingProgramSelection::draw_components(SkCanvas* canvas, const DrawData& drawData) { if(is_something_selected()) { + selectionRectPoints[0] = selectionTransformCoords.from_space_world(initialSelectionAABB.min); + selectionRectPoints[1] = selectionTransformCoords.from_space_world(initialSelectionAABB.bottom_left()); + selectionRectPoints[2] = selectionTransformCoords.from_space_world(initialSelectionAABB.max); + selectionRectPoints[3] = selectionTransformCoords.from_space_world(initialSelectionAABB.top_right()); + + scaleData.handlePoint = drawP.world.drawData.cam.c.to_space(selectionTransformCoords.from_space_world(initialSelectionAABB.max)); + rotateData.centerHandlePoint = drawP.world.drawData.cam.c.to_space(selectionTransformCoords.from_space_world(rotateData.centerPos)); + rotateData.handlePoint = get_rotation_point_pos_from_angle(rotateData.rotationAngle); + + rebuild_cam_space(); + DrawData selectionDrawData = drawData; selectionDrawData.cam.c = selectionTransformCoords.other_coord_space_to_this_space(selectionDrawData.cam.c); selectionDrawData.cam.set_viewing_area(drawP.world.main.window.size.cast()); diff --git a/src/DrawingProgram/DrawingProgramSelection.hpp b/src/DrawingProgram/DrawingProgramSelection.hpp index 8e7e603..470fef2 100644 --- a/src/DrawingProgram/DrawingProgramSelection.hpp +++ b/src/DrawingProgram/DrawingProgramSelection.hpp @@ -8,7 +8,7 @@ class DrawingProgramSelection { public: DrawingProgramSelection(DrawingProgram& initDrawP); void add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC); - void deselect_all(); + void deselect_all(bool readdObjectsToCache = true); void update(); void draw_components(SkCanvas* canvas, const DrawData& drawData); void draw_gui(SkCanvas* canvas, const DrawData& drawData); @@ -30,6 +30,8 @@ class DrawingProgramSelection { void paste_clipboard(); void set_to_selection(const std::unordered_set& newSelection); + void commit_transform_selection(); + void calculate_aabb(); void calculate_initial_rotate_center_location(); void rebuild_cam_space();