Sfoglia il codice sorgente

Fix import grayscale EXR

Fix #27299

(cherry picked from commit f0562a5ef61d9e0e13ad1408b1cb5c6ae901552d)
Vivatchai Kaveeta 6 anni fa
parent
commit
59b2f02ac7
1 ha cambiato i file con 23 aggiunte e 14 eliminazioni
  1. 23 14
      modules/tinyexr/image_loader_tinyexr.cpp

+ 23 - 14
modules/tinyexr/image_loader_tinyexr.cpp

@@ -107,22 +107,31 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f
 		}
 	}
 
-	if (idxR == -1) {
-		ERR_PRINT("TinyEXR: R channel not found.");
-		// @todo { free exr_image }
-		return ERR_FILE_CORRUPT;
-	}
+	if (exr_header.num_channels == 1) {
+		// Grayscale channel only.
+		idxR = 0;
+		idxG = 0;
+		idxB = 0;
+		idxA = 0;
+	} else {
+		// Assume RGB(A)
+		if (idxR == -1) {
+			ERR_PRINT("TinyEXR: R channel not found.");
+			// @todo { free exr_image }
+			return ERR_FILE_CORRUPT;
+		}
 
-	if (idxG == -1) {
-		ERR_PRINT("TinyEXR: G channel not found.")
-		// @todo { free exr_image }
-		return ERR_FILE_CORRUPT;
-	}
+		if (idxG == -1) {
+			ERR_PRINT("TinyEXR: G channel not found.")
+			// @todo { free exr_image }
+			return ERR_FILE_CORRUPT;
+		}
 
-	if (idxB == -1) {
-		ERR_PRINT("TinyEXR: B channel not found.")
-		// @todo { free exr_image }
-		return ERR_FILE_CORRUPT;
+		if (idxB == -1) {
+			ERR_PRINT("TinyEXR: B channel not found.")
+			// @todo { free exr_image }
+			return ERR_FILE_CORRUPT;
+		}
 	}
 
 	// EXR image data loaded, now parse it into Godot-friendly image data