Zoom and pan tool no longer deselect objects
This commit is contained in:
parent
1945b04e69
commit
9f739ada6a
8 changed files with 95 additions and 78 deletions
|
|
@ -367,16 +367,20 @@ void DrawingProgram::update() {
|
|||
EraserTool* eraserTool = static_cast<EraserTool*>(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<DrawingProgramToolBase> newTool) {
|
||||
drawTool->switch_tool(newTool->get_type());
|
||||
drawTool = std::move(newTool);
|
||||
|
|
@ -412,7 +416,7 @@ void DrawingProgram::force_rebuild_cache() {
|
|||
EraserTool* eraserTool = static_cast<EraserTool*>(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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue