Skip to content

Commit 416fee9

Browse files
committed
BasisU: Use KTX2 format and add import options to configure encoder
1 parent 33b3c20 commit 416fee9

13 files changed

+336
-61
lines changed

core/io/image.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,14 @@ void (*Image::_image_decompress_astc)(Image *) = nullptr;
132132
Vector<uint8_t> (*Image::webp_lossy_packer)(const Ref<Image> &, float) = nullptr;
133133
Vector<uint8_t> (*Image::webp_lossless_packer)(const Ref<Image> &) = nullptr;
134134
Vector<uint8_t> (*Image::png_packer)(const Ref<Image> &) = nullptr;
135-
Vector<uint8_t> (*Image::basis_universal_packer)(const Ref<Image> &, Image::UsedChannels) = nullptr;
135+
Vector<uint8_t> (*Image::basis_universal_packer)(
136+
const Ref<Image> &p_image, Image::UsedChannels p_channels,
137+
int uastc_pack_level,
138+
bool rdo_enabled,
139+
float rdo_quality_loss,
140+
int rdo_dict_size,
141+
bool zstd_supercompression,
142+
int zstd_supercompression_level) = nullptr;
136143

137144
Ref<Image> (*Image::webp_unpacker)(const Vector<uint8_t> &) = nullptr;
138145
Ref<Image> (*Image::png_unpacker)(const Vector<uint8_t> &) = nullptr;

core/io/image.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,15 @@ class Image : public Resource {
231231
static Vector<uint8_t> (*webp_lossy_packer)(const Ref<Image> &p_image, float p_quality);
232232
static Vector<uint8_t> (*webp_lossless_packer)(const Ref<Image> &p_image);
233233
static Vector<uint8_t> (*png_packer)(const Ref<Image> &p_image);
234-
static Vector<uint8_t> (*basis_universal_packer)(const Ref<Image> &p_image, UsedChannels p_channels);
234+
static Vector<uint8_t> (*basis_universal_packer)(
235+
const Ref<Image> &p_image,
236+
Image::UsedChannels p_channels,
237+
int uastc_pack_level,
238+
bool rdo_enabled,
239+
float rdo_quality_loss,
240+
int rdo_dict_size,
241+
bool zstd_supercompression,
242+
int zstd_supercompression_level);
235243

236244
static Ref<Image> (*webp_unpacker)(const Vector<uint8_t> &p_buffer);
237245
static Ref<Image> (*png_unpacker)(const Vector<uint8_t> &p_buffer);

doc/classes/PortableCompressedTexture2D.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@
4343
Return whether the flag is overridden for all textures of this type.
4444
</description>
4545
</method>
46+
<method name="set_basisu_compressor_params">
47+
<return type="void" />
48+
<param index="0" name="uastc_pack_level" type="int" />
49+
<param index="1" name="rdo_enabled" type="bool" />
50+
<param index="2" name="rdo_quality_loss" type="float" />
51+
<param index="3" name="rdo_dict_size" type="int" />
52+
<param index="4" name="zstd_supercompression" type="bool" />
53+
<param index="5" name="zstd_supercompression_level" type="int" />
54+
<description>
55+
Set compressor params for Basis Universal compression. See also the settings in [ResourceImporterTexture].
56+
Note: This must be set before [method create_from_image] to take effect.
57+
</description>
58+
</method>
4659
<method name="set_keep_all_compressed_buffers" qualifiers="static">
4760
<return type="void" />
4861
<param index="0" name="keep" type="bool" />
@@ -55,6 +68,7 @@
5568
<member name="keep_compressed_buffer" type="bool" setter="set_keep_compressed_buffer" getter="is_keeping_compressed_buffer" default="false">
5669
When running on the editor, this class will keep the source compressed data in memory. Otherwise, the source compressed data is lost after loading and the resource can't be re saved.
5770
This flag allows to keep the compressed data in memory if you intend it to persist after loading.
71+
Note: This must be set before [method create_from_image] to take effect.
5872
</member>
5973
<member name="resource_local_to_scene" type="bool" setter="set_local_to_scene" getter="is_local_to_scene" overrides="Resource" default="false" />
6074
<member name="size_override" type="Vector2" setter="set_size_override" getter="get_size_override" default="Vector2(0, 0)">

doc/classes/ResourceImporterTexture.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,24 @@
1010
<link title="Importing images">$DOCS_URL/tutorials/assets_pipeline/importing_images.html</link>
1111
</tutorials>
1212
<members>
13+
<member name="basis_universal/rdo_dict_size" type="int" setter="" getter="" default="1024">
14+
Specify the RDO dict size, ranges from 64 to 65536. Higher values increase memory consumption and reduce encoding speed, but give more compression.
15+
</member>
16+
<member name="basis_universal/rdo_enabled" type="bool" setter="" getter="" default="false">
17+
If [code]true[/code], enables Rate-Distortion Optimization (RDO) to reduce disk size.
18+
</member>
19+
<member name="basis_universal/rdo_quality_loss" type="float" setter="" getter="" default="1.0">
20+
Specify the RDO quality loss, ranges from 0.001 to 50.0. Higher value result in smaller file size but lower quality. Good range to try is from 0.25 to 10.0.
21+
</member>
22+
<member name="basis_universal/uastc_pack_level" type="int" setter="" getter="" default="0">
23+
Sets the UASTC compressor's level, ranges from 0 to 4. Slower encoding speed improves quality.
24+
</member>
25+
<member name="basis_universal/zstd_supercompression" type="bool" setter="" getter="" default="true">
26+
If [code]true[/code], enables Zstandard supercompression to reduce disk size.
27+
</member>
28+
<member name="basis_universal/zstd_supercompression_level" type="int" setter="" getter="" default="6">
29+
Specify the compression level for Zstandard supercompression.
30+
</member>
1331
<member name="compress/channel_pack" type="int" setter="" getter="" default="0">
1432
Controls how color channels should be used in the imported texture.
1533
[b]sRGB Friendly:[/b] Prevents the RG color format from being used, as it does not support sRGB color.

editor/import/resource_importer_layered_texture.cpp

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,14 @@ void ResourceImporterLayeredTexture::get_import_options(const String &p_path, Li
158158
}
159159
}
160160

161-
void ResourceImporterLayeredTexture::_save_tex(Vector<Ref<Image>> p_images, const String &p_to_path, int p_compress_mode, float p_lossy, Image::CompressMode p_vram_compression, Image::CompressSource p_csource, Image::UsedChannels used_channels, bool p_mipmaps, bool p_force_po2) {
161+
void ResourceImporterLayeredTexture::_save_tex(Vector<Ref<Image>> p_images, const String &p_to_path, int p_compress_mode, float p_lossy,
162+
int p_uastc_pack_level,
163+
bool p_rdo_enabled,
164+
float p_rdo_quality_loss,
165+
int p_rdo_dict_size,
166+
bool p_zstd_supercompression,
167+
int p_zstd_supercompression_level,
168+
Image::CompressMode p_vram_compression, Image::CompressSource p_csource, Image::UsedChannels used_channels, bool p_mipmaps, bool p_force_po2) {
162169
Vector<Ref<Image>> mipmap_images; //for 3D
163170

164171
if (mode == MODE_3D) {
@@ -278,11 +285,23 @@ void ResourceImporterLayeredTexture::_save_tex(Vector<Ref<Image>> p_images, cons
278285
}
279286

280287
for (int i = 0; i < p_images.size(); i++) {
281-
ResourceImporterTexture::save_to_ctex_format(f, p_images[i], ResourceImporterTexture::CompressMode(p_compress_mode), used_channels, p_vram_compression, p_lossy);
288+
ResourceImporterTexture::save_to_ctex_format(f, p_images[i], ResourceImporterTexture::CompressMode(p_compress_mode), used_channels, p_vram_compression, p_lossy,
289+
p_uastc_pack_level,
290+
p_rdo_enabled,
291+
p_rdo_quality_loss,
292+
p_rdo_dict_size,
293+
p_zstd_supercompression,
294+
p_zstd_supercompression_level);
282295
}
283296

284297
for (int i = 0; i < mipmap_images.size(); i++) {
285-
ResourceImporterTexture::save_to_ctex_format(f, mipmap_images[i], ResourceImporterTexture::CompressMode(p_compress_mode), used_channels, p_vram_compression, p_lossy);
298+
ResourceImporterTexture::save_to_ctex_format(f, mipmap_images[i], ResourceImporterTexture::CompressMode(p_compress_mode), used_channels, p_vram_compression, p_lossy,
299+
p_uastc_pack_level,
300+
p_rdo_enabled,
301+
p_rdo_quality_loss,
302+
p_rdo_dict_size,
303+
p_zstd_supercompression,
304+
p_zstd_supercompression_level);
286305
}
287306
}
288307

@@ -486,7 +505,14 @@ void ResourceImporterLayeredTexture::_check_compress_ctex(const String &p_source
486505
ERR_FAIL_NULL(r_texture_import->csource);
487506
if (r_texture_import->compress_mode != COMPRESS_VRAM_COMPRESSED) {
488507
// Import normally.
489-
_save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + extension, r_texture_import->compress_mode, r_texture_import->lossy, Image::COMPRESS_S3TC /* IGNORED */, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, false);
508+
_save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + extension, r_texture_import->compress_mode, r_texture_import->lossy,
509+
r_texture_import->uastc_pack_level,
510+
r_texture_import->rdo_enabled,
511+
r_texture_import->rdo_quality_loss,
512+
r_texture_import->rdo_dict_size,
513+
r_texture_import->zstd_supercompression,
514+
r_texture_import->zstd_supercompression_level,
515+
Image::COMPRESS_S3TC /* IGNORED */, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, false);
490516
return;
491517
}
492518
// Must import in all formats, in order of priority (so platform chooses the best supported one. IE, etc2 over etc).
@@ -541,7 +567,14 @@ void ResourceImporterLayeredTexture::_check_compress_ctex(const String &p_source
541567
}
542568

543569
if (use_uncompressed) {
544-
_save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + extension, COMPRESS_VRAM_UNCOMPRESSED, r_texture_import->lossy, Image::COMPRESS_S3TC /* IGNORED */, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, false);
570+
_save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + extension, COMPRESS_VRAM_UNCOMPRESSED, r_texture_import->lossy,
571+
r_texture_import->uastc_pack_level,
572+
r_texture_import->rdo_enabled,
573+
r_texture_import->rdo_quality_loss,
574+
r_texture_import->rdo_dict_size,
575+
r_texture_import->zstd_supercompression,
576+
r_texture_import->zstd_supercompression_level,
577+
Image::COMPRESS_S3TC /* IGNORED */, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, false);
545578
} else {
546579
if (can_s3tc_bptc) {
547580
Image::CompressMode image_compress_mode;
@@ -553,7 +586,14 @@ void ResourceImporterLayeredTexture::_check_compress_ctex(const String &p_source
553586
image_compress_mode = Image::COMPRESS_S3TC;
554587
image_compress_format = "s3tc";
555588
}
556-
_save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + image_compress_format + "." + extension, r_texture_import->compress_mode, r_texture_import->lossy, image_compress_mode, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, true);
589+
_save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + image_compress_format + "." + extension, r_texture_import->compress_mode, r_texture_import->lossy,
590+
r_texture_import->uastc_pack_level,
591+
r_texture_import->rdo_enabled,
592+
r_texture_import->rdo_quality_loss,
593+
r_texture_import->rdo_dict_size,
594+
r_texture_import->zstd_supercompression,
595+
r_texture_import->zstd_supercompression_level,
596+
image_compress_mode, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, true);
557597
r_texture_import->platform_variants->push_back(image_compress_format);
558598
}
559599

@@ -567,7 +607,14 @@ void ResourceImporterLayeredTexture::_check_compress_ctex(const String &p_source
567607
image_compress_mode = Image::COMPRESS_ETC2;
568608
image_compress_format = "etc2";
569609
}
570-
_save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + image_compress_format + "." + extension, r_texture_import->compress_mode, r_texture_import->lossy, image_compress_mode, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, true);
610+
_save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + image_compress_format + "." + extension, r_texture_import->compress_mode, r_texture_import->lossy,
611+
r_texture_import->uastc_pack_level,
612+
r_texture_import->rdo_enabled,
613+
r_texture_import->rdo_quality_loss,
614+
r_texture_import->rdo_dict_size,
615+
r_texture_import->zstd_supercompression,
616+
r_texture_import->zstd_supercompression_level,
617+
image_compress_mode, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, true);
571618
r_texture_import->platform_variants->push_back(image_compress_format);
572619
}
573620
}

editor/import/resource_importer_layered_texture.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ class LayeredTextureImport : public RefCounted {
4949
Vector<Ref<Image>> *slices = nullptr;
5050
int compress_mode = 0;
5151
float lossy = 1.0;
52+
53+
int uastc_pack_level = 0;
54+
bool rdo_enabled = false;
55+
float rdo_quality_loss = 1;
56+
int rdo_dict_size = 1024;
57+
bool zstd_supercompression = true;
58+
int zstd_supercompression_level = 6;
59+
5260
int hdr_compression = 0;
5361
bool mipmaps = true;
5462
bool high_quality = false;
@@ -108,7 +116,14 @@ class ResourceImporterLayeredTexture : public ResourceImporter {
108116
virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override;
109117
virtual bool get_option_visibility(const String &p_path, const String &p_option, const HashMap<StringName, Variant> &p_options) const override;
110118

111-
void _save_tex(Vector<Ref<Image>> p_images, const String &p_to_path, int p_compress_mode, float p_lossy, Image::CompressMode p_vram_compression, Image::CompressSource p_csource, Image::UsedChannels used_channels, bool p_mipmaps, bool p_force_po2);
119+
void _save_tex(Vector<Ref<Image>> p_images, const String &p_to_path, int p_compress_mode, float p_lossy,
120+
int p_uastc_pack_level,
121+
bool p_rdo_enabled,
122+
float p_rdo_quality_loss,
123+
int p_rdo_dict_size,
124+
bool p_zstd_supercompression,
125+
int p_zstd_supercompression_level,
126+
Image::CompressMode p_vram_compression, Image::CompressSource p_csource, Image::UsedChannels used_channels, bool p_mipmaps, bool p_force_po2);
112127

113128
virtual Error import(ResourceUID::ID p_source_id, const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
114129

0 commit comments

Comments
 (0)