mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	Merge branch 'master' of https://github.com/prusa3d/Slic3r into opengl_to_cpp
This commit is contained in:
		
						commit
						7b0ba7a9d4
					
				
					 10 changed files with 113 additions and 32 deletions
				
			
		|  | @ -1851,6 +1851,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); | ||||
|  |  | |||
|  | @ -509,6 +509,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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,10 +12,20 @@ namespace Slic3r { namespace GUI { | |||
| 
 | ||||
| 	wxString double_to_string(double const value) | ||||
| 	{ | ||||
| 		int precision = 10 * value - int(10 * value) == 0 ? 1 : 2; | ||||
| 		return value - int(value) == 0 ? | ||||
| 			wxString::Format(_T("%i"), int(value)) : | ||||
| 			wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None); | ||||
| 		if (value - int(value) == 0) | ||||
| 			return wxString::Format(_T("%i"), int(value)); | ||||
| 		else { | ||||
| 			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(){ | ||||
|  |  | |||
|  | @ -1561,13 +1561,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; | ||||
| } | ||||
|  | @ -1589,8 +1586,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; | ||||
|  | @ -1924,8 +1926,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) | ||||
|  | @ -2006,6 +2008,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<const ConfigOptionPoints*>(m_config->option("bed_shape"))->values); | ||||
| 
 | ||||
|     if (!m_canvas->IsShown() && !force) | ||||
|  | @ -2078,6 +2085,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; | ||||
| 
 | ||||
|  | @ -2442,8 +2453,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()) | ||||
|  | @ -2772,7 +2783,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
 | ||||
|  | @ -2868,7 +2883,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; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | @ -3157,10 +3176,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); | ||||
|  | @ -3749,9 +3769,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]; | ||||
|  |  | |||
|  | @ -462,7 +462,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(); | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -194,6 +194,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; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri