Scale and translate transformations improved

This commit is contained in:
Yousef Khadadeh 2025-07-28 09:17:11 +03:00
parent b745cae794
commit 60230cc8ef
2 changed files with 34 additions and 13 deletions

View file

@ -85,9 +85,7 @@ void DrawingProgramSelection::deselect_all() {
for(auto& transformedObj : a)
transformsFrom.emplace_back(transformedObj, transformedObj->obj->coords);
selectedSet.clear();
cache.clear();
transformOpHappening = TransformOperation::NONE;
reset_selection_data();
bool isSingleThread = a.size() < DrawingProgramCache::MINIMUM_COMPONENTS_TO_START_REBUILD;
parallel_loop_container(a, [&](auto& obj) {
@ -101,7 +99,7 @@ void DrawingProgramSelection::deselect_all() {
drawP.compCache.add_component(obj);
}
selectionTransformCoords = CoordSpaceHelper();
reset_transform_data();
std::vector<std::pair<CollabListType::ObjectInfoPtr, CoordSpaceHelper>> transformsTo;
std::vector<std::pair<ServerClientID, CoordSpaceHelper>> transformsToSend;
@ -175,10 +173,8 @@ bool DrawingProgramSelection::is_selected(const CollabListType::ObjectInfoPtr& o
void DrawingProgramSelection::delete_all() {
if(is_something_selected()) {
drawP.client_erase_set(selectedSet);
selectedSet.clear();
cache.clear();
transformOpHappening = TransformOperation::NONE;
selectionTransformCoords = CoordSpaceHelper();
reset_selection_data();
reset_transform_data();
}
}
@ -207,7 +203,7 @@ void DrawingProgramSelection::update() {
case TransformOperation::NONE:
if(drawP.controls.leftClick) {
if(mouse_collided_with_scale_point()) {
scaleData.currentPos = scaleData.startPos = drawP.world.get_mouse_world_pos();
scaleData.currentPos = scaleData.startPos = selectionTransformCoords.from_space_world(initialSelectionAABB.max);
scaleData.centerPos = selectionTransformCoords.from_space_world(initialSelectionAABB.center());
startingSelectionTransformCoords = selectionTransformCoords;
transformOpHappening = TransformOperation::SCALE;
@ -219,15 +215,20 @@ void DrawingProgramSelection::update() {
startingSelectionTransformCoords = selectionTransformCoords;
transformOpHappening = TransformOperation::ROTATE;
}
else if(mouse_collided_with_selection_aabb())
else if(mouse_collided_with_selection_aabb()) {
translateData.startPos = drawP.world.get_mouse_world_pos();
startingSelectionTransformCoords = selectionTransformCoords;
transformOpHappening = TransformOperation::TRANSLATE;
}
else
deselect_all();
}
break;
case TransformOperation::TRANSLATE:
if(drawP.controls.leftClickHeld)
selectionTransformCoords.translate(drawP.world.drawData.cam.c.dir_from_space(drawP.world.main.input.mouse.move));
if(drawP.controls.leftClickHeld) {
selectionTransformCoords = startingSelectionTransformCoords;
selectionTransformCoords.translate(drawP.world.get_mouse_world_pos() - translateData.startPos);
}
else {
transformOpHappening = TransformOperation::NONE;
calculate_initial_rotate_center_location();
@ -350,3 +351,16 @@ void DrawingProgramSelection::draw_gui(SkCanvas* canvas, const DrawData& drawDat
drawP.draw_drag_circle(canvas, scaleData.handlePoint, {0.1f, 0.9f, 0.9f, 1.0f}, drawData);
}
}
void DrawingProgramSelection::reset_selection_data() {
selectedSet.clear();
cache.clear();
}
void DrawingProgramSelection::reset_transform_data() {
selectionTransformCoords = CoordSpaceHelper();
transformOpHappening = TransformOperation::NONE;
translateData = TranslationData();
scaleData = ScaleData();
rotateData = RotationData();
}

View file

@ -49,6 +49,10 @@ class DrawingProgramSelection {
CoordSpaceHelper startingSelectionTransformCoords;
struct TranslationData {
WorldVec startPos;
} translateData;
struct ScaleData {
WorldVec startPos;
WorldVec centerPos;
@ -60,6 +64,9 @@ class DrawingProgramSelection {
WorldVec centerPos;
Vector2f centerHandlePoint;
Vector2f handlePoint;
double rotationAngle;
double rotationAngle = 0.0;
} rotateData;
void reset_selection_data();
void reset_transform_data();
};