diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp
index 056719c19..44e664f8f 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp
@@ -375,6 +375,7 @@ static Vec2d calc_mouse_to_center_text_offset(const Vec2d &mouse, const ModelVol
/// Containe what is selected
/// Slected when only one volume otherwise nullptr
static const GLVolume *get_gl_volume(const Selection &selection);
+static GLVolume *get_gl_volume(const GLCanvas3D &canvas);
///
/// Get transformation to world
@@ -395,6 +396,7 @@ static void change_window_position(std::optional &output_window_offset,
} // namespace priv
const GLVolume *priv::get_gl_volume(const Selection &selection) {
+ // return selection.get_first_volume();
const auto &list = selection.get_volume_idxs();
if (list.size() != 1)
return nullptr;
@@ -402,6 +404,19 @@ const GLVolume *priv::get_gl_volume(const Selection &selection) {
return selection.get_volume(volume_idx);
}
+GLVolume *priv::get_gl_volume(const GLCanvas3D &canvas) {
+ const GLVolume *gl_volume = get_gl_volume(canvas.get_selection());
+ if (gl_volume == nullptr)
+ return nullptr;
+
+ const GLVolumePtrs &gl_volumes = canvas.get_volumes().volumes;
+ for (GLVolume *v : gl_volumes)
+ if (v->composite_id == gl_volume->composite_id)
+ return v;
+
+ return nullptr;
+}
+
Transform3d priv::world_matrix(const GLVolume *gl_volume, const Model *model)
{
if (!gl_volume)
@@ -536,17 +551,40 @@ void reset_skew(Transform3d& m)
m = Eigen::Translation3d(m.translation()) * Transform3d(u * Eigen::Scaling(new_scale_factor(s)) * v.transpose());// * mirror;
}
+void reset_skew_respect_z(Transform3d &m)
+{
+ Vec3d z_before = m * Vec3d::UnitZ();
+ priv::reset_skew(m);
+ Vec3d z_after = m * Vec3d::UnitZ();
+
+ Transform3d rot; // = Transform3d::Identity();
+ if (priv::allign_vec(z_after, z_before, rot))
+ m = rot * m;
+}
+
// Multiply from right
static Transform3d surface_transformR(const Vec3d &p, const Vec3d &n, const Transform3d &v, const Transform3d &i) {
Transform3d to_volume = (i * v).inverse();
Vec3d offset_volume = to_volume * p;
Transform3d translate{Eigen::Translation(offset_volume)};
+
+ // new transformation for volume
+ Transform3d v_new = v * translate;
+ // rotation when exists
Transform3d rotate;
+
// normal transformed to volume
Vec3d z_t = to_volume.linear() * n;
- bool exist_rotate = priv::allign_z(z_t, rotate);
- return v * translate * rotate;
+ if (priv::allign_z(z_t, rotate))
+ v_new = v_new * rotate;
+
+ // Reset skew in world
+ Transform3d w_new = i * v_new;
+ priv::reset_skew_respect_z(w_new);
+ v_new = i.inverse() * w_new;
+
+ return v_new;
}
///
@@ -581,7 +619,7 @@ static Transform3d surface_transformL(const Vec3d &p, const Vec3d &n, const Tran
// w2 .. wanted world transformation
Transform3d w2 = tr * rot_w;
- //priv::reset_skew(w2);
+ //priv::reset_skew_respect_z(w2);
// _ .. inverse
// i_ .. instance inverse
@@ -721,15 +759,15 @@ bool GLGizmoEmboss::on_mouse_for_translate(const wxMouseEvent &mouse_event)
if (m_volume == nullptr)
return false;
- // must exist hover object
- int hovered_id = m_parent.get_first_hover_volume_idx();
- if (hovered_id < 0)
+ if (m_parent.get_first_hover_volume_idx() < 0)
return false;
- GLVolume *gl_volume = m_parent.get_volumes().volumes[hovered_id];
- const ModelObjectPtrs &objects = m_parent.get_model()->objects;
+ GLVolume *gl_volume = priv::get_gl_volume(m_parent);
+ if (gl_volume == nullptr)
+ return false;
// hovered object must be actual text volume
+ const ModelObjectPtrs &objects = m_parent.get_model()->objects;
if (m_volume != priv::get_model_volume(gl_volume, objects))
return false;
@@ -825,7 +863,7 @@ bool GLGizmoEmboss::on_mouse_for_translate(const wxMouseEvent &mouse_event)
Transform3d volume_L = priv::surface_transformL(hit_position_world, hit_normal_world, volume, instance);
Transform3d volume_2 = priv::surface_transform2(hit_position_world, hit_normal_world, volume, instance);
Transform3d volume_3 = priv::surface_transform3(hit_position_world, hit_normal_world, volume, instance);
- //volume_new = volume_L;
+ volume_new = volume_R;
assert(volume_new.matrix()(0, 0) == volume_new.matrix()(0, 0)); // Check valid transformation not a NAN
if (volume_new.matrix()(0, 0) != volume_new.matrix()(0, 0))
@@ -3701,6 +3739,21 @@ void GLGizmoEmboss::draw_advanced()
ImGui::SetTooltip("%s", _u8L("Use camera direction for text orientation").c_str());
}
+ ImGui::SameLine();
+ if (ImGui::Button(_u8L("Reset scale").c_str())) {
+ GLVolume *gl_volume = priv::get_gl_volume(m_parent);
+ if (gl_volume != nullptr) {
+ Transform3d w = gl_volume->world_matrix();
+ priv::reset_skew_respect_z(w);
+ Transform3d i = gl_volume->get_instance_transformation().get_matrix();
+ Transform3d v_new = i.inverse() * w;
+ gl_volume->set_volume_transformation(v_new);
+ m_parent.do_move(L("Reset scale"));
+ }
+ } else if (ImGui::IsItemHovered()) {
+ ImGui::SetTooltip("%s", _u8L("Reset skew of text to be normal in world").c_str());
+ }
+
#ifdef ALLOW_DEBUG_MODE
ImGui::Text("family = %s", (font_prop.family.has_value() ?
font_prop.family->c_str() :
@@ -4197,7 +4250,10 @@ bool priv::start_create_volume_on_surface_job(
const FontProp &font_prop = emboss_data.text_configuration.style.prop;
apply_transformation(font_prop, surface_trmat);
Transform3d world_new = hit_to_world * surface_trmat;
- // priv::reset_skew(world_new);
+
+ // Reset skew
+ priv::reset_skew_respect_z(world_new);
+
Transform3d volume_trmat = instance.inverse() * world_new;
start_create_volume_job(obj, volume_trmat, emboss_data, volume_type);
return true;