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

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

Inheritance diagram for Slic3r::GUI::GLGizmoMmuSegmentation:
Collaboration diagram for Slic3r::GUI::GLGizmoMmuSegmentation:

Public Types

enum class  EGrabberExtension {
  None = 0 , PosX = 1 << 0 , NegX = 1 << 1 , PosY = 1 << 2 ,
  NegY = 1 << 3 , PosZ = 1 << 4 , NegZ = 1 << 5
}
enum  EState { Off , On , Num_States }

Public Member Functions

 GLGizmoMmuSegmentation (GLCanvas3D &parent, const std::string &icon_filename, unsigned int sprite_id)
 ~GLGizmoMmuSegmentation () override=default
void render_painter_gizmo () override
void data_changed (bool is_serializing) override
 Is called when data (Selection) is changed.
const float get_cursor_radius_min () const override
bool on_number_key_down (int number)
bool on_tool_shortcut (Shortcut shortcut) override
virtual bool gizmo_event (SLAGizmoEventType action, const Vec2d &mouse_position, bool shift_down, bool alt_down, bool control_down)
virtual const float get_cursor_radius_max () const
virtual const float get_cursor_radius_step () const
virtual const float get_cursor_height_min () const
virtual const float get_cursor_height_max () const
virtual const float get_cursor_height_step () const
bool on_mouse (const wxMouseEvent &mouse_event) override
 Implement when want to process mouse events in gizmo Click, Right click, move, drag, ...
bool init ()
void load (cereal::BinaryInputArchive &ar)
void save (cereal::BinaryOutputArchive &ar) const
std::string get_name (bool include_shortcut=true) const
EState get_state () const
void set_state (EState state)
std::optional< Shortcut > shortcut () const
const std::string & get_icon_filename () const
void set_icon_filename (const std::string &filename)
bool is_activable () const
bool is_selectable () const
CommonGizmosDataID get_requirements () const
void set_common_data_pool (CommonGizmosDataPool *ptr)
virtual bool apply_clipping_plane ()
unsigned int get_sprite_id () const
int get_hover_id () const
void set_hover_id (int id)
bool is_dragging () const
bool update_items_state ()
void render ()
void render_input_window (float x, float y, float bottom_limit)
virtual void on_change_color_mode (bool is_dark)
virtual std::string get_tooltip () const
 Mouse tooltip text.
int get_count ()
std::string get_gizmo_name ()
void register_raycasters_for_picking ()
void unregister_raycasters_for_picking ()
virtual bool is_in_editing_mode () const
virtual bool is_selection_rectangle_dragging () const

Static Public Member Functions

static void update_render_colors ()
static void load_render_colors ()

Static Public Attributes

static const constexpr size_t EXTRUDERS_LIMIT = static_cast<size_t>(EnforcerBlockerType::ExtruderMax)
static const unsigned int BASE_ID = 255 * 255 * 254
static const unsigned int GRABBER_ELEMENTS_MAX_COUNT = 7
static float INV_ZOOM = 1.0f
static ColorRGBA DEFAULT_BASE_COLOR = { 0.625f, 0.625f, 0.625f, 1.0f }
static ColorRGBA DEFAULT_DRAG_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }
static ColorRGBA DEFAULT_HIGHLIGHT_COLOR = {1.0f, 0.38f, 0.0f, 1.0f}
static std::array< ColorRGBA, 3 > AXES_COLOR
static std::array< ColorRGBA, 3 > AXES_HOVER_COLOR
static ColorRGBA CONSTRAINED_COLOR = {0.5f, 0.5f, 0.5f, 1.0f}
static ColorRGBA FLATTEN_COLOR = {0.96f, 0.93f, 0.93f, 0.5f}
static ColorRGBA FLATTEN_HOVER_COLOR = {1.0f, 1.0f, 1.0f, 0.75f}
static ColorRGBA GRABBER_NORMAL_COL = {1.0f, 1.0f, 1.0f, 1.0f}
static ColorRGBA GRABBER_HOVER_COL = {0.863f, 0.125f, 0.063f, 1.0f}
static ColorRGBA GRABBER_UNIFORM_COL = {0, 1.0, 1.0, 1.0f}
static ColorRGBA GRABBER_UNIFORM_HOVER_COL = {0, 0.7, 0.7, 1.0f}

Protected Types

enum class  ToolType { BRUSH , BUCKET_FILL , SMART_FILL , GAP_FILL }
enum class  Button { None , Left , Right }

Protected Member Functions

ColorRGBA get_cursor_hover_color () const override
void on_set_state () override
EnforcerBlockerType get_left_button_state_type () const override
EnforcerBlockerType get_right_button_state_type () const override
void on_render_input_window (float x, float y, float bottom_limit) override
std::string on_get_name () const override
void render_tooltip_button (float x, float y)
bool on_is_selectable () const override
bool on_is_activable () const override
wxString handle_snapshot_action_name (bool shift_down, ButtonButton button_down) const override
std::string get_gizmo_entering_text () const override
std::string get_gizmo_leaving_text () const override
std::string get_action_snapshot_name () const override
virtual void render_triangles (const Selection &selection, const ModelVolume *skip=nullptr) const
void render_triangles (const Selection &selection, const std::vector< const ModelVolume * > &skip) const
void render_cursor ()
void render_cursor_circle ()
void render_cursor_sphere (const Transform3d &trafo) const
void render_cursor_height_range (const Transform3d &trafo) const
virtual ColorRGBA get_cursor_sphere_left_button_color () const
virtual ColorRGBA get_cursor_sphere_right_button_color () const
Vec3f get_tilt_up_direction () const
ClippingPlaneDataWrapper get_clipping_plane_data () const
TriangleSelector::ClippingPlane get_clipping_plane_in_volume_coordinates (const Transform3d &trafo) const
bool is_painting () const
bool render_follows_cursor () const override
void on_load (cereal::BinaryInputArchive &ar) override
void on_save (cereal::BinaryOutputArchive &ar) const override
CommonGizmosDataID on_get_requirements () const override
bool wants_enter_leave_snapshots () const override
bool render_combo (const std::string &label, const std::vector< std::string > &lines, int &selection_idx, float label_width, float item_width)
void render_cross_mark (const Vec3f &target, bool is_single=false)
virtual void on_set_hover_id ()
virtual void on_enable_grabber (unsigned int id)
virtual void on_disable_grabber (unsigned int id)
virtual void on_start_dragging ()
virtual void on_stop_dragging ()
virtual void on_dragging (const UpdateData &data)
bool GizmoImguiBegin (const std::string &name, int flags)
void GizmoImguiEnd ()
void GizmoImguiSetNextWIndowPos (float &x, float y, int flag, float pivot_x=0.0f, float pivot_y=0.0f)
void GizmoImguiSetNextWIndowPos (float &x, float y, float w, float h, int flag, float pivot_x=0.0f, float pivot_y=0.0f)
void register_grabbers_for_picking ()
void unregister_grabbers_for_picking ()
virtual void on_register_raycasters_for_picking ()
virtual void on_unregister_raycasters_for_picking ()
void render_grabbers (const BoundingBoxf3 &box) const
void render_grabbers (float size) const
void render_grabbers (size_t first, size_t last, float size, bool force_hover) const
std::string format (float value, unsigned int decimals) const
void set_dirty ()
bool use_grabbers (const wxMouseEvent &mouse_event)
 function which Set up m_dragging and call functions on_start_dragging / on_dragging / on_stop_dragging
void do_stop_dragging (bool perform_mouse_cleanup)

Protected Attributes

size_t m_selected_extruder_idx = 0
std::vector< ColorRGBA > m_extruders_colors
std::vector< int > m_volumes_extruder_idxs
wchar_t m_current_tool = 0
bool m_detect_geometry_edge = true
std::vector< size_t > m_extruder_remap
std::vector< std::vector< wxColour > > m_gradient_ramps
std::set< size_t > m_used_filaments
float m_cursor_radius = 1.f
float m_cursor_height = 0.2f
std::vector< std::unique_ptr< TriangleSelectorGUI > > m_triangle_selectors
TriangleSelector::CursorType m_cursor_type = TriangleSelector::SPHERE
bool m_triangle_splitting_enabled = true
ToolType m_tool_type = ToolType::BRUSH
float m_smart_fill_angle = 30.f
bool m_paint_on_overhangs_only = false
float m_highlight_by_angle_threshold_deg = 0.f
GLModel m_circle
Vec2d m_old_center { Vec2d::Zero() }
float m_old_cursor_radius { 0.0f }
bool m_vertical_only = false
bool m_horizontal_only = false
int m_seed_fill_last_mesh_id = -1
GLCanvas3D & m_parent
int m_group_id
EState m_state
std::optional< Shortcut > m_shortcut
std::string m_icon_filename
unsigned int m_sprite_id
int m_hover_id { -1 }
bool m_dragging { false }
std::vector< Grabber > m_grabbers
ImGuiWrapper * m_imgui
bool m_first_input_window_render { true }
CommonGizmosDataPool * m_c { nullptr }
bool m_is_dark_mode = false
float last_input_window_width = 0

Static Protected Attributes

static const constexpr float CursorRadiusMin = 0.1f
static constexpr float CursorRadiusMax = 8.f
static constexpr float CursorRadiusStep = 0.2f
static constexpr float CursorHeightMin = 0.1f
static constexpr float CursorHeightMax = 8.f
static constexpr float CursorHeightStep = 0.2f
static constexpr float SmartFillAngleMin = 0.0f
static constexpr float SmartFillAngleMax = 90.f
static constexpr float SmartFillAngleStep = 1.f

Private Member Functions

bool on_init () override
void update_model_object () override
void update_from_model_object (bool first_update=false) override
void tool_changed (wchar_t old_tool, wchar_t new_tool)
void on_opening () override
void on_shutdown () override
PainterGizmoType get_painter_type () const override
void init_model_triangle_selectors ()
bool draw_color_button (int idx, const char *id_str, const ColorRGBA &color, ColorRGBA &map_color, bool active, float scale)
const std::vector< wxColour > * gradient_of (int idx) const
void update_triangle_selectors_colors ()
void init_extruders_data ()
void remap_filament_assignments ()
void render_filament_remap_ui (float window_width, float max_tooltip_width, float scale)
void update_used_filaments ()
void on_render () override
std::vector< std::vector< ProjectedMousePosition > > get_projected_mouse_positions (const Vec2d &mouse_position, double resolution, const std::vector< Transform3d > &trafo_matrices) const
std::vector< ProjectedHeightRange > get_projected_height_range (const Vec2d &mouse_position, double resolution, const std::vector< const ModelVolume * > &part_volumes, const std::vector< Transform3d > &trafo_matrices) const
bool is_mesh_point_clipped (const Vec3d &point, const Transform3d &trafo) const
std::vector< Transform3d > mesh_trafo_matrices () const
void update_raycast_cache (const Vec2d &mouse_position, const Camera &camera, const std::vector< Transform3d > &trafo_matrices) const
BoundingBoxf3 bounding_box () const
void update_contours (int i, const TriangleMesh &vol_mesh, float cursor_z, float max_z, float min_z) const

Private Attributes

std::map< std::string, wxString > m_desc
std::vector< std::pair< wxString, wxString > > m_shortcuts_brush
std::vector< std::pair< wxString, wxString > > m_shortcuts_bucket_fill
std::vector< std::pair< wxString, wxString > > m_shortcuts_gap_fill
ObjectID m_old_mo_id
size_t m_old_volumes_size = 0
bool m_internal_stack_active = false
bool m_schedule_update = false
Vec2d m_last_mouse_click = Vec2d::Zero()
ButtonButton m_button_down = Button::None
EState m_old_state = Off
RaycastResult m_rr = {Vec2d::Zero(), -1, Vec3f::Zero(), 0}
std::vector< CutContours > m_cut_contours
int m_volumes_index = 0
float m_cursor_z {0}
double m_height_start_z_in_imgui {0}
bool m_is_set_height_start_z_by_imgui {false}
Vec2i32 m_height_start_pos {0, 0}
bool m_is_cursor_in_imgui {false}
bool m_dirty { false }
int count = 0

Static Private Attributes

static std::shared_ptr< GLModel > s_sphere = nullptr

Detailed Description

Member Enumeration Documentation

◆ Button

enum class Slic3r::GUI::GLGizmoPainterBase::Button
strongprotectedinherited
Enumerator
None 
Left 
Right 
322 {
323 None,
324 Left,
325 Right
326 };
@ Right
Definition GLToolbar.hpp:462
@ Left
Definition GLToolbar.hpp:462
@ None
Definition SketchEngine.hpp:180

◆ EGrabberExtension

enum class Slic3r::GUI::GLGizmoBase::EGrabberExtension
stronginherited
Enumerator
None 
PosX 
NegX 
PosY 
NegY 
PosZ 
NegZ 
74 {
75 None = 0,
76 PosX = 1 << 0,
77 NegX = 1 << 1,
78 PosY = 1 << 2,
79 NegY = 1 << 3,
80 PosZ = 1 << 4,
81 NegZ = 1 << 5,
82 };
@ PosX
Definition PrintConfig.hpp:350
@ NegY
Definition PrintConfig.hpp:351
@ NegX
Definition PrintConfig.hpp:351
@ PosY
Definition PrintConfig.hpp:350
@ NegZ
Definition PrintConfig.hpp:351
@ PosZ
Definition PrintConfig.hpp:350

◆ EState

Enumerator
Off 
On 
Num_States 
126 {
127 Off,
128 On,
130 };
@ On
Definition GLGizmoBase.hpp:128
@ Num_States
Definition GLGizmoBase.hpp:129
@ Off
Definition GLGizmoBase.hpp:127

◆ ToolType

enum class Slic3r::GUI::GLGizmoPainterBase::ToolType
strongprotectedinherited
Enumerator
BRUSH 
BUCKET_FILL 
SMART_FILL 
GAP_FILL 
274 {
275 BRUSH,
276 BUCKET_FILL,
277 SMART_FILL,
278 // BBS
279 GAP_FILL,
280 };

Constructor & Destructor Documentation

◆ GLGizmoMmuSegmentation()

Slic3r::GUI::GLGizmoMmuSegmentation::GLGizmoMmuSegmentation ( GLCanvas3D & parent,
const std::string & icon_filename,
unsigned int sprite_id )
186 : GLGizmoPainterBase(parent, icon_filename, sprite_id), m_current_tool(ImGui::CircleButtonIcon)
187{
188}
wchar_t m_current_tool
Definition GLGizmoMmuSegmentation.hpp:125
GLGizmoPainterBase(GLCanvas3D &parent, const std::string &icon_filename, unsigned int sprite_id)
Definition GLGizmoPainterBase.cpp:58

References Slic3r::GUI::GLGizmoPainterBase::GLGizmoPainterBase(), and m_current_tool.

Here is the call graph for this function:

◆ ~GLGizmoMmuSegmentation()

Slic3r::GUI::GLGizmoMmuSegmentation::~GLGizmoMmuSegmentation ( )
overridedefault

Member Function Documentation

◆ apply_clipping_plane()

virtual bool Slic3r::GUI::GLGizmoBase::apply_clipping_plane ( )
inlinevirtualinherited
195{ return true; }

Referenced by Slic3r::GUI::GLCanvas3D::_render_objects(), and Slic3r::GUI::GLCanvas3D::get_raycaster_clipping_plane().

Here is the caller graph for this function:

◆ bounding_box()

BoundingBoxf3 Slic3r::GUI::GLGizmoPainterBase::bounding_box ( ) const
privateinherited
478{
479 BoundingBoxf3 ret;
480 const Selection& selection = m_parent.get_selection();
481 const Selection::IndicesList& idxs = selection.get_volume_idxs();
482 for (unsigned int i : idxs) {
483 const GLVolume* volume = selection.get_volume(i);
484 if (!volume->is_modifier)
485 ret.merge(volume->transformed_convex_hull_bounding_box());
486 }
487 return ret;
488}
GLCanvas3D & m_parent
Definition GLGizmoBase.hpp:143
std::set< unsigned int > IndicesList
Definition Selection.hpp:49
@ Selection
Definition Shortcuts.hpp:72

References Slic3r::GUI::Selection::get_volume(), Slic3r::GUI::Selection::get_volume_idxs(), Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::BoundingBox3Base< PointType >::merge(), and Slic3r::GLVolume::transformed_convex_hull_bounding_box().

Referenced by render_cursor_height_range().

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

◆ data_changed()

void Slic3r::GUI::GLGizmoMmuSegmentation::data_changed ( bool is_serializing)
overridevirtual

Is called when data (Selection) is changed.

Reimplemented from Slic3r::GUI::GLGizmoBase.

207{
208 GLGizmoPainterBase::data_changed(is_serializing);
209 if (m_state != On || wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptFFF || wxGetApp().extruders_edited_cnt() <= 1)
210 return;
211
212 ModelObject* model_object = m_c->selection_info()->model_object();
213 int prev_extruders_count = int(m_extruders_colors.size());
214 if (prev_extruders_count != wxGetApp().filaments_cnt()) {
215 if (wxGetApp().filaments_cnt() > int(GLGizmoMmuSegmentation::EXTRUDERS_LIMIT))
217
218 this->init_extruders_data();
219 // Reinitialize triangle selectors because of change of extruder count need also change the size of GLIndexedVertexArray
220 if (prev_extruders_count != wxGetApp().filaments_cnt())
222 } else if (wxGetApp().plater()->get_extruders_colors() != m_extruders_colors) {
223 this->init_extruders_data();
225 }
226 else if (model_object != nullptr && get_extruder_id_for_volumes(*model_object) != m_volumes_extruder_idxs) {
228 }
229}
CommonGizmosDataPool * m_c
Definition GLGizmoBase.hpp:155
EState m_state
Definition GLGizmoBase.hpp:146
void init_model_triangle_selectors()
Definition GLGizmoMmuSegmentation.cpp:723
void update_triangle_selectors_colors()
Definition GLGizmoMmuSegmentation.cpp:762
std::vector< int > m_volumes_extruder_idxs
Definition GLGizmoMmuSegmentation.hpp:122
static const constexpr size_t EXTRUDERS_LIMIT
Definition GLGizmoMmuSegmentation.hpp:91
void init_extruders_data()
Definition GLGizmoMmuSegmentation.cpp:110
std::vector< ColorRGBA > m_extruders_colors
Definition GLGizmoMmuSegmentation.hpp:121
void data_changed(bool is_serializing) override
Is called when data (Selection) is changed.
Definition GLGizmoPainterBase.cpp:71
static Plater * plater()
Definition GUI_Factories.cpp:400
static std::vector< int > get_extruder_id_for_volumes(const ModelObject &model_object)
Definition GLGizmoMmuSegmentation.cpp:96
static void show_notification_extruders_limit_exceeded()
Definition GLGizmoMmuSegmentation.cpp:53
@ ptFFF
Definition Config.hpp:231

References Slic3r::GUI::GLGizmoPainterBase::data_changed(), EXTRUDERS_LIMIT, Slic3r::GUI::get_extruder_id_for_volumes(), init_extruders_data(), init_model_triangle_selectors(), Slic3r::GUI::GLGizmoBase::m_c, m_extruders_colors, Slic3r::GUI::GLGizmoBase::m_state, m_volumes_extruder_idxs, Slic3r::GUI::GLGizmoBase::On, Slic3r::GUI::plater(), Slic3r::ptFFF, Slic3r::GUI::show_notification_extruders_limit_exceeded(), and update_triangle_selectors_colors().

Here is the call graph for this function:

◆ do_stop_dragging()

void Slic3r::GUI::GLGizmoBase::do_stop_dragging ( bool perform_mouse_cleanup)
protectedinherited
494{
495 for (auto& grabber : m_grabbers) grabber.dragging = false;
496 m_dragging = false;
497
498 // NOTE: This should be part of GLCanvas3D
499 // Reset hover_id when leave window
500 if (perform_mouse_cleanup) m_parent.mouse_up_cleanup();
501
503
504 // There is prediction that after draggign, data are changed
505 // Data are updated twice also by canvas3D::reload_scene.
506 // Should be fixed.
507 m_parent.get_gizmos_manager().update_data();
508
509 wxGetApp().obj_manipul()->set_dirty();
510
511 // Let the plater know that the dragging finished, so a delayed
512 // refresh of the scene with the background processing data should
513 // be performed.
514 m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED));
515 // updates camera target constraints
516 m_parent.refresh_camera_scene_box();
517}
bool m_dragging
Definition GLGizmoBase.hpp:151
std::vector< Grabber > m_grabbers
Definition GLGizmoBase.hpp:152
virtual void on_stop_dragging()
Definition GLGizmoBase.hpp:254

References m_dragging, m_grabbers, m_parent, and on_stop_dragging().

Referenced by use_grabbers().

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

◆ draw_color_button()

bool Slic3r::GUI::GLGizmoMmuSegmentation::draw_color_button ( int idx,
const char * id_str,
const ColorRGBA & color,
ColorRGBA & map_color,
bool active,
float scale )
private
327{
328 // Inset of the frame stroked below, which is what trims the swatch down to its visible shape.
329 const float frame_inset = 1.5f;
330
331 ImDrawList* draw_list = ImGui::GetWindowDrawList();
332 std::string label_id = std::to_string(idx) + id_str + std::to_string(idx);
333 ImVec2 pos = ImGui::GetCursorScreenPos();
334 ImVec2 size = ImVec2(27.f * scale, 27.f * scale);
335 ImVec4 color_vec = ImGuiWrapper::to_ImVec4(color);
336 ImU32 br_color = ImGui::ColorConvertFloat4ToU32(active ? ImGuiWrapper::COL_ORCA : m_is_dark_mode ? ImVec4(.35f, .35f, .35f, 1) : ImVec4(.85f, .85f, .85f, 1));
337 // Every caller labels the button with the 1 based slot number, so idx - 1 picks out the slot's fade.
338 const std::vector<wxColour>* gradient = gradient_of(idx - 1);
339 // The centered slot number sits at the swatch's mid height, so take its contrast from the colour
340 // printed there rather than from the slot's blended color.
341 bool dark_tone = gradient ? (*gradient)[gradient->size() / 2].GetLuminance() < 0.51 :
342 (0.299f * color.r() + 0.587f * color.g() + 0.114f * color.b()) < 0.51f; // matching values used by wxWidgets with clr.GetLuminance() < 0.51
343
344 // Paint a gradient mixed filament's fade before the button and keep the button transparent, so
345 // the slot number and the frame below stay on top of it. The bands cannot round their corners,
346 // so the fade is inset to the frame, which masks it into the shape a plain color slot gets.
347 if (gradient) {
348 ImGuiWrapper::draw_gradient_ramp(draw_list, {pos.x + frame_inset * scale, pos.y + frame_inset * scale},
349 {pos.x + size.x - frame_inset * scale, pos.y + size.y - frame_inset * scale}, *gradient);
350 color_vec.w = 0.f; // let the fade show through
351 }
352
353 ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0);
354 ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 7.f * scale);
355 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(0, 0));
356 ImGui::PushStyleColor(ImGuiCol_Text , dark_tone ? ImVec4(1,1,1,1) : ImVec4(0,0,0,1));
357 ImGui::PushStyleColor(ImGuiCol_Button , color_vec);
358 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, color_vec);
359 ImGui::PushStyleColor(ImGuiCol_ButtonActive , color_vec);
360 bool clicked = ImGui::Button(label_id.c_str(), size);
361 ImGui::PopStyleVar(3);
362 ImGui::PopStyleColor(4);
363
364 auto drawBorder = [&](float d, float r, float t, ImU32 col) {
365 draw_list->AddRect({pos.x + d * scale, pos.y + d * scale}, {pos.x + size.x - d * scale , pos.y + size.y - d * scale}, col, r * scale, 0, t * scale);
366 };
367 drawBorder(frame_inset, 3.f, 4.f, ImGui::ColorConvertFloat4ToU32(ImGui::GetStyleColorVec4(ImGuiCol_WindowBg)));
368 if(active)
369 drawBorder(.5f, 4.f , 2.f, br_color);
370 else
371 drawBorder(3.f, 2.5f, 1.f, br_color);
372
373 if (color != map_color){ // show mapped color as bubble if mapped
374 ImVec2 center = {pos.x + size.x - 3.f * scale, pos.y + 3.f * scale};
375 draw_list->AddCircleFilled(center, 6.f * scale, br_color, 16); // outer border for better visibility
376 draw_list->AddCircleFilled(center, 5.f * scale, ImGuiWrapper::to_ImU32(map_color), 16);
377 }
378
379 return clicked;
380};
int scale(const int val)
Definition WipeTowerDialog.cpp:58
bool m_is_dark_mode
Definition GLGizmoBase.hpp:157
const std::vector< wxColour > * gradient_of(int idx) const
Definition GLGizmoMmuSegmentation.hpp:158
static ImU32 to_ImU32(const ColorRGBA &color)
Definition ImGuiWrapper.cpp:2239
static const ImVec4 COL_ORCA
Definition ImGuiWrapper.hpp:408
static ImVec4 to_ImVec4(const ColorRGB &color)
Definition ImGuiWrapper.cpp:1053
static void draw_gradient_ramp(ImDrawList *draw_list, const ImVec2 &top_left, const ImVec2 &bottom_right, const std::vector< wxColour > &ramp)
Fill a rect with a filament gradient ramp, one band per pixel row, ramp.front() along the bottom edge...
Definition ImGuiWrapper.cpp:2568
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16
void center(ExPolygonsWithIds &e)
Definition Emboss.cpp:1382

References Slic3r::ColorRGBA::b(), Slic3r::center(), Slic3r::GUI::ImGuiWrapper::COL_ORCA, Slic3r::GUI::ImGuiWrapper::draw_gradient_ramp(), Slic3r::ColorRGBA::g(), gradient_of(), Slic3r::GUI::GLGizmoBase::m_is_dark_mode, Slic3r::ColorRGBA::r(), scale(), Slic3r::GUI::ImGuiWrapper::to_ImU32(), and Slic3r::GUI::ImGuiWrapper::to_ImVec4().

Referenced by on_render_input_window(), and render_filament_remap_ui().

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

◆ format()

std::string Slic3r::GUI::GLGizmoBase::format ( float value,
unsigned int decimals ) const
protectedinherited

◆ get_action_snapshot_name()

std::string Slic3r::GUI::GLGizmoMmuSegmentation::get_action_snapshot_name ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

117{ return _u8L("Color painting editing"); }
#define _u8L(s)
Definition I18N.hpp:11

References _u8L.

◆ get_clipping_plane_data()

GLGizmoPainterBase::ClippingPlaneDataWrapper Slic3r::GUI::GLGizmoPainterBase::get_clipping_plane_data ( ) const
protectedinherited
91{
92 ClippingPlaneDataWrapper clp_data_out{{0.f, 0.f, 1.f, FLT_MAX}, {-FLT_MAX, FLT_MAX}};
93 // Take care of the clipping plane. The normal of the clipping plane is
94 // saved with opposite sign than we need to pass to OpenGL (FIXME)
95 if (bool clipping_plane_active = m_c->object_clipper()->get_position() != 0.; clipping_plane_active) {
96 const ClippingPlane *clp = m_c->object_clipper()->get_clipping_plane();
97 for (size_t i = 0; i < 3; ++i)
98 clp_data_out.clp_dataf[i] = -1.f * float(clp->get_data()[i]);
99 clp_data_out.clp_dataf[3] = float(clp->get_data()[3]);
100 }
101
102 // z_range is calculated in the same way as in GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type)
103 if (m_c->get_canvas()->get_use_clipping_planes()) {
104 const std::array<ClippingPlane, 2> &clps = m_c->get_canvas()->get_clipping_planes();
105 clp_data_out.z_range = {float(-clps[0].get_data()[3]), float(clps[1].get_data()[3])};
106 }
107
108 return clp_data_out;
109}

References Slic3r::GUI::GLGizmoPainterBase::ClippingPlaneDataWrapper::clp_dataf, Slic3r::GUI::ClippingPlane::get_data(), Slic3r::GUI::GLGizmoBase::m_c, and Slic3r::GUI::GLGizmoPainterBase::ClippingPlaneDataWrapper::z_range.

Referenced by Slic3r::GUI::GLGizmoTextureDisplacement::render_painted_colors(), Slic3r::GUI::GLGizmoTextureDisplacement::render_shaded_preview_mesh(), render_triangles(), and Slic3r::GUI::GLGizmoTextureDisplacement::render_uvcheck_mesh().

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

◆ get_clipping_plane_in_volume_coordinates()

TriangleSelector::ClippingPlane Slic3r::GUI::GLGizmoPainterBase::get_clipping_plane_in_volume_coordinates ( const Transform3d & trafo) const
protectedinherited
1243 {
1244 const ::Slic3r::GUI::ClippingPlane *const clipping_plane = m_c->object_clipper()->get_clipping_plane();
1245 if (clipping_plane == nullptr || !clipping_plane->is_active())
1246 return {};
1247
1248 const Vec3d clp_normal = clipping_plane->get_normal();
1249 const double clp_offset = clipping_plane->get_offset();
1250
1251 const Transform3d trafo_normal = Transform3d(trafo.linear().transpose());
1252 const Transform3d trafo_inv = trafo.inverse();
1253
1254 Vec3d point_on_plane = clp_normal * clp_offset;
1255 Vec3d point_on_plane_transformed = trafo_inv * point_on_plane;
1256 Vec3d normal_transformed = trafo_normal * clp_normal;
1257 auto offset_transformed = float(point_on_plane_transformed.dot(normal_transformed));
1258
1259 return TriangleSelector::ClippingPlane({float(normal_transformed.x()), float(normal_transformed.y()), float(normal_transformed.z()), offset_transformed});
1260}
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vec3d
Definition Point.hpp:68
Eigen::Transform< double, 3, Eigen::Affine, Eigen::DontAlign > Transform3d
Definition Point.hpp:96

References Slic3r::GUI::GLGizmoBase::m_c.

Referenced by gizmo_event().

Here is the caller graph for this function:

◆ get_count()

int Slic3r::GUI::GLGizmoBase::get_count ( )
inlineinherited
224{ return ++count; }
int count
Definition GLGizmoBase.hpp:294

References count.

◆ get_cursor_height_max()

virtual const float Slic3r::GUI::GLGizmoPainterBase::get_cursor_height_max ( ) const
inlinevirtualinherited
223{ return CursorHeightMax; }
static constexpr float CursorHeightMax
Definition GLGizmoPainterBase.hpp:266

References CursorHeightMax.

Referenced by gizmo_event().

Here is the caller graph for this function:

◆ get_cursor_height_min()

virtual const float Slic3r::GUI::GLGizmoPainterBase::get_cursor_height_min ( ) const
inlinevirtualinherited
222{ return CursorHeightMin; }
static constexpr float CursorHeightMin
Definition GLGizmoPainterBase.hpp:265

References CursorHeightMin.

Referenced by gizmo_event().

Here is the caller graph for this function:

◆ get_cursor_height_step()

virtual const float Slic3r::GUI::GLGizmoPainterBase::get_cursor_height_step ( ) const
inlinevirtualinherited
224{ return CursorHeightStep; }
static constexpr float CursorHeightStep
Definition GLGizmoPainterBase.hpp:267

References CursorHeightStep.

Referenced by gizmo_event().

Here is the caller graph for this function:

◆ get_cursor_hover_color()

ColorRGBA Slic3r::GUI::GLGizmoMmuSegmentation::get_cursor_hover_color ( ) const
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoPainterBase.

813{
816 else
817 return m_extruders_colors[0];
818}
size_t m_selected_extruder_idx
Definition GLGizmoMmuSegmentation.hpp:120

References m_extruders_colors, and m_selected_extruder_idx.

◆ get_cursor_radius_max()

virtual const float Slic3r::GUI::GLGizmoPainterBase::get_cursor_radius_max ( ) const
inlinevirtualinherited
218{ return CursorRadiusMax; }
static constexpr float CursorRadiusMax
Definition GLGizmoPainterBase.hpp:263

References CursorRadiusMax.

Referenced by gizmo_event().

Here is the caller graph for this function:

◆ get_cursor_radius_min()

const float Slic3r::GUI::GLGizmoMmuSegmentation::get_cursor_radius_min ( ) const
inlineoverridevirtual

Reimplemented from Slic3r::GUI::GLGizmoPainterBase.

93{ return CursorRadiusMin; }
static const constexpr float CursorRadiusMin
Definition GLGizmoMmuSegmentation.hpp:137

References CursorRadiusMin.

◆ get_cursor_radius_step()

virtual const float Slic3r::GUI::GLGizmoPainterBase::get_cursor_radius_step ( ) const
inlinevirtualinherited
219{ return CursorRadiusStep; }
static constexpr float CursorRadiusStep
Definition GLGizmoPainterBase.hpp:264

References CursorRadiusStep.

Referenced by gizmo_event().

Here is the caller graph for this function:

◆ get_cursor_sphere_left_button_color()

virtual ColorRGBA Slic3r::GUI::GLGizmoPainterBase::get_cursor_sphere_left_button_color ( ) const
inlineprotectedvirtualinherited
251{ return { 0.0f, 0.0f, 1.0f, 0.25f }; }

Referenced by render_cursor_circle(), and render_cursor_sphere().

Here is the caller graph for this function:

◆ get_cursor_sphere_right_button_color()

virtual ColorRGBA Slic3r::GUI::GLGizmoPainterBase::get_cursor_sphere_right_button_color ( ) const
inlineprotectedvirtualinherited
252{ return { 1.0f, 0.0f, 0.0f, 0.25f }; }

Referenced by render_cursor_circle(), and render_cursor_sphere().

Here is the caller graph for this function:

◆ get_gizmo_entering_text()

std::string Slic3r::GUI::GLGizmoMmuSegmentation::get_gizmo_entering_text ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

115{ return _u8L("Entering color painting"); }

References _u8L.

◆ get_gizmo_leaving_text()

std::string Slic3r::GUI::GLGizmoMmuSegmentation::get_gizmo_leaving_text ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

116{ return _u8L("Leaving color painting"); }

References _u8L.

◆ get_gizmo_name()

std::string Slic3r::GUI::GLGizmoBase::get_gizmo_name ( )
inlineinherited
225{ return on_get_name(); }
virtual std::string on_get_name() const =0

References on_get_name().

Here is the call graph for this function:

◆ get_hover_id()

int Slic3r::GUI::GLGizmoBase::get_hover_id ( ) const
inlineinherited
206{ return m_hover_id; }
int m_hover_id
Definition GLGizmoBase.hpp:150

References m_hover_id.

Referenced by Slic3r::GUI::GLCanvas3D::_scene_cache_key(), Slic3r::GUI::GLGizmosManager::grabber_contains_mouse(), Slic3r::GUI::GLGizmoBrimEars::on_mouse(), Slic3r::GUI::GLGizmoCut3D::on_mouse(), Slic3r::GUI::GLGizmoMeshBoolean::on_mouse(), and Slic3r::GUI::GLGizmoPainterBase::on_mouse().

Here is the caller graph for this function:

◆ get_icon_filename()

const std::string & Slic3r::GUI::GLGizmoBase::get_icon_filename ( ) const
inlineinherited
180{ return m_icon_filename; }
std::string m_icon_filename
Definition GLGizmoBase.hpp:148

References m_icon_filename.

◆ get_left_button_state_type()

EnforcerBlockerType Slic3r::GUI::GLGizmoMmuSegmentation::get_left_button_state_type ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoPainterBase.

EnforcerBlockerType
Definition TriangleSelector.hpp:24

References m_selected_extruder_idx.

◆ get_name()

std::string Slic3r::GUI::GLGizmoBase::get_name ( bool include_shortcut = true) const
inherited
545{
546 const std::string name = on_get_name();
547 return include_shortcut && m_shortcut.has_value() ? wxGetApp().shortcuts().with_key(name, *m_shortcut) : name;
548}
std::optional< Shortcut > m_shortcut
Definition GLGizmoBase.hpp:147

References m_shortcut, and on_get_name().

Referenced by Slic3r::GUI::GLGizmoAssembly::on_render_input_window(), Slic3r::GUI::GLGizmoBrimEars::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_render_input_window(), Slic3r::GUI::GLGizmoEmboss::on_render_input_window(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMeasure::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), and Slic3r::GUI::GLGizmosManager::update_hover_state().

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

◆ get_painter_type()

PainterGizmoType Slic3r::GUI::GLGizmoMmuSegmentation::get_painter_type ( ) const
overrideprivatevirtual

Implements Slic3r::GUI::GLGizmoPainterBase.

807{
809}
@ MM_SEGMENTATION
Definition GLGizmoPainterBase.hpp:39

References Slic3r::GUI::MM_SEGMENTATION.

◆ get_projected_height_range()

std::vector< GLGizmoPainterBase::ProjectedHeightRange > Slic3r::GUI::GLGizmoPainterBase::get_projected_height_range ( const Vec2d & mouse_position,
double resolution,
const std::vector< const ModelVolume * > & part_volumes,
const std::vector< Transform3d > & trafo_matrices ) const
privateinherited
665{
666 std::vector<GLGizmoPainterBase::ProjectedHeightRange> hit_triangles_by_mesh;
667
668 const Camera& camera = wxGetApp().plater()->get_camera();
669
670 // In mesh_hit_points only the last item could have mesh_id == -1, any other items mustn't.
671 update_raycast_cache(mouse_position, camera, trafo_matrices);
672 if (m_rr.mesh_id == -1)
673 return hit_triangles_by_mesh;
674
675 ProjectedMousePosition mesh_hit_point = { m_rr.hit, m_rr.mesh_id, m_rr.facet };
676 float z_bot_world= (trafo_matrices[m_rr.mesh_id] * Vec3d(m_rr.hit(0), m_rr.hit(1), m_rr.hit(2))).z();
677 float z_top_world = z_bot_world+ m_cursor_height;
678 hit_triangles_by_mesh.push_back({ z_bot_world, m_rr.mesh_id, size_t(m_rr.facet) });
679
680 const Selection& selection = m_parent.get_selection();
681 const ModelObject* mo = m_c->selection_info()->model_object();
682 const ModelInstance* mi = mo->instances[selection.get_instance_idx()];
683 const Transform3d instance_trafo = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ?
684 mi->get_assemble_transformation().get_matrix() :
685 mi->get_transformation().get_matrix();
686 const Transform3d instance_trafo_not_translate = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ?
687 mi->get_assemble_transformation().get_matrix_no_offset() :
688 mi->get_transformation().get_matrix_no_offset();
689
690 for (int mesh_idx = 0; mesh_idx < part_volumes.size(); mesh_idx++) {
691 if (mesh_idx == m_rr.mesh_id)
692 continue;
693
694 const Transform3d& trafo = trafo_matrices[mesh_idx];
695 const indexed_triangle_set& its = part_volumes[mesh_idx]->mesh().its;
696
697 int first_hit_facet_idx = -1;
698 for (int facet_idx = 0; facet_idx < its.indices.size(); facet_idx++) {
699 stl_vertex v0 = its.vertices[its.indices[facet_idx].x()];
700 stl_vertex v1 = its.vertices[its.indices[facet_idx].y()];
701 stl_vertex v2 = its.vertices[its.indices[facet_idx].z()];
702
703 float v0_z = (trafo * Vec3d(v0(0), v0(1), v0(2))).z();
704 float v1_z = (trafo * Vec3d(v1(0), v1(1), v1(2))).z();
705 float v2_z = (trafo * Vec3d(v2(0), v2(1), v2(2))).z();
706 bool outside_range = (v0_z < z_bot_world&& v1_z < z_bot_world&& v2_z < z_bot_world) ||
707 (v0_z > z_top_world && v1_z > z_top_world && v2_z > z_top_world);
708 if (!outside_range) {
709 first_hit_facet_idx = facet_idx;
710 break;
711 }
712 }
713
714 if (first_hit_facet_idx != -1) {
715 hit_triangles_by_mesh.push_back({ z_bot_world, mesh_idx, (size_t)first_hit_facet_idx });
716 }
717 }
718
719 return hit_triangles_by_mesh;
720}
@ CanvasAssembleView
Definition GLCanvas3D.hpp:628
float m_cursor_height
Definition GLGizmoPainterBase.hpp:261
void update_raycast_cache(const Vec2d &mouse_position, const Camera &camera, const std::vector< Transform3d > &trafo_matrices) const
Definition GLGizmoPainterBase.cpp:1109
RaycastResult m_rr
Definition GLGizmoPainterBase.hpp:371
Definition GLGizmoPainterBase.hpp:283
@ Camera
Definition Shortcuts.hpp:72

References Slic3r::GUI::GLCanvas3D::CanvasAssembleView, Slic3r::ModelInstance::get_assemble_transformation(), Slic3r::GUI::Selection::get_instance_idx(), Slic3r::Geometry::Transformation::get_matrix(), Slic3r::Geometry::Transformation::get_matrix_no_offset(), Slic3r::ModelInstance::get_transformation(), Slic3r::ModelObject::instances, Slic3r::GUI::GLGizmoBase::m_c, m_cursor_height, Slic3r::GUI::GLGizmoBase::m_parent, m_rr, Slic3r::resolution(), and update_raycast_cache().

Referenced by gizmo_event().

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

◆ get_projected_mouse_positions()

std::vector< std::vector< GLGizmoPainterBase::ProjectedMousePosition > > Slic3r::GUI::GLGizmoPainterBase::get_projected_mouse_positions ( const Vec2d & mouse_position,
double resolution,
const std::vector< Transform3d > & trafo_matrices ) const
privateinherited
542{
543 // List of mouse positions that will be used as seeds for painting.
544 std::vector<Vec2d> mouse_positions{mouse_position};
545 if (m_last_mouse_click != Vec2d::Zero()) {
546 // In case current mouse position is far from the last one,
547 // add several positions from between into the list, so there
548 // are no gaps in the painted region.
549 if (size_t patches_in_between = size_t((mouse_position - m_last_mouse_click).norm() / resolution); patches_in_between > 0) {
550 const Vec2d diff = (m_last_mouse_click - mouse_position) / (patches_in_between + 1);
551 for (size_t patch_idx = 1; patch_idx <= patches_in_between; ++patch_idx)
552 mouse_positions.emplace_back(mouse_position + patch_idx * diff);
553 mouse_positions.emplace_back(m_last_mouse_click);
554 }
555 }
556
557 const Camera &camera = wxGetApp().plater()->get_camera();
558 std::vector<ProjectedMousePosition> mesh_hit_points;
559 mesh_hit_points.reserve(mouse_positions.size());
560
561 // In mesh_hit_points only the last item could have mesh_id == -1, any other items mustn't.
562 for (const Vec2d &mp : mouse_positions) {
563 update_raycast_cache(mp, camera, trafo_matrices);
564 mesh_hit_points.push_back({m_rr.hit, m_rr.mesh_id, m_rr.facet});
565 if (m_rr.mesh_id == -1)
566 break;
567 }
568
569 // Divide mesh_hit_points into groups with the same mesh_idx. It may contain multiple groups with the same mesh_idx.
570 std::vector<std::vector<ProjectedMousePosition>> mesh_hit_points_by_mesh;
571 for (size_t prev_mesh_hit_point = 0, curr_mesh_hit_point = 0; curr_mesh_hit_point < mesh_hit_points.size(); ++curr_mesh_hit_point) {
572 size_t next_mesh_hit_point = curr_mesh_hit_point + 1;
573 if (next_mesh_hit_point >= mesh_hit_points.size() || mesh_hit_points[curr_mesh_hit_point].mesh_idx != mesh_hit_points[next_mesh_hit_point].mesh_idx) {
574 mesh_hit_points_by_mesh.emplace_back();
575 mesh_hit_points_by_mesh.back().insert(mesh_hit_points_by_mesh.back().end(), mesh_hit_points.begin() + int(prev_mesh_hit_point), mesh_hit_points.begin() + int(next_mesh_hit_point));
576 prev_mesh_hit_point = next_mesh_hit_point;
577 }
578 }
579
580 auto on_same_facet = [](std::vector<ProjectedMousePosition> &hit_points) -> bool {
581 for (const ProjectedMousePosition &mesh_hit_point : hit_points)
582 if (mesh_hit_point.facet_idx != hit_points.front().facet_idx)
583 return false;
584 return true;
585 };
586
587 struct Plane
588 {
589 Vec3d origin;
590 Vec3d first_axis;
591 Vec3d second_axis;
592 };
593 auto find_plane = [](std::vector<ProjectedMousePosition> &hit_points) -> std::optional<Plane> {
594 assert(hit_points.size() >= 3);
595 for (size_t third_idx = 2; third_idx < hit_points.size(); ++third_idx) {
596 const Vec3d &first_point = hit_points[third_idx - 2].mesh_hit.cast<double>();
597 const Vec3d &second_point = hit_points[third_idx - 1].mesh_hit.cast<double>();
598 const Vec3d &third_point = hit_points[third_idx].mesh_hit.cast<double>();
599
600 const Vec3d first_vec = first_point - second_point;
601 const Vec3d second_vec = third_point - second_point;
602
603 // If three points aren't collinear, then there exists only one plane going through all points.
604 if (first_vec.cross(second_vec).squaredNorm() > sqr(EPSILON)) {
605 const Vec3d first_axis_vec_n = first_vec.normalized();
606 // Make second_vec perpendicular to first_axis_vec_n using Gram–Schmidt orthogonalization process
607 const Vec3d second_axis_vec_n = (second_vec - (first_vec.dot(second_vec) / first_vec.dot(first_vec)) * first_vec).normalized();
608 return Plane{second_point, first_axis_vec_n, second_axis_vec_n};
609 }
610 }
611
612 return std::nullopt;
613 };
614
615 for(std::vector<ProjectedMousePosition> &hit_points : mesh_hit_points_by_mesh) {
616 assert(!hit_points.empty());
617 if (hit_points.back().mesh_idx == -1)
618 break;
619
620 if (hit_points.size() <= 2)
621 continue;
622
623 if (on_same_facet(hit_points)) {
624 hit_points = {hit_points.front(), hit_points.back()};
625 } else if (std::optional<Plane> plane = find_plane(hit_points); plane) {
626 Polyline polyline;
627 polyline.points.reserve(hit_points.size());
628 // Project hit_points into its plane to simplified them in the next step.
629 for (auto &hit_point : hit_points) {
630 const Vec3d &point = hit_point.mesh_hit.cast<double>();
631 const double x_cord = plane->first_axis.dot(point - plane->origin);
632 const double y_cord = plane->second_axis.dot(point - plane->origin);
633 polyline.points.emplace_back(scale_(x_cord), scale_(y_cord));
634 }
635
636 polyline.simplify(scale_(m_cursor_radius) / 10.);
637
638 const int mesh_idx = hit_points.front().mesh_idx;
639 std::vector<ProjectedMousePosition> new_hit_points;
640 new_hit_points.reserve(polyline.points.size());
641 // Project 2D simplified hit_points beck to 3D.
642 for (const Point &point : polyline.points) {
643 const double x_cord = unscale<double>(point.x());
644 const double y_cord = unscale<double>(point.y());
645 const Vec3d new_hit_point = plane->origin + x_cord * plane->first_axis + y_cord * plane->second_axis;
646 const int facet_idx = m_c->raycaster()->raycasters()[mesh_idx]->get_closest_facet(new_hit_point.cast<float>());
647 new_hit_points.push_back({new_hit_point.cast<float>(), mesh_idx, size_t(facet_idx)});
648 }
649
650 hit_points = new_hit_points;
651 } else {
652 hit_points = {hit_points.front(), hit_points.back()};
653 }
654 }
655
656 return mesh_hit_points_by_mesh;
657}
#define EPSILON
Definition ColorUtils.cpp:64
Vec2d m_last_mouse_click
Definition GLGizmoPainterBase.hpp:357
float m_cursor_radius
Definition GLGizmoPainterBase.hpp:259
#define scale_(val)
Definition libslic3r.h:106
zaa_minimize_perimeter_height resolution((ConfigOptionFloats, retraction_minimum_travel))((ConfigOptionBools
constexpr T sqr(T x)
Definition libslic3r.h:301
T unscale(Q v)
Definition libslic3r.h:138
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:67
@ Plane
Definition CadDocument.hpp:26
Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:731
Vec2d mouse_position(const wxMouseEvent &mouse_event)
Extract position of mouse from mouse event.
Definition SurfaceDrag.cpp:502

References Slic3r::diff(), EPSILON, Slic3r::GUI::GLGizmoBase::m_c, m_cursor_radius, m_last_mouse_click, m_rr, Slic3r::Plane, Slic3r::MultiPoint::points, Slic3r::resolution(), scale_, Slic3r::Polyline::simplify(), Slic3r::sqr(), Slic3r::unscale(), and update_raycast_cache().

Referenced by gizmo_event().

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

◆ get_requirements()

CommonGizmosDataID Slic3r::GUI::GLGizmoBase::get_requirements ( ) const
inlineinherited
186{ return on_get_requirements(); }
virtual CommonGizmosDataID on_get_requirements() const
Definition GLGizmoBase.hpp:248

References on_get_requirements().

Here is the call graph for this function:

◆ get_right_button_state_type()

EnforcerBlockerType Slic3r::GUI::GLGizmoMmuSegmentation::get_right_button_state_type ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoPainterBase.

105{ return EnforcerBlockerType(-1); }

◆ get_sprite_id()

unsigned int Slic3r::GUI::GLGizmoBase::get_sprite_id ( ) const
inlineinherited
204{ return m_sprite_id; }
unsigned int m_sprite_id
Definition GLGizmoBase.hpp:149

References m_sprite_id.

Referenced by Slic3r::GUI::GLGizmosManager::do_render_overlay().

Here is the caller graph for this function:

◆ get_state()

EState Slic3r::GUI::GLGizmoBase::get_state ( ) const
inlineinherited

◆ get_tilt_up_direction()

Vec3f Slic3r::GUI::GLGizmoPainterBase::get_tilt_up_direction ( ) const
protectedinherited
112{
113 return build_plate_tilt_up_direction().cast<float>();
114}
Vec3d build_plate_tilt_up_direction()
Definition GUI_App.cpp:10519

References Slic3r::GUI::build_plate_tilt_up_direction().

Referenced by gizmo_event(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painted_colors(), and render_triangles().

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

◆ get_tooltip()

virtual std::string Slic3r::GUI::GLGizmoBase::get_tooltip ( ) const
inlinevirtualinherited

Mouse tooltip text.

Returns
Text to be visible in mouse tooltip

Reimplemented in Slic3r::GUI::GLGizmoCut3D, Slic3r::GUI::GLGizmoMove3D, Slic3r::GUI::GLGizmoRotate3D, Slic3r::GUI::GLGizmoRotate, and Slic3r::GUI::GLGizmoScale3D.

222{ return ""; }

Referenced by Slic3r::GUI::GLGizmosManager::get_tooltip().

Here is the caller graph for this function:

◆ gizmo_event()

bool Slic3r::GUI::GLGizmoPainterBase::gizmo_event ( SLAGizmoEventType action,
const Vec2d & mouse_position,
bool shift_down,
bool alt_down,
bool control_down )
virtualinherited
727{
728 Vec2d _mouse_position = mouse_position;
731 if (control_down) {
732 //BBS
736 m_parent.set_as_dirty();
737 return true;
738 }
739
743 m_parent.set_as_dirty();
744 return true;
745 }
746
750 m_parent.set_as_dirty();
751 if (m_rr.mesh_id != -1) {
752 const Selection &selection = m_parent.get_selection();
753 const ModelObject *mo = m_c->selection_info()->model_object();
754 const ModelInstance *mi = mo->instances[selection.get_instance_idx()];
755 const Transform3d trafo_matrix_not_translate = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ?
756 mi->get_assemble_transformation().get_matrix_no_offset() * mo->volumes[m_rr.mesh_id]->get_matrix_no_offset() :
757 mi->get_transformation().get_matrix_no_offset() * mo->volumes[m_rr.mesh_id]->get_matrix_no_offset();
758 const Transform3d trafo_matrix = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ?
759 mi->get_assemble_transformation().get_matrix() * mo->volumes[m_rr.mesh_id]->get_matrix() :
760 mi->get_transformation().get_matrix() * mo->volumes[m_rr.mesh_id]->get_matrix();
761 m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), trafo_matrix_not_translate, this->get_clipping_plane_in_volume_coordinates(trafo_matrix), m_smart_fill_angle,
762 m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f, get_tilt_up_direction(), true);
763 m_triangle_selectors[m_rr.mesh_id]->request_update_render_data();
764 m_seed_fill_last_mesh_id = m_rr.mesh_id;
765 }
766 return true;
767 }
768
772 std::min(TriangleSelectorPatch::gap_area + TriangleSelectorPatch::GapAreaStep, TriangleSelectorPatch::GapAreaMax);
773 m_parent.set_as_dirty();
774 return true;
775 }
776 }
777 }
778
779 if (action == SLAGizmoEventType::LeftDown
782
783 if (m_triangle_selectors.empty())
784 return false;
785
787 // BBS
788 if (action == SLAGizmoEventType::Dragging) {
790 return false;
791 }
792 else {
794 return false;
795 }
796
797 if (! shift_down) {
798 if (action == SLAGizmoEventType::Dragging)
800 else
802 }
803
804 const Camera &camera = wxGetApp().plater()->get_camera();
805 const Selection &selection = m_parent.get_selection();
806 const ModelObject *mo = m_c->selection_info()->model_object();
807 const ModelInstance *mi = mo->instances[selection.get_instance_idx()];
808 Transform3d instance_trafo = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ?
809 mi->get_assemble_transformation().get_matrix() :
810 mi->get_transformation().get_matrix();
811 Transform3d instance_trafo_not_translate = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ?
812 mi->get_assemble_transformation().get_matrix_no_offset() :
813 mi->get_transformation().get_matrix_no_offset();
814 std::vector<const ModelVolume*> part_volumes;
815
816 // Precalculate transformations of individual meshes.
817 std::vector<Transform3d> trafo_matrices;
818 std::vector<Transform3d> trafo_matrices_not_translate;
819 for (const ModelVolume *mv : mo->volumes)
820 if (mv->is_model_part()) {
821 if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) {
822 Transform3d temp = instance_trafo * mv->get_matrix();
823 temp.translate(mv->get_transformation().get_offset() * (GLVolume::explosion_ratio - 1.0) + mi->get_offset_to_assembly() * (GLVolume::explosion_ratio - 1.0));
824 trafo_matrices.emplace_back(temp);
825 }
826 else {
827 trafo_matrices.emplace_back(instance_trafo* mv->get_matrix());
828 }
829 trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset());
830 part_volumes.push_back(mv);
831 }
832
833 // BBS
835 {
836 std::vector<ProjectedHeightRange> projected_height_range_by_mesh = get_projected_height_range(_mouse_position, 1., part_volumes, trafo_matrices);
837 m_last_mouse_click = Vec2d::Zero();
838
839 for (int i = 0; i < projected_height_range_by_mesh.size(); i++) {
840 const ProjectedHeightRange& phr = projected_height_range_by_mesh[i];
841 int mesh_idx = phr.mesh_idx;
842
843 // The mouse button click detection is enabled when there is a valid hit.
844 // Missing the object entirely
845 // shall not capture the mouse.
846 const bool dragging_while_painting = (action == SLAGizmoEventType::Dragging && m_button_down != Button::None);
847 if (mesh_idx != -1 && m_button_down == Button::None)
849
850 const Transform3d& trafo_matrix = trafo_matrices[mesh_idx];
851 const Transform3d& trafo_matrix_not_translate = trafo_matrices_not_translate[mesh_idx];
852
853 // Calculate direction from camera to the hit (in mesh coords):
854 Vec3f camera_pos = (trafo_matrix.inverse() * camera.get_position()).cast<float>();
855 const TriangleSelector::ClippingPlane& clp = this->get_clipping_plane_in_volume_coordinates(trafo_matrix);
856
857 std::unique_ptr<TriangleSelector::Cursor> cursor = TriangleSelector::SinglePointCursor::cursor_factory(phr.z_world,
858 camera_pos, m_cursor_height, trafo_matrix, clp);
859 m_triangle_selectors[mesh_idx]->select_patch(int(phr.first_facet_idx), std::move(cursor), new_state, trafo_matrix_not_translate,
861
862 m_triangle_selectors[mesh_idx]->request_update_render_data(true);
863 m_last_mouse_click = _mouse_position;
864 }
865
866 return true;
867 }
868
871 _mouse_position.x() = m_last_mouse_click.x();
872 else if(m_horizontal_only)
873 _mouse_position.y() = m_last_mouse_click.y();
874 }
875
876 std::vector<std::vector<ProjectedMousePosition>> projected_mouse_positions_by_mesh = get_projected_mouse_positions(_mouse_position, 1., trafo_matrices);
877 m_last_mouse_click = Vec2d::Zero(); // only actual hits should be saved
878
879 for (const std::vector<ProjectedMousePosition> &projected_mouse_positions : projected_mouse_positions_by_mesh) {
880 assert(!projected_mouse_positions.empty());
881 const int mesh_idx = projected_mouse_positions.front().mesh_idx;
882 const bool dragging_while_painting = (action == SLAGizmoEventType::Dragging && m_button_down != Button::None);
883
884 // The mouse button click detection is enabled when there is a valid hit.
885 // Missing the object entirely
886 // shall not capture the mouse.
887 if (mesh_idx != -1)
890
891 // In case we have no valid hit, we can return. The event will be stopped when
892 // dragging while painting (to prevent scene rotations and moving the object)
893 if (mesh_idx == -1)
894 return dragging_while_painting;
895
896 const Transform3d &trafo_matrix = trafo_matrices[mesh_idx];
897 const Transform3d &trafo_matrix_not_translate = trafo_matrices_not_translate[mesh_idx];
898
899 // Calculate direction from camera to the hit (in mesh coords):
900 Vec3f camera_pos = (trafo_matrix.inverse() * camera.get_position()).cast<float>();
901
902 assert(mesh_idx < int(m_triangle_selectors.size()));
903 const TriangleSelector::ClippingPlane &clp = this->get_clipping_plane_in_volume_coordinates(trafo_matrix);
905 for(const ProjectedMousePosition &projected_mouse_position : projected_mouse_positions) {
906 assert(projected_mouse_position.mesh_idx == mesh_idx);
907 const Vec3f mesh_hit = projected_mouse_position.mesh_hit;
908 const int facet_idx = int(projected_mouse_position.facet_idx);
909 m_triangle_selectors[mesh_idx]->seed_fill_apply_on_triangles(new_state);
911 m_triangle_selectors[mesh_idx]->seed_fill_select_triangles(mesh_hit, facet_idx, trafo_matrix_not_translate, clp, m_smart_fill_angle,
914 // BBS: add infill_angle parameter
915 m_triangle_selectors[mesh_idx]->bucket_fill_select_triangles(mesh_hit, facet_idx, clp, -1.f, false, true);
917 // BBS: add infill_angle parameter
918 m_triangle_selectors[mesh_idx]->bucket_fill_select_triangles(mesh_hit, facet_idx, clp, m_smart_fill_angle, true, true);
919
921 }
922 } else if (m_tool_type == ToolType::BRUSH) {
924
925 if (projected_mouse_positions.size() == 1) {
926 const ProjectedMousePosition &first_position = projected_mouse_positions.front();
927 std::unique_ptr<TriangleSelector::Cursor> cursor = TriangleSelector::SinglePointCursor::cursor_factory(first_position.mesh_hit,
928 camera_pos, m_cursor_radius,
929 m_cursor_type, trafo_matrix, clp);
930 m_triangle_selectors[mesh_idx]->select_patch(int(first_position.facet_idx), std::move(cursor), new_state, trafo_matrix_not_translate,
932 } else {
933 for (auto first_position_it = projected_mouse_positions.cbegin(); first_position_it != projected_mouse_positions.cend() - 1; ++first_position_it) {
934 auto second_position_it = first_position_it + 1;
935 std::unique_ptr<TriangleSelector::Cursor> cursor = TriangleSelector::DoublePointCursor::cursor_factory(first_position_it->mesh_hit, second_position_it->mesh_hit, camera_pos, m_cursor_radius, m_cursor_type, trafo_matrix, clp);
936 m_triangle_selectors[mesh_idx]->select_patch(int(first_position_it->facet_idx), std::move(cursor), new_state, trafo_matrix_not_translate, m_triangle_splitting_enabled, m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f, get_tilt_up_direction());
937 }
938 }
939 }
940
941 m_triangle_selectors[mesh_idx]->request_update_render_data(true);
942
943 m_last_mouse_click = _mouse_position;
944 }
945
946 return true;
947 }
948
950 if (m_triangle_selectors.empty())
951 return false;
952
953 const Camera &camera = wxGetApp().plater()->get_camera();
954 const Selection &selection = m_parent.get_selection();
955 const ModelObject *mo = m_c->selection_info()->model_object();
956 const ModelInstance *mi = mo->instances[selection.get_instance_idx()];
957 const Transform3d instance_trafo = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ?
958 mi->get_assemble_transformation().get_matrix() :
959 mi->get_transformation().get_matrix();
960 const Transform3d instance_trafo_not_translate = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ?
961 mi->get_assemble_transformation().get_matrix_no_offset() :
962 mi->get_transformation().get_matrix_no_offset();
963
964 // Precalculate transformations of individual meshes.
965 std::vector<Transform3d> trafo_matrices;
966 std::vector<Transform3d> trafo_matrices_not_translate;
967 for (const ModelVolume *mv : mo->volumes)
968 if (mv->is_model_part()) {
969 if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) {
970 Transform3d temp = instance_trafo * mv->get_matrix();
971 temp.translate(mv->get_transformation().get_offset() * (GLVolume::explosion_ratio - 1.0) + mi->get_offset_to_assembly() * (GLVolume::explosion_ratio - 1.0));
972 trafo_matrices.emplace_back(temp);
973 }
974 else {
975 trafo_matrices.emplace_back(instance_trafo * mv->get_matrix());
976 }
977 trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset());
978 }
979
980 // Now "click" into all the prepared points and spill paint around them.
981 update_raycast_cache(_mouse_position, camera, trafo_matrices);
982
983 auto seed_fill_unselect_all = [this]() {
984 for (auto &triangle_selector : m_triangle_selectors) {
985 triangle_selector->seed_fill_unselect_all_triangles();
986 triangle_selector->request_update_render_data();
987 }
988 };
989
990 if (m_rr.mesh_id == -1) {
991 // Clean selected by seed fill for all triangles in all meshes when a mouse isn't pointing on any mesh.
992 seed_fill_unselect_all();
994
995 // In case we have no valid hit, we can return.
996 return false;
997 }
998
999 // The mouse moved from one object's volume to another one. So it is needed to unselect all triangles selected by seed fill.
1000 if(m_rr.mesh_id != m_seed_fill_last_mesh_id)
1001 seed_fill_unselect_all();
1002
1003 const Transform3d &trafo_matrix = trafo_matrices[m_rr.mesh_id];
1004 const Transform3d &trafo_matrix_not_translate = trafo_matrices_not_translate[m_rr.mesh_id];
1005
1006 assert(m_rr.mesh_id < int(m_triangle_selectors.size()));
1007 const TriangleSelector::ClippingPlane &clp = this->get_clipping_plane_in_volume_coordinates(trafo_matrix);
1009 m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), trafo_matrix_not_translate, clp, m_smart_fill_angle,
1012 // BBS: add infill_angle parameter
1013 m_triangle_selectors[m_rr.mesh_id]->bucket_fill_select_triangles(m_rr.hit, int(m_rr.facet), clp, -1.f, false);
1015 // BBS: add infill_angle parameter
1016 m_triangle_selectors[m_rr.mesh_id]->bucket_fill_select_triangles(m_rr.hit, int(m_rr.facet), clp, m_smart_fill_angle, true);
1017 m_triangle_selectors[m_rr.mesh_id]->request_update_render_data();
1019 return true;
1020 }
1021
1022 if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::RightUp)
1024 // Take snapshot and update ModelVolume data.
1025 wxString action_name = this->handle_snapshot_action_name(shift_down, m_button_down);
1026 Plater::TakeSnapshot snapshot(wxGetApp().plater(), std::string(action_name.ToUTF8().data()), UndoRedo::SnapshotType::GizmoAction);
1028
1030 m_last_mouse_click = Vec2d::Zero();
1031 return true;
1032 }
1033
1034 return false;
1035}
static float explosion_ratio
Definition 3DScene.hpp:117
bool m_triangle_splitting_enabled
Definition GLGizmoPainterBase.hpp:297
virtual wxString handle_snapshot_action_name(bool shift_down, Button button_down) const =0
@ SMART_FILL
Definition GLGizmoPainterBase.hpp:277
@ BRUSH
Definition GLGizmoPainterBase.hpp:275
@ BUCKET_FILL
Definition GLGizmoPainterBase.hpp:276
@ GAP_FILL
Definition GLGizmoPainterBase.hpp:279
@ None
Definition GLGizmoPainterBase.hpp:323
@ Right
Definition GLGizmoPainterBase.hpp:325
@ Left
Definition GLGizmoPainterBase.hpp:324
std::vector< std::vector< ProjectedMousePosition > > get_projected_mouse_positions(const Vec2d &mouse_position, double resolution, const std::vector< Transform3d > &trafo_matrices) const
Definition GLGizmoPainterBase.cpp:541
bool m_paint_on_overhangs_only
Definition GLGizmoPainterBase.hpp:301
static constexpr float SmartFillAngleStep
Definition GLGizmoPainterBase.hpp:312
Vec3f get_tilt_up_direction() const
Definition GLGizmoPainterBase.cpp:111
virtual void update_model_object()=0
float m_highlight_by_angle_threshold_deg
Definition GLGizmoPainterBase.hpp:302
int m_seed_fill_last_mesh_id
Definition GLGizmoPainterBase.hpp:320
virtual const float get_cursor_radius_min() const
Definition GLGizmoPainterBase.hpp:217
virtual const float get_cursor_height_min() const
Definition GLGizmoPainterBase.hpp:222
std::vector< ProjectedHeightRange > get_projected_height_range(const Vec2d &mouse_position, double resolution, const std::vector< const ModelVolume * > &part_volumes, const std::vector< Transform3d > &trafo_matrices) const
Definition GLGizmoPainterBase.cpp:660
Button m_button_down
Definition GLGizmoPainterBase.hpp:359
std::vector< std::unique_ptr< TriangleSelectorGUI > > m_triangle_selectors
Definition GLGizmoPainterBase.hpp:270
TriangleSelector::CursorType m_cursor_type
Definition GLGizmoPainterBase.hpp:272
virtual const float get_cursor_height_step() const
Definition GLGizmoPainterBase.hpp:224
virtual const float get_cursor_height_max() const
Definition GLGizmoPainterBase.hpp:223
virtual EnforcerBlockerType get_left_button_state_type() const
Definition GLGizmoPainterBase.hpp:256
bool m_horizontal_only
Definition GLGizmoPainterBase.hpp:316
float m_smart_fill_angle
Definition GLGizmoPainterBase.hpp:299
static constexpr float SmartFillAngleMin
Definition GLGizmoPainterBase.hpp:310
virtual const float get_cursor_radius_max() const
Definition GLGizmoPainterBase.hpp:218
static constexpr float SmartFillAngleMax
Definition GLGizmoPainterBase.hpp:311
bool m_vertical_only
Definition GLGizmoPainterBase.hpp:315
TriangleSelector::ClippingPlane get_clipping_plane_in_volume_coordinates(const Transform3d &trafo) const
Definition GLGizmoPainterBase.cpp:1243
virtual const float get_cursor_radius_step() const
Definition GLGizmoPainterBase.hpp:219
ToolType m_tool_type
Definition GLGizmoPainterBase.hpp:298
virtual EnforcerBlockerType get_right_button_state_type() const
Definition GLGizmoPainterBase.hpp:257
Definition GLGizmoPainterBase.hpp:291
static constexpr float GapAreaMin
Definition GLGizmoPainterBase.hpp:131
static float gap_area
Definition GLGizmoPainterBase.hpp:136
static constexpr float GapAreaStep
Definition GLGizmoPainterBase.hpp:133
static std::unique_ptr< Cursor > cursor_factory(const Vec3f &first_center, const Vec3f &second_center, const Vec3f &camera_pos, const float cursor_radius, const CursorType cursor_type, const Transform3d &trafo_matrix, const ClippingPlane &clipping_plane)
Definition TriangleSelector.hpp:171
static std::unique_ptr< Cursor > cursor_factory(const Vec3f &center, const Vec3f &camera_pos, const float cursor_radius, const CursorType cursor_type, const Transform3d &trafo_matrix, const ClippingPlane &clipping_plane)
Definition TriangleSelector.hpp:143
@ POINTER
Definition TriangleSelector.hpp:84
@ HEIGHT_RANGE
Definition TriangleSelector.hpp:86
@ SPHERE
Definition TriangleSelector.hpp:83
@ CIRCLE
Definition TriangleSelector.hpp:82
@ LeftUp
Definition GLGizmosCommon.hpp:30
@ MouseWheelUp
Definition GLGizmosCommon.hpp:46
@ MouseWheelDown
Definition GLGizmosCommon.hpp:47
@ RightUp
Definition GLGizmosCommon.hpp:32
@ Dragging
Definition GLGizmosCommon.hpp:33
@ LeftDown
Definition GLGizmosCommon.hpp:29
@ RightDown
Definition GLGizmosCommon.hpp:31
@ Moving
Definition GLGizmosCommon.hpp:49
@ GizmoAction
Definition UndoRedo.hpp:36
@ NONE
Definition TriangleSelector.hpp:26
Eigen::Matrix< float, 3, 1, Eigen::DontAlign > Vec3f
Definition Point.hpp:65

References BRUSH, BUCKET_FILL, Slic3r::GUI::GLCanvas3D::CanvasAssembleView, Slic3r::TriangleSelector::CIRCLE, Slic3r::TriangleSelector::DoublePointCursor::cursor_factory(), Slic3r::TriangleSelector::SinglePointCursor::cursor_factory(), Slic3r::GUI::Dragging, Slic3r::GLVolume::explosion_ratio, Slic3r::GUI::GLGizmoPainterBase::ProjectedMousePosition::facet_idx, Slic3r::GUI::GLGizmoPainterBase::ProjectedHeightRange::first_facet_idx, Slic3r::GUI::TriangleSelectorPatch::gap_area, GAP_FILL, Slic3r::GUI::TriangleSelectorPatch::GapAreaMax, Slic3r::GUI::TriangleSelectorPatch::GapAreaMin, Slic3r::GUI::TriangleSelectorPatch::GapAreaStep, Slic3r::ModelInstance::get_assemble_transformation(), get_clipping_plane_in_volume_coordinates(), get_cursor_height_max(), get_cursor_height_min(), get_cursor_height_step(), get_cursor_radius_max(), get_cursor_radius_min(), get_cursor_radius_step(), Slic3r::GUI::Selection::get_instance_idx(), get_left_button_state_type(), Slic3r::Geometry::Transformation::get_matrix(), Slic3r::ModelVolume::get_matrix(), Slic3r::Geometry::Transformation::get_matrix_no_offset(), Slic3r::ModelVolume::get_matrix_no_offset(), Slic3r::Geometry::Transformation::get_offset(), Slic3r::ModelInstance::get_offset_to_assembly(), Slic3r::GUI::Camera::get_position(), get_projected_height_range(), get_projected_mouse_positions(), get_right_button_state_type(), get_tilt_up_direction(), Slic3r::ModelInstance::get_transformation(), Slic3r::ModelVolume::get_transformation(), Slic3r::UndoRedo::GizmoAction, handle_snapshot_action_name(), Slic3r::TriangleSelector::HEIGHT_RANGE, Slic3r::ModelObject::instances, Slic3r::ModelVolume::is_model_part(), Left, Slic3r::GUI::LeftDown, Slic3r::GUI::LeftUp, m_button_down, Slic3r::GUI::GLGizmoBase::m_c, m_cursor_height, m_cursor_radius, m_cursor_type, m_highlight_by_angle_threshold_deg, m_horizontal_only, m_last_mouse_click, m_paint_on_overhangs_only, Slic3r::GUI::GLGizmoBase::m_parent, m_rr, m_seed_fill_last_mesh_id, m_smart_fill_angle, m_tool_type, m_triangle_selectors, m_triangle_splitting_enabled, m_vertical_only, Slic3r::GUI::GLGizmoPainterBase::ProjectedMousePosition::mesh_hit, Slic3r::GUI::GLGizmoPainterBase::ProjectedHeightRange::mesh_idx, Slic3r::GUI::MouseWheelDown, Slic3r::GUI::MouseWheelUp, Slic3r::GUI::Moving, Slic3r::NONE, None, Slic3r::GUI::plater(), Slic3r::TriangleSelector::POINTER, Right, Slic3r::GUI::RightDown, Slic3r::GUI::RightUp, SMART_FILL, SmartFillAngleMax, SmartFillAngleMin, SmartFillAngleStep, Slic3r::TriangleSelector::SPHERE, update_model_object(), update_raycast_cache(), Slic3r::ModelObject::volumes, and Slic3r::GUI::GLGizmoPainterBase::ProjectedHeightRange::z_world.

Referenced by Slic3r::GUI::GLGizmosManager::gizmo_event(), and on_mouse().

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

◆ GizmoImguiBegin()

◆ GizmoImguiEnd()

◆ GizmoImguiSetNextWIndowPos() [1/2]

void Slic3r::GUI::GLGizmoBase::GizmoImguiSetNextWIndowPos ( float & x,
float y,
float w,
float h,
int flag,
float pivot_x = 0.0f,
float pivot_y = 0.0f )
protectedinherited
384{
385 if (abs(w) > 0.01f) {
386 if (x + w > m_parent.get_canvas_size().get_width()) {
387 if (w > m_parent.get_canvas_size().get_width()) {
388 x = 0;
389 } else {
390 x = m_parent.get_canvas_size().get_width() - w;
391 }
392 }
393 }
394
395 m_imgui->set_next_window_pos(x, y, flag, pivot_x, pivot_y);
396}

References m_imgui, and m_parent.

◆ GizmoImguiSetNextWIndowPos() [2/2]

void Slic3r::GUI::GLGizmoBase::GizmoImguiSetNextWIndowPos ( float & x,
float y,
int flag,
float pivot_x = 0.0f,
float pivot_y = 0.0f )
protectedinherited

◆ gradient_of()

const std::vector< wxColour > * Slic3r::GUI::GLGizmoMmuSegmentation::gradient_of ( int idx) const
inlineprivate
159 {
160 return idx >= 0 && idx < (int) m_gradient_ramps.size() && !m_gradient_ramps[idx].empty() ? &m_gradient_ramps[idx] : nullptr;
161 }
std::vector< std::vector< wxColour > > m_gradient_ramps
Definition GLGizmoMmuSegmentation.hpp:133

References m_gradient_ramps.

Referenced by draw_color_button().

Here is the caller graph for this function:

◆ handle_snapshot_action_name()

wxString Slic3r::GUI::GLGizmoMmuSegmentation::handle_snapshot_action_name ( bool shift_down,
ButtonButton button_down ) const
overrideprotectedvirtual

Implements Slic3r::GUI::GLGizmoPainterBase.

835{
836 wxString action_name;
837 if (shift_down)
838 action_name = _L("Remove painted color");
839 else {
840 action_name = GUI::format(_L("Painted using: Filament %1%"), m_selected_extruder_idx);
841 }
842 return action_name;
843}
#define _L(s)
Definition OBJ.cpp:34
std::string format(const char *fmt, TArgs &&... args)
Definition format.hpp:36

References _L, Slic3r::GUI::format(), and m_selected_extruder_idx.

Here is the call graph for this function:

◆ init()

bool Slic3r::GUI::GLGizmoBase::init ( )
inlineinherited
168{ return on_init(); }
virtual bool on_init()=0

References on_init().

Here is the call graph for this function:

◆ init_extruders_data()

void Slic3r::GUI::GLGizmoMmuSegmentation::init_extruders_data ( )
private
111{
112 m_extruders_colors = wxGetApp().plater()->get_extruders_colors();
114
115 m_gradient_ramps = wxGetApp().plater()->get_filament_gradient_ramps();
117
118 // keep remap table consistent with current extruder count
120 for (size_t i = 0; i < m_extruder_remap.size(); ++i)
121 m_extruder_remap[i] = i;
122}
std::vector< size_t > m_extruder_remap
Definition GLGizmoMmuSegmentation.hpp:129

References m_extruder_remap, m_extruders_colors, m_gradient_ramps, and m_selected_extruder_idx.

Referenced by data_changed(), on_init(), and update_from_model_object().

Here is the caller graph for this function:

◆ init_model_triangle_selectors()

void Slic3r::GUI::GLGizmoMmuSegmentation::init_model_triangle_selectors ( )
private
724{
725 const ModelObject *mo = m_c->selection_info()->model_object();
726 m_triangle_selectors.clear();
728
729 // Don't continue when extruders colors are not initialized
730 if(m_extruders_colors.empty())
731 return;
732
733 // BBS: Don't continue when model object is null
734 if (mo == nullptr)
735 return;
736
737 for (const ModelVolume *mv : mo->volumes) {
738 if (!mv->is_model_part())
739 continue;
740
741 int extruder_idx = (mv->extruder_id() > 0) ? mv->extruder_id() - 1 : 0;
742 // A volume may be assigned to a mixed-color slot, whose index can sit past the
743 // physical colour list; fall back to the first colour rather than reading OOB.
744 if (extruder_idx >= (int)m_extruders_colors.size())
745 extruder_idx = 0;
746 std::vector<ColorRGBA> ebt_colors;
747 ebt_colors.push_back(m_extruders_colors[size_t(extruder_idx)]);
748 ebt_colors.insert(ebt_colors.end(), m_extruders_colors.begin(), m_extruders_colors.end());
749
750 // This mesh does not account for the possible Z up SLA offset.
751 const TriangleMesh* mesh = &mv->mesh();
752 m_triangle_selectors.emplace_back(std::make_unique<TriangleSelectorPatch>(*mesh, ebt_colors, 0.2));
753 // Reset of TriangleSelector is done inside TriangleSelectorMmGUI's constructor, so we don't need it to perform it again in deserialize().
755 m_triangle_selectors.back()->deserialize(mv->mmu_segmentation_facets.get_data(), false, max_ebt);
756 m_triangle_selectors.back()->request_update_render_data();
757 m_triangle_selectors.back()->set_wireframe_needed(true);
758 m_volumes_extruder_idxs.push_back(mv->extruder_id());
759 }
760}
@ ExtruderMax
Definition TriangleSelector.hpp:66

References Slic3r::ModelVolume::extruder_id(), Slic3r::ExtruderMax, Slic3r::FacetsAnnotation::get_data(), Slic3r::ModelVolume::is_model_part(), Slic3r::GUI::GLGizmoBase::m_c, m_extruders_colors, Slic3r::GUI::GLGizmoPainterBase::m_triangle_selectors, m_volumes_extruder_idxs, Slic3r::ModelVolume::mesh(), Slic3r::ModelVolume::mmu_segmentation_facets, and Slic3r::ModelObject::volumes.

Referenced by data_changed(), and update_from_model_object().

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

◆ is_activable()

bool Slic3r::GUI::GLGizmoBase::is_activable ( ) const
inlineinherited
184{ return on_is_activable(); }
virtual bool on_is_activable() const
Definition GLGizmoBase.hpp:246

References on_is_activable().

Referenced by Slic3r::GUI::GLGizmosManager::activate_gizmo(), Slic3r::GUI::GLGizmosManager::do_render_overlay(), Slic3r::GUI::GLGizmoEmboss::init_create(), and Slic3r::GUI::GLGizmosManager::update_hover_state().

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

◆ is_dragging()

bool Slic3r::GUI::GLGizmoBase::is_dragging ( ) const
inlineinherited
209{ return m_dragging; }

References m_dragging.

Referenced by Slic3r::GUI::GLGizmoCut3D::gizmo_event(), Slic3r::GUI::GLGizmoEmboss::on_mouse_for_translate(), and Slic3r::GUI::GLGizmoSVG::on_mouse_for_translate().

Here is the caller graph for this function:

◆ is_in_editing_mode()

virtual bool Slic3r::GUI::GLGizmoBase::is_in_editing_mode ( ) const
inlinevirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoCut3D.

235{ return false; }

Referenced by Slic3r::GUI::GLGizmosManager::on_key().

Here is the caller graph for this function:

◆ is_mesh_point_clipped()

bool Slic3r::GUI::GLGizmoPainterBase::is_mesh_point_clipped ( const Vec3d & point,
const Transform3d & trafo ) const
privateinherited
528{
529 if (m_c->object_clipper()->get_position() == 0.)
530 return false;
531
532 auto sel_info = m_c->selection_info();
533 Vec3d transformed_point = trafo * point;
534 transformed_point(2) += sel_info->get_sla_shift();
535 return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point);
536}

References Slic3r::GUI::GLGizmoBase::m_c.

Referenced by update_raycast_cache().

Here is the caller graph for this function:

◆ is_painting()

bool Slic3r::GUI::GLGizmoPainterBase::is_painting ( ) const
inlineprotectedinherited
339{ return m_button_down != Button::None; }

References m_button_down, and None.

Referenced by Slic3r::GUI::GLGizmoTextureDisplacement::render_painter_gizmo().

Here is the caller graph for this function:

◆ is_selectable()

bool Slic3r::GUI::GLGizmoBase::is_selectable ( ) const
inlineinherited
185{ return on_is_selectable(); }
virtual bool on_is_selectable() const
Definition GLGizmoBase.hpp:247

References on_is_selectable().

Here is the call graph for this function:

◆ is_selection_rectangle_dragging()

virtual bool Slic3r::GUI::GLGizmoBase::is_selection_rectangle_dragging ( ) const
inlinevirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoBrimEars, and Slic3r::GUI::GLGizmoCut3D.

236{ return false; }

◆ load()

void Slic3r::GUI::GLGizmoBase::load ( cereal::BinaryInputArchive & ar)
inlineinherited
170{ m_state = On; on_load(ar); }
virtual void on_load(cereal::BinaryInputArchive &ar)
Definition GLGizmoBase.hpp:241

References m_state, On, and on_load().

Here is the call graph for this function:

◆ load_render_colors()

void Slic3r::GUI::GLGizmoBase::load_render_colors ( )
staticinherited
93{
99}
@ RenderCol_Grabber_Y
Definition GUI_Colors.hpp:27
@ RenderCol_Flatten_Plane
Definition GUI_Colors.hpp:29
@ RenderCol_Grabber_X
Definition GUI_Colors.hpp:26
@ RenderCol_Grabber_Z
Definition GUI_Colors.hpp:28
@ RenderCol_Flatten_Plane_Hover
Definition GUI_Colors.hpp:30
static ColorRGBA FLATTEN_COLOR
Definition GLGizmoBase.hpp:63
static std::array< ColorRGBA, 3 > AXES_COLOR
Definition GLGizmoBase.hpp:60
static ColorRGBA FLATTEN_HOVER_COLOR
Definition GLGizmoBase.hpp:64
static ImVec4 colors[RenderCol_Count]
Definition GUI_Colors.hpp:40

References AXES_COLOR, Slic3r::RenderColor::colors, FLATTEN_COLOR, FLATTEN_HOVER_COLOR, RenderCol_Flatten_Plane, RenderCol_Flatten_Plane_Hover, RenderCol_Grabber_X, RenderCol_Grabber_Y, RenderCol_Grabber_Z, and Slic3r::GUI::ImGuiWrapper::to_ImVec4().

Referenced by Slic3r::GUI::GLCanvas3D::init().

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

◆ mesh_trafo_matrices()

std::vector< Transform3d > Slic3r::GUI::GLGizmoPainterBase::mesh_trafo_matrices ( ) const
privateinherited
186{
187 const ModelObject* mo = m_c->selection_info()->model_object();
188 const Selection& selection = m_parent.get_selection();
189 const ModelInstance* mi = mo->instances[selection.get_instance_idx()];
190
191 std::vector<Transform3d> trafo_matrices;
192 for (const ModelVolume* mv : mo->volumes) {
193 if (mv->is_model_part())
194 {
195 if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) {
196 Transform3d temp = mi->get_assemble_transformation().get_matrix() * mv->get_matrix();
197 temp.translate(mv->get_transformation().get_offset() * (GLVolume::explosion_ratio - 1.0) + mi->get_offset_to_assembly() * (GLVolume::explosion_ratio - 1.0));
198 trafo_matrices.emplace_back(temp);
199 }
200 else {
201 trafo_matrices.emplace_back(mi->get_transformation().get_matrix() * mv->get_matrix());
202 }
203 }
204 }
205 return trafo_matrices;
206}

References Slic3r::GUI::GLCanvas3D::CanvasAssembleView, Slic3r::GLVolume::explosion_ratio, Slic3r::ModelInstance::get_assemble_transformation(), Slic3r::GUI::Selection::get_instance_idx(), Slic3r::Geometry::Transformation::get_matrix(), Slic3r::ModelVolume::get_matrix(), Slic3r::Geometry::Transformation::get_offset(), Slic3r::ModelInstance::get_offset_to_assembly(), Slic3r::ModelInstance::get_transformation(), Slic3r::ModelVolume::get_transformation(), Slic3r::ModelObject::instances, Slic3r::ModelVolume::is_model_part(), Slic3r::GUI::GLGizmoBase::m_c, Slic3r::GUI::GLGizmoBase::m_parent, and Slic3r::ModelObject::volumes.

Referenced by render_cursor(), and render_follows_cursor().

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

◆ on_change_color_mode()

virtual void Slic3r::GUI::GLGizmoBase::on_change_color_mode ( bool is_dark)
inlinevirtualinherited
static bool is_dark()
Definition TextureImportDialog.cpp:85

References is_dark(), and m_is_dark_mode.

Here is the call graph for this function:

◆ on_disable_grabber()

virtual void Slic3r::GUI::GLGizmoBase::on_disable_grabber ( unsigned int id)
inlineprotectedvirtualinherited

◆ on_dragging()

virtual void Slic3r::GUI::GLGizmoBase::on_dragging ( const UpdateData & data)
inlineprotectedvirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoBrimEars, Slic3r::GUI::GLGizmoCut3D, Slic3r::GUI::GLGizmoEmboss, Slic3r::GUI::GLGizmoMove3D, Slic3r::GUI::GLGizmoRotate3D, Slic3r::GUI::GLGizmoRotate, Slic3r::GUI::GLGizmoScale3D, and Slic3r::GUI::GLGizmoSVG.

255{}

Referenced by use_grabbers().

Here is the caller graph for this function:

◆ on_enable_grabber()

virtual void Slic3r::GUI::GLGizmoBase::on_enable_grabber ( unsigned int id)
inlineprotectedvirtualinherited

◆ on_get_name()

std::string Slic3r::GUI::GLGizmoMmuSegmentation::on_get_name ( ) const
overrideprotectedvirtual

Implements Slic3r::GUI::GLGizmoBase.

80{
81 return _u8L("Color Painting");
82}

References _u8L.

◆ on_get_requirements()

CommonGizmosDataID Slic3r::GUI::GLGizmoPainterBase::on_get_requirements ( ) const
overrideprotectedvirtualinherited

Reimplemented from Slic3r::GUI::GLGizmoBase.

1185{
1186 return CommonGizmosDataID(
1191}
CommonGizmosDataID
Definition GLGizmosCommon.hpp:72
@ SelectionInfo
Definition GLGizmosCommon.hpp:74
@ Raycaster
Definition GLGizmosCommon.hpp:76
@ InstancesHider
Definition GLGizmosCommon.hpp:75
@ ObjectClipper
Definition GLGizmosCommon.hpp:77

References Slic3r::GUI::InstancesHider, Slic3r::GUI::ObjectClipper, Slic3r::GUI::Raycaster, and Slic3r::GUI::SelectionInfo.

◆ on_init()

bool Slic3r::GUI::GLGizmoMmuSegmentation::on_init ( )
overrideprivatevirtual

Implements Slic3r::GUI::GLGizmoBase.

125{
126 // BBS
128
129 const wxString ctrl = GUI::shortkey_ctrl_prefix();
130 const wxString alt = GUI::shortkey_alt_prefix();
131 const wxString shift = GUI::shortkey_shift_prefix();
132
133 m_desc["cursor_size"] = _L("Brush size");
134 m_desc["cursor_type"] = _L("Brush shape");
135 m_desc["paint"] = _L("Paint");
136 m_desc["erase"] = _L("Erase");
137 m_desc["shortcut_key"] = _L("Choose filament");
138 m_desc["edge_detection"] = _L("Edge detection");
139 m_desc["gap_area"] = _L("Gap area");
140 m_desc["perform"] = _L("Apply");
141 m_desc["remove_all"] = _L("Erase all");
142 m_desc["circle"] = _L("Circle");
143 m_desc["sphere"] = _L("Sphere");
144 m_desc["pointer"] = _L("Triangles");
145 m_desc["filaments"] = _L("Filaments");
146 m_desc["tool_type"] = _L("Tool type");
147 m_desc["tool_brush"] = _L("Brush");
148 m_desc["tool_smart_fill"] = _L("Smart fill");
149 m_desc["tool_bucket_fill"] = _L("Bucket fill");
150 m_desc["smart_fill_angle"] = _L("Smart fill angle");
151 m_desc["height_range"] = _L("Height range");
152 m_desc["toggle_wireframe"] = _L("Toggle Wireframe");
153 m_desc["perform_remap"] = _u8L("Remap filaments");
154 m_desc["remap"] = _L("Remap");
155 m_desc["remap_reset"] = _L("Reset");
156
157 std::pair<wxString, wxString> paint_shortcut = {_L("Left mouse button"), m_desc["paint"]};
158 std::pair<wxString, wxString> erase_shortcut = {shift + _L("Left mouse button"), m_desc["erase"]};
159 std::pair<wxString, wxString> toggle_wireframe_shortcut = {alt + shift + _L_CONTEXT("Enter", "Keyboard Shortcut"), m_desc["toggle_wireframe"]};
160
162 paint_shortcut,
163 erase_shortcut,
164 {ctrl + _L("Mouse wheel"), m_desc["cursor_size"]},
165 toggle_wireframe_shortcut
166 };
167
169 paint_shortcut,
170 erase_shortcut,
171 {ctrl + _L("Mouse wheel"), m_desc["smart_fill_angle"]},
172 toggle_wireframe_shortcut
173 };
174
176 {ctrl + _L("Mouse wheel"), m_desc["gap_area"]},
177 toggle_wireframe_shortcut
178 };
179
181
182 return true;
183}
std::vector< std::pair< wxString, wxString > > m_shortcuts_gap_fill
Definition GLGizmoMmuSegmentation.hpp:182
std::vector< std::pair< wxString, wxString > > m_shortcuts_bucket_fill
Definition GLGizmoMmuSegmentation.hpp:180
std::map< std::string, wxString > m_desc
Definition GLGizmoMmuSegmentation.hpp:175
std::vector< std::pair< wxString, wxString > > m_shortcuts_brush
Definition GLGizmoMmuSegmentation.hpp:178
const std::string & shortkey_shift_prefix()
Definition GUI.cpp:109
@ GizmoMmuSegmentation
Definition Shortcuts.hpp:41
const std::string & shortkey_alt_prefix()
Definition GUI.cpp:127
const std::string & shortkey_ctrl_prefix()
Definition GUI.cpp:115
#define _L_CONTEXT(s, ctx)
Definition I18N.hpp:15

References _L, _L_CONTEXT, _u8L, Slic3r::GUI::GizmoMmuSegmentation, init_extruders_data(), m_desc, Slic3r::GUI::GLGizmoBase::m_shortcut, m_shortcuts_brush, m_shortcuts_bucket_fill, m_shortcuts_gap_fill, Slic3r::GUI::shortkey_alt_prefix(), Slic3r::GUI::shortkey_ctrl_prefix(), and Slic3r::GUI::shortkey_shift_prefix().

Here is the call graph for this function:

◆ on_is_activable()

bool Slic3r::GUI::GLGizmoMmuSegmentation::on_is_activable ( ) const
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

91{
92 const Selection& selection = m_parent.get_selection();
93 return !selection.is_empty() && (selection.is_single_full_instance() || selection.is_any_volume()) && wxGetApp().filaments_cnt() > 1;
94}

References Slic3r::GUI::Selection::is_any_volume(), Slic3r::GUI::Selection::is_empty(), Slic3r::GUI::Selection::is_single_full_instance(), and Slic3r::GUI::GLGizmoBase::m_parent.

Here is the call graph for this function:

◆ on_is_selectable()

bool Slic3r::GUI::GLGizmoMmuSegmentation::on_is_selectable ( ) const
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

85{
86 return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF
87 && /*wxGetApp().get_mode() != comSimple && */wxGetApp().filaments_cnt() > 1);
88}

References Slic3r::ptFFF.

◆ on_load()

void Slic3r::GUI::GLGizmoPainterBase::on_load ( cereal::BinaryInputArchive & ar)
overrideprotectedvirtualinherited

Reimplemented from Slic3r::GUI::GLGizmoBase.

1234{
1235 // We should update the gizmo from current ModelObject, but it is not
1236 // possible at this point. That would require having updated selection and
1237 // common gizmos data, which is not done at this point. Instead, save
1238 // a flag to do the update in set_painter_gizmo_data, which will be called
1239 // soon after.
1240 m_schedule_update = true;
1241}
bool m_schedule_update
Definition GLGizmoPainterBase.hpp:356

References m_schedule_update.

◆ on_mouse()

bool Slic3r::GUI::GLGizmoPainterBase::on_mouse ( const wxMouseEvent & mouse_event)
overridevirtualinherited

Implement when want to process mouse events in gizmo Click, Right click, move, drag, ...

Parameters
mouse_eventKeep information about mouse click
Returns
Return True when use the information and don't want to propagate it otherwise False.

Reimplemented from Slic3r::GUI::GLGizmoBase.

Reimplemented in Slic3r::GUI::GLGizmoTextureDisplacement.

1038{
1039 // wxCoord == int --> wx/types.h
1040 Vec2i32 mouse_coord(mouse_event.GetX(), mouse_event.GetY());
1041 Vec2d mouse_pos = mouse_coord.cast<double>();
1042
1043 if (mouse_event.Moving()) {
1044 // No button is down, yet a stroke is still open: its release went elsewhere, as a paint drag does not
1045 // capture the mouse. End the stroke as that release would have.
1048 mouse_event.ShiftDown(), mouse_event.AltDown(), false);
1049 gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false);
1050 return false;
1051 }
1052
1053 // when control is down we allow scene pan and rotation even when clicking
1054 // over some object
1055 bool control_down = mouse_event.CmdDown();
1056 bool grabber_contains_mouse = (get_hover_id() != -1);
1057
1058 const Selection &selection = m_parent.get_selection();
1059 int selected_object_idx = selection.get_object_idx();
1060 if (mouse_event.LeftDown()) {
1061 if ((!control_down || grabber_contains_mouse) &&
1062 gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false))
1063 // the gizmo got the event and took some action, there is no need
1064 // to do anything more
1065 return true;
1066 } else if (mouse_event.RightDown()){
1067 if (!control_down && selected_object_idx != -1 &&
1068 gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false))
1069 // event was taken care of
1070 return true;
1071 } else if (mouse_event.Dragging()) {
1072 if (m_parent.get_move_volume_id() != -1)
1073 // don't allow dragging objects with the Sla gizmo on
1074 return true;
1075 if (!control_down && gizmo_event(SLAGizmoEventType::Dragging,
1076 mouse_pos, mouse_event.ShiftDown(),
1077 mouse_event.AltDown(), false)) {
1078 // the gizmo got the event and took some action, no need to do
1079 // anything more here
1080 m_parent.set_as_dirty();
1081 return true;
1082 }
1083 if(control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown()))
1084 {
1085 // CTRL has been pressed while already dragging -> stop current action
1086 if (mouse_event.LeftIsDown())
1087 gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
1088 else if (mouse_event.RightIsDown())
1089 gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
1090 return false;
1091 }
1092 } else if (mouse_event.LeftUp()) {
1093 if (!m_parent.is_mouse_dragging()) {
1094 // in case SLA/FDM gizmo is selected, we just pass the LeftUp
1095 // event and stop processing - neither object moving or selecting
1096 // is suppressed in that case
1097 gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down);
1098 return true;
1099 }
1100 } else if (mouse_event.RightUp()) {
1101 if (!m_parent.is_mouse_dragging()) {
1102 gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down);
1103 return true;
1104 }
1105 }
1106 return false;
1107}
int get_hover_id() const
Definition GLGizmoBase.hpp:206
virtual bool gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_position, bool shift_down, bool alt_down, bool control_down)
Definition GLGizmoPainterBase.cpp:726
Eigen::Matrix< int32_t, 2, 1, Eigen::DontAlign > Vec2i32
Definition Point.hpp:57

References Slic3r::GUI::Dragging, Slic3r::GUI::GLGizmoBase::get_hover_id(), Slic3r::GUI::Selection::get_object_idx(), gizmo_event(), Left, Slic3r::GUI::LeftDown, Slic3r::GUI::LeftUp, m_button_down, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::GUI::Moving, None, Slic3r::GUI::RightDown, Slic3r::GUI::RightUp, and Slic3r::GUI::wxMouseEvent.

Referenced by Slic3r::GUI::GLGizmoTextureDisplacement::on_mouse().

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

◆ on_number_key_down()

bool Slic3r::GUI::GLGizmoMmuSegmentation::on_number_key_down ( int number)
233{
234 int extruder_idx = number - 1;
235 if (extruder_idx < m_extruders_colors.size() && extruder_idx >= 0)
236 m_selected_extruder_idx = extruder_idx;
237
238 return true;
239}

References m_extruders_colors, and m_selected_extruder_idx.

Referenced by Slic3r::GUI::GLGizmosManager::on_key(), and Slic3r::GUI::GLGizmosManager::on_set_color_timer().

Here is the caller graph for this function:

◆ on_opening()

void Slic3r::GUI::GLGizmoMmuSegmentation::on_opening ( )
overrideprivatevirtual

Implements Slic3r::GUI::GLGizmoPainterBase.

68{
69 if (wxGetApp().filaments_cnt() > int(GLGizmoMmuSegmentation::EXTRUDERS_LIMIT))
71}

References EXTRUDERS_LIMIT, and Slic3r::GUI::show_notification_extruders_limit_exceeded().

Here is the call graph for this function:

◆ on_register_raycasters_for_picking()

virtual void Slic3r::GUI::GLGizmoBase::on_register_raycasters_for_picking ( )
inlineprotectedvirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoBrimEars, Slic3r::GUI::GLGizmoCut3D, Slic3r::GUI::GLGizmoEmboss, Slic3r::GUI::GLGizmoFlatten, Slic3r::GUI::GLGizmoMove3D, Slic3r::GUI::GLGizmoRotate3D, Slic3r::GUI::GLGizmoScale3D, and Slic3r::GUI::GLGizmoSVG.

267{}

Referenced by register_raycasters_for_picking().

Here is the caller graph for this function:

◆ on_render()

void Slic3r::GUI::GLGizmoPainterBase::on_render ( )
inlineoverrideprivatevirtualinherited

Implements Slic3r::GUI::GLGizmoBase.

201{}

◆ on_render_input_window()

void Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window ( float x,
float y,
float bottom_limit )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

383{
384 if (!m_c->selection_info()->model_object()) return;
385
386 float scale = m_parent.get_scale();
387 #ifdef WIN32
388 int dpi = get_dpi_for_window(wxGetApp().GetTopWindow());
389 scale *= (float) dpi / (float) DPI_DEFAULT;
390 #endif // WIN32
391
392 const float approx_height = m_imgui->scaled(22.0f);
393 y = std::min(y, bottom_limit - approx_height);
394 GizmoImguiSetNextWIndowPos(x, y, ImGuiCond_Always);
395
396 wchar_t old_tool = m_current_tool;
397
398 // BBS
400 float f_scale = m_parent.get_gizmos_manager().get_layout_scale();
401 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 4.0f * f_scale));
402
403 GizmoImguiBegin(get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar);
404
405 // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that:
406 const float space_size = m_imgui->get_style_scaling() * 8;
407 const float cursor_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.5f);
408 const float smart_fill_slider_left = m_imgui->calc_text_size(m_desc.at("smart_fill_angle")).x + m_imgui->scaled(1.5f);
409 const float edge_detect_slider_left = m_imgui->calc_text_size(m_desc.at("edge_detection")).x + m_imgui->scaled(1.f);
410 const float gap_area_slider_left = m_imgui->calc_text_size(m_desc.at("gap_area")).x + m_imgui->scaled(1.5f) + space_size;
411 const float height_range_slider_left = m_imgui->calc_text_size(m_desc.at("height_range")).x + m_imgui->scaled(2.f);
412
413 const float filter_btn_width = m_imgui->calc_text_size(m_desc.at("perform")).x + m_imgui->scaled(1.f);
414 const float remap_btn_width = m_imgui->calc_text_size(m_desc.at("perform_remap")).x + m_imgui->scaled(1.f);
415 const float buttons_width = filter_btn_width + remap_btn_width + m_imgui->scaled(2.f);
416 const float minimal_slider_width = m_imgui->scaled(4.f);
417 const float color_button_width = m_imgui->calc_text_size(std::string_view{""}).x + m_imgui->scaled(1.75f);
418
419 float caption_max = 0.f;
420 float total_text_max = 0.f;
421 for (const auto &t : std::array<std::string, 5>{"paint", "erase", "cursor_size", "smart_fill_angle", "height_range"}) {
422 caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc[t + "_caption"]).x);
423 total_text_max = std::max(total_text_max, m_imgui->calc_text_size(m_desc[t]).x);
424 }
425 total_text_max += caption_max + m_imgui->scaled(1.f);
426 caption_max += m_imgui->scaled(1.f);
427
428 const float sliders_left_width = std::max(smart_fill_slider_left,
429 std::max(cursor_slider_left, std::max(edge_detect_slider_left, std::max(gap_area_slider_left, height_range_slider_left)))) + space_size;
430 const float slider_icon_width = m_imgui->get_slider_icon_size().x;
431 float window_width = minimal_slider_width + sliders_left_width + slider_icon_width;
432 const int max_filament_items_per_line = 8;
433 const float empty_button_width = m_imgui->calc_button_size("").x;
434 const float filament_item_width = empty_button_width + m_imgui->scaled(1.5f);
435
436 window_width = std::max(window_width, total_text_max);
437 window_width = std::max(window_width, buttons_width);
438 window_width = std::max(window_width, max_filament_items_per_line * filament_item_width + +m_imgui->scaled(0.5f));
439
440 const float sliders_width = m_imgui->scaled(7.0f);
441 const float drag_left_width = ImGui::GetStyle().WindowPadding.x + sliders_width - space_size;
442
443 const float max_tooltip_width = ImGui::GetFontSize() * 20.0f;
444
445 m_imgui->text(m_desc.at("filaments"));
446
447 size_t n_extruder_colors = std::min((size_t)EnforcerBlockerType::ExtruderMax, m_extruders_colors.size());
448 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(7.f * scale, 7.f * scale));
449 ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0); // removes extra space on tree node indentation
450 for (int extruder_idx = 0; extruder_idx < n_extruder_colors; extruder_idx++) {
451
452 if (extruder_idx % max_filament_items_per_line != 0)
453 ImGui::SameLine();
454
456 extruder_idx + 1, // idx
457 "###extruder_color_", // button_id
458 m_extruders_colors[extruder_idx], // color
459 m_extruders_colors[extruder_idx], // mapped_color (not used in here)
460 m_selected_extruder_idx == extruder_idx, // is_active
461 scale
462 )){
463 m_selected_extruder_idx = extruder_idx;
464 }
465
466 if (extruder_idx < int(GLGizmoMmuSegmentation::EXTRUDERS_LIMIT) && ImGui::IsItemHovered()) m_imgui->tooltip(wxString::Format(_L("Shortcut Key %d"), extruder_idx + 1), max_tooltip_width);
467 }
468 // ORCA: Remap filaments section (Border only, Title in border).
469 // Styled as a panel for visual grouping.
470 if (ImGui::TreeNodeEx(m_desc.at("perform_remap").c_str(), ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_FramePadding)){
471 render_filament_remap_ui(window_width, max_tooltip_width, scale);
472
473 bool has_mapping = false;
474 for (size_t i = 0; i < m_extruder_remap.size(); ++i){
475 if(m_extruder_remap[i] != i){
476 has_mapping = true;
477 break;
478 }
479 }
480
481 ImGui::Dummy(ImVec2(0,0));
482
483 // ORCA: Add Remap and Cancel buttons (outside the panel)
484 m_imgui->disabled_begin(!has_mapping); // disable when no mapping
485 if (m_imgui->button(m_desc.at("remap"))) {
487 // Reset mapping to identity after apply
488 for (size_t i = 0; i < m_extruder_remap.size(); ++i) m_extruder_remap[i] = i;
489 }
490 m_imgui->disabled_end(/*m_is_unknown_font*/);
491
492 if (has_mapping){ // show only when it has mapping
493 ImGui::SameLine();
494 if (m_imgui->button(m_desc.at("remap_reset"))) {
495 // Reset mapping to identity
496 for (size_t i = 0; i < m_extruder_remap.size(); ++i) m_extruder_remap[i] = i;
497 }
498 }
499
500 //ImGui::Dummy(ImVec2(0.0f, 3.f * scale));
501 ImGui::TreePop();
502 }
503 ImGui::PopStyleVar(2); // IndentSpacing ItemSpacing
504
505 ImGui::Dummy(ImVec2(0.0f, ImGui::GetFontSize() * 0.1));
506
507 m_imgui->text(m_desc.at("tool_type"));
508
509 std::array<wchar_t, 6> tool_ids;
510 tool_ids = { ImGui::CircleButtonIcon, ImGui::SphereButtonIcon, ImGui::TriangleButtonIcon, ImGui::HeightRangeIcon, ImGui::FillButtonIcon, ImGui::GapFillIcon };
511 std::array<wchar_t, 6> icons;
512 if (m_is_dark_mode)
513 icons = { ImGui::CircleButtonDarkIcon, ImGui::SphereButtonDarkIcon, ImGui::TriangleButtonDarkIcon, ImGui::HeightRangeDarkIcon, ImGui::FillButtonDarkIcon, ImGui::GapFillDarkIcon };
514 else
515 icons = { ImGui::CircleButtonIcon, ImGui::SphereButtonIcon, ImGui::TriangleButtonIcon, ImGui::HeightRangeIcon, ImGui::FillButtonIcon, ImGui::GapFillIcon };
516 std::array<wxString, 6> tool_tips = { _L("Circle"), _L("Sphere"), _L("Triangle"), _L("Height Range"), _L("Fill"), _L("Gap Fill") };
517 for (int i = 0; i < tool_ids.size(); i++) {
518 //std::string str_label = std::string("");
519 //std::wstring btn_name = icons[i] + boost::nowide::widen(str_label);
520
521 if (i != 0) ImGui::SameLine((empty_button_width + m_imgui->scaled(1.75f)) * i + m_imgui->scaled(1.5f));
522
523 bool is_active = m_current_tool == tool_ids[i];
524 ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.f);
525 ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 3.f * scale);
526 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(4.f * scale, 4.f * scale));
527 ImGui::PushStyleColor(ImGuiCol_Text , ImVec4(1,1,1,1)); // ORCA Fixes icon rendered without colors while using Light theme
528 ImGui::PushStyleColor(ImGuiCol_Button , is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(0,0,0,0)); // ORCA
529 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, is_active ? ImVec4(0.f, .59f, .53f, .25f) : ImVec4(.6f,.6f,.6f,.2f)); // ORCA
530 ImGui::PushStyleColor(ImGuiCol_ButtonActive , is_active ? ImVec4(0.f, .59f, .53f, .30f) : ImVec4(0,0,0,0)); // ORCA
531 ImGui::PushStyleColor(ImGuiCol_Border , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA
532 ImGui::PushStyleColor(ImGuiCol_BorderActive , is_active ? ImGuiWrapper::COL_ORCA : ImVec4(0,0,0,0)); // ORCA matched color for fixing flicker on click
533 bool btn_clicked = m_imgui->glyph_button(icons[i], ImVec2(16.f * scale, 16.f * scale)); // ORCA glyph_button for fixing unequal paddings
534 ImGui::PopStyleColor(6);
535 ImGui::PopStyleVar(3);
536
537 if (btn_clicked && m_current_tool != tool_ids[i]) {
538 m_current_tool = tool_ids[i];
539 for (auto &triangle_selector : m_triangle_selectors) {
540 triangle_selector->seed_fill_unselect_all_triangles();
541 triangle_selector->request_update_render_data();
542 }
543 }
544
545 if (ImGui::IsItemHovered()) {
546 m_imgui->tooltip(tool_tips[i], max_tooltip_width);
547 }
548 }
549
550 ImGui::Dummy(ImVec2(0.0f, ImGui::GetFontSize() * 0.1));
551
552 if (m_current_tool != old_tool)
553 this->tool_changed(old_tool, m_current_tool);
554
555 if (m_current_tool == ImGui::CircleButtonIcon || m_current_tool == ImGui::SphereButtonIcon) {
556 if (m_current_tool == ImGui::CircleButtonIcon)
558 else
561
562 ImGui::AlignTextToFramePadding();
563 m_imgui->text(m_desc.at("cursor_size"));
564 ImGui::SameLine(sliders_left_width);
565 ImGui::PushItemWidth(sliders_width);
566 m_imgui->bbl_slider_float_style("##cursor_radius", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f", 1.0f, true);
567 ImGui::SameLine(drag_left_width + sliders_left_width);
568 ImGui::PushItemWidth(1.5 * slider_icon_width);
569 ImGui::BBLDragFloat("##cursor_radius_input", &m_cursor_radius, 0.05f, 0.0f, 0.0f, "%.2f");
570
571 if (m_imgui->bbl_checkbox(_L("Vertical"), m_vertical_only)) {
572 if (m_vertical_only) {
573 m_horizontal_only = false;
574 }
575 }
576 if (m_imgui->bbl_checkbox(_L("Horizontal"), m_horizontal_only)) {
577 if (m_horizontal_only) {
578 m_vertical_only = false;
579 }
580 }
581 }
582 else if (m_current_tool == ImGui::TriangleButtonIcon) {
585
586 if (m_imgui->bbl_checkbox(_L("Vertical"), m_vertical_only)) {
587 if (m_vertical_only) {
588 m_horizontal_only = false;
589 }
590 }
591 if (m_imgui->bbl_checkbox(_L("Horizontal"), m_horizontal_only)) {
592 if (m_horizontal_only) {
593 m_vertical_only = false;
594 }
595 }
596 }
597 else if (m_current_tool == ImGui::FillButtonIcon) {
600
602 ImGui::AlignTextToFramePadding();
603 m_imgui->text(m_desc["smart_fill_angle"]);
604 std::string format_str = std::string("%.f") + I18N::translate_utf8("°", "Face angle threshold,"
605 "placed after the number with no whitespace in between.");
606 ImGui::SameLine(sliders_left_width);
607 ImGui::PushItemWidth(sliders_width);
608 if (m_imgui->bbl_slider_float_style("##smart_fill_angle", &m_smart_fill_angle, SmartFillAngleMin, SmartFillAngleMax, format_str.data(), 1.0f, true))
609 for (auto &triangle_selector : m_triangle_selectors) {
610 triangle_selector->seed_fill_unselect_all_triangles();
611 triangle_selector->request_update_render_data();
612 }
613 ImGui::SameLine(drag_left_width + sliders_left_width);
614 ImGui::PushItemWidth(1.5 * slider_icon_width);
615 ImGui::BBLDragFloat("##smart_fill_angle_input", &m_smart_fill_angle, 0.05f, 0.0f, 0.0f, "%.2f");
616 } else {
617 // set to negative value to disable edge detection
618 m_smart_fill_angle = -1.f;
619 }
620
621 m_imgui->bbl_checkbox(m_desc["edge_detection"], m_detect_geometry_edge);
622 }
623 else if (m_current_tool == ImGui::HeightRangeIcon) {
626 ImGui::AlignTextToFramePadding();
627 m_imgui->text(m_desc["height_range"] + ":");
628 ImGui::SameLine(sliders_left_width);
629 ImGui::PushItemWidth(sliders_width);
630 std::string format_str = std::string("%.2f") + I18N::translate_utf8("mm", "Height range," "Facet in [cursor z, cursor z + height] will be selected.");
631 m_imgui->bbl_slider_float_style("##cursor_height", &m_cursor_height, CursorHeightMin, CursorHeightMax, format_str.data(), 1.0f, true);
632 ImGui::SameLine(drag_left_width + sliders_left_width);
633 ImGui::PushItemWidth(1.5 * slider_icon_width);
634 ImGui::BBLDragFloat("##cursor_height_input", &m_cursor_height, 0.05f, 0.0f, 0.0f, "%.2f");
635 }
636 else if (m_current_tool == ImGui::GapFillIcon) {
639 ImGui::AlignTextToFramePadding();
640 m_imgui->text(m_desc["gap_area"] + ":");
641 ImGui::SameLine(sliders_left_width);
642 ImGui::PushItemWidth(sliders_width);
643 std::string format_str = std::string("%.2f") + I18N::translate_utf8("", "Triangle patch area threshold,""triangle patch will be merged to neighbor if its area is less than threshold");
644 m_imgui->bbl_slider_float_style("##gap_area", &TriangleSelectorPatch::gap_area, TriangleSelectorPatch::GapAreaMin, TriangleSelectorPatch::GapAreaMax, format_str.data(), 1.0f, true);
645 ImGui::SameLine(drag_left_width + sliders_left_width);
646 ImGui::PushItemWidth(1.5 * slider_icon_width);
647 ImGui::BBLDragFloat("##gap_area_input", &TriangleSelectorPatch::gap_area, 0.05f, 0.0f, 0.0f, "%.2f");
648
649 // Apply Gap fill button
650 if (m_imgui->button(m_desc.at("perform"))) {
651 Plater::TakeSnapshot snapshot(wxGetApp().plater(), "Gap fill", UndoRedo::SnapshotType::GizmoAction);
652
653 for (int i = 0; i < m_triangle_selectors.size(); i++) {
654 TriangleSelectorPatch* ts_mm = dynamic_cast<TriangleSelectorPatch*>(m_triangle_selectors[i].get());
655 ts_mm->update_selector_triangles();
656 ts_mm->request_update_render_data(true);
657 }
659 m_parent.set_as_dirty();
660 }
661 }
662
663 ImGui::Separator();
664
666
667 ImGui::SameLine();
668 m_imgui->disabled_begin(m_c->selection_info()->model_object()->is_mm_painted() == false);
669 if (m_imgui->button(m_desc.at("remove_all"))) {
670 Plater::TakeSnapshot snapshot(wxGetApp().plater(), "Reset selection", UndoRedo::SnapshotType::GizmoAction);
671 ModelObject * mo = m_c->selection_info()->model_object();
672 int idx = -1;
673 for (ModelVolume *mv : mo->volumes)
674 if (mv->is_model_part()) {
675 ++idx;
676 m_triangle_selectors[idx]->reset();
677 m_triangle_selectors[idx]->request_update_render_data(true);
678 }
679
681 m_parent.set_as_dirty();
682 }
683 m_imgui->disabled_end();
684
685 ImGui::SameLine();
687 if (m_imgui->button(_L("Done"))) {
688 m_parent.reset_all_gizmos();
689 }
690
691 ImGui::PopStyleVar(1); // ImGuiStyleVar_FramePadding
693
694 // BBS
696}
std::string get_name(bool include_shortcut=true) const
Definition GLGizmoBase.cpp:544
void GizmoImguiEnd()
Definition GLGizmoBase.cpp:372
bool GizmoImguiBegin(const std::string &name, int flags)
Definition GLGizmoBase.cpp:367
void tool_changed(wchar_t old_tool, wchar_t new_tool)
Definition GLGizmoMmuSegmentation.cpp:794
void update_model_object() override
Definition GLGizmoMmuSegmentation.cpp:699
bool draw_color_button(int idx, const char *id_str, const ColorRGBA &color, ColorRGBA &map_color, bool active, float scale)
Definition GLGizmoMmuSegmentation.cpp:326
bool m_detect_geometry_edge
Definition GLGizmoMmuSegmentation.hpp:126
void remap_filament_assignments()
Definition GLGizmoMmuSegmentation.cpp:1097
void render_filament_remap_ui(float window_width, float max_tooltip_width, float scale)
Definition GLGizmoMmuSegmentation.cpp:1006
void render_tooltip_button(float x, float y)
Definition GLGizmoMmuSegmentation.cpp:307
static void push_toolbar_style(const float scale)
Definition ImGuiWrapper.cpp:2705
static void pop_toolbar_style()
Definition ImGuiWrapper.cpp:2757
static constexpr float GapAreaMax
Definition GLGizmoPainterBase.hpp:132
void begin_right_aligned_buttons(const std::vector< wxString > &labels)
Definition GLGizmoUtils.cpp:135
std::string translate_utf8(const char *s)
Definition I18N.hpp:59
int get_dpi_for_window(const wxWindow *window)
Definition GUI_Utils.cpp:234
@ DPI_DEFAULT
Definition GUI_Utils.hpp:92
bool is_active(id view)
Definition MacIME.mm:26

References _L, Slic3r::GUI::GLGizmoUtils::begin_right_aligned_buttons(), Slic3r::GUI::GLGizmoPainterBase::BRUSH, Slic3r::GUI::GLGizmoPainterBase::BUCKET_FILL, Slic3r::TriangleSelector::CIRCLE, Slic3r::GUI::ImGuiWrapper::COL_ORCA, Slic3r::GUI::GLGizmoPainterBase::CursorHeightMax, Slic3r::GUI::GLGizmoPainterBase::CursorHeightMin, Slic3r::GUI::GLGizmoPainterBase::CursorRadiusMax, CursorRadiusMin, Slic3r::GUI::DPI_DEFAULT, draw_color_button(), Slic3r::ExtruderMax, EXTRUDERS_LIMIT, Slic3r::GUI::TriangleSelectorPatch::gap_area, Slic3r::GUI::GLGizmoPainterBase::GAP_FILL, Slic3r::GUI::TriangleSelectorPatch::GapAreaMax, Slic3r::GUI::TriangleSelectorPatch::GapAreaMin, Slic3r::GUI::get_dpi_for_window(), Slic3r::GUI::GLGizmoBase::get_name(), Slic3r::UndoRedo::GizmoAction, Slic3r::GUI::GLGizmoBase::GizmoImguiBegin(), Slic3r::GUI::GLGizmoBase::GizmoImguiEnd(), Slic3r::GUI::GLGizmoBase::GizmoImguiSetNextWIndowPos(), Slic3r::TriangleSelector::HEIGHT_RANGE, Slic3r::ModelVolume::is_model_part(), Slic3r::GUI::GLGizmoBase::m_c, m_current_tool, Slic3r::GUI::GLGizmoPainterBase::m_cursor_height, Slic3r::GUI::GLGizmoPainterBase::m_cursor_radius, Slic3r::GUI::GLGizmoPainterBase::m_cursor_type, m_desc, m_detect_geometry_edge, m_extruder_remap, m_extruders_colors, Slic3r::GUI::GLGizmoPainterBase::m_horizontal_only, Slic3r::GUI::GLGizmoBase::m_imgui, Slic3r::GUI::GLGizmoBase::m_is_dark_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_selected_extruder_idx, Slic3r::GUI::GLGizmoPainterBase::m_smart_fill_angle, Slic3r::GUI::GLGizmoPainterBase::m_tool_type, Slic3r::GUI::GLGizmoPainterBase::m_triangle_selectors, Slic3r::GUI::GLGizmoPainterBase::m_vertical_only, Slic3r::GUI::plater(), Slic3r::TriangleSelector::POINTER, Slic3r::GUI::ImGuiWrapper::pop_toolbar_style(), Slic3r::GUI::ImGuiWrapper::push_toolbar_style(), remap_filament_assignments(), render_filament_remap_ui(), render_tooltip_button(), Slic3r::GUI::TriangleSelectorGUI::request_update_render_data(), scale(), Slic3r::GUI::GLGizmoPainterBase::SmartFillAngleMax, Slic3r::GUI::GLGizmoPainterBase::SmartFillAngleMin, Slic3r::TriangleSelector::SPHERE, tool_changed(), Slic3r::GUI::I18N::translate_utf8(), update_model_object(), Slic3r::GUI::TriangleSelectorPatch::update_selector_triangles(), and Slic3r::ModelObject::volumes.

Here is the call graph for this function:

◆ on_save()

void Slic3r::GUI::GLGizmoPainterBase::on_save ( cereal::BinaryOutputArchive & ar) const
inlineoverrideprotectedvirtualinherited

Reimplemented from Slic3r::GUI::GLGizmoBase.

404{}

◆ on_set_hover_id()

virtual void Slic3r::GUI::GLGizmoBase::on_set_hover_id ( )
inlineprotectedvirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoBrimEars, Slic3r::GUI::GLGizmoCut3D, Slic3r::GUI::GLGizmoEmboss, Slic3r::GUI::GLGizmoRotate3D, and Slic3r::GUI::GLGizmoSVG.

245{}

Referenced by set_hover_id().

Here is the caller graph for this function:

◆ on_set_state()

void Slic3r::GUI::GLGizmoMmuSegmentation::on_set_state ( )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

821{
823
824 if (get_state() == Off) {
825 ModelObject* mo = m_c->selection_info()->model_object();
826 if (mo) Slic3r::save_object_mesh(*mo);
827 m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE));
828 if (m_current_tool == ImGui::GapFillIcon) {//exit gap fill
829 m_current_tool = ImGui::CircleButtonIcon;
830 }
831 }
832}
EState get_state() const
Definition GLGizmoBase.hpp:175
void on_set_state() override
Definition GLGizmoPainterBase.cpp:1194
void save_object_mesh(ModelObject &object)
Definition bbs_3mf.cpp:9754

References Slic3r::GUI::GLGizmoBase::get_state(), Slic3r::GUI::GLGizmoBase::m_c, m_current_tool, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::GUI::GLGizmoBase::Off, Slic3r::GUI::GLGizmoPainterBase::on_set_state(), and Slic3r::save_object_mesh().

Here is the call graph for this function:

◆ on_shutdown()

void Slic3r::GUI::GLGizmoMmuSegmentation::on_shutdown ( )
overrideprivatevirtual

Implements Slic3r::GUI::GLGizmoPainterBase.

74{
75 m_parent.use_slope(false);
76 m_parent.toggle_model_objects_visibility(true);
77}

References Slic3r::GUI::GLGizmoBase::m_parent.

◆ on_start_dragging()

virtual void Slic3r::GUI::GLGizmoBase::on_start_dragging ( )
inlineprotectedvirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoBrimEars, Slic3r::GUI::GLGizmoCut3D, Slic3r::GUI::GLGizmoEmboss, Slic3r::GUI::GLGizmoMove3D, Slic3r::GUI::GLGizmoRotate3D, Slic3r::GUI::GLGizmoRotate, Slic3r::GUI::GLGizmoScale3D, and Slic3r::GUI::GLGizmoSVG.

253{}

Referenced by use_grabbers().

Here is the caller graph for this function:

◆ on_stop_dragging()

virtual void Slic3r::GUI::GLGizmoBase::on_stop_dragging ( )
inlineprotectedvirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoBrimEars, Slic3r::GUI::GLGizmoCut3D, Slic3r::GUI::GLGizmoEmboss, Slic3r::GUI::GLGizmoMove3D, Slic3r::GUI::GLGizmoRotate3D, Slic3r::GUI::GLGizmoScale3D, and Slic3r::GUI::GLGizmoSVG.

254{}

Referenced by do_stop_dragging(), and Slic3r::GUI::GLGizmoRotate::stop_dragging().

Here is the caller graph for this function:

◆ on_tool_shortcut()

bool Slic3r::GUI::GLGizmoMmuSegmentation::on_tool_shortcut ( Shortcut shortcut)
overridevirtual

Reimplemented from Slic3r::GUI::GLGizmoPainterBase.

242{
243 switch (shortcut) {
244 case Shortcut::PaintToolFill: m_current_tool = ImGui::FillButtonIcon; break;
245 case Shortcut::PaintToolTriangle: m_current_tool = ImGui::TriangleButtonIcon; break;
246 case Shortcut::PaintToolSphere: m_current_tool = ImGui::SphereButtonIcon; break;
247 case Shortcut::PaintToolCircle: m_current_tool = ImGui::CircleButtonIcon; break;
248 case Shortcut::PaintToolHeightRange: m_current_tool = ImGui::HeightRangeIcon; break;
249 case Shortcut::PaintToolGapFill: m_current_tool = ImGui::GapFillIcon; break;
250 default: return false;
251 }
252 return true;
253}
std::optional< Shortcut > shortcut() const
Definition GLGizmoBase.hpp:178
@ PaintToolCircle
Definition Shortcuts.hpp:45
@ PaintToolGapFill
Definition Shortcuts.hpp:45
@ PaintToolFill
Definition Shortcuts.hpp:45
@ PaintToolSphere
Definition Shortcuts.hpp:45
@ PaintToolHeightRange
Definition Shortcuts.hpp:45
@ PaintToolTriangle
Definition Shortcuts.hpp:45

References m_current_tool, Slic3r::GUI::PaintToolCircle, Slic3r::GUI::PaintToolFill, Slic3r::GUI::PaintToolGapFill, Slic3r::GUI::PaintToolHeightRange, Slic3r::GUI::PaintToolSphere, Slic3r::GUI::PaintToolTriangle, and Slic3r::GUI::GLGizmoBase::shortcut().

Here is the call graph for this function:

◆ on_unregister_raycasters_for_picking()

virtual void Slic3r::GUI::GLGizmoBase::on_unregister_raycasters_for_picking ( )
inlineprotectedvirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoBrimEars, Slic3r::GUI::GLGizmoCut3D, Slic3r::GUI::GLGizmoEmboss, Slic3r::GUI::GLGizmoFlatten, Slic3r::GUI::GLGizmoMove3D, Slic3r::GUI::GLGizmoRotate3D, Slic3r::GUI::GLGizmoScale3D, and Slic3r::GUI::GLGizmoSVG.

268{}

Referenced by unregister_raycasters_for_picking().

Here is the caller graph for this function:

◆ register_grabbers_for_picking()

void Slic3r::GUI::GLGizmoBase::register_grabbers_for_picking ( )
protectedinherited
399{
400 for (size_t i = 0; i < m_grabbers.size(); ++i) {
401 m_grabbers[i].register_raycasters_for_picking((m_group_id >= 0) ? m_group_id : i);
402 }
403}
int m_group_id
Definition GLGizmoBase.hpp:145

References m_grabbers, and m_group_id.

Referenced by register_raycasters_for_picking().

Here is the caller graph for this function:

◆ register_raycasters_for_picking()

void Slic3r::GUI::GLGizmoBase::register_raycasters_for_picking ( )
inlineinherited
void register_grabbers_for_picking()
Definition GLGizmoBase.cpp:398
virtual void on_register_raycasters_for_picking()
Definition GLGizmoBase.hpp:267

References on_register_raycasters_for_picking(), and register_grabbers_for_picking().

Referenced by Slic3r::GUI::GLGizmosManager::activate_gizmo(), and Slic3r::GUI::GLCanvas3D::reload_scene().

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

◆ remap_filament_assignments()

void Slic3r::GUI::GLGizmoMmuSegmentation::remap_filament_assignments ( )
private
1098{
1099 if (m_extruder_remap.empty())
1100 return;
1101
1102 constexpr size_t MAX_EBT = (size_t)EnforcerBlockerType::ExtruderMax;
1103 EnforcerBlockerStateMap state_map;
1104
1105 // identity mapping by default
1106 for (size_t i = 0; i <= MAX_EBT; ++i)
1107 state_map[i] = static_cast<EnforcerBlockerType>(i);
1108
1109 size_t n_extr = std::min(m_extruder_remap.size(), MAX_EBT);
1110 const int start_extruder = (int) EnforcerBlockerType::Extruder1;
1111 bool any_change = false;
1112 for (size_t src = 0; src < n_extr; ++src) {
1113 size_t dst = m_extruder_remap[src];
1114 if (dst != src) {
1115 state_map[src+start_extruder] = static_cast<EnforcerBlockerType>(dst+start_extruder);
1116 any_change = true;
1117 }
1118 }
1119 if (!any_change)
1120 return;
1121
1122 Plater::TakeSnapshot snapshot(wxGetApp().plater(),
1123 "Remap filament assignments",
1125
1126 bool updated = false;
1127 int idx = -1;
1128 ModelObject* mo = m_c->selection_info()->model_object();
1129 if (!mo) return;
1130
1131 bool volume_extruder_changed = false;
1132
1133 for (ModelVolume* mv : mo->volumes) {
1134 if (!mv->is_model_part()) continue;
1135 ++idx;
1136 TriangleSelectorGUI* ts = m_triangle_selectors[idx].get();
1137 if (!ts) continue;
1138
1139 // Remap painted triangles
1140 ts->remap_triangle_state(state_map);
1141 ts->request_update_render_data(true);
1142
1143 // ORCA: Remap base volume extruder as well if selected
1144 int current_ext_id = mv->extruder_id();
1145 int current_idx = (current_ext_id > 0) ? current_ext_id - 1 : 0;
1146
1147 if (current_idx >= 0 && current_idx < m_extruder_remap.size()) {
1148 size_t dest_idx = m_extruder_remap[current_idx];
1149 if (dest_idx != current_idx) {
1150 // Check if volume has its own extruder config or uses object's fallback
1151 const ConfigOption *vol_opt = mv->config.option("extruder");
1152 if (vol_opt != nullptr && vol_opt->getInt() != 0) {
1153 // Volume has its own extruder setting, update it
1154 mv->config.set("extruder", (int)dest_idx + 1);
1155 } else {
1156 // Volume uses object's extruder setting, update the object
1157 mo->config.set("extruder", (int)dest_idx + 1);
1158 }
1159 if (idx < m_volumes_extruder_idxs.size())
1160 m_volumes_extruder_idxs[idx] = (int)dest_idx + 1;
1161 volume_extruder_changed = true;
1162 }
1163 }
1164
1165 updated = true;
1166 }
1167
1168 if (updated) {
1169 // ORCA: Update renderer colors if base volume extruder changed
1170 if (volume_extruder_changed) {
1172 // ORCA: Update GUI_ObjectList extruder column to reflect the new extruder value
1173 wxGetApp().obj_list()->update_objects_list_filament_column(wxGetApp().filaments_cnt());
1174 }
1175
1176 // ORCA: Removed "Filament remapping finished" notification to reduce UI noise.
1178 m_parent.set_as_dirty();
1179
1180 // ORCA: Refresh used filaments cache
1181 this->update_used_filaments();
1182 }
1183}
void update_used_filaments()
Definition GLGizmoMmuSegmentation.cpp:978
std::array< EnforcerBlockerType,(size_t) EnforcerBlockerType::ExtruderMax+1 > EnforcerBlockerStateMap
Definition TriangleSelector.hpp:70
@ Extruder1
Definition TriangleSelector.hpp:34

References Slic3r::ModelObject::config, Slic3r::ModelVolume::config, Slic3r::Extruder1, Slic3r::ModelVolume::extruder_id(), Slic3r::ExtruderMax, Slic3r::ConfigOption::getInt(), Slic3r::UndoRedo::GizmoAction, Slic3r::ModelVolume::is_model_part(), Slic3r::GUI::GLGizmoBase::m_c, m_extruder_remap, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::GUI::GLGizmoPainterBase::m_triangle_selectors, m_volumes_extruder_idxs, Slic3r::ModelConfig::option(), Slic3r::GUI::plater(), Slic3r::TriangleSelector::remap_triangle_state(), Slic3r::GUI::TriangleSelectorGUI::request_update_render_data(), Slic3r::ModelConfig::set(), update_model_object(), update_triangle_selectors_colors(), update_used_filaments(), and Slic3r::ModelObject::volumes.

Referenced by on_render_input_window().

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

◆ render()

void Slic3r::GUI::GLGizmoBase::render ( )
inlineinherited
214{ on_render(); }
virtual void on_render()=0

References on_render().

Here is the call graph for this function:

◆ render_combo()

bool Slic3r::GUI::GLGizmoBase::render_combo ( const std::string & label,
const std::vector< std::string > & lines,
int & selection_idx,
float label_width,
float item_width )
protectedinherited
227{
229 ImGui::AlignTextToFramePadding();
230 m_imgui->text(label);
231 ImGui::SameLine(label_width);
232 ImGui::PushItemWidth(item_width);
233
234 size_t selection_out = selection_idx;
235
236 const char *selected_str = (selection_idx >= 0 && selection_idx < int(lines.size())) ? lines[selection_idx].c_str() : "";
237 if (ImGui::BBLBeginCombo(("##" + label).c_str(), selected_str, 0)) {
238 for (size_t line_idx = 0; line_idx < lines.size(); ++line_idx) {
239 ImGui::PushID(int(line_idx));
240 if (ImGui::Selectable("", line_idx == selection_idx)) selection_out = line_idx;
241
242 ImGui::SameLine();
243 ImGui::Text("%s", lines[line_idx].c_str());
244 ImGui::PopID();
245 }
246
247 ImGui::EndCombo();
248 }
249
250 bool is_changed = selection_idx != selection_out;
251 selection_idx = selection_out;
252
253 //if (is_changed) update_connector_shape();
255
256 return is_changed;
257}
static void pop_combo_style()
Definition ImGuiWrapper.cpp:2932
static void push_combo_style(const float scale)
Definition ImGuiWrapper.cpp:2907

References m_imgui, m_parent, Slic3r::GUI::ImGuiWrapper::pop_combo_style(), and Slic3r::GUI::ImGuiWrapper::push_combo_style().

Referenced by Slic3r::GUI::GLGizmoAssembly::render_assembly_mode_combo(), and Slic3r::GUI::GLGizmoCut3D::render_connectors_input_window().

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

◆ render_cross_mark()

void Slic3r::GUI::GLGizmoBase::render_cross_mark ( const Vec3f & target,
bool is_single = false )
protectedinherited
260{
261 const float half_length = 4.0f;
262
263 // ORCA: OpenGL Core Profile
264#if !SLIC3R_OPENGL_ES
265 if (!OpenGLManager::get_gl_info().is_core_profile())
266 glsafe(::glLineWidth(2.0f));
267#endif // !SLIC3R_OPENGL_ES
268
269 auto render_line = [](const Vec3f& p1, const Vec3f& p2, const ColorRGBA& color) {
270 GLModel::Geometry init_data;
272 init_data.color = color;
273 init_data.reserve_vertices(2);
274 init_data.reserve_indices(2);
275
276 // vertices
277 init_data.add_vertex(p1);
278 init_data.add_vertex(p2);
279
280 // indices
281 init_data.add_line(0, 1);
282
283 GLModel model;
284 model.init_from(std::move(init_data));
285 model.render();
286 };
287
288 // draw line for x axis
289 if (!is_single) {
290 render_line(
291 {target(0) - half_length, target(1), target(2)},
292 {target(0) + half_length, target(1), target(2)},
293 ColorRGBA::X()); // ORCA match axis colors
294 }
295 else {
296 render_line(
297 {target(0), target(1), target(2)},
298 {target(0) + half_length, target(1), target(2)},
299 ColorRGBA::X()); // ORCA match axis colors
300 }
301 // draw line for y axis
302 if (!is_single) {
303 render_line(
304 {target(0), target(1) - half_length, target(2)},
305 {target(0), target(1) + half_length, target(2)},
306 ColorRGBA::Y()); // ORCA match axis colors
307 } else {
308 render_line(
309 {target(0), target(1), target(2)},
310 {target(0), target(1) + half_length, target(2)},
311 ColorRGBA::Y()); // ORCA match axis colors
312 }
313 // draw line for z axis
314 if (!is_single) {
315 render_line(
316 {target(0), target(1), target(2) - half_length},
317 {target(0), target(1), target(2) + half_length},
318 ColorRGBA::Z()); // ORCA match axis colors
319 } else {
320 render_line(
321 {target(0), target(1), target(2)},
322 {target(0), target(1), target(2) + half_length},
323 ColorRGBA::Z()); // ORCA match axis colors
324 }
325}
#define glsafe(cmd)
Definition OpenGLUtils.hpp:25
static const ColorRGBA Y()
Definition Color.hpp:146
static const ColorRGBA X()
Definition Color.hpp:145
static const ColorRGBA Z()
Definition Color.hpp:147
static const GLInfo & get_gl_info()
Definition OpenGLManager.hpp:106
#define glLineWidth
Definition gl.h:4215

References Slic3r::GUI::GLModel::Geometry::add_line(), Slic3r::GUI::GLModel::Geometry::add_vertex(), Slic3r::GUI::GLModel::Geometry::color, Slic3r::GUI::GLModel::Geometry::format, Slic3r::GUI::OpenGLManager::get_gl_info(), glLineWidth, glsafe, Slic3r::GUI::GLModel::init_from(), Slic3r::GUI::GLModel::Geometry::Lines, Slic3r::GUI::GLModel::Geometry::P3, Slic3r::GUI::GLModel::render(), Slic3r::GUI::GLModel::Geometry::reserve_indices(), Slic3r::GUI::GLModel::Geometry::reserve_vertices(), Slic3r::ColorRGBA::X(), Slic3r::ColorRGBA::Y(), and Slic3r::ColorRGBA::Z().

Referenced by Slic3r::GUI::GLGizmoMove3D::on_render().

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

◆ render_cursor()

void Slic3r::GUI::GLGizmoPainterBase::render_cursor ( )
protectedinherited
219{
220 // First check that the mouse pointer is on an object.
221 const Camera& camera = wxGetApp().plater()->get_camera();
222
223 // Precalculate transformations of individual meshes.
224 const std::vector<Transform3d> trafo_matrices = mesh_trafo_matrices();
225 // Raycast and return if there's no hit.
226 update_raycast_cache(m_parent.get_local_mouse_position(), camera, trafo_matrices);
227 if (m_rr.mesh_id == -1)
228 return;
229
232 render_cursor_sphere(trafo_matrices[m_rr.mesh_id]);
236 render_cursor_height_range(trafo_matrices[m_rr.mesh_id]);
237 }
238}
void render_cursor_circle()
Definition GLGizmoPainterBase.cpp:240
std::vector< Transform3d > mesh_trafo_matrices() const
Definition GLGizmoPainterBase.cpp:185
void render_cursor_sphere(const Transform3d &trafo) const
Definition GLGizmoPainterBase.cpp:374
void render_cursor_height_range(const Transform3d &trafo) const
Definition GLGizmoPainterBase.cpp:419

References BRUSH, Slic3r::TriangleSelector::CIRCLE, Slic3r::TriangleSelector::HEIGHT_RANGE, m_cursor_type, Slic3r::GUI::GLGizmoBase::m_parent, m_rr, m_tool_type, mesh_trafo_matrices(), render_cursor_circle(), render_cursor_height_range(), render_cursor_sphere(), Slic3r::TriangleSelector::SPHERE, and update_raycast_cache().

Referenced by Slic3r::GUI::GLGizmoFdmSupports::render_painter_gizmo(), Slic3r::GUI::GLGizmoFuzzySkin::render_painter_gizmo(), Slic3r::GUI::GLGizmoMmuSegmentation::render_painter_gizmo(), Slic3r::GUI::GLGizmoSeam::render_painter_gizmo(), and Slic3r::GUI::GLGizmoTextureDisplacement::render_painter_gizmo().

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

◆ render_cursor_circle()

void Slic3r::GUI::GLGizmoPainterBase::render_cursor_circle ( )
protectedinherited
241{
242 const Size cnv_size = m_parent.get_canvas_size();
243 const float cnv_width = float(cnv_size.get_width());
244 const float cnv_height = float(cnv_size.get_height());
245 if (cnv_width == 0.0f || cnv_height == 0.0f)
246 return;
247
248 const float cnv_inv_width = 1.0f / cnv_width;
249 const float cnv_inv_height = 1.0f / cnv_height;
250
251 const Vec2d center = m_parent.get_local_mouse_position();
252 const float zoom = float(wxGetApp().plater()->get_camera().get_zoom());
253 const float radius = m_cursor_radius * float(wxGetApp().plater()->get_camera().get_zoom());
254
255#if !SLIC3R_OPENGL_ES
256 if (!OpenGLManager::get_gl_info().is_core_profile())
257 glsafe(::glLineWidth(1.5f));
258#endif // !SLIC3R_OPENGL_ES
259
261
262#if !SLIC3R_OPENGL_ES
263 if (!OpenGLManager::get_gl_info().is_core_profile()) {
265 glsafe(::glLineStipple(4, 0xAAAA));
267 }
268#endif // !SLIC3R_OPENGL_ES
269
270 if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - radius) > EPSILON) {
271 m_old_cursor_radius = radius;
273 m_circle.reset();
274
275 GLModel::Geometry init_data;
276 unsigned int steps_count = 0;
277#if !SLIC3R_OPENGL_ES
278 if (OpenGLManager::get_gl_info().is_core_profile()) {
279#endif // !SLIC3R_OPENGL_ES
280 steps_count = (unsigned int)(2 * (4 + int(252 * (zoom - 1.0f) / (250.0f - 1.0f))));
282#if !SLIC3R_OPENGL_ES
283 }
284 else {
285 steps_count = 32;
287 }
288#endif // !SLIC3R_OPENGL_ES
289 const float step_size = 2.0f * float(PI) / float(steps_count);
290 init_data.color = { 0.0f, 1.0f, 0.3f, 1.0f };
291 init_data.reserve_vertices(steps_count);
292 init_data.reserve_indices(steps_count);
293
294 // vertices + indices
295 for (unsigned int i = 0; i < steps_count; ++i) {
296#if !SLIC3R_OPENGL_ES
297 if (OpenGLManager::get_gl_info().is_core_profile()) {
298#endif // !SLIC3R_OPENGL_ES
299 if (i % 2 != 0) continue;
300
301 const float angle_i = float(i) * step_size;
302 const unsigned int j = (i + 1) % steps_count;
303 const float angle_j = float(j) * step_size;
304 const Vec2d v_i(::cos(angle_i), ::sin(angle_i));
305 const Vec2d v_j(::cos(angle_j), ::sin(angle_j));
306 init_data.add_vertex(Vec2f(v_i.x(), v_i.y()));
307 init_data.add_vertex(Vec2f(v_j.x(), v_j.y()));
308 const size_t vcount = init_data.vertices_count();
309 init_data.add_line(vcount - 2, vcount - 1);
310#if !SLIC3R_OPENGL_ES
311 }
312 else {
313 const float angle = float(i) * step_size;
314 init_data.add_vertex(Vec2f(2.0f * ((center.x() + ::cos(angle) * radius) * cnv_inv_width - 0.5f),
315 -2.0f * ((center.y() + ::sin(angle) * radius) * cnv_inv_height - 0.5f)));
316 init_data.add_index(i);
317 }
318#endif // !SLIC3R_OPENGL_ES
319 }
320
321 m_circle.init_from(std::move(init_data));
322 }
323
324 // BBS
325 ColorRGBA render_color = this->get_cursor_hover_color();
327 render_color = this->get_cursor_sphere_left_button_color();
328 else if (m_button_down == Button::Right)
329 render_color = this->get_cursor_sphere_right_button_color();
330
331 m_circle.set_color(render_color);
332
333#if SLIC3R_OPENGL_ES
334 GLShaderProgram* shader = wxGetApp().get_shader("dashed_lines");
335#else
336 GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat");
337#endif // SLIC3R_OPENGL_ES
338 if (shader != nullptr) {
339 shader->start_using();
340#if !SLIC3R_OPENGL_ES
341 if (OpenGLManager::get_gl_info().is_core_profile()) {
342#endif // !SLIC3R_OPENGL_ES
343 const Transform3d view_model_matrix = Geometry::translation_transform(Vec3d(2.0f * (center.x() * cnv_inv_width - 0.5f), -2.0f * (center.y() * cnv_inv_height - 0.5f), 0.0)) *
344 Geometry::scale_transform(Vec3d(2.0f * radius * cnv_inv_width, 2.0f * radius * cnv_inv_height, 1.0f));
345 shader->set_uniform("view_model_matrix", view_model_matrix);
346#if !SLIC3R_OPENGL_ES
347 }
348 else
349 shader->set_uniform("view_model_matrix", Transform3d::Identity());
350#endif // !SLIC3R_OPENGL_ES
351 shader->set_uniform("projection_matrix", Transform3d::Identity());
352#if !SLIC3R_OPENGL_ES
353 if (OpenGLManager::get_gl_info().is_core_profile()) {
354#endif // !SLIC3R_OPENGL_ES
355 const std::array<int, 4>& viewport = wxGetApp().plater()->get_camera().get_viewport();
356 shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3])));
357 shader->set_uniform("width", 0.25f);
358 shader->set_uniform("gap_size", 0.0f);
359#if !SLIC3R_OPENGL_ES
360 }
361#endif // !SLIC3R_OPENGL_ES
362 m_circle.render();
363 shader->stop_using();
364 }
365
366#if !SLIC3R_OPENGL_ES
367 if (!OpenGLManager::get_gl_info().is_core_profile())
369#endif // !SLIC3R_OPENGL_ES
371}
Vec2d m_old_center
Definition GLGizmoPainterBase.hpp:308
virtual ColorRGBA get_cursor_hover_color() const
Definition GLGizmoPainterBase.hpp:254
virtual ColorRGBA get_cursor_sphere_right_button_color() const
Definition GLGizmoPainterBase.hpp:252
virtual ColorRGBA get_cursor_sphere_left_button_color() const
Definition GLGizmoPainterBase.hpp:251
GLModel m_circle
Definition GLGizmoPainterBase.hpp:307
float m_old_cursor_radius
Definition GLGizmoPainterBase.hpp:309
bool is_core_profile() const
Definition OpenGLManager.hpp:53
#define glEnable
Definition gl.h:3667
#define GL_DEPTH_TEST
Definition gl.h:574
#define GL_LINE_STIPPLE
Definition gl.h:941
#define GL_ENABLE_BIT
Definition gl.h:639
#define glLineStipple
Definition gl.h:4213
#define glPopAttrib
Definition gl.h:4477
#define glPushAttrib
Definition gl.h:4597
#define glDisable
Definition gl.h:3607
static constexpr double PI
Definition libslic3r.h:81
void translation_transform(Transform3d &transform, const Vec3d &translation)
Definition Geometry.cpp:346
void scale_transform(Transform3d &transform, double scale)
Definition Geometry.cpp:372
double angle(const Eigen::MatrixBase< Derived > &v1, const Eigen::MatrixBase< Derived2 > &v2)
Definition Point.hpp:138
Eigen::Matrix< float, 2, 1, Eigen::DontAlign > Vec2f
Definition Point.hpp:64

References Slic3r::GUI::GLModel::Geometry::add_index(), Slic3r::GUI::GLModel::Geometry::add_line(), Slic3r::GUI::GLModel::Geometry::add_vertex(), Slic3r::angle(), Slic3r::center(), Slic3r::GUI::GLModel::Geometry::color, EPSILON, Slic3r::GUI::GLModel::Geometry::format, get_cursor_hover_color(), get_cursor_sphere_left_button_color(), get_cursor_sphere_right_button_color(), Slic3r::GUI::OpenGLManager::get_gl_info(), Slic3r::GUI::Size::get_height(), Slic3r::GUI::Size::get_width(), GL_DEPTH_TEST, GL_ENABLE_BIT, GL_LINE_STIPPLE, glDisable, glEnable, glLineStipple, glLineWidth, glPopAttrib, glPushAttrib, glsafe, Slic3r::GUI::OpenGLManager::GLInfo::is_core_profile(), Left, Slic3r::GUI::GLModel::Geometry::LineLoop, Slic3r::GUI::GLModel::Geometry::Lines, m_button_down, m_circle, m_cursor_radius, m_old_center, m_old_cursor_radius, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::GUI::GLModel::Geometry::P2, PI, Slic3r::GUI::plater(), Slic3r::GUI::GLModel::Geometry::reserve_indices(), Slic3r::GUI::GLModel::Geometry::reserve_vertices(), Right, Slic3r::Geometry::scale_transform(), Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), Slic3r::GLShaderProgram::stop_using(), Slic3r::Geometry::translation_transform(), and Slic3r::GUI::GLModel::Geometry::vertices_count().

Referenced by render_cursor().

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

◆ render_cursor_height_range()

void Slic3r::GUI::GLGizmoPainterBase::render_cursor_height_range ( const Transform3d & trafo) const
protectedinherited
420{
421 GLShaderProgram *shader = wxGetApp().get_shader("flat");
422 if (shader == nullptr)
423 return;
424
425 shader->start_using();
426
427 const BoundingBoxf3 box = bounding_box();
428 Vec3d hit_world = trafo * Vec3d(m_rr.hit(0), m_rr.hit(1), m_rr.hit(2));
429 float max_z = (float)box.max.z();
430 float min_z = (float)box.min.z();
431
432 float cursor_z = std::clamp((float)hit_world.z(), min_z, max_z);
433 std::array<float, 2> zs = { cursor_z, std::clamp(cursor_z + m_cursor_height, min_z, max_z) };
434
435 const Selection& selection = m_parent.get_selection();
436 const ModelObject* model_object = wxGetApp().model().objects[selection.get_object_idx()];
437 const ModelInstance* mi = model_object->instances[selection.get_instance_idx()];
438
439 int volumes_count = model_object->volumes.size();
440 if (m_cut_contours.size() != volumes_count * 2) {
441 m_cut_contours.resize(volumes_count * 2);
442 }
443 m_volumes_index = 0;
444 for (const ModelVolume* mv : model_object->volumes) {
445 TriangleMesh vol_mesh = mv->mesh();
446 if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) {
447 Transform3d temp = mi->get_assemble_transformation().get_matrix() * mv->get_matrix();
448 temp.translate(mv->get_transformation().get_offset() * (GLVolume::explosion_ratio - 1.0) + mi->get_offset_to_assembly() * (GLVolume::explosion_ratio - 1.0));
449 vol_mesh.transform(temp);
450 }
451 else {
452 vol_mesh.transform(mi->get_transformation().get_matrix() * mv->get_matrix());
453 }
454
455 for (int i = 0; i < zs.size(); i++) {
456 update_contours(m_volumes_index, vol_mesh, zs[i], max_z, min_z);
457
458 const Camera& camera = wxGetApp().plater()->get_camera();
459 Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(m_cut_contours[m_volumes_index].shift);
460
461 shader->set_uniform("view_model_matrix", view_model_matrix);
462 shader->set_uniform("projection_matrix", camera.get_projection_matrix());
463 // ORCA: OpenGL Core Profile
464#if !SLIC3R_OPENGL_ES
465 if (!OpenGLManager::get_gl_info().is_core_profile())
466 glsafe(::glLineWidth(2.0f));
467#endif // !SLIC3R_OPENGL_ES
468 m_cut_contours[m_volumes_index].contours.render();
470 }
471
472 }
473
474 shader->stop_using();
475}
int m_volumes_index
Definition GLGizmoPainterBase.hpp:385
void update_contours(int i, const TriangleMesh &vol_mesh, float cursor_z, float max_z, float min_z) const
Definition GLGizmoPainterBase.cpp:490
BoundingBoxf3 bounding_box() const
Definition GLGizmoPainterBase.cpp:477
std::vector< CutContours > m_cut_contours
Definition GLGizmoPainterBase.hpp:384
void assemble_transform(Transform3d &transform, const Vec3d &translation, const Vec3d &rotation, const Vec3d &scale, const Vec3d &mirror)
Definition Geometry.cpp:319

References Slic3r::Geometry::assemble_transform(), bounding_box(), Slic3r::GUI::GLCanvas3D::CanvasAssembleView, Slic3r::GLVolume::explosion_ratio, Slic3r::ModelInstance::get_assemble_transformation(), Slic3r::GUI::OpenGLManager::get_gl_info(), Slic3r::GUI::Selection::get_instance_idx(), Slic3r::Geometry::Transformation::get_matrix(), Slic3r::ModelVolume::get_matrix(), Slic3r::GUI::Selection::get_object_idx(), Slic3r::Geometry::Transformation::get_offset(), Slic3r::ModelInstance::get_offset_to_assembly(), Slic3r::GUI::Camera::get_projection_matrix(), Slic3r::ModelInstance::get_transformation(), Slic3r::ModelVolume::get_transformation(), Slic3r::GUI::Camera::get_view_matrix(), glLineWidth, glsafe, Slic3r::ModelObject::instances, m_cursor_height, m_cut_contours, Slic3r::GUI::GLGizmoBase::m_parent, m_rr, m_volumes_index, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::max, Slic3r::ModelVolume::mesh(), Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::min, Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), Slic3r::GLShaderProgram::stop_using(), Slic3r::TriangleMesh::transform(), update_contours(), and Slic3r::ModelObject::volumes.

Referenced by render_cursor().

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

◆ render_cursor_sphere()

void Slic3r::GUI::GLGizmoPainterBase::render_cursor_sphere ( const Transform3d & trafo) const
protectedinherited
375{
376 if (s_sphere == nullptr) {
377 s_sphere = std::make_shared<GLModel>();
378 s_sphere->init_from(its_make_sphere(1.0, double(PI) / 12.0));
379 }
380
381 GLShaderProgram* shader = wxGetApp().get_shader("flat");
382 if (shader == nullptr)
383 return;
384
385 const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_scaling_factor_matrix().inverse();
386
387 // BBS
388 ColorRGBA render_color = this->get_cursor_hover_color();
390 render_color = this->get_cursor_sphere_left_button_color();
391 else if (m_button_down == Button::Right)
392 render_color = this->get_cursor_sphere_right_button_color();
393
394 shader->start_using();
395
396 const Camera& camera = wxGetApp().plater()->get_camera();
397 Transform3d view_model_matrix = camera.get_view_matrix() * trafo *
398 Geometry::assemble_transform(m_rr.hit.cast<double>()) * complete_scaling_matrix_inverse *
399 Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), m_cursor_radius * Vec3d::Ones());
400
401 shader->set_uniform("view_model_matrix", view_model_matrix);
402 shader->set_uniform("projection_matrix", camera.get_projection_matrix());
403
404 const bool is_left_handed = Geometry::Transformation(view_model_matrix).is_left_handed();
405 if (is_left_handed)
407
408 assert(s_sphere != nullptr);
409 s_sphere->set_color(render_color);
410 s_sphere->render();
411
412 if (is_left_handed)
414
415 shader->stop_using();
416}
static std::shared_ptr< GLModel > s_sphere
Definition GLGizmoPainterBase.hpp:353
#define GL_CW
Definition gl.h:520
#define GL_CCW
Definition gl.h:317
#define glFrontFace
Definition gl.h:3765
static bool is_left_handed(const Transform3d::ConstLinearPart &m)
Definition Selection.cpp:2998
indexed_triangle_set its_make_sphere(double radius, double fa)
Definition TriangleMesh.cpp:1128

References Slic3r::Geometry::assemble_transform(), get_cursor_hover_color(), get_cursor_sphere_left_button_color(), get_cursor_sphere_right_button_color(), Slic3r::GUI::Camera::get_projection_matrix(), Slic3r::Geometry::Transformation::get_scaling_factor_matrix(), Slic3r::GUI::Camera::get_view_matrix(), GL_CCW, GL_CW, glFrontFace, glsafe, Slic3r::Geometry::Transformation::is_left_handed(), Slic3r::GUI::is_left_handed(), Slic3r::its_make_sphere(), Left, m_button_down, m_cursor_radius, m_rr, PI, Right, s_sphere, Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), and Slic3r::GLShaderProgram::stop_using().

Referenced by render_cursor().

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

◆ render_filament_remap_ui()

void Slic3r::GUI::GLGizmoMmuSegmentation::render_filament_remap_ui ( float window_width,
float max_tooltip_width,
float scale )
private
1007{
1008 size_t n_extr = std::min((size_t)EnforcerBlockerType::ExtruderMax, m_extruders_colors.size());
1009
1010 int displayed_count = 0;
1011 const int max_per_line = 8;
1012
1013 // ORCA: Use m_used_filaments to show only relevant source filaments
1014 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(7.f * scale, 7.f * scale));
1015 for (size_t src : m_used_filaments) {
1016 if (src >= n_extr) continue;
1017
1018 if (displayed_count > 0 && (displayed_count % max_per_line != 0))
1019 ImGui::SameLine();
1020
1021 std::string pop_id = "popup_" + std::to_string(src);
1022
1023 bool src_clicked = draw_color_button(
1024 (int)src + 1, // idx
1025 "###remap_src_", // button_id
1026 m_extruders_colors[src], // color
1027 m_extruders_colors[m_extruder_remap[src]], // mapped_color (shows bubble if not matches with Color)
1028 ImGui::IsPopupOpen(pop_id.c_str()), // is_active
1029 scale
1030 );
1031
1032 if (src_clicked) {
1033 // Calculate popup position centered below the current button
1034 ImVec2 button_pos = ImGui::GetItemRectMin();
1035 ImVec2 button_size = ImGui::GetItemRectSize();
1036
1037 // Ensure popup is within the main viewport bounds
1038 int dst_count = (int)std::min(n_extr, (size_t)max_per_line);
1039 float est_popup_w = button_size.x * dst_count
1040 + ImGui::GetStyle().ItemSpacing.x * (dst_count - 1)
1041 + ImGui::GetStyle().WindowPadding.x * 2.f;
1042
1043 ImGuiViewport* vp = ImGui::GetMainViewport();
1044 float right_limit = vp->WorkPos.x + vp->WorkSize.x - est_popup_w * 0.5f; // pivot is 0.5 so subtract half
1045 float centered_x = button_pos.x + button_size.x * 0.5f; // pivot 0.5 just needs center x
1046
1047 ImVec2 popup_pos(std::min(centered_x, right_limit), button_pos.y + button_size.y);
1048
1049 ImGui::SetNextWindowPos(popup_pos, ImGuiCond_Appearing, ImVec2(0.5f, -0.1f));
1050 ImGui::SetNextWindowBgAlpha(1.0f); // Ensure full opacity
1051 ImGui::OpenPopup(pop_id.c_str());
1052 }
1053
1054 if (ImGui::IsItemHovered() && src != m_extruder_remap[src]) // show tooltip if it has mapping info
1055 m_imgui->tooltip(std::to_string(src + 1) + " >> " + std::to_string(m_extruder_remap[src] + 1), max_tooltip_width);
1056
1057 // Apply popup styling before BeginPopup using standard Orca colors
1058 ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding , 8.0f * scale);
1059 ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 2.0f * scale); // thicker & colored border to prevent mixing with main window. Current ImGui version not supports shadows
1060 ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg));
1061 ImGui::PushStyleColor(ImGuiCol_Border , ImGui::ColorConvertFloat4ToU32(ImGuiWrapper::COL_ORCA));
1062
1063 if (ImGui::BeginPopup(pop_id.c_str(), ImGuiWindowFlags_NoMove)) {
1064
1065 m_imgui->text(_L("To:"));
1066
1067 for (int dst = 0; dst < (int)n_extr; ++dst) {
1068 if (dst > 0 && (dst % max_per_line != 0))
1069 ImGui::SameLine();
1070 bool dst_clicked = draw_color_button(
1071 dst + 1, // idx
1072 "###remap_dst_", // button_id
1073 m_extruders_colors[dst], // color
1074 m_extruders_colors[dst], // mapped_color (non fuctional in here)
1075 m_extruder_remap[src] == dst, // is_active
1076 scale
1077 );
1078 if (dst_clicked) {
1079 m_extruder_remap[src] = dst;
1080 // update the source button color immediately
1081 ImGui::CloseCurrentPopup();
1082 }
1083 }
1084 ImGui::Dummy(ImVec2(0.0f, 2.f * scale));
1085 ImGui::EndPopup();
1086 }
1087
1088 // Clean up popup styling (always pop, whether popup was open or not)
1089 ImGui::PopStyleColor(2); // PopupBg and Border
1090 ImGui::PopStyleVar(2); // PopupRounding and PopupBorderSize
1091
1092 displayed_count++;
1093 }
1094 ImGui::PopStyleVar(1); // ItemSpacing
1095}
std::set< size_t > m_used_filaments
Definition GLGizmoMmuSegmentation.hpp:135

References _L, Slic3r::GUI::ImGuiWrapper::COL_ORCA, draw_color_button(), Slic3r::ExtruderMax, m_extruder_remap, m_extruders_colors, Slic3r::GUI::GLGizmoBase::m_imgui, m_used_filaments, and scale().

Referenced by on_render_input_window().

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

◆ render_follows_cursor()

bool Slic3r::GUI::GLGizmoPainterBase::render_follows_cursor ( ) const
overrideprotectedvirtualinherited

Reimplemented from Slic3r::GUI::GLGizmoBase.

209{
210 // The brush is drawn only where the cursor meets the model. update_raycast_cache() keeps the
211 // answer for render_cursor().
212 if (m_c->selection_info() == nullptr || m_c->selection_info()->model_object() == nullptr)
213 return false;
214 update_raycast_cache(m_parent.get_local_mouse_position(), wxGetApp().plater()->get_camera(), mesh_trafo_matrices());
215 return m_rr.mesh_id != -1;
216}

References Slic3r::GUI::GLGizmoBase::m_c, Slic3r::GUI::GLGizmoBase::m_parent, m_rr, mesh_trafo_matrices(), Slic3r::GUI::plater(), and update_raycast_cache().

Here is the call graph for this function:

◆ render_grabbers() [1/3]

void Slic3r::GUI::GLGizmoBase::render_grabbers ( const BoundingBoxf3 & box) const
protectedinherited
413{
414#if ENABLE_FIXED_GRABBER
416#else
417 render_grabbers((float)((box.size().x() + box.size().y() + box.size().z()) / 3.0));
418#endif
419}
void render_grabbers(const BoundingBoxf3 &box) const
Definition GLGizmoBase.cpp:412
static const float FixedGrabberSize
Definition GLGizmoBase.hpp:90

References Slic3r::GUI::GLGizmoBase::Grabber::FixedGrabberSize, render_grabbers(), and Slic3r::BoundingBox3Base< PointType >::size().

Referenced by Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoScale3D::on_render(), Slic3r::GUI::GLGizmoRotate::render_grabber(), render_grabbers(), and render_grabbers().

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

◆ render_grabbers() [2/3]

void Slic3r::GUI::GLGizmoBase::render_grabbers ( float size) const
protectedinherited
422{
423 render_grabbers(0, m_grabbers.size() - 1, size, false);
424}

References m_grabbers, and render_grabbers().

Here is the call graph for this function:

◆ render_grabbers() [3/3]

void Slic3r::GUI::GLGizmoBase::render_grabbers ( size_t first,
size_t last,
float size,
bool force_hover ) const
protectedinherited
427{
428 GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
429 if (shader == nullptr)
430 return;
431 shader->start_using();
432 shader->set_uniform("emission_factor", 0.1f);
434 for (size_t i = first; i <= last; ++i) {
435 if (m_grabbers[i].enabled)
436 m_grabbers[i].render(force_hover ? true : m_hover_id == (int)i, size);
437 }
439 shader->stop_using();
440}
#define GL_CULL_FACE
Definition gl.h:500

References GL_CULL_FACE, glDisable, glEnable, glsafe, m_grabbers, m_hover_id, Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), and Slic3r::GLShaderProgram::stop_using().

Here is the call graph for this function:

◆ render_input_window()

void Slic3r::GUI::GLGizmoBase::render_input_window ( float x,
float y,
float bottom_limit )
inherited
529{
530 on_render_input_window(x, y, bottom_limit);
532 // imgui windows that don't have an initial size needs to be processed once to get one
533 // and are not rendered in the first frame
534 // so, we forces to render another frame the first time the imgui window is shown
535 // https://github.com/ocornut/imgui/issues/2949
536 m_parent.set_as_dirty();
537 m_parent.request_extra_frame();
539 }
540}
virtual void on_render_input_window(float x, float y, float bottom_limit)
Definition GLGizmoBase.hpp:258
bool m_first_input_window_render
Definition GLGizmoBase.hpp:154

References m_first_input_window_render, m_parent, and on_render_input_window().

Here is the call graph for this function:

◆ render_painter_gizmo()

void Slic3r::GUI::GLGizmoMmuSegmentation::render_painter_gizmo ( )
overridevirtual

Implements Slic3r::GUI::GLGizmoPainterBase.

191{
192 const Selection& selection = m_parent.get_selection();
193
196
197 render_triangles(selection);
198
199 m_c->object_clipper()->render_cut();
200 m_c->instances_hider()->render_cut();
202
204}
virtual void render_triangles(const Selection &selection, const ModelVolume *skip=nullptr) const
Definition GLGizmoPainterBase.cpp:116
void render_cursor()
Definition GLGizmoPainterBase.cpp:218
#define GL_BLEND
Definition gl.h:275

References GL_BLEND, GL_DEPTH_TEST, glDisable, glEnable, glsafe, Slic3r::GUI::GLGizmoBase::m_c, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::GUI::GLGizmoPainterBase::render_cursor(), and Slic3r::GUI::GLGizmoPainterBase::render_triangles().

Here is the call graph for this function:

◆ render_tooltip_button()

void Slic3r::GUI::GLGizmoMmuSegmentation::render_tooltip_button ( float x,
float y )
protected
308{
309 auto get_shortcuts = [this]() -> std::vector<std::pair<wxString, wxString>> {
310 switch (m_tool_type) {
312
315
317
318 default: return {};
319 }
320 };
321
323}
void render_tooltip_button(ImGuiWrapper *imgui_wrapper, const GLCanvas3D &canvas, const std::vector< std::pair< wxString, wxString > > &shortcuts, float x, float y)
Definition GLGizmoUtils.cpp:48

References Slic3r::GUI::GLGizmoPainterBase::BRUSH, Slic3r::GUI::GLGizmoPainterBase::BUCKET_FILL, Slic3r::GUI::GLGizmoPainterBase::GAP_FILL, Slic3r::GUI::GLGizmoBase::m_imgui, Slic3r::GUI::GLGizmoBase::m_parent, m_shortcuts_brush, m_shortcuts_bucket_fill, m_shortcuts_gap_fill, Slic3r::GUI::GLGizmoPainterBase::m_tool_type, Slic3r::GUI::GLGizmoUtils::render_tooltip_button(), and Slic3r::GUI::GLGizmoPainterBase::SMART_FILL.

Referenced by on_render_input_window().

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

◆ render_triangles() [1/2]

void Slic3r::GUI::GLGizmoPainterBase::render_triangles ( const Selection & selection,
const ModelVolume * skip = nullptr ) const
protectedvirtualinherited
117{
118 render_triangles(selection, skip == nullptr ? std::vector<const ModelVolume*>{} : std::vector<const ModelVolume*>{skip});
119}

References render_triangles().

Referenced by Slic3r::GUI::GLGizmoFdmSupports::render_painter_gizmo(), Slic3r::GUI::GLGizmoFuzzySkin::render_painter_gizmo(), Slic3r::GUI::GLGizmoMmuSegmentation::render_painter_gizmo(), Slic3r::GUI::GLGizmoSeam::render_painter_gizmo(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painter_gizmo(), and render_triangles().

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

◆ render_triangles() [2/2]

void Slic3r::GUI::GLGizmoPainterBase::render_triangles ( const Selection & selection,
const std::vector< const ModelVolume * > & skip ) const
protectedinherited
122{
123 auto* shader = wxGetApp().get_shader("mm_gouraud");
124 if (!shader)
125 return;
126 shader->start_using();
127 ScopeGuard guard([shader]() { if (shader) shader->stop_using(); });
128
130 shader->set_uniform("clipping_plane", clp_data.clp_dataf);
131 shader->set_uniform("z_range", clp_data.z_range);
132
133 // BBS: to improve the random white pixel issue
135
136 const ModelObject* mo = m_c->selection_info()->model_object();
137 int mesh_id = -1;
138 for (const ModelVolume* mv : mo->volumes) {
139 if (!mv->is_model_part())
140 continue;
141
142 ++mesh_id;
143 if (std::find(skip.begin(), skip.end(), mv) != skip.end())
144 continue;
145
146 Transform3d trafo_matrix;
147 if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) {
148 trafo_matrix = mo->instances[selection.get_instance_idx()]->get_assemble_transformation().get_matrix() * mv->get_matrix();
149 trafo_matrix.translate(mv->get_transformation().get_offset() * (GLVolume::explosion_ratio - 1.0) + mo->instances[selection.get_instance_idx()]->get_offset_to_assembly() * (GLVolume::explosion_ratio - 1.0));
150 }
151 else {
152 trafo_matrix = mo->instances[selection.get_instance_idx()]->get_transformation().get_matrix()* mv->get_matrix();
153 }
154
155 bool is_left_handed = trafo_matrix.matrix().determinant() < 0.;
156 if (is_left_handed)
158
159 const Camera& camera = wxGetApp().plater()->get_camera();
160 const Transform3d& view_matrix = camera.get_view_matrix();
161 shader->set_uniform("view_model_matrix", view_matrix * trafo_matrix);
162 shader->set_uniform("projection_matrix", camera.get_projection_matrix());
163 const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose();
164 shader->set_uniform("view_normal_matrix", view_normal_matrix);
165
167 Matrix3f normal_matrix = static_cast<Matrix3f>(trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose().cast<float>());
168
169 // Compute up direction accounting for build plate tilt
170 Vec3f up_direction = get_tilt_up_direction();
171
172 shader->set_uniform("volume_world_matrix", trafo_matrix);
173 shader->set_uniform("volume_mirrored", is_left_handed);
174 shader->set_uniform("slope.actived", m_parent.is_using_slope());
175 shader->set_uniform("slope.volume_world_normal_matrix", normal_matrix);
176 shader->set_uniform("slope.normal_z", normal_z);
177 shader->set_uniform("slope.up_direction", up_direction);
178 m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix);
179
180 if (is_left_handed)
182 }
183}
ClippingPlaneDataWrapper get_clipping_plane_data() const
Definition GLGizmoPainterBase.cpp:90
constexpr T deg2rad(const T angle)
Definition Geometry.hpp:312
Eigen::Matrix< float, 3, 3, Eigen::DontAlign > Matrix3f
Definition Point.hpp:85
auto cast(const BoundingBoxBase< Tin > &b)
Definition BoundingBox.hpp:299
Eigen::Matrix< double, 3, 3, Eigen::DontAlign > Matrix3d
Definition Point.hpp:86

References Slic3r::GUI::GLCanvas3D::CanvasAssembleView, Slic3r::cast(), Slic3r::Geometry::deg2rad(), Slic3r::GLVolume::explosion_ratio, get_clipping_plane_data(), Slic3r::GUI::Selection::get_instance_idx(), Slic3r::ModelVolume::get_matrix(), Slic3r::Geometry::Transformation::get_offset(), Slic3r::GUI::Camera::get_projection_matrix(), get_tilt_up_direction(), Slic3r::ModelVolume::get_transformation(), Slic3r::GUI::Camera::get_view_matrix(), GL_CCW, GL_CULL_FACE, GL_CW, glDisable, glFrontFace, glsafe, Slic3r::ModelObject::instances, Slic3r::GUI::is_left_handed(), Slic3r::ModelVolume::is_model_part(), Slic3r::GUI::GLGizmoBase::m_c, m_highlight_by_angle_threshold_deg, Slic3r::GUI::GLGizmoBase::m_imgui, Slic3r::GUI::GLGizmoBase::m_parent, m_triangle_selectors, and Slic3r::ModelObject::volumes.

Here is the call graph for this function:

◆ save()

void Slic3r::GUI::GLGizmoBase::save ( cereal::BinaryOutputArchive & ar) const
inlineinherited
171{ on_save(ar); }
virtual void on_save(cereal::BinaryOutputArchive &ar) const
Definition GLGizmoBase.hpp:242

References on_save().

Here is the call graph for this function:

◆ set_common_data_pool()

void Slic3r::GUI::GLGizmoBase::set_common_data_pool ( CommonGizmosDataPool * ptr)
inlineinherited
193{ m_c = ptr; }

References m_c.

◆ set_dirty()

void Slic3r::GUI::GLGizmoBase::set_dirty ( )
protectedinherited
524 {
525 m_dirty = true;
526}
bool m_dirty
Definition GLGizmoBase.hpp:293

References m_dirty.

Referenced by Slic3r::GUI::GLGizmoCut3D::process_cut_line(), and Slic3r::GUI::GLGizmoSimplify::request_rerender().

Here is the caller graph for this function:

◆ set_hover_id()

void Slic3r::GUI::GLGizmoBase::set_hover_id ( int id)
inherited
348{
349 // do not change hover id during dragging
350 assert(!m_dragging);
351
352 // allow empty grabbers when not using grabbers but use hover_id - flatten, rotate
353// if (!m_grabbers.empty() && id >= (int) m_grabbers.size())
354// return;
355
356 m_hover_id = id;
358}
virtual void on_set_hover_id()
Definition GLGizmoBase.hpp:245

References m_dragging, m_hover_id, and on_set_hover_id().

Referenced by Slic3r::GUI::GLGizmoRotate3D::on_set_hover_id().

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

◆ set_icon_filename()

void Slic3r::GUI::GLGizmoBase::set_icon_filename ( const std::string & filename)
inherited
343 {
344 m_icon_filename = filename;
345}

References m_icon_filename.

◆ set_state()

void Slic3r::GUI::GLGizmoBase::set_state ( EState state)
inlineinherited
176{ m_state = state; on_set_state(); }
virtual void on_set_state()
Definition GLGizmoBase.hpp:244

References m_state, and on_set_state().

Referenced by Slic3r::GUI::GLGizmosManager::activate_gizmo().

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

◆ shortcut()

std::optional< Shortcut > Slic3r::GUI::GLGizmoBase::shortcut ( ) const
inlineinherited
178{ return m_shortcut; }

References m_shortcut.

Referenced by Slic3r::GUI::GLGizmoFdmSupports::on_tool_shortcut(), Slic3r::GUI::GLGizmoMmuSegmentation::on_tool_shortcut(), Slic3r::GUI::GLGizmoPainterBase::on_tool_shortcut(), and Slic3r::GUI::GLGizmoSeam::on_tool_shortcut().

Here is the caller graph for this function:

◆ tool_changed()

void Slic3r::GUI::GLGizmoMmuSegmentation::tool_changed ( wchar_t old_tool,
wchar_t new_tool )
private
795{
796 if ((old_tool == ImGui::GapFillIcon && new_tool == ImGui::GapFillIcon) ||
797 (old_tool != ImGui::GapFillIcon && new_tool != ImGui::GapFillIcon))
798 return;
799
800 for (auto& selector_ptr : m_triangle_selectors) {
801 TriangleSelectorPatch* tsp = dynamic_cast<TriangleSelectorPatch*>(selector_ptr.get());
802 tsp->set_filter_state(new_tool == ImGui::GapFillIcon);
803 }
804}

References Slic3r::GUI::GLGizmoPainterBase::m_triangle_selectors, and Slic3r::GUI::TriangleSelectorPatch::set_filter_state().

Referenced by on_render_input_window().

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

◆ unregister_grabbers_for_picking()

void Slic3r::GUI::GLGizmoBase::unregister_grabbers_for_picking ( )
protectedinherited
406{
407 for (size_t i = 0; i < m_grabbers.size(); ++i) {
408 m_grabbers[i].unregister_raycasters_for_picking();
409 }
410}

References m_grabbers.

Referenced by unregister_raycasters_for_picking().

Here is the caller graph for this function:

◆ unregister_raycasters_for_picking()

void Slic3r::GUI::GLGizmoBase::unregister_raycasters_for_picking ( )
inlineinherited
virtual void on_unregister_raycasters_for_picking()
Definition GLGizmoBase.hpp:268
void unregister_grabbers_for_picking()
Definition GLGizmoBase.cpp:405

References on_unregister_raycasters_for_picking(), and unregister_grabbers_for_picking().

Referenced by Slic3r::GUI::GLGizmosManager::activate_gizmo(), and Slic3r::GUI::GLCanvas3D::reload_scene().

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

◆ update_contours()

void Slic3r::GUI::GLGizmoPainterBase::update_contours ( int i,
const TriangleMesh & vol_mesh,
float cursor_z,
float max_z,
float min_z ) const
privateinherited
491{
492 const Selection& selection = m_parent.get_selection();
493 const GLVolume* first_glvolume = selection.get_first_volume();
494 const BoundingBoxf3& box = first_glvolume->transformed_convex_hull_bounding_box();
495
496 const ModelObject* model_object = wxGetApp().model().objects[selection.get_object_idx()];
497 const int instance_idx = selection.get_instance_idx();
498
499 if (min_z < cursor_z && cursor_z < max_z) {
500 if (m_cut_contours[i].cut_z != cursor_z || m_cut_contours[i].object_id != model_object->id() || m_cut_contours[i].instance_idx != instance_idx) {
501 m_cut_contours[i].cut_z = cursor_z;
502
503 m_cut_contours[i].mesh = vol_mesh;
504
505 m_cut_contours[i].position = box.center();
506 m_cut_contours[i].shift = Vec3d::Zero();
507 m_cut_contours[i].object_id = model_object->id();
508 m_cut_contours[i].instance_idx = instance_idx;
509 m_cut_contours[i].contours.reset();
510
511 MeshSlicingParams slicing_params;
512 slicing_params.trafo = Transform3d::Identity().matrix();
513 const Polygons polys = slice_mesh(m_cut_contours[i].mesh.its, cursor_z, slicing_params);
514 if (!polys.empty()) {
515 m_cut_contours[i].contours.init_from(polys, static_cast<float>(cursor_z));
516 m_cut_contours[i].contours.set_color({ 1.0f, 1.0f, 1.0f, 1.0f });
517 }
518 }
519 else if (box.center() != m_cut_contours[i].position) {
520 m_cut_contours[i].shift = box.center() - m_cut_contours[i].position;
521 }
522 }
523 else
524 m_cut_contours[i].contours.reset();
525}
std::vector< Polygon, PointsAllocator< Polygon > > Polygons
Definition Polygon.hpp:22
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

References Slic3r::BoundingBox3Base< PointType >::center(), Slic3r::GUI::Selection::get_first_volume(), Slic3r::GUI::Selection::get_instance_idx(), Slic3r::GUI::Selection::get_object_idx(), Slic3r::ObjectBase::id(), m_cut_contours, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::slice_mesh(), Slic3r::MeshSlicingParams::trafo, and Slic3r::GLVolume::transformed_convex_hull_bounding_box().

Referenced by render_cursor_height_range().

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

◆ update_from_model_object()

void Slic3r::GUI::GLGizmoMmuSegmentation::update_from_model_object ( bool first_update = false)
overrideprivatevirtual

Implements Slic3r::GUI::GLGizmoPainterBase.

779{
780 wxBusyCursor wait;
781
782 // Extruder colors need to be reloaded before calling init_model_triangle_selectors to render painted triangles
783 // using colors from loaded 3MF and not from printer profile in Slicer.
784 if (int prev_extruders_count = int(m_extruders_colors.size());
785 prev_extruders_count != wxGetApp().filaments_cnt() || wxGetApp().plater()->get_extruders_colors() != m_extruders_colors)
786 this->init_extruders_data();
787
789
790 // ORCA: Refresh cache when model changes
791 this->update_used_filaments();
792}

References init_extruders_data(), init_model_triangle_selectors(), m_extruders_colors, Slic3r::GUI::plater(), and update_used_filaments().

Here is the call graph for this function:

◆ update_items_state()

bool Slic3r::GUI::GLGizmoBase::update_items_state ( )
inherited
361{
362 bool res = m_dirty;
363 m_dirty = false;
364 return res;
365}

References m_dirty.

◆ update_model_object()

void Slic3r::GUI::GLGizmoMmuSegmentation::update_model_object ( )
overrideprivatevirtual

Implements Slic3r::GUI::GLGizmoPainterBase.

700{
701 bool updated = false;
702 ModelObject* mo = m_c->selection_info()->model_object();
703 int idx = -1;
704 for (ModelVolume* mv : mo->volumes) {
705 if (! mv->is_model_part())
706 continue;
707 ++idx;
708 updated |= mv->mmu_segmentation_facets.set(*m_triangle_selectors[idx].get());
709 }
710
711 if (updated) {
712 const ModelObjectPtrs &mos = wxGetApp().model().objects;
713 size_t obj_idx = std::find(mos.begin(), mos.end(), mo) - mos.begin();
714 wxGetApp().obj_list()->update_info_items(obj_idx);
715 wxGetApp().plater()->get_partplate_list().notify_instance_update(obj_idx, 0);
716 m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
717
718 // ORCA: Refresh cache
719 this->update_used_filaments();
720 }
721}
std::vector< ModelObject * > ModelObjectPtrs
Definition CutUtils.hpp:13
id get(id object, const void *key)
Definition MacIME.mm:22

References Slic3r::ModelVolume::is_model_part(), Slic3r::GUI::GLGizmoBase::m_c, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::GUI::GLGizmoPainterBase::m_triangle_selectors, Slic3r::ModelVolume::mmu_segmentation_facets, Slic3r::FacetsAnnotation::set(), update_used_filaments(), and Slic3r::ModelObject::volumes.

Referenced by on_render_input_window(), and remap_filament_assignments().

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

◆ update_raycast_cache()

void Slic3r::GUI::GLGizmoPainterBase::update_raycast_cache ( const Vec2d & mouse_position,
const Camera & camera,
const std::vector< Transform3d > & trafo_matrices ) const
privateinherited
1112{
1113 if (m_rr.mouse_position == mouse_position) {
1114 // Same query as last time - the answer is already in the cache.
1115 return;
1116 }
1117
1118 Vec3f normal = Vec3f::Zero();
1119 Vec3f hit = Vec3f::Zero();
1120 size_t facet = 0;
1121 Vec3f closest_hit = Vec3f::Zero();
1122 double closest_hit_squared_distance = std::numeric_limits<double>::max();
1123 size_t closest_facet = 0;
1124 int closest_hit_mesh_id = -1;
1125
1126 // Cast a ray on all meshes, pick the closest hit and save it for the respective mesh
1127 for (int mesh_id = 0; mesh_id < int(trafo_matrices.size()); ++mesh_id) {
1128
1129 if (m_c->raycaster()->raycasters()[mesh_id]->unproject_on_mesh(
1130 mouse_position,
1131 trafo_matrices[mesh_id],
1132 camera,
1133 hit,
1134 normal,
1135 m_c->object_clipper()->get_clipping_plane(),
1136 &facet,
1137 m_parent.get_canvas_type() != GLCanvas3D::CanvasAssembleView))
1138 {
1139 // In case this hit is clipped, skip it.
1140 if (is_mesh_point_clipped(hit.cast<double>(), trafo_matrices[mesh_id]))
1141 continue;
1142
1143 // Is this hit the closest to the camera so far?
1144 double hit_squared_distance = (camera.get_position()-trafo_matrices[mesh_id]*hit.cast<double>()).squaredNorm();
1145 if (hit_squared_distance < closest_hit_squared_distance) {
1146 closest_hit_squared_distance = hit_squared_distance;
1147 closest_facet = facet;
1148 closest_hit_mesh_id = mesh_id;
1149 closest_hit = hit;
1150 }
1151 }
1152 }
1153
1154 m_rr = {mouse_position, closest_hit_mesh_id, closest_hit, closest_facet};
1155}
bool is_mesh_point_clipped(const Vec3d &point, const Transform3d &trafo) const
Definition GLGizmoPainterBase.cpp:527
Point normal(Point pt, double scale)
Definition TreeSupport.cpp:112

References Slic3r::GUI::GLCanvas3D::CanvasAssembleView, Slic3r::GUI::Camera::get_position(), is_mesh_point_clipped(), Slic3r::GUI::GLGizmoBase::m_c, Slic3r::GUI::GLGizmoBase::m_parent, m_rr, and Slic3r::normal().

Referenced by get_projected_height_range(), get_projected_mouse_positions(), gizmo_event(), render_cursor(), and render_follows_cursor().

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

◆ update_render_colors()

void Slic3r::GUI::GLGizmoBase::update_render_colors ( )
staticinherited

References AXES_COLOR, Slic3r::RenderColor::colors, FLATTEN_COLOR, FLATTEN_HOVER_COLOR, Slic3r::GUI::ImGuiWrapper::from_ImVec4(), RenderCol_Flatten_Plane, RenderCol_Flatten_Plane_Hover, RenderCol_Grabber_X, RenderCol_Grabber_Y, and RenderCol_Grabber_Z.

Referenced by Slic3r::GUI::GLCanvas3D::_render_style_editor().

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

◆ update_triangle_selectors_colors()

void Slic3r::GUI::GLGizmoMmuSegmentation::update_triangle_selectors_colors ( )
private
763{
764 for (int i = 0; i < m_triangle_selectors.size(); i++) {
765 TriangleSelectorPatch* selector = dynamic_cast<TriangleSelectorPatch*>(m_triangle_selectors[i].get());
766 int extruder_idx = m_volumes_extruder_idxs[i];
767 int extruder_color_idx = std::max(0, extruder_idx - 1);
768 // A mixed-color slot can index past the physical colour list; fall back to the first colour.
769 if (extruder_color_idx >= (int)m_extruders_colors.size())
770 extruder_color_idx = 0;
771 std::vector<ColorRGBA> ebt_colors;
772 ebt_colors.push_back(m_extruders_colors[extruder_color_idx]);
773 ebt_colors.insert(ebt_colors.end(), m_extruders_colors.begin(), m_extruders_colors.end());
774 selector->set_ebt_colors(ebt_colors);
775 }
776}

References m_extruders_colors, Slic3r::GUI::GLGizmoPainterBase::m_triangle_selectors, m_volumes_extruder_idxs, and Slic3r::GUI::TriangleSelectorPatch::set_ebt_colors().

Referenced by data_changed(), and remap_filament_assignments().

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

◆ update_used_filaments()

void Slic3r::GUI::GLGizmoMmuSegmentation::update_used_filaments ( )
private
979{
980 m_used_filaments.clear();
981
982 // Add base extruder IDs from volumes (unpainted areas)
983 for (int ext_id : m_volumes_extruder_idxs) {
984 // ext_id is 1-based (1 = Extruder 1), 0 = Default (usually maps to first available or object default)
985 // Here we assume 0 maps to index 0 (Extruder 1) for simplicity in display,
986 // or we should check logic in init_model_triangle_selectors where it does:
987 // int extruder_idx = (mv->extruder_id() > 0) ? mv->extruder_id() - 1 : 0;
988 int idx = (ext_id > 0) ? ext_id - 1 : 0;
989 if (idx >= 0 && idx < m_extruders_colors.size())
990 m_used_filaments.insert((size_t)idx);
991 }
992
993 // Add painted states
994 for (const auto& selector : m_triangle_selectors) {
995 if (!selector) continue;
996 TriangleSelector::TriangleSplittingData data = selector->serialize();
997 std::vector<EnforcerBlockerType> states = TriangleSelector::extract_used_facet_states(data);
998 for (EnforcerBlockerType s : states) {
999 int idx = (int)s - (int)EnforcerBlockerType::Extruder1;
1000 if (idx >= 0 && idx < m_extruders_colors.size())
1001 m_used_filaments.insert((size_t)idx);
1002 }
1003 }
1004}
static std::vector< EnforcerBlockerType > extract_used_facet_states(const TriangleSplittingData &data)
Definition TriangleSelector.cpp:2340

References Slic3r::TriangleSelector::extract_used_facet_states(), Slic3r::Extruder1, m_extruders_colors, Slic3r::GUI::GLGizmoPainterBase::m_triangle_selectors, m_used_filaments, m_volumes_extruder_idxs, and Slic3r::TriangleSelector::TriangleSplittingData::serialize().

Referenced by remap_filament_assignments(), update_from_model_object(), and update_model_object().

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

◆ use_grabbers()

bool Slic3r::GUI::GLGizmoBase::use_grabbers ( const wxMouseEvent & mouse_event)
protectedinherited

function which Set up m_dragging and call functions on_start_dragging / on_dragging / on_stop_dragging

Parameters
mouse_eventKeep information about mouse click
Returns
same as on_mouse
444 {
445 bool is_dragging_finished = false;
446 if (mouse_event.Moving()) {
447 // it should not happen but for sure
448 assert(!m_dragging);
449 if (m_dragging) is_dragging_finished = true;
450 else return false;
451 }
452
453 if (mouse_event.LeftDown()) {
454 Selection &selection = m_parent.get_selection();
455 if (!selection.is_empty() && m_hover_id != -1 /* &&
456 (m_grabbers.empty() || m_hover_id < static_cast<int>(m_grabbers.size()))*/) {
457 selection.setup_cache();
458
459 m_dragging = true;
460 for (auto &grabber : m_grabbers) grabber.dragging = false;
461// if (!m_grabbers.empty() && m_hover_id < int(m_grabbers.size()))
462// m_grabbers[m_hover_id].dragging = true;
463
465
466 // Let the plater know that the dragging started
467 m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_STARTED));
468 m_parent.set_as_dirty();
469 return true;
470 }
471 } else if (m_dragging) {
472 // when mouse cursor leave window than finish actual dragging operation
473 bool is_leaving = mouse_event.Leaving() && !m_parent.has_mouse_capture(); // ORCA keep tracking mouse position while drag active and cursor not in window bounds
474 if (mouse_event.Dragging()) {
475 Point mouse_coord(mouse_event.GetX(), mouse_event.GetY());
476 auto ray = m_parent.mouse_ray(mouse_coord);
477 UpdateData data(ray, mouse_coord);
478
479 on_dragging(data);
480
481 wxGetApp().obj_manipul()->set_dirty();
482 m_parent.set_as_dirty();
483 return true;
484 }
485 else if (mouse_event.LeftUp() || is_leaving || is_dragging_finished) {
486 do_stop_dragging(is_leaving);
487 return true;
488 }
489 }
490 return false;
491}
virtual void on_dragging(const UpdateData &data)
Definition GLGizmoBase.hpp:255
virtual void on_start_dragging()
Definition GLGizmoBase.hpp:253
void do_stop_dragging(bool perform_mouse_cleanup)
Definition GLGizmoBase.cpp:493
Kernel::Point_3 Point
Definition MeshRepair.cpp:81
Definition GLGizmoBase.hpp:133

References do_stop_dragging(), Slic3r::GUI::Selection::is_empty(), m_dragging, m_grabbers, m_hover_id, m_parent, on_dragging(), on_start_dragging(), Slic3r::GUI::Selection::setup_cache(), and Slic3r::GUI::wxMouseEvent.

Referenced by Slic3r::GUI::GLGizmoBrimEars::on_mouse(), Slic3r::GUI::GLGizmoCut3D::on_mouse(), Slic3r::GUI::GLGizmoMove3D::on_mouse(), Slic3r::GUI::GLGizmoRotate3D::on_mouse(), Slic3r::GUI::GLGizmoRotate::on_mouse(), Slic3r::GUI::GLGizmoScale3D::on_mouse(), Slic3r::GUI::GLGizmoEmboss::on_mouse_for_rotation(), and Slic3r::GUI::GLGizmoSVG::on_mouse_for_rotation().

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

◆ wants_enter_leave_snapshots()

bool Slic3r::GUI::GLGizmoPainterBase::wants_enter_leave_snapshots ( ) const
inlineoverrideprotectedvirtualinherited

Reimplemented from Slic3r::GUI::GLGizmoBase.

406{ return true; }

Member Data Documentation

◆ AXES_COLOR

◆ AXES_HOVER_COLOR

std::array< ColorRGBA, 3 > Slic3r::GUI::GLGizmoBase::AXES_HOVER_COLOR
staticinherited
Initial value:
= {{
{ColorRGBA::X().r() * 1.2f, ColorRGBA::X().g() * 1.4f, ColorRGBA::X().b() * 1.4f, 1.0f},
{ColorRGBA::Y().r() * 1.2f, ColorRGBA::Y().g() * 1.2f, ColorRGBA::Y().b() * 1.2f, 1.0f},
{ColorRGBA::Z().r() * 1.2f, ColorRGBA::Z().g() * 1.2f, ColorRGBA::Z().b() * 1.2f, 1.0f},
}}
float b() const
Definition Color.hpp:107
float r() const
Definition Color.hpp:105
float g() const
Definition Color.hpp:106

Referenced by Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoRotate::on_render(), and Slic3r::GUI::GLGizmoScale3D::update_grabbers_data().

◆ BASE_ID

const unsigned int Slic3r::GUI::GLGizmoBase::BASE_ID = 255 * 255 * 254
staticinherited

◆ CONSTRAINED_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::CONSTRAINED_COLOR = {0.5f, 0.5f, 0.5f, 1.0f}
staticinherited

◆ count

◆ CursorHeightMax

float Slic3r::GUI::GLGizmoPainterBase::CursorHeightMax = 8.f
staticconstexprprotectedinherited

◆ CursorHeightMin

float Slic3r::GUI::GLGizmoPainterBase::CursorHeightMin = 0.1f
staticconstexprprotectedinherited

◆ CursorHeightStep

float Slic3r::GUI::GLGizmoPainterBase::CursorHeightStep = 0.2f
staticconstexprprotectedinherited

Referenced by get_cursor_height_step().

◆ CursorRadiusMax

◆ CursorRadiusMin

const constexpr float Slic3r::GUI::GLGizmoMmuSegmentation::CursorRadiusMin = 0.1f
staticconstexprprotected

◆ CursorRadiusStep

float Slic3r::GUI::GLGizmoPainterBase::CursorRadiusStep = 0.2f
staticconstexprprotectedinherited

Referenced by get_cursor_radius_step().

◆ DEFAULT_BASE_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::DEFAULT_BASE_COLOR = { 0.625f, 0.625f, 0.625f, 1.0f }
staticinherited

◆ DEFAULT_DRAG_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::DEFAULT_DRAG_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }
staticinherited

◆ DEFAULT_HIGHLIGHT_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::DEFAULT_HIGHLIGHT_COLOR = {1.0f, 0.38f, 0.0f, 1.0f}
staticinherited

◆ EXTRUDERS_LIMIT

const constexpr size_t Slic3r::GUI::GLGizmoMmuSegmentation::EXTRUDERS_LIMIT = static_cast<size_t>(EnforcerBlockerType::ExtruderMax)
staticconstexpr

◆ FLATTEN_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::FLATTEN_COLOR = {0.96f, 0.93f, 0.93f, 0.5f}
staticinherited

◆ FLATTEN_HOVER_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::FLATTEN_HOVER_COLOR = {1.0f, 1.0f, 1.0f, 0.75f}
staticinherited

◆ GRABBER_ELEMENTS_MAX_COUNT

const unsigned int Slic3r::GUI::GLGizmoBase::GRABBER_ELEMENTS_MAX_COUNT = 7
staticinherited

◆ GRABBER_HOVER_COL

ColorRGBA Slic3r::GUI::GLGizmoBase::GRABBER_HOVER_COL = {0.863f, 0.125f, 0.063f, 1.0f}
staticinherited

◆ GRABBER_NORMAL_COL

ColorRGBA Slic3r::GUI::GLGizmoBase::GRABBER_NORMAL_COL = {1.0f, 1.0f, 1.0f, 1.0f}
staticinherited

◆ GRABBER_UNIFORM_COL

ColorRGBA Slic3r::GUI::GLGizmoBase::GRABBER_UNIFORM_COL = {0, 1.0, 1.0, 1.0f}
staticinherited

◆ GRABBER_UNIFORM_HOVER_COL

ColorRGBA Slic3r::GUI::GLGizmoBase::GRABBER_UNIFORM_HOVER_COL = {0, 0.7, 0.7, 1.0f}
staticinherited

◆ INV_ZOOM

◆ last_input_window_width

float Slic3r::GUI::GLGizmoBase::last_input_window_width = 0
protectedinherited

◆ m_button_down

ButtonButton Slic3r::GUI::GLGizmoPainterBase::m_button_down = Button::None
privateinherited

◆ m_c

CommonGizmosDataPool* Slic3r::GUI::GLGizmoBase::m_c { nullptr }
protectedinherited
155{ nullptr };

Referenced by Slic3r::GUI::GLGizmoTextureDisplacement::apply_projection_frame(), Slic3r::GUI::GLGizmoTextureDisplacement::bake(), Slic3r::GUI::GLGizmoTextureDisplacement::capture_view_projection(), Slic3r::GUI::GLGizmoCut3D::check_and_update_connectors_state(), Slic3r::GUI::GLGizmoBrimEars::data_changed(), Slic3r::GUI::GLGizmoCut3D::data_changed(), Slic3r::GUI::GLGizmoMmuSegmentation::data_changed(), Slic3r::GUI::GLGizmoPainterBase::data_changed(), Slic3r::GUI::GLGizmoCut3D::dragging_connector(), Slic3r::GUI::GLGizmoMeshBoolean::generate_new_volume(), Slic3r::GUI::GLGizmoPainterBase::get_clipping_plane_data(), Slic3r::GUI::GLGizmoPainterBase::get_clipping_plane_in_volume_coordinates(), Slic3r::GUI::GLGizmoBrimEars::get_config_options(), Slic3r::GUI::GLGizmoPainterBase::get_projected_height_range(), Slic3r::GUI::GLGizmoPainterBase::get_projected_mouse_positions(), Slic3r::GUI::GLGizmoFdmSupports::get_selection_support_threshold_angle(), Slic3r::GUI::GLGizmoBrimEars::gizmo_event(), Slic3r::GUI::GLGizmoCut3D::gizmo_event(), Slic3r::GUI::GLGizmoMeshBoolean::gizmo_event(), Slic3r::GUI::GLGizmoPainterBase::gizmo_event(), Slic3r::GUI::GLGizmoCut3D::has_valid_contour(), Slic3r::GUI::GLGizmoSimplify::init_model(), Slic3r::GUI::GLGizmoMmuSegmentation::init_model_triangle_selectors(), Slic3r::GUI::GLGizmoFdmSupports::init_print_instance(), Slic3r::GUI::GLGizmoBrimEars::is_mesh_point_clipped(), Slic3r::GUI::GLGizmoPainterBase::is_mesh_point_clipped(), Slic3r::GUI::GLGizmoCut3D::is_outside_of_cut_contour(), Slic3r::GUI::GLGizmoFlatten::is_plane_update_necessary(), Slic3r::GUI::GLGizmoPainterBase::mesh_trafo_matrices(), Slic3r::GUI::GLGizmoFdmSupports::need_regenerate_support_volumes(), Slic3r::GUI::GLGizmoMeshBoolean::on_get_requirements(), Slic3r::GUI::GLGizmoMeshBoolean::on_load(), Slic3r::GUI::GLGizmoTextureDisplacement::on_mouse_adjust_texture(), Slic3r::GUI::GLGizmoCut3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoBrimEars::on_render(), Slic3r::GUI::GLGizmoMeshBoolean::on_render(), Slic3r::GUI::GLGizmoBrimEars::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_render_input_window(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_set_state(), Slic3r::GUI::GLGizmoFdmSupports::on_set_state(), Slic3r::GUI::GLGizmoMmuSegmentation::on_set_state(), Slic3r::GUI::GLGizmoSeam::on_set_state(), Slic3r::GUI::GLGizmoTextureDisplacement::preview_part(), Slic3r::GUI::GLGizmoCut3D::process_contours(), Slic3r::GUI::GLGizmoCut3D::process_selection_rectangle(), Slic3r::GUI::GLGizmoCut3D::put_connectors_on_cut_plane(), Slic3r::GUI::GLGizmoTextureDisplacement::queue_prepare(), Slic3r::GUI::GLGizmoBrimEars::reload_cache(), Slic3r::GUI::GLGizmoMmuSegmentation::remap_filament_assignments(), Slic3r::GUI::GLGizmoTextureDisplacement::render_adjust_texture_gizmo(), Slic3r::GUI::GLGizmoCut3D::render_clipper_cut(), Slic3r::GUI::GLGizmoCut3D::render_connectors(), Slic3r::GUI::GLGizmoCut3D::render_debug_input_window(), Slic3r::GUI::GLGizmoPainterBase::render_follows_cursor(), Slic3r::GUI::GLGizmoTextureDisplacement::render_island_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_paint_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painted_colors(), Slic3r::GUI::GLGizmoFdmSupports::render_painter_gizmo(), Slic3r::GUI::GLGizmoFuzzySkin::render_painter_gizmo(), Slic3r::GUI::GLGizmoMmuSegmentation::render_painter_gizmo(), Slic3r::GUI::GLGizmoSeam::render_painter_gizmo(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painter_gizmo(), Slic3r::GUI::GLGizmoBrimEars::render_points(), Slic3r::GUI::GLGizmoTextureDisplacement::render_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_seam_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_shaded_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_subdivide_preview(), Slic3r::GUI::GLGizmoPainterBase::render_triangles(), Slic3r::GUI::GLGizmoTextureDisplacement::render_uvcheck_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_wireframe_overlay(), Slic3r::GUI::GLGizmoCut3D::reset_connectors(), Slic3r::GUI::GLGizmoFdmSupports::run_thread(), Slic3r::GUI::GLGizmoTextureDisplacement::seam_edge_at(), Slic3r::GUI::GLGizmoTextureDisplacement::seam_vertex_at(), Slic3r::GUI::GLGizmoFdmSupports::select_facets_by_angle(), Slic3r::GUI::GLGizmoTextureDisplacement::select_visible_faces(), Slic3r::GUI::GLGizmoTextureDisplacement::select_whole_model(), Slic3r::GUI::GLGizmoBrimEars::set_brim_data(), set_common_data_pool(), Slic3r::GUI::GLGizmoCut3D::set_connectors_editing(), Slic3r::GUI::GLGizmoTextureDisplacement::shaded_preview_ready(), Slic3r::GUI::GLGizmoTextureDisplacement::smooth_model(), Slic3r::GUI::GLGizmoTextureDisplacement::subdivide_model(), Slic3r::GUI::GLGizmoTextureDisplacement::swap_layer_slots(), Slic3r::GUI::GLGizmoCut3D::switch_to_mode(), Slic3r::GUI::GLGizmoTextureDisplacement::texture_parts(), Slic3r::GUI::GLGizmoTextureDisplacement::texture_volume(), Slic3r::GUI::GLGizmoTextureDisplacement::texture_volume_raycaster_index(), Slic3r::GUI::GLGizmoCut3D::unproject_on_cut_plane(), Slic3r::GUI::GLGizmoBrimEars::unproject_on_mesh(), Slic3r::GUI::GLGizmoBrimEars::unproject_on_mesh2(), Slic3r::GUI::GLGizmoCut3D::update_bb(), Slic3r::GUI::GLGizmoCut3D::update_clipper(), Slic3r::GUI::GLGizmoFdmSupports::update_from_model_object(), Slic3r::GUI::GLGizmoFuzzySkin::update_from_model_object(), Slic3r::GUI::GLGizmoSeam::update_from_model_object(), Slic3r::GUI::GLGizmoTextureDisplacement::update_from_model_object(), Slic3r::GUI::GLGizmoBrimEars::update_model_object(), Slic3r::GUI::GLGizmoFdmSupports::update_model_object(), Slic3r::GUI::GLGizmoFuzzySkin::update_model_object(), Slic3r::GUI::GLGizmoMmuSegmentation::update_model_object(), Slic3r::GUI::GLGizmoSeam::update_model_object(), Slic3r::GUI::GLGizmoTextureDisplacement::update_model_object(), Slic3r::GUI::GLGizmoFlatten::update_planes(), Slic3r::GUI::GLGizmoPainterBase::update_raycast_cache(), and Slic3r::GUI::GLGizmoCut3D::update_raycasters_for_picking_transform().

◆ m_circle

GLModel Slic3r::GUI::GLGizmoPainterBase::m_circle
protectedinherited

Referenced by render_cursor_circle().

◆ m_current_tool

wchar_t Slic3r::GUI::GLGizmoMmuSegmentation::m_current_tool = 0
protected

◆ m_cursor_height

float Slic3r::GUI::GLGizmoPainterBase::m_cursor_height = 0.2f
protectedinherited

◆ m_cursor_radius

◆ m_cursor_type

◆ m_cursor_z

float Slic3r::GUI::GLGizmoPainterBase::m_cursor_z {0}
mutableprivateinherited
386{0};

◆ m_cut_contours

std::vector<CutContours> Slic3r::GUI::GLGizmoPainterBase::m_cut_contours
mutableprivateinherited

◆ m_desc

std::map<std::string, wxString> Slic3r::GUI::GLGizmoMmuSegmentation::m_desc
private

Referenced by on_init(), and on_render_input_window().

◆ m_detect_geometry_edge

bool Slic3r::GUI::GLGizmoMmuSegmentation::m_detect_geometry_edge = true
protected

Referenced by on_render_input_window().

◆ m_dirty

bool Slic3r::GUI::GLGizmoBase::m_dirty { false }
privateinherited
293{ false };

Referenced by set_dirty(), and update_items_state().

◆ m_dragging

◆ m_extruder_remap

std::vector<size_t> Slic3r::GUI::GLGizmoMmuSegmentation::m_extruder_remap
protected

◆ m_extruders_colors

◆ m_first_input_window_render

bool Slic3r::GUI::GLGizmoBase::m_first_input_window_render { true }
protectedinherited
154{ true };

Referenced by render_input_window().

◆ m_grabbers

◆ m_gradient_ramps

std::vector<std::vector<wxColour> > Slic3r::GUI::GLGizmoMmuSegmentation::m_gradient_ramps
protected

Referenced by gradient_of(), and init_extruders_data().

◆ m_group_id

int Slic3r::GUI::GLGizmoBase::m_group_id
protectedinherited

◆ m_height_start_pos

Vec2i32 Slic3r::GUI::GLGizmoPainterBase::m_height_start_pos {0, 0}
mutableprivateinherited
389{0, 0};

◆ m_height_start_z_in_imgui

double Slic3r::GUI::GLGizmoPainterBase::m_height_start_z_in_imgui {0}
mutableprivateinherited
387{0};

◆ m_highlight_by_angle_threshold_deg

◆ m_horizontal_only

bool Slic3r::GUI::GLGizmoPainterBase::m_horizontal_only = false
protectedinherited

◆ m_hover_id

int Slic3r::GUI::GLGizmoBase::m_hover_id { -1 }
protectedinherited
150{ -1 };

Referenced by Slic3r::GUI::GLGizmoScale3D::calc_ratio(), Slic3r::GUI::GLGizmoScale3D::do_scale_along_axis(), Slic3r::GUI::GLGizmoScale3D::do_scale_uniform(), Slic3r::GUI::GLGizmoCut3D::dragging_connector(), Slic3r::GUI::GLGizmoCut3D::dragging_grabber_move(), Slic3r::GUI::GLGizmoCut3D::dragging_grabber_rotation(), get_hover_id(), Slic3r::GUI::GLGizmoCut3D::get_tooltip(), Slic3r::GUI::GLGizmoMove3D::get_tooltip(), Slic3r::GUI::GLGizmoRotate::get_tooltip(), Slic3r::GUI::GLGizmoScale3D::get_tooltip(), Slic3r::GUI::GLGizmoBrimEars::gizmo_event(), Slic3r::GUI::GLGizmoCut3D::gizmo_event(), Slic3r::GUI::GLGizmoCut3D::is_selection_changed(), Slic3r::GUI::GLGizmoBrimEars::on_dragging(), Slic3r::GUI::GLGizmoCut3D::on_dragging(), Slic3r::GUI::GLGizmoMove3D::on_dragging(), Slic3r::GUI::GLGizmoRotate3D::on_dragging(), Slic3r::GUI::GLGizmoScale3D::on_dragging(), Slic3r::GUI::GLGizmoCut3D::on_mouse(), Slic3r::GUI::GLGizmoFlatten::on_mouse(), Slic3r::GUI::GLGizmoMeasure::on_mouse(), Slic3r::GUI::GLGizmoFlatten::on_render(), Slic3r::GUI::GLGizmoMeasure::on_render(), Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoRotate3D::on_render(), Slic3r::GUI::GLGizmoRotate::on_render(), Slic3r::GUI::GLGizmoScale3D::on_render(), Slic3r::GUI::GLGizmoBrimEars::on_set_hover_id(), Slic3r::GUI::GLGizmoEmboss::on_set_hover_id(), Slic3r::GUI::GLGizmoRotate3D::on_set_hover_id(), Slic3r::GUI::GLGizmoSVG::on_set_hover_id(), Slic3r::GUI::GLGizmoMeasure::on_set_state(), Slic3r::GUI::GLGizmoBrimEars::on_start_dragging(), Slic3r::GUI::GLGizmoCut3D::on_start_dragging(), Slic3r::GUI::GLGizmoMove3D::on_start_dragging(), Slic3r::GUI::GLGizmoRotate3D::on_start_dragging(), Slic3r::GUI::GLGizmoScale3D::on_start_dragging(), Slic3r::GUI::GLGizmoBrimEars::on_stop_dragging(), Slic3r::GUI::GLGizmoCut3D::on_stop_dragging(), Slic3r::GUI::GLGizmoRotate3D::on_stop_dragging(), Slic3r::GUI::GLGizmoCut3D::render_connectors(), Slic3r::GUI::GLGizmoCut3D::render_cut_plane_grabbers(), Slic3r::GUI::GLGizmoCut3D::render_flip_plane_button(), render_grabbers(), Slic3r::GUI::GLGizmoBrimEars::render_points(), set_hover_id(), Slic3r::GUI::GLGizmoMeasure::show_selection_ui(), Slic3r::GUI::GLGizmoScale3D::update_grabbers_data(), and use_grabbers().

◆ m_icon_filename

std::string Slic3r::GUI::GLGizmoBase::m_icon_filename
protectedinherited

◆ m_imgui

ImGuiWrapper* Slic3r::GUI::GLGizmoBase::m_imgui
protectedinherited

Referenced by GLGizmoBase(), Slic3r::GUI::GLGizmoEmboss::GLGizmoEmboss(), Slic3r::GUI::GLGizmoCut3D::add_horizontal_scaled_interval(), Slic3r::GUI::GLGizmoCut3D::add_vertical_scaled_interval(), Slic3r::GUI::GLGizmoSimplify::create_gui_cfg(), Slic3r::GUI::GLGizmoEmboss::draw_advanced(), Slic3r::GUI::GLGizmoEmboss::draw_bold_button(), Slic3r::GUI::GLGizmoEmboss::draw_delete_style_button(), Slic3r::GUI::GLGizmoSVG::draw_depth(), Slic3r::GUI::GLGizmoSVG::draw_distance(), Slic3r::GUI::GLGizmoSVG::draw_filename(), Slic3r::GUI::GLGizmoEmboss::draw_font_list(), Slic3r::GUI::GLGizmoEmboss::draw_font_list_line(), Slic3r::GUI::GLGizmoEmboss::draw_italic_button(), Slic3r::GUI::GLGizmoSVG::draw_mirroring(), Slic3r::GUI::GLGizmoEmboss::draw_model_type(), Slic3r::GUI::GLGizmoSVG::draw_model_type(), Slic3r::GUI::GLGizmoSVG::draw_rotation(), Slic3r::GUI::GLGizmoSVG::draw_size(), Slic3r::GUI::GLGizmoEmboss::draw_style_add_button(), Slic3r::GUI::GLGizmoEmboss::draw_style_list(), Slic3r::GUI::GLGizmoEmboss::draw_style_rename_button(), Slic3r::GUI::GLGizmoEmboss::draw_style_rename_popup(), Slic3r::GUI::GLGizmoEmboss::draw_style_save_as_popup(), Slic3r::GUI::GLGizmoEmboss::draw_style_save_button(), Slic3r::GUI::GLGizmoEmboss::draw_text_input(), Slic3r::GUI::GLGizmoSVG::draw_use_surface(), Slic3r::GUI::GLGizmoEmboss::draw_window(), GizmoImguiBegin(), GizmoImguiEnd(), GizmoImguiSetNextWIndowPos(), Slic3r::GUI::GLGizmoCut3D::init_input_window_data(), Slic3r::GUI::GLGizmoMeasure::on_mouse(), Slic3r::GUI::GLGizmoAssembly::on_render_input_window(), Slic3r::GUI::GLGizmoBrimEars::on_render_input_window(), Slic3r::GUI::GLGizmoEmboss::on_render_input_window(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMeasure::on_render_input_window(), Slic3r::GUI::GLGizmoMeshBoolean::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoMove3D::on_render_input_window(), Slic3r::GUI::GLGizmoRotate3D::on_render_input_window(), Slic3r::GUI::GLGizmoScale3D::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoSimplify::on_render_input_window(), Slic3r::GUI::GLGizmoSVG::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::panel_tooltip(), Slic3r::GUI::GLGizmoCut3D::render_angle_input(), Slic3r::GUI::GLGizmoCut3D::render_build_size(), Slic3r::GUI::GLGizmoCut3D::render_color_marker(), render_combo(), Slic3r::GUI::GLGizmoCut3D::render_connectors_input_window(), Slic3r::GUI::GLGizmoCut3D::render_cut_mode_combo(), Slic3r::GUI::GLGizmoCut3D::render_cut_plane_input_window(), Slic3r::GUI::GLGizmoCut3D::render_debug_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::render_debug_stage_panel(), Slic3r::GUI::GLGizmoMeasure::render_dimensioning(), Slic3r::GUI::GLGizmoCut3D::render_double_input(), Slic3r::GUI::GLGizmoMmuSegmentation::render_filament_remap_ui(), Slic3r::GUI::GLGizmoCut3D::render_flip_plane_button(), Slic3r::GUI::GLGizmoCut3D::render_groove_float_input(), Slic3r::GUI::GLGizmoCut3D::render_groove_int_input(), Slic3r::GUI::GLGizmoCut3D::render_groove_two_float_input(), Slic3r::GUI::GLGizmoTextureDisplacement::render_image_adjust_window(), Slic3r::GUI::GLGizmoAssembly::render_input_window_warning(), Slic3r::GUI::GLGizmoCut3D::render_input_window_warning(), Slic3r::GUI::GLGizmoCut3D::render_move_center_input(), Slic3r::GUI::GLGizmoCut3D::render_reset_button(), Slic3r::GUI::GLGizmoCut3D::render_slider_input(), Slic3r::GUI::GLGizmoCut3D::render_slider_two_input(), Slic3r::GUI::GLGizmoCut3D::render_snap_specific_input(), Slic3r::GUI::GLGizmoTextureDisplacement::render_texture_library_popup(), Slic3r::GUI::GLGizmoTextureDisplacement::render_tip_media(), Slic3r::GUI::GLGizmoCut3D::render_tooltip_button(), Slic3r::GUI::GLGizmoFdmSupports::render_tooltip_button(), Slic3r::GUI::GLGizmoFuzzySkin::render_tooltip_button(), Slic3r::GUI::GLGizmoMmuSegmentation::render_tooltip_button(), Slic3r::GUI::GLGizmoPainterBase::render_triangles(), Slic3r::GUI::GLGizmoEmboss::rev_checkbox(), Slic3r::GUI::GLGizmoEmboss::rev_input(), Slic3r::GUI::GLGizmoEmboss::rev_slider(), Slic3r::GUI::GLGizmoEmboss::rev_slider(), Slic3r::GUI::GLGizmoEmboss::rev_slider(), Slic3r::GUI::GLGizmoEmboss::revertible(), Slic3r::GUI::GLGizmoMeasure::show_distance_xyz_ui(), Slic3r::GUI::GLGizmoMeasure::show_face_face_assembly_common(), Slic3r::GUI::GLGizmoMeasure::show_face_face_assembly_senior(), and Slic3r::GUI::GLGizmoMeasure::show_selection_ui().

◆ m_internal_stack_active

bool Slic3r::GUI::GLGizmoPainterBase::m_internal_stack_active = false
privateinherited

◆ m_is_cursor_in_imgui

bool Slic3r::GUI::GLGizmoPainterBase::m_is_cursor_in_imgui {false}
mutableprivateinherited
390{false};

◆ m_is_dark_mode

◆ m_is_set_height_start_z_by_imgui

bool Slic3r::GUI::GLGizmoPainterBase::m_is_set_height_start_z_by_imgui {false}
mutableprivateinherited
388{false};

◆ m_last_mouse_click

Vec2d Slic3r::GUI::GLGizmoPainterBase::m_last_mouse_click = Vec2d::Zero()
privateinherited

◆ m_old_center

Vec2d Slic3r::GUI::GLGizmoPainterBase::m_old_center { Vec2d::Zero() }
protectedinherited
308{ Vec2d::Zero() };

Referenced by render_cursor_circle().

◆ m_old_cursor_radius

float Slic3r::GUI::GLGizmoPainterBase::m_old_cursor_radius { 0.0f }
protectedinherited
309{ 0.0f };

Referenced by render_cursor_circle().

◆ m_old_mo_id

ObjectID Slic3r::GUI::GLGizmoPainterBase::m_old_mo_id
privateinherited

Referenced by data_changed(), and on_set_state().

◆ m_old_state

EState Slic3r::GUI::GLGizmoPainterBase::m_old_state = Off
privateinherited

Referenced by on_set_state().

◆ m_old_volumes_size

size_t Slic3r::GUI::GLGizmoPainterBase::m_old_volumes_size = 0
privateinherited

Referenced by data_changed().

◆ m_paint_on_overhangs_only

bool Slic3r::GUI::GLGizmoPainterBase::m_paint_on_overhangs_only = false
protectedinherited

◆ m_parent

GLCanvas3D& Slic3r::GUI::GLGizmoBase::m_parent
protectedinherited

Referenced by GLGizmoBase(), Slic3r::GUI::GLGizmoCut3D::add_connector(), Slic3r::GUI::GLGizmoTextureDisplacement::add_texture_layer(), Slic3r::GUI::GLGizmoCut3D::apply_color_clip_plane_colors(), Slic3r::GUI::GLGizmoTextureDisplacement::apply_projection_frame(), Slic3r::GUI::GLGizmoSimplify::apply_simplify(), Slic3r::GUI::GLGizmoTextureDisplacement::apply_view_mode(), Slic3r::GUI::GLGizmoBrimEars::auto_generate(), Slic3r::GUI::GLGizmoTextureDisplacement::bake(), Slic3r::GUI::GLGizmoCut3D::bounding_box(), Slic3r::GUI::GLGizmoPainterBase::bounding_box(), Slic3r::GUI::GLGizmoEmboss::calculate_scale(), Slic3r::GUI::GLGizmoSVG::calculate_scale(), Slic3r::GUI::GLGizmoTextureDisplacement::capture_view_projection(), Slic3r::GUI::GLGizmoMove3D::change_cs_by_selection(), Slic3r::GUI::GLGizmoScale3D::change_cs_by_selection(), Slic3r::GUI::GLGizmoEmboss::close(), Slic3r::GUI::GLGizmoSimplify::close(), Slic3r::GUI::GLGizmoSVG::close(), Slic3r::GUI::GLGizmoTextureDisplacement::close_image_adjust(), Slic3r::GUI::GLGizmoEmboss::create_volume(), Slic3r::GUI::GLGizmoEmboss::create_volume(), Slic3r::GUI::GLGizmoSVG::create_volume(), Slic3r::GUI::GLGizmoSVG::create_volume(), Slic3r::GUI::GLGizmoSVG::create_volume(), Slic3r::GUI::GLGizmoSVG::create_volume(), Slic3r::GUI::GLGizmoFlatten::data_changed(), Slic3r::GUI::GLGizmoMeasure::data_changed(), Slic3r::GUI::GLGizmoMove3D::data_changed(), Slic3r::GUI::GLGizmoPainterBase::data_changed(), Slic3r::GUI::GLGizmoRotate3D::data_changed(), Slic3r::GUI::GLGizmoScale3D::data_changed(), Slic3r::GUI::GLGizmoCut3D::delete_selected_connectors(), Slic3r::GUI::GLGizmoEmboss::do_mirror(), do_stop_dragging(), Slic3r::GUI::GLGizmoEmboss::draw_advanced(), Slic3r::GUI::GLGizmoSVG::draw_distance(), Slic3r::GUI::GLGizmoSVG::draw_face_the_camera(), Slic3r::GUI::GLGizmoSVG::draw_filename(), Slic3r::GUI::GLGizmoSVG::draw_mirroring(), Slic3r::GUI::GLGizmoEmboss::draw_model_type(), Slic3r::GUI::GLGizmoSVG::draw_model_type(), Slic3r::GUI::GLGizmoSVG::draw_rotation(), Slic3r::GUI::GLGizmoSVG::draw_size(), Slic3r::GUI::GLGizmoEmboss::draw_style_list(), Slic3r::GUI::GLGizmoEmboss::draw_window(), Slic3r::GUI::GLGizmoTextureDisplacement::ease_wheel_scroll(), Slic3r::GUI::GLGizmoBrimEars::find_single(), Slic3r::GUI::GLGizmoBrimEars::first_layer_slicer(), Slic3r::GUI::GLGizmoMeshBoolean::generate_new_volume(), Slic3r::GUI::GLGizmoPainterBase::get_projected_height_range(), Slic3r::GUI::GLGizmoMove3D::get_tooltip(), Slic3r::GUI::GLGizmoScale3D::get_tooltip(), Slic3r::GUI::GLGizmoBrimEars::gizmo_event(), Slic3r::GUI::GLGizmoMeasure::gizmo_event(), Slic3r::GUI::GLGizmoMeshBoolean::gizmo_event(), Slic3r::GUI::GLGizmoPainterBase::gizmo_event(), GizmoImguiSetNextWIndowPos(), Slic3r::GUI::GLGizmoCut3D::has_valid_groove(), Slic3r::GUI::GLGizmoSimplify::init_model(), Slic3r::GUI::GLGizmoMeasure::init_plane_glmodel(), Slic3r::GUI::GLGizmoFdmSupports::init_print_instance(), Slic3r::GUI::GLGizmoPainterBase::mesh_trafo_matrices(), Slic3r::GUI::GLGizmoTextureDisplacement::move_texture_layer(), Slic3r::GUI::GLGizmoMove3D::on_dragging(), Slic3r::GUI::GLGizmoAssembly::on_is_activable(), Slic3r::GUI::GLGizmoBrimEars::on_is_activable(), Slic3r::GUI::GLGizmoCut3D::on_is_activable(), Slic3r::GUI::GLGizmoFlatten::on_is_activable(), Slic3r::GUI::GLGizmoMeasure::on_is_activable(), Slic3r::GUI::GLGizmoMeshBoolean::on_is_activable(), Slic3r::GUI::GLGizmoMmuSegmentation::on_is_activable(), Slic3r::GUI::GLGizmoMove3D::on_is_activable(), Slic3r::GUI::GLGizmoPainterBase::on_is_activable(), Slic3r::GUI::GLGizmoRotate3D::on_is_activable(), Slic3r::GUI::GLGizmoScale3D::on_is_activable(), Slic3r::GUI::GLGizmoSimplify::on_is_activable(), Slic3r::GUI::GLGizmoTextureDisplacement::on_is_activable(), Slic3r::GUI::GLGizmoTextureDisplacement::on_island_edited(), Slic3r::GUI::GLGizmoCut3D::on_load(), Slic3r::GUI::GLGizmoBrimEars::on_mouse(), Slic3r::GUI::GLGizmoCut3D::on_mouse(), Slic3r::GUI::GLGizmoEmboss::on_mouse(), Slic3r::GUI::GLGizmoFlatten::on_mouse(), Slic3r::GUI::GLGizmoMeasure::on_mouse(), Slic3r::GUI::GLGizmoPainterBase::on_mouse(), Slic3r::GUI::GLGizmoRotate3D::on_mouse(), Slic3r::GUI::GLGizmoScale3D::on_mouse(), Slic3r::GUI::GLGizmoSVG::on_mouse(), Slic3r::GUI::GLGizmoTextureDisplacement::on_mouse_adjust_texture(), Slic3r::GUI::GLGizmoEmboss::on_mouse_change_selection(), Slic3r::GUI::GLGizmoEmboss::on_mouse_for_rotation(), Slic3r::GUI::GLGizmoSVG::on_mouse_for_rotation(), Slic3r::GUI::GLGizmoEmboss::on_mouse_for_translate(), Slic3r::GUI::GLGizmoSVG::on_mouse_for_translate(), Slic3r::GUI::GLGizmoTextureDisplacement::on_mouse_seam(), Slic3r::GUI::GLGizmoFdmSupports::on_opening(), Slic3r::GUI::GLGizmoCut3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoFlatten::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoMove3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoRotate3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoScale3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoBrimEars::on_render(), Slic3r::GUI::GLGizmoCut3D::on_render(), Slic3r::GUI::GLGizmoEmboss::on_render(), Slic3r::GUI::GLGizmoFlatten::on_render(), Slic3r::GUI::GLGizmoMeasure::on_render(), Slic3r::GUI::GLGizmoMeshBoolean::on_render(), Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoRotate::on_render(), Slic3r::GUI::GLGizmoSimplify::on_render(), Slic3r::GUI::GLGizmoSVG::on_render(), Slic3r::GUI::GLGizmoAssembly::on_render_input_window(), Slic3r::GUI::GLGizmoBrimEars::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_render_input_window(), Slic3r::GUI::GLGizmoEmboss::on_render_input_window(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMeasure::on_render_input_window(), Slic3r::GUI::GLGizmoMeshBoolean::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoSimplify::on_render_input_window(), Slic3r::GUI::GLGizmoSVG::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_set_state(), Slic3r::GUI::GLGizmoEmboss::on_set_state(), Slic3r::GUI::GLGizmoMeasure::on_set_state(), Slic3r::GUI::GLGizmoMmuSegmentation::on_set_state(), Slic3r::GUI::GLGizmoPainterBase::on_set_state(), Slic3r::GUI::GLGizmoSimplify::on_set_state(), Slic3r::GUI::GLGizmoSVG::on_set_state(), Slic3r::GUI::GLGizmoEmboss::on_shortcut_key(), Slic3r::GUI::GLGizmoFdmSupports::on_shutdown(), Slic3r::GUI::GLGizmoFuzzySkin::on_shutdown(), Slic3r::GUI::GLGizmoMmuSegmentation::on_shutdown(), Slic3r::GUI::GLGizmoSeam::on_shutdown(), Slic3r::GUI::GLGizmoTextureDisplacement::on_shutdown(), Slic3r::GUI::GLGizmoMove3D::on_start_dragging(), Slic3r::GUI::GLGizmoRotate::on_start_dragging(), Slic3r::GUI::GLGizmoEmboss::on_stop_dragging(), Slic3r::GUI::GLGizmoMove3D::on_stop_dragging(), Slic3r::GUI::GLGizmoRotate3D::on_stop_dragging(), Slic3r::GUI::GLGizmoScale3D::on_stop_dragging(), Slic3r::GUI::GLGizmoSVG::on_stop_dragging(), Slic3r::GUI::GLGizmoBrimEars::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoCut3D::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoFlatten::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoMove3D::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoRotate3D::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoScale3D::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoTextureDisplacement::on_uv_command(), Slic3r::GUI::GLGizmoTextureDisplacement::panel_tooltip(), Slic3r::GUI::GLGizmoCut3D::perform_cut(), Slic3r::GUI::GLGizmoEmboss::process(), Slic3r::GUI::GLGizmoSVG::process(), Slic3r::GUI::GLGizmoCut3D::process_contours(), Slic3r::GUI::GLGizmoCut3D::process_cut_line(), Slic3r::GUI::GLGizmoTextureDisplacement::queue_prepare(), Slic3r::GUI::GLGizmoTextureDisplacement::queue_preview_job(), Slic3r::GUI::GLGizmoBrimEars::register_single_mesh_pick(), Slic3r::GUI::GLGizmoMeasure::register_single_mesh_pick(), Slic3r::GUI::GLGizmoEmboss::reinit_text_lines(), Slic3r::GUI::GLGizmoMmuSegmentation::remap_filament_assignments(), Slic3r::GUI::GLGizmoTextureDisplacement::remove_texture_layer(), Slic3r::GUI::GLGizmoTextureDisplacement::render_adjust_texture_gizmo(), Slic3r::GUI::GLGizmoMove3D::render_align_preview(), Slic3r::GUI::GLGizmoAssembly::render_assembly_mode_combo(), render_combo(), Slic3r::GUI::GLGizmoCut3D::render_connectors_input_window(), Slic3r::GUI::GLGizmoPainterBase::render_cursor(), Slic3r::GUI::GLGizmoPainterBase::render_cursor_circle(), Slic3r::GUI::GLGizmoPainterBase::render_cursor_height_range(), Slic3r::GUI::GLGizmoCut3D::render_cut_mode_combo(), Slic3r::GUI::GLGizmoCut3D::render_cut_plane_input_window(), Slic3r::GUI::GLGizmoMeasure::render_dimensioning(), Slic3r::GUI::GLGizmoMeasure::render_follows_cursor(), Slic3r::GUI::GLGizmoPainterBase::render_follows_cursor(), Slic3r::GUI::GLGizmoTextureDisplacement::render_image_adjust_window(), render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::render_island_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_paint_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painted_colors(), Slic3r::GUI::GLGizmoFdmSupports::render_painter_gizmo(), Slic3r::GUI::GLGizmoFuzzySkin::render_painter_gizmo(), Slic3r::GUI::GLGizmoMmuSegmentation::render_painter_gizmo(), Slic3r::GUI::GLGizmoSeam::render_painter_gizmo(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painter_gizmo(), Slic3r::GUI::GLGizmoTextureDisplacement::render_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_seam_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_shaded_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_subdivide_preview(), Slic3r::GUI::GLGizmoTextureDisplacement::render_texture_library_popup(), Slic3r::GUI::GLGizmoTextureDisplacement::render_tip_media(), Slic3r::GUI::GLGizmoCut3D::render_tooltip_button(), Slic3r::GUI::GLGizmoFdmSupports::render_tooltip_button(), Slic3r::GUI::GLGizmoFuzzySkin::render_tooltip_button(), Slic3r::GUI::GLGizmoMmuSegmentation::render_tooltip_button(), Slic3r::GUI::GLGizmoPainterBase::render_triangles(), Slic3r::GUI::GLGizmoTextureDisplacement::render_uvcheck_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_wireframe_overlay(), Slic3r::GUI::GLGizmoSimplify::request_rerender(), Slic3r::GUI::GLGizmoCut3D::reset_cut_plane(), Slic3r::GUI::GLGizmoEmboss::reset_to_default_style(), Slic3r::GUI::GLGizmoTextureDisplacement::run_stage_debug(), Slic3r::GUI::GLGizmoFdmSupports::run_thread(), Slic3r::GUI::GLGizmoTextureDisplacement::run_uv_command(), Slic3r::GUI::GLGizmoTextureDisplacement::seam_edge_at(), Slic3r::GUI::GLGizmoTextureDisplacement::seam_vertex_at(), Slic3r::GUI::GLGizmoFdmSupports::select_facets_by_angle(), Slic3r::GUI::GLGizmoTextureDisplacement::select_visible_faces(), Slic3r::GUI::GLGizmoTextureDisplacement::select_whole_model(), Slic3r::GUI::GLGizmoCut3D::set_connectors_editing(), Slic3r::GUI::GLGizmoMeasure::set_distance(), Slic3r::GUI::GLGizmoTextureDisplacement::set_layer_texture(), Slic3r::GUI::GLGizmoMeasure::set_parallel_distance(), Slic3r::GUI::GLGizmoMeasure::set_to_around_center_of_faces(), Slic3r::GUI::GLGizmoMeasure::set_to_parallel(), Slic3r::GUI::GLGizmoMeasure::set_to_reverse_rotation(), Slic3r::GUI::GLGizmoEmboss::set_volume_by_selection(), Slic3r::GUI::GLGizmoSVG::set_volume_by_selection(), Slic3r::GUI::GLGizmoCut3D::set_volumes_picking_state(), Slic3r::GUI::GLGizmoTextureDisplacement::show_debug_stage(), Slic3r::GUI::GLGizmoTextureDisplacement::show_projector(), Slic3r::GUI::GLGizmoTextureDisplacement::smooth_model(), Slic3r::GUI::GLGizmoTextureDisplacement::subdivide_model(), Slic3r::GUI::GLGizmoCut3D::toggle_model_objects_visibility(), Slic3r::GUI::GLGizmoCut3D::transformed_bounding_box(), Slic3r::GUI::GLGizmoBrimEars::unproject_on_mesh(), Slic3r::GUI::GLGizmoCut3D::update_bb(), Slic3r::GUI::GLGizmoBrimEars::update_cache_radius(), Slic3r::GUI::GLGizmoCut3D::update_clipper(), Slic3r::GUI::GLGizmoPainterBase::update_contours(), Slic3r::GUI::GLGizmoScale3D::update_grabbers_data(), Slic3r::GUI::GLGizmoTextureDisplacement::update_image_adjust_preview(), Slic3r::GUI::GLGizmoBrimEars::update_model_object(), Slic3r::GUI::GLGizmoFdmSupports::update_model_object(), Slic3r::GUI::GLGizmoFuzzySkin::update_model_object(), Slic3r::GUI::GLGizmoMmuSegmentation::update_model_object(), Slic3r::GUI::GLGizmoSeam::update_model_object(), Slic3r::GUI::GLGizmoTextureDisplacement::update_model_object(), Slic3r::GUI::GLGizmoPainterBase::update_raycast_cache(), Slic3r::GUI::GLGizmoBrimEars::update_raycasters(), use_grabbers(), Slic3r::GUI::GLGizmoEmboss::volume_transformation_changed(), Slic3r::GUI::GLGizmoSVG::volume_transformation_changed(), and Slic3r::GUI::GLGizmoEmboss::volume_transformation_changing().

◆ m_rr

RaycastResult Slic3r::GUI::GLGizmoPainterBase::m_rr = {Vec2d::Zero(), -1, Vec3f::Zero(), 0}
mutableprivateinherited

◆ m_schedule_update

bool Slic3r::GUI::GLGizmoPainterBase::m_schedule_update = false
privateinherited

Referenced by data_changed(), and on_load().

◆ m_seed_fill_last_mesh_id

◆ m_selected_extruder_idx

size_t Slic3r::GUI::GLGizmoMmuSegmentation::m_selected_extruder_idx = 0
protected

◆ m_shortcut

◆ m_shortcuts_brush

std::vector<std::pair<wxString, wxString> > Slic3r::GUI::GLGizmoMmuSegmentation::m_shortcuts_brush
private

Referenced by on_init(), and render_tooltip_button().

◆ m_shortcuts_bucket_fill

std::vector<std::pair<wxString, wxString> > Slic3r::GUI::GLGizmoMmuSegmentation::m_shortcuts_bucket_fill
private

Referenced by on_init(), and render_tooltip_button().

◆ m_shortcuts_gap_fill

std::vector<std::pair<wxString, wxString> > Slic3r::GUI::GLGizmoMmuSegmentation::m_shortcuts_gap_fill
private

Referenced by on_init(), and render_tooltip_button().

◆ m_smart_fill_angle

◆ m_sprite_id

unsigned int Slic3r::GUI::GLGizmoBase::m_sprite_id
protectedinherited

Referenced by GLGizmoBase(), and get_sprite_id().

◆ m_state

◆ m_tool_type

◆ m_triangle_selectors

std::vector<std::unique_ptr<TriangleSelectorGUI> > Slic3r::GUI::GLGizmoPainterBase::m_triangle_selectors
protectedinherited

Referenced by gizmo_event(), Slic3r::GUI::GLGizmoMmuSegmentation::init_model_triangle_selectors(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), on_set_state(), Slic3r::GUI::GLGizmoTextureDisplacement::rebuild_paint_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::rebuild_shaded_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::rebuild_uvcheck_mesh(), Slic3r::GUI::GLGizmoMmuSegmentation::remap_filament_assignments(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painter_gizmo(), render_triangles(), Slic3r::GUI::GLGizmoFdmSupports::select_facets_by_angle(), Slic3r::GUI::GLGizmoTextureDisplacement::select_visible_faces(), Slic3r::GUI::GLGizmoTextureDisplacement::select_whole_model(), Slic3r::GUI::GLGizmoFdmSupports::tool_changed(), Slic3r::GUI::GLGizmoMmuSegmentation::tool_changed(), Slic3r::GUI::GLGizmoSeam::tool_changed(), Slic3r::GUI::GLGizmoFdmSupports::update_from_model_object(), Slic3r::GUI::GLGizmoFuzzySkin::update_from_model_object(), Slic3r::GUI::GLGizmoSeam::update_from_model_object(), Slic3r::GUI::GLGizmoTextureDisplacement::update_from_model_object(), Slic3r::GUI::GLGizmoFdmSupports::update_model_object(), Slic3r::GUI::GLGizmoFuzzySkin::update_model_object(), Slic3r::GUI::GLGizmoMmuSegmentation::update_model_object(), Slic3r::GUI::GLGizmoSeam::update_model_object(), Slic3r::GUI::GLGizmoTextureDisplacement::update_model_object(), Slic3r::GUI::GLGizmoMmuSegmentation::update_triangle_selectors_colors(), and Slic3r::GUI::GLGizmoMmuSegmentation::update_used_filaments().

◆ m_triangle_splitting_enabled

bool Slic3r::GUI::GLGizmoPainterBase::m_triangle_splitting_enabled = true
protectedinherited

Referenced by gizmo_event().

◆ m_used_filaments

std::set<size_t> Slic3r::GUI::GLGizmoMmuSegmentation::m_used_filaments
protected

◆ m_vertical_only

◆ m_volumes_extruder_idxs

std::vector<int> Slic3r::GUI::GLGizmoMmuSegmentation::m_volumes_extruder_idxs
protected

◆ m_volumes_index

int Slic3r::GUI::GLGizmoPainterBase::m_volumes_index = 0
mutableprivateinherited

◆ s_sphere

std::shared_ptr< GLModel > Slic3r::GUI::GLGizmoPainterBase::s_sphere = nullptr
staticprivateinherited

◆ SmartFillAngleMax

◆ SmartFillAngleMin

◆ SmartFillAngleStep

float Slic3r::GUI::GLGizmoPainterBase::SmartFillAngleStep = 1.f
staticconstexprprotectedinherited

Referenced by gizmo_event().


The documentation for this class was generated from the following files: