OpenTTD
Data Structures | Typedefs | Enumerations | Functions | Variables
viewport.cpp File Reference

Handling of all viewports. More...

#include "stdafx.h"
#include "landscape.h"
#include "viewport_func.h"
#include "station_base.h"
#include "waypoint_base.h"
#include "town.h"
#include "signs_base.h"
#include "signs_func.h"
#include "vehicle_base.h"
#include "vehicle_gui.h"
#include "blitter/factory.hpp"
#include "strings_func.h"
#include "zoom_func.h"
#include "vehicle_func.h"
#include "company_func.h"
#include "waypoint_func.h"
#include "window_func.h"
#include "tilehighlight_func.h"
#include "window_gui.h"
#include "linkgraph/linkgraph_gui.h"
#include "viewport_sprite_sorter.h"
#include "bridge_map.h"
#include <map>
#include "table/strings.h"
#include "table/string_colours.h"
#include "safeguards.h"
#include "table/autorail.h"
#include "table/animcursors.h"

Go to the source code of this file.

Data Structures

struct  StringSpriteToDraw
 
struct  TileSpriteToDraw
 
struct  ChildScreenSpriteToDraw
 
struct  ViewportDrawer
 Data structure storing rendering information. More...
 
struct  ViewportSSCSS
 Helper class for getting the best sprite sorter. More...
 

Typedefs

typedef SmallVector< TileSpriteToDraw, 64 > TileSpriteToDrawVector
 
typedef SmallVector< StringSpriteToDraw, 4 > StringSpriteToDrawVector
 
typedef SmallVector< ParentSpriteToDraw, 64 > ParentSpriteToDrawVector
 
typedef SmallVector< ChildScreenSpriteToDraw, 16 > ChildScreenSpriteToDrawVector
 
typedef bool ContinueMapEdgeSearch(int iter, int iter_limit, int sy, int sy_limit)
 Continue criteria for the SearchMapEdge function. More...
 

Enumerations

enum  FoundationPart { FOUNDATION_PART_NONE = 0xFF, FOUNDATION_PART_NORMAL = 0, FOUNDATION_PART_HALFTILE = 1, FOUNDATION_PART_END }
 Enumeration of multi-part foundations. More...
 
enum  SpriteCombineMode { SPRITE_COMBINE_NONE, SPRITE_COMBINE_PENDING, SPRITE_COMBINE_ACTIVE }
 Mode of "sprite combining". More...
 

Functions

static void MarkViewportDirty (const ViewPort *vp, int left, int top, int right, int bottom)
 Marks a viewport as dirty for repaint if it displays (a part of) the area the needs to be repainted. More...
 
static Point MapXYZToViewport (const ViewPort *vp, int x, int y, int z)
 
void DeleteWindowViewport (Window *w)
 
void InitializeWindowViewport (Window *w, int x, int y, int width, int height, uint32 follow_flags, ZoomLevel zoom)
 Initialize viewport of the window for use. More...
 
static void DoSetViewportPosition (const Window *w, int left, int top, int width, int height)
 
static void SetViewportPosition (Window *w, int x, int y)
 
ViewPortIsPtInWindowViewport (const Window *w, int x, int y)
 Is a xy position inside the viewport of the window? More...
 
Point TranslateXYToTileCoord (const ViewPort *vp, int x, int y, bool clamp_to_map)
 Translate screen coordinate in a viewport to a tile coordinate. More...
 
static Point GetTileFromScreenXY (int x, int y, int zoom_x, int zoom_y)
 
Point GetTileBelowCursor ()
 
Point GetTileZoomCenterWindow (bool in, Window *w)
 
void HandleZoomMessage (Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out)
 Update the status of the zoom-buttons according to the zoom-level of the viewport. More...
 
static void AddTileSpriteToDraw (SpriteID image, PaletteID pal, int32 x, int32 y, int z, const SubSprite *sub=NULL, int extra_offs_x=0, int extra_offs_y=0)
 Schedules a tile sprite for drawing. More...
 
static void AddChildSpriteToFoundation (SpriteID image, PaletteID pal, const SubSprite *sub, FoundationPart foundation_part, int extra_offs_x, int extra_offs_y)
 Adds a child sprite to the active foundation. More...
 
void DrawGroundSpriteAt (SpriteID image, PaletteID pal, int32 x, int32 y, int z, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
 Draws a ground sprite at a specific world-coordinate relative to the current tile. More...
 
void DrawGroundSprite (SpriteID image, PaletteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
 Draws a ground sprite for the current tile. More...
 
void OffsetGroundSprite (int x, int y)
 Called when a foundation has been drawn for the current tile. More...
 
static void AddCombinedSprite (SpriteID image, PaletteID pal, int x, int y, int z, const SubSprite *sub)
 Adds a child sprite to a parent sprite. More...
 
void AddSortableSpriteToDraw (SpriteID image, PaletteID pal, int x, int y, int w, int h, int dz, int z, bool transparent, int bb_offset_x, int bb_offset_y, int bb_offset_z, const SubSprite *sub)
 Draw a (transparent) sprite at given coordinates with a given bounding box. More...
 
void StartSpriteCombine ()
 Starts a block of sprites, which are "combined" into a single bounding box. More...
 
void EndSpriteCombine ()
 Terminates a block of sprites started by StartSpriteCombine. More...
 
static bool IsInRangeInclusive (int begin, int end, int check)
 Check if the parameter "check" is inside the interval between begin and end, including both begin and end. More...
 
bool IsInsideRotatedRectangle (int x, int y)
 Checks whether a point is inside the selected a diagonal rectangle given by _thd.size and _thd.pos. More...
 
void AddChildSpriteScreen (SpriteID image, PaletteID pal, int x, int y, bool transparent, const SubSprite *sub, bool scale)
 Add a child sprite to a parent sprite. More...
 
static void AddStringToDraw (int x, int y, StringID string, uint64 params_1, uint64 params_2, Colours colour, uint16 width)
 
static void DrawSelectionSprite (SpriteID image, PaletteID pal, const TileInfo *ti, int z_offset, FoundationPart foundation_part)
 Draws sprites between ground sprite and everything above. More...
 
static void DrawTileSelectionRect (const TileInfo *ti, PaletteID pal)
 Draws a selection rectangle on a tile. More...
 
static bool IsPartOfAutoLine (int px, int py)
 
static void DrawAutorailSelection (const TileInfo *ti, uint autorail_type)
 Draws autorail highlights. More...
 
static void DrawTileSelection (const TileInfo *ti)
 Checks if the specified tile is selected and if so draws selection using correct selectionstyle. More...
 
static int GetViewportY (Point tile)
 Returns the y coordinate in the viewport coordinate system where the given tile is painted. More...
 
static void ViewportAddLandscape ()
 Add the landscape to the viewport, i.e. More...
 
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, Colours colour)
 Add a string to draw in the viewport. More...
 
static void ViewportAddTownNames (DrawPixelInfo *dpi)
 
static void ViewportAddStationNames (DrawPixelInfo *dpi)
 
static void ViewportAddSigns (DrawPixelInfo *dpi)
 
static void ViewportDrawTileSprites (const TileSpriteToDrawVector *tstdv)
 
static bool ViewportSortParentSpritesChecker ()
 This fallback sprite checker always exists. More...
 
static void ViewportSortParentSprites (ParentSpriteToSortVector *psdv)
 Sort parent sprites pointer array.
 
static void ViewportDrawParentSprites (const ParentSpriteToSortVector *psd, const ChildScreenSpriteToDrawVector *csstdv)
 
static void ViewportDrawBoundingBoxes (const ParentSpriteToSortVector *psd)
 Draws the bounding boxes of all ParentSprites. More...
 
static void ViewportDrawDirtyBlocks ()
 Draw/colour the blocks that have been redrawn.
 
static void ViewportDrawStrings (ZoomLevel zoom, const StringSpriteToDrawVector *sstdv)
 
void ViewportDoDraw (const ViewPort *vp, int left, int top, int right, int bottom)
 
static void ViewportDrawChk (const ViewPort *vp, int left, int top, int right, int bottom)
 Make sure we don't draw a too big area at a time. More...
 
static void ViewportDraw (const ViewPort *vp, int left, int top, int right, int bottom)
 
static bool ContinueLowerMapEdgeSearch (int iter, int iter_limit, int sy, int sy_limit)
 Continue criteria for searching a no-longer-visible tile in negative direction, starting at some tile. More...
 
static bool ContinueUpperMapEdgeSearch (int iter, int iter_limit, int sy, int sy_limit)
 Continue criteria for searching a no-longer-visible tile in positive direction, starting at some tile. More...
 
static int SearchMapEdge (Point &curr_tile, int &iter, int iter_limit, int offset, int sy_limit, ContinueMapEdgeSearch continue_criteria)
 Searches, starting at the given tile, by applying the given offset to iter, for a no longer visible tile. More...
 
static int ClampXYToMap (Point &curr_tile, int &iter, int iter_limit, int start, int &other_ref, int other_value, int vp_value, int other_limit, int vp_top, int vp_bottom)
 Determine the clamping of either the X or Y coordinate to the map. More...
 
static void ClampViewportToMap (const ViewPort *vp, int &x, int &y)
 
void UpdateViewportPosition (Window *w)
 Update the viewport position being displayed. More...
 
void MarkAllViewportsDirty (int left, int top, int right, int bottom)
 Mark all viewports that display an area as dirty (in need of repaint). More...
 
void ConstrainAllViewportsZoom ()
 
void MarkTileDirtyByTile (TileIndex tile, int bridge_level_offset)
 Mark a tile given by its index dirty for repaint. More...
 
void MarkTileDirtyByTileOutsideMap (int x, int y)
 Mark a (virtual) tile outside the map dirty for repaint. More...
 
static void SetSelectionTilesDirty ()
 Marks the selected tiles as dirty. More...
 
void SetSelectionRed (bool b)
 
static bool CheckClickOnViewportSign (const ViewPort *vp, int x, int y, const ViewportSign *sign)
 Test whether a sign is below the mouse. More...
 
static bool CheckClickOnTown (const ViewPort *vp, int x, int y)
 
static bool CheckClickOnStation (const ViewPort *vp, int x, int y)
 
static bool CheckClickOnSign (const ViewPort *vp, int x, int y)
 
static bool CheckClickOnLandscape (const ViewPort *vp, int x, int y)
 
static void PlaceObject ()
 
bool HandleViewportClicked (const ViewPort *vp, int x, int y)
 
void RebuildViewportOverlay (Window *w)
 
bool ScrollWindowTo (int x, int y, int z, Window *w, bool instant)
 Scrolls the viewport in a window to a given location. More...
 
bool ScrollWindowToTile (TileIndex tile, Window *w, bool instant)
 Scrolls the viewport in a window to a given location. More...
 
bool ScrollMainWindowToTile (TileIndex tile, bool instant)
 Scrolls the viewport of the main window to a given location. More...
 
void SetRedErrorSquare (TileIndex tile)
 Set a tile to display a red error square. More...
 
void SetTileSelectSize (int w, int h)
 Highlight w by h tiles at the cursor. More...
 
void SetTileSelectBigSize (int ox, int oy, int sx, int sy)
 
static HighLightStyle GetAutorailHT (int x, int y)
 returns the best autorail highlight type from map coordinates
 
void UpdateTileSelection ()
 Updates tile highlighting for all cases. More...
 
static void ShowMeasurementTooltips (StringID str, uint paramcount, const uint64 params[], TooltipCloseCondition close_cond=TCC_LEFT_CLICK)
 Displays the measurement tooltips when selecting multiple tiles. More...
 
void VpStartPlaceSizing (TileIndex tile, ViewportPlaceMethod method, ViewportDragDropSelectionProcess process)
 highlighting tiles while only going over them with the mouse
 
void VpSetPlaceSizingLimit (int limit)
 
void VpSetPresizeRange (TileIndex from, TileIndex to)
 Highlights all tiles between a set of two tiles. More...
 
static void VpStartPreSizing ()
 
static HighLightStyle Check2x1AutoRail (int mode)
 returns information about the 2x1 piece to be build. More...
 
static bool SwapDirection (HighLightStyle style, TileIndex start_tile, TileIndex end_tile)
 Check if the direction of start and end tile should be swapped based on the dragging-style. More...
 
static int CalcHeightdiff (HighLightStyle style, uint distance, TileIndex start_tile, TileIndex end_tile)
 Calculates height difference between one tile and another. More...
 
static void CheckUnderflow (int &test, int &other, int mult)
 Check for underflowing the map. More...
 
static void CheckOverflow (int &test, int &other, int max, int mult)
 Check for overflowing the map. More...
 
static void CalcRaildirsDrawstyle (int x, int y, int method)
 while dragging
 
void VpSelectTilesWithMethod (int x, int y, ViewportPlaceMethod method)
 Selects tiles while dragging. More...
 
EventState VpHandlePlaceSizingDrag ()
 Handle the mouse while dragging for placement/resizing. More...
 
void SetObjectToPlaceWnd (CursorID icon, PaletteID pal, HighLightStyle mode, Window *w)
 Change the cursor and mouse click/drag handling to a mode for performing special operations like tile area selection, object placement, etc. More...
 
void SetObjectToPlace (CursorID icon, PaletteID pal, HighLightStyle mode, WindowClass window_class, WindowNumber window_num)
 Change the cursor and mouse click/drag handling to a mode for performing special operations like tile area selection, object placement, etc. More...
 
void ResetObjectToPlace ()
 Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows). More...
 
Point GetViewportStationMiddle (const ViewPort *vp, const Station *st)
 
void InitializeSpriteSorter ()
 Choose the "best" sprite sorter and set _vp_sprite_sorter. More...
 

Variables

Point _tile_fract_coords
 
static const int MAX_TILE_EXTENT_LEFT = ZOOM_LVL_BASE * TILE_PIXELS
 Maximum left extent of tile relative to north corner.
 
static const int MAX_TILE_EXTENT_RIGHT = ZOOM_LVL_BASE * TILE_PIXELS
 Maximum right extent of tile relative to north corner.
 
static const int MAX_TILE_EXTENT_TOP = ZOOM_LVL_BASE * MAX_BUILDING_PIXELS
 Maximum top extent of tile relative to north corner (not considering bridges).
 
static const int MAX_TILE_EXTENT_BOTTOM = ZOOM_LVL_BASE * (TILE_PIXELS + 2 * TILE_HEIGHT)
 Maximum bottom extent of tile relative to north corner (worst case: SLOPE_STEEP_N).
 
static ViewportDrawer _vd
 
TileHighlightData _thd
 
static TileInfo_cur_ti
 
bool _draw_bounding_boxes = false
 
bool _draw_dirty_blocks = false
 
uint _dirty_block_colour = 0
 
static VpSpriteSorter _vp_sprite_sorter = NULL
 
static Point _vp_move_offs
 
static const HighLightStyle _autorail_type [6][2]
 
static const StringID measure_strings_length [] = {STR_NULL, STR_MEASURE_LENGTH, STR_MEASURE_LENGTH_HEIGHTDIFF}
 
static ViewportSSCSS _vp_sprite_sorters []
 List of sorters ordered from best to worst. More...
 

Detailed Description

Handling of all viewports.

* The in-game coordinate system looks like this *
*                                               *
*                    ^ Z                        *
*                    |                          *
*                    |                          *
*                    |                          *
*                    |                          *
*                 /     \                       *
*              /           \                    *
*           /                 \                 *
*        /                       \              *
*   X <                             > Y         *
* 

Definition in file viewport.cpp.

Typedef Documentation

◆ ContinueMapEdgeSearch

typedef bool ContinueMapEdgeSearch(int iter, int iter_limit, int sy, int sy_limit)

Continue criteria for the SearchMapEdge function.

Parameters
iterValue to check.
iter_limitMaximum value for the iter
syScreen y coordinate calculated for the tile at hand
sy_limitLimit to the screen y coordinate
Returns
True when we should continue searching.

Definition at line 1673 of file viewport.cpp.

Enumeration Type Documentation

◆ FoundationPart

Enumeration of multi-part foundations.

Enumerator
FOUNDATION_PART_NONE 

Neither foundation nor groundsprite drawn yet.

FOUNDATION_PART_NORMAL 

First part (normal foundation or no foundation)

FOUNDATION_PART_HALFTILE 

Second part (halftile foundation)

Definition at line 130 of file viewport.cpp.

◆ SpriteCombineMode

Mode of "sprite combining".

See also
StartSpriteCombine
Enumerator
SPRITE_COMBINE_NONE 

Every AddSortableSpriteToDraw start its own bounding box.

SPRITE_COMBINE_PENDING 

Sprite combining will start with the next unclipped sprite.

SPRITE_COMBINE_ACTIVE 

Sprite combining is active. AddSortableSpriteToDraw outputs child sprites.

Definition at line 141 of file viewport.cpp.

Function Documentation

◆ AddChildSpriteScreen()

void AddChildSpriteScreen ( SpriteID  image,
PaletteID  pal,
int  x,
int  y,
bool  transparent,
const SubSprite sub,
bool  scale 
)

Add a child sprite to a parent sprite.

Parameters
imagethe image to draw.
palthe provided palette.
xsprite x-offset (screen coordinates) relative to parent sprite.
ysprite y-offset (screen coordinates) relative to parent sprite.
transparentif true, switch the palette between the provided palette and the transparent palette,
subOnly draw a part of the sprite.

Definition at line 843 of file viewport.cpp.

◆ AddChildSpriteToFoundation()

static void AddChildSpriteToFoundation ( SpriteID  image,
PaletteID  pal,
const SubSprite sub,
FoundationPart  foundation_part,
int  extra_offs_x,
int  extra_offs_y 
)
static

Adds a child sprite to the active foundation.

The pixel offset of the sprite relative to the ParentSprite is the sum of the offset passed to OffsetGroundSprite() and extra_offs_?.

Parameters
imagethe image to draw.
palthe provided palette.
subOnly draw a part of the sprite.
foundation_partFoundation part.
extra_offs_xPixel X offset for the sprite position.
extra_offs_yPixel Y offset for the sprite position.

Definition at line 552 of file viewport.cpp.

Referenced by DrawGroundSpriteAt(), and DrawSelectionSprite().

◆ AddCombinedSprite()

static void AddCombinedSprite ( SpriteID  image,
PaletteID  pal,
int  x,
int  y,
int  z,
const SubSprite sub 
)
static

Adds a child sprite to a parent sprite.

In contrast to "AddChildSpriteScreen()" the sprite position is in world coordinates

Parameters
imagethe image to draw.
palthe provided palette.
xposition x of the sprite.
yposition y of the sprite.
zposition z of the sprite.
subOnly draw a part of the sprite.

Definition at line 648 of file viewport.cpp.

References RemapCoords().

◆ AddSortableSpriteToDraw()

void AddSortableSpriteToDraw ( SpriteID  image,
PaletteID  pal,
int  x,
int  y,
int  w,
int  h,
int  dz,
int  z,
bool  transparent,
int  bb_offset_x,
int  bb_offset_y,
int  bb_offset_z,
const SubSprite sub 
)

Draw a (transparent) sprite at given coordinates with a given bounding box.

The bounding box extends from (x + bb_offset_x, y + bb_offset_y, z + bb_offset_z) to (x + w - 1, y + h - 1, z + dz - 1), both corners included. Bounding boxes with bb_offset_x == w or bb_offset_y == h or bb_offset_z == dz are allowed and produce thin slices.

Note
Bounding boxes are normally specified with bb_offset_x = bb_offset_y = bb_offset_z = 0. The extent of the bounding box in negative direction is defined by the sprite offset in the grf file. However if modifying the sprite offsets is not suitable (e.g. when using existing graphics), the bounding box can be tuned by bb_offset.
Precondition
w >= bb_offset_x, h >= bb_offset_y, dz >= bb_offset_z. Else w, h or dz are ignored.
Parameters
imagethe image to combine and draw,
palthe provided palette,
xposition X (world) of the sprite,
yposition Y (world) of the sprite,
wbounding box extent towards positive X (world),
hbounding box extent towards positive Y (world),
dzbounding box extent towards positive Z (world),
zposition Z (world) of the sprite,
transparentif true, switch the palette between the provided palette and the transparent palette,
bb_offset_xbounding box extent towards negative X (world),
bb_offset_ybounding box extent towards negative Y (world),
bb_offset_zbounding box extent towards negative Z (world)
subOnly draw a part of the sprite.

Definition at line 688 of file viewport.cpp.

Referenced by DrawCommonTileSeq().

◆ AddTileSpriteToDraw()

static void AddTileSpriteToDraw ( SpriteID  image,
PaletteID  pal,
int32  x,
int32  y,
int  z,
const SubSprite sub = NULL,
int  extra_offs_x = 0,
int  extra_offs_y = 0 
)
static

Schedules a tile sprite for drawing.

Parameters
imagethe image to draw.
palthe provided palette.
xposition x (world coordinates) of the sprite.
yposition y (world coordinates) of the sprite.
zposition z (world coordinates) of the sprite.
subOnly draw a part of the sprite.
extra_offs_xPixel X offset for the sprite position.
extra_offs_yPixel Y offset for the sprite position.

Definition at line 527 of file viewport.cpp.

Referenced by DrawSelectionSprite().

◆ CalcHeightdiff()

static int CalcHeightdiff ( HighLightStyle  style,
uint  distance,
TileIndex  start_tile,
TileIndex  end_tile 
)
static

Calculates height difference between one tile and another.

Multiplies the result to suit the standard given by TILE_HEIGHT_STEP.

To correctly get the height difference we need the direction we are dragging in, as well as with what kind of tool we are dragging. For example a horizontal autorail tool that starts in bottom and ends at the top of a tile will need the maximum of SW, S and SE, N corners respectively. This is handled by the lookup table below See _tileoffs_by_dir in map.cpp for the direction enums if you can't figure out the values yourself.

Parameters
styleHighlighting style of the drag. This includes direction and style (autorail, rect, etc.)
distanceNumber of tiles dragged, important for horizontal/vertical drags, ignored for others.
start_tileStart tile of the drag operation.
end_tileEnd tile of the drag operation.
Returns
Height difference between two tiles. The tile measurement tool utilizes this value in its tooltip.

Definition at line 2616 of file viewport.cpp.

References HT_DRAG_MASK, HT_RECT, Swap(), and SwapDirection().

Referenced by VpSelectTilesWithMethod().

◆ Check2x1AutoRail()

static HighLightStyle Check2x1AutoRail ( int  mode)
static

returns information about the 2x1 piece to be build.

The lower bits (0-3) are the track type.

Definition at line 2538 of file viewport.cpp.

References TileHighlightData::selend, and TILE_UNIT_MASK.

◆ CheckClickOnViewportSign()

static bool CheckClickOnViewportSign ( const ViewPort vp,
int  x,
int  y,
const ViewportSign sign 
)
static

Test whether a sign is below the mouse.

Parameters
vpthe clicked viewport
xX position of click
yY position of click
signthe sign to check
Returns
true if the sign was hit

Definition at line 2062 of file viewport.cpp.

References ViewportSign::center, FONT_HEIGHT_NORMAL, FONT_HEIGHT_SMALL, ViewPort::left, ScaleByZoom(), ViewPort::top, ViewportSign::top, ViewPort::virtual_left, ViewPort::virtual_top, VPSM_BOTTOM, VPSM_TOP, ViewportSign::width_normal, ViewportSign::width_small, ViewPort::zoom, and ZOOM_LVL_OUT_16X.

◆ CheckOverflow()

static void CheckOverflow ( int &  test,
int &  other,
int  max,
int  mult 
)
static

Check for overflowing the map.

Parameters
testthe variable to test for overflowing
otherthe other variable to update to keep the line
maxthe maximum value for the test variable
multthe constant to multiply the difference by for other

Definition at line 2711 of file viewport.cpp.

References max().

Referenced by CalcRaildirsDrawstyle().

◆ CheckUnderflow()

static void CheckUnderflow ( int &  test,
int &  other,
int  mult 
)
static

Check for underflowing the map.

Parameters
testthe variable to test for underflowing
otherthe other variable to update to keep the line
multthe constant to multiply the difference by for other

Definition at line 2696 of file viewport.cpp.

Referenced by CalcRaildirsDrawstyle().

◆ ClampXYToMap()

static int ClampXYToMap ( Point curr_tile,
int &  iter,
int  iter_limit,
int  start,
int &  other_ref,
int  other_value,
int  vp_value,
int  other_limit,
int  vp_top,
int  vp_bottom 
)
inlinestatic

Determine the clamping of either the X or Y coordinate to the map.

Parameters
curr_tileA tile
iterReference to either the X or Y of curr_tile.
iter_limitUpper search limit for the iter value.
startStart value for the iteration.
other_refReference to the opposite axis in curr_tile than of iter.
other_valueStart value for of the opposite axis
vp_valueValue of the viewport location in the opposite axis as for iter.
other_limitLimit for the other value, so if iter is X, then other_limit is for Y.
vp_topTop of the viewport.
vp_bottomBottom of the viewport.
Returns
Clamped version of vp_value.

Definition at line 1718 of file viewport.cpp.

References _settings_game, GameSettings::construction, ContinueLowerMapEdgeSearch(), ContinueUpperMapEdgeSearch(), max(), ConstructionSettings::max_heightlevel, min(), SearchMapEdge(), TILE_HEIGHT, TileHeight(), and TileXY().

◆ ContinueLowerMapEdgeSearch()

static bool ContinueLowerMapEdgeSearch ( int  iter,
int  iter_limit,
int  sy,
int  sy_limit 
)
inlinestatic

Continue criteria for searching a no-longer-visible tile in negative direction, starting at some tile.

Definition at line 1676 of file viewport.cpp.

Referenced by ClampXYToMap().

◆ ContinueUpperMapEdgeSearch()

static bool ContinueUpperMapEdgeSearch ( int  iter,
int  iter_limit,
int  sy,
int  sy_limit 
)
inlinestatic

Continue criteria for searching a no-longer-visible tile in positive direction, starting at some tile.

Definition at line 1678 of file viewport.cpp.

Referenced by ClampXYToMap().

◆ DrawAutorailSelection()

static void DrawAutorailSelection ( const TileInfo ti,
uint  autorail_type 
)
static

Draws autorail highlights.

Parameters
*tiTileInfo Tile that is being drawn
autorail_typeOffset into _AutorailTilehSprite[][]

Definition at line 977 of file viewport.cpp.

References FOUNDATION_PART_HALFTILE, FOUNDATION_PART_NORMAL, GetHalftileSlopeCorner(), IsHalftileSlope(), OppositeCorner(), RemoveHalftileSlope(), SlopeWithThreeCornersRaised(), and TileInfo::tileh.

◆ DrawGroundSprite()

void DrawGroundSprite ( SpriteID  image,
PaletteID  pal,
const SubSprite sub,
int  extra_offs_x,
int  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.

Parameters
imagethe image to draw.
palthe provided palette.
subOnly draw a part of the sprite.
extra_offs_xPixel X offset for the sprite position.
extra_offs_yPixel Y offset for the sprite position.

Definition at line 604 of file viewport.cpp.

References DrawGroundSpriteAt().

Referenced by DrawSeaWater().

◆ DrawGroundSpriteAt()

void DrawGroundSpriteAt ( SpriteID  image,
PaletteID  pal,
int32  x,
int32  y,
int  z,
const SubSprite sub,
int  extra_offs_x,
int  extra_offs_y 
)

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.

Parameters
imagethe image to draw.
palthe provided palette.
xposition x (world coordinates) of the sprite relative to current tile.
yposition y (world coordinates) of the sprite relative to current tile.
zposition z (world coordinates) of the sprite relative to current tile.
subOnly draw a part of the sprite.
extra_offs_xPixel X offset for the sprite position.
extra_offs_yPixel Y offset for the sprite position.

Definition at line 581 of file viewport.cpp.

References AddChildSpriteToFoundation(), ViewportDrawer::foundation, ViewportDrawer::foundation_part, FOUNDATION_PART_NONE, FOUNDATION_PART_NORMAL, and RemapCoords().

Referenced by DrawGroundSprite().

◆ DrawSelectionSprite()

static void DrawSelectionSprite ( SpriteID  image,
PaletteID  pal,
const TileInfo ti,
int  z_offset,
FoundationPart  foundation_part 
)
static

Draws sprites between ground sprite and everything above.

The sprite is either drawn as TileSprite or as ChildSprite of the active foundation.

Parameters
imagethe image to draw.
palthe provided palette.
tiTileInfo Tile that is being drawn
z_offsetZ offset relative to the groundsprite. Only used for the sprite position, not for sprite sorting.
foundation_partFoundation part the sprite belongs to.

Definition at line 899 of file viewport.cpp.

References AddChildSpriteToFoundation(), AddTileSpriteToDraw(), ViewportDrawer::foundation, TileInfo::x, TileInfo::y, and TileInfo::z.

◆ DrawTileSelection()

static void DrawTileSelection ( const TileInfo ti)
static

◆ DrawTileSelectionRect()

static void DrawTileSelectionRect ( const TileInfo ti,
PaletteID  pal 
)
static

Draws a selection rectangle on a tile.

Parameters
tiTileInfo Tile that is being drawn
palPalette to apply.

Definition at line 917 of file viewport.cpp.

References GetHalftileSlopeCorner(), IsHalftileSlope(), IsValidTile(), TileInfo::tile, and TileInfo::tileh.

Referenced by DrawTileSelection().

◆ EndSpriteCombine()

void EndSpriteCombine ( )

Terminates a block of sprites started by StartSpriteCombine.

Take a look there for details.

Definition at line 795 of file viewport.cpp.

◆ GetViewportY()

static int GetViewportY ( Point  tile)
static

Returns the y coordinate in the viewport coordinate system where the given tile is painted.

Parameters
tileAny tile.
Returns
The viewport y coordinate where the tile is painted.

Definition at line 1086 of file viewport.cpp.

References TILE_PIXELS, and TilePixelHeightOutsideMap().

Referenced by SearchMapEdge().

◆ HandleZoomMessage()

void HandleZoomMessage ( Window w,
const ViewPort vp,
byte  widget_zoom_in,
byte  widget_zoom_out 
)

Update the status of the zoom-buttons according to the zoom-level of the viewport.

This will update their status and invalidate accordingly

Parameters
wWindow pointer to the window that has the zoom buttons
vppointer to the viewport whose zoom-level the buttons represent
widget_zoom_inwidget index for window with zoom-in button
widget_zoom_outwidget index for window with zoom-out button

Definition at line 506 of file viewport.cpp.

References _settings_client, ClientSettings::gui, Window::SetWidgetDirty(), Window::SetWidgetDisabledState(), ViewPort::zoom, GUISettings::zoom_max, and GUISettings::zoom_min.

Referenced by ExtraViewportWindow::OnInvalidateData(), MainToolbarWindow::OnInvalidateData(), and ScenarioEditorToolbarWindow::OnInvalidateData().

◆ InitializeSpriteSorter()

void InitializeSpriteSorter ( )

Choose the "best" sprite sorter and set _vp_sprite_sorter.

Definition at line 3243 of file viewport.cpp.

References lengthof.

◆ InitializeWindowViewport()

void InitializeWindowViewport ( Window w,
int  x,
int  y,
int  width,
int  height,
uint32  follow_flags,
ZoomLevel  zoom 
)

Initialize viewport of the window for use.

Parameters
wWindow to use/display the viewport in
xOffset of left edge of viewport with respect to left edge window w
yOffset of top edge of viewport with respect to top edge window w
widthWidth of the viewport
heightHeight of the viewport
follow_flagsFlags controlling the viewport.
  • If bit 31 is set, the lower 20 bits are the vehicle that the viewport should follow.
  • If bit 31 is clear, it is a TileIndex.
zoomZoomlevel to display

Definition at line 212 of file viewport.cpp.

Referenced by NWidgetViewport::InitializeViewport().

◆ IsInRangeInclusive()

static bool IsInRangeInclusive ( int  begin,
int  end,
int  check 
)
static

Check if the parameter "check" is inside the interval between begin and end, including both begin and end.

Note
Whether begin or end is the biggest does not matter. This method will account for that.
Parameters
beginThe begin of the interval.
endThe end of the interval.
checkThe value to check.

Definition at line 810 of file viewport.cpp.

References Swap().

Referenced by IsInsideRotatedRectangle().

◆ IsInsideRotatedRectangle()

bool IsInsideRotatedRectangle ( int  x,
int  y 
)

Checks whether a point is inside the selected a diagonal rectangle given by _thd.size and _thd.pos.

Parameters
xThe x coordinate of the point to be checked.
yThe y coordinate of the point to be checked.
Returns
True if the point is inside the rectangle, else false.

Definition at line 822 of file viewport.cpp.

References IsInRangeInclusive(), TileHighlightData::pos, and TileHighlightData::size.

Referenced by DrawTileSelection().

◆ IsPtInWindowViewport()

ViewPort* IsPtInWindowViewport ( const Window w,
int  x,
int  y 
)

Is a xy position inside the viewport of the window?

Parameters
wWindow to examine its viewport
xX coordinate of the xy position
yY coordinate of the xy position
Returns
Pointer to the viewport if the xy position is in the viewport of the window, otherwise NULL is returned.

Definition at line 385 of file viewport.cpp.

References ViewPort::height, IsInsideMM(), ViewPort::left, ViewPort::top, Window::viewport, and ViewPort::width.

◆ OffsetGroundSprite()

void OffsetGroundSprite ( int  x,
int  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.

Parameters
xsprite x-offset (screen coordinates) of ground sprites relative to the "foundation"-ParentSprite.
ysprite y-offset (screen coordinates) of ground sprites relative to the "foundation"-ParentSprite.

Definition at line 616 of file viewport.cpp.

References ViewportDrawer::foundation_part, FOUNDATION_PART_HALFTILE, FOUNDATION_PART_NONE, and FOUNDATION_PART_NORMAL.

Referenced by MaxZoomInOut().

◆ ResetObjectToPlace()

void ResetObjectToPlace ( )

◆ ScrollMainWindowToTile()

bool ScrollMainWindowToTile ( TileIndex  tile,
bool  instant 
)

Scrolls the viewport of the main window to a given location.

Parameters
tileDesired tile to center on.
instantJump to the location instead of slowly moving to it.
Returns
Destination of the viewport was changed (to activate other actions when the viewport is already at the desired position).

Definition at line 2268 of file viewport.cpp.

References ScrollMainWindowTo(), TILE_SIZE, TileX(), and TileY().

Referenced by DEF_CONSOLE_CMD(), WaypointWindow::OnClick(), SignListWindow::OnClick(), TownViewWindow::OnClick(), NewsWindow::OnClick(), SignWindow::OnClick(), IndustryDirectoryWindow::OnClick(), StationViewWindow::OnClick(), CompanyWindow::OnClick(), VehicleViewWindow::OnClick(), and StoryBookWindow::OnPageElementClick().

◆ ScrollWindowTo()

bool ScrollWindowTo ( int  x,
int  y,
int  z,
Window w,
bool  instant 
)

Scrolls the viewport in a window to a given location.

Parameters
xDesired x location of the map to scroll to (world coordinate).
yDesired y location of the map to scroll to (world coordinate).
zDesired z location of the map to scroll to (world coordinate). Use -1 to scroll to the height of the map at the x, y location.
wWindow containing the viewport.
instantJump to the location instead of slowly moving to it.
Returns
Destination of the viewport was changed (to activate other actions when the viewport is already at the desired position).

Definition at line 2222 of file viewport.cpp.

References MapSizeX(), MapSizeY(), and TILE_SIZE.

Referenced by SmallMapWindow::OnClick(), and ScrollWindowToTile().

◆ ScrollWindowToTile()

bool ScrollWindowToTile ( TileIndex  tile,
Window w,
bool  instant 
)

Scrolls the viewport in a window to a given location.

Parameters
tileDesired tile to center on.
wWindow containing the viewport.
instantJump to the location instead of slowly moving to it.
Returns
Destination of the viewport was changed (to activate other actions when the viewport is already at the desired position).

Definition at line 2257 of file viewport.cpp.

References ScrollWindowTo(), TILE_SIZE, TileX(), and TileY().

Referenced by WaypointWindow::OnInvalidateData(), WaypointWindow::OnResize(), TownViewWindow::OnResize(), and IndustryViewWindow::OnResize().

◆ SearchMapEdge()

static int SearchMapEdge ( Point curr_tile,
int &  iter,
int  iter_limit,
int  offset,
int  sy_limit,
ContinueMapEdgeSearch  continue_criteria 
)
static

Searches, starting at the given tile, by applying the given offset to iter, for a no longer visible tile.

The whole sense of this function is keeping the to-be-written code small, thus it is a little bit abstracted so the same function can be used for both the X and Y locations. As such a reference to one of the elements in curr_tile was needed.

Parameters
curr_tileA tile
iterReference to either the X or Y of curr_tile.
iter_limitUpper search limit for the iter value.
offsetSearch in steps of this size
sy_limitSearch limit to be passed to the criteria
continue_criteriaSearch as long as this criteria is true
Returns
The final value of iter.

Definition at line 1693 of file viewport.cpp.

References Clamp(), and GetViewportY().

Referenced by ClampXYToMap().

◆ SetObjectToPlace()

void SetObjectToPlace ( CursorID  icon,
PaletteID  pal,
HighLightStyle  mode,
WindowClass  window_class,
WindowNumber  window_num 
)

Change the cursor and mouse click/drag handling to a mode for performing special operations like tile area selection, object placement, etc.

Parameters
iconNew shape of the mouse cursor.
palPalette to use.
modeMode to perform.
window_classWindow class of the window requesting the mode change.
window_numNumber of the window in its class requesting the mode change.

Definition at line 3166 of file viewport.cpp.

References _special_mouse_mode, TileHighlightData::drawstyle, TileHighlightData::GetCallbackWnd(), HT_DRAG, HT_DRAG_MASK, HT_NONE, HT_SPECIAL, TileHighlightData::make_square_red, Window::OnPlaceObjectAbort(), TileHighlightData::place_mode, SetSelectionTilesDirty(), SetTileSelectSize(), WC_INVALID, TileHighlightData::window_class, TileHighlightData::window_number, WSM_DRAGDROP, and WSM_NONE.

Referenced by ResetObjectToPlace(), and SetObjectToPlaceWnd().

◆ SetObjectToPlaceWnd()

void SetObjectToPlaceWnd ( CursorID  icon,
PaletteID  pal,
HighLightStyle  mode,
Window w 
)

Change the cursor and mouse click/drag handling to a mode for performing special operations like tile area selection, object placement, etc.

Parameters
iconNew shape of the mouse cursor.
palPalette to use.
modeMode to perform.
wWindow requesting the mode change.

Definition at line 3151 of file viewport.cpp.

References SetObjectToPlace(), Window::window_class, and Window::window_number.

Referenced by RefitWindow::OnClick(), CompanyWindow::OnClick(), and BuildObjectWindow::SelectOtherObject().

◆ SetRedErrorSquare()

void SetRedErrorSquare ( TileIndex  tile)

Set a tile to display a red error square.

Parameters
tileTile that should show the red error square.

Definition at line 2277 of file viewport.cpp.

References INVALID_TILE, MarkTileDirtyByTile(), and TileHighlightData::redsq.

Referenced by ErrmsgWindow::OnHundredthTick().

◆ SetTileSelectSize()

void SetTileSelectSize ( int  w,
int  h 
)

Highlight w by h tiles at the cursor.

Parameters
wWidth of the highlighted tiles rectangle.
hHeight of the highlighted tiles rectangle.

Definition at line 2295 of file viewport.cpp.

References TileHighlightData::new_outersize, TileHighlightData::new_size, and TILE_SIZE.

Referenced by ScenarioEditorLandscapeGenerationWindow::OnPaint(), BuildRailStationWindow::OnPaint(), and SetObjectToPlace().

◆ ShowMeasurementTooltips()

static void ShowMeasurementTooltips ( StringID  str,
uint  paramcount,
const uint64  params[],
TooltipCloseCondition  close_cond = TCC_LEFT_CLICK 
)
inlinestatic

Displays the measurement tooltips when selecting multiple tiles.

Parameters
strString to be displayed
paramcountnumber of params to deal with
params(optional) up to 5 pieces of additional information that may be added to a tooltip
close_condCondition for closing this tooltip.

Definition at line 2464 of file viewport.cpp.

Referenced by VpSelectTilesWithMethod(), and VpSetPresizeRange().

◆ StartSpriteCombine()

void StartSpriteCombine ( )

Starts a block of sprites, which are "combined" into a single bounding box.

Subsequent calls to AddSortableSpriteToDraw will be drawn into the same bounding box. That is: The first sprite that is not clipped by the viewport defines the bounding box, and the following sprites will be child sprites to that one.

That implies:

  • The drawing order is definite. No other sprites will be sorted between those of the block.
  • You have to provide a valid bounding box for all sprites, as you won't know which one is the first non-clipped one. Preferable you use the same bounding box for all.
  • You cannot use AddChildSpriteScreen inside the block, as its result will be indefinite.

The block is terminated by EndSpriteCombine.

You cannot nest "combined" blocks.

Definition at line 785 of file viewport.cpp.

◆ SwapDirection()

static bool SwapDirection ( HighLightStyle  style,
TileIndex  start_tile,
TileIndex  end_tile 
)
static

Check if the direction of start and end tile should be swapped based on the dragging-style.

Default directions are: in the case of a line (HT_RAIL, HT_LINE): DIR_NE, DIR_NW, DIR_N, DIR_E in the case of a rect (HT_RECT, HT_POINT): DIR_S, DIR_E For example dragging a rectangle area from south to north should be swapped to north-south (DIR_S) to obtain the same results with less code. This is what the return value signifies.

Parameters
styleHighLightStyle dragging style
start_tilestart tile of drag
end_tileend tile of drag
Returns
boolean value which when true means start/end should be swapped

Definition at line 2582 of file viewport.cpp.

References HT_DRAG_MASK, HT_LINE, HT_POINT, HT_RAIL, HT_RECT, TileX(), and TileY().

Referenced by CalcHeightdiff().

◆ TranslateXYToTileCoord()

Point TranslateXYToTileCoord ( const ViewPort vp,
int  x,
int  y,
bool  clamp_to_map 
)

Translate screen coordinate in a viewport to a tile coordinate.

Parameters
vpViewport that contains the (x, y) screen coordinate
xScreen x coordinate
yScreen y coordinate
clamp_to_mapClamp the coordinate outside of the map to the closest tile within the map.
Returns
Tile coordinate

Definition at line 405 of file viewport.cpp.

References ViewPort::height, ViewPort::left, ScaleByZoom(), ViewPort::top, ViewPort::virtual_left, ViewPort::width, and ViewPort::zoom.

Referenced by SmallMapWindow::DrawMapIndicators(), and SmallMapWindow::SmallMapCenterOnCurrentPos().

◆ UpdateTileSelection()

void UpdateTileSelection ( )

Updates tile highlighting for all cases.

Uses _thd.selstart and _thd.selend and _thd.place_mode (set elsewhere) to determine _thd.pos and _thd.size Also drawstyle is determined. Uses _thd.new.* as a buffer and calls SetSelectionTilesDirty() twice, Once for the old and once for the new selection. _thd is TileHighlightData, found in viewport.h

Definition at line 2355 of file viewport.cpp.

References HT_DRAG_MASK, HT_NONE, HT_SPECIAL, TileHighlightData::IsDraggingDiagonal(), TileHighlightData::new_pos, TileHighlightData::new_size, TileHighlightData::next_drawstyle, TileHighlightData::place_mode, TileHighlightData::selend, TileHighlightData::selstart, Swap(), TILE_SIZE, and TILE_UNIT_MASK.

Referenced by StationJoinerNeeded().

◆ UpdateViewportPosition()

void UpdateViewportPosition ( Window w)

Update the viewport position being displayed.

Parameters
wWindow owning the viewport.

Definition at line 1787 of file viewport.cpp.

References ViewportData::follow_vehicle, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_vehicle_pool >::Get(), INVALID_VEHICLE, and Window::viewport.

◆ ViewportAddLandscape()

static void ViewportAddLandscape ( )
static

Add the landscape to the viewport, i.e.

all ground tiles and buildings.

Definition at line 1095 of file viewport.cpp.

◆ ViewportAddString()

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,
Colours  colour 
)

Add a string to draw in the viewport.

Parameters
dpicurrent viewport area
small_fromZoomlevel from when the small font should be used
signsign position and dimension
string_normalString for normal and 2x zoom level
string_smallString for 4x and 8x zoom level
string_small_shadowShadow string for 4x and 8x zoom level; or #STR_NULL if no shadow
colourcolour of the sign background; or INVALID_COLOUR if transparent

Definition at line 1219 of file viewport.cpp.

References ViewportSign::center, FONT_HEIGHT_NORMAL, ScaleByZoom(), ViewportSign::top, VPSM_BOTTOM, VPSM_TOP, ViewportSign::width_normal, and ViewportSign::width_small.

◆ ViewportDrawBoundingBoxes()

static void ViewportDrawBoundingBoxes ( const ParentSpriteToSortVector psd)
static

◆ ViewportDrawChk()

static void ViewportDrawChk ( const ViewPort vp,
int  left,
int  top,
int  right,
int  bottom 
)
static

Make sure we don't draw a too big area at a time.

If we do, the sprite memory will overflow.

Definition at line 1610 of file viewport.cpp.

References ScaleByZoom(), and ViewPort::zoom.

◆ ViewportSortParentSpritesChecker()

static bool ViewportSortParentSpritesChecker ( )
static

This fallback sprite checker always exists.

Definition at line 1373 of file viewport.cpp.

◆ VpHandlePlaceSizingDrag()

EventState VpHandlePlaceSizingDrag ( )

Handle the mouse while dragging for placement/resizing.

Returns
State of handling the event.

Definition at line 3107 of file viewport.cpp.

References _left_button_down, _special_mouse_mode, ES_HANDLED, ES_NOT_HANDLED, TileHighlightData::GetCallbackWnd(), Window::OnPlaceDrag(), ResetObjectToPlace(), TileHighlightData::select_method, TileHighlightData::select_proc, and WSM_SIZING.

◆ VpSelectTilesWithMethod()

void VpSelectTilesWithMethod ( int  x,
int  y,
ViewportPlaceMethod  method 
)

◆ VpSetPresizeRange()

void VpSetPresizeRange ( TileIndex  from,
TileIndex  to 
)

Highlights all tiles between a set of two tiles.

Used in dock and tunnel placement

Parameters
fromTileIndex of the first tile to highlight
toTileIndex of the last tile to highlight

Definition at line 2514 of file viewport.cpp.

References DistanceManhattan(), HT_RECT, TileHighlightData::next_drawstyle, TileHighlightData::selend, TileHighlightData::selstart, ShowMeasurementTooltips(), TILE_SIZE, TileX(), and TileY().

Referenced by BuildDocksToolbarWindow::OnPlacePresize(), and BuildRailToolbarWindow::OnPlacePresize().

Variable Documentation

◆ _autorail_type

const HighLightStyle _autorail_type[6][2]
static
Initial value:
= {
}
Y direction.
vertical right
X direction.
vertical left
horizontal lower
horizontal upper

Definition at line 960 of file viewport.cpp.

◆ _vp_sprite_sorters

ViewportSSCSS _vp_sprite_sorters[]
static
Initial value:
= {
}
static void ViewportSortParentSprites(ParentSpriteToSortVector *psdv)
Sort parent sprites pointer array.
Definition: viewport.cpp:1379
static bool ViewportSortParentSpritesChecker()
This fallback sprite checker always exists.
Definition: viewport.cpp:1373

List of sorters ordered from best to worst.

Definition at line 3235 of file viewport.cpp.