diff --git a/src/libslic3r/EmbossShape.hpp b/src/libslic3r/EmbossShape.hpp index 9094d2ad5d..3e4a950037 100644 --- a/src/libslic3r/EmbossShape.hpp +++ b/src/libslic3r/EmbossShape.hpp @@ -105,7 +105,7 @@ struct EmbossShape // Note: image is only cache it is not neccessary to store // Store file data as plain string - assert(file_data != nullptr); + // For Embossed text file_data are nullptr ar(path, path_in_3mf, (file_data != nullptr) ? *file_data : std::string("")); } template void load(Archive &ar) { diff --git a/src/slic3r/GUI/SurfaceDrag.cpp b/src/slic3r/GUI/SurfaceDrag.cpp index 100847bf48..27c28aa46f 100644 --- a/src/slic3r/GUI/SurfaceDrag.cpp +++ b/src/slic3r/GUI/SurfaceDrag.cpp @@ -198,15 +198,20 @@ std::optional calc_distance(const GLVolume &gl_volume, RaycastManager &ra if (volume->is_the_only_one_part()) return {}; + if (!volume->emboss_shape.has_value()) + return {}; + RaycastManager::AllowVolumes condition = create_condition(object->volumes, volume->id()); RaycastManager::Meshes meshes = create_meshes(canvas, condition); raycaster.actualize(*instance, &condition, &meshes); - return calc_distance(gl_volume, raycaster, &condition); + return calc_distance(gl_volume, raycaster, &condition, volume->emboss_shape->fix_3mf_tr); } -std::optional calc_distance(const GLVolume &gl_volume, const RaycastManager &raycaster, const RaycastManager::ISkip *condition) -{ +std::optional calc_distance(const GLVolume &gl_volume, const RaycastManager &raycaster, + const RaycastManager::ISkip *condition, const std::optional& fix) { Transform3d w = gl_volume.world_matrix(); + if (fix.has_value()) + w = w * fix->inverse(); Vec3d p = w.translation(); Vec3d dir = -get_z_base(w); auto hit_opt = raycaster.closest_hit(p, dir, condition); @@ -572,7 +577,7 @@ bool start_dragging(const Vec2d &mouse_pos, std::optional start_distance; if (!volume->emboss_shape->projection.use_surface) - start_distance = calc_distance(gl_volume, raycast_manager, &condition); + start_distance = calc_distance(gl_volume, raycast_manager, &condition, volume->emboss_shape->fix_3mf_tr); surface_drag = SurfaceDrag{mouse_offset, world_tr, instance_tr_inv, gl_volume_ptr, condition, start_angle, start_distance, true, mouse_offset_without_sla_shift}; diff --git a/src/slic3r/GUI/SurfaceDrag.hpp b/src/slic3r/GUI/SurfaceDrag.hpp index 44c57c41c7..f6bd731ae9 100644 --- a/src/slic3r/GUI/SurfaceDrag.hpp +++ b/src/slic3r/GUI/SurfaceDrag.hpp @@ -89,7 +89,8 @@ std::optional calc_surface_offset(const Selection &selection, RaycastMana /// Contain model /// Calculated distance from surface std::optional calc_distance(const GLVolume &gl_volume, RaycastManager &raycaster, GLCanvas3D &canvas); -std::optional calc_distance(const GLVolume &gl_volume, const RaycastManager &raycaster, const RaycastManager::ISkip *condition); +std::optional calc_distance(const GLVolume &gl_volume, const RaycastManager &raycaster, + const RaycastManager::ISkip *condition, const std::optional& fix); /// /// Calculate up vector angle