Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support higher-quality S3TC compression modes #21167

Merged
merged 1 commit into from
Aug 23, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions core/image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1685,7 +1685,7 @@ Error Image::compress(CompressMode p_mode, CompressSource p_source, float p_loss
case COMPRESS_S3TC: {

ERR_FAIL_COND_V(!_image_compress_bc_func, ERR_UNAVAILABLE);
_image_compress_bc_func(this, p_source);
_image_compress_bc_func(this, p_lossy_quality, p_source);
} break;
case COMPRESS_PVRTC2: {

Expand Down Expand Up @@ -2048,7 +2048,7 @@ ImageMemLoadFunc Image::_png_mem_loader_func = NULL;
ImageMemLoadFunc Image::_jpg_mem_loader_func = NULL;
ImageMemLoadFunc Image::_webp_mem_loader_func = NULL;

void (*Image::_image_compress_bc_func)(Image *, Image::CompressSource) = NULL;
void (*Image::_image_compress_bc_func)(Image *, float, Image::CompressSource) = NULL;
void (*Image::_image_compress_bptc_func)(Image *, float, Image::CompressSource) = NULL;
void (*Image::_image_compress_pvrtc2_func)(Image *) = NULL;
void (*Image::_image_compress_pvrtc4_func)(Image *) = NULL;
Expand Down Expand Up @@ -2569,7 +2569,7 @@ void Image::_bind_methods() {
BIND_ENUM_CONSTANT(COMPRESS_SOURCE_NORMAL);
}

void Image::set_compress_bc_func(void (*p_compress_func)(Image *, CompressSource)) {
void Image::set_compress_bc_func(void (*p_compress_func)(Image *, float, CompressSource)) {

_image_compress_bc_func = p_compress_func;
}
Expand Down
4 changes: 2 additions & 2 deletions core/image.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ class Image : public Resource {
static ImageMemLoadFunc _jpg_mem_loader_func;
static ImageMemLoadFunc _webp_mem_loader_func;

static void (*_image_compress_bc_func)(Image *, CompressSource p_source);
static void (*_image_compress_bc_func)(Image *, float, CompressSource p_source);
static void (*_image_compress_bptc_func)(Image *, float p_lossy_quality, CompressSource p_source);
static void (*_image_compress_pvrtc2_func)(Image *);
static void (*_image_compress_pvrtc4_func)(Image *);
Expand Down Expand Up @@ -316,7 +316,7 @@ class Image : public Resource {
Rect2 get_used_rect() const;
Ref<Image> get_rect(const Rect2 &p_area) const;

static void set_compress_bc_func(void (*p_compress_func)(Image *, CompressSource));
static void set_compress_bc_func(void (*p_compress_func)(Image *, float, CompressSource));
static void set_compress_bptc_func(void (*p_compress_func)(Image *, float, CompressSource));
static String get_format_name(Format p_format);

Expand Down
8 changes: 7 additions & 1 deletion modules/squish/image_compress_squish.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ void image_decompress_squish(Image *p_image) {
p_image->create(p_image->get_width(), p_image->get_height(), p_image->has_mipmaps(), target_format, data);
}

void image_compress_squish(Image *p_image, Image::CompressSource p_source) {
void image_compress_squish(Image *p_image, float p_lossy_quality, Image::CompressSource p_source) {

if (p_image->get_format() >= Image::FORMAT_DXT1)
return; //do not compress, already compressed
Expand All @@ -86,6 +86,12 @@ void image_compress_squish(Image *p_image, Image::CompressSource p_source) {
if (p_image->get_format() <= Image::FORMAT_RGBA8) {

int squish_comp = squish::kColourRangeFit;

if (p_lossy_quality > 0.85)
squish_comp = squish::kColourIterativeClusterFit;
else if (p_lossy_quality > 0.75)
squish_comp = squish::kColourClusterFit;

Image::Format target_format = Image::FORMAT_RGBA8;

Image::DetectChannels dc = p_image->get_detected_channels();
Expand Down
2 changes: 1 addition & 1 deletion modules/squish/image_compress_squish.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

#include "image.h"

void image_compress_squish(Image *p_image, Image::CompressSource p_source);
void image_compress_squish(Image *p_image, float p_lossy_quality, Image::CompressSource p_source);
void image_decompress_squish(Image *p_image);

#endif // IMAGE_COMPRESS_SQUISH_H