Reddish background when detected out of print volume toolpaths

This commit is contained in:
Enrico Turri 2018-07-27 09:38:39 +02:00
parent c2ab8c2ae3
commit 3a1ec8285e
8 changed files with 57 additions and 18 deletions

View file

@ -215,6 +215,7 @@ sub new {
if ($Slic3r::GUI::have_OpenGL) { 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} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print}, $self->{gcode_preview_data}, $self->{config});
Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1); Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1);
Slic3r::GUI::_3DScene::enable_dynamic_background($self->{preview3D}->canvas, 1);
Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $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->{preview_notebook}->AddPage($self->{preview3D}, L('Preview')); $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview'));
$self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1; $self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1;

View file

@ -1787,6 +1787,11 @@ void _3DScene::enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable)
s_canvas_mgr.enable_force_zoom_to_bed(canvas, enable); s_canvas_mgr.enable_force_zoom_to_bed(canvas, enable);
} }
void _3DScene::enable_dynamic_background(wxGLCanvas* canvas, bool enable)
{
s_canvas_mgr.enable_dynamic_background(canvas, enable);
}
void _3DScene::allow_multisample(wxGLCanvas* canvas, bool allow) void _3DScene::allow_multisample(wxGLCanvas* canvas, bool allow)
{ {
s_canvas_mgr.allow_multisample(canvas, allow); s_canvas_mgr.allow_multisample(canvas, allow);

View file

@ -499,6 +499,7 @@ public:
static void enable_gizmos(wxGLCanvas* canvas, bool enable); static void enable_gizmos(wxGLCanvas* canvas, bool enable);
static void enable_shader(wxGLCanvas* canvas, bool enable); static void enable_shader(wxGLCanvas* canvas, bool enable);
static void enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable); static void enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable);
static void enable_dynamic_background(wxGLCanvas* canvas, bool enable);
static void allow_multisample(wxGLCanvas* canvas, bool allow); static void allow_multisample(wxGLCanvas* canvas, bool allow);
static void zoom_to_bed(wxGLCanvas* canvas); static void zoom_to_bed(wxGLCanvas* canvas);

View file

@ -51,6 +51,9 @@ static const float UNIT_MATRIX[] = { 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f }; 0.0f, 0.0f, 0.0f, 1.0f };
static const float DEFAULT_BG_COLOR[3] = { 10.0f / 255.0f, 98.0f / 255.0f, 144.0f / 255.0f };
static const float ERROR_BG_COLOR[3] = { 144.0f / 255.0f, 49.0f / 255.0f, 10.0f / 255.0f };
namespace Slic3r { namespace Slic3r {
namespace GUI { namespace GUI {
@ -1703,6 +1706,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas)
, m_picking_enabled(false) , m_picking_enabled(false)
, m_moving_enabled(false) , m_moving_enabled(false)
, m_shader_enabled(false) , m_shader_enabled(false)
, m_dynamic_background_enabled(false)
, m_multisample_allowed(false) , m_multisample_allowed(false)
, m_color_by("volume") , m_color_by("volume")
, m_select_by("object") , m_select_by("object")
@ -2067,6 +2071,11 @@ void GLCanvas3D::enable_force_zoom_to_bed(bool enable)
m_force_zoom_to_bed_enabled = enable; m_force_zoom_to_bed_enabled = enable;
} }
void GLCanvas3D::enable_dynamic_background(bool enable)
{
m_dynamic_background_enabled = enable;
}
void GLCanvas3D::allow_multisample(bool allow) void GLCanvas3D::allow_multisample(bool allow)
{ {
m_multisample_allowed = allow; m_multisample_allowed = allow;
@ -3431,8 +3440,6 @@ void GLCanvas3D::_render_background() const
{ {
::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
static const float COLOR[3] = { 10.0f / 255.0f, 98.0f / 255.0f, 144.0f / 255.0f };
::glPushMatrix(); ::glPushMatrix();
::glLoadIdentity(); ::glLoadIdentity();
::glMatrixMode(GL_PROJECTION); ::glMatrixMode(GL_PROJECTION);
@ -3444,11 +3451,16 @@ void GLCanvas3D::_render_background() const
::glBegin(GL_QUADS); ::glBegin(GL_QUADS);
::glColor3f(0.0f, 0.0f, 0.0f); ::glColor3f(0.0f, 0.0f, 0.0f);
::glVertex3f(-1.0f, -1.0f, 1.0f); ::glVertex2f(-1.0f, -1.0f);
::glVertex3f(1.0f, -1.0f, 1.0f); ::glVertex2f(1.0f, -1.0f);
::glColor3f(COLOR[0], COLOR[1], COLOR[2]);
::glVertex3f(1.0f, 1.0f, 1.0f); if (m_dynamic_background_enabled && _is_any_volume_outside())
::glVertex3f(-1.0f, 1.0f, 1.0f); ::glColor3f(ERROR_BG_COLOR[0], ERROR_BG_COLOR[1], ERROR_BG_COLOR[2]);
else
::glColor3f(DEFAULT_BG_COLOR[0], DEFAULT_BG_COLOR[1], DEFAULT_BG_COLOR[2]);
::glVertex2f(1.0f, 1.0f);
::glVertex2f(-1.0f, 1.0f);
::glEnd(); ::glEnd();
::glEnable(GL_DEPTH_TEST); ::glEnable(GL_DEPTH_TEST);
@ -4772,17 +4784,7 @@ void GLCanvas3D::_update_toolpath_volumes_outside_state()
void GLCanvas3D::_show_warning_texture_if_needed() void GLCanvas3D::_show_warning_texture_if_needed()
{ {
bool detected_outside = false; if (_is_any_volume_outside())
for (const GLVolume* volume : m_volumes.volumes)
{
if ((volume != nullptr) && volume->is_outside)
{
detected_outside = true;
break;
}
}
if (detected_outside)
{ {
enable_warning_texture(true); enable_warning_texture(true);
_generate_warning_texture(L("Detected toolpath outside print volume")); _generate_warning_texture(L("Detected toolpath outside print volume"));
@ -4899,5 +4901,16 @@ void GLCanvas3D::_reset_warning_texture()
m_warning_texture.reset(); m_warning_texture.reset();
} }
bool GLCanvas3D::_is_any_volume_outside() const
{
for (const GLVolume* volume : m_volumes.volumes)
{
if ((volume != nullptr) && volume->is_outside)
return true;
}
return false;
}
} // namespace GUI } // namespace GUI
} // namespace Slic3r } // namespace Slic3r

View file

@ -449,6 +449,7 @@ private:
bool m_picking_enabled; bool m_picking_enabled;
bool m_moving_enabled; bool m_moving_enabled;
bool m_shader_enabled; bool m_shader_enabled;
bool m_dynamic_background_enabled;
bool m_multisample_allowed; bool m_multisample_allowed;
std::string m_color_by; std::string m_color_by;
@ -539,6 +540,7 @@ public:
void enable_gizmos(bool enable); void enable_gizmos(bool enable);
void enable_shader(bool enable); void enable_shader(bool enable);
void enable_force_zoom_to_bed(bool enable); void enable_force_zoom_to_bed(bool enable);
void enable_dynamic_background(bool enable);
void allow_multisample(bool allow); void allow_multisample(bool allow);
void zoom_to_bed(); void zoom_to_bed();
@ -682,6 +684,8 @@ private:
void _generate_warning_texture(const std::string& msg); void _generate_warning_texture(const std::string& msg);
void _reset_warning_texture(); void _reset_warning_texture();
bool _is_any_volume_outside() const;
static std::vector<float> _parse_colors(const std::vector<std::string>& colors); static std::vector<float> _parse_colors(const std::vector<std::string>& colors);
}; };

View file

@ -418,6 +418,13 @@ void GLCanvas3DManager::enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable
it->second->enable_force_zoom_to_bed(enable); it->second->enable_force_zoom_to_bed(enable);
} }
void GLCanvas3DManager::enable_dynamic_background(wxGLCanvas* canvas, bool enable)
{
CanvasesMap::iterator it = _get_canvas(canvas);
if (it != m_canvases.end())
it->second->enable_dynamic_background(enable);
}
void GLCanvas3DManager::allow_multisample(wxGLCanvas* canvas, bool allow) void GLCanvas3DManager::allow_multisample(wxGLCanvas* canvas, bool allow)
{ {
CanvasesMap::iterator it = _get_canvas(canvas); CanvasesMap::iterator it = _get_canvas(canvas);

View file

@ -112,6 +112,7 @@ public:
void enable_gizmos(wxGLCanvas* canvas, bool enable); void enable_gizmos(wxGLCanvas* canvas, bool enable);
void enable_shader(wxGLCanvas* canvas, bool enable); void enable_shader(wxGLCanvas* canvas, bool enable);
void enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable); void enable_force_zoom_to_bed(wxGLCanvas* canvas, bool enable);
void enable_dynamic_background(wxGLCanvas* canvas, bool enable);
void allow_multisample(wxGLCanvas* canvas, bool allow); void allow_multisample(wxGLCanvas* canvas, bool allow);
void zoom_to_bed(wxGLCanvas* canvas); void zoom_to_bed(wxGLCanvas* canvas);

View file

@ -430,6 +430,13 @@ enable_force_zoom_to_bed(canvas, enable)
CODE: CODE:
_3DScene::enable_force_zoom_to_bed((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), enable); _3DScene::enable_force_zoom_to_bed((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), enable);
void
enable_dynamic_background(canvas, enable)
SV *canvas;
bool enable;
CODE:
_3DScene::enable_dynamic_background((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), enable);
void void
allow_multisample(canvas, allow) allow_multisample(canvas, allow)
SV *canvas; SV *canvas;