diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 176ebcf..ac27d69 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -367,16 +367,20 @@ void DrawingProgram::update() { EraserTool* eraserTool = static_cast(drawTool.get()); compCache.test_rebuild_dont_include_set_dont_include_nodes(components.client_list(), eraserTool->erasedComponents, eraserTool->erasedBVHNodes); } - else if(is_selection_tool(drawTool->get_type())) + else if(is_selection_allowing_tool(drawTool->get_type())) compCache.test_rebuild_dont_include_set(components.client_list(), selection.get_selected_set()); else compCache.test_rebuild(components.client_list()); } -bool DrawingProgram::is_selection_tool(DrawingProgramToolType typeToCheck) { +bool DrawingProgram::is_actual_selection_tool(DrawingProgramToolType typeToCheck) { return typeToCheck == DrawingProgramToolType::RECTSELECT || typeToCheck == DrawingProgramToolType::LASSOSELECT || typeToCheck == DrawingProgramToolType::EDIT; } +bool DrawingProgram::is_selection_allowing_tool(DrawingProgramToolType typeToCheck) { + return is_actual_selection_tool(typeToCheck) || typeToCheck == DrawingProgramToolType::PAN || typeToCheck == DrawingProgramToolType::ZOOM; +} + void DrawingProgram::switch_to_tool_ptr(std::unique_ptr newTool) { drawTool->switch_tool(newTool->get_type()); drawTool = std::move(newTool); @@ -412,7 +416,7 @@ void DrawingProgram::force_rebuild_cache() { EraserTool* eraserTool = static_cast(drawTool.get()); compCache.test_rebuild_dont_include_set_dont_include_nodes(components.client_list(), eraserTool->erasedComponents, eraserTool->erasedBVHNodes, true); } - else if(is_selection_tool(drawTool->get_type())) + else if(is_selection_allowing_tool(drawTool->get_type())) compCache.test_rebuild_dont_include_set(components.client_list(), selection.get_selected_set(), true); else compCache.test_rebuild(components.client_list(), true); diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 034a45f..4fc1cd7 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -96,7 +96,8 @@ class DrawingProgram { bool temporaryPan = false; DrawingProgramToolType toolTypeAfterTempPan; - bool is_selection_tool(DrawingProgramToolType typeToCheck); + bool is_actual_selection_tool(DrawingProgramToolType typeToCheck); + bool is_selection_allowing_tool(DrawingProgramToolType typeToCheck); struct GlobalControls { float relativeWidth = 15.0f; diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index ce6c6f1..3e0639f 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -293,75 +293,81 @@ void DrawingProgramSelection::update() { rebuild_cam_space(); - switch(transformOpHappening) { - case TransformOperation::NONE: - if(drawP.controls.leftClick && !drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held && !drawP.world.main.input.key(InputManager::KEY_GENERIC_LALT).held) { - if(mouse_collided_with_scale_point()) { - scaleData.currentPos = scaleData.startPos = selectionTransformCoords.from_space_world(initialSelectionAABB.max); - scaleData.centerPos = selectionTransformCoords.from_space_world(initialSelectionAABB.center()); - transformOpHappening = TransformOperation::SCALE; + if(drawP.is_actual_selection_tool(drawP.drawTool->get_type())) { + switch(transformOpHappening) { + case TransformOperation::NONE: + if(drawP.controls.leftClick && !drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held && !drawP.world.main.input.key(InputManager::KEY_GENERIC_LALT).held) { + if(mouse_collided_with_scale_point()) { + scaleData.currentPos = scaleData.startPos = selectionTransformCoords.from_space_world(initialSelectionAABB.max); + scaleData.centerPos = selectionTransformCoords.from_space_world(initialSelectionAABB.center()); + transformOpHappening = TransformOperation::SCALE; + } + else if(mouse_collided_with_rotate_center_handle_point()) + transformOpHappening = TransformOperation::ROTATE_RELOCATE_CENTER; + else if(mouse_collided_with_rotate_handle_point()) { + rotateData.rotationAngle = 0.0; + transformOpHappening = TransformOperation::ROTATE; + } + else if(mouse_collided_with_selection_aabb()) { + translateData.startPos = drawP.world.get_mouse_world_pos(); + transformOpHappening = TransformOperation::TRANSLATE; + } } - else if(mouse_collided_with_rotate_center_handle_point()) - transformOpHappening = TransformOperation::ROTATE_RELOCATE_CENTER; - else if(mouse_collided_with_rotate_handle_point()) { - rotateData.rotationAngle = 0.0; - transformOpHappening = TransformOperation::ROTATE; + break; + case TransformOperation::TRANSLATE: + if(drawP.controls.leftClickHeld) + selectionTransformCoords = CoordSpaceHelperTransform(drawP.world.get_mouse_world_pos() - translateData.startPos); + else { + commit_transform_selection(); + return; } - else if(mouse_collided_with_selection_aabb()) { - translateData.startPos = drawP.world.get_mouse_world_pos(); - transformOpHappening = TransformOperation::TRANSLATE; + break; + case TransformOperation::SCALE: + if(drawP.controls.leftClickHeld) { + WorldVec centerToScaleStart = scaleData.startPos - scaleData.centerPos; + Vector2f centerToScaleStartInCamSpace = drawP.world.drawData.cam.c.normalized_dir_to_space(centerToScaleStart.normalized()); + Vector2f scaleCenterPointInCamSpace = drawP.world.drawData.cam.c.to_space(scaleData.centerPos); + scaleData.currentPos = drawP.world.drawData.cam.c.from_space(project_point_on_line(drawP.world.main.input.mouse.pos, scaleCenterPointInCamSpace, (scaleCenterPointInCamSpace + centerToScaleStartInCamSpace).eval())); + + WorldVec centerToScaleCurrent = scaleData.currentPos - scaleData.centerPos; + + WorldScalar centerToScaleStartNorm = centerToScaleStart.norm(); + WorldScalar centerToScaleCurrentNorm = centerToScaleCurrent.norm(); + bool isAnyNumberZero = centerToScaleCurrentNorm == WorldScalar(0) || centerToScaleStartNorm == WorldScalar(0); + + if(!isAnyNumberZero) { + WorldMultiplier scaleAmount = WorldMultiplier(centerToScaleStartNorm) / WorldMultiplier(centerToScaleCurrentNorm); + + selectionTransformCoords = CoordSpaceHelperTransform(scaleData.centerPos, scaleAmount); + } } - } - break; - case TransformOperation::TRANSLATE: - if(drawP.controls.leftClickHeld) - selectionTransformCoords = CoordSpaceHelperTransform(drawP.world.get_mouse_world_pos() - translateData.startPos); - else { - commit_transform_selection(); - return; - } - break; - case TransformOperation::SCALE: - if(drawP.controls.leftClickHeld) { - WorldVec centerToScaleStart = scaleData.startPos - scaleData.centerPos; - Vector2f centerToScaleStartInCamSpace = drawP.world.drawData.cam.c.normalized_dir_to_space(centerToScaleStart.normalized()); - Vector2f scaleCenterPointInCamSpace = drawP.world.drawData.cam.c.to_space(scaleData.centerPos); - scaleData.currentPos = drawP.world.drawData.cam.c.from_space(project_point_on_line(drawP.world.main.input.mouse.pos, scaleCenterPointInCamSpace, (scaleCenterPointInCamSpace + centerToScaleStartInCamSpace).eval())); - - WorldVec centerToScaleCurrent = scaleData.currentPos - scaleData.centerPos; - - WorldScalar centerToScaleStartNorm = centerToScaleStart.norm(); - WorldScalar centerToScaleCurrentNorm = centerToScaleCurrent.norm(); - bool isAnyNumberZero = centerToScaleCurrentNorm == WorldScalar(0) || centerToScaleStartNorm == WorldScalar(0); - - if(!isAnyNumberZero) { - WorldMultiplier scaleAmount = WorldMultiplier(centerToScaleStartNorm) / WorldMultiplier(centerToScaleCurrentNorm); - - selectionTransformCoords = CoordSpaceHelperTransform(scaleData.centerPos, scaleAmount); + else { + commit_transform_selection(); + return; } - } - else { - commit_transform_selection(); - return; - } - break; - case TransformOperation::ROTATE_RELOCATE_CENTER: - if(drawP.controls.leftClickHeld) - rotateData.centerPos = drawP.world.get_mouse_world_pos(); - else - transformOpHappening = TransformOperation::NONE; - break; - case TransformOperation::ROTATE: - if(drawP.controls.leftClickHeld) { - Vector2f rotationPointDiff = drawP.world.main.input.mouse.pos - rotateData.centerHandlePoint; - rotateData.rotationAngle = std::atan2(rotationPointDiff.y(), rotationPointDiff.x()); - selectionTransformCoords = CoordSpaceHelperTransform(rotateData.centerPos, rotateData.rotationAngle); - } - else { - commit_transform_selection(); - return; - } - break; + break; + case TransformOperation::ROTATE_RELOCATE_CENTER: + if(drawP.controls.leftClickHeld) + rotateData.centerPos = drawP.world.get_mouse_world_pos(); + else + transformOpHappening = TransformOperation::NONE; + break; + case TransformOperation::ROTATE: + if(drawP.controls.leftClickHeld) { + Vector2f rotationPointDiff = drawP.world.main.input.mouse.pos - rotateData.centerHandlePoint; + rotateData.rotationAngle = std::atan2(rotationPointDiff.y(), rotationPointDiff.x()); + selectionTransformCoords = CoordSpaceHelperTransform(rotateData.centerPos, rotateData.rotationAngle); + } + else { + commit_transform_selection(); + return; + } + break; + } + } + else if(transformOpHappening != TransformOperation::NONE) { + commit_transform_selection(); + return; } if(drawP.world.main.input.key(InputManager::KEY_GENERIC_ESCAPE).pressed) @@ -505,12 +511,14 @@ void DrawingProgramSelection::draw_gui(SkCanvas* canvas, const DrawData& drawDat SkPaint p{SkColor4f{0.3f, 0.6f, 0.9f, 0.4f}}; canvas->drawPath(selectionRectPath, p); - if(transformOpHappening == TransformOperation::NONE || transformOpHappening == TransformOperation::ROTATE || transformOpHappening == TransformOperation::ROTATE_RELOCATE_CENTER) - drawP.draw_drag_circle(canvas, rotateData.centerHandlePoint, {0.9f, 0.5f, 0.1f, 1.0f}, drawData); - if(transformOpHappening == TransformOperation::NONE || transformOpHappening == TransformOperation::ROTATE) - drawP.draw_drag_circle(canvas, rotateData.handlePoint, {0.9f, 0.5f, 0.1f, 1.0f}, drawData, ROTATION_POINT_RADIUS_MULTIPLIER); - if(transformOpHappening == TransformOperation::NONE || transformOpHappening == TransformOperation::SCALE) - drawP.draw_drag_circle(canvas, scaleData.handlePoint, {0.1f, 0.9f, 0.9f, 1.0f}, drawData); + if(drawP.is_actual_selection_tool(drawP.drawTool->get_type())) { + if(transformOpHappening == TransformOperation::NONE || transformOpHappening == TransformOperation::ROTATE || transformOpHappening == TransformOperation::ROTATE_RELOCATE_CENTER) + drawP.draw_drag_circle(canvas, rotateData.centerHandlePoint, {0.9f, 0.5f, 0.1f, 1.0f}, drawData); + if(transformOpHappening == TransformOperation::NONE || transformOpHappening == TransformOperation::ROTATE) + drawP.draw_drag_circle(canvas, rotateData.handlePoint, {0.9f, 0.5f, 0.1f, 1.0f}, drawData, ROTATION_POINT_RADIUS_MULTIPLIER); + if(transformOpHappening == TransformOperation::NONE || transformOpHappening == TransformOperation::SCALE) + drawP.draw_drag_circle(canvas, scaleData.handlePoint, {0.1f, 0.9f, 0.9f, 1.0f}, drawData); + } } } diff --git a/src/DrawingProgram/EditTool.cpp b/src/DrawingProgram/EditTool.cpp index ed29447..de21da5 100644 --- a/src/DrawingProgram/EditTool.cpp +++ b/src/DrawingProgram/EditTool.cpp @@ -57,7 +57,7 @@ void EditTool::switch_tool(DrawingProgramToolType newTool) { controls.pointDragging = nullptr; controls.isEditing = false; - if(!drawP.is_selection_tool(newTool)) + if(!drawP.is_selection_allowing_tool(newTool)) drawP.selection.deselect_all(); } diff --git a/src/DrawingProgram/LassoSelectTool.cpp b/src/DrawingProgram/LassoSelectTool.cpp index 68f6c4a..2cadaff 100644 --- a/src/DrawingProgram/LassoSelectTool.cpp +++ b/src/DrawingProgram/LassoSelectTool.cpp @@ -42,7 +42,7 @@ void LassoSelectTool::gui_toolbox() { } void LassoSelectTool::switch_tool(DrawingProgramToolType newTool) { - if(!drawP.is_selection_tool(newTool)) + if(!drawP.is_selection_allowing_tool(newTool)) drawP.selection.deselect_all(); } diff --git a/src/DrawingProgram/PanCanvasTool.cpp b/src/DrawingProgram/PanCanvasTool.cpp index 874f403..7ea66e7 100644 --- a/src/DrawingProgram/PanCanvasTool.cpp +++ b/src/DrawingProgram/PanCanvasTool.cpp @@ -32,4 +32,6 @@ void PanCanvasTool::draw(SkCanvas* canvas, const DrawData& drawData) { } void PanCanvasTool::switch_tool(DrawingProgramToolType newTool) { + if(!drawP.is_selection_allowing_tool(newTool)) + drawP.selection.deselect_all(); } diff --git a/src/DrawingProgram/RectSelectTool.cpp b/src/DrawingProgram/RectSelectTool.cpp index a65058b..2c79acd 100644 --- a/src/DrawingProgram/RectSelectTool.cpp +++ b/src/DrawingProgram/RectSelectTool.cpp @@ -21,7 +21,7 @@ void RectSelectTool::gui_toolbox() { } void RectSelectTool::switch_tool(DrawingProgramToolType newTool) { - if(!drawP.is_selection_tool(newTool)) + if(!drawP.is_selection_allowing_tool(newTool)) drawP.selection.deselect_all(); } diff --git a/src/DrawingProgram/ZoomCanvasTool.cpp b/src/DrawingProgram/ZoomCanvasTool.cpp index 4994f85..b27a8a7 100644 --- a/src/DrawingProgram/ZoomCanvasTool.cpp +++ b/src/DrawingProgram/ZoomCanvasTool.cpp @@ -32,4 +32,6 @@ void ZoomCanvasTool::draw(SkCanvas* canvas, const DrawData& drawData) { } void ZoomCanvasTool::switch_tool(DrawingProgramToolType newTool) { + if(!drawP.is_selection_allowing_tool(newTool)) + drawP.selection.deselect_all(); }