From 591e83b52e4ef43180bf44ca1a9ee5380e8b817a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 22 Feb 2024 10:38:15 +0100 Subject: [PATCH] libvgcode - replacement of glMapBuffer() call for OpenGL ES --- src/libvgcode/include/Types.hpp | 2 ++ src/libvgcode/src/ViewerImpl.cpp | 17 ++++++++++++++++- src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp | 7 +++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/libvgcode/include/Types.hpp b/src/libvgcode/include/Types.hpp index e99d42635b..0ffe14373e 100644 --- a/src/libvgcode/include/Types.hpp +++ b/src/libvgcode/include/Types.hpp @@ -5,6 +5,8 @@ #ifndef VGCODE_TYPES_HPP #define VGCODE_TYPES_HPP +#define VGCODE_ENABLE_OPENGL_ES 0 + #define VGCODE_ENABLE_COG_AND_TOOL_MARKERS 0 #include diff --git a/src/libvgcode/src/ViewerImpl.cpp b/src/libvgcode/src/ViewerImpl.cpp index fb3ea43bca..4229ef22db 100644 --- a/src/libvgcode/src/ViewerImpl.cpp +++ b/src/libvgcode/src/ViewerImpl.cpp @@ -597,7 +597,7 @@ void ViewerImpl::load(GCodeInputData&& gcode_data) // create and fill height, width and angles buffer glsafe(glGenBuffers(1, &m_heights_widths_angles_buf_id)); glsafe(glBindBuffer(GL_TEXTURE_BUFFER, m_heights_widths_angles_buf_id)); - glsafe(glBufferData(GL_TEXTURE_BUFFER, heights_widths_angles.size() * sizeof(Vec3), heights_widths_angles.data(), GL_STATIC_DRAW)); + glsafe(glBufferData(GL_TEXTURE_BUFFER, heights_widths_angles.size() * sizeof(Vec3), heights_widths_angles.data(), GL_DYNAMIC_DRAW)); glsafe(glGenTextures(1, &m_heights_widths_angles_tex_id)); glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_heights_widths_angles_tex_id)); @@ -1310,6 +1310,20 @@ void ViewerImpl::update_heights_widths() return; glsafe(glBindBuffer(GL_TEXTURE_BUFFER, m_heights_widths_angles_buf_id)); +#if VGCODE_ENABLE_OPENGL_ES + for (size_t i = 0; i < m_vertices.size(); ++i) { + const PathVertex& v = m_vertices[i]; + const size_t offset = i * sizeof(Vec3); + if (v.is_travel()) { + const std::array radii = { m_travels_radius, m_travels_radius }; + glsafe(glBufferSubData(GL_TEXTURE_BUFFER, offset, radii.size() * sizeof(float), radii.data())); + } + else if (v.is_wipe()) { + const std::array radii = { m_wipes_radius, m_wipes_radius }; + glsafe(glBufferSubData(GL_TEXTURE_BUFFER, offset, radii.size() * sizeof(float), radii.data())); + } + } +#else Vec3* buffer = static_cast(glMapBuffer(GL_TEXTURE_BUFFER, GL_WRITE_ONLY)); glcheck(); @@ -1326,6 +1340,7 @@ void ViewerImpl::update_heights_widths() } glsafe(glUnmapBuffer(GL_TEXTURE_BUFFER)); +#endif // VGCODE_ENABLE_OPENGL_ES glsafe(glBindBuffer(GL_TEXTURE_BUFFER, 0)); } diff --git a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp index 4516fca8d1..2b11420357 100644 --- a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp +++ b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp @@ -14,6 +14,13 @@ #include #include +static_assert(VGCODE_ENABLE_OPENGL_ES == ENABLE_OPENGL_ES, +#if ENABLE_OPENGL_ES + "VGCODE_ENABLE_OPENGL_ES must be set to 1"); +#else + "VGCODE_ENABLE_OPENGL_ES must be set to 0"); +#endif // ENABLE_OPENGL_ES + namespace Slic3r { class Print; } // namespace Slic3r