feat: updated engine

This commit is contained in:
Sara Gerretsen 2026-07-10 17:04:34 +02:00
parent cbe99774ff
commit f4cf6b3999
6607 changed files with 910135 additions and 430025 deletions

View file

@ -164,6 +164,8 @@ enum DDSFormat {
DDS_LUMINANCE,
DDS_LUMINANCE_ALPHA,
DDS_LUMINANCE_ALPHA_4,
DDS_RG8,
DDS_R8,
DDS_MAX
};
@ -223,4 +225,6 @@ static const DDSFormatInfo dds_format_info[DDS_MAX] = {
{ "GRAYSCALE", false, 1, 1, Image::FORMAT_L8 },
{ "GRAYSCALE_ALPHA", false, 1, 2, Image::FORMAT_LA8 },
{ "GRAYSCALE_ALPHA_4", false, 1, 1, Image::FORMAT_LA8 },
{ "RG8", false, 1, 2, Image::FORMAT_RG8 },
{ "R8", false, 1, 1, Image::FORMAT_R8 },
};

View file

@ -343,8 +343,8 @@ Vector<uint8_t> save_dds_buffer(const Ref<Image> &p_img) {
Ref<Image> image = p_img;
stream_buffer->put_32(DDS_MAGIC);
stream_buffer->put_32(DDS_HEADER_SIZE);
stream_buffer->put_u32(DDS_MAGIC);
stream_buffer->put_u32(DDS_HEADER_SIZE);
uint32_t flags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_LINEARSIZE;
@ -352,13 +352,13 @@ Vector<uint8_t> save_dds_buffer(const Ref<Image> &p_img) {
flags |= DDSD_MIPMAPCOUNT;
}
stream_buffer->put_32(flags);
stream_buffer->put_u32(flags);
uint32_t height = image->get_height();
stream_buffer->put_32(height);
stream_buffer->put_u32(height);
uint32_t width = image->get_width();
stream_buffer->put_32(width);
stream_buffer->put_u32(width);
DDSFormat dds_format = _image_format_to_dds_format(image->get_format());
const DDSFormatInfo &info = dds_format_info[dds_format];
@ -372,18 +372,18 @@ Vector<uint8_t> save_dds_buffer(const Ref<Image> &p_img) {
pitch = width * info.block_size;
}
stream_buffer->put_32(pitch);
stream_buffer->put_32(depth);
stream_buffer->put_u32(pitch);
stream_buffer->put_u32(depth);
uint32_t mipmaps = image->get_mipmap_count() + 1;
stream_buffer->put_32(mipmaps);
stream_buffer->put_u32(mipmaps);
uint32_t reserved = 0;
for (int i = 0; i < 11; i++) {
stream_buffer->put_32(reserved);
stream_buffer->put_u32(reserved);
}
stream_buffer->put_32(DDS_PIXELFORMAT_SIZE);
stream_buffer->put_u32(DDS_PIXELFORMAT_SIZE);
uint32_t pf_flags = 0;
@ -399,22 +399,22 @@ Vector<uint8_t> save_dds_buffer(const Ref<Image> &p_img) {
pf_flags = DDPF_FOURCC;
}
stream_buffer->put_32(pf_flags);
stream_buffer->put_u32(pf_flags);
bool needs_pixeldata_swap = false;
if (format_type == DDFT_BITMASK) {
// Uncompressed bitmasked.
stream_buffer->put_32(0); // FourCC
stream_buffer->put_u32(0); // FourCC
uint32_t bit_count, r_mask, g_mask, b_mask, a_mask;
_get_dds_pixel_bitmask(image->get_format(), bit_count, r_mask, g_mask, b_mask, a_mask);
stream_buffer->put_32(bit_count);
stream_buffer->put_32(r_mask);
stream_buffer->put_32(g_mask);
stream_buffer->put_32(b_mask);
stream_buffer->put_32(a_mask);
stream_buffer->put_u32(bit_count);
stream_buffer->put_u32(r_mask);
stream_buffer->put_u32(g_mask);
stream_buffer->put_u32(b_mask);
stream_buffer->put_u32(a_mask);
if (image->get_format() == Image::FORMAT_RGBA4444 || image->get_format() == Image::FORMAT_RGB8) {
needs_pixeldata_swap = true;
@ -422,40 +422,40 @@ Vector<uint8_t> save_dds_buffer(const Ref<Image> &p_img) {
} else if (format_type == DDFT_FOURCC) {
// FourCC.
uint32_t fourcc = _image_format_to_fourcc_format(image->get_format());
stream_buffer->put_32(fourcc);
stream_buffer->put_u32(fourcc);
stream_buffer->put_32(0); // Bit count
stream_buffer->put_32(0); // R Bitmask
stream_buffer->put_32(0); // G Bitmask
stream_buffer->put_32(0); // B Bitmask
stream_buffer->put_32(0); // A Bitmask
stream_buffer->put_u32(0); // Bit count
stream_buffer->put_u32(0); // R Bitmask
stream_buffer->put_u32(0); // G Bitmask
stream_buffer->put_u32(0); // B Bitmask
stream_buffer->put_u32(0); // A Bitmask
} else {
// DXGI format and DX10 header.
stream_buffer->put_32(DDFCC_DX10);
stream_buffer->put_u32(DDFCC_DX10);
stream_buffer->put_32(0); // Bit count
stream_buffer->put_32(0); // R Bitmask
stream_buffer->put_32(0); // G Bitmask
stream_buffer->put_32(0); // B Bitmask
stream_buffer->put_32(0); // A Bitmask
stream_buffer->put_u32(0); // Bit count
stream_buffer->put_u32(0); // R Bitmask
stream_buffer->put_u32(0); // G Bitmask
stream_buffer->put_u32(0); // B Bitmask
stream_buffer->put_u32(0); // A Bitmask
}
uint32_t caps1 = info.compressed ? DDSD_LINEARSIZE : DDSD_PITCH;
stream_buffer->put_32(caps1);
stream_buffer->put_u32(caps1);
stream_buffer->put_32(0); // Caps2
stream_buffer->put_32(0); // Caps3
stream_buffer->put_32(0); // Caps4
stream_buffer->put_32(0); // Reserved 2
stream_buffer->put_u32(0); // Caps2
stream_buffer->put_u32(0); // Caps3
stream_buffer->put_u32(0); // Caps4
stream_buffer->put_u32(0); // Reserved 2
if (format_type == DDFT_DXGI) {
// DX10 header.
uint32_t dxgi_format = _image_format_to_dxgi_format(image->get_format());
stream_buffer->put_32(dxgi_format);
stream_buffer->put_32(DX10D_2D);
stream_buffer->put_32(0); // Misc flags 1
stream_buffer->put_32(1); // Array size
stream_buffer->put_32(0); // Misc flags 2
stream_buffer->put_u32(dxgi_format);
stream_buffer->put_u32(DX10D_2D);
stream_buffer->put_u32(0); // Misc flags 1
stream_buffer->put_u32(1); // Array size
stream_buffer->put_u32(0); // Misc flags 2
}
for (uint32_t mip_i = 0; mip_i < mipmaps; mip_i++) {

View file

@ -33,6 +33,8 @@
#include "image_saver_dds.h"
#include "texture_loader_dds.h"
#include "core/io/resource_loader.h"
#include "core/object/class_db.h"
#include "scene/resources/texture.h"
static Ref<ResourceFormatDDS> resource_loader_dds;

View file

@ -34,8 +34,8 @@
#include "core/config/project_settings.h"
#include "core/io/dir_access.h"
#include "core/io/file_access.h"
#include "core/io/image.h"
#include "tests/core/config/test_project_settings.h"
#include "tests/test_macros.h"
#include "tests/test_utils.h"

View file

@ -34,6 +34,7 @@
#include "core/io/file_access.h"
#include "core/io/file_access_memory.h"
#include "core/object/class_db.h"
#include "scene/resources/image_texture.h"
DDSFormat _dxgi_to_dds_format(uint32_t p_dxgi_format) {
@ -75,7 +76,9 @@ DDSFormat _dxgi_to_dds_format(uint32_t p_dxgi_format) {
case DXGI_R32_FLOAT: {
return DDS_R32F;
}
case DXGI_R8_UNORM:
case DXGI_R8_UNORM: {
return DDS_R8;
}
case DXGI_A8_UNORM: {
return DDS_LUMINANCE;
}
@ -89,7 +92,7 @@ DDSFormat _dxgi_to_dds_format(uint32_t p_dxgi_format) {
return DDS_R16I;
}
case DXGI_R8G8_UNORM: {
return DDS_LUMINANCE_ALPHA;
return DDS_RG8;
}
case DXGI_R9G9B9E5: {
return DDS_RGB9E5;
@ -648,6 +651,10 @@ static Vector<Ref<Image>> _dds_load_images_from_buffer(Ref<FileAccess> p_f, DDSF
r_dds_format = DDS_BGRX8;
} else if (format_rgb_bits == 32 && format_red_mask == 0xff && format_green_mask == 0xff00 && format_blue_mask == 0xff0000) {
r_dds_format = DDS_RGBX8;
} else if (format_rgb_bits == 8 && format_red_mask == 0xff && format_green_mask == 0 && format_blue_mask == 0) {
r_dds_format = DDS_R8;
} else if (format_rgb_bits == 16 && format_red_mask == 0xff && format_green_mask == 0xff00 && format_blue_mask == 0) {
r_dds_format = DDS_RG8;
}
}