From cb09357bba40dfa0f7f953d1db65e6106dbfc648 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 1 Sep 2017 00:41:40 +0100 Subject: [PATCH] Create paint_session to replace paint globals --- src/openrct2/drawing/lightfx.c | 2 +- src/openrct2/interface/viewport.c | 4 +- src/openrct2/paint/map_element/surface.c | 14 +- src/openrct2/paint/paint.c | 212 ++++++++++++----------- src/openrct2/paint/paint.h | 34 +++- 5 files changed, 150 insertions(+), 116 deletions(-) diff --git a/src/openrct2/drawing/lightfx.c b/src/openrct2/drawing/lightfx.c index 7b3c79bd75..f322f0a846 100644 --- a/src/openrct2/drawing/lightfx.c +++ b/src/openrct2/drawing/lightfx.c @@ -285,7 +285,7 @@ void lightfx_prepare_light_list() dpi->zoom_level = _viewportDpi1.zoom; dpi->height = 1; dpi->width = 1; - gEndOfPaintStructArray = 0xF1A4CC; + gPaintSession.EndOfPaintStructArray = 0xF1A4CC; unk_140E9A8 = dpi; painter_setup(); viewport_paint_setup(); diff --git a/src/openrct2/interface/viewport.c b/src/openrct2/interface/viewport.c index 74965b6c2e..596aadc2c2 100644 --- a/src/openrct2/interface/viewport.c +++ b/src/openrct2/interface/viewport.c @@ -754,8 +754,8 @@ static void viewport_paint_column(rct_drawpixelinfo * dpi, uint32 viewFlags) viewport_paint_weather_gloom(dpi); } - if (gPaintPSStringHead != NULL) { - paint_draw_money_structs(dpi, gPaintPSStringHead); + if (gPaintSession.PSStringHead != NULL) { + paint_draw_money_structs(dpi, gPaintSession.PSStringHead); } } diff --git a/src/openrct2/paint/map_element/surface.c b/src/openrct2/paint/map_element/surface.c index 57810a5dcd..87150d8fb3 100644 --- a/src/openrct2/paint/map_element/surface.c +++ b/src/openrct2/paint/map_element/surface.c @@ -446,7 +446,7 @@ static void viewport_surface_smoothen_edge(enum edge_t edge, struct tile_descrip uint32 image_id = maskImageBase + byte_97B444[self.slope]; if (paint_attach_to_previous_ps(image_id, 0, 0)) { - attached_paint_struct * out = g_aps_F1AD2C; + attached_paint_struct * out = gPaintSession.UnkF1AD2C; // set content and enable masking out->colour_image_id = dword_97B804[neighbour.terrain] + cl; out->flags |= PAINT_STRUCT_FLAG_IS_MASKED; @@ -1194,10 +1194,10 @@ void surface_paint(uint8 direction, uint16 height, rct_map_element * mapElement) paint_attach_to_previous_ps(SPR_TERRAIN_SELECTION_SQUARE + byte_97B444[surfaceShape], 0, 0); } else if (mapElement->properties.surface.ownership & OWNERSHIP_AVAILABLE) { rct_xy16 pos = {gPaintMapPosition.x, gPaintMapPosition.y}; - paint_struct * backup = g_ps_F1AD28; + paint_struct * backup = gPaintSession.UnkF1AD28; sint32 height2 = (map_element_height(pos.x + 16, pos.y + 16) & 0xFFFF) + 3; sub_98196C(SPR_LAND_OWNERSHIP_AVAILABLE, 16, 16, 1, 1, 0, height2, rotation); - g_ps_F1AD28 = backup; + gPaintSession.UnkF1AD28 = backup; } } @@ -1207,11 +1207,11 @@ void surface_paint(uint8 direction, uint16 height, rct_map_element * mapElement) assert(surfaceShape < countof(byte_97B444)); paint_attach_to_previous_ps(SPR_TERRAIN_SELECTION_DOTTED + byte_97B444[surfaceShape], 0, 0); } else if (mapElement->properties.surface.ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE) { - paint_struct * backup = g_ps_F1AD28; + paint_struct * backup = gPaintSession.UnkF1AD28; rct_xy16 pos = {gPaintMapPosition.x, gPaintMapPosition.y}; sint32 height2 = map_element_height(pos.x + 16, pos.y + 16) & 0xFFFF; sub_98196C(SPR_LAND_CONSTRUCTION_RIGHTS_AVAILABLE, 16, 16, 1, 1, 0, height2 + 3, rotation); - g_ps_F1AD28 = backup; + gPaintSession.UnkF1AD28 = backup; } } @@ -1276,9 +1276,9 @@ void surface_paint(uint8 direction, uint16 height, rct_map_element * mapElement) sint32 image_id = (SPR_TERRAIN_SELECTION_CORNER + byte_97B444[local_surfaceShape]) | 0x21300000; - paint_struct * backup = g_ps_F1AD28; + paint_struct * backup = gPaintSession.UnkF1AD28; sub_98196C(image_id, 0, 0, 32, 32, 1, local_height, rotation); - g_ps_F1AD28 = backup; + gPaintSession.UnkF1AD28 = backup; } } } diff --git a/src/openrct2/paint/paint.c b/src/openrct2/paint/paint.c index e80c6477d1..ae4aab2b6e 100644 --- a/src/openrct2/paint/paint.c +++ b/src/openrct2/paint/paint.c @@ -31,23 +31,11 @@ const uint32 construction_markers[] = { PALETTE_DARKEN_2 << 19 | IMAGE_TYPE_TRANSPARENT, // Translucent }; -paint_struct * g_ps_F1AD28; -attached_paint_struct * g_aps_F1AD2C; - -paint_string_struct * gPaintPSStringHead; -static paint_string_struct * _paintLastPSString; - -#define MAX_PAINT_QUADRANTS (512) +paint_session gPaintSession; #ifdef NO_RCT2 -paint_entry gPaintStructs[4000]; -static uint32 _paintQuadrantBackIndex; -static uint32 _paintQuadrantFrontIndex; -static paint_struct *_paintQuadrants[MAX_PAINT_QUADRANTS]; void *g_currently_drawn_item; -paint_entry * gEndOfPaintStructArray; rct_xy16 gPaintSpritePosition; -paint_struct gUnkF1A4CC; uint8 gPaintInteractionType; support_height gSupportSegments[9] = { 0 }; support_height gSupport; @@ -81,46 +69,51 @@ static void paint_ps_image_with_bounding_boxes(rct_drawpixelinfo * dpi, paint_st static void paint_ps_image(rct_drawpixelinfo * dpi, paint_struct * ps, uint32 imageId, sint16 x, sint16 y); static uint32 paint_ps_colourify_image(uint32 imageId, uint8 spriteType, uint32 viewFlags); +static void paint_session_init(paint_session * session, rct_drawpixelinfo * dpi) +{ + memset(session, 0, sizeof(paint_session)); + session->Unk140E9A8 = dpi; + session->EndOfPaintStructArray = &session->PaintStructs[4000 - 1]; + session->NextFreePaintStruct = session->PaintStructs; + session->UnkF1AD28 = NULL; + session->UnkF1AD2C = NULL; + for (sint32 i = 0; i < MAX_PAINT_QUADRANTS; i++) { + session->Quadrants[i] = NULL; + } + session->QuadrantBackIndex = -1; + session->QuadrantFrontIndex = 0; + session->PSStringHead = NULL; + session->LastPSString = NULL; + session->WoodenSupportsPrependTo = NULL; +} + /** * * rct2: 0x0068615B */ void paint_init(rct_drawpixelinfo * dpi) { - unk_140E9A8 = dpi; - gEndOfPaintStructArray = &gPaintStructs[4000 - 1]; - gNextFreePaintStruct = gPaintStructs; - g_ps_F1AD28 = NULL; - g_aps_F1AD2C = NULL; - for (sint32 i = 0; i < 512; i++) { - _paintQuadrants[i] = NULL; - } - _paintQuadrantBackIndex = -1; - _paintQuadrantFrontIndex = 0; - gPaintPSStringHead = NULL; - _paintLastPSString = NULL; - gWoodenSupportsPrependTo = NULL; + paint_session_init(&gPaintSession, dpi); } -static void paint_add_ps_to_quadrant(paint_struct * ps, sint32 positionHash) +static void paint_session_add_ps_to_quadrant(paint_session * session, paint_struct * ps, sint32 positionHash) { uint32 paintQuadrantIndex = clamp(0, positionHash / 32, MAX_PAINT_QUADRANTS - 1); - ps->quadrant_index = paintQuadrantIndex; - ps->next_quadrant_ps = _paintQuadrants[paintQuadrantIndex]; - _paintQuadrants[paintQuadrantIndex] = ps; + ps->next_quadrant_ps = session->Quadrants[paintQuadrantIndex]; + session->Quadrants[paintQuadrantIndex] = ps; - _paintQuadrantBackIndex = min(_paintQuadrantBackIndex, paintQuadrantIndex); - _paintQuadrantFrontIndex = max(_paintQuadrantFrontIndex, paintQuadrantIndex); + session->QuadrantBackIndex = min(session->QuadrantBackIndex, paintQuadrantIndex); + session->QuadrantFrontIndex = max(session->QuadrantFrontIndex, paintQuadrantIndex); } /** * Extracted from 0x0098196c, 0x0098197c, 0x0098198c, 0x0098199c */ -static paint_struct * sub_9819_c(uint32 image_id, rct_xyz16 offset, rct_xyz16 boundBoxSize, rct_xyz16 boundBoxOffset, uint8 rotation) +static paint_struct * sub_9819_c(paint_session * session, uint32 image_id, rct_xyz16 offset, rct_xyz16 boundBoxSize, rct_xyz16 boundBoxOffset, uint8 rotation) { - if (gNextFreePaintStruct >= gEndOfPaintStructArray) return NULL; - paint_struct * ps = &gNextFreePaintStruct->basic; + if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) return NULL; + paint_struct * ps = &session->NextFreePaintStruct->basic; ps->image_id = image_id; @@ -141,8 +134,8 @@ static paint_struct * sub_9819_c(uint32 image_id, rct_xyz16 offset, rct_xyz16 bo rotate_map_coordinates(&offset.x, &offset.y, 1); break; } - offset.x += gPaintSpritePosition.x; - offset.y += gPaintSpritePosition.y; + offset.x += session->SpritePosition.x; + offset.y += session->SpritePosition.y; rct_xy16 map = coordinate_3d_to_2d(&offset, rotation); @@ -187,20 +180,20 @@ static paint_struct * sub_9819_c(uint32 image_id, rct_xyz16 offset, rct_xyz16 bo break; } - ps->bound_box_x_end = boundBoxSize.x + boundBoxOffset.x + gPaintSpritePosition.x; + ps->bound_box_x_end = boundBoxSize.x + boundBoxOffset.x + session->SpritePosition.x; ps->bound_box_z = boundBoxOffset.z; ps->bound_box_z_end = boundBoxOffset.z + boundBoxSize.z; - ps->bound_box_y_end = boundBoxSize.y + boundBoxOffset.y + gPaintSpritePosition.y; + ps->bound_box_y_end = boundBoxSize.y + boundBoxOffset.y + session->SpritePosition.y; ps->flags = 0; - ps->bound_box_x = boundBoxOffset.x + gPaintSpritePosition.x; - ps->bound_box_y = boundBoxOffset.y + gPaintSpritePosition.y; + ps->bound_box_x = boundBoxOffset.x + session->SpritePosition.x; + ps->bound_box_y = boundBoxOffset.y + session->SpritePosition.y; ps->attached_ps = NULL; ps->var_20 = NULL; - ps->sprite_type = gPaintInteractionType; + ps->sprite_type = session->InteractionType; ps->var_29 = 0; - ps->map_x = gPaintMapPosition.x; - ps->map_y = gPaintMapPosition.y; - ps->mapElement = g_currently_drawn_item; + ps->map_x = session->MapPosition.x; + ps->map_y = session->MapPosition.y; + ps->mapElement = session->CurrentlyDrawnItem; return ps; } @@ -228,14 +221,16 @@ paint_struct * sub_98196C( assert((uint16) bound_box_length_x == (sint16) bound_box_length_x); assert((uint16) bound_box_length_y == (sint16) bound_box_length_y); - g_ps_F1AD28 = 0; - g_aps_F1AD2C = NULL; + paint_session * session = &gPaintSession; - if (gNextFreePaintStruct >= gEndOfPaintStructArray) { + session->UnkF1AD28 = 0; + session->UnkF1AD2C = NULL; + + if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) { return NULL; } - paint_struct *ps = &gNextFreePaintStruct->basic; + paint_struct *ps = &session->NextFreePaintStruct->basic; ps->image_id = image_id; uint32 image_element = image_id & 0x7FFFF; @@ -282,8 +277,8 @@ paint_struct * sub_98196C( break; } - coord_3d.x += gPaintSpritePosition.x; - coord_3d.y += gPaintSpritePosition.y; + coord_3d.x += session->SpritePosition.x; + coord_3d.y += session->SpritePosition.y; ps->bound_box_x_end = coord_3d.x + boundBox.x; ps->bound_box_y_end = coord_3d.y + boundBox.y; @@ -315,13 +310,13 @@ paint_struct * sub_98196C( ps->bound_box_y = coord_3d.y; ps->attached_ps = NULL; ps->var_20 = NULL; - ps->sprite_type = gPaintInteractionType; + ps->sprite_type = session->InteractionType; ps->var_29 = 0; - ps->map_x = gPaintMapPosition.x; - ps->map_y = gPaintMapPosition.y; + ps->map_x = session->MapPosition.x; + ps->map_y = session->MapPosition.y; ps->mapElement = g_currently_drawn_item; - g_ps_F1AD28 = ps; + session->UnkF1AD28 = ps; sint32 positionHash = 0; switch (rotation) { @@ -338,9 +333,9 @@ paint_struct * sub_98196C( positionHash = coord_3d.x - coord_3d.y + 0x2000; break; } - paint_add_ps_to_quadrant(ps, positionHash); + paint_session_add_ps_to_quadrant(session, ps, positionHash); - gNextFreePaintStruct++; + session->NextFreePaintStruct++; return ps; } @@ -369,19 +364,21 @@ paint_struct * sub_98197C( sint16 bound_box_offset_x, sint16 bound_box_offset_y, sint16 bound_box_offset_z, uint32 rotation ) { - g_ps_F1AD28 = 0; - g_aps_F1AD2C = NULL; + paint_session * session = &gPaintSession; + + session->UnkF1AD28 = 0; + session->UnkF1AD2C = NULL; rct_xyz16 offset = {.x = x_offset, .y = y_offset, .z = z_offset}; rct_xyz16 boundBoxSize = {.x = bound_box_length_x, .y = bound_box_length_y, .z = bound_box_length_z}; rct_xyz16 boundBoxOffset = {.x = bound_box_offset_x, .y = bound_box_offset_y, .z = bound_box_offset_z}; - paint_struct * ps = sub_9819_c(image_id, offset, boundBoxSize, boundBoxOffset, rotation); + paint_struct * ps = sub_9819_c(session, image_id, offset, boundBoxSize, boundBoxOffset, rotation); if (ps == NULL) { return NULL; } - g_ps_F1AD28 = ps; + session->UnkF1AD28 = ps; rct_xy16 attach = { .x = ps->bound_box_x, @@ -402,9 +399,9 @@ paint_struct * sub_98197C( } sint32 positionHash = attach.x + attach.y; - paint_add_ps_to_quadrant(ps, positionHash); + paint_session_add_ps_to_quadrant(session, ps, positionHash); - gNextFreePaintStruct++; + session->NextFreePaintStruct++; return ps; } @@ -436,20 +433,21 @@ paint_struct * sub_98198C( assert((uint16) bound_box_length_x == (sint16) bound_box_length_x); assert((uint16) bound_box_length_y == (sint16) bound_box_length_y); - g_ps_F1AD28 = 0; - g_aps_F1AD2C = NULL; + paint_session * session = &gPaintSession; + session->UnkF1AD28 = 0; + session->UnkF1AD2C = NULL; rct_xyz16 offset = {.x = x_offset, .y = y_offset, .z = z_offset}; rct_xyz16 boundBoxSize = {.x = bound_box_length_x, .y = bound_box_length_y, .z = bound_box_length_z}; rct_xyz16 boundBoxOffset = {.x = bound_box_offset_x, .y = bound_box_offset_y, .z = bound_box_offset_z}; - paint_struct * ps = sub_9819_c(image_id, offset, boundBoxSize, boundBoxOffset, rotation); + paint_struct * ps = sub_9819_c(session, image_id, offset, boundBoxSize, boundBoxOffset, rotation); if (ps == NULL) { return NULL; } - g_ps_F1AD28 = ps; - gNextFreePaintStruct++; + session->UnkF1AD28 = ps; + session->NextFreePaintStruct++; return ps; } @@ -481,7 +479,9 @@ paint_struct * sub_98199C( assert((uint16) bound_box_length_x == (sint16) bound_box_length_x); assert((uint16) bound_box_length_y == (sint16) bound_box_length_y); - if (g_ps_F1AD28 == NULL) { + paint_session * session = &gPaintSession; + + if (session->UnkF1AD28 == NULL) { return sub_98197C( image_id, x_offset, y_offset, @@ -495,17 +495,17 @@ paint_struct * sub_98199C( rct_xyz16 offset = {.x = x_offset, .y = y_offset, .z = z_offset}; rct_xyz16 boundBox = {.x = bound_box_length_x, .y = bound_box_length_y, .z = bound_box_length_z}; rct_xyz16 boundBoxOffset = {.x = bound_box_offset_x, .y = bound_box_offset_y, .z = bound_box_offset_z}; - paint_struct * ps = sub_9819_c(image_id, offset, boundBox, boundBoxOffset, rotation); + paint_struct * ps = sub_9819_c(session, image_id, offset, boundBox, boundBoxOffset, rotation); if (ps == NULL) { return NULL; } - paint_struct *old_ps = g_ps_F1AD28; + paint_struct *old_ps = session->UnkF1AD28; old_ps->var_20 = ps; - g_ps_F1AD28 = ps; - gNextFreePaintStruct++; + session->UnkF1AD28 = ps; + session->NextFreePaintStruct++; return ps; } @@ -519,27 +519,29 @@ paint_struct * sub_98199C( */ bool paint_attach_to_previous_attach(uint32 image_id, uint16 x, uint16 y) { - if (g_aps_F1AD2C == NULL) { + paint_session * session = &gPaintSession; + + if (session->UnkF1AD2C == NULL) { return paint_attach_to_previous_ps(image_id, x, y); } - if (gNextFreePaintStruct >= gEndOfPaintStructArray) { + if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) { return false; } - attached_paint_struct * ps = &gNextFreePaintStruct->attached; + attached_paint_struct * ps = &session->NextFreePaintStruct->attached; ps->image_id = image_id; ps->x = x; ps->y = y; ps->flags = 0; - attached_paint_struct * ebx = g_aps_F1AD2C; + attached_paint_struct * ebx = session->UnkF1AD2C; ps->next = NULL; ebx->next = ps; - g_aps_F1AD2C = ps; + session->UnkF1AD2C = ps; - gNextFreePaintStruct++; + session->NextFreePaintStruct++; return true; } @@ -554,29 +556,31 @@ bool paint_attach_to_previous_attach(uint32 image_id, uint16 x, uint16 y) */ bool paint_attach_to_previous_ps(uint32 image_id, uint16 x, uint16 y) { - if (gNextFreePaintStruct >= gEndOfPaintStructArray) { + paint_session * session = &gPaintSession; + + if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) { return false; } - attached_paint_struct * ps = &gNextFreePaintStruct->attached; + attached_paint_struct * ps = &session->NextFreePaintStruct->attached; ps->image_id = image_id; ps->x = x; ps->y = y; ps->flags = 0; - paint_struct * masterPs = g_ps_F1AD28; + paint_struct * masterPs = session->UnkF1AD28; if (masterPs == NULL) { return false; } - gNextFreePaintStruct++; + session->NextFreePaintStruct++; attached_paint_struct * oldFirstAttached = masterPs->attached_ps; masterPs->attached_ps = ps; ps->next = oldFirstAttached; - g_aps_F1AD2C = ps; + session->UnkF1AD2C = ps; return true; } @@ -593,10 +597,12 @@ bool paint_attach_to_previous_ps(uint32 image_id, uint16 x, uint16 y) */ void paint_floating_money_effect(money32 amount, rct_string_id string_id, sint16 y, sint16 z, sint8 y_offsets[], sint16 offset_x, uint32 rotation) { - if (gNextFreePaintStruct >= gEndOfPaintStructArray) { + paint_session * session = &gPaintSession; + + if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) { return; } - paint_string_struct * ps = &gNextFreePaintStruct->string; + paint_string_struct * ps = &session->NextFreePaintStruct->string; ps->string_id = string_id; ps->next = 0; @@ -606,20 +612,23 @@ void paint_floating_money_effect(money32 amount, rct_string_id string_id, sint16 ps->args[3] = 0; ps->y_offsets = (uint8 *) y_offsets; - rct_xyz16 position = {.x = gPaintSpritePosition.x, .y = gPaintSpritePosition.y, .z = z}; + rct_xyz16 position = { + .x = session->SpritePosition.x, + .y = session->SpritePosition.y, + .z = z }; rct_xy16 coord = coordinate_3d_to_2d(&position, rotation); ps->x = coord.x + offset_x; ps->y = coord.y; - gNextFreePaintStruct++; + session->NextFreePaintStruct++; - if (_paintLastPSString == NULL) { - gPaintPSStringHead = ps; + if (session->LastPSString == NULL) { + session->PSStringHead = ps; } else { - _paintLastPSString->next = ps; + session->LastPSString->next = ps; } - _paintLastPSString = ps; + session->LastPSString = ps; } /** @@ -841,15 +850,15 @@ static paint_struct * paint_arrange_structs_helper(paint_struct * ps_next, uint1 * * rct2: 0x00688217 */ -paint_struct paint_arrange_structs() +static paint_struct paint_session_arrange_structs(paint_session * session) { paint_struct psHead = { 0 }; paint_struct * ps = &psHead; ps->next_quadrant_ps = NULL; - uint32 quadrantIndex = _paintQuadrantBackIndex; + uint32 quadrantIndex = session->QuadrantBackIndex; if (quadrantIndex != UINT32_MAX) { do { - paint_struct * ps_next = _paintQuadrants[quadrantIndex]; + paint_struct * ps_next = session->Quadrants[quadrantIndex]; if (ps_next != NULL) { ps->next_quadrant_ps = ps_next; do { @@ -857,18 +866,23 @@ paint_struct paint_arrange_structs() ps_next = ps_next->next_quadrant_ps; } while (ps_next != NULL); } - } while (++quadrantIndex <= _paintQuadrantFrontIndex); + } while (++quadrantIndex <= session->QuadrantFrontIndex); - paint_struct * ps_cache = paint_arrange_structs_helper(&psHead, _paintQuadrantBackIndex & 0xFFFF, PAINT_QUADRANT_FLAG_NEXT); + paint_struct * ps_cache = paint_arrange_structs_helper(&psHead, session->QuadrantBackIndex & 0xFFFF, PAINT_QUADRANT_FLAG_NEXT); - quadrantIndex = _paintQuadrantBackIndex; - while (++quadrantIndex < _paintQuadrantFrontIndex) { + quadrantIndex = session->QuadrantBackIndex; + while (++quadrantIndex < session->QuadrantFrontIndex) { ps_cache = paint_arrange_structs_helper(ps_cache, quadrantIndex & 0xFFFF, 0); } } return psHead; } +paint_struct paint_arrange_structs() +{ + return paint_session_arrange_structs(&gPaintSession); +} + /** * * rct2: 0x00688485 diff --git a/src/openrct2/paint/paint.h b/src/openrct2/paint/paint.h index 34f5a9752f..0f905c7e06 100644 --- a/src/openrct2/paint/paint.h +++ b/src/openrct2/paint/paint.h @@ -91,9 +91,6 @@ struct paint_struct { assert_struct_size(paint_struct, 0x34); #endif -extern paint_struct * g_ps_F1AD28; -extern attached_paint_struct * g_aps_F1AD2C; - typedef struct paint_string_struct paint_string_struct; /* size 0x1E */ @@ -133,11 +130,36 @@ typedef struct support_height { uint8 pad; } support_height; +#define MAX_PAINT_QUADRANTS 512 + +typedef struct paint_session +{ + rct_drawpixelinfo * Unk140E9A8; + paint_entry PaintStructs[4000]; + paint_struct * Quadrants[MAX_PAINT_QUADRANTS]; + uint32 QuadrantBackIndex; + uint32 QuadrantFrontIndex; + void * CurrentlyDrawnItem; + paint_entry * EndOfPaintStructArray; + paint_entry * NextFreePaintStruct; + rct_xy16 SpritePosition; + paint_struct UnkF1A4CC; + paint_struct * UnkF1AD28; + attached_paint_struct * UnkF1AD2C; + uint8 InteractionType; + support_height SupportSegments[9]; + support_height Support; + paint_string_struct * PSStringHead; + paint_string_struct * LastPSString; + paint_struct * WoodenSupportsPrependTo; + rct_xy16 MapPosition; +} paint_session; + +extern paint_session gPaintSession; + #ifdef NO_RCT2 extern void *g_currently_drawn_item; -extern paint_entry * gEndOfPaintStructArray; extern rct_xy16 gPaintSpritePosition; -extern paint_entry gPaintStructs[4000]; #else #define gPaintStructs RCT2_ADDRESS(0x00EE788C, paint_entry) #define g_currently_drawn_item RCT2_GLOBAL(0x009DE578, void*) @@ -155,8 +177,6 @@ extern support_height gSupportSegments[9]; extern support_height gSupport; #endif -extern paint_string_struct * gPaintPSStringHead; - /** rct2: 0x00993CC4 */ extern const uint32 construction_markers[]; extern bool gShowDirtyVisuals;