Update 3D scene when all compressed texture data are sent to GPU

This commit is contained in:
Enrico Turri 2019-06-05 10:07:59 +02:00
parent a9ea9b3e0a
commit 836f2d777f
6 changed files with 117 additions and 2 deletions

View file

@ -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 <GL/glew.h>
@ -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

View file

@ -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;

View file

@ -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<GLCanvas3D*>(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

View file

@ -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;

View file

@ -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)

View file

@ -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);