You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Merge pull request #86313 from BlueCube3310/etc2-r-rg
Implement `ETC2_R` and `ETC2_RG` compression to `etcpak`
This commit is contained in:
@@ -44,9 +44,9 @@ EtcpakType _determine_etc_type(Image::UsedChannels p_channels) {
|
||||
case Image::USED_CHANNELS_LA:
|
||||
return EtcpakType::ETCPAK_TYPE_ETC2_ALPHA;
|
||||
case Image::USED_CHANNELS_R:
|
||||
return EtcpakType::ETCPAK_TYPE_ETC2;
|
||||
return EtcpakType::ETCPAK_TYPE_ETC2_R;
|
||||
case Image::USED_CHANNELS_RG:
|
||||
return EtcpakType::ETCPAK_TYPE_ETC2_RA_AS_RG;
|
||||
return EtcpakType::ETCPAK_TYPE_ETC2_RG;
|
||||
case Image::USED_CHANNELS_RGB:
|
||||
return EtcpakType::ETCPAK_TYPE_ETC2;
|
||||
case Image::USED_CHANNELS_RGBA:
|
||||
@@ -114,6 +114,12 @@ void _compress_etcpak(EtcpakType p_compresstype, Image *r_img) {
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_ETC2) {
|
||||
target_format = Image::FORMAT_ETC2_RGB8;
|
||||
r_img->convert_rgba8_to_bgra8(); // It's badly documented but ETCPAK seems to be expected BGRA8 for ETC.
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_ETC2_R) {
|
||||
target_format = Image::FORMAT_ETC2_R11;
|
||||
r_img->convert_rgba8_to_bgra8(); // It's badly documented but ETCPAK seems to be expected BGRA8 for ETC.
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_ETC2_RG) {
|
||||
target_format = Image::FORMAT_ETC2_RG11;
|
||||
r_img->convert_rgba8_to_bgra8(); // It's badly documented but ETCPAK seems to be expected BGRA8 for ETC.
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_ETC2_RA_AS_RG) {
|
||||
target_format = Image::FORMAT_ETC2_RA_AS_RG;
|
||||
r_img->convert_rg_to_ra_rgba8();
|
||||
@@ -224,22 +230,49 @@ void _compress_etcpak(EtcpakType p_compresstype, Image *r_img) {
|
||||
// Override the src_mip_read pointer to our temporary Vector.
|
||||
src_mip_read = padded_src.ptr();
|
||||
}
|
||||
if (p_compresstype == EtcpakType::ETCPAK_TYPE_ETC1) {
|
||||
CompressEtc1RgbDither(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_ETC2) {
|
||||
CompressEtc2Rgb(src_mip_read, dest_mip_write, blocks, mip_w, true);
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_ETC2_ALPHA || p_compresstype == EtcpakType::ETCPAK_TYPE_ETC2_RA_AS_RG) {
|
||||
CompressEtc2Rgba(src_mip_read, dest_mip_write, blocks, mip_w, true);
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_DXT1) {
|
||||
CompressDxt1Dither(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_DXT5 || p_compresstype == EtcpakType::ETCPAK_TYPE_DXT5_RA_AS_RG) {
|
||||
CompressDxt5(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_RGTC_RG) {
|
||||
CompressRgtcRG(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
} else if (p_compresstype == EtcpakType::ETCPAK_TYPE_RGTC_R) {
|
||||
CompressRgtcR(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
} else {
|
||||
ERR_FAIL_MSG("etcpak: Invalid or unsupported compression format.");
|
||||
|
||||
switch (p_compresstype) {
|
||||
case EtcpakType::ETCPAK_TYPE_ETC1:
|
||||
CompressEtc1RgbDither(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
break;
|
||||
|
||||
case EtcpakType::ETCPAK_TYPE_ETC2:
|
||||
CompressEtc2Rgb(src_mip_read, dest_mip_write, blocks, mip_w, true);
|
||||
break;
|
||||
|
||||
case EtcpakType::ETCPAK_TYPE_ETC2_ALPHA:
|
||||
case EtcpakType::ETCPAK_TYPE_ETC2_RA_AS_RG:
|
||||
CompressEtc2Rgba(src_mip_read, dest_mip_write, blocks, mip_w, true);
|
||||
break;
|
||||
|
||||
case EtcpakType::ETCPAK_TYPE_ETC2_R:
|
||||
CompressEtc2R8(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
break;
|
||||
|
||||
case EtcpakType::ETCPAK_TYPE_ETC2_RG:
|
||||
CompressEtc2RG8(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
break;
|
||||
|
||||
case EtcpakType::ETCPAK_TYPE_DXT1:
|
||||
CompressDxt1Dither(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
break;
|
||||
|
||||
case EtcpakType::ETCPAK_TYPE_DXT5:
|
||||
case EtcpakType::ETCPAK_TYPE_DXT5_RA_AS_RG:
|
||||
CompressDxt5(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
break;
|
||||
|
||||
case EtcpakType::ETCPAK_TYPE_RGTC_R:
|
||||
CompressRgtcR(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
break;
|
||||
|
||||
case EtcpakType::ETCPAK_TYPE_RGTC_RG:
|
||||
CompressRgtcRG(src_mip_read, dest_mip_write, blocks, mip_w);
|
||||
break;
|
||||
|
||||
default:
|
||||
ERR_FAIL_MSG("etcpak: Invalid or unsupported compression format.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,8 @@ enum class EtcpakType {
|
||||
ETCPAK_TYPE_ETC2,
|
||||
ETCPAK_TYPE_ETC2_ALPHA,
|
||||
ETCPAK_TYPE_ETC2_RA_AS_RG,
|
||||
ETCPAK_TYPE_ETC2_R,
|
||||
ETCPAK_TYPE_ETC2_RG,
|
||||
ETCPAK_TYPE_DXT1,
|
||||
ETCPAK_TYPE_DXT5,
|
||||
ETCPAK_TYPE_DXT5_RA_AS_RG,
|
||||
|
||||
Reference in New Issue
Block a user