@@ -158,6 +158,8 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
158158 bool s3tc_supported = RS::get_singleton ()->has_os_feature (" s3tc" );
159159 bool etc2_supported = RS::get_singleton ()->has_os_feature (" etc2" );
160160
161+ bool needs_ra_rg_swap = false ;
162+
161163 switch (*(uint32_t *)(src_ptr)) {
162164 case BASIS_DECOMPRESS_RG: {
163165 // RGTC transcoding is currently performed with RG_AS_RA, fail.
@@ -213,6 +215,7 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
213215 // No supported VRAM compression formats, decompress.
214216 basisu_format = basist::transcoder_texture_format::cTFRGBA32;
215217 image_format = Image::FORMAT_RGBA8;
218+ needs_ra_rg_swap = true ;
216219 }
217220 } break ;
218221 }
@@ -228,6 +231,7 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
228231 basist::basisu_image_info basisu_info;
229232 transcoder.get_image_info (src_ptr, src_size, basisu_info, 0 );
230233
234+ // Create the buffer for transcoded/decompressed data.
231235 Vector<uint8_t > out_data;
232236 out_data.resize (Image::get_image_data_size (basisu_info.m_width , basisu_info.m_height , image_format, basisu_info.m_total_levels > 1 ));
233237
@@ -239,8 +243,10 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
239243 basist::basisu_image_level_info basisu_level;
240244 transcoder.get_image_level_info (src_ptr, src_size, basisu_level, 0 , i);
241245
246+ uint32_t mip_block_or_pixel_count = image_format >= Image::FORMAT_DXT1 ? basisu_level.m_total_blocks : basisu_level.m_orig_width * basisu_level.m_orig_height ;
242247 int ofs = Image::get_image_mipmap_offset (basisu_info.m_width , basisu_info.m_height , image_format, i);
243- bool result = transcoder.transcode_image_level (src_ptr, src_size, 0 , i, dst + ofs, basisu_level.m_total_blocks , basisu_format);
248+
249+ bool result = transcoder.transcode_image_level (src_ptr, src_size, 0 , i, dst + ofs, mip_block_or_pixel_count, basisu_format);
244250
245251 if (!result) {
246252 print_line (vformat (" BasisUniversal cannot unpack level %d." , i));
@@ -250,6 +256,11 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
250256
251257 image = Image::create_from_data (basisu_info.m_width , basisu_info.m_height , basisu_info.m_total_levels > 1 , image_format, out_data);
252258
259+ if (needs_ra_rg_swap) {
260+ // Swap uncompressed RA-as-RG texture's color channels.
261+ image->convert_ra_rgba8_to_rg ();
262+ }
263+
253264 return image;
254265}
255266
0 commit comments