parent
92f76b8e36
commit
4d12f08da7
@ -1100,9 +1100,29 @@ bool GLGizmoEmboss::set_volume(ModelVolume *volume)
|
|||||||
m_unmodified_volume = {*volume->get_mesh_shared_ptr(), // copy
|
m_unmodified_volume = {*volume->get_mesh_shared_ptr(), // copy
|
||||||
tc, volume->get_matrix(), volume->name};
|
tc, volume->get_matrix(), volume->name};
|
||||||
|
|
||||||
|
// calculate scale for height and depth inside of scaled object instance
|
||||||
|
calculate_scale();
|
||||||
return true;
|
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)
|
ModelVolume *priv::get_model_volume(const GLVolume *gl_volume, const ModelObject *object)
|
||||||
{
|
{
|
||||||
int volume_id = gl_volume->volume_idx();
|
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);
|
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();
|
ImFont *imgui_font = m_style_manager.get_imgui_font();
|
||||||
if (imgui_font == nullptr) {
|
if (imgui_font == nullptr) {
|
||||||
// try create new imgui font
|
// 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();
|
imgui_font = m_style_manager.get_imgui_font();
|
||||||
}
|
}
|
||||||
bool exist_font =
|
bool exist_font =
|
||||||
@ -1498,7 +1519,7 @@ void GLGizmoEmboss::draw_text_input()
|
|||||||
if (prop.line_gap.has_value())
|
if (prop.line_gap.has_value())
|
||||||
append_warning(_u8L("Line gap"), _u8L("Unsupported visualization of gap between lines inside text input."));
|
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();
|
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)
|
if (imgui_size > StyleManager::max_imgui_font_size)
|
||||||
append_warning(_u8L("To tall"), _u8L("Diminished font height inside text input."));
|
append_warning(_u8L("To tall"), _u8L("Diminished font height inside text input."));
|
||||||
if (imgui_size < StyleManager::min_imgui_font_size)
|
if (imgui_size < StyleManager::min_imgui_font_size)
|
||||||
@ -1552,7 +1573,7 @@ void GLGizmoEmboss::draw_text_input()
|
|||||||
if (!range_text.empty() &&
|
if (!range_text.empty() &&
|
||||||
!m_imgui->contain_all_glyphs(imgui_font, range_text) ) {
|
!m_imgui->contain_all_glyphs(imgui_font, range_text) ) {
|
||||||
m_style_manager.clear_imgui_font();
|
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,
|
float step_fast,
|
||||||
const char *format,
|
const char *format,
|
||||||
bool use_inch,
|
bool use_inch,
|
||||||
std::optional<float> scale)
|
const std::optional<float>& scale)
|
||||||
{
|
{
|
||||||
// _variable which temporary keep value
|
// _variable which temporary keep value
|
||||||
float value_ = value;
|
float value_ = value;
|
||||||
@ -2758,16 +2779,8 @@ void GLGizmoEmboss::draw_style_edit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool use_inch = wxGetApp().app_config->get("use_inches") == "1";
|
bool use_inch = wxGetApp().app_config->get("use_inches") == "1";
|
||||||
|
draw_height(use_inch);
|
||||||
// IMPROVE: calc scale only when neccessary not each frame
|
draw_depth(use_inch);
|
||||||
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<float> height_scale;
|
|
||||||
if (!is_approx(norm_sq, 1.))
|
|
||||||
height_scale = sqrt(norm_sq);
|
|
||||||
|
|
||||||
draw_height(height_scale, use_inch);
|
|
||||||
|
|
||||||
#ifdef SHOW_WX_WEIGHT_INPUT
|
#ifdef SHOW_WX_WEIGHT_INPUT
|
||||||
if (wx_font.has_value()) {
|
if (wx_font.has_value()) {
|
||||||
@ -2793,16 +2806,10 @@ void GLGizmoEmboss::draw_style_edit() {
|
|||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
ImGui::SetTooltip("%s", _u8L("wx Make bold").c_str());
|
ImGui::SetTooltip("%s", _u8L("wx Make bold").c_str());
|
||||||
}
|
}
|
||||||
#endif // SHOW_WX_WEIGHT_INPUT
|
#endif // SHOW_WX_WEIGHT_INPUT
|
||||||
|
|
||||||
Vec3d depth_world = to_world.linear() * Vec3d(0., 0., 1.);
|
|
||||||
double depth_sq = depth_world.squaredNorm();
|
|
||||||
std::optional<float> depth_scale;
|
|
||||||
if (!is_approx(depth_sq, 1.)) depth_scale = sqrt(depth_sq);
|
|
||||||
draw_depth(depth_scale, use_inch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoEmboss::draw_height(std::optional<float> scale, bool use_inch)
|
void GLGizmoEmboss::draw_height(bool use_inch)
|
||||||
{
|
{
|
||||||
float &value = m_style_manager.get_style().prop.size_in_mm;
|
float &value = m_style_manager.get_style().prop.size_in_mm;
|
||||||
const EmbossStyle* stored_style = m_style_manager.get_stored_style();
|
const EmbossStyle* stored_style = m_style_manager.get_stored_style();
|
||||||
@ -2810,7 +2817,7 @@ void GLGizmoEmboss::draw_height(std::optional<float> scale, bool use_inch)
|
|||||||
const char *size_format = ((use_inch) ? "%.2f in" : "%.1f mm");
|
const char *size_format = ((use_inch) ? "%.2f in" : "%.1f mm");
|
||||||
const std::string revert_text_size = _u8L("Revert text size.");
|
const std::string revert_text_size = _u8L("Revert text size.");
|
||||||
const std::string& name = m_gui_cfg->translations.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
|
// size can't be zero or negative
|
||||||
priv::Limits::apply(value, priv::limits.size_in_mm);
|
priv::Limits::apply(value, priv::limits.size_in_mm);
|
||||||
// only different value need process
|
// only different value need process
|
||||||
@ -2830,7 +2837,7 @@ void GLGizmoEmboss::draw_height(std::optional<float> scale, bool use_inch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoEmboss::draw_depth(std::optional<float> scale, bool use_inch)
|
void GLGizmoEmboss::draw_depth(bool use_inch)
|
||||||
{
|
{
|
||||||
float &value = m_style_manager.get_style().prop.emboss;
|
float &value = m_style_manager.get_style().prop.emboss;
|
||||||
const EmbossStyle* stored_style = m_style_manager.get_stored_style();
|
const EmbossStyle* stored_style = m_style_manager.get_stored_style();
|
||||||
@ -2838,7 +2845,7 @@ void GLGizmoEmboss::draw_depth(std::optional<float> scale, bool use_inch)
|
|||||||
const std::string revert_emboss_depth = _u8L("Revert embossed depth.");
|
const std::string revert_emboss_depth = _u8L("Revert embossed depth.");
|
||||||
const char *size_format = ((use_inch) ? "%.3f in" : "%.2f mm");
|
const char *size_format = ((use_inch) ? "%.3f in" : "%.2f mm");
|
||||||
const std::string name = m_gui_cfg->translations.depth;
|
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
|
// size can't be zero or negative
|
||||||
priv::Limits::apply(value, priv::limits.emboss);
|
priv::Limits::apply(value, priv::limits.emboss);
|
||||||
process();
|
process();
|
||||||
|
@ -111,8 +111,8 @@ private:
|
|||||||
void draw_font_preview(FaceName &face, bool is_visible);
|
void draw_font_preview(FaceName &face, bool is_visible);
|
||||||
void draw_font_list();
|
void draw_font_list();
|
||||||
void draw_style_edit();
|
void draw_style_edit();
|
||||||
void draw_height(std::optional<float> scale, bool use_inch);
|
void draw_height(bool use_inch);
|
||||||
void draw_depth(std::optional<float> scale, bool use_inch);
|
void draw_depth(bool use_inch);
|
||||||
|
|
||||||
bool draw_italic_button();
|
bool draw_italic_button();
|
||||||
bool draw_bold_button();
|
bool draw_bold_button();
|
||||||
@ -126,7 +126,7 @@ private:
|
|||||||
|
|
||||||
bool rev_input_mm(const std::string &name, float &value, const float *default_value,
|
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,
|
const std::string &undo_tooltip, float step, float step_fast, const char *format,
|
||||||
bool use_inch = false, std::optional<float> scale = {});
|
bool use_inch, const std::optional<float>& scale);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reversible input float with option to restor default value
|
/// Reversible input float with option to restor default value
|
||||||
@ -309,6 +309,11 @@ private:
|
|||||||
// Only when drag text object it stores world position
|
// Only when drag text object it stores world position
|
||||||
std::optional<Transform3d> m_temp_transformation;
|
std::optional<Transform3d> m_temp_transformation;
|
||||||
|
|
||||||
|
// For text on scaled objects
|
||||||
|
std::optional<float> m_scale_height;
|
||||||
|
std::optional<float> m_scale_depth;
|
||||||
|
void calculate_scale();
|
||||||
|
|
||||||
// drawing icons
|
// drawing icons
|
||||||
GLTexture m_icons_texture;
|
GLTexture m_icons_texture;
|
||||||
void init_icons();
|
void init_icons();
|
||||||
|
@ -244,13 +244,6 @@ ImFont *StyleManager::get_imgui_font()
|
|||||||
|
|
||||||
const std::vector<StyleManager::Item> &StyleManager::get_styles() const{ return m_style_items; }
|
const std::vector<StyleManager::Item> &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)
|
void StyleManager::make_unique_name(std::string &name)
|
||||||
{
|
{
|
||||||
auto is_unique = [&](const std::string &name) -> bool {
|
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::min_imgui_font_size = 18.f;
|
||||||
float StyleManager::max_imgui_font_size = 60.f;
|
float StyleManager::max_imgui_font_size = 60.f;
|
||||||
float StyleManager::get_imgui_font_size(const FontProp &prop,
|
float StyleManager::get_imgui_font_size(const FontProp &prop, const FontFile &file, double scale)
|
||||||
const FontFile &file)
|
|
||||||
{
|
{
|
||||||
const auto &cn = prop.collection_number;
|
const auto &cn = prop.collection_number;
|
||||||
unsigned int font_index = (cn.has_value()) ? *cn : 0;
|
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):
|
// 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.
|
// 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
|
// inspiration inside of ImGuiWrapper::init_font
|
||||||
auto& ff = m_style_cache.font_file;
|
auto& ff = m_style_cache.font_file;
|
||||||
@ -404,7 +396,7 @@ ImFont *StyleManager::create_imgui_font(const std::string &text)
|
|||||||
ImFontAtlasFlags_NoPowerOfTwoHeight;
|
ImFontAtlasFlags_NoPowerOfTwoHeight;
|
||||||
|
|
||||||
const FontProp &font_prop = m_style_cache.style.prop;
|
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)
|
if (font_size < min_imgui_font_size)
|
||||||
font_size = min_imgui_font_size;
|
font_size = min_imgui_font_size;
|
||||||
if (font_size > max_imgui_font_size)
|
if (font_size > max_imgui_font_size)
|
||||||
|
@ -139,7 +139,7 @@ public:
|
|||||||
// Extend font atlas when not in glyph range
|
// Extend font atlas when not in glyph range
|
||||||
ImFont *get_imgui_font();
|
ImFont *get_imgui_font();
|
||||||
// initialize font range by unique symbols in text
|
// 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
|
// init truncated names of styles
|
||||||
void init_trunc_names(float max_width);
|
void init_trunc_names(float max_width);
|
||||||
@ -191,7 +191,7 @@ public:
|
|||||||
// Value out of limits is crop
|
// Value out of limits is crop
|
||||||
static float min_imgui_font_size;
|
static float min_imgui_font_size;
|
||||||
static float max_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:
|
private:
|
||||||
// erase font when not possible to load
|
// erase font when not possible to load
|
||||||
@ -231,11 +231,6 @@ private:
|
|||||||
size_t style_index = std::numeric_limits<size_t>::max();
|
size_t style_index = std::numeric_limits<size_t>::max();
|
||||||
|
|
||||||
} m_style_cache;
|
} 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);
|
void make_unique_name(std::string &name);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user