diff --git a/src/openrct2/interface/viewport.c b/src/openrct2/interface/viewport.c index 8e59d05713..6c4462ea9d 100644 --- a/src/openrct2/interface/viewport.c +++ b/src/openrct2/interface/viewport.c @@ -743,13 +743,11 @@ static void viewport_paint_column(rct_drawpixelinfo * dpi, uint32 viewFlags) gfx_clear(dpi, colour); } - // Allocate a paint session - paint_session * session = &gPaintSession; - paint_session_init(session, dpi); - + paint_session * session = paint_session_alloc(dpi); paint_session_generate(session); paint_struct ps = paint_session_arrange(session); paint_draw_structs(dpi, &ps, viewFlags); + paint_session_free(session); if (gConfigGeneral.render_weather_gloom && !gTrackDesignSaveMode && @@ -1375,13 +1373,11 @@ void get_map_coordinates_from_pos(sint32 screenX, sint32 screenY, sint32 flags, dpi->x = _viewportDpi1.x; dpi->width = 1; - // Allocate a paint session - paint_session * session = &gPaintSession; - paint_session_init(session, dpi); - + paint_session * session = paint_session_alloc(dpi); paint_session_generate(session); paint_struct ps = paint_session_arrange(session); sub_68862C(dpi, &ps); + paint_session_free(session); } if (viewport != NULL) *viewport = myviewport; } diff --git a/src/openrct2/paint/paint.c b/src/openrct2/paint/paint.c index 9bfd231a9a..722793fcd6 100644 --- a/src/openrct2/paint/paint.c +++ b/src/openrct2/paint/paint.c @@ -32,6 +32,7 @@ const uint32 construction_markers[] = { }; paint_session gPaintSession; +static bool _paintSessionInUse; #ifndef NO_RCT2 #define _paintQuadrants (RCT2_ADDRESS(0x00F1A50C, paint_struct*)) @@ -58,12 +59,29 @@ static const uint8 BoundBoxDebugColours[] = { bool gShowDirtyVisuals; bool gPaintBoundingBoxes; +static void paint_session_init(paint_session * session, rct_drawpixelinfo * dpi); static void paint_attached_ps(rct_drawpixelinfo * dpi, paint_struct * ps, uint32 viewFlags); static void paint_ps_image_with_bounding_boxes(rct_drawpixelinfo * dpi, paint_struct * ps, uint32 imageId, sint16 x, sint16 y); 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); -void paint_session_init(paint_session * session, rct_drawpixelinfo * dpi) +paint_session * paint_session_alloc(rct_drawpixelinfo * dpi) +{ + // Currently limited to just one session at a time + assert(!_paintSessionInUse); + _paintSessionInUse = true; + paint_session * session = &gPaintSession; + + paint_session_init(session, dpi); + return session; +} + +void paint_session_free(paint_session * session) +{ + _paintSessionInUse = false; +} + +static void paint_session_init(paint_session * session, rct_drawpixelinfo * dpi) { memset(session, 0, sizeof(paint_session)); session->Unk140E9A8 = dpi; diff --git a/src/openrct2/paint/paint.h b/src/openrct2/paint/paint.h index 6fcf796d17..3e7e6fdc58 100644 --- a/src/openrct2/paint/paint.h +++ b/src/openrct2/paint/paint.h @@ -226,7 +226,8 @@ 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); void paint_floating_money_effect(money32 amount, rct_string_id string_id, sint16 y, sint16 z, sint8 y_offsets[], sint16 offset_x, uint32 rotation); -void paint_session_init(paint_session * session, rct_drawpixelinfo * dpi); +paint_session * paint_session_alloc(rct_drawpixelinfo * dpi); +void paint_session_free(paint_session *); void paint_session_generate(paint_session * session); paint_struct paint_session_arrange(paint_session * session); paint_struct * paint_arrange_structs_helper(paint_struct * ps_next, uint16 quadrantIndex, uint8 flag); diff --git a/src/openrct2/windows/RideConstruction.cpp b/src/openrct2/windows/RideConstruction.cpp index 0eeba747e7..e5b6ef34f7 100644 --- a/src/openrct2/windows/RideConstruction.cpp +++ b/src/openrct2/windows/RideConstruction.cpp @@ -478,6 +478,7 @@ static void window_ride_construction_draw_track_piece( static void window_ride_construction_update_enabled_track_pieces(); static bool _sub_6CA2DF(sint32 *trackType, sint32 *trackDirection, sint32 *rideIndex, sint32 *_liftHillAndAlternativeState, sint32 *x, sint32 *y, sint32 *z, sint32 *properties); static void sub_6CBCE2( + rct_drawpixelinfo * dpi, sint32 rideIndex, sint32 trackType, sint32 trackDirection, sint32 edx, sint32 originX, sint32 originY, sint32 originZ ); @@ -2315,12 +2316,11 @@ static void window_ride_construction_draw_track_piece( } dpi->x += x - width / 2; dpi->y += y - height / 2 - 16; - gPaintSession.Unk140E9A8 = dpi; uint32 d = unknown << 16; d |= rideIndex; d |= trackType << 8; - sub_6CBCE2(rideIndex, trackType, trackDirection, d, 4096, 4096, 1024); + sub_6CBCE2(dpi, rideIndex, trackType, trackDirection, d, 4096, 4096, 1024); } static rct_map_element _tempTrackMapElement; @@ -2335,6 +2335,7 @@ static rct_map_element *_backupMapElementArrays[5]; * dh: trackType */ static void sub_6CBCE2( + rct_drawpixelinfo * dpi, sint32 rideIndex, sint32 trackType, sint32 trackDirection, sint32 edx, sint32 originX, sint32 originY, sint32 originZ ) { @@ -2343,12 +2344,11 @@ static void sub_6CBCE2( sint32 preserve_current_viewport_flags; sint32 offsetX, offsetY; + paint_session * session = paint_session_alloc(dpi); preserve_current_viewport_flags = gCurrentViewportFlags; gCurrentViewportFlags = 0; trackDirection &= 3; - paint_session_init(&gPaintSession, gPaintSession.Unk140E9A8); - ride = get_ride(rideIndex); sint16 preserveMapSizeUnits = gMapSizeUnits; @@ -2450,8 +2450,9 @@ static void sub_6CBCE2( gMapSize = preserveMapSize; gMapSizeMaxXY = preserveMapSizeMaxXY; - paint_struct ps = paint_session_arrange(&gPaintSession); - paint_draw_structs(gPaintSession.Unk140E9A8, &ps, gCurrentViewportFlags); + paint_struct ps = paint_session_arrange(session); + paint_draw_structs(dpi, &ps, gCurrentViewportFlags); + paint_session_free(session); gCurrentViewportFlags = preserve_current_viewport_flags; }