|
30 | 30 |
|
31 | 31 | #include "image_compress_basisu.h"
|
32 | 32 |
|
| 33 | +#include "core/config/project_settings.h" |
33 | 34 | #include "core/io/image.h"
|
34 | 35 | #include "core/os/os.h"
|
35 | 36 | #include "core/string/print_string.h"
|
@@ -100,14 +101,28 @@ Vector<uint8_t> basis_universal_packer(const Ref<Image> &p_image, Image::UsedCha
|
100 | 101 |
|
101 | 102 | basisu::basis_compressor_params params;
|
102 | 103 |
|
| 104 | + int quality_level = GLOBAL_GET("rendering/textures/basis_universal/quality_level"); |
| 105 | + int uastc_pack_level = GLOBAL_GET("rendering/textures/basis_universal/uastc_pack_level"); |
| 106 | + bool rdo_enabled = GLOBAL_GET("rendering/textures/basis_universal/rdo_enabled"); |
| 107 | + float rdo_quality_scalar = GLOBAL_GET("rendering/textures/basis_universal/rdo_quality_scalar"); |
| 108 | + int rdo_dict_size = GLOBAL_GET("rendering/textures/basis_universal/rdo_dict_size"); |
| 109 | + bool zstd_supercompression = GLOBAL_GET("rendering/textures/basis_universal/zstd_supercompression"); |
| 110 | + int zstd_supercompression_level = GLOBAL_GET("rendering/textures/basis_universal/zstd_supercompression_level"); |
| 111 | + |
| 112 | + quality_level = CLAMP(quality_level, 0, 255); |
| 113 | + |
103 | 114 | params.m_uastc = true;
|
104 |
| - params.m_quality_level = basisu::BASISU_QUALITY_MIN; |
| 115 | + params.m_quality_level = quality_level == 0 ? -1 : quality_level; |
105 | 116 | params.m_pack_uastc_flags &= ~basisu::cPackUASTCLevelMask;
|
106 |
| - params.m_pack_uastc_flags |= basisu::cPackUASTCLevelFastest; |
| 117 | + params.m_pack_uastc_flags |= uastc_pack_level; |
107 | 118 |
|
108 |
| - params.m_rdo_uastc = 0.0f; |
109 |
| - params.m_rdo_uastc_quality_scalar = 0.0f; |
110 |
| - params.m_rdo_uastc_dict_size = 1024; |
| 119 | + params.m_rdo_uastc = rdo_enabled; |
| 120 | + params.m_rdo_uastc_quality_scalar = rdo_quality_scalar; |
| 121 | + params.m_rdo_uastc_dict_size = rdo_dict_size; |
| 122 | + |
| 123 | + params.m_create_ktx2_file = true; |
| 124 | + params.m_ktx2_uastc_supercompression = zstd_supercompression ? basist::KTX2_SS_ZSTANDARD : basist::KTX2_SS_NONE; |
| 125 | + params.m_ktx2_zstd_supercompression_level = zstd_supercompression_level; |
111 | 126 |
|
112 | 127 | params.m_mip_fast = true;
|
113 | 128 | params.m_multithreading = true;
|
@@ -241,7 +256,7 @@ Vector<uint8_t> basis_universal_packer(const Ref<Image> &p_image, Image::UsedCha
|
241 | 256 | int basisu_err = compressor.process();
|
242 | 257 | ERR_FAIL_COND_V(basisu_err != basisu::basis_compressor::cECSuccess, Vector<uint8_t>());
|
243 | 258 |
|
244 |
| - const basisu::uint8_vec &basisu_encoded = compressor.get_output_basis_file(); |
| 259 | + const basisu::uint8_vec &basisu_encoded = compressor.get_output_ktx2_file(); |
245 | 260 |
|
246 | 261 | Vector<uint8_t> basisu_data;
|
247 | 262 | basisu_data.resize(basisu_encoded.size() + 4);
|
@@ -398,37 +413,34 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
|
398 | 413 | src_ptr += 4;
|
399 | 414 | src_size -= 4;
|
400 | 415 |
|
401 |
| - basist::basisu_transcoder transcoder; |
402 |
| - ERR_FAIL_COND_V(!transcoder.validate_header(src_ptr, src_size), image); |
403 |
| - |
404 |
| - transcoder.start_transcoding(src_ptr, src_size); |
| 416 | + basist::ktx2_transcoder transcoder; |
| 417 | + ERR_FAIL_COND_V(!transcoder.init(src_ptr, src_size), image); |
405 | 418 |
|
406 |
| - basist::basisu_image_info basisu_info; |
407 |
| - transcoder.get_image_info(src_ptr, src_size, basisu_info, 0); |
| 419 | + transcoder.start_transcoding(); |
408 | 420 |
|
409 | 421 | // Create the buffer for transcoded/decompressed data.
|
410 | 422 | Vector<uint8_t> out_data;
|
411 |
| - out_data.resize(Image::get_image_data_size(basisu_info.m_width, basisu_info.m_height, image_format, basisu_info.m_total_levels > 1)); |
| 423 | + out_data.resize(Image::get_image_data_size(transcoder.get_width(), transcoder.get_height(), image_format, transcoder.get_levels() > 1)); |
412 | 424 |
|
413 | 425 | uint8_t *dst = out_data.ptrw();
|
414 | 426 | memset(dst, 0, out_data.size());
|
415 | 427 |
|
416 |
| - for (uint32_t i = 0; i < basisu_info.m_total_levels; i++) { |
417 |
| - basist::basisu_image_level_info basisu_level; |
418 |
| - transcoder.get_image_level_info(src_ptr, src_size, basisu_level, 0, i); |
| 428 | + for (uint32_t i = 0; i < transcoder.get_levels(); i++) { |
| 429 | + basist::ktx2_image_level_info basisu_level; |
| 430 | + transcoder.get_image_level_info(basisu_level, i, 0, 0); |
419 | 431 |
|
420 | 432 | uint32_t mip_block_or_pixel_count = Image::is_format_compressed(image_format) ? basisu_level.m_total_blocks : basisu_level.m_orig_width * basisu_level.m_orig_height;
|
421 |
| - int64_t ofs = Image::get_image_mipmap_offset(basisu_info.m_width, basisu_info.m_height, image_format, i); |
| 433 | + int64_t ofs = Image::get_image_mipmap_offset(transcoder.get_width(), transcoder.get_height(), image_format, i); |
422 | 434 |
|
423 |
| - bool result = transcoder.transcode_image_level(src_ptr, src_size, 0, i, dst + ofs, mip_block_or_pixel_count, basisu_format); |
| 435 | + bool result = transcoder.transcode_image_level(i, 0, 0, dst + ofs, mip_block_or_pixel_count, basisu_format); |
424 | 436 |
|
425 | 437 | if (!result) {
|
426 | 438 | print_line(vformat("BasisUniversal cannot unpack level %d.", i));
|
427 | 439 | break;
|
428 | 440 | }
|
429 | 441 | }
|
430 | 442 |
|
431 |
| - image = Image::create_from_data(basisu_info.m_width, basisu_info.m_height, basisu_info.m_total_levels > 1, image_format, out_data); |
| 443 | + image = Image::create_from_data(transcoder.get_width(), transcoder.get_height(), transcoder.get_levels() > 1, image_format, out_data); |
432 | 444 |
|
433 | 445 | if (needs_ra_rg_swap) {
|
434 | 446 | // Swap uncompressed RA-as-RG texture's color channels.
|
|
0 commit comments