From f20f5cc15329c84388eeb15852d06213787d3948 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 1 Dec 2023 13:43:10 +0100 Subject: [PATCH] New gcode visualization integration - Added check of OpenGL version --- src/slic3r/GUI/LibVGCode/src/OpenGLUtils.cpp | 17 +++++++++++++++++ src/slic3r/GUI/LibVGCode/src/OpenGLUtils.hpp | 2 ++ src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp | 9 ++++++++- src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/LibVGCode/src/OpenGLUtils.cpp b/src/slic3r/GUI/LibVGCode/src/OpenGLUtils.cpp index 279ee816a3..d0200c9248 100644 --- a/src/slic3r/GUI/LibVGCode/src/OpenGLUtils.cpp +++ b/src/slic3r/GUI/LibVGCode/src/OpenGLUtils.cpp @@ -16,8 +16,10 @@ #include #include +#include namespace libvgcode { + #ifdef HAS_GLSAFE void glAssertRecentCallImpl(const char* file_name, unsigned int line, const char* function_name) { @@ -40,6 +42,21 @@ void glAssertRecentCallImpl(const char* file_name, unsigned int line, const char } #endif // HAS_GLSAFE +bool check_opengl_version() +{ + bool ret = false; + const GLubyte* version = glGetString(GL_VERSION); + if (version != nullptr) { + const std::string version_str(reinterpret_cast(version)); + if (version_str.length() > 4 && isdigit(version_str[0]) && isdigit(version_str[2])) { + const int major = version_str[0] - '0'; + const int minor = version_str[2] - '0'; + ret = major > 3 || (major == 3 && minor >= 2); + } + } + return ret; +} + } // namespace libvgcode //################################################################################################################################ diff --git a/src/slic3r/GUI/LibVGCode/src/OpenGLUtils.hpp b/src/slic3r/GUI/LibVGCode/src/OpenGLUtils.hpp index bfa9482e5a..d99c9b03e3 100644 --- a/src/slic3r/GUI/LibVGCode/src/OpenGLUtils.hpp +++ b/src/slic3r/GUI/LibVGCode/src/OpenGLUtils.hpp @@ -31,6 +31,8 @@ inline void glAssertRecentCall() { } #define glcheck() #endif // HAS_GLSAFE +extern bool check_opengl_version(); + } // namespace libvgcode //################################################################################################################################ diff --git a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp index 3fad4b4deb..054ebfbc1c 100644 --- a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp +++ b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp @@ -298,9 +298,14 @@ ViewerImpl::~ViewerImpl() void ViewerImpl::init() { - if (m_segments_shader_id != 0) + if (m_initialized) return; + const bool is_valid_opengl_version = check_opengl_version(); + assert(is_valid_opengl_version); + if (!is_valid_opengl_version) + throw std::runtime_error("LibVGCode requires an active OpenGL context based on OpenGL 3.2 or higher:\n"); + // segments shader m_segments_shader_id = init_shader("segments", Segments_Vertex_Shader, Segments_Fragment_Shader); @@ -375,6 +380,8 @@ void ViewerImpl::init() m_tool_marker.init(32, 2.0f, 4.0f, 1.0f, 8.0f); #endif // !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + + m_initialized = true; } void ViewerImpl::reset() diff --git a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp index d3c663b307..4721b06b9b 100644 --- a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp +++ b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp @@ -171,6 +171,7 @@ private: std::array m_travels_time{ 0.0f, 0.0f }; std::vector m_used_extruders_ids; + bool m_initialized{ false }; bool m_loading{ false }; //