From 3410330bb2091ca908f34a61b084a5e8133b4bfa Mon Sep 17 00:00:00 2001 From: Jeroen D Stout Date: Wed, 11 Oct 2017 18:13:01 +0200 Subject: [PATCH] Add paint session memory for tracks and paths --- src/openrct2/paint/paint.h | 3 +- .../paint/tile_element/tile_element.c | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/openrct2/paint/paint.h b/src/openrct2/paint/paint.h index b83759c4a6..e0110149f7 100644 --- a/src/openrct2/paint/paint.h +++ b/src/openrct2/paint/paint.h @@ -170,7 +170,8 @@ typedef struct paint_session tunnel_entry RightTunnels[TUNNEL_MAX_COUNT]; uint8 RightTunnelCount; uint8 VerticalTunnelHeight; - rct_tile_element * SurfaceElement; + rct_tile_element * PathElementOnSameHeight; + rct_tile_element * TrackElementOnSameHeight; bool DidPassSurface; uint8 Unk141E9DB; uint16 Unk141E9DC; diff --git a/src/openrct2/paint/tile_element/tile_element.c b/src/openrct2/paint/tile_element/tile_element.c index 4f9d53f109..62aefb369d 100644 --- a/src/openrct2/paint/tile_element/tile_element.c +++ b/src/openrct2/paint/tile_element/tile_element.c @@ -234,6 +234,7 @@ static void sub_68B3FB(paint_session * session, sint32 x, sint32 y) session->SpritePosition.x = x; session->SpritePosition.y = y; session->DidPassSurface = false; + sint32 previousHeight = 0; do { // Only paint tile_elements below the clip height. if ((gCurrentViewportFlags & VIEWPORT_FLAG_PAINT_CLIP_TO_HEIGHT) && (tile_element->base_height > gClipHeight)) break; @@ -241,6 +242,41 @@ static void sub_68B3FB(paint_session * session, sint32 x, sint32 y) sint32 direction = tile_element_get_direction_with_offset(tile_element, rotation); sint32 height = tile_element->base_height * 8; + // If we are on a new height level, look through elements on the + // same height and store any types might be relevant to others + if (height != previousHeight) + { + previousHeight = height; + session->PathElementOnSameHeight = 0; + session->TrackElementOnSameHeight = 0; + rct_tile_element * tile_element_sub_iterator = tile_element; + while (!map_element_is_last_for_tile(tile_element_sub_iterator++)) + { + if (tile_element_sub_iterator->base_height != tile_element->base_height) + { + break; + } + switch (map_element_get_type(tile_element_sub_iterator)) + { + case TILE_ELEMENT_TYPE_PATH: + session->PathElementOnSameHeight = tile_element_sub_iterator; + break; + case TILE_ELEMENT_TYPE_TRACK: + session->TrackElementOnSameHeight = tile_element_sub_iterator; + break; + case TILE_ELEMENT_TYPE_CORRUPT: + // To preserve regular behaviour, make an element hidden by + // corruption also invisible to this method. + if (tile_element_is_last_for_tile(tile_element)) + { + break; + } + tile_element_sub_iterator++; + break; + } + } + } + LocationXY16 dword_9DE574 = session->MapPosition; session->CurrentlyDrawnItem = tile_element; // Setup the painting of for example: the underground, signs, rides, scenery, etc.