Merge branch 'master' of https://github.com/prusa3d/Slic3r into time_estimate
This commit is contained in:
commit
714204b227
@ -187,6 +187,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::set_active($self->{preview3D}->canvas, 0);
|
Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
|
||||||
|
Slic3r::GUI::_3DScene::enable_legend_texture($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;
|
||||||
@ -200,19 +201,18 @@ sub new {
|
|||||||
|
|
||||||
EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub {
|
EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub {
|
||||||
my $preview = $self->{preview_notebook}->GetCurrentPage;
|
my $preview = $self->{preview_notebook}->GetCurrentPage;
|
||||||
if ($preview == $self->{preview3D})
|
if (($preview != $self->{preview3D}) && ($preview != $self->{canvas3D})) {
|
||||||
{
|
Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
|
||||||
|
Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0);
|
||||||
|
Slic3r::GUI::_3DScene::reset_current_canvas();
|
||||||
|
$preview->OnActivate if $preview->can('OnActivate');
|
||||||
|
} elsif ($preview == $self->{preview3D}) {
|
||||||
Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1);
|
Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1);
|
||||||
Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0);
|
Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0);
|
||||||
Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1);
|
$self->{preview3D}->load_print;
|
||||||
$self->{preview3D}->load_print(1);
|
|
||||||
# sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
|
# sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
|
||||||
Slic3r::GUI::_3DScene::set_as_dirty($self->{preview3D}->canvas);
|
Slic3r::GUI::_3DScene::set_as_dirty($self->{preview3D}->canvas);
|
||||||
} else {
|
} elsif ($preview == $self->{canvas3D}) {
|
||||||
Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($preview == $self->{canvas3D}) {
|
|
||||||
Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1);
|
Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1);
|
||||||
Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
|
Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
|
||||||
if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) {
|
if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) {
|
||||||
@ -222,8 +222,6 @@ sub new {
|
|||||||
}
|
}
|
||||||
# sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
|
# sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
|
||||||
Slic3r::GUI::_3DScene::set_as_dirty($self->{canvas3D});
|
Slic3r::GUI::_3DScene::set_as_dirty($self->{canvas3D});
|
||||||
} else {
|
|
||||||
$preview->OnActivate if $preview->can('OnActivate');
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -231,8 +231,10 @@ sub mouse_event {
|
|||||||
}
|
}
|
||||||
$self->Refresh;
|
$self->Refresh;
|
||||||
} elsif ($event->LeftUp) {
|
} elsif ($event->LeftUp) {
|
||||||
$self->{on_instances_moved}->()
|
if ($self->{drag_object}) {
|
||||||
if $self->{drag_object};
|
$self->{on_instances_moved}->();
|
||||||
|
Slic3r::GUI::_3DScene::reset_current_canvas();
|
||||||
|
}
|
||||||
$self->{drag_start_pos} = undef;
|
$self->{drag_start_pos} = undef;
|
||||||
$self->{drag_object} = undef;
|
$self->{drag_object} = undef;
|
||||||
$self->SetCursor(wxSTANDARD_CURSOR);
|
$self->SetCursor(wxSTANDARD_CURSOR);
|
||||||
|
@ -1754,6 +1754,16 @@ bool _3DScene::init(wxGLCanvas* canvas)
|
|||||||
return s_canvas_mgr.init(canvas);
|
return s_canvas_mgr.init(canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool _3DScene::set_current(wxGLCanvas* canvas, bool force)
|
||||||
|
{
|
||||||
|
return s_canvas_mgr.set_current(canvas, force);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _3DScene::reset_current_canvas()
|
||||||
|
{
|
||||||
|
s_canvas_mgr.set_current(nullptr, false);
|
||||||
|
}
|
||||||
|
|
||||||
void _3DScene::set_active(wxGLCanvas* canvas, bool active)
|
void _3DScene::set_active(wxGLCanvas* canvas, bool active)
|
||||||
{
|
{
|
||||||
s_canvas_mgr.set_active(canvas, active);
|
s_canvas_mgr.set_active(canvas, active);
|
||||||
|
@ -516,6 +516,9 @@ public:
|
|||||||
|
|
||||||
static bool init(wxGLCanvas* canvas);
|
static bool init(wxGLCanvas* canvas);
|
||||||
|
|
||||||
|
static bool set_current(wxGLCanvas* canvas, bool force);
|
||||||
|
static void reset_current_canvas();
|
||||||
|
|
||||||
static void set_active(wxGLCanvas* canvas, bool active);
|
static void set_active(wxGLCanvas* canvas, bool active);
|
||||||
static void set_as_dirty(wxGLCanvas* canvas);
|
static void set_as_dirty(wxGLCanvas* canvas);
|
||||||
|
|
||||||
|
@ -12,10 +12,20 @@ namespace Slic3r { namespace GUI {
|
|||||||
|
|
||||||
wxString double_to_string(double const value)
|
wxString double_to_string(double const value)
|
||||||
{
|
{
|
||||||
int precision = 10 * value - int(10 * value) == 0 ? 1 : 2;
|
if (value - int(value) == 0)
|
||||||
return value - int(value) == 0 ?
|
return wxString::Format(_T("%i"), int(value));
|
||||||
wxString::Format(_T("%i"), int(value)) :
|
else {
|
||||||
wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
|
int precision = 4;
|
||||||
|
for (size_t p = 1; p < 4; p++)
|
||||||
|
{
|
||||||
|
double cur_val = pow(10, p)*value;
|
||||||
|
if (cur_val - int(cur_val) == 0) {
|
||||||
|
precision = p;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Field::PostInitialize(){
|
void Field::PostInitialize(){
|
||||||
|
@ -1520,13 +1520,10 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GLCanvas3D::set_current()
|
bool GLCanvas3D::set_current(bool force)
|
||||||
{
|
{
|
||||||
if ((m_canvas != nullptr) && (m_context != nullptr))
|
if ((force || m_active) && (m_canvas != nullptr) && (m_context != nullptr))
|
||||||
{
|
return m_canvas->SetCurrent(*m_context);
|
||||||
m_canvas->SetCurrent(*m_context);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1548,8 +1545,13 @@ unsigned int GLCanvas3D::get_volumes_count() const
|
|||||||
|
|
||||||
void GLCanvas3D::reset_volumes()
|
void GLCanvas3D::reset_volumes()
|
||||||
{
|
{
|
||||||
if (set_current())
|
|
||||||
|
if (!m_volumes.empty())
|
||||||
{
|
{
|
||||||
|
// ensures this canvas is current
|
||||||
|
if ((m_canvas == nullptr) || !_3DScene::set_current(m_canvas, true))
|
||||||
|
return;
|
||||||
|
|
||||||
m_volumes.release_geometry();
|
m_volumes.release_geometry();
|
||||||
m_volumes.clear();
|
m_volumes.clear();
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
@ -1847,8 +1849,8 @@ void GLCanvas3D::render()
|
|||||||
if (!_is_shown_on_screen())
|
if (!_is_shown_on_screen())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// ensures that the proper context is selected and that this canvas is initialized
|
// ensures this canvas is current and initialized
|
||||||
if (!set_current() || !_3DScene::init(m_canvas))
|
if (!_3DScene::set_current(m_canvas, false) || !_3DScene::init(m_canvas))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_force_zoom_to_bed_enabled)
|
if (m_force_zoom_to_bed_enabled)
|
||||||
@ -1929,6 +1931,11 @@ void GLCanvas3D::reload_scene(bool force)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
reset_volumes();
|
reset_volumes();
|
||||||
|
|
||||||
|
// ensures this canvas is current
|
||||||
|
if (!_3DScene::set_current(m_canvas, true))
|
||||||
|
return;
|
||||||
|
|
||||||
set_bed_shape(dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"))->values);
|
set_bed_shape(dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"))->values);
|
||||||
|
|
||||||
if (!m_canvas->IsShown() && !force)
|
if (!m_canvas->IsShown() && !force)
|
||||||
@ -2000,6 +2007,10 @@ void GLCanvas3D::reload_scene(bool force)
|
|||||||
|
|
||||||
void GLCanvas3D::load_print_toolpaths()
|
void GLCanvas3D::load_print_toolpaths()
|
||||||
{
|
{
|
||||||
|
// ensures this canvas is current
|
||||||
|
if (!_3DScene::set_current(m_canvas, true))
|
||||||
|
return;
|
||||||
|
|
||||||
if (m_print == nullptr)
|
if (m_print == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -2364,8 +2375,8 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const
|
|||||||
{
|
{
|
||||||
if ((m_canvas != nullptr) && (m_print != nullptr))
|
if ((m_canvas != nullptr) && (m_print != nullptr))
|
||||||
{
|
{
|
||||||
// ensures that the proper context is selected
|
// ensures that this canvas is current
|
||||||
if (!set_current())
|
if (!_3DScene::set_current(m_canvas, false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_volumes.empty())
|
if (m_volumes.empty())
|
||||||
@ -2682,7 +2693,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (evt.LeftDClick() && (m_hover_volume_id != -1))
|
else if (evt.LeftDClick() && (m_hover_volume_id != -1))
|
||||||
|
{
|
||||||
|
m_active = false;
|
||||||
m_on_double_click_callback.call();
|
m_on_double_click_callback.call();
|
||||||
|
m_active = true;
|
||||||
|
}
|
||||||
else if (evt.LeftDown() || evt.RightDown())
|
else if (evt.LeftDown() || evt.RightDown())
|
||||||
{
|
{
|
||||||
// If user pressed left or right button we first check whether this happened
|
// If user pressed left or right button we first check whether this happened
|
||||||
@ -2778,7 +2793,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||||||
{
|
{
|
||||||
// if right clicking on volume, propagate event through callback
|
// if right clicking on volume, propagate event through callback
|
||||||
if (m_volumes.volumes[volume_idx]->hover)
|
if (m_volumes.volumes[volume_idx]->hover)
|
||||||
|
{
|
||||||
|
m_active = false;
|
||||||
m_on_right_click_callback.call(pos.x, pos.y);
|
m_on_right_click_callback.call(pos.x, pos.y);
|
||||||
|
m_active = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2996,10 +3015,11 @@ void GLCanvas3D::_force_zoom_to_bed()
|
|||||||
|
|
||||||
void GLCanvas3D::_resize(unsigned int w, unsigned int h)
|
void GLCanvas3D::_resize(unsigned int w, unsigned int h)
|
||||||
{
|
{
|
||||||
if (m_context == nullptr)
|
if ((m_canvas == nullptr) && (m_context == nullptr))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
set_current();
|
// ensures that this canvas is current
|
||||||
|
_3DScene::set_current(m_canvas, false);
|
||||||
::glViewport(0, 0, w, h);
|
::glViewport(0, 0, w, h);
|
||||||
|
|
||||||
::glMatrixMode(GL_PROJECTION);
|
::glMatrixMode(GL_PROJECTION);
|
||||||
@ -3585,9 +3605,11 @@ void GLCanvas3D::_perform_layer_editing_action(wxMouseEvent* evt)
|
|||||||
|
|
||||||
Pointf3 GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z)
|
Pointf3 GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z)
|
||||||
{
|
{
|
||||||
if (!set_current())
|
if (m_canvas == nullptr)
|
||||||
return Pointf3(DBL_MAX, DBL_MAX, DBL_MAX);
|
return Pointf3(DBL_MAX, DBL_MAX, DBL_MAX);
|
||||||
|
|
||||||
|
_camera_tranform();
|
||||||
|
|
||||||
GLint viewport[4];
|
GLint viewport[4];
|
||||||
::glGetIntegerv(GL_VIEWPORT, viewport);
|
::glGetIntegerv(GL_VIEWPORT, viewport);
|
||||||
GLdouble modelview_matrix[16];
|
GLdouble modelview_matrix[16];
|
||||||
|
@ -449,7 +449,7 @@ public:
|
|||||||
|
|
||||||
bool init(bool useVBOs, bool use_legacy_opengl);
|
bool init(bool useVBOs, bool use_legacy_opengl);
|
||||||
|
|
||||||
bool set_current();
|
bool set_current(bool force);
|
||||||
|
|
||||||
void set_active(bool active);
|
void set_active(bool active);
|
||||||
void set_as_dirty();
|
void set_as_dirty();
|
||||||
|
@ -115,6 +115,7 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten
|
|||||||
|
|
||||||
GLCanvas3DManager::GLCanvas3DManager()
|
GLCanvas3DManager::GLCanvas3DManager()
|
||||||
: m_context(nullptr)
|
: m_context(nullptr)
|
||||||
|
, m_current(nullptr)
|
||||||
, m_gl_initialized(false)
|
, m_gl_initialized(false)
|
||||||
, m_use_legacy_opengl(false)
|
, m_use_legacy_opengl(false)
|
||||||
, m_use_VBOs(false)
|
, m_use_VBOs(false)
|
||||||
@ -212,6 +213,34 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GLCanvas3DManager::set_current(wxGLCanvas* canvas, bool force)
|
||||||
|
{
|
||||||
|
// given canvas is already current, return
|
||||||
|
if (m_current == canvas)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (canvas == nullptr)
|
||||||
|
{
|
||||||
|
m_current = nullptr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set given canvas as current
|
||||||
|
CanvasesMap::iterator it = _get_canvas(canvas);
|
||||||
|
if (it != m_canvases.end())
|
||||||
|
{
|
||||||
|
bool res = it->second->set_current(force);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
m_current = canvas;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_current = nullptr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active)
|
void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active)
|
||||||
{
|
{
|
||||||
CanvasesMap::iterator it = _get_canvas(canvas);
|
CanvasesMap::iterator it = _get_canvas(canvas);
|
||||||
|
@ -45,6 +45,7 @@ class GLCanvas3DManager
|
|||||||
|
|
||||||
wxGLContext* m_context;
|
wxGLContext* m_context;
|
||||||
CanvasesMap m_canvases;
|
CanvasesMap m_canvases;
|
||||||
|
wxGLCanvas* m_current;
|
||||||
GLInfo m_gl_info;
|
GLInfo m_gl_info;
|
||||||
bool m_gl_initialized;
|
bool m_gl_initialized;
|
||||||
bool m_use_legacy_opengl;
|
bool m_use_legacy_opengl;
|
||||||
@ -69,6 +70,7 @@ public:
|
|||||||
|
|
||||||
bool init(wxGLCanvas* canvas);
|
bool init(wxGLCanvas* canvas);
|
||||||
|
|
||||||
|
bool set_current(wxGLCanvas* canvas, bool force);
|
||||||
void set_active(wxGLCanvas* canvas, bool active);
|
void set_active(wxGLCanvas* canvas, bool active);
|
||||||
void set_as_dirty(wxGLCanvas* canvas);
|
void set_as_dirty(wxGLCanvas* canvas);
|
||||||
|
|
||||||
|
@ -190,6 +190,11 @@ remove_all_canvases()
|
|||||||
CODE:
|
CODE:
|
||||||
_3DScene::remove_all_canvases();
|
_3DScene::remove_all_canvases();
|
||||||
|
|
||||||
|
void
|
||||||
|
reset_current_canvas()
|
||||||
|
CODE:
|
||||||
|
_3DScene::reset_current_canvas();
|
||||||
|
|
||||||
void
|
void
|
||||||
set_active(canvas, active)
|
set_active(canvas, active)
|
||||||
SV *canvas;
|
SV *canvas;
|
||||||
|
Loading…
Reference in New Issue
Block a user