diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index d720b4060..fce0231e2 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -35,7 +35,6 @@ use Slic3r::Geometry qw(PI); # _camera_type: 'perspective' or 'ortho' #============================================================================================================================== __PACKAGE__->mk_accessors( qw(_quat init - enable_picking enable_moving use_plain_shader on_viewport_changed @@ -504,7 +503,10 @@ sub mouse_event { # Select volume in this 3D canvas. # Don't deselect a volume if layer editing is enabled. We want the object to stay selected # during the scene manipulation. - if ($self->enable_picking && ($volume_idx != -1 || ! $self->layer_editing_enabled)) { +#============================================================================================================================== + if (Slic3r::GUI::_3DScene::is_picking_enabled($self) && ($volume_idx != -1 || ! $self->layer_editing_enabled)) { +# if ($self->enable_picking && ($volume_idx != -1 || ! $self->layer_editing_enabled)) { +#============================================================================================================================== $self->deselect_volumes; $self->select_volume($volume_idx); @@ -658,7 +660,10 @@ sub mouse_event { $self->_mouse_pos($pos); # Only refresh if picking is enabled, in that case the objects may get highlighted if the mouse cursor # hovers over. - if ($self->enable_picking) { +#============================================================================================================================== + if (Slic3r::GUI::_3DScene::is_picking_enabled($self)) { +# if ($self->enable_picking) { +#============================================================================================================================== $self->Update; $self->Refresh; } @@ -1460,8 +1465,11 @@ sub Render { # Head light glLightfv_p(GL_LIGHT1, GL_POSITION, 1, 0, 1, 0); - - if ($self->enable_picking && !$self->_mouse_dragging) { + +#============================================================================================================================== + if (Slic3r::GUI::_3DScene::is_picking_enabled($self) && !$self->_mouse_dragging) { +# if ($self->enable_picking && !$self->_mouse_dragging) { +#============================================================================================================================== if (my $pos = $self->_mouse_pos) { # Render the object for picking. # FIXME This cannot possibly work in a multi-sampled context as the color gets mangled by the anti-aliasing. @@ -1606,7 +1614,10 @@ sub Render { # $self->draw_volumes; #============================================================================================================================== } elsif ($self->UseVBOs) { - if ($self->enable_picking) { +#============================================================================================================================== + if (Slic3r::GUI::_3DScene::is_picking_enabled($self)) { +# if ($self->enable_picking) { +#============================================================================================================================== $self->mark_volumes_for_layer_height; $self->volumes->set_print_box($self->bed_bounding_box->x_min, $self->bed_bounding_box->y_min, 0.0, $self->bed_bounding_box->x_max, $self->bed_bounding_box->y_max, $self->{config}->get('max_print_height')); $self->volumes->update_outside_state($self->{config}, 0); @@ -1616,12 +1627,21 @@ sub Render { $self->{plain_shader}->enable if $self->{plain_shader}; $self->volumes->render_VBOs; $self->{plain_shader}->disable; - glEnable(GL_CULL_FACE) if ($self->enable_picking); +#============================================================================================================================== + glEnable(GL_CULL_FACE) if (Slic3r::GUI::_3DScene::is_picking_enabled($self)); +# glEnable(GL_CULL_FACE) if ($self->enable_picking); +#============================================================================================================================== } else { # do not cull backfaces to show broken geometry, if any - glDisable(GL_CULL_FACE) if ($self->enable_picking); +#============================================================================================================================== + glDisable(GL_CULL_FACE) if (Slic3r::GUI::_3DScene::is_picking_enabled($self)); +# glDisable(GL_CULL_FACE) if ($self->enable_picking); +#============================================================================================================================== $self->volumes->render_legacy; - glEnable(GL_CULL_FACE) if ($self->enable_picking); +#============================================================================================================================== + glEnable(GL_CULL_FACE) if (Slic3r::GUI::_3DScene::is_picking_enabled($self)); +# glEnable(GL_CULL_FACE) if ($self->enable_picking); +#============================================================================================================================== } #============================================================================================================================== diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index ecf841b27..407a0b6a9 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -19,7 +19,10 @@ sub new { my ($parent, $objects, $model, $print, $config) = @_; my $self = $class->SUPER::new($parent); - $self->enable_picking(1); +#============================================================================================================================== + Slic3r::GUI::_3DScene::enable_picking($self, 1); +# $self->enable_picking(1); +#============================================================================================================================== $self->enable_moving(1); $self->select_by('object'); $self->drag_by('instance'); diff --git a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm index a2b779a0a..54fdc249e 100644 --- a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm +++ b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm @@ -153,7 +153,10 @@ sub new { my $canvas; if ($Slic3r::GUI::have_OpenGL) { $canvas = $self->{canvas} = Slic3r::GUI::3DScene->new($self); - $canvas->enable_picking(1); +#============================================================================================================================== + Slic3r::GUI::_3DScene::enable_picking($canvas, 1); +# $canvas->enable_picking(1); +#============================================================================================================================== $canvas->select_by('volume'); $canvas->on_select(sub { diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index a7f5bd89e..57c926f7e 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1898,6 +1898,11 @@ bool _3DScene::is_layers_editing_enabled(wxGLCanvas* canvas) return s_canvas_mgr.is_layers_editing_enabled(canvas); } +bool _3DScene::is_picking_enabled(wxGLCanvas* canvas) +{ + return s_canvas_mgr.is_picking_enabled(canvas); +} + void _3DScene::enable_warning_texture(wxGLCanvas* canvas, bool enable) { s_canvas_mgr.enable_warning_texture(canvas, enable); @@ -1908,6 +1913,11 @@ void _3DScene::enable_legend_texture(wxGLCanvas* canvas, bool enable) s_canvas_mgr.enable_legend_texture(canvas, enable); } +void _3DScene::enable_picking(wxGLCanvas* canvas, bool enable) +{ + s_canvas_mgr.enable_picking(canvas, enable); +} + void _3DScene::zoom_to_bed(wxGLCanvas* canvas) { s_canvas_mgr.zoom_to_bed(canvas); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index 24223b6b6..ad8ca75e4 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -589,9 +589,11 @@ public: static void set_camera_target(wxGLCanvas* canvas, const Pointf3* target); static bool is_layers_editing_enabled(wxGLCanvas* canvas); + static bool is_picking_enabled(wxGLCanvas* canvas); static void enable_warning_texture(wxGLCanvas* canvas, bool enable); static void enable_legend_texture(wxGLCanvas* canvas, bool enable); + static void enable_picking(wxGLCanvas* canvas, bool enable); static void zoom_to_bed(wxGLCanvas* canvas); static void zoom_to_volumes(wxGLCanvas* canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 80eea86f0..4dadf8181 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -421,6 +421,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context) , m_apply_zoom_to_volumes_filter(false) , m_warning_texture_enabled(false) , m_legend_texture_enabled(false) + , m_picking_enabled(false) { } @@ -692,6 +693,11 @@ bool GLCanvas3D::is_layers_editing_enabled() const return m_layers_editing.is_enabled(); } +bool GLCanvas3D::is_picking_enabled() const +{ + return m_picking_enabled; +} + void GLCanvas3D::enable_warning_texture(bool enable) { m_warning_texture_enabled = enable; @@ -702,6 +708,11 @@ void GLCanvas3D::enable_legend_texture(bool enable) m_legend_texture_enabled = enable; } +void GLCanvas3D::enable_picking(bool enable) +{ + m_picking_enabled = enable; +} + void GLCanvas3D::zoom_to_bed() { _zoom_to_bounding_box(bed_bounding_box()); @@ -793,7 +804,10 @@ void GLCanvas3D::render_volumes(bool fake_colors) const if (m_volumes == nullptr) return; - ::glEnable(GL_LIGHTING); + if (fake_colors) + ::glDisable(GL_LIGHTING); + else + ::glEnable(GL_LIGHTING); // do not cull backfaces to show broken geometry, if any ::glDisable(GL_CULL_FACE); @@ -805,7 +819,7 @@ void GLCanvas3D::render_volumes(bool fake_colors) const ::glEnableClientState(GL_NORMAL_ARRAY); unsigned int volume_id = 0; - for (const GLVolume* vol : m_volumes->volumes) + for (GLVolume* vol : m_volumes->volumes) { if (fake_colors) { @@ -816,7 +830,10 @@ void GLCanvas3D::render_volumes(bool fake_colors) const ::glColor4f((float)r * INV_255, (float)g * INV_255, (float)b * INV_255, 1.0f); } else + { + vol->set_render_color(); ::glColor4f(vol->render_color[0], vol->render_color[1], vol->render_color[2], vol->render_color[3]); + } vol->render(); ++volume_id; diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 29be07490..dcf14e725 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -156,6 +156,7 @@ private: bool m_apply_zoom_to_volumes_filter; bool m_warning_texture_enabled; bool m_legend_texture_enabled; + bool m_picking_enabled; PerlCallback m_on_viewport_changed_callback; @@ -217,9 +218,11 @@ public: BoundingBoxf3 max_bounding_box() const; bool is_layers_editing_enabled() const; + bool is_picking_enabled() const; void enable_warning_texture(bool enable); void enable_legend_texture(bool enable); + void enable_picking(bool enable); void zoom_to_bed(); void zoom_to_volumes(); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 7e8cf913f..4349ae845 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -355,6 +355,12 @@ bool GLCanvas3DManager::is_layers_editing_enabled(wxGLCanvas* canvas) const return (it != m_canvases.end()) ? it->second->is_layers_editing_enabled() : false; } +bool GLCanvas3DManager::is_picking_enabled(wxGLCanvas* canvas) const +{ + CanvasesMap::const_iterator it = _get_canvas(canvas); + return (it != m_canvases.end()) ? it->second->is_picking_enabled() : false; +} + void GLCanvas3DManager::enable_warning_texture(wxGLCanvas* canvas, bool enable) { CanvasesMap::iterator it = _get_canvas(canvas); @@ -369,6 +375,13 @@ void GLCanvas3DManager::enable_legend_texture(wxGLCanvas* canvas, bool enable) it->second->enable_legend_texture(enable); } +void GLCanvas3DManager::enable_picking(wxGLCanvas* canvas, bool enable) +{ + CanvasesMap::iterator it = _get_canvas(canvas); + if (it != m_canvases.end()) + it->second->enable_picking(enable); +} + void GLCanvas3DManager::zoom_to_bed(wxGLCanvas* canvas) { CanvasesMap::iterator it = _get_canvas(canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index f2ff8a112..46eb872db 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -99,9 +99,11 @@ public: void set_camera_target(wxGLCanvas* canvas, const Pointf3* target); bool is_layers_editing_enabled(wxGLCanvas* canvas) const; + bool is_picking_enabled(wxGLCanvas* canvas) const; void enable_warning_texture(wxGLCanvas* canvas, bool enable); void enable_legend_texture(wxGLCanvas* canvas, bool enable); + void enable_picking(wxGLCanvas* canvas, bool enable); void zoom_to_bed(wxGLCanvas* canvas); void zoom_to_volumes(wxGLCanvas* canvas); diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index 40332e7ec..0bb22888b 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -411,6 +411,14 @@ set_camera_target(canvas, target) CODE: _3DScene::set_camera_target((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), target); +bool +is_picking_enabled(canvas) + SV *canvas; + CODE: + RETVAL = _3DScene::is_picking_enabled((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas")); + OUTPUT: + RETVAL + void enable_warning_texture(canvas, enable) SV *canvas; @@ -425,6 +433,13 @@ enable_legend_texture(canvas, enable) CODE: _3DScene::enable_legend_texture((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), enable); +void +enable_picking(canvas, enable) + SV *canvas; + bool enable; + CODE: + _3DScene::enable_picking((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), enable); + void zoom_to_bed(canvas) SV *canvas;