Merge remote-tracking branch 'origin/scene_manipulators'
This commit is contained in:
commit
00324a14b8
@ -1316,12 +1316,18 @@ sub Render {
|
|||||||
$self->mark_volumes_for_layer_height;
|
$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->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);
|
$self->volumes->update_outside_state($self->{config}, 0);
|
||||||
|
# do not cull backfaces to show broken geometry, if any
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
$self->{plain_shader}->enable if $self->{plain_shader};
|
$self->{plain_shader}->enable if $self->{plain_shader};
|
||||||
$self->volumes->render_VBOs;
|
$self->volumes->render_VBOs;
|
||||||
$self->{plain_shader}->disable;
|
$self->{plain_shader}->disable;
|
||||||
|
glEnable(GL_CULL_FACE) if ($self->enable_picking);
|
||||||
} else {
|
} else {
|
||||||
|
# do not cull backfaces to show broken geometry, if any
|
||||||
|
glDisable(GL_CULL_FACE) if ($self->enable_picking);
|
||||||
$self->volumes->render_legacy;
|
$self->volumes->render_legacy;
|
||||||
|
glEnable(GL_CULL_FACE) if ($self->enable_picking);
|
||||||
}
|
}
|
||||||
|
|
||||||
# draw cutting plane
|
# draw cutting plane
|
||||||
@ -1358,6 +1364,9 @@ sub draw_volumes {
|
|||||||
# $fakecolor is a boolean indicating, that the objects shall be rendered in a color coding the object index for picking.
|
# $fakecolor is a boolean indicating, that the objects shall be rendered in a color coding the object index for picking.
|
||||||
my ($self, $fakecolor) = @_;
|
my ($self, $fakecolor) = @_;
|
||||||
|
|
||||||
|
# do not cull backfaces to show broken geometry, if any
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
@ -1386,6 +1395,8 @@ sub draw_volumes {
|
|||||||
glDisableClientState(GL_NORMAL_ARRAY);
|
glDisableClientState(GL_NORMAL_ARRAY);
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
if (defined $self->cutting_plane_z) {
|
if (defined $self->cutting_plane_z) {
|
||||||
glLineWidth(2);
|
glLineWidth(2);
|
||||||
glColor3f(0, 0, 0);
|
glColor3f(0, 0, 0);
|
||||||
@ -1812,6 +1823,7 @@ sub _fragment_shader_Gouraud {
|
|||||||
return <<'FRAGMENT';
|
return <<'FRAGMENT';
|
||||||
#version 110
|
#version 110
|
||||||
|
|
||||||
|
const vec4 OUTSIDE_COLOR = vec4(0.24, 0.42, 0.62, 1.0);
|
||||||
const vec3 ZERO = vec3(0.0, 0.0, 0.0);
|
const vec3 ZERO = vec3(0.0, 0.0, 0.0);
|
||||||
|
|
||||||
// x = tainted, y = specular;
|
// x = tainted, y = specular;
|
||||||
@ -1824,13 +1836,11 @@ uniform vec4 uniform_color;
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_FragColor = vec4(intensity.y, intensity.y, intensity.y, 0.0) + uniform_color * intensity.x;
|
// if the fragment is outside the print volume use predefined color
|
||||||
|
vec4 color = (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) ? OUTSIDE_COLOR : uniform_color;
|
||||||
|
|
||||||
// if the fragment is outside the print volume darken it and set it as transparent
|
gl_FragColor = vec4(intensity.y, intensity.y, intensity.y, 0.0) + color * intensity.x;
|
||||||
if (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO)))
|
gl_FragColor.a = color.a;
|
||||||
gl_FragColor = vec4(mix(gl_FragColor.xyz, ZERO, 0.5), 0.5 * uniform_color.a);
|
|
||||||
else
|
|
||||||
gl_FragColor.a = uniform_color.a;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FRAGMENT
|
FRAGMENT
|
||||||
|
@ -98,6 +98,16 @@ sub new {
|
|||||||
$self->update;
|
$self->update;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# callback to enable/disable action buttons
|
||||||
|
my $enable_action_buttons = sub {
|
||||||
|
my ($enable) = @_;
|
||||||
|
$self->{btn_export_gcode}->Enable($enable);
|
||||||
|
$self->{btn_reslice}->Enable($enable);
|
||||||
|
$self->{btn_print}->Enable($enable);
|
||||||
|
$self->{btn_send_gcode}->Enable($enable);
|
||||||
|
$self->{btn_export_stl}->Enable($enable);
|
||||||
|
};
|
||||||
|
|
||||||
# Initialize 3D plater
|
# Initialize 3D plater
|
||||||
if ($Slic3r::GUI::have_OpenGL) {
|
if ($Slic3r::GUI::have_OpenGL) {
|
||||||
$self->{canvas3D} = Slic3r::GUI::Plater::3D->new($self->{preview_notebook}, $self->{objects}, $self->{model}, $self->{print}, $self->{config});
|
$self->{canvas3D} = Slic3r::GUI::Plater::3D->new($self->{preview_notebook}, $self->{objects}, $self->{model}, $self->{print}, $self->{config});
|
||||||
@ -113,6 +123,7 @@ sub new {
|
|||||||
$self->{canvas3D}->set_on_decrease_objects(sub { $self->decrease() });
|
$self->{canvas3D}->set_on_decrease_objects(sub { $self->decrease() });
|
||||||
$self->{canvas3D}->set_on_remove_object(sub { $self->remove() });
|
$self->{canvas3D}->set_on_remove_object(sub { $self->remove() });
|
||||||
$self->{canvas3D}->set_on_instances_moved($on_instances_moved);
|
$self->{canvas3D}->set_on_instances_moved($on_instances_moved);
|
||||||
|
$self->{canvas3D}->set_on_enable_action_buttons($enable_action_buttons);
|
||||||
$self->{canvas3D}->use_plain_shader(1);
|
$self->{canvas3D}->use_plain_shader(1);
|
||||||
$self->{canvas3D}->set_on_wipe_tower_moved(sub {
|
$self->{canvas3D}->set_on_wipe_tower_moved(sub {
|
||||||
my ($new_pos_3f) = @_;
|
my ($new_pos_3f) = @_;
|
||||||
|
@ -12,7 +12,7 @@ use Wx::Locale gettext => 'L';
|
|||||||
|
|
||||||
__PACKAGE__->mk_accessors(qw(
|
__PACKAGE__->mk_accessors(qw(
|
||||||
on_arrange on_rotate_object_left on_rotate_object_right on_scale_object_uniformly
|
on_arrange on_rotate_object_left on_rotate_object_right on_scale_object_uniformly
|
||||||
on_remove_object on_increase_objects on_decrease_objects));
|
on_remove_object on_increase_objects on_decrease_objects on_enable_action_buttons));
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my $class = shift;
|
my $class = shift;
|
||||||
@ -176,6 +176,11 @@ sub set_on_model_update {
|
|||||||
$self->on_model_update($cb);
|
$self->on_model_update($cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub set_on_enable_action_buttons {
|
||||||
|
my ($self, $cb) = @_;
|
||||||
|
$self->on_enable_action_buttons($cb);
|
||||||
|
}
|
||||||
|
|
||||||
sub reload_scene {
|
sub reload_scene {
|
||||||
my ($self, $force) = @_;
|
my ($self, $force) = @_;
|
||||||
|
|
||||||
@ -217,10 +222,12 @@ sub reload_scene {
|
|||||||
if (!$self->{model}->fits_print_volume($self->{config})) {
|
if (!$self->{model}->fits_print_volume($self->{config})) {
|
||||||
$self->set_warning_enabled(1);
|
$self->set_warning_enabled(1);
|
||||||
Slic3r::GUI::_3DScene::generate_warning_texture(L("Detected object outside print volume"));
|
Slic3r::GUI::_3DScene::generate_warning_texture(L("Detected object outside print volume"));
|
||||||
|
$self->on_enable_action_buttons->(0) if ($self->on_enable_action_buttons);
|
||||||
} else {
|
} else {
|
||||||
$self->set_warning_enabled(0);
|
$self->set_warning_enabled(0);
|
||||||
$self->volumes->update_outside_state($self->{config}, 1);
|
$self->volumes->update_outside_state($self->{config}, 1);
|
||||||
Slic3r::GUI::_3DScene::reset_warning_texture();
|
Slic3r::GUI::_3DScene::reset_warning_texture();
|
||||||
|
$self->on_enable_action_buttons->(1) if ($self->on_enable_action_buttons);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -450,6 +450,8 @@ bool Model::fits_print_volume(const DynamicPrintConfig* config) const
|
|||||||
|
|
||||||
BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values));
|
BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values));
|
||||||
BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config->opt_float("max_print_height")));
|
BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config->opt_float("max_print_height")));
|
||||||
|
// Allow the objects to protrude below the print bed
|
||||||
|
print_volume.min.z = -1e10;
|
||||||
return print_volume.contains(transformed_bounding_box());
|
return print_volume.contains(transformed_bounding_box());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -459,6 +461,8 @@ bool Model::fits_print_volume(const FullPrintConfig &config) const
|
|||||||
return true;
|
return true;
|
||||||
BoundingBox bed_box_2D = get_extents(Polygon::new_scale(config.bed_shape.values));
|
BoundingBox bed_box_2D = get_extents(Polygon::new_scale(config.bed_shape.values));
|
||||||
BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config.max_print_height));
|
BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config.max_print_height));
|
||||||
|
// Allow the objects to protrude below the print bed
|
||||||
|
print_volume.min.z = -1e10;
|
||||||
return print_volume.contains(transformed_bounding_box());
|
return print_volume.contains(transformed_bounding_box());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,8 +194,8 @@ void GLIndexedVertexArray::render(
|
|||||||
|
|
||||||
const float GLVolume::SELECTED_COLOR[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
|
const float GLVolume::SELECTED_COLOR[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
|
||||||
const float GLVolume::HOVER_COLOR[4] = { 0.4f, 0.9f, 0.1f, 1.0f };
|
const float GLVolume::HOVER_COLOR[4] = { 0.4f, 0.9f, 0.1f, 1.0f };
|
||||||
const float GLVolume::OUTSIDE_COLOR[4] = { 0.75f, 0.0f, 0.75f, 1.0f };
|
const float GLVolume::OUTSIDE_COLOR[4] = { 0.0f, 0.38f, 0.8f, 1.0f };
|
||||||
const float GLVolume::SELECTED_OUTSIDE_COLOR[4] = { 1.0f, 0.0f, 1.0f, 1.0f };
|
const float GLVolume::SELECTED_OUTSIDE_COLOR[4] = { 0.19f, 0.58f, 1.0f, 1.0f };
|
||||||
|
|
||||||
void GLVolume::set_render_color(float r, float g, float b, float a)
|
void GLVolume::set_render_color(float r, float g, float b, float a)
|
||||||
{
|
{
|
||||||
@ -627,6 +627,8 @@ void GLVolumeCollection::update_outside_state(const DynamicPrintConfig* config,
|
|||||||
|
|
||||||
BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values));
|
BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values));
|
||||||
BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config->opt_float("max_print_height")));
|
BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config->opt_float("max_print_height")));
|
||||||
|
// Allow the objects to protrude below the print bed
|
||||||
|
print_volume.min.z = -1e10;
|
||||||
|
|
||||||
for (GLVolume* volume : this->volumes)
|
for (GLVolume* volume : this->volumes)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user