diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp index 3ea3eeda8..70793ce82 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -1100,9 +1100,29 @@ bool GLGizmoEmboss::set_volume(ModelVolume *volume) m_unmodified_volume = {*volume->get_mesh_shared_ptr(), // copy tc, volume->get_matrix(), volume->name}; + // calculate scale for height and depth inside of scaled object instance + calculate_scale(); return true; } +void GLGizmoEmboss::calculate_scale() { + Transform3d to_world = priv::world_matrix(m_parent.get_selection()); + auto to_world_linear = to_world.linear(); + Vec3d up_world = to_world_linear * Vec3d::UnitY(); + double norm_sq = up_world.squaredNorm(); + if (is_approx(norm_sq, 1.)) + m_scale_height.reset(); + else + m_scale_height = sqrt(norm_sq); + + Vec3d depth_world = to_world_linear * Vec3d::UnitZ(); + double depth_sq = depth_world.squaredNorm(); + if (is_approx(depth_sq, 1.)) + m_scale_depth.reset(); + else + m_scale_depth = sqrt(depth_sq); +} + ModelVolume *priv::get_model_volume(const GLVolume *gl_volume, const ModelObject *object) { int volume_id = gl_volume->volume_idx(); @@ -1455,10 +1475,11 @@ void GLGizmoEmboss::draw_text_input() return create_range_text(text, *ff.font_file, font_index, &exist_unknown); }; + double scale = m_scale_height.has_value() ? *m_scale_height : 1.; ImFont *imgui_font = m_style_manager.get_imgui_font(); if (imgui_font == nullptr) { // try create new imgui font - m_style_manager.create_imgui_font(create_range_text_prep()); + m_style_manager.create_imgui_font(create_range_text_prep(), scale); imgui_font = m_style_manager.get_imgui_font(); } bool exist_font = @@ -1498,7 +1519,7 @@ void GLGizmoEmboss::draw_text_input() if (prop.line_gap.has_value()) append_warning(_u8L("Line gap"), _u8L("Unsupported visualization of gap between lines inside text input.")); auto &ff = m_style_manager.get_font_file_with_cache(); - float imgui_size = StyleManager::get_imgui_font_size(prop, *ff.font_file); + float imgui_size = StyleManager::get_imgui_font_size(prop, *ff.font_file, scale); if (imgui_size > StyleManager::max_imgui_font_size) append_warning(_u8L("To tall"), _u8L("Diminished font height inside text input.")); if (imgui_size < StyleManager::min_imgui_font_size) @@ -1552,7 +1573,7 @@ void GLGizmoEmboss::draw_text_input() if (!range_text.empty() && !m_imgui->contain_all_glyphs(imgui_font, range_text) ) { m_style_manager.clear_imgui_font(); - m_style_manager.create_imgui_font(range_text); + m_style_manager.create_imgui_font(range_text, scale); } } @@ -2628,7 +2649,7 @@ bool GLGizmoEmboss::rev_input_mm(const std::string &name, float step_fast, const char *format, bool use_inch, - std::optional scale) + const std::optional& scale) { // _variable which temporary keep value float value_ = value; @@ -2758,16 +2779,8 @@ void GLGizmoEmboss::draw_style_edit() { } bool use_inch = wxGetApp().app_config->get("use_inches") == "1"; - - // IMPROVE: calc scale only when neccessary not each frame - Transform3d to_world = priv::world_matrix(m_parent.get_selection()); - Vec3d up_world = to_world.linear() * Vec3d(0., 1., 0.); - double norm_sq = up_world.squaredNorm(); - std::optional height_scale; - if (!is_approx(norm_sq, 1.)) - height_scale = sqrt(norm_sq); - - draw_height(height_scale, use_inch); + draw_height(use_inch); + draw_depth(use_inch); #ifdef SHOW_WX_WEIGHT_INPUT if (wx_font.has_value()) { @@ -2793,16 +2806,10 @@ void GLGizmoEmboss::draw_style_edit() { if (ImGui::IsItemHovered()) ImGui::SetTooltip("%s", _u8L("wx Make bold").c_str()); } -#endif // SHOW_WX_WEIGHT_INPUT - - Vec3d depth_world = to_world.linear() * Vec3d(0., 0., 1.); - double depth_sq = depth_world.squaredNorm(); - std::optional depth_scale; - if (!is_approx(depth_sq, 1.)) depth_scale = sqrt(depth_sq); - draw_depth(depth_scale, use_inch); +#endif // SHOW_WX_WEIGHT_INPUT } -void GLGizmoEmboss::draw_height(std::optional scale, bool use_inch) +void GLGizmoEmboss::draw_height(bool use_inch) { float &value = m_style_manager.get_style().prop.size_in_mm; const EmbossStyle* stored_style = m_style_manager.get_stored_style(); @@ -2810,7 +2817,7 @@ void GLGizmoEmboss::draw_height(std::optional scale, bool use_inch) const char *size_format = ((use_inch) ? "%.2f in" : "%.1f mm"); const std::string revert_text_size = _u8L("Revert text size."); const std::string& name = m_gui_cfg->translations.size; - if(rev_input_mm(name, value, stored, revert_text_size, 0.1f, 1.f, size_format, use_inch, scale)){ + if (rev_input_mm(name, value, stored, revert_text_size, 0.1f, 1.f, size_format, use_inch, m_scale_height)) { // size can't be zero or negative priv::Limits::apply(value, priv::limits.size_in_mm); // only different value need process @@ -2830,7 +2837,7 @@ void GLGizmoEmboss::draw_height(std::optional scale, bool use_inch) } } -void GLGizmoEmboss::draw_depth(std::optional scale, bool use_inch) +void GLGizmoEmboss::draw_depth(bool use_inch) { float &value = m_style_manager.get_style().prop.emboss; const EmbossStyle* stored_style = m_style_manager.get_stored_style(); @@ -2838,7 +2845,7 @@ void GLGizmoEmboss::draw_depth(std::optional scale, bool use_inch) const std::string revert_emboss_depth = _u8L("Revert embossed depth."); const char *size_format = ((use_inch) ? "%.3f in" : "%.2f mm"); const std::string name = m_gui_cfg->translations.depth; - if (rev_input_mm(name, value, stored, revert_emboss_depth, 0.1f, 1.f, size_format, use_inch, scale)) { + if (rev_input_mm(name, value, stored, revert_emboss_depth, 0.1f, 1.f, size_format, use_inch, m_scale_depth)) { // size can't be zero or negative priv::Limits::apply(value, priv::limits.emboss); process(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp index 54dace52b..7b0548fb5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp @@ -111,8 +111,8 @@ private: void draw_font_preview(FaceName &face, bool is_visible); void draw_font_list(); void draw_style_edit(); - void draw_height(std::optional scale, bool use_inch); - void draw_depth(std::optional scale, bool use_inch); + void draw_height(bool use_inch); + void draw_depth(bool use_inch); bool draw_italic_button(); bool draw_bold_button(); @@ -126,7 +126,7 @@ private: bool rev_input_mm(const std::string &name, float &value, const float *default_value, const std::string &undo_tooltip, float step, float step_fast, const char *format, - bool use_inch = false, std::optional scale = {}); + bool use_inch, const std::optional& scale); /// /// Reversible input float with option to restor default value @@ -309,6 +309,11 @@ private: // Only when drag text object it stores world position std::optional m_temp_transformation; + // For text on scaled objects + std::optional m_scale_height; + std::optional m_scale_depth; + void calculate_scale(); + // drawing icons GLTexture m_icons_texture; void init_icons(); diff --git a/src/slic3r/Utils/EmbossStyleManager.cpp b/src/slic3r/Utils/EmbossStyleManager.cpp index 22ad0827e..ff7795fdd 100644 --- a/src/slic3r/Utils/EmbossStyleManager.cpp +++ b/src/slic3r/Utils/EmbossStyleManager.cpp @@ -244,13 +244,6 @@ ImFont *StyleManager::get_imgui_font() const std::vector &StyleManager::get_styles() const{ return m_style_items; } -ImFont* StyleManager::extend_imgui_font_range(size_t index, const std::string& text) -{ - // TODO: start using merge mode - // ImFontConfig::MergeMode = true; - return create_imgui_font(text); -} - void StyleManager::make_unique_name(std::string &name) { auto is_unique = [&](const std::string &name) -> bool { @@ -369,8 +362,7 @@ void StyleManager::free_style_images() { float StyleManager::min_imgui_font_size = 18.f; float StyleManager::max_imgui_font_size = 60.f; -float StyleManager::get_imgui_font_size(const FontProp &prop, - const FontFile &file) +float StyleManager::get_imgui_font_size(const FontProp &prop, const FontFile &file, double scale) { const auto &cn = prop.collection_number; unsigned int font_index = (cn.has_value()) ? *cn : 0; @@ -381,10 +373,10 @@ float StyleManager::get_imgui_font_size(const FontProp &prop, // The point size is defined as 1/72 of the Anglo-Saxon inch (25.4 mm): // It is approximately 0.0139 inch or 352.8 um. - return c1 * std::abs(prop.size_in_mm) / 0.3528f; + return c1 * std::abs(prop.size_in_mm) / 0.3528f * scale; } -ImFont *StyleManager::create_imgui_font(const std::string &text) +ImFont *StyleManager::create_imgui_font(const std::string &text, double scale) { // inspiration inside of ImGuiWrapper::init_font auto& ff = m_style_cache.font_file; @@ -404,7 +396,7 @@ ImFont *StyleManager::create_imgui_font(const std::string &text) ImFontAtlasFlags_NoPowerOfTwoHeight; const FontProp &font_prop = m_style_cache.style.prop; - float font_size = get_imgui_font_size(font_prop, font_file); + float font_size = get_imgui_font_size(font_prop, font_file, scale); if (font_size < min_imgui_font_size) font_size = min_imgui_font_size; if (font_size > max_imgui_font_size) diff --git a/src/slic3r/Utils/EmbossStyleManager.hpp b/src/slic3r/Utils/EmbossStyleManager.hpp index 3851a1051..858de89ac 100644 --- a/src/slic3r/Utils/EmbossStyleManager.hpp +++ b/src/slic3r/Utils/EmbossStyleManager.hpp @@ -139,7 +139,7 @@ public: // Extend font atlas when not in glyph range ImFont *get_imgui_font(); // initialize font range by unique symbols in text - ImFont *create_imgui_font(const std::string& text); + ImFont *create_imgui_font(const std::string& text, double scale); // init truncated names of styles void init_trunc_names(float max_width); @@ -191,7 +191,7 @@ public: // Value out of limits is crop static float min_imgui_font_size; static float max_imgui_font_size; - static float get_imgui_font_size(const FontProp &prop, const Slic3r::Emboss::FontFile &file); + static float get_imgui_font_size(const FontProp &prop, const Slic3r::Emboss::FontFile &file, double scale); private: // erase font when not possible to load @@ -231,11 +231,6 @@ private: size_t style_index = std::numeric_limits::max(); } m_style_cache; - - // extend actual imgui font when exist unknown char in text - // NOTE: imgui_font has to be unused - // return true when extend range otherwise FALSE - ImFont *extend_imgui_font_range(size_t font_index, const std::string &text); void make_unique_name(std::string &name);