You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
PortableCompressedTexture: Support ASTC format and creating directly from compressed image
This commit is contained in:
@@ -74,5 +74,7 @@
|
|||||||
</constant>
|
</constant>
|
||||||
<constant name="COMPRESSION_MODE_BPTC" value="5" enum="CompressionMode">
|
<constant name="COMPRESSION_MODE_BPTC" value="5" enum="CompressionMode">
|
||||||
</constant>
|
</constant>
|
||||||
|
<constant name="COMPRESSION_MODE_ASTC" value="6" enum="CompressionMode">
|
||||||
|
</constant>
|
||||||
</constants>
|
</constants>
|
||||||
</class>
|
</class>
|
||||||
|
|||||||
@@ -34,6 +34,23 @@
|
|||||||
#include "core/io/marshalls.h"
|
#include "core/io/marshalls.h"
|
||||||
#include "scene/resources/bit_map.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<uint8_t> &p_data) {
|
void PortableCompressedTexture2D::_set_data(const Vector<uint8_t> &p_data) {
|
||||||
if (p_data.is_empty()) {
|
if (p_data.is_empty()) {
|
||||||
return; //nothing to do
|
return; //nothing to do
|
||||||
@@ -99,7 +116,8 @@ void PortableCompressedTexture2D::_set_data(const Vector<uint8_t> &p_data) {
|
|||||||
} break;
|
} break;
|
||||||
case COMPRESSION_MODE_S3TC:
|
case COMPRESSION_MODE_S3TC:
|
||||||
case COMPRESSION_MODE_ETC2:
|
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));
|
image.instantiate(size.width, size.height, mipmaps, format, p_data.slice(20));
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
@@ -180,22 +198,31 @@ void PortableCompressedTexture2D::create_from_image(const Ref<Image> &p_image, C
|
|||||||
} break;
|
} break;
|
||||||
case COMPRESSION_MODE_S3TC:
|
case COMPRESSION_MODE_S3TC:
|
||||||
case COMPRESSION_MODE_ETC2:
|
case COMPRESSION_MODE_ETC2:
|
||||||
case COMPRESSION_MODE_BPTC: {
|
case COMPRESSION_MODE_BPTC:
|
||||||
ERR_FAIL_COND(p_image->is_compressed());
|
case COMPRESSION_MODE_ASTC: {
|
||||||
encode_uint16(DATA_FORMAT_IMAGE, buffer.ptrw() + 2);
|
encode_uint16(DATA_FORMAT_IMAGE, buffer.ptrw() + 2);
|
||||||
Ref<Image> copy = p_image->duplicate();
|
Ref<Image> copy = p_image;
|
||||||
switch (p_compression_mode) {
|
if (p_image->is_compressed()) {
|
||||||
case COMPRESSION_MODE_S3TC:
|
CompressionMode expected_compression_mode = get_expected_compression_mode(p_image->get_format());
|
||||||
copy->compress(Image::COMPRESS_S3TC);
|
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]));
|
||||||
break;
|
} else {
|
||||||
case COMPRESSION_MODE_ETC2:
|
copy = p_image->duplicate();
|
||||||
copy->compress(Image::COMPRESS_ETC2);
|
switch (p_compression_mode) {
|
||||||
break;
|
case COMPRESSION_MODE_S3TC:
|
||||||
case COMPRESSION_MODE_BPTC:
|
copy->compress(Image::COMPRESS_S3TC);
|
||||||
copy->compress(Image::COMPRESS_BPTC);
|
break;
|
||||||
break;
|
case COMPRESSION_MODE_ETC2:
|
||||||
default: {
|
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);
|
encode_uint32(copy->get_format(), buffer.ptrw() + 4);
|
||||||
buffer.append_array(copy->get_data());
|
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_S3TC);
|
||||||
BIND_ENUM_CONSTANT(COMPRESSION_MODE_ETC2);
|
BIND_ENUM_CONSTANT(COMPRESSION_MODE_ETC2);
|
||||||
BIND_ENUM_CONSTANT(COMPRESSION_MODE_BPTC);
|
BIND_ENUM_CONSTANT(COMPRESSION_MODE_BPTC);
|
||||||
|
BIND_ENUM_CONSTANT(COMPRESSION_MODE_ASTC);
|
||||||
}
|
}
|
||||||
|
|
||||||
PortableCompressedTexture2D::PortableCompressedTexture2D() {}
|
PortableCompressedTexture2D::PortableCompressedTexture2D() {}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ public:
|
|||||||
COMPRESSION_MODE_S3TC,
|
COMPRESSION_MODE_S3TC,
|
||||||
COMPRESSION_MODE_ETC2,
|
COMPRESSION_MODE_ETC2,
|
||||||
COMPRESSION_MODE_BPTC,
|
COMPRESSION_MODE_BPTC,
|
||||||
|
COMPRESSION_MODE_ASTC,
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user