From 836f2d777fabb94fdd0585d403bd0bedc603c2ce Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 5 Jun 2019 10:07:59 +0200 Subject: [PATCH] Update 3D scene when all compressed texture data are sent to GPU --- src/slic3r/GUI/3DBed.cpp | 66 +++++++++++++++++++++++++++++++++-- src/slic3r/GUI/3DBed.hpp | 14 ++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 16 +++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 8 +++++ src/slic3r/GUI/GLTexture.cpp | 13 +++++++ src/slic3r/GUI/GLTexture.hpp | 2 ++ 6 files changed, 117 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 98f2d7dc32..04ab4e2da2 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -9,6 +9,9 @@ #include "GUI_App.hpp" #include "PresetBundle.hpp" #include "Gizmos/GLGizmoBase.hpp" +#if ENABLE_COMPRESSED_TEXTURES +#include "GLCanvas3D.hpp" +#endif // ENABLE_COMPRESSED_TEXTURES #include @@ -273,6 +276,9 @@ void Bed3D::Axes::render_axis(double length) const Bed3D::Bed3D() : m_type(Custom) +#if ENABLE_COMPRESSED_TEXTURES + , m_requires_canvas_update(false) +#endif // ENABLE_COMPRESSED_TEXTURES #if ENABLE_TEXTURES_FROM_SVG , m_vbo_id(0) #endif // ENABLE_TEXTURES_FROM_SVG @@ -328,14 +334,34 @@ Point Bed3D::point_projection(const Point& point) const } #if ENABLE_TEXTURES_FROM_SVG +#if ENABLE_COMPRESSED_TEXTURES +void Bed3D::render(GLCanvas3D* canvas, float theta, bool useVBOs, float scale_factor) const +#else void Bed3D::render(float theta, bool useVBOs, float scale_factor) const +#endif // ENABLE_COMPRESSED_TEXTURES { m_scale_factor = scale_factor; EType type = useVBOs ? m_type : Custom; switch (type) - { +#if ENABLE_COMPRESSED_TEXTURES + case MK2: + { + render_prusa(canvas, "mk2", theta > 90.0f); + break; + } + case MK3: + { + render_prusa(canvas, "mk3", theta > 90.0f); + break; + } + case SL1: + { + render_prusa(canvas, "sl1", theta > 90.0f); + break; + } +#else case MK2: { render_prusa("mk2", theta > 90.0f); @@ -351,6 +377,7 @@ void Bed3D::render(float theta, bool useVBOs, float scale_factor) const render_prusa("sl1", theta > 90.0f); break; } +#endif // ENABLE_COMPRESSED_TEXTURES default: case Custom: { @@ -360,7 +387,11 @@ void Bed3D::render(float theta, bool useVBOs, float scale_factor) const } } #else +#if ENABLE_COMPRESSED_TEXTURES +void Bed3D::render(GLCanvas3D* canvas, float theta, bool useVBOs, float scale_factor) const +#else void Bed3D::render(float theta, bool useVBOs, float scale_factor) const +#endif // ENABLE_COMPRESSED_TEXTURES { m_scale_factor = scale_factor; @@ -369,6 +400,23 @@ void Bed3D::render(float theta, bool useVBOs, float scale_factor) const switch (m_type) { +#if ENABLE_COMPRESSED_TEXTURES + case MK2: + { + render_prusa(canvas, "mk2", theta, useVBOs); + break; + } + case MK3: + { + render_prusa(canvas, "mk3", theta, useVBOs); + break; + } + case SL1: + { + render_prusa(canvas, "sl1", theta, useVBOs); + break; + } +#else case MK2: { render_prusa("mk2", theta, useVBOs); @@ -383,7 +431,8 @@ void Bed3D::render(float theta, bool useVBOs, float scale_factor) const { render_prusa("sl1", theta, useVBOs); break; - } + } +#endif // ENABLE_COMPRESSED_TEXTURES default: case Custom: { @@ -487,7 +536,11 @@ Bed3D::EType Bed3D::detect_type(const Pointfs& shape) const } #if ENABLE_TEXTURES_FROM_SVG +#if ENABLE_COMPRESSED_TEXTURES +void Bed3D::render_prusa(GLCanvas3D* canvas, const std::string &key, bool bottom) const +#else void Bed3D::render_prusa(const std::string &key, bool bottom) const +#endif // ENABLE_COMPRESSED_TEXTURES { std::string tex_path = resources_dir() + "/icons/bed/" + key; @@ -557,6 +610,15 @@ void Bed3D::render_prusa(const std::string &key, bool bottom) const // the temporary texture is not needed anymore, reset it if (m_temp_texture.get_id() != 0) m_temp_texture.reset(); + + m_requires_canvas_update = true; + } + else if (m_requires_canvas_update && m_texture.all_compressed_data_sent_to_gpu()) + { + if (canvas != nullptr) + canvas->stop_keeping_dirty(); + + m_requires_canvas_update = false; } #endif // ENABLE_COMPRESSED_TEXTURES diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 054b746e5e..401f1232f3 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -13,6 +13,10 @@ typedef class GLUquadric GLUquadricObj; namespace Slic3r { namespace GUI { +#if ENABLE_COMPRESSED_TEXTURES +class GLCanvas3D; +#endif // ENABLE_COMPRESSED_TEXTURES + class GeometryBuffer { #if ENABLE_TEXTURES_FROM_SVG @@ -94,6 +98,8 @@ private: #if ENABLE_COMPRESSED_TEXTURES // temporary texture shown until the main texture has still no levels compressed mutable GLTexture m_temp_texture; + // used to trigger 3D scene update once all compressed textures have been sent to GPU + mutable bool m_requires_canvas_update; #endif // ENABLE_COMPRESSED_TEXTURES mutable Shader m_shader; mutable unsigned int m_vbo_id; @@ -125,7 +131,11 @@ public: bool contains(const Point& point) const; Point point_projection(const Point& point) const; +#if ENABLE_COMPRESSED_TEXTURES + void render(GLCanvas3D* canvas, float theta, bool useVBOs, float scale_factor) const; +#else void render(float theta, bool useVBOs, float scale_factor) const; +#endif // ENABLE_COMPRESSED_TEXTURES void render_axes() const; private: @@ -134,7 +144,11 @@ private: void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox); EType detect_type(const Pointfs& shape) const; #if ENABLE_TEXTURES_FROM_SVG +#if ENABLE_COMPRESSED_TEXTURES + void render_prusa(GLCanvas3D* canvas, const std::string& key, bool bottom) const; +#else void render_prusa(const std::string& key, bool bottom) const; +#endif // ENABLE_COMPRESSED_TEXTURES void render_prusa_shader(bool transparent) const; #else void render_prusa(const std::string &key, float theta, bool useVBOs) const; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index f7d685502a..90c21608e4 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1266,6 +1266,9 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar #endif // ENABLE_SVG_ICONS , m_use_clipping_planes(false) , m_sidebar_field("") +#if ENABLE_COMPRESSED_TEXTURES + , m_keep_dirty(false) +#endif // ENABLE_COMPRESSED_TEXTURES , m_config(nullptr) , m_process(nullptr) , m_model(nullptr) @@ -1483,6 +1486,10 @@ void GLCanvas3D::bed_shape_changed() m_camera.set_scene_box(scene_bounding_box()); m_camera.requires_zoom_to_bed = true; m_dirty = true; +#if ENABLE_COMPRESSED_TEXTURES + if (m_bed.is_prusa()) + start_keeping_dirty(); +#endif // ENABLE_COMPRESSED_TEXTURES } void GLCanvas3D::set_color_by(const std::string& value) @@ -2353,6 +2360,11 @@ void GLCanvas3D::on_idle(wxIdleEvent& evt) return; _refresh_if_shown_on_screen(); + +#if ENABLE_COMPRESSED_TEXTURES + if (m_keep_dirty) + m_dirty = true; +#endif // ENABLE_COMPRESSED_TEXTURES } void GLCanvas3D::on_char(wxKeyEvent& evt) @@ -3966,7 +3978,11 @@ void GLCanvas3D::_render_bed(float theta) const #if ENABLE_RETINA_GL scale_factor = m_retina_helper->get_scale_factor(); #endif // ENABLE_RETINA_GL +#if ENABLE_COMPRESSED_TEXTURES + m_bed.render(const_cast(this), theta, m_use_VBOs, scale_factor); +#else m_bed.render(theta, m_use_VBOs, scale_factor); +#endif // ENABLE_COMPRESSED_TEXTURES } void GLCanvas3D::_render_axes() const diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 6d77a507f1..d7a4c6d22d 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -449,6 +449,9 @@ private: bool m_use_clipping_planes; mutable SlaCap m_sla_caps[2]; std::string m_sidebar_field; +#if ENABLE_COMPRESSED_TEXTURES + bool m_keep_dirty; +#endif // ENABLE_COMPRESSED_TEXTURES mutable GLVolumeCollection m_volumes; Selection m_selection; @@ -635,6 +638,11 @@ public: void set_cursor(ECursorType type); void msw_rescale(); +#if ENABLE_COMPRESSED_TEXTURES + void start_keeping_dirty() { m_keep_dirty = true; } + void stop_keeping_dirty() { m_keep_dirty = false; } +#endif // ENABLE_COMPRESSED_TEXTURES + private: bool _is_shown_on_screen() const; diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 78de38d549..9b373440a1 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -85,6 +85,17 @@ void GLTexture::Compressor::send_compressed_data_to_gpu() glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); } +bool GLTexture::Compressor::all_compressed_data_sent_to_gpu() const +{ + for (const Level& level : m_levels) + { + if (!level.sent_to_gpu) + return false; + } + + return true; +} + void GLTexture::Compressor::compress() { // reference: https://github.com/Cyan4973/RygsDXTc @@ -512,7 +523,9 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, unsigned int max_size_px) #endif // ENABLE_COMPRESSED_TEXTURES { +#if ENABLE_COMPRESSED_TEXTURES bool compression_enabled = compress && GLEW_EXT_texture_compression_s3tc; +#endif // ENABLE_COMPRESSED_TEXTURES NSVGimage* image = nsvgParseFromFile(filename.c_str(), "px", 96.0f); if (image == nullptr) diff --git a/src/slic3r/GUI/GLTexture.hpp b/src/slic3r/GUI/GLTexture.hpp index d1ff366c34..5df6189b6f 100644 --- a/src/slic3r/GUI/GLTexture.hpp +++ b/src/slic3r/GUI/GLTexture.hpp @@ -42,6 +42,7 @@ namespace GUI { bool unsent_compressed_data_available() const; void send_compressed_data_to_gpu(); + bool all_compressed_data_sent_to_gpu() const; private: void compress(); @@ -109,6 +110,7 @@ namespace GUI { #if ENABLE_COMPRESSED_TEXTURES bool unsent_compressed_data_available() const { return m_compressor.unsent_compressed_data_available(); } void send_compressed_data_to_gpu() { m_compressor.send_compressed_data_to_gpu(); } + bool all_compressed_data_sent_to_gpu() const { return m_compressor.all_compressed_data_sent_to_gpu(); } #endif // ENABLE_COMPRESSED_TEXTURES static void render_texture(unsigned int tex_id, float left, float right, float bottom, float top);