From 43ac693900ff7f6ff46a93f19b18b1fdb8a7b19f Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 7 Feb 2017 18:17:12 +0100 Subject: [PATCH] Added a tooltip overlay for the variable layer height edit tool. Short methods of PrintState made inline. Added layer height profile to a Model class. --- lib/Slic3r/GUI/3DScene.pm | 85 +++++++++++++++++++++++--- var/variable_layer_height_tooltip.png | Bin 0 -> 10017 bytes xs/src/libslic3r/Model.hpp | 3 + xs/src/libslic3r/Print.cpp | 37 ----------- xs/src/libslic3r/Print.hpp | 18 +++--- xs/src/libslic3r/PrintObject.cpp | 6 +- xs/xsp/Model.xsp | 2 + xs/xsp/Print.xsp | 3 +- 8 files changed, 98 insertions(+), 56 deletions(-) create mode 100644 var/variable_layer_height_tooltip.png diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index fcb54c018..9cd7cc1a3 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -19,7 +19,7 @@ package Slic3r::GUI::3DScene::Base; use strict; use warnings; -use Wx qw(:timer); +use Wx qw(:timer :bitmap); use Wx::Event qw(EVT_PAINT EVT_SIZE EVT_ERASE_BACKGROUND EVT_IDLE EVT_MOUSEWHEEL EVT_MOUSE_EVENTS EVT_TIMER); # must load OpenGL *before* Wx::GLCanvas use OpenGL qw(:glconstants :glfunctions :glufunctions :gluconstants); @@ -173,7 +173,7 @@ sub new { my ($self, $event) = @_; return if ! $self->_layer_height_edited; return if $self->{layer_height_edit_last_object_id} == -1; - $self->_variable_layer_thickness_action(undef, 1); + $self->_variable_layer_thickness_action(undef); }); return $self; @@ -262,7 +262,7 @@ sub mouse_event { # A volume is selected and the mouse is hovering over a layer thickness bar. # Start editing the layer height. $self->_layer_height_edited(1); - $self->_variable_layer_thickness_action($e, 1); + $self->_variable_layer_thickness_action($e); } else { # Select volume in this 3D canvas. # Don't deselect a volume if layer editing is enabled. We want the object to stay selected @@ -325,7 +325,7 @@ sub mouse_event { $self->Refresh; } elsif ($e->Dragging) { if ($self->_layer_height_edited && $object_idx_selected != -1) { - $self->_variable_layer_thickness_action($e, 0); + $self->_variable_layer_thickness_action($e); } elsif ($e->LeftIsDown) { # if dragging over blank area with left button, rotate if (defined $self->_drag_start_pos) { @@ -1125,7 +1125,16 @@ sub draw_volumes { my $volume = $self->volumes->[$volume_idx]; my $shader_active = 0; - if ($self->layer_editing_enabled && ! $fakecolor && $volume->selected && $self->{shader} && $volume->{layer_height_texture_data} && $volume->{layer_height_texture_cells}) { + if ($self->layer_editing_enabled && ! $fakecolor && $volume->selected && $self->{shader} && $volume->{layer_height_texture_data}) { + my $print_object = $self->{print}->get_object(int($volume->select_group_id / 1000000)); + if (! defined($volume->{layer_height_texture_cells}) || $print_object->update_layer_height_profile) { + # Layer height profile was invalid before, now filled in with default data from layer height configuration + # and possibly from the layer height modifiers. Update the height texture. + $volume->{layer_height_texture_cells} = $print_object->generate_layer_height_texture( + $volume->{layer_height_texture_data}->ptr, + $self->{layer_preview_z_texture_height}, + $self->{layer_preview_z_texture_width}); + } $self->{shader}->Enable; my $z_to_texture_row_id = $self->{shader}->Map('z_to_texture_row'); my $z_texture_row_to_normalized_id = $self->{shader}->Map('z_texture_row_to_normalized'); @@ -1263,6 +1272,45 @@ sub draw_volumes { glDisableClientState(GL_VERTEX_ARRAY); } +sub _variable_layer_thickness_load_overlay_image { + my ($self) = @_; + + if (! $self->{layer_preview_annotation}->{loaded}) { + # Load a PNG with an alpha channel. + my $img = Wx::Image->new; + $img->LoadFile($Slic3r::var->("variable_layer_height_tooltip.png"), wxBITMAP_TYPE_PNG); + # Get RGB & alpha raw data from wxImage, interleave them into a Perl array. + my @rgb = unpack 'C*', $img->GetData(); + my @alpha = unpack 'C*', $img->GetAlpha(); + my $n_pixels = int(@alpha); + my @data = (0)x($n_pixels * 4); + for (my $i = 0; $i < $n_pixels; $i += 1) { + $data[$i*4 ] = $rgb[$i*3]; + $data[$i*4+1] = $rgb[$i*3+1]; + $data[$i*4+2] = $rgb[$i*3+2]; + $data[$i*4+3] = $alpha[$i]; + } + # Initialize a raw bitmap data. + my $params = $self->{layer_preview_annotation} = { + loaded => 1, + valid => $n_pixels > 0, + width => $img->GetWidth, + height => $img->GetHeight, + data => OpenGL::Array->new_list(GL_UNSIGNED_BYTE, @data), + texture_id => glGenTextures_p(1) + }; + # Create and initialize a texture with the raw data. + glBindTexture(GL_TEXTURE_2D, $params->{texture_id}); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); + glTexImage2D_c(GL_TEXTURE_2D, 0, GL_RGBA8, $params->{width}, $params->{height}, 0, GL_RGBA, GL_UNSIGNED_BYTE, $params->{data}->ptr); + glBindTexture(GL_TEXTURE_2D, 0); + } + + return $self->{layer_preview_annotation}->{valid}; +} + sub draw_active_object_annotations { # $fakecolor is a boolean indicating, that the objects shall be rendered in a color coding the object index for picking. my ($self) = @_; @@ -1324,6 +1372,28 @@ sub draw_active_object_annotations { glBindTexture(GL_TEXTURE_2D, 0); $self->{shader}->Disable; + # Paint the tooltip. + if ($self->_variable_layer_thickness_load_overlay_image) { + glColor4f(1.,1.,1.,1.); + glDisable(GL_LIGHTING); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, $self->{layer_preview_annotation}->{texture_id}); + glBegin(GL_QUADS); + my $gap = 10/$self->_zoom; + my ($l, $r, $t, $b) = ($bar_left - $self->{layer_preview_annotation}->{width}/$self->_zoom - $gap, $bar_left - $gap, $bar_bottom + $self->{layer_preview_annotation}->{height}/$self->_zoom + $gap, $bar_bottom + $gap); + glTexCoord2d(0.,1.); glVertex3f($l, $b, 0); + glTexCoord2d(1.,1.); glVertex3f($r, $b, 0); + glTexCoord2d(1.,0.); glVertex3f($r, $t, 0); + glTexCoord2d(0.,0.); glVertex3f($l, $t, 0); + glEnd(); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + } + # Paint the graph. my $object_idx = int($volume->select_group_id / 1000000); my $print_object = $self->{print}->get_object($object_idx); @@ -1593,11 +1663,6 @@ sub load_object { if ($print && $obj_idx < $print->object_count) { # Generate the layer height texture. Allocate data for the 0th and 1st mipmap levels. $layer_height_texture_data = OpenGL::Array->new($self->{layer_preview_z_texture_width}*$self->{layer_preview_z_texture_height}*5, GL_UNSIGNED_BYTE); -# $print->get_object($obj_idx)->update_layer_height_profile_from_ranges(); - $layer_height_texture_cells = $print->get_object($obj_idx)->generate_layer_height_texture( - $layer_height_texture_data->ptr, - $self->{layer_preview_z_texture_height}, - $self->{layer_preview_z_texture_width}); } my @volumes_idx = (); diff --git a/var/variable_layer_height_tooltip.png b/var/variable_layer_height_tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..18200529278f5b24de50c01de9121a884db25052 GIT binary patch literal 10017 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 literal 0 HcmV?d00001 diff --git a/xs/src/libslic3r/Model.hpp b/xs/src/libslic3r/Model.hpp index 963bd7c85..e6e98bc01 100644 --- a/xs/src/libslic3r/Model.hpp +++ b/xs/src/libslic3r/Model.hpp @@ -114,6 +114,9 @@ public: DynamicPrintConfig config; // Variation of a layer thickness for spans of Z coordinates. t_layer_height_ranges layer_height_ranges; + // Profile of increasing z to a layer height, to be linearly interpolated when calculating the layers. + // The pairs of are packed into a 1D array to simplify handling by the Perl XS. + std::vector layer_height_profile; /* This vector accumulates the total translation applied to the object by the center_around_origin() method. Callers might want to apply the same translation diff --git a/xs/src/libslic3r/Print.cpp b/xs/src/libslic3r/Print.cpp index 6e2fdb4f3..539562a16 100644 --- a/xs/src/libslic3r/Print.cpp +++ b/xs/src/libslic3r/Print.cpp @@ -8,43 +8,6 @@ namespace Slic3r { -template -bool -PrintState::is_started(StepClass step) const -{ - return this->started.find(step) != this->started.end(); -} - -template -bool -PrintState::is_done(StepClass step) const -{ - return this->done.find(step) != this->done.end(); -} - -template -void -PrintState::set_started(StepClass step) -{ - this->started.insert(step); -} - -template -void -PrintState::set_done(StepClass step) -{ - this->done.insert(step); -} - -template -bool -PrintState::invalidate(StepClass step) -{ - bool invalidated = this->started.erase(step) > 0; - this->done.erase(step); - return invalidated; -} - template class PrintState; template class PrintState; diff --git a/xs/src/libslic3r/Print.hpp b/xs/src/libslic3r/Print.hpp index a0392290d..99582d65d 100644 --- a/xs/src/libslic3r/Print.hpp +++ b/xs/src/libslic3r/Print.hpp @@ -33,14 +33,18 @@ enum PrintObjectStep { template class PrintState { - public: +public: std::set started, done; - bool is_started(StepType step) const; - bool is_done(StepType step) const; - void set_started(StepType step); - void set_done(StepType step); - bool invalidate(StepType step); + bool is_started(StepType step) const { return this->started.find(step) != this->started.end(); } + bool is_done(StepType step) const { return this->done.find(step) != this->done.end(); } + void set_started(StepType step) { this->started.insert(step); } + void set_done(StepType step) { this->done.insert(step); } + bool invalidate(StepType step) { + bool invalidated = this->started.erase(step) > 0; + this->done.erase(step); + return invalidated; + } }; // A PrintRegion object represents a group of volumes to print @@ -143,7 +147,7 @@ public: // Process layer_height_ranges, the raft layers and first layer thickness into layer_height_profile. // The layer_height_profile may be later modified interactively by the user to refine layers at sloping surfaces. - void update_layer_height_profile(); + bool update_layer_height_profile(); // Collect the slicing parameters, to be used by variable layer thickness algorithm, // by the interactive layer height editor and by the printing process itself. diff --git a/xs/src/libslic3r/PrintObject.cpp b/xs/src/libslic3r/PrintObject.cpp index 94001cb38..8091db973 100644 --- a/xs/src/libslic3r/PrintObject.cpp +++ b/xs/src/libslic3r/PrintObject.cpp @@ -49,6 +49,7 @@ PrintObject::PrintObject(Print* print, ModelObject* model_object, const Bounding this->reload_model_instances(); this->layer_height_ranges = model_object->layer_height_ranges; + this->layer_height_profile = model_object->layer_height_profile; } bool @@ -949,8 +950,9 @@ SlicingParameters PrintObject::slicing_parameters() const unscale(this->size.z), this->print()->object_extruders()); } -void PrintObject::update_layer_height_profile() +bool PrintObject::update_layer_height_profile() { + bool updated = false; if (this->layer_height_profile.empty()) { if (0) // if (this->layer_height_profile.empty()) @@ -958,7 +960,9 @@ void PrintObject::update_layer_height_profile() this->model_object()->volumes); else this->layer_height_profile = layer_height_profile_from_ranges(this->slicing_parameters(), this->layer_height_ranges); + updated = true; } + return updated; } // 1) Decides Z positions of the layers, diff --git a/xs/xsp/Model.xsp b/xs/xsp/Model.xsp index aedc1f7dc..1859779b9 100644 --- a/xs/xsp/Model.xsp +++ b/xs/xsp/Model.xsp @@ -4,6 +4,7 @@ #include #include "libslic3r/Model.hpp" #include "libslic3r/PrintConfig.hpp" +#include "libslic3r/Slicing.hpp" %} %name{Slic3r::Model} class Model { @@ -169,6 +170,7 @@ ModelMaterial::attributes() void set_layer_height_ranges(t_layer_height_ranges ranges) %code%{ THIS->layer_height_ranges = ranges; %}; + Ref origin_translation() %code%{ RETVAL = &THIS->origin_translation; %}; void set_origin_translation(Pointf3* point) diff --git a/xs/xsp/Print.xsp b/xs/xsp/Print.xsp index d2fca6105..f7a3fa118 100644 --- a/xs/xsp/Print.xsp +++ b/xs/xsp/Print.xsp @@ -3,7 +3,6 @@ %{ #include #include "libslic3r/Print.hpp" -#include "libslic3r/Slicing.hpp" #include "libslic3r/PlaceholderParser.hpp" %} @@ -121,6 +120,8 @@ _constant() void _infill(); void _generate_support_material(); + bool update_layer_height_profile(); + void adjust_layer_height_profile(coordf_t z, coordf_t layer_thickness_delta, coordf_t band_width, int action) %code%{ THIS->update_layer_height_profile();