
Extend bb sprite south for comparisons, but only for vehicles underneath This is to avoid creating sprite sorting problems for vehicles on top of the bridge Adjust ParentSpriteToDraw struct
185 lines
8.5 KiB
C++
185 lines
8.5 KiB
C++
/*
|
|
* This file is part of OpenTTD.
|
|
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/** @file viewport_func.h Functions related to (drawing on) viewports. */
|
|
|
|
#ifndef VIEWPORT_FUNC_H
|
|
#define VIEWPORT_FUNC_H
|
|
|
|
#include "gfx_type.h"
|
|
#include "viewport_type.h"
|
|
#include "window_type.h"
|
|
#include "tile_map.h"
|
|
#include "station_type.h"
|
|
#include "vehicle_base.h"
|
|
|
|
struct TileInfo;
|
|
struct ViewportDrawerDynamic;
|
|
|
|
static const int TILE_HEIGHT_STEP = 50; ///< One Z unit tile height difference is displayed as 50m.
|
|
|
|
void SetSelectionRed(bool);
|
|
void SetSelectionPalette(PaletteID);
|
|
|
|
void ClearViewportCache(Viewport *vp);
|
|
void ClearViewportLandPixelCache(Viewport *vp);
|
|
void ClearViewportCaches();
|
|
void DeleteWindowViewport(Window *w);
|
|
void InitializeWindowViewport(Window *w, int x, int y, int width, int height, uint32_t follow_flags, ZoomLevel zoom);
|
|
Viewport *IsPtInWindowViewport(const Window *w, int x, int y);
|
|
Point TranslateXYToTileCoord(const Viewport *vp, int x, int y, bool clamp_to_map = true);
|
|
Point GetTileBelowCursor();
|
|
void UpdateNextViewportPosition(Window *w);
|
|
void ApplyNextViewportPosition(Window *w);
|
|
void UpdateViewportSizeZoom(Viewport *vp);
|
|
|
|
void MarkViewportDirty(Viewport * const vp, int left, int top, int right, int bottom, ViewportMarkDirtyFlags flags);
|
|
void MarkAllViewportsDirty(int left, int top, int right, int bottom, ViewportMarkDirtyFlags flags = VMDF_NONE);
|
|
void MarkAllViewportMapsDirty(int left, int top, int right, int bottom);
|
|
void MarkAllViewportMapLandscapesDirty();
|
|
void MarkWholeNonMapViewportsDirty();
|
|
void MarkAllViewportOverlayStationLinksDirty(const Station *st);
|
|
void MarkViewportLineDirty(Viewport * const vp, const Point from_pt, const Point to_pt, const int block_radius, ViewportMarkDirtyFlags flags);
|
|
void MarkTileLineDirty(const TileIndex from_tile, const TileIndex to_tile, ViewportMarkDirtyFlags flags);
|
|
void MarkDirtyFocusedRoutePaths(const Vehicle *veh);
|
|
void CheckMarkDirtyViewportRoutePaths(const Vehicle *veh);
|
|
void CheckMarkDirtyViewportRoutePaths();
|
|
void AddFixedViewportRoutePath(VehicleID veh);
|
|
void RemoveFixedViewportRoutePath(VehicleID veh);
|
|
void ChangeFixedViewportRoutePath(VehicleID from, VehicleID to);
|
|
|
|
bool DoZoomInOutWindow(ZoomStateChange how, Window *w);
|
|
void ZoomInOrOutToCursorWindow(bool in, Window * w);
|
|
void ConstrainAllViewportsZoom();
|
|
Point GetTileZoomCenterWindow(bool in, Window * w);
|
|
void FixTitleGameZoom(int zoom_adjust = 0);
|
|
void HandleZoomMessage(Window *w, const Viewport *vp, WidgetID widget_zoom_in, WidgetID widget_zoom_out);
|
|
|
|
/**
|
|
* Zoom a viewport as far as possible in the given direction.
|
|
* @param how Zooming direction.
|
|
* @param w Window owning the viewport.
|
|
* @pre \a how should not be #ZOOM_NONE.
|
|
*/
|
|
inline void MaxZoomInOut(ZoomStateChange how, Window *w)
|
|
{
|
|
while (DoZoomInOutWindow(how, w)) {};
|
|
}
|
|
|
|
void OffsetGroundSprite(int x, int y);
|
|
|
|
enum ViewportSortableSpriteSpecialFlags : uint8_t {
|
|
VSSF_NONE = 0,
|
|
VSSSF_SORT_SPECIAL = 0x80, ///< When sorting sprites, if both sprites have this set, special sorting rules apply
|
|
VSSSF_SORT_SPECIAL_TYPE_MASK = 1, ///< Mask to use for getting the special type
|
|
VSSSF_SORT_DIAG_VEH = 0, ///< This is a vehicle moving diagonally with respect to the tile axes
|
|
VSSSF_SORT_SORT_BRIDGE_BB = 1, ///< This is a bridge BB helper sprite
|
|
};
|
|
DECLARE_ENUM_AS_BIT_SET(ViewportSortableSpriteSpecialFlags);
|
|
|
|
void DrawGroundSprite(SpriteID image, PaletteID pal, const SubSprite *sub = nullptr, int extra_offs_x = 0, int extra_offs_y = 0);
|
|
void DrawGroundSpriteAt(SpriteID image, PaletteID pal, int32_t x, int32_t y, int z, const SubSprite *sub = nullptr, int extra_offs_x = 0, int extra_offs_y = 0);
|
|
void AddSortableSpriteToDraw(SpriteID image, PaletteID 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 = nullptr, ViewportSortableSpriteSpecialFlags special_flags = VSSF_NONE);
|
|
void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool transparent = false, const SubSprite *sub = nullptr, bool scale = true, ChildScreenSpritePositionMode position_mode = ChildScreenSpritePositionMode::Relative);
|
|
void ViewportAddString(ViewportDrawerDynamic *vdd, const DrawPixelInfo *dpi, ZoomLevel small_from, const ViewportSign *sign, StringID string_normal, StringID string_small, StringID string_small_shadow, uint64_t params_1, uint64_t params_2 = 0, Colours colour = INVALID_COLOUR);
|
|
|
|
|
|
void StartSpriteCombine();
|
|
void EndSpriteCombine();
|
|
|
|
enum HandleViewportClickedResult {
|
|
HVCR_DENY,
|
|
HVCR_SCROLL_ONLY,
|
|
HVCR_ALLOW,
|
|
};
|
|
|
|
bool HandleViewportDoubleClicked(Window *w, int x, int y);
|
|
HandleViewportClickedResult HandleViewportClicked(const Viewport *vp, int x, int y, bool double_click);
|
|
void SetRedErrorSquare(TileIndex tile);
|
|
void SetTileSelectSize(int w, int h);
|
|
void SetTileSelectBigSize(int ox, int oy, int sx, int sy);
|
|
|
|
void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint8_t display_flags);
|
|
void ViewportDoDrawProcessAllPending();
|
|
|
|
bool ScrollWindowToTile(TileIndex tile, Window *w, bool instant = false);
|
|
bool ScrollWindowTo(int x, int y, int z, Window *w, bool instant = false);
|
|
|
|
void UpdateActiveScrollingViewport(Window *w);
|
|
|
|
void RebuildViewportOverlay(Window *w, bool incremental);
|
|
|
|
bool ScrollMainWindowToTile(TileIndex tile, bool instant = false);
|
|
bool ScrollMainWindowTo(int x, int y, int z = -1, bool instant = false);
|
|
|
|
void UpdateAllVirtCoords();
|
|
void ClearAllCachedNames();
|
|
|
|
extern Point _tile_fract_coords;
|
|
|
|
void MarkTileDirtyByTile(const TileIndex tile, ViewportMarkDirtyFlags flags, int bridge_level_offset, int tile_height_override);
|
|
|
|
/**
|
|
* Mark a tile given by its index dirty for repaint.
|
|
* @param tile The tile to mark dirty.
|
|
* @param flags To tell if an update is relevant or not (for example, animations in map mode are not).
|
|
* @param bridge_level_offset Height of bridge on tile to also mark dirty. (Height level relative to north corner.)
|
|
* @ingroup dirty
|
|
*/
|
|
inline void MarkTileDirtyByTile(TileIndex tile, ViewportMarkDirtyFlags flags = VMDF_NONE, int bridge_level_offset = 0)
|
|
{
|
|
MarkTileDirtyByTile(tile, flags, bridge_level_offset, TileHeight(tile));
|
|
}
|
|
|
|
void MarkTileGroundDirtyByTile(TileIndex tile, ViewportMarkDirtyFlags flags);
|
|
|
|
void ChangeRenderMode(Viewport *vp, bool down);
|
|
|
|
Point GetViewportStationMiddle(const Viewport *vp, const Station *st);
|
|
|
|
void ShowTooltipForTile(Window *w, const TileIndex tile);
|
|
|
|
void ViewportMapStoreTunnel(const TileIndex tile, const TileIndex tile_south, const int tunnel_z, const bool insert_sorted);
|
|
void ViewportMapClearTunnelCache();
|
|
void ViewportMapInvalidateTunnelCacheByTile(const TileIndex tile, const Axis axis);
|
|
void ViewportMapBuildTunnelCache();
|
|
|
|
void DrawTileSelectionRect(const TileInfo *ti, PaletteID pal);
|
|
void DrawSelectionSprite(SpriteID image, PaletteID pal, const TileInfo *ti, int z_offset, FoundationPart foundation_part, int extra_offs_x = 0, int extra_offs_y = 0, const SubSprite *sub = nullptr);
|
|
|
|
struct Waypoint;
|
|
struct Town;
|
|
struct TraceRestrictProgram;
|
|
void SetViewportCatchmentStation(const Station *st, bool sel);
|
|
void SetViewportCatchmentWaypoint(const Waypoint *wp, bool sel);
|
|
void SetViewportCatchmentTown(const Town *t, bool sel);
|
|
void SetViewportCatchmentTraceRestrictProgram(const TraceRestrictProgram *prog, bool sel);
|
|
|
|
template<class T>
|
|
void SetViewportCatchmentSpecializedStation(const T *st, bool sel);
|
|
|
|
template<>
|
|
inline void SetViewportCatchmentSpecializedStation(const Station *st, bool sel)
|
|
{
|
|
SetViewportCatchmentStation(st, sel);
|
|
}
|
|
|
|
template<>
|
|
inline void SetViewportCatchmentSpecializedStation(const Waypoint *st, bool sel)
|
|
{
|
|
SetViewportCatchmentWaypoint(st, sel);
|
|
}
|
|
|
|
void MarkBridgeDirty(TileIndex begin, TileIndex end, DiagDirection direction, uint bridge_height, ViewportMarkDirtyFlags flags = VMDF_NONE);
|
|
void MarkBridgeDirty(TileIndex tile, ViewportMarkDirtyFlags flags = VMDF_NONE);
|
|
void MarkBridgeOrTunnelDirty(TileIndex tile, ViewportMarkDirtyFlags flags = VMDF_NONE);
|
|
void MarkBridgeOrTunnelDirtyOnReservationChange(TileIndex tile, ViewportMarkDirtyFlags flags = VMDF_NONE);
|
|
|
|
bool IsViewportMouseHoverActive();
|
|
|
|
#endif /* VIEWPORT_FUNC_H */
|