mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-17 20:13:07 +01:00
Refactor gX.dat loading, make sure g2.dat loads too
This commit is contained in:
@@ -57,6 +57,19 @@ typedef struct rct_drawpixelinfo {
|
||||
assert_struct_size(rct_drawpixelinfo, 0x10);
|
||||
#endif
|
||||
|
||||
// Size: 0x10
|
||||
typedef struct rct_g1_element_32bit {
|
||||
uint32 offset; // 0x00 note: uint32 always!
|
||||
sint16 width; // 0x04
|
||||
sint16 height; // 0x06
|
||||
sint16 x_offset; // 0x08
|
||||
sint16 y_offset; // 0x0A
|
||||
uint16 flags; // 0x0C
|
||||
uint16 zoomed_offset; // 0x0E
|
||||
} rct_g1_element_32bit;
|
||||
assert_struct_size(rct_g1_element_32bit, 0x10);
|
||||
|
||||
|
||||
enum {
|
||||
G1_FLAG_BMP = (1 << 0), //No invisible sections
|
||||
G1_FLAG_RLE_COMPRESSION = (1<<2),
|
||||
|
||||
@@ -31,6 +31,25 @@ rct_gx g2;
|
||||
rct_g1_element *g1Elements = (rct_g1_element*)RCT2_ADDRESS_G1_ELEMENTS;
|
||||
#endif
|
||||
|
||||
static void read_and_convert_gxdat(SDL_RWops *file, size_t count, rct_g1_element *elements)
|
||||
{
|
||||
rct_g1_element_32bit *g1Elements32 = calloc(count, sizeof(rct_g1_element_32bit));
|
||||
SDL_RWread(file, g1Elements32, count * sizeof(rct_g1_element_32bit), 1);
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
/* Double cast to silence compiler warning about casting to
|
||||
* pointer from integer of mismatched length.
|
||||
*/
|
||||
elements[i].offset = (uint8*)(uintptr_t)g1Elements32[i].offset;
|
||||
elements[i].width = g1Elements32[i].width;
|
||||
elements[i].height = g1Elements32[i].height;
|
||||
elements[i].x_offset = g1Elements32[i].x_offset;
|
||||
elements[i].y_offset = g1Elements32[i].y_offset;
|
||||
elements[i].flags = g1Elements32[i].flags;
|
||||
elements[i].zoomed_offset = g1Elements32[i].zoomed_offset;
|
||||
}
|
||||
free(g1Elements32);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00678998
|
||||
@@ -77,18 +96,7 @@ int gfx_load_g1()
|
||||
g1Elements = calloc(324206, sizeof(rct_g1_element));
|
||||
#endif
|
||||
|
||||
rct_g1_element_32bit *g1Elements32 = calloc(324206, sizeof(rct_g1_element_32bit));
|
||||
SDL_RWread(file, g1Elements32, header.num_entries * sizeof(rct_g1_element_32bit), 1);
|
||||
for (uint32 i = 0; i < header.num_entries; i++) {
|
||||
g1Elements[i].offset = (uint8*)g1Elements32[i].offset;
|
||||
g1Elements[i].width = g1Elements32[i].width;
|
||||
g1Elements[i].height = g1Elements32[i].height;
|
||||
g1Elements[i].x_offset = g1Elements32[i].x_offset;
|
||||
g1Elements[i].y_offset = g1Elements32[i].y_offset;
|
||||
g1Elements[i].flags = g1Elements32[i].flags;
|
||||
g1Elements[i].zoomed_offset = g1Elements32[i].zoomed_offset;
|
||||
}
|
||||
free(g1Elements32);
|
||||
read_and_convert_gxdat(file, header.num_entries, g1Elements);
|
||||
|
||||
// Read element data
|
||||
_g1Buffer = malloc(header.total_size);
|
||||
@@ -141,7 +149,8 @@ int gfx_load_g2()
|
||||
if (SDL_RWread(file, &g2.header, 8, 1) == 1) {
|
||||
// Read element headers
|
||||
g2.elements = malloc(g2.header.num_entries * sizeof(rct_g1_element));
|
||||
SDL_RWread(file, g2.elements, g2.header.num_entries * sizeof(rct_g1_element), 1);
|
||||
|
||||
read_and_convert_gxdat(file, g2.header.num_entries, g2.elements);
|
||||
|
||||
// Read element data
|
||||
g2.data = malloc(g2.header.total_size);
|
||||
|
||||
16
src/object.c
16
src/object.c
@@ -460,17 +460,23 @@ int object_chunk_load_image_directory(uint8_t** chunk)
|
||||
rct_g1_element* g1_dest = &g1Elements[image_start_no];
|
||||
|
||||
// After length of data is the start of all g1 element structs
|
||||
rct_g1_element* g1_source = (rct_g1_element*)(*chunk);
|
||||
rct_g1_element_32bit* g1_source = (rct_g1_element_32bit*)(*chunk);
|
||||
|
||||
// After the g1 element structs is the actual images.
|
||||
uint8* image_offset = no_images * sizeof(rct_g1_element) + (uint8*)g1_source;
|
||||
uintptr_t image_offset = no_images * sizeof(rct_g1_element_32bit) + (uintptr_t)g1_source;
|
||||
|
||||
for (int i = 0; i < no_images; ++i){
|
||||
*g1_dest = *g1_source++;
|
||||
g1_dest->offset += (uint32)image_offset;
|
||||
for (int i = 0; i < no_images; ++i) {
|
||||
g1_dest->offset = (uint8*)(g1_source->offset + image_offset);
|
||||
g1_dest->width = g1_source->width;
|
||||
g1_dest->height = g1_source->height;
|
||||
g1_dest->x_offset = g1_source->x_offset;
|
||||
g1_dest->y_offset = g1_source->y_offset;
|
||||
g1_dest->flags = g1_source->flags;
|
||||
g1_dest->zoomed_offset = g1_source->zoomed_offset;
|
||||
g1_dest++;
|
||||
|
||||
drawing_engine_invalidate_image(image_start_no + i);
|
||||
g1_source++;
|
||||
}
|
||||
|
||||
*chunk = ((uint8*)g1_source) + length_of_data;
|
||||
|
||||
Reference in New Issue
Block a user