|
@@ -207,6 +207,9 @@ bool ResourceImporterTexture::get_option_visibility(const String &p_path, const
|
|
|
|
|
|
} else if (p_option == "mipmaps/limit") {
|
|
|
return p_options["mipmaps/generate"];
|
|
|
+
|
|
|
+ } else if (p_option == "compress/uastc_level" || p_option == "compress/rdo_quality_loss") {
|
|
|
+ return int(p_options["compress/mode"]) == COMPRESS_BASIS_UNIVERSAL;
|
|
|
}
|
|
|
|
|
|
return true;
|
|
@@ -230,6 +233,11 @@ void ResourceImporterTexture::get_import_options(const String &p_path, List<Impo
|
|
|
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Lossless,Lossy,VRAM Compressed,VRAM Uncompressed,Basis Universal", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), p_preset == PRESET_3D ? 2 : 0));
|
|
|
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "compress/high_quality"), false));
|
|
|
r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "compress/lossy_quality", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.7));
|
|
|
+
|
|
|
+ Image::BasisUniversalPackerParams basisu_params;
|
|
|
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/uastc_level", PROPERTY_HINT_ENUM, "Fastest,Faster,Medium,Slower,Slowest"), basisu_params.uastc_level));
|
|
|
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "compress/rdo_quality_loss", PROPERTY_HINT_RANGE, "0,10,0.001,or_greater"), basisu_params.rdo_quality_loss));
|
|
|
+
|
|
|
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/hdr_compression", PROPERTY_HINT_ENUM, "Disabled,Opaque Only,Always"), 1));
|
|
|
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/normal_map", PROPERTY_HINT_ENUM, "Detect,Enable,Disabled"), 0));
|
|
|
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/channel_pack", PROPERTY_HINT_ENUM, "sRGB Friendly,Optimized"), 0));
|
|
@@ -258,7 +266,7 @@ void ResourceImporterTexture::get_import_options(const String &p_path, List<Impo
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ResourceImporterTexture::save_to_ctex_format(Ref<FileAccess> f, const Ref<Image> &p_image, CompressMode p_compress_mode, Image::UsedChannels p_channels, Image::CompressMode p_compress_format, float p_lossy_quality) {
|
|
|
+void ResourceImporterTexture::save_to_ctex_format(Ref<FileAccess> f, const Ref<Image> &p_image, CompressMode p_compress_mode, Image::UsedChannels p_channels, Image::CompressMode p_compress_format, float p_lossy_quality, const Image::BasisUniversalPackerParams &p_basisu_params) {
|
|
|
switch (p_compress_mode) {
|
|
|
case COMPRESS_LOSSLESS: {
|
|
|
bool lossless_force_png = GLOBAL_GET("rendering/textures/lossless_compression/force_png") || !Image::_webp_mem_loader_func; // WebP module disabled or png is forced.
|
|
@@ -329,7 +337,7 @@ void ResourceImporterTexture::save_to_ctex_format(Ref<FileAccess> f, const Ref<I
|
|
|
f->store_32(p_image->get_mipmap_count());
|
|
|
f->store_32(p_image->get_format());
|
|
|
|
|
|
- Vector<uint8_t> data = Image::basis_universal_packer(p_image, p_channels);
|
|
|
+ Vector<uint8_t> data = Image::basis_universal_packer(p_image, p_channels, p_basisu_params);
|
|
|
const uint64_t data_size = data.size();
|
|
|
|
|
|
f->store_32(data_size);
|
|
@@ -338,7 +346,7 @@ void ResourceImporterTexture::save_to_ctex_format(Ref<FileAccess> f, const Ref<I
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ResourceImporterTexture::_save_ctex(const Ref<Image> &p_image, const String &p_to_path, CompressMode p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, bool p_streamable, bool p_detect_3d, bool p_detect_roughness, bool p_detect_normal, bool p_force_normal, bool p_srgb_friendly, bool p_force_po2_for_compressed, uint32_t p_limit_mipmap, const Ref<Image> &p_normal, Image::RoughnessChannel p_roughness_channel) {
|
|
|
+void ResourceImporterTexture::_save_ctex(const Ref<Image> &p_image, const String &p_to_path, CompressMode p_compress_mode, float p_lossy_quality, const Image::BasisUniversalPackerParams &p_basisu_params, Image::CompressMode p_vram_compression, bool p_mipmaps, bool p_streamable, bool p_detect_3d, bool p_detect_roughness, bool p_detect_normal, bool p_force_normal, bool p_srgb_friendly, bool p_force_po2_for_compressed, uint32_t p_limit_mipmap, const Ref<Image> &p_normal, Image::RoughnessChannel p_roughness_channel) {
|
|
|
Ref<FileAccess> f = FileAccess::open(p_to_path, FileAccess::WRITE);
|
|
|
ERR_FAIL_COND(f.is_null());
|
|
|
|
|
@@ -418,7 +426,7 @@ void ResourceImporterTexture::_save_ctex(const Ref<Image> &p_image, const String
|
|
|
used_channels = image->detect_used_channels(comp_source);
|
|
|
}
|
|
|
|
|
|
- save_to_ctex_format(f, image, p_compress_mode, used_channels, p_vram_compression, p_lossy_quality);
|
|
|
+ save_to_ctex_format(f, image, p_compress_mode, used_channels, p_vram_compression, p_lossy_quality, p_basisu_params);
|
|
|
}
|
|
|
|
|
|
void ResourceImporterTexture::_save_editor_meta(const Dictionary &p_metadata, const String &p_to_path) {
|
|
@@ -508,6 +516,11 @@ Error ResourceImporterTexture::import(ResourceUID::ID p_source_id, const String
|
|
|
const bool hdr_clamp_exposure = p_options["process/hdr_clamp_exposure"];
|
|
|
int size_limit = p_options["process/size_limit"];
|
|
|
|
|
|
+ const Image::BasisUniversalPackerParams basisu_params = {
|
|
|
+ p_options["compress/uastc_level"],
|
|
|
+ p_options["compress/rdo_quality_loss"],
|
|
|
+ };
|
|
|
+
|
|
|
bool using_fallback_size_limit = false;
|
|
|
if (size_limit == 0) {
|
|
|
using_fallback_size_limit = true;
|
|
@@ -685,7 +698,7 @@ Error ResourceImporterTexture::import(ResourceUID::ID p_source_id, const String
|
|
|
}
|
|
|
|
|
|
if (force_uncompressed) {
|
|
|
- _save_ctex(image, p_save_path + ".ctex", COMPRESS_VRAM_UNCOMPRESSED, lossy, Image::COMPRESS_S3TC /* This is ignored. */,
|
|
|
+ _save_ctex(image, p_save_path + ".ctex", COMPRESS_VRAM_UNCOMPRESSED, lossy, basisu_params, Image::COMPRESS_S3TC /* This is ignored. */,
|
|
|
mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel);
|
|
|
} else {
|
|
|
if (can_s3tc_bptc) {
|
|
@@ -699,8 +712,8 @@ Error ResourceImporterTexture::import(ResourceUID::ID p_source_id, const String
|
|
|
image_compress_format = "s3tc";
|
|
|
}
|
|
|
|
|
|
- _save_ctex(image, p_save_path + "." + image_compress_format + ".ctex", compress_mode, lossy, image_compress_mode, mipmaps, stream, detect_3d,
|
|
|
- detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel);
|
|
|
+ _save_ctex(image, p_save_path + "." + image_compress_format + ".ctex", compress_mode, lossy, basisu_params, image_compress_mode, mipmaps,
|
|
|
+ stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel);
|
|
|
r_platform_variants->push_back(image_compress_format);
|
|
|
}
|
|
|
|
|
@@ -715,19 +728,19 @@ Error ResourceImporterTexture::import(ResourceUID::ID p_source_id, const String
|
|
|
image_compress_format = "etc2";
|
|
|
}
|
|
|
|
|
|
- _save_ctex(image, p_save_path + "." + image_compress_format + ".ctex", compress_mode, lossy, image_compress_mode, mipmaps, stream, detect_3d,
|
|
|
+ _save_ctex(image, p_save_path + "." + image_compress_format + ".ctex", compress_mode, lossy, basisu_params, image_compress_mode, mipmaps, stream, detect_3d,
|
|
|
detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel);
|
|
|
r_platform_variants->push_back(image_compress_format);
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
// Import normally.
|
|
|
- _save_ctex(image, p_save_path + ".ctex", compress_mode, lossy, Image::COMPRESS_S3TC /* This is ignored. */,
|
|
|
+ _save_ctex(image, p_save_path + ".ctex", compress_mode, lossy, basisu_params, Image::COMPRESS_S3TC /* This is ignored. */,
|
|
|
mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel);
|
|
|
}
|
|
|
|
|
|
if (editor_image.is_valid()) {
|
|
|
- _save_ctex(editor_image, p_save_path + ".editor.ctex", compress_mode, lossy, Image::COMPRESS_S3TC /* This is ignored. */,
|
|
|
+ _save_ctex(editor_image, p_save_path + ".editor.ctex", compress_mode, lossy, basisu_params, Image::COMPRESS_S3TC /* This is ignored. */,
|
|
|
mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel);
|
|
|
|
|
|
// Generate and save editor-specific metadata, which we cannot save to the .import file.
|