diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index 43f820d6b0..e3d1e3137c 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -63,19 +63,14 @@ void DrawHillyLandTile(const TileInfo *ti) void DrawClearLandFence(const TileInfo *ti) { - byte z = ti->z; - - if (ti->tileh & SLOPE_S) { - z += TILE_HEIGHT; - if (ti->tileh == SLOPE_STEEP_S) z += TILE_HEIGHT; - } + int z = GetSlopeZInCorner(ti->tileh, CORNER_S); if (GetFenceSW(ti->tile) != 0) { - DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSW(ti->tile) - 1] + _fence_mod_by_tileh_sw[ti->tileh], PAL_NONE, ti->x, ti->y, z); + DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSW(ti->tile) - 1] + _fence_mod_by_tileh_sw[ti->tileh], PAL_NONE, 0, 0, z); } if (GetFenceSE(ti->tile) != 0) { - DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSE(ti->tile) - 1] + _fence_mod_by_tileh_se[ti->tileh], PAL_NONE, ti->x, ti->y, z); + DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSE(ti->tile) - 1] + _fence_mod_by_tileh_se[ti->tileh], PAL_NONE, 0, 0, z); } } diff --git a/src/dummy_land.cpp b/src/dummy_land.cpp index 305be368c6..0490fc2931 100644 --- a/src/dummy_land.cpp +++ b/src/dummy_land.cpp @@ -19,7 +19,7 @@ static void DrawTile_Dummy(TileInfo *ti) { - DrawGroundSpriteAt(SPR_SHADOW_CELL, PAL_NONE, ti->x, ti->y, ti->z); + DrawGroundSprite(SPR_SHADOW_CELL, PAL_NONE); } diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 4ef98fc5ea..5a5e96257b 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1126,7 +1126,7 @@ static void DrawRoadBits(TileInfo *ti) if (road != ROAD_NONE) { DisallowedRoadDirections drd = GetDisallowedRoadDirections(ti->tile); if (drd != DRD_NONE) { - DrawRoadDetail(SPR_ONEWAY_BASE + drd - 1 + ((road == ROAD_X) ? 0 : 3), ti, 8, 8, 0); + DrawGroundSpriteAt(SPR_ONEWAY_BASE + drd - 1 + ((road == ROAD_X) ? 0 : 3), PAL_NONE, 8, 8, GetPartialZ(8, 8, ti->tileh)); } } diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 42e18201b7..0b199bb4e8 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1184,7 +1184,7 @@ void DrawBridgeMiddle(const TileInfo *ti) pal = PALETTE_TO_TRANSPARENT; } - DrawGroundSpriteAt(image, pal, x, y, z); + DrawGroundSpriteAt(image, pal, x - ti->x, y - ti->y, z - ti->z); } } else if (_settings_client.gui.bridge_pillars) { /* draw pillars below for high bridges */ diff --git a/src/viewport.cpp b/src/viewport.cpp index 2e7753b445..7b417f942e 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -467,7 +467,7 @@ void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte } /** - * Draws a ground sprite at a specific world-coordinate. + * Shedules a tile sprite for drawing. * * @param image the image to draw. * @param pal the provided palette. @@ -477,9 +477,8 @@ void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte * @param sub Only draw a part of the sprite. * @param extra_offs_x Pixel X offset for the sprite position. * @param extra_offs_y Pixel Y offset for the sprite position. - * */ -void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub, int extra_offs_x, int extra_offs_y) +static void AddTileSpriteToDraw(SpriteID image, SpriteID pal, int32 x, int32 y, int z, const SubSprite *sub = NULL, int extra_offs_x = 0, int extra_offs_y = 0) { assert((image & SPRITE_MASK) < MAX_SPRITES); @@ -520,6 +519,32 @@ static void AddChildSpriteToFoundation(SpriteID image, SpriteID pal, const SubSp _vd.last_child = old_child; } +/** + * Draws a ground sprite at a specific world-coordinate relative to the current tile. + * If the current tile is drawn on top of a foundation the sprite is added as child sprite to the "foundation"-ParentSprite. + * + * @param image the image to draw. + * @param pal the provided palette. + * @param x position x (world coordinates) of the sprite relative to current tile. + * @param y position y (world coordinates) of the sprite relative to current tile. + * @param z position z (world coordinates) of the sprite relative to current tile. + * @param sub Only draw a part of the sprite. + * @param extra_offs_x Pixel X offset for the sprite position. + * @param extra_offs_y Pixel Y offset for the sprite position. + */ +void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, int z, const SubSprite *sub, int extra_offs_x, int extra_offs_y) +{ + /* Switch to first foundation part, if no foundation was drawn */ + if (_vd.foundation_part == FOUNDATION_PART_NONE) _vd.foundation_part = FOUNDATION_PART_NORMAL; + + if (_vd.foundation[_vd.foundation_part] != -1) { + Point pt = RemapCoords(x, y, z); + AddChildSpriteToFoundation(image, pal, sub, _vd.foundation_part, pt.x + extra_offs_x, pt.y + extra_offs_y); + } else { + AddTileSpriteToDraw(image, pal, _cur_ti->x + x, _cur_ti->y + y, _cur_ti->z + z, sub, extra_offs_x, extra_offs_y); + } +} + /** * Draws a ground sprite for the current tile. * If the current tile is drawn on top of a foundation the sprite is added as child sprite to the "foundation"-ParentSprite. @@ -532,17 +557,9 @@ static void AddChildSpriteToFoundation(SpriteID image, SpriteID pal, const SubSp */ void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y) { - /* Switch to first foundation part, if no foundation was drawn */ - if (_vd.foundation_part == FOUNDATION_PART_NONE) _vd.foundation_part = FOUNDATION_PART_NORMAL; - - if (_vd.foundation[_vd.foundation_part] != -1) { - AddChildSpriteToFoundation(image, pal, sub, _vd.foundation_part, extra_offs_x, extra_offs_y); - } else { - DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z, sub, extra_offs_x, extra_offs_y); - } + DrawGroundSpriteAt(image, pal, 0, 0, 0, sub, extra_offs_x, extra_offs_y); } - /** * Called when a foundation has been drawn for the current tile. * Successive ground sprites for the current tile will be drawn as child sprites of the "foundation"-ParentSprite, not as TileSprites. @@ -805,7 +822,7 @@ static void DrawSelectionSprite(SpriteID image, SpriteID pal, const TileInfo *ti /* FIXME: This is not totally valid for some autorail highlights, that extent over the edges of the tile. */ if (_vd.foundation[foundation_part] == -1) { /* draw on real ground */ - DrawGroundSpriteAt(image, pal, ti->x, ti->y, ti->z + z_offset); + AddTileSpriteToDraw(image, pal, ti->x, ti->y, ti->z + z_offset); } else { /* draw on top of foundation */ AddChildSpriteToFoundation(image, pal, NULL, foundation_part, 0, -z_offset); @@ -1024,7 +1041,7 @@ static void ViewportAddLandscape() if (x_cur == ((int)MapMaxX() - 1) * TILE_SIZE || y_cur == ((int)MapMaxY() - 1) * TILE_SIZE) { uint maxh = max(TileHeight(tile), 1); for (uint h = 0; h < maxh; h++) { - DrawGroundSpriteAt(SPR_SHADOW_CELL, PAL_NONE, ti.x, ti.y, h * TILE_HEIGHT); + AddTileSpriteToDraw(SPR_SHADOW_CELL, PAL_NONE, ti.x, ti.y, h * TILE_HEIGHT); } } diff --git a/src/viewport_func.h b/src/viewport_func.h index f749e80ff9..e025f1c8a2 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -46,7 +46,7 @@ static inline void MaxZoomInOut(int how, Window *w) void OffsetGroundSprite(int x, int y); void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub = NULL, int extra_offs_x = 0, int extra_offs_y = 0); -void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub = NULL, int extra_offs_x = 0, int extra_offs_y = 0); +void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, int z, const SubSprite *sub = NULL, int extra_offs_x = 0, int extra_offs_y = 0); void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, int dz, int z, bool transparent = false, int bb_offset_x = 0, int bb_offset_y = 0, int bb_offset_z = 0, const SubSprite *sub = NULL); void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool transparent = false, const SubSprite *sub = NULL); void ViewportAddString(const DrawPixelInfo *dpi, ZoomLevel small_from, const ViewportSign *sign, StringID string_normal, StringID string_small, StringID string_small_shadow, uint64 params_1, uint64 params_2 = 0, Colours colour = INVALID_COLOUR);