diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index a55c4ab16b..b2240b7148 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -32,9 +32,7 @@ use Slic3r::Geometry qw(X Y); use Wx::GLCanvas qw(:all); use Slic3r::Geometry qw(PI); -# _dirty: boolean flag indicating, that the screen has to be redrawn on EVT_IDLE. # volumes: reference to vector of Slic3r::GUI::3DScene::Volume. -# _camera_type: 'perspective' or 'ortho' #============================================================================================================================== __PACKAGE__->mk_accessors( qw( volumes @@ -2169,37 +2167,28 @@ sub new { return $self; } -sub load_object { - my ($self, $model, $print, $obj_idx, $instance_idxs) = @_; - #============================================================================================================================== - my $useVBOs = Slic3r::GUI::_3DScene::use_VBOs(); - $self->SetCurrent($self->GetContext) if $useVBOs; - +#sub load_object { +# my ($self, $model, $print, $obj_idx, $instance_idxs) = @_; +# # $self->SetCurrent($self->GetContext) if $useVBOs; -#============================================================================================================================== - - my $model_object; - if ($model->isa('Slic3r::Model::Object')) { - $model_object = $model; - $model = $model_object->model; - $obj_idx = 0; - } else { - $model_object = $model->get_object($obj_idx); - } - - $instance_idxs ||= [0..$#{$model_object->instances}]; -#============================================================================================================================== - my $volume_indices = $self->volumes->load_object( - $model_object, $obj_idx, $instance_idxs, $self->color_by, $self->select_by, $self->drag_by, $useVBOs && Slic3r::GUI::_3DScene::is_shader_enabled($self)); +# +# my $model_object; +# if ($model->isa('Slic3r::Model::Object')) { +# $model_object = $model; +# $model = $model_object->model; +# $obj_idx = 0; +# } else { +# $model_object = $model->get_object($obj_idx); +# } +# +# $instance_idxs ||= [0..$#{$model_object->instances}]; # my $volume_indices = $self->volumes->load_object( # $model_object, $obj_idx, $instance_idxs, $self->color_by, $self->select_by, $self->drag_by, # $self->UseVBOs); -#============================================================================================================================== - return @{$volume_indices}; -} - -#============================================================================================================================== +# return @{$volume_indices}; +#} +# ## Create 3D thick extrusion lines for a skirt and brim. ## Adds a new Slic3r::GUI::3DScene::Volume to $self->volumes. #sub load_print_toolpaths { diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index d6b7acf2b3..4137d1458b 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -237,8 +237,13 @@ sub reload_scene { $self->{objects_volumes_idxs} = []; foreach my $obj_idx (0..$#{$self->{model}->objects}) { - my @volume_idxs = $self->load_object($self->{model}, $self->{print}, $obj_idx); - push(@{$self->{objects_volumes_idxs}}, \@volume_idxs); +#============================================================================================================================== + my $volume_idxs = Slic3r::GUI::_3DScene::load_model($self, $self->{model}, $obj_idx, [0]); + push(@{$self->{objects_volumes_idxs}}, \@{$volume_idxs}); + +# my @volume_idxs = $self->load_object($self->{model}, $self->{print}, $obj_idx); +# push(@{$self->{objects_volumes_idxs}}, \@volume_idxs); +#============================================================================================================================== } $self->update_volumes_selection; diff --git a/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm b/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm index 84177dd0fd..56ca9d7383 100644 --- a/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm +++ b/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm @@ -115,11 +115,12 @@ sub new { my $canvas; if ($Slic3r::GUI::have_OpenGL) { $canvas = $self->{canvas} = Slic3r::GUI::3DScene->new($self); - $canvas->load_object($self->{model_object}, undef, undef, [0]); #============================================================================================================================== + Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $self->{model_object}, 0, [0]); Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas); Slic3r::GUI::_3DScene::set_axes_length($canvas, 2.0 * max(@{ Slic3r::GUI::_3DScene::get_volumes_bounding_box($canvas)->size })); +# $canvas->load_object($self->{model_object}, undef, undef, [0]); # $canvas->set_auto_bed_shape; #============================================================================================================================== $canvas->SetSize([500,500]); @@ -261,14 +262,13 @@ sub _update { } #============================================================================================================================== - Slic3r::GUI::_3DScene::reset_volumes($self->{canvas}); -# $self->{canvas}->reset_objects; -#============================================================================================================================== - $self->{canvas}->load_object($_, undef, undef, [0]) for @objects; -#============================================================================================================================== + Slic3r::GUI::_3DScene::reset_volumes($self->{canvas}); + Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $_, 0, [0]) for @objects; 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}->reset_objects; +# $self->{canvas}->load_object($_, undef, undef, [0]) for @objects; # $self->{canvas}->SetCuttingPlane( # $self->{cut_options}{z}, # [@expolygons], diff --git a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm index ad9c4df94c..f7bfc37961 100644 --- a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm +++ b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm @@ -165,18 +165,16 @@ sub new { # convert scene volume to model object volume $self->reload_tree(($volume_idx == -1) ? undef : $canvas->volumes->[$volume_idx]->volume_idx); }); + Slic3r::GUI::_3DScene::load_model_object($canvas, $self->{model_object}, 0, [0]); + Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas); + Slic3r::GUI::_3DScene::set_axes_length($canvas, 2.0 * max(@{ Slic3r::GUI::_3DScene::get_volumes_bounding_box($canvas)->size })); + # $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]); -#============================================================================================================================== - Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas); - Slic3r::GUI::_3DScene::set_axes_length($canvas, 2.0 * max(@{ Slic3r::GUI::_3DScene::get_volumes_bounding_box($canvas)->size })); - +# $canvas->load_object($self->{model_object}, undef, undef, [0]); # $canvas->set_auto_bed_shape; #============================================================================================================================== $canvas->SetSize([500,700]); @@ -514,14 +512,13 @@ sub _parts_changed { $self->reload_tree; if ($self->{canvas}) { #============================================================================================================================== - Slic3r::GUI::_3DScene::reset_volumes($self->{canvas}); -# $self->{canvas}->reset_objects; -#============================================================================================================================== - $self->{canvas}->load_object($self->{model_object}); -#============================================================================================================================== + Slic3r::GUI::_3DScene::reset_volumes($self->{canvas}); + Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $self->{model_object}, 0, [0]); 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}->reset_objects; +# $self->{canvas}->load_object($self->{model_object}); # $self->{canvas}->zoom_to_volumes; # $self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config}); # $self->{canvas}->Render; @@ -567,10 +564,11 @@ sub _update_canvas { if ($self->{canvas}) { #============================================================================================================================== - Slic3r::GUI::_3DScene::reset_volumes($self->{canvas}); + Slic3r::GUI::_3DScene::reset_volumes($self->{canvas}); + Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $self->{model_object}, 0, [0]); # $self->{canvas}->reset_objects; +# $self->{canvas}->load_object($self->{model_object}); #============================================================================================================================== - $self->{canvas}->load_object($self->{model_object}); # restore selection, if any if (my $itemData = $self->get_selection) { @@ -607,13 +605,12 @@ sub _update { my @objects = (); push @objects, $self->{model_object}; #============================================================================================================================== - Slic3r::GUI::_3DScene::reset_volumes($self->{canvas}); -# $self->{canvas}->reset_objects; -#============================================================================================================================== - $self->{canvas}->load_object($_, undef, [0]) for @objects; -#============================================================================================================================== + Slic3r::GUI::_3DScene::reset_volumes($self->{canvas}); + Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $_, 0, [0]) for @objects; Slic3r::GUI::_3DScene::update_volumes_colors_by_extruder($self->{canvas}); Slic3r::GUI::_3DScene::render($self->{canvas}); +# $self->{canvas}->reset_objects; +# $self->{canvas}->load_object($_, undef, [0]) for @objects; # $self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config}); # $self->{canvas}->Render; #============================================================================================================================== diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 89b7d0a118..ec90011c6f 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -2016,6 +2016,16 @@ static inline std::vector parse_colors(const std::vector &sc } //################################################################################################################## +std::vector _3DScene::load_object(wxGLCanvas* canvas, const ModelObject* model_object, int obj_idx, std::vector instance_idxs) +{ + return s_canvas_mgr.load_object(canvas, model_object, obj_idx, instance_idxs); +} + +std::vector _3DScene::load_object(wxGLCanvas* canvas, const Model* model, int obj_idx, std::vector instance_idxs) +{ + return s_canvas_mgr.load_object(canvas, model, obj_idx, instance_idxs); +} + void _3DScene::load_print_toolpaths(wxGLCanvas* canvas) { s_canvas_mgr.load_print_toolpaths(canvas); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index ee65476573..832ebafc87 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -611,6 +611,9 @@ public: //################################################################################################################## //################################################################################################################## + static std::vector load_object(wxGLCanvas* canvas, const ModelObject* model_object, int obj_idx, std::vector instance_idxs); + static std::vector load_object(wxGLCanvas* canvas, const Model* model, int obj_idx, std::vector instance_idxs); + static void load_print_toolpaths(wxGLCanvas* canvas); static void load_print_object_toolpaths(wxGLCanvas* canvas, const PrintObject* print_object, const std::vector& str_tool_colors); static void load_wipe_tower_toolpaths(wxGLCanvas* canvas, const std::vector& str_tool_colors); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index a060797449..e1b70710f4 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -959,6 +959,9 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context) , m_moving_enabled(false) , m_shader_enabled(false) , m_multisample_allowed(false) + , m_color_by("volume") + , m_select_by("object") + , m_drag_by("instance") { if (m_canvas != nullptr) m_timer = new wxTimer(m_canvas); @@ -1351,6 +1354,34 @@ void GLCanvas3D::set_toolpaths_range(double low, double high) m_volumes->set_range(low, high); } +std::vector GLCanvas3D::load_object(const ModelObject& model_object, int obj_idx, std::vector instance_idxs) +{ + if (m_volumes == nullptr) + return std::vector(); + + if (instance_idxs.empty()) + { + for (unsigned int i = 0; i < model_object.instances.size(); ++i) + { + instance_idxs.push_back(i); + } + } + + return m_volumes->load_object(&model_object, obj_idx, instance_idxs, m_color_by, m_select_by, m_drag_by, m_use_VBOs && m_initialized); +} + +std::vector GLCanvas3D::load_object(const Model& model, int obj_idx, std::vector instance_idxs) +{ + if ((0 <= obj_idx) && (obj_idx < (int)model.objects.size())) + { + const ModelObject* model_object = model.objects[obj_idx]; + if (model_object != nullptr) + return load_object(*model_object, obj_idx, instance_idxs); + } + + return std::vector(); +} + void GLCanvas3D::load_print_toolpaths() { if ((m_print == nullptr) || (m_volumes == nullptr)) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 4b2f82d85d..c70cff360f 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -25,6 +25,8 @@ class ExPolygon; class Print; class PrintObject; class GCodePreviewData; +class ModelObject; +class Model; namespace GUI { @@ -342,6 +344,10 @@ private: bool m_shader_enabled; bool m_multisample_allowed; + std::string m_color_by; + std::string m_select_by; + std::string m_drag_by; + GCodePreviewVolumeIndex m_gcode_preview_volume_index; PerlCallback m_on_viewport_changed_callback; @@ -411,6 +417,9 @@ public: std::vector get_current_print_zs(bool active_only) const; void set_toolpaths_range(double low, double high); + std::vector load_object(const ModelObject& model_object, int obj_idx, std::vector instance_idxs); + std::vector load_object(const Model& model, int obj_idx, std::vector instance_idxs); + // Create 3D thick extrusion lines for a skirt and brim. // Adds a new Slic3r::GUI::3DScene::Volume to volumes. void load_print_toolpaths(); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 3f903b9b38..74949c5fe4 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -450,6 +450,24 @@ void GLCanvas3DManager::set_toolpaths_range(wxGLCanvas* canvas, double low, doub it->second->set_toolpaths_range(low, high); } +std::vector GLCanvas3DManager::load_object(wxGLCanvas* canvas, const ModelObject* model_object, int obj_idx, std::vector instance_idxs) +{ + if (model_object == nullptr) + return std::vector(); + + CanvasesMap::const_iterator it = _get_canvas(canvas); + return (it != m_canvases.end()) ? it->second->load_object(*model_object, obj_idx, instance_idxs) : std::vector(); +} + +std::vector GLCanvas3DManager::load_object(wxGLCanvas* canvas, const Model* model, int obj_idx, std::vector instance_idxs) +{ + if (model == nullptr) + return std::vector(); + + CanvasesMap::const_iterator it = _get_canvas(canvas); + return (it != m_canvases.end()) ? it->second->load_object(*model, obj_idx, instance_idxs) : std::vector(); +} + void GLCanvas3DManager::load_print_toolpaths(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 0d741d550b..6ca22737ba 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -95,6 +95,9 @@ public: std::vector get_current_print_zs(wxGLCanvas* canvas, bool active_only) const; void set_toolpaths_range(wxGLCanvas* canvas, double low, double high); + std::vector load_object(wxGLCanvas* canvas, const ModelObject* model_object, int obj_idx, std::vector instance_idxs); + std::vector load_object(wxGLCanvas* canvas, const Model* model, int obj_idx, std::vector instance_idxs); + void load_print_toolpaths(wxGLCanvas* canvas); void load_print_object_toolpaths(wxGLCanvas* canvas, const PrintObject* print_object, const std::vector& tool_colors); void load_wipe_tower_toolpaths(wxGLCanvas* canvas, const std::vector& str_tool_colors); diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index f6f5134d6b..bf8a6a67eb 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -510,6 +510,28 @@ reset_warning_texture() CODE: _3DScene::reset_warning_texture(); +std::vector +load_model_object(canvas, model_object, obj_idx, instance_idxs) + SV *canvas; + ModelObject *model_object; + int obj_idx; + std::vector instance_idxs; + CODE: + RETVAL = _3DScene::load_object((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), model_object, obj_idx, instance_idxs); + OUTPUT: + RETVAL + +std::vector +load_model(canvas, model, obj_idx, instance_idxs) + SV *canvas; + Model *model; + int obj_idx; + std::vector instance_idxs; + CODE: + RETVAL = _3DScene::load_object((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), model, obj_idx, instance_idxs); + OUTPUT: + RETVAL + void load_print_toolpaths(canvas) SV *canvas;