diff --git a/doc/classes/PortableCompressedTexture2D.xml b/doc/classes/PortableCompressedTexture2D.xml index b85fe1de5cd..52ed3917f96 100644 --- a/doc/classes/PortableCompressedTexture2D.xml +++ b/doc/classes/PortableCompressedTexture2D.xml @@ -74,5 +74,7 @@ + + diff --git a/scene/resources/portable_compressed_texture.cpp b/scene/resources/portable_compressed_texture.cpp index 694517aefbd..04decf793af 100644 --- a/scene/resources/portable_compressed_texture.cpp +++ b/scene/resources/portable_compressed_texture.cpp @@ -34,6 +34,23 @@ #include "core/io/marshalls.h" #include "scene/resources/bit_map.h" +static const char *compression_mode_names[7] = { + "Lossless", "Lossy", "Basis Universal", "S3TC", "ETC2", "BPTC", "ASTC" +}; + +static PortableCompressedTexture2D::CompressionMode get_expected_compression_mode(Image::Format format) { + if ((format >= Image::FORMAT_DXT1 && format <= Image::FORMAT_RGTC_RG) || format == Image::FORMAT_DXT5_RA_AS_RG) { + return PortableCompressedTexture2D::COMPRESSION_MODE_S3TC; + } else if (format >= Image::FORMAT_ETC && format <= Image::FORMAT_ETC2_RA_AS_RG) { + return PortableCompressedTexture2D::COMPRESSION_MODE_ETC2; + } else if (format >= Image::FORMAT_BPTC_RGBA && format <= Image::FORMAT_BPTC_RGBFU) { + return PortableCompressedTexture2D::COMPRESSION_MODE_BPTC; + } else if (format >= Image::FORMAT_ASTC_4x4 && format <= Image::FORMAT_ASTC_8x8_HDR) { + return PortableCompressedTexture2D::COMPRESSION_MODE_ASTC; + } + ERR_FAIL_V(PortableCompressedTexture2D::COMPRESSION_MODE_LOSSLESS); +} + void PortableCompressedTexture2D::_set_data(const Vector &p_data) { if (p_data.is_empty()) { return; //nothing to do @@ -99,7 +116,8 @@ void PortableCompressedTexture2D::_set_data(const Vector &p_data) { } break; case COMPRESSION_MODE_S3TC: case COMPRESSION_MODE_ETC2: - case COMPRESSION_MODE_BPTC: { + case COMPRESSION_MODE_BPTC: + case COMPRESSION_MODE_ASTC: { image.instantiate(size.width, size.height, mipmaps, format, p_data.slice(20)); } break; } @@ -180,22 +198,31 @@ void PortableCompressedTexture2D::create_from_image(const Ref &p_image, C } break; case COMPRESSION_MODE_S3TC: case COMPRESSION_MODE_ETC2: - case COMPRESSION_MODE_BPTC: { - ERR_FAIL_COND(p_image->is_compressed()); + case COMPRESSION_MODE_BPTC: + case COMPRESSION_MODE_ASTC: { encode_uint16(DATA_FORMAT_IMAGE, buffer.ptrw() + 2); - Ref copy = p_image->duplicate(); - switch (p_compression_mode) { - case COMPRESSION_MODE_S3TC: - copy->compress(Image::COMPRESS_S3TC); - break; - case COMPRESSION_MODE_ETC2: - copy->compress(Image::COMPRESS_ETC2); - break; - case COMPRESSION_MODE_BPTC: - copy->compress(Image::COMPRESS_BPTC); - break; - default: { - }; + Ref copy = p_image; + if (p_image->is_compressed()) { + CompressionMode expected_compression_mode = get_expected_compression_mode(p_image->get_format()); + ERR_FAIL_COND_MSG(expected_compression_mode != p_compression_mode, vformat("Mismatched compression mode for image format %s, expected %s, got %s.", Image::get_format_name(p_image->get_format()), compression_mode_names[expected_compression_mode], compression_mode_names[p_compression_mode])); + } else { + copy = p_image->duplicate(); + switch (p_compression_mode) { + case COMPRESSION_MODE_S3TC: + copy->compress(Image::COMPRESS_S3TC); + break; + case COMPRESSION_MODE_ETC2: + copy->compress(Image::COMPRESS_ETC2); + break; + case COMPRESSION_MODE_BPTC: + copy->compress(Image::COMPRESS_BPTC); + break; + case COMPRESSION_MODE_ASTC: + copy->compress(Image::COMPRESS_ASTC); + break; + default: { + } + } } encode_uint32(copy->get_format(), buffer.ptrw() + 4); buffer.append_array(copy->get_data()); @@ -357,6 +384,7 @@ void PortableCompressedTexture2D::_bind_methods() { BIND_ENUM_CONSTANT(COMPRESSION_MODE_S3TC); BIND_ENUM_CONSTANT(COMPRESSION_MODE_ETC2); BIND_ENUM_CONSTANT(COMPRESSION_MODE_BPTC); + BIND_ENUM_CONSTANT(COMPRESSION_MODE_ASTC); } PortableCompressedTexture2D::PortableCompressedTexture2D() {} diff --git a/scene/resources/portable_compressed_texture.h b/scene/resources/portable_compressed_texture.h index 94e5b4156c4..9ddd48adac0 100644 --- a/scene/resources/portable_compressed_texture.h +++ b/scene/resources/portable_compressed_texture.h @@ -53,6 +53,7 @@ public: COMPRESSION_MODE_S3TC, COMPRESSION_MODE_ETC2, COMPRESSION_MODE_BPTC, + COMPRESSION_MODE_ASTC, }; private: