From 9c70ed01e5f3345f7468c64add674dbf7ba93590 Mon Sep 17 00:00:00 2001 From: Filip Sykala - NTB T15p Date: Mon, 20 Mar 2023 17:41:51 +0100 Subject: [PATCH] Fix add emboss volume on reflected --- src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp | 7 ++----- src/slic3r/Utils/RaycastManager.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp index bc0b5e8110..695399ab20 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -3462,15 +3462,12 @@ bool priv::start_create_volume_on_surface_job( if (!hit.has_value()) return false; - // priv::reset_skew(hit_to_world); - Transform3d instance = gl_volume->get_instance_transformation().get_matrix(); - // Create result volume transformation Transform3d surface_trmat = create_transformation_onto_surface(hit->position, hit->normal, priv::up_limit); const FontProp &font_prop = emboss_data.text_configuration.style.prop; apply_transformation(font_prop, surface_trmat); - // new transformation in world coor is surface_trmat - Transform3d volume_trmat = instance.inverse() * surface_trmat; + Transform3d instance = gl_volume->get_instance_transformation().get_matrix(); + Transform3d volume_trmat = instance.inverse() * surface_trmat; start_create_volume_job(obj, volume_trmat, emboss_data, volume_type); return true; } diff --git a/src/slic3r/Utils/RaycastManager.cpp b/src/slic3r/Utils/RaycastManager.cpp index f8f4442411..b2b7588555 100644 --- a/src/slic3r/Utils/RaycastManager.cpp +++ b/src/slic3r/Utils/RaycastManager.cpp @@ -153,6 +153,8 @@ std::optional RaycastManager::first_hit(const Vec3d& point, for (int i = 0; i < 3; ++i) pts[i] = tr * hit_mesh->vertices(tri[i]).cast(); Vec3d normal_world = (pts[1] - pts[0]).cross(pts[2] - pts[1]); + if (has_reflection(*hit_tramsformation)) + normal_world *= -1; normal_world.normalize(); SurfacePoint point_world{hit_world, normal_world}; @@ -298,8 +300,8 @@ RaycastManager::TrItems::const_iterator find(const RaycastManager::TrItems &item template inline void erase(std::vector &vec, const std::vector &flags) { - assert(vec.size() == flags.size()); - if (flags.empty()) return; + if (vec.size() < flags.size() || flags.empty()) + return; // reverse iteration over flags to erase indices from back to front. for (int i = static_cast(flags.size()) - 1; i >= 0; --i)