Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnrico Turri <enricoturri@seznam.cz>2019-07-19 12:18:19 +0300
committerEnrico Turri <enricoturri@seznam.cz>2019-07-19 12:18:19 +0300
commit749bb2bfed739f4d19ae06ced02b4b8463edf1ed (patch)
tree97e087a009890071928b4c9b31636bd6887212d2 /src/slic3r/GUI/GLTexture.cpp
parent84d61e28fdcc15d337d960fcade06e627b27d57f (diff)
Refactoring in GLTexture
Diffstat (limited to 'src/slic3r/GUI/GLTexture.cpp')
-rw-r--r--src/slic3r/GUI/GLTexture.cpp173
1 files changed, 24 insertions, 149 deletions
diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp
index 495a9864c..f3421f150 100644
--- a/src/slic3r/GUI/GLTexture.cpp
+++ b/src/slic3r/GUI/GLTexture.cpp
@@ -134,7 +134,7 @@ GLTexture::~GLTexture()
reset();
}
-bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps, bool compress)
+bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps, ECompressionType compression_type, bool apply_anisotropy)
{
reset();
@@ -142,20 +142,7 @@ bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps, bo
return false;
if (boost::algorithm::iends_with(filename, ".png"))
- return load_from_png(filename, use_mipmaps, compress);
- else
- return false;
-}
-
-bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps, bool compress, bool apply_anisotropy, unsigned int max_size_px)
-{
- reset();
-
- if (!boost::filesystem::exists(filename))
- return false;
-
- if (boost::algorithm::iends_with(filename, ".png"))
- return load_from_png(filename, use_mipmaps, compress, apply_anisotropy, max_size_px);
+ return load_from_png(filename, use_mipmaps, compression_type, apply_anisotropy);
else
return false;
}
@@ -367,120 +354,9 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right,
glsafe(::glDisable(GL_BLEND));
}
-unsigned int GLTexture::generate_mipmaps(wxImage& image, bool compress)
-{
- int w = image.GetWidth();
- int h = image.GetHeight();
- GLint level = 0;
- std::vector<unsigned char> data(w * h * 4, 0);
-
- while ((w > 1) || (h > 1))
- {
- ++level;
-
- w = std::max(w / 2, 1);
- h = std::max(h / 2, 1);
-
- int n_pixels = w * h;
-
- image = image.ResampleBicubic(w, h);
-
- unsigned char* img_rgb = image.GetData();
- unsigned char* img_alpha = image.GetAlpha();
-
- data.resize(n_pixels * 4);
- for (int i = 0; i < n_pixels; ++i)
- {
- int data_id = i * 4;
- int img_id = i * 3;
- data[data_id + 0] = img_rgb[img_id + 0];
- data[data_id + 1] = img_rgb[img_id + 1];
- data[data_id + 2] = img_rgb[img_id + 2];
- data[data_id + 3] = (img_alpha != nullptr) ? img_alpha[i] : 255;
- }
-
- if (compress && GLEW_EXT_texture_compression_s3tc)
- glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- else
- glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- }
-
- return (unsigned int)level;
-}
-
-bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, bool compress)
-{
- // Load a PNG with an alpha channel.
- wxImage image;
- if (!image.LoadFile(wxString::FromUTF8(filename.c_str()), wxBITMAP_TYPE_PNG))
- {
- reset();
- return false;
- }
-
- m_width = image.GetWidth();
- m_height = image.GetHeight();
- int n_pixels = m_width * m_height;
-
- if (n_pixels <= 0)
- {
- reset();
- return false;
- }
-
- // Get RGB & alpha raw data from wxImage, pack them into an array.
- unsigned char* img_rgb = image.GetData();
- if (img_rgb == nullptr)
- {
- reset();
- return false;
- }
-
- unsigned char* img_alpha = image.GetAlpha();
-
- std::vector<unsigned char> data(n_pixels * 4, 0);
- for (int i = 0; i < n_pixels; ++i)
- {
- int data_id = i * 4;
- int img_id = i * 3;
- data[data_id + 0] = img_rgb[img_id + 0];
- data[data_id + 1] = img_rgb[img_id + 1];
- data[data_id + 2] = img_rgb[img_id + 2];
- data[data_id + 3] = (img_alpha != nullptr) ? img_alpha[i] : 255;
- }
-
- // sends data to gpu
- glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1));
- glsafe(::glGenTextures(1, &m_id));
- glsafe(::glBindTexture(GL_TEXTURE_2D, m_id));
- if (compress && GLEW_EXT_texture_compression_s3tc)
- glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- else
- glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- if (use_mipmaps)
- {
- // we manually generate mipmaps because glGenerateMipmap() function is not reliable on all graphics cards
- unsigned int levels_count = generate_mipmaps(image, compress);
- glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, levels_count));
- glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR));
- }
- else
- {
- glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
- glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0));
- }
- glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
-
- glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
-
- m_source = filename;
-
- return true;
-}
-
-bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, bool compress, bool apply_anisotropy, unsigned int max_size_px)
+bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECompressionType compression_type, bool apply_anisotropy)
{
- bool compression_enabled = compress && GLEW_EXT_texture_compression_s3tc;
+ bool compression_enabled = (compression_type != None) && GLEW_EXT_texture_compression_s3tc;
// Load a PNG with an alpha channel.
wxImage image;
@@ -493,18 +369,9 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, boo
m_width = image.GetWidth();
m_height = image.GetHeight();
- unsigned int max_size = (unsigned int)std::max(m_width, m_height);
bool requires_rescale = false;
- if (max_size_px < max_size)
- {
- float scale = (float)max_size_px / (float)max_size;
- m_width = (int)(scale * (float)m_width);
- m_height = (int)(scale * (float)m_height);
- requires_rescale = true;
- }
-
- if (compression_enabled)
+ if (compression_enabled && (compression_type == MultiThreaded))
{
// the stb_dxt compression library seems to like only texture sizes which are a multiple of 4
int width_rem = m_width % 4;
@@ -568,10 +435,15 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, boo
if (compression_enabled)
{
- // initializes the texture on GPU
- glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
- // and send the uncompressed data to the compressor
- m_compressor.add_level((unsigned int)m_width, (unsigned int)m_height, data);
+ if (compression_type == SingleThreaded)
+ glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
+ else
+ {
+ // initializes the texture on GPU
+ glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
+ // and send the uncompressed data to the compressor
+ m_compressor.add_level((unsigned int)m_width, (unsigned int)m_height, data);
+ }
}
else
glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
@@ -610,10 +482,15 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, boo
if (compression_enabled)
{
- // initializes the texture on GPU
- glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
- // and send the uncompressed data to the compressor
- m_compressor.add_level((unsigned int)lod_w, (unsigned int)lod_h, data);
+ if (compression_type == SingleThreaded)
+ glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
+ else
+ {
+ // initializes the texture on GPU
+ glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
+ // and send the uncompressed data to the compressor
+ m_compressor.add_level((unsigned int)lod_w, (unsigned int)lod_h, data);
+ }
}
else
glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
@@ -637,7 +514,7 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, boo
m_source = filename;
- if (compression_enabled)
+ if (compression_enabled && (compression_type == MultiThreaded))
// start asynchronous compression
m_compressor.start_compressing();
@@ -651,7 +528,6 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
NSVGimage* image = nsvgParseFromFile(filename.c_str(), "px", 96.0f);
if (image == nullptr)
{
-// printf("Could not open SVG image.\n");
reset();
return false;
}
@@ -686,7 +562,6 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
NSVGrasterizer* rast = nsvgCreateRasterizer();
if (rast == nullptr)
{
-// printf("Could not init rasterizer.\n");
nsvgDelete(image);
reset();
return false;