Fixed broken scale transform

This commit is contained in:
Yousef Khadadeh 2025-08-04 13:30:47 +03:00
parent b08c73ddf1
commit b4babf978e
4 changed files with 47 additions and 13 deletions

View file

@ -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<WorldScalar>(a.inverseScale) << "\n"
<< "rotation: " << a.rotation << "\n";
}

View file

@ -33,3 +33,6 @@ class CoordSpaceHelperTransform {
WorldMultiplier inverseScale{1};
double rotation = 0.0;
};
std::ostream& operator<<(std::ostream& os, const CoordSpaceHelperTransform& a);

View file

@ -92,7 +92,7 @@ void DrawingProgramSelection::calculate_aabb() {
}
}
void DrawingProgramSelection::deselect_all() {
void DrawingProgramSelection::deselect_all(bool readdObjectsToCache) {
if(is_something_selected()) {
std::vector<CollabListType::ObjectInfoPtr> a(selectedSet.begin(), selectedSet.end());
std::vector<std::pair<CollabListType::ObjectInfoPtr, CoordSpaceHelper>> 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<SCollision::AABB<WorldScalar>>& 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<float>());

View file

@ -8,7 +8,7 @@ class DrawingProgramSelection {
public:
DrawingProgramSelection(DrawingProgram& initDrawP);
void add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection<float>& 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<CollabListType::ObjectInfoPtr>& newSelection);
void commit_transform_selection();
void calculate_aabb();
void calculate_initial_rotate_center_location();
void rebuild_cam_space();