diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index b8a45dd46..204e19d3d 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -24,8 +24,11 @@ use OpenGL qw(:glconstants :glfunctions :glufunctions :gluconstants); use base qw(Wx::GLCanvas Class::Accessor); use Math::Trig qw(asin tan); use List::Util qw(reduce min max first); -use Slic3r::Geometry qw(X Y normalize scale unscale scaled_epsilon); -use Slic3r::Geometry::Clipper qw(offset_ex intersection_pl JT_ROUND); +#============================================================================================================================== +use Slic3r::Geometry qw(X Y); +#use Slic3r::Geometry qw(X Y normalize scale unscale scaled_epsilon); +#use Slic3r::Geometry::Clipper qw(offset_ex intersection_pl JT_ROUND); +#============================================================================================================================== use Wx::GLCanvas qw(:all); use Slic3r::Geometry qw(PI); @@ -33,9 +36,7 @@ use Slic3r::Geometry qw(PI); # volumes: reference to vector of Slic3r::GUI::3DScene::Volume. # _camera_type: 'perspective' or 'ortho' #============================================================================================================================== -__PACKAGE__->mk_accessors( qw(init - on_viewport_changed - on_select +__PACKAGE__->mk_accessors( qw( volumes ) ); #__PACKAGE__->mk_accessors( qw(_quat _dirty init @@ -1268,12 +1269,10 @@ sub DestroyGL { } } -sub Render { - my ($self, $dc) = @_; - #============================================================================================================================== - Slic3r::GUI::_3DScene::render($self); - +#sub Render { +# my ($self, $dc) = @_; +# # # prevent calling SetCurrent() when window is not shown yet # return unless Slic3r::GUI::_3DScene::is_shown_on_screen($self); ## return unless $self->IsShownOnScreen; @@ -1497,10 +1496,8 @@ sub Render { # $self->draw_active_object_annotations; # # $self->SwapBuffers(); -#============================================================================================================================== -} - -#============================================================================================================================== +#} +# #sub draw_volumes { # # $fakecolor is a boolean indicating, that the objects shall be rendered in a color coding the object index for picking. # my ($self, $fakecolor) = @_; @@ -2264,18 +2261,20 @@ sub load_gcode_preview { #============================================================================================================================== } -sub set_toolpaths_range { - my ($self, $min_z, $max_z) = @_; - $self->volumes->set_range($min_z, $max_z); -} - -sub reset_legend_texture { - Slic3r::GUI::_3DScene::reset_legend_texture(); -} - -sub get_current_print_zs { - my ($self, $active_only) = @_; - return $self->volumes->get_current_print_zs($active_only); -} +#============================================================================================================================== +#sub set_toolpaths_range { +# my ($self, $min_z, $max_z) = @_; +# $self->volumes->set_range($min_z, $max_z); +#} +# +#sub reset_legend_texture { +# Slic3r::GUI::_3DScene::reset_legend_texture(); +#} +# +#sub get_current_print_zs { +# my ($self, $active_only) = @_; +# return $self->volumes->get_current_print_zs($active_only); +#} +#============================================================================================================================== 1; diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 2ff798899..fafd5da7c 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -152,6 +152,8 @@ sub new { $self->{"print_info_box_show"}->(0); } }); + + Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{canvas3D}, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{preview3D}->canvas, $self->{canvas3D}); }); # $self->{canvas3D}->set_on_model_update(sub { # if (wxTheApp->{app_config}->get("background_processing")) { @@ -161,15 +163,9 @@ sub new { # $self->{"print_info_box_show"}->(0); # } # }); -#============================================================================================================================== - $self->{canvas3D}->on_viewport_changed(sub { -#============================================================================================================================== - Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{preview3D}->canvas, $self->{canvas3D}); +# $self->{canvas3D}->on_viewport_changed(sub { # $self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D}); -#============================================================================================================================== - }); -#============================================================================================================================== - Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{canvas3D}, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{preview3D}->canvas, $self->{canvas3D}); }); +# }); #============================================================================================================================== } @@ -184,14 +180,11 @@ sub new { # Initialize 3D toolpaths preview if ($Slic3r::GUI::have_OpenGL) { $self->{preview3D} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print}, $self->{gcode_preview_data}, $self->{config}); - $self->{preview3D}->canvas->on_viewport_changed(sub { -#============================================================================================================================== - Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas); -# $self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas); -#============================================================================================================================== - }); #============================================================================================================================== Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas); }); +# $self->{preview3D}->canvas->on_viewport_changed(sub { +# $self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas); +# }); #============================================================================================================================== $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview')); $self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1; @@ -1900,9 +1893,10 @@ sub list_item_deselected { $self->{canvas}->Refresh; #============================================================================================================================== Slic3r::GUI::_3DScene::deselect_volumes($self->{canvas3D}) if $self->{canvas3D}; + Slic3r::GUI::_3DScene::render($self->{canvas3D}) if $self->{canvas3D}; # $self->{canvas3D}->deselect_volumes if $self->{canvas3D}; +# $self->{canvas3D}->Render if $self->{canvas3D}; #============================================================================================================================== - $self->{canvas3D}->Render if $self->{canvas3D}; } undef $self->{_lecursor}; } @@ -1915,7 +1909,10 @@ sub list_item_selected { $self->select_object($obj_idx); $self->{canvas}->Refresh; $self->{canvas3D}->update_volumes_selection if $self->{canvas3D}; - $self->{canvas3D}->Render if $self->{canvas3D}; +#============================================================================================================================== + Slic3r::GUI::_3DScene::render($self->{canvas3D}) if $self->{canvas3D}; +# $self->{canvas3D}->Render if $self->{canvas3D}; +#============================================================================================================================== undef $self->{_lecursor}; } diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index 774027540..d6b7acf2b 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -42,13 +42,17 @@ sub new { $self->{objects_volumes_idxs} = []; - $self->on_select(sub { +#============================================================================================================================== + Slic3r::GUI::_3DScene::register_on_select_callback($self, sub { my ($volume_idx) = @_; $self->{on_select_object}->(($volume_idx == -1) ? undef : $self->volumes->[$volume_idx]->object_idx) if ($self->{on_select_object}); - }); -#============================================================================================================================== - Slic3r::GUI::_3DScene::register_on_select_callback($self, $self->on_select); + }); +# $self->on_select(sub { +# my ($volume_idx) = @_; +# $self->{on_select_object}->(($volume_idx == -1) ? undef : $self->volumes->[$volume_idx]->object_idx) +# if ($self->{on_select_object}); +# }); #============================================================================================================================== #============================================================================================================================== diff --git a/lib/Slic3r/GUI/Plater/3DPreview.pm b/lib/Slic3r/GUI/Plater/3DPreview.pm index 390e1b85e..2b7f56cc1 100644 --- a/lib/Slic3r/GUI/Plater/3DPreview.pm +++ b/lib/Slic3r/GUI/Plater/3DPreview.pm @@ -310,7 +310,10 @@ sub refresh_print { sub reset_gcode_preview_data { my ($self) = @_; $self->gcode_preview_data->reset; - $self->canvas->reset_legend_texture(); +#============================================================================================================================== + Slic3r::GUI::_3DScene::reset_legend_texture(); +# $self->canvas->reset_legend_texture(); +#============================================================================================================================== } sub load_print { @@ -335,7 +338,10 @@ sub load_print { if ($n_layers == 0) { $self->reset_sliders; - $self->canvas->reset_legend_texture(); +#============================================================================================================================== + Slic3r::GUI::_3DScene::reset_legend_texture(); +# $self->canvas->reset_legend_texture(); +#============================================================================================================================== $self->canvas->Refresh; # clears canvas return; } @@ -379,14 +385,20 @@ sub load_print { #$self->canvas->volumes->[$_]->color->[3] = 0.2 for @volume_ids; } $self->show_hide_ui_elements('simple'); - $self->canvas->reset_legend_texture(); +#============================================================================================================================== + Slic3r::GUI::_3DScene::reset_legend_texture(); +# $self->canvas->reset_legend_texture(); +#============================================================================================================================== } else { $self->{force_sliders_full_range} = (scalar(@{$self->canvas->volumes}) == 0); $self->canvas->load_gcode_preview($self->print, $self->gcode_preview_data, \@colors); $self->show_hide_ui_elements('full'); # recalculates zs and update sliders accordingly - $self->{layers_z} = $self->canvas->get_current_print_zs(1); +#============================================================================================================================== + $self->{layers_z} = Slic3r::GUI::_3DScene::get_current_print_zs($self->canvas, 1); +# $self->{layers_z} = $self->canvas->get_current_print_zs(1); +#============================================================================================================================== $n_layers = scalar(@{$self->{layers_z}}); if ($n_layers == 0) { # all layers filtered out @@ -472,7 +484,10 @@ sub set_z_range $self->{z_label_low}->SetLabel(sprintf '%.2f', $z_low); $self->{z_label_high}->SetLabel(sprintf '%.2f', $z_high); - my $layers_z = $self->canvas->get_current_print_zs(0); +#============================================================================================================================== + my $layers_z = Slic3r::GUI::_3DScene::get_current_print_zs($self->canvas, 0); +# my $layers_z = $self->canvas->get_current_print_zs(0); +#============================================================================================================================== for (my $i = 0; $i < scalar(@{$layers_z}); $i += 1) { if (($z_low - 1e-6 < @{$layers_z}[$i]) && (@{$layers_z}[$i] < $z_low + 1e-6)) { $self->{z_label_low_idx}->SetLabel(sprintf '%d', $i + 1); @@ -486,7 +501,10 @@ sub set_z_range } } - $self->canvas->set_toolpaths_range($z_low - 1e-6, $z_high + 1e-6); +#============================================================================================================================== + Slic3r::GUI::_3DScene::set_toolpaths_range($self->canvas, $z_low - 1e-6, $z_high + 1e-6); +# $self->canvas->set_toolpaths_range($z_low - 1e-6, $z_high + 1e-6); +#============================================================================================================================== $self->canvas->Refresh if $self->IsShown; } diff --git a/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm b/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm index bbb3543bb..bb9ecd41c 100644 --- a/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm +++ b/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm @@ -267,13 +267,14 @@ sub _update { #============================================================================================================================== Slic3r::GUI::_3DScene::set_cutting_plane($self->{canvas}, $self->{cut_options}{z}, [@expolygons]); Slic3r::GUI::_3DScene::update_volumes_colors_by_extruder($self->{canvas}); + Slic3r::GUI::_3DScene::render($self->{canvas}); # $self->{canvas}->SetCuttingPlane( # $self->{cut_options}{z}, # [@expolygons], # ); # $self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->{config}); +# $self->{canvas}->Render; #============================================================================================================================== - $self->{canvas}->Render; } } diff --git a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm index c2e7be5f2..6fff40769 100644 --- a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm +++ b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm @@ -159,11 +159,18 @@ sub new { #============================================================================================================================== $canvas->select_by('volume'); - $canvas->on_select(sub { +#============================================================================================================================== + Slic3r::GUI::_3DScene::register_on_select_callback($canvas, sub { my ($volume_idx) = @_; # convert scene volume to model object volume $self->reload_tree(($volume_idx == -1) ? undef : $canvas->volumes->[$volume_idx]->volume_idx); }); +# $canvas->on_select(sub { +# my ($volume_idx) = @_; +# # convert scene volume to model object volume +# $self->reload_tree(($volume_idx == -1) ? undef : $canvas->volumes->[$volume_idx]->volume_idx); +# }); +#============================================================================================================================== $canvas->load_object($self->{model_object}, undef, undef, [0]); #============================================================================================================================== @@ -348,7 +355,10 @@ sub selection_changed { $self->{settings_panel}->enable; } - $self->{canvas}->Render if $self->{canvas}; +#============================================================================================================================== + Slic3r::GUI::_3DScene::render($self->{canvas}) if $self->{canvas}; +# $self->{canvas}->Render if $self->{canvas}; +#============================================================================================================================== } sub on_btn_load { @@ -510,10 +520,11 @@ sub _parts_changed { #============================================================================================================================== Slic3r::GUI::_3DScene::zoom_to_volumes($self->{canvas}); Slic3r::GUI::_3DScene::update_volumes_colors_by_extruder($self->{canvas}); + Slic3r::GUI::_3DScene::render($self->{canvas}); # $self->{canvas}->zoom_to_volumes; # $self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config}); +# $self->{canvas}->Render; #============================================================================================================================== - $self->{canvas}->Render; } } @@ -569,9 +580,10 @@ sub _update_canvas { #============================================================================================================================== Slic3r::GUI::_3DScene::update_volumes_colors_by_extruder($self->{canvas}); + Slic3r::GUI::_3DScene::render($self->{canvas}); # $self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config}); +# $self->{canvas}->Render; #============================================================================================================================== - $self->{canvas}->Render; } } @@ -600,9 +612,10 @@ sub _update { $self->{canvas}->load_object($_, undef, [0]) for @objects; #============================================================================================================================== Slic3r::GUI::_3DScene::update_volumes_colors_by_extruder($self->{canvas}); + Slic3r::GUI::_3DScene::render($self->{canvas}); # $self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config}); +# $self->{canvas}->Render; #============================================================================================================================== - $self->{canvas}->Render; } 1; diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index eed1e8a1c..e55985b0e 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1903,6 +1903,16 @@ void _3DScene::render(wxGLCanvas* canvas) s_canvas_mgr.render(canvas); } +std::vector<double> _3DScene::get_current_print_zs(wxGLCanvas* canvas, bool active_only) +{ + return s_canvas_mgr.get_current_print_zs(canvas, active_only); +} + +void _3DScene::set_toolpaths_range(wxGLCanvas* canvas, double low, double high) +{ + s_canvas_mgr.set_toolpaths_range(canvas, low, high); +} + void _3DScene::register_on_viewport_changed_callback(wxGLCanvas* canvas, void* callback) { s_canvas_mgr.register_on_viewport_changed_callback(canvas, callback); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index df395bccb..aff40f4d7 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -587,6 +587,9 @@ public: static void render(wxGLCanvas* canvas); + static std::vector<double> get_current_print_zs(wxGLCanvas* canvas, bool active_only); + static void set_toolpaths_range(wxGLCanvas* canvas, double low, double high); + static void register_on_viewport_changed_callback(wxGLCanvas* canvas, void* callback); static void register_on_double_click_callback(wxGLCanvas* canvas, void* callback); static void register_on_right_click_callback(wxGLCanvas* canvas, void* callback); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 240581aec..d48cc0ccc 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1317,6 +1317,17 @@ void GLCanvas3D::render_texture(unsigned int tex_id, float left, float right, fl ::glEnable(GL_LIGHTING); } +std::vector<double> GLCanvas3D::get_current_print_zs(bool active_only) const +{ + return (m_volumes != nullptr) ? m_volumes->get_current_print_zs(active_only) : std::vector<double>(); +} + +void GLCanvas3D::set_toolpaths_range(double low, double high) +{ + if (m_volumes != nullptr) + m_volumes->set_range(low, high); +} + void GLCanvas3D::register_on_viewport_changed_callback(void* callback) { if (callback != nullptr) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index fe27de0b2..d2c9f259c 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -376,6 +376,9 @@ public: void render(); void render_texture(unsigned int tex_id, float left, float right, float bottom, float top) const; + std::vector<double> get_current_print_zs(bool active_only) const; + void set_toolpaths_range(double low, double high); + void register_on_viewport_changed_callback(void* callback); void register_on_double_click_callback(void* callback); void register_on_right_click_callback(void* callback); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index a136f4766..cbd9c15cb 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -430,6 +430,19 @@ void GLCanvas3DManager::render(wxGLCanvas* canvas) const it->second->render(); } +std::vector<double> GLCanvas3DManager::get_current_print_zs(wxGLCanvas* canvas, bool active_only) const +{ + CanvasesMap::const_iterator it = _get_canvas(canvas); + return (it != m_canvases.end()) ? it->second->get_current_print_zs(active_only) : std::vector<double>(); +} + +void GLCanvas3DManager::set_toolpaths_range(wxGLCanvas* canvas, double low, double high) +{ + CanvasesMap::iterator it = _get_canvas(canvas); + if (it != m_canvases.end()) + it->second->set_toolpaths_range(low, high); +} + void GLCanvas3DManager::register_on_viewport_changed_callback(wxGLCanvas* canvas, void* callback) { CanvasesMap::iterator it = _get_canvas(canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index dd8f965d6..e28a0aba9 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -91,6 +91,9 @@ public: void render(wxGLCanvas* canvas) const; + std::vector<double> get_current_print_zs(wxGLCanvas* canvas, bool active_only) const; + void set_toolpaths_range(wxGLCanvas* canvas, double low, double high); + void register_on_viewport_changed_callback(wxGLCanvas* canvas, void* callback); void register_on_double_click_callback(wxGLCanvas* canvas, void* callback); void register_on_right_click_callback(wxGLCanvas* canvas, void* callback); diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index 60c86eaa2..fac52a02e 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -93,9 +93,6 @@ int count() %code{% RETVAL = THIS->volumes.size(); %}; - std::vector<double> get_current_print_zs(bool active_only) - %code{% RETVAL = THIS->get_current_print_zs(active_only); %}; - void set_range(double low, double high); void render_VBOs() const; @@ -389,6 +386,23 @@ render(canvas) CODE: _3DScene::render((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas")); +std::vector<double> +get_current_print_zs(canvas, active_only) + SV *canvas; + bool active_only; + CODE: + RETVAL = _3DScene::get_current_print_zs((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), active_only); + OUTPUT: + RETVAL + +void +set_toolpaths_range(canvas, low, high) + SV *canvas; + double low; + double high; + CODE: + _3DScene::set_toolpaths_range((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), low, high); + void register_on_viewport_changed_callback(canvas, callback) SV *canvas;