Prechádzať zdrojové kódy

Fix Texture3D import not working

Fix Texture3D import not working when texture has fully opaque and (partly or fully) transparent slices.

For better style make cases of detect_alpha check against the exact enums rather than the enum 0.
K. S. Ernest (iFire) Lee 1 rok pred
rodič
commit
06a7b11a47
1 zmenil súbory, kde vykonal 11 pridanie a 10 odobranie
  1. 11 10
      scene/resources/compressed_texture.cpp

+ 11 - 10
scene/resources/compressed_texture.cpp

@@ -310,8 +310,6 @@ Ref<Image> CompressedTexture2D::load_image_from_file(Ref<FileAccess> f, int p_si
 		Vector<Ref<Image>> mipmap_images;
 		uint64_t total_size = 0;
 
-		bool first = true;
-
 		for (uint32_t i = 0; i < mipmaps + 1; i++) {
 			uint32_t size = f->get_32();
 
@@ -340,14 +338,17 @@ Ref<Image> CompressedTexture2D::load_image_from_file(Ref<FileAccess> f, int p_si
 			if (img.is_null() || img->is_empty()) {
 				ERR_FAIL_COND_V(img.is_null() || img->is_empty(), Ref<Image>());
 			}
-
-			if (first) {
-				//format will actually be the format of the first image,
-				//as it may have changed on compression
-				format = img->get_format();
-				first = false;
-			} else if (img->get_format() != format) {
-				img->convert(format); //all needs to be the same format
+			// If the image is compressed and its format doesn't match the desired format, return an empty reference.
+			// This is done to avoid recompressing the image on load.
+			ERR_FAIL_COND_V(img->is_compressed() && format != img->get_format(), Ref<Image>());
+
+			// The format will actually be the format of the header,
+			// as it may have changed on compression.
+			if (format != img->get_format()) {
+				// Convert the image to the desired format.
+				// Note: We are not decompressing the image here, just changing its format.
+				// It's important that all images in the texture array share the same format for correct rendering.
+				img->convert(format);
 			}
 
 			total_size += img->get_data().size();