OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GUI::TextLinesModel Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/TextLines.hpp>

Collaboration diagram for Slic3r::GUI::TextLinesModel:

Public Member Functions

void init (const Transform3d &text_tr, const ModelVolumePtrs &volumes_to_slice, Emboss::StyleManager &style_manager, unsigned count_lines)
 Initialize model and lines.
void render (const Transform3d &text_world)
bool is_init () const
void reset ()
const Slic3r::Emboss::TextLines & get_lines () const

Static Public Member Functions

static double calc_line_height_in_mm (const Slic3r::Emboss::FontFile &ff, const FontProp &fp)

Private Attributes

Slic3r::Emboss::TextLines m_lines
GLModel m_model
const double ascent_ratio_offset = 1/3.

Detailed Description

Member Function Documentation

◆ calc_line_height_in_mm()

double TextLinesModel::calc_line_height_in_mm ( const Slic3r::Emboss::FontFile & ff,
const FontProp & fp )
static
368{
369 int line_height = Slic3r::Emboss::get_line_height(ff, fp); // In shape size
371 return line_height * scale;
372}
int scale(const int val)
Definition WipeTowerDialog.cpp:58
int get_line_height(const FontFile &font, const FontProp &prop)
Read from font file and properties height of line with spacing.
Definition Emboss.cpp:1280
double get_text_shape_scale(const FontProp &fp, const FontFile &ff)
Calculate scale for glyph shape convert from shape points to mm.
Definition Emboss.cpp:1570

References Slic3r::Emboss::get_line_height(), Slic3r::Emboss::get_text_shape_scale(), and scale().

Referenced by init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_lines()

const Slic3r::Emboss::TextLines & Slic3r::GUI::TextLinesModel::get_lines ( ) const
inline
34{ return m_lines; }
Slic3r::Emboss::TextLines m_lines
Definition TextLines.hpp:38

References m_lines.

Referenced by anonymous_namespace{GLGizmoEmboss.cpp}::create_emboss_data_base().

Here is the caller graph for this function:

◆ init()

void TextLinesModel::init ( const Transform3d & text_tr,
const ModelVolumePtrs & volumes_to_slice,
Emboss::StyleManager & style_manager,
unsigned count_lines )

Initialize model and lines.

Parameters
text_trTransformation of text volume inside object (aka inside of instance)
volumes_to_sliceVector of volumes to be sliced
style_managerContain Font file, size and align
count_linesCount lines of embossed text(for veritcal alignment)
244{
245 assert(style_manager.is_active_font());
246 if (!style_manager.is_active_font())
247 return;
248 const auto &ffc = style_manager.get_font_file_with_cache();
249 assert(ffc.has_value());
250 if (!ffc.has_value())
251 return;
252 const auto &ff_ptr = ffc.font_file;
253 assert(ff_ptr != nullptr);
254 if (ff_ptr == nullptr)
255 return;
256 const FontFile &ff = *ff_ptr;
257 const FontProp &fp = style_manager.get_font_prop();
258
259 FontProp::VerticalAlign align = fp.align.second;
260
261 double line_height_mm = calc_line_height_in_mm(ff, fp);
262 assert(line_height_mm > 0);
263 if (line_height_mm <= 0)
264 return;
265
266 m_model.reset();
267 m_lines.clear();
268
269 // size_in_mm .. contain volume scale and should be ascent value in mm
270 double line_offset = fp.size_in_mm * ascent_ratio_offset;
271 double first_line_center = line_offset + get_align_y_offset_in_mm(align, count_lines, ff, fp);
272 std::vector<float> line_centers(count_lines);
273 for (size_t i = 0; i < count_lines; ++i)
274 line_centers[i] = static_cast<float>(first_line_center - i * line_height_mm);
275
276 // contour transformation
277 Transform3d c_trafo = text_tr * get_rotation();
278 Transform3d c_trafo_inv = c_trafo.inverse();
279
280 std::vector<Polygons> line_contours(count_lines);
281 for (const ModelVolume *volume : volumes_to_slice) {
282 MeshSlicingParams slicing_params;
283 slicing_params.trafo = c_trafo_inv * volume->get_matrix();
284 for (size_t i = 0; i < count_lines; ++i) {
285 const Polygons polys = Slic3r::slice_mesh(volume->mesh().its, line_centers[i], slicing_params);
286 if (polys.empty())
287 continue;
288 Polygons &contours = line_contours[i];
289 contours.insert(contours.end(), polys.begin(), polys.end());
290 }
291 }
292
293 // fix for text line out of object
294 // When move text close to edge - line center could be out of object
295 for (Polygons &contours: line_contours) {
296 if (!contours.empty())
297 continue;
298
299 // use line center at zero, there should be some contour.
300 float line_center = 0.f;
301 for (const ModelVolume *volume : volumes_to_slice) {
302 MeshSlicingParams slicing_params;
303 slicing_params.trafo = c_trafo_inv * volume->get_matrix();
304 const Polygons polys = Slic3r::slice_mesh(volume->mesh().its, line_center, slicing_params);
305 if (polys.empty())
306 continue;
307 contours.insert(contours.end(), polys.begin(), polys.end());
308 }
309 }
310
311 m_lines = select_closest_contour(line_contours);
312 assert(m_lines.size() == count_lines);
313 assert(line_centers.size() == count_lines);
314 for (size_t i = 0; i < count_lines; ++i)
315 m_lines[i].y = line_centers[i];
316
317 bool is_mirrored = has_reflection(text_tr);
318 float radius = static_cast<float>(line_height_mm / 20.);
319 //*
320 GLModel::Geometry geometry = create_geometry(m_lines, radius, is_mirrored);
321 if (geometry.vertices_count() == 0 || geometry.indices_count() == 0)
322 return;
323 m_model.init_from(std::move(geometry));
324 /*/
325 // slower solution
326 ColorRGBA color(.7f, .7f, .7f, .7f); // Transparent Gray
327 m_model.set_color(color);
328 m_model.init_from(create_its(m_lines));
329 //*/
330}
const FontProp & get_font_prop() const
Definition EmbossStyleManager.hpp:123
Slic3r::Emboss::FontFileWithCache & get_font_file_with_cache()
Definition EmbossStyleManager.hpp:127
bool is_active_font()
Definition EmbossStyleManager.cpp:320
static double calc_line_height_in_mm(const Slic3r::Emboss::FontFile &ff, const FontProp &fp)
Definition TextLines.cpp:367
GLModel m_model
Definition TextLines.hpp:41
const double ascent_ratio_offset
Definition TextLines.hpp:46
double get_align_y_offset_in_mm(FontProp::VerticalAlign align, unsigned count_lines, const FontFile &ff, const FontProp &fp)
Calculate Vertical align.
Definition Emboss.cpp:2115
Eigen::Transform< double, 3, Eigen::Affine, Eigen::DontAlign > Transform3d
Definition Point.hpp:96
std::vector< Polygon, PointsAllocator< Polygon > > Polygons
Definition Polygon.hpp:22
bool has_reflection(const Transform3d &transform)
Check whether transformation matrix contains odd number of mirroring. NOTE: In code is sometime funct...
Definition Point.hpp:179
std::vector< Polygons > slice_mesh(const indexed_triangle_set &mesh, const std::vector< float > &zs, const MeshSlicingParams &params, std::function< void()> throw_on_cancel)
Definition TriangleMeshSlicer.cpp:1997
Eigen::AngleAxis< double > get_rotation()
Definition TextLines.cpp:195
GLModel::Geometry create_geometry(const TextLines &lines, float radius, bool is_mirrored)
Definition TextLines.cpp:213
TextLines select_closest_contour(const std::vector< Polygons > &line_contours)
Definition TextLines.cpp:154
VerticalAlign
Definition TextConfiguration.hpp:50
Align align
Definition TextConfiguration.hpp:54
float size_in_mm
Definition TextConfiguration.hpp:63
size_t indices_count() const
Definition GLModel.hpp:101
size_t vertices_count() const
Definition GLModel.hpp:100
Transform3d trafo
Definition TriangleMeshSlicer.hpp:41

References Slic3r::FontProp::align, ascent_ratio_offset, calc_line_height_in_mm(), Slic3r::Emboss::get_align_y_offset_in_mm(), Slic3r::GUI::Emboss::StyleManager::get_font_file_with_cache(), Slic3r::GUI::Emboss::StyleManager::get_font_prop(), Slic3r::has_reflection(), Slic3r::GUI::GLModel::Geometry::indices_count(), Slic3r::GUI::Emboss::StyleManager::is_active_font(), m_lines, m_model, Slic3r::FontProp::size_in_mm, Slic3r::slice_mesh(), Slic3r::MeshSlicingParams::trafo, and Slic3r::GUI::GLModel::Geometry::vertices_count().

Referenced by anonymous_namespace{GLGizmoEmboss.cpp}::init_text_lines().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_init()

bool Slic3r::GUI::TextLinesModel::is_init ( ) const
inline
32{ return m_model.is_initialized(); }

References m_model.

Referenced by anonymous_namespace{GLGizmoEmboss.cpp}::create_emboss_data_base().

Here is the caller graph for this function:

◆ render()

void TextLinesModel::render ( const Transform3d & text_world)
333{
334 if (!m_model.is_initialized())
335 return;
336
337 GUI_App &app = wxGetApp();
338 const GLShaderProgram *shader = app.get_shader("flat");
339 if (shader == nullptr)
340 return;
341
342 const Camera &camera = app.plater()->get_camera();
343
344 shader->start_using();
345 shader->set_uniform("view_model_matrix", camera.get_view_matrix() * text_world);
346 shader->set_uniform("projection_matrix", camera.get_projection_matrix());
347
348 bool is_depth_test = glIsEnabled(GL_DEPTH_TEST);
349 if (!is_depth_test)
351
352 bool is_blend = glIsEnabled(GL_BLEND);
353 if (!is_blend)
355 // glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
356
357 m_model.render();
358
359 if (!is_depth_test)
361 if (!is_blend)
363
364 shader->stop_using();
365}
#define glsafe(cmd)
Definition OpenGLUtils.hpp:25
void set_uniform(const char *name, int value) const
Definition GLShader.hpp:54
void start_using() const
Definition GLShader.cpp:207
void stop_using() const
Definition GLShader.cpp:213
Plater * plater()
Definition GUI_App.cpp:9709
GLShaderProgram * get_shader(const std::string &shader_name)
Definition GUI_App.hpp:834
const Camera & get_camera() const
Definition Plater.cpp:22567
#define glEnable
Definition gl.h:3667
#define GL_DEPTH_TEST
Definition gl.h:574
#define GL_BLEND
Definition gl.h:275
#define glIsEnabled
Definition gl.h:4165
#define glDisable
Definition gl.h:3607
@ Camera
Definition Shortcuts.hpp:72
const Transform3d & get_projection_matrix() const
Definition Camera.hpp:116
const Transform3d & get_view_matrix() const
Definition Camera.hpp:115

References Slic3r::GUI::Plater::get_camera(), Slic3r::GUI::Camera::get_projection_matrix(), Slic3r::GUI::GUI_App::get_shader(), Slic3r::GUI::Camera::get_view_matrix(), GL_BLEND, GL_DEPTH_TEST, glDisable, glEnable, glIsEnabled, glsafe, m_model, Slic3r::GUI::GUI_App::plater(), Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), and Slic3r::GLShaderProgram::stop_using().

Here is the call graph for this function:

◆ reset()

void Slic3r::GUI::TextLinesModel::reset ( )
inline
33{ m_model.reset(); m_lines.clear(); }

References m_lines, and m_model.

Referenced by anonymous_namespace{GLGizmoEmboss.cpp}::create_emboss_data_base().

Here is the caller graph for this function:

Member Data Documentation

◆ ascent_ratio_offset

const double Slic3r::GUI::TextLinesModel::ascent_ratio_offset = 1/3.
private

Referenced by init().

◆ m_lines

Slic3r::Emboss::TextLines Slic3r::GUI::TextLinesModel::m_lines
private

Referenced by get_lines(), init(), and reset().

◆ m_model

GLModel Slic3r::GUI::TextLinesModel::m_model
private

Referenced by init(), is_init(), render(), and reset().


The documentation for this class was generated from the following files:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/TextLines.hpp
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/TextLines.cpp