From ee5ee5f432a7a84049324596e6b0e9d33b6cddc0 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 31 May 2017 17:05:11 +0200 Subject: [PATCH] Performance improvements in reloading the 3D scene. Now the 3D scene loading is postponed until the page is visible. --- lib/Slic3r/GUI/MainFrame.pm | 2 +- lib/Slic3r/GUI/Plater.pm | 62 +++++++++++++----------------- lib/Slic3r/GUI/Plater/3D.pm | 19 +++++++-- lib/Slic3r/GUI/Plater/3DPreview.pm | 14 ++++++- 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index 30ec15e91..a194c7b5a 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -134,7 +134,7 @@ sub _init_tabpanel { no_controller => $self->{no_controller}); # Callback to be executed after any of the configuration fields (Perl class Slic3r::GUI::OptionsGroup::Field) change their value. $tab->on_value_change(sub { - my ($opt_key, $value) = @_; + my ($opt_key, $value) = @_; my $config = $tab->config; if ($self->{plater}) { $self->{plater}->on_config_change($config); # propagate config change events to the plater diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 7743077ad..938350f58 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -631,7 +631,7 @@ sub update_presets { sub update_filament_colors_preview { my ($self, $extruder_idx) = shift; - my @choosers = @{$self->{preset_choosers}{filament}}; + my @choosers = @{$self->{preset_choosers}{filament}}; if (ref $extruder_idx) { # $extruder_idx is the chooser. @@ -1210,28 +1210,30 @@ sub async_apply_config { # apply new config my $invalidated = $self->{print}->apply_config($self->GetFrame->config); + # Just redraw the 3D canvas without reloading the scene. # $self->{canvas3D}->Refresh if ($invalidated && $self->{canvas3D}->layer_editing_enabled); $self->{canvas3D}->Refresh if ($self->{canvas3D}->layer_editing_enabled); # Hide the slicing results if the current slicing status is no more valid. $self->{"print_info_box_show"}->(0) if $invalidated; - return if !$Slic3r::GUI::Settings->{_}{background_processing}; - - if ($invalidated) { - # kill current thread if any - $self->stop_background_process; - } else { - $self->resume_background_process; + if ($Slic3r::GUI::Settings->{_}{background_processing}) { + if ($invalidated) { + # kill current thread if any + $self->stop_background_process; + } else { + $self->resume_background_process; + } + # schedule a new process thread in case it wasn't running + $self->start_background_process; } - - # schedule a new process thread in case it wasn't running - $self->start_background_process; # Reset preview canvases. If the print has been invalidated, the preview canvases will be cleared. # Otherwise they will be just refreshed. - $self->{toolpaths2D}->reload_print if $self->{toolpaths2D}; - $self->{preview3D}->reload_print if $self->{preview3D}; + if ($invalidated) { + $self->{toolpaths2D}->reload_print if $self->{toolpaths2D}; + $self->{preview3D}->reload_print if $self->{preview3D}; + } } sub start_background_process { @@ -1696,7 +1698,7 @@ sub on_thumbnail_made { my ($obj_idx) = @_; $self->{objects}[$obj_idx]->transform_thumbnail($self->{model}, $obj_idx); - $self->refresh_canvases; + $self->{canvas}->Refresh; } # this method gets called whenever print center is changed or the objects' bounding box changes @@ -1721,7 +1723,9 @@ sub update { $self->resume_background_process; } - $self->refresh_canvases; + $self->{canvas}->Refresh; + $self->{canvas3D}->reload_scene if $self->{canvas3D}; + $self->{preview3D}->reload_print if $self->{preview3D}; } # When a number of extruders changes, the UI needs to be updated to show a single filament selection combo box per extruder. @@ -1785,18 +1789,10 @@ sub on_config_change { } elsif ($opt_key =~ '^wipe_tower' || $opt_key eq 'single_extruder_multi_material') { $update_scheduled = 1; } elsif ($opt_key eq 'serial_port') { - if ($config->get('serial_port')) { - $self->{btn_print}->Show; - } else { - $self->{btn_print}->Hide; - } + $self->{btn_print}->Show($config->get('serial_port')); $self->Layout; } elsif ($opt_key eq 'octoprint_host') { - if ($config->get('octoprint_host')) { - $self->{btn_send_gcode}->Show; - } else { - $self->{btn_send_gcode}->Hide; - } + $self->{btn_send_gcode}->Show($config->get('octoprint_host')); $self->Layout; } elsif ($opt_key eq 'variable_layer_height') { if ($config->get('variable_layer_height') != 1) { @@ -1839,7 +1835,9 @@ sub list_item_deselected { if ($self->{list}->GetFirstSelected == -1) { $self->select_object(undef); - $self->refresh_canvases; + $self->{canvas}->Refresh; + #FIXME VBOs are being refreshed just to change a selection color? + $self->{canvas3D}->reload_scene if $self->{canvas3D}; } } @@ -1849,7 +1847,9 @@ sub list_item_selected { my $obj_idx = $event->GetIndex; $self->select_object($obj_idx); - $self->refresh_canvases; + $self->{canvas}->Refresh; + #FIXME VBOs are being refreshed just to change a selection color? + $self->{canvas3D}->reload_scene if $self->{canvas3D}; } sub list_item_activated { @@ -2061,14 +2061,6 @@ sub selected_object { return ($obj_idx, $self->{objects}[$obj_idx]), } -sub refresh_canvases { - my ($self) = @_; - - $self->{canvas}->Refresh; - $self->{canvas3D}->reload_scene if $self->{canvas3D}; - $self->{preview3D}->reload_print if $self->{preview3D}; -} - sub validate_config { my $self = shift; diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index c5f5d962f..6fa46030a 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -100,11 +100,18 @@ sub set_on_model_update { } sub reload_scene { - my ($self) = @_; + my ($self, $force) = @_; $self->reset_objects; $self->update_bed_size; - + + if (! $self->IsShown && ! $force) { + $self->{reload_delayed} = 1; + return; + } + + $self->{reload_delayed} = 0; + foreach my $obj_idx (0..$#{$self->{model}->objects}) { my @volume_idxs = $self->load_object($self->{model}, $self->{print}, $obj_idx); if ($self->{objects}[$obj_idx]->selected) { @@ -133,4 +140,10 @@ sub update_bed_size { $self->set_bed_shape($self->{config}->bed_shape); } -1; \ No newline at end of file +# Called by the Platter wxNotebook when this page is activated. +sub OnActivate { + my ($self) = @_; + $self->reload_scene(1) if ($self->{reload_delayed}); +} + +1; diff --git a/lib/Slic3r/GUI/Plater/3DPreview.pm b/lib/Slic3r/GUI/Plater/3DPreview.pm index 4d77d5ee0..e52cafba3 100644 --- a/lib/Slic3r/GUI/Plater/3DPreview.pm +++ b/lib/Slic3r/GUI/Plater/3DPreview.pm @@ -131,10 +131,16 @@ sub new { } sub reload_print { - my ($self) = @_; + my ($self, $force) = @_; $self->canvas->reset_objects; $self->_loaded(0); + + if (! $self->IsShown && ! $force) { + $self->{reload_delayed} = 1; + return; + } + $self->load_print; } @@ -289,4 +295,10 @@ sub set_number_extruders { } } +# Called by the Platter wxNotebook when this page is activated. +sub OnActivate { + my ($self) = @_; + $self->reload_scene(1) if ($self->{reload_delayed}); +} + 1;