Browse Source

Properly resize textures so they can be ETC compressed, fixes #15139
this may make import times slower though, will have to wait for 3.1 for background texture import and compressonator.

Juan Linietsky 7 years ago
parent
commit
710970f004
1 changed files with 19 additions and 1 deletions
  1. 19 1
      modules/etc/image_etc.cpp

+ 19 - 1
modules/etc/image_etc.cpp

@@ -118,7 +118,6 @@ static void _compress_etc(Image *p_img, float p_lossy_quality, bool force_etc1_f
 	}
 
 	uint32_t imgw = p_img->get_width(), imgh = p_img->get_height();
-	ERR_FAIL_COND(next_power_of_2(imgw) != imgw || next_power_of_2(imgh) != imgh);
 
 	Image::Format etc_format = force_etc1_format ? Image::FORMAT_ETC : _get_etc2_mode(detected_channels);
 
@@ -127,6 +126,25 @@ static void _compress_etc(Image *p_img, float p_lossy_quality, bool force_etc1_f
 	if (img->get_format() != Image::FORMAT_RGBA8)
 		img->convert(Image::FORMAT_RGBA8); //still uses RGBA to convert
 
+	if (img->has_mipmaps()) {
+		if (next_power_of_2(imgw) != imgw || next_power_of_2(imgh) != imgh) {
+			img->resize_to_po2();
+			imgw = img->get_width();
+			imgh = img->get_height();
+		}
+	} else {
+		if (imgw % 4 != 0 || imgh % 4 != 0) {
+			if (imgw % 4) {
+				imgw += 4 - imgw % 4;
+			}
+			if (imgh % 4) {
+				imgh += 4 - imgh % 4;
+			}
+
+			img->resize(imgw, imgh);
+		}
+	}
+
 	PoolVector<uint8_t>::Read r = img->get_data().read();
 
 	int target_size = Image::get_image_data_size(imgw, imgh, etc_format, p_img->has_mipmaps() ? -1 : 0);