From 8b1c42379178206fafac17733a4130930c06e94b Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sat, 4 Oct 2025 09:10:09 +0300 Subject: [PATCH] Pasted objects scale properly --- src/DrawCamera.cpp | 4 ++-- src/DrawingProgram/DrawingProgramCache.cpp | 4 ++++ src/DrawingProgram/DrawingProgramSelection.cpp | 14 ++++++++++++++ src/MainProgram.hpp | 1 + 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/DrawCamera.cpp b/src/DrawCamera.cpp index de8e818..d4f5ab6 100755 --- a/src/DrawCamera.cpp +++ b/src/DrawCamera.cpp @@ -122,11 +122,11 @@ void DrawCamera::update_main(World& w) { startZoomCameraPos = c.pos; } isAccurateZooming = newIsAccurateZooming; - if(isAccurateZooming) { + if(isAccurateZooming && startZoomVal != WorldScalar(0)) { WorldScalar zoomFactor(std::pow(1.0 + w.main.toolbar.dragZoomSpeed, w.main.toolbar.flipZoomToolDirection ? w.main.input.mouse.move.y() : -w.main.input.mouse.move.y())); c.scale(zoomFactor); WorldVec mVec = startZoomCameraPos - startZoomMousePos; - WorldScalar mX = c.inverseScale / startZoomVal; + WorldScalar mX = static_cast(WorldMultiplier(c.inverseScale) / WorldMultiplier(startZoomVal)); c.pos = startZoomMousePos + mVec * mX; } else if(w.drawProg.controls.middleClickHeld || (w.drawProg.controls.leftClickHeld && w.drawProg.drawTool->get_type() == DrawingProgramToolType::PAN)) diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index d5379fc..df5ec44 100644 --- a/src/DrawingProgram/DrawingProgramCache.cpp +++ b/src/DrawingProgram/DrawingProgramCache.cpp @@ -201,6 +201,9 @@ void DrawingProgramCache::build_bvh_node(const std::shared_ptrbounds.include_aabb_in_bounds(c->obj->worldAABB.value()); + //std::cout << "component count: " << components.size() << std::endl; + //std::cout << "bvhNode->bounds " << vec_pretty(bvhNode->bounds.min) << " " << vec_pretty(bvhNode->bounds.max) << std::endl; + build_bvh_node_coords_and_resolution(*bvhNode); if(components.size() < MAXIMUM_COMPONENTS_IN_SINGLE_NODE) { @@ -250,6 +253,7 @@ void DrawingProgramCache::build_bvh_node_coords_and_resolution(DrawingProgramCac #endif WorldVec cacheBoundDim = node.bounds.dim(); + //std::cout << "cache bound: " << vec_pretty(cacheBoundDim) << std::endl; if(cacheBoundDim.x() > cacheBoundDim.y()) { node.resolution.x() = MAX_DIMENSION_RESOLUTION; node.resolution.y() = MAX_DIMENSION_RESOLUTION * static_cast(cacheBoundDim.y() / cacheBoundDim.x()); diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index 3e0639f..9a368f2 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -6,6 +6,7 @@ #include "Helpers/FixedPoint.hpp" #include #include +#include #include #ifdef USE_SKIA_BACKEND_GRAPHITE @@ -274,6 +275,7 @@ void DrawingProgramSelection::selection_to_clipboard() { for(auto& c : compVecSort) clipboard.components.emplace_back(c->obj); clipboard.pos = initialSelectionAABB.center(); + clipboard.inverseScale = drawP.world.drawData.cam.c.inverseScale; drawP.world.rMan.copy_resource_set_to_map(resourceSet, clipboard.resources); } @@ -404,6 +406,14 @@ void DrawingProgramSelection::paste_clipboard() { std::vector> placedComponents; WorldVec mousePos = drawP.world.get_mouse_world_pos(); WorldVec moveVec = drawP.world.main.clipboard.pos - mousePos; + WorldMultiplier scaleMultiplier = WorldMultiplier(drawP.world.main.clipboard.inverseScale) / WorldMultiplier(drawP.world.drawData.cam.c.inverseScale); + for(auto& c : drawP.world.main.clipboard.components) { + if((c->coords.inverseScale / scaleMultiplier) < WorldScalar(0.001)) { + Logger::get().log("WORLDFATAL", "Some pasted objects will be too small! Scale up the canvas first (zoom in alot)"); + return; + } + } + std::unordered_map resourceRemapIDs; for(auto& r : clipboard.resources) resourceRemapIDs[r.first] = drawP.world.rMan.add_resource(r.second); @@ -414,6 +424,10 @@ void DrawingProgramSelection::paste_clipboard() { parallel_loop_container(compListInserted, [&](auto& c) { c->obj->remap_resource_ids(resourceRemapIDs); c->obj->coords.translate(-moveVec); + c->obj->coords.scale_about(mousePos, scaleMultiplier); + //std::cout << c->obj->coords.inverseScale << std::endl; + //if(c->obj->coords.inverseScale == WorldScalar(0)) + // throw std::runtime_error("DONE"); c->obj->commit_transform(drawP, false); }); DrawComponent::client_send_place_many(drawP, compListInserted); diff --git a/src/MainProgram.hpp b/src/MainProgram.hpp index a933343..b627e0b 100644 --- a/src/MainProgram.hpp +++ b/src/MainProgram.hpp @@ -60,6 +60,7 @@ class MainProgram { std::vector> components; std::unordered_map resources; WorldVec pos; + WorldScalar inverseScale; } clipboard; FontData fonts;