From 40b327eb116392b80835d28ef43778212a7a14a1 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 25 Jun 2018 15:17:13 +0200 Subject: Fix of interaction between opengl contexts and main page notebook --- xs/src/slic3r/GUI/3DScene.cpp | 10 +++++++ xs/src/slic3r/GUI/3DScene.hpp | 3 ++ xs/src/slic3r/GUI/GLCanvas3D.cpp | 50 ++++++++++++++++++++++++--------- xs/src/slic3r/GUI/GLCanvas3D.hpp | 2 +- xs/src/slic3r/GUI/GLCanvas3DManager.cpp | 29 +++++++++++++++++++ xs/src/slic3r/GUI/GLCanvas3DManager.hpp | 2 ++ xs/xsp/GUI_3DScene.xsp | 5 ++++ 7 files changed, 86 insertions(+), 15 deletions(-) (limited to 'xs') diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index feae9312e..a499825a4 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1754,6 +1754,16 @@ bool _3DScene::init(wxGLCanvas* 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) { s_canvas_mgr.set_active(canvas, active); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index c317dba24..f45bab276 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -516,6 +516,9 @@ public: 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_as_dirty(wxGLCanvas* canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 6f23af5a3..f5db97731 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1520,13 +1520,10 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) return true; } -bool GLCanvas3D::set_current() +bool GLCanvas3D::set_current(bool force) { - if ((m_canvas != nullptr) && (m_context != nullptr)) - { - m_canvas->SetCurrent(*m_context); - return true; - } + if ((force || m_active) && (m_canvas != nullptr) && (m_context != nullptr)) + return m_canvas->SetCurrent(*m_context); return false; } @@ -1548,8 +1545,13 @@ unsigned int GLCanvas3D::get_volumes_count() const 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.clear(); m_dirty = true; @@ -1847,8 +1849,8 @@ void GLCanvas3D::render() if (!_is_shown_on_screen()) return; - // ensures that the proper context is selected and that this canvas is initialized - if (!set_current() || !_3DScene::init(m_canvas)) + // ensures this canvas is current and initialized + if (!_3DScene::set_current(m_canvas, false) || !_3DScene::init(m_canvas)) return; if (m_force_zoom_to_bed_enabled) @@ -1929,6 +1931,11 @@ void GLCanvas3D::reload_scene(bool force) return; reset_volumes(); + + // ensures this canvas is current + if (!_3DScene::set_current(m_canvas, true)) + return; + set_bed_shape(dynamic_cast(m_config->option("bed_shape"))->values); if (!m_canvas->IsShown() && !force) @@ -2000,6 +2007,10 @@ void GLCanvas3D::reload_scene(bool force) void GLCanvas3D::load_print_toolpaths() { + // ensures this canvas is current + if (!_3DScene::set_current(m_canvas, true)) + return; + if (m_print == nullptr) return; @@ -2364,8 +2375,8 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const { if ((m_canvas != nullptr) && (m_print != nullptr)) { - // ensures that the proper context is selected - if (!set_current()) + // ensures that this canvas is current + if (!_3DScene::set_current(m_canvas, false)) return; if (m_volumes.empty()) @@ -2682,7 +2693,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif } else if (evt.LeftDClick() && (m_hover_volume_id != -1)) + { + m_active = false; m_on_double_click_callback.call(); + m_active = true; + } else if (evt.LeftDown() || evt.RightDown()) { // 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 (m_volumes.volumes[volume_idx]->hover) + { + m_active = false; 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) { - if (m_context == nullptr) + if ((m_canvas == nullptr) && (m_context == nullptr)) return; - set_current(); + // ensures that this canvas is current + _3DScene::set_current(m_canvas, false); ::glViewport(0, 0, w, h); ::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) { - if (!set_current()) + if (m_canvas == nullptr) return Pointf3(DBL_MAX, DBL_MAX, DBL_MAX); + _camera_tranform(); + GLint viewport[4]; ::glGetIntegerv(GL_VIEWPORT, viewport); GLdouble modelview_matrix[16]; diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 18011f497..237044e83 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -449,7 +449,7 @@ public: bool init(bool useVBOs, bool use_legacy_opengl); - bool set_current(); + bool set_current(bool force); void set_active(bool active); void set_as_dirty(); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 81efe4408..62d17827a 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -115,6 +115,7 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten GLCanvas3DManager::GLCanvas3DManager() : m_context(nullptr) + , m_current(nullptr) , m_gl_initialized(false) , m_use_legacy_opengl(false) , m_use_VBOs(false) @@ -212,6 +213,34 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas) 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) { CanvasesMap::iterator it = _get_canvas(canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index 8726eb0b1..35a1db206 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -45,6 +45,7 @@ class GLCanvas3DManager wxGLContext* m_context; CanvasesMap m_canvases; + wxGLCanvas* m_current; GLInfo m_gl_info; bool m_gl_initialized; bool m_use_legacy_opengl; @@ -69,6 +70,7 @@ public: bool init(wxGLCanvas* canvas); + bool set_current(wxGLCanvas* canvas, bool force); void set_active(wxGLCanvas* canvas, bool active); void set_as_dirty(wxGLCanvas* canvas); diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index d46c06120..8ee88543d 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -190,6 +190,11 @@ remove_all_canvases() CODE: _3DScene::remove_all_canvases(); +void +reset_current_canvas() + CODE: + _3DScene::reset_current_canvas(); + void set_active(canvas, active) SV *canvas; -- cgit v1.2.3