From 9579c9c212f13db766eb499da130ed0c7deea631 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 26 Feb 2024 15:57:51 +0100 Subject: [PATCH] libvgcode - refactoring of class OpenGLWrapper --- src/libvgcode/src/OpenGLUtils.cpp | 20 +++++++++--- src/libvgcode/src/OpenGLUtils.hpp | 9 +++--- src/libvgcode/src/ViewerImpl.cpp | 51 ++++++++++++++++++------------- 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/libvgcode/src/OpenGLUtils.cpp b/src/libvgcode/src/OpenGLUtils.cpp index 350bd8b776..246635fa33 100644 --- a/src/libvgcode/src/OpenGLUtils.cpp +++ b/src/libvgcode/src/OpenGLUtils.cpp @@ -2,6 +2,8 @@ ///|/ ///|/ libvgcode is released under the terms of the AGPLv3 or higher ///|/ + +#include "../include/Types.hpp" #include "OpenGLUtils.hpp" #include @@ -36,17 +38,17 @@ void glAssertRecentCallImpl(const char* file_name, unsigned int line, const char static const char* OPENGL_ES_PREFIXES[] = { "OpenGL ES-CM ", "OpenGL ES-CL ", "OpenGL ES ", nullptr }; +bool OpenGLWrapper::s_valid_context = false; + bool OpenGLWrapper::load_opengl(const std::string& context_version) { - m_valid_context = false; - m_opengl_es = false; + s_valid_context = false; const char* version = context_version.c_str(); for (int i = 0; OPENGL_ES_PREFIXES[i] != nullptr; ++i) { const size_t length = strlen(OPENGL_ES_PREFIXES[i]); if (strncmp(version, OPENGL_ES_PREFIXES[i], length) == 0) { version += length; - m_opengl_es = true; break; } } @@ -61,13 +63,21 @@ bool OpenGLWrapper::load_opengl(const std::string& context_version) if (res != 2) return false; - m_valid_context = m_opengl_es ? major > 2 || (major == 2 && minor >= 0) : major > 3 || (major == 3 && minor >= 2); +#if VGCODE_ENABLE_OPENGL_ES + s_valid_context = major > 3 || (major == 3 && minor >= 0); +#else + s_valid_context = major > 3 || (major == 3 && minor >= 2); +#endif // VGCODE_ENABLE_OPENGL_ES const int glad_res = gladLoadGL(); if (glad_res == 0) return false; - return m_valid_context; + return s_valid_context; +} + +void OpenGLWrapper::unload_opengl() +{ } } // namespace libvgcode diff --git a/src/libvgcode/src/OpenGLUtils.hpp b/src/libvgcode/src/OpenGLUtils.hpp index ad8a3b3bcd..71f81930a1 100644 --- a/src/libvgcode/src/OpenGLUtils.hpp +++ b/src/libvgcode/src/OpenGLUtils.hpp @@ -29,13 +29,12 @@ inline void glAssertRecentCall() { } class OpenGLWrapper { public: - bool load_opengl(const std::string& context_version); - bool is_valid_context() { return m_valid_context; } - bool is_opengl_es() { return m_opengl_es; } + static bool load_opengl(const std::string& context_version); + static void unload_opengl(); + static bool is_valid_context() { return s_valid_context; } private: - bool m_valid_context{ false }; - bool m_opengl_es{ false }; + static bool s_valid_context; }; } // namespace libvgcode diff --git a/src/libvgcode/src/ViewerImpl.cpp b/src/libvgcode/src/ViewerImpl.cpp index a57d3dce18..4379f5cd2a 100644 --- a/src/libvgcode/src/ViewerImpl.cpp +++ b/src/libvgcode/src/ViewerImpl.cpp @@ -321,22 +321,24 @@ void ViewerImpl::init(const std::string& opengl_context_version) if (m_initialized) return; - OpenGLWrapper opengl_wrapper; - if (!opengl_wrapper.load_opengl(opengl_context_version)) { - if (opengl_wrapper.is_valid_context()) + if (!OpenGLWrapper::load_opengl(opengl_context_version)) { + if (OpenGLWrapper::is_valid_context()) throw std::runtime_error("LibVGCode was unable to initialize the GLAD library.\n"); else { - if (opengl_wrapper.is_opengl_es()) - throw std::runtime_error("LibVGCode requires an OpenGL ES context based on OpenGL ES 2.0 or higher.\n"); - else - throw std::runtime_error("LibVGCode requires an OpenGL context based on OpenGL 3.2 or higher.\n"); +#if VGCODE_ENABLE_OPENGL_ES + throw std::runtime_error("LibVGCode requires an OpenGL ES context based on OpenGL ES 3.0 or higher.\n"); +#else + throw std::runtime_error("LibVGCode requires an OpenGL context based on OpenGL 3.2 or higher.\n"); +#endif // VGCODE_ENABLE_OPENGL_ES } } // segments shader - m_segments_shader_id = opengl_wrapper.is_opengl_es() ? - init_shader("segments", Segments_Vertex_Shader_ES, Segments_Fragment_Shader_ES) : - init_shader("segments", Segments_Vertex_Shader, Segments_Fragment_Shader); +#if VGCODE_ENABLE_OPENGL_ES + m_segments_shader_id = init_shader("segments", Segments_Vertex_Shader_ES, Segments_Fragment_Shader_ES); +#else + m_segments_shader_id = init_shader("segments", Segments_Vertex_Shader, Segments_Fragment_Shader); +#endif // VGCODE_ENABLE_OPENGL_ES m_uni_segments_view_matrix_id = glGetUniformLocation(m_segments_shader_id, "view_matrix"); m_uni_segments_projection_matrix_id = glGetUniformLocation(m_segments_shader_id, "projection_matrix"); @@ -357,9 +359,11 @@ void ViewerImpl::init(const std::string& opengl_context_version) m_segment_template.init(); // options shader - m_options_shader_id = opengl_wrapper.is_opengl_es() ? - init_shader("options", Options_Vertex_Shader_ES, Options_Fragment_Shader_ES) : - init_shader("options", Options_Vertex_Shader, Options_Fragment_Shader); +#if VGCODE_ENABLE_OPENGL_ES + m_options_shader_id = init_shader("options", Options_Vertex_Shader_ES, Options_Fragment_Shader_ES); +#else + m_options_shader_id = init_shader("options", Options_Vertex_Shader, Options_Fragment_Shader); +#endif // VGCODE_ENABLE_OPENGL_ES m_uni_options_view_matrix_id = glGetUniformLocation(m_options_shader_id, "view_matrix"); m_uni_options_projection_matrix_id = glGetUniformLocation(m_options_shader_id, "projection_matrix"); @@ -379,9 +383,11 @@ void ViewerImpl::init(const std::string& opengl_context_version) #if VGCODE_ENABLE_COG_AND_TOOL_MARKERS // cog marker shader - m_cog_marker_shader_id = opengl_wrapper.is_opengl_es() ? - init_shader("cog_marker", Cog_Marker_Vertex_Shader_ES, Cog_Marker_Fragment_Shader_ES) : - init_shader("cog_marker", Cog_Marker_Vertex_Shader, Cog_Marker_Fragment_Shader); +#if VGCODE_ENABLE_OPENGL_ES + m_cog_marker_shader_id = init_shader("cog_marker", Cog_Marker_Vertex_Shader_ES, Cog_Marker_Fragment_Shader_ES); +#else + m_cog_marker_shader_id = init_shader("cog_marker", Cog_Marker_Vertex_Shader, Cog_Marker_Fragment_Shader); +#endif // VGCODE_ENABLE_OPENGL_ES m_uni_cog_marker_world_center_position = glGetUniformLocation(m_cog_marker_shader_id, "world_center_position"); m_uni_cog_marker_scale_factor = glGetUniformLocation(m_cog_marker_shader_id, "scale_factor"); @@ -396,9 +402,11 @@ void ViewerImpl::init(const std::string& opengl_context_version) m_cog_marker.init(32, 1.0f); // tool marker shader - m_tool_marker_shader_id = opengl_wrapper.is_opengl_es() ? - init_shader("tool_marker", Tool_Marker_Vertex_Shader_ES, Tool_Marker_Fragment_Shader_ES) : - init_shader("tool_marker", Tool_Marker_Vertex_Shader, Tool_Marker_Fragment_Shader); +#if VGCODE_ENABLE_OPENGL_ES + m_tool_marker_shader_id = init_shader("tool_marker", Tool_Marker_Vertex_Shader_ES, Tool_Marker_Fragment_Shader_ES); +#else + m_tool_marker_shader_id = init_shader("tool_marker", Tool_Marker_Vertex_Shader, Tool_Marker_Fragment_Shader); +#endif // VGCODE_ENABLE_OPENGL_ES m_uni_tool_marker_world_origin = glGetUniformLocation(m_tool_marker_shader_id, "world_origin"); m_uni_tool_marker_scale_factor = glGetUniformLocation(m_tool_marker_shader_id, "scale_factor"); @@ -437,6 +445,7 @@ void ViewerImpl::shutdown() m_segments_shader_id = 0; } m_initialized = false; + OpenGLWrapper::unload_opengl(); } void ViewerImpl::reset() @@ -576,8 +585,8 @@ void ViewerImpl::load(GCodeInputData&& gcode_data) position[2] -= 0.5f * v.height; positions.emplace_back(position); - const float angle = std::atan2(prev_line[0] * this_line[1] - prev_line[1] * this_line[0], dot(prev_line, this_line)); - heights_widths_angles.push_back({ v.height, v.width, angle }); + heights_widths_angles.push_back({ v.height, v.width, + std::atan2(prev_line[0] * this_line[1] - prev_line[1] * this_line[0], dot(prev_line, this_line)) }); } m_positions_tex_size = positions.size() * sizeof(Vec3);