OpenTTD Source 20241224-master-gf74b0cf984
landscape.h File Reference

Functions related to OTTD's landscape. More...

#include "core/geometry_type.hpp"
#include "tile_cmd.h"

Go to the source code of this file.

Data Structures

struct  SnowLine
 Structure describing the height of the snow line each day of the year. More...
 

Functions

bool IsSnowLineSet ()
 Has a snow line table already been loaded.
 
void SetSnowLine (uint8_t table[SNOW_LINE_MONTHS][SNOW_LINE_DAYS])
 Set a variable snow line, as loaded from a newgrf file.
 
uint8_t GetSnowLine ()
 Get the current snow line, either variable or static.
 
uint8_t HighestSnowLine ()
 Get the highest possible snow line height, either variable or static.
 
uint8_t LowestSnowLine ()
 Get the lowest possible snow line height, either variable or static.
 
void ClearSnowLine ()
 Clear the variable snow line table and free the memory.
 
int GetSlopeZInCorner (Slope tileh, Corner corner)
 Determine the Z height of a corner relative to TileZ.
 
std::tuple< Slope, int > GetFoundationSlope (TileIndex tile)
 Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation, the function returns the same as GetTileSlope.
 
uint GetPartialPixelZ (int x, int y, Slope corners)
 Determines height at given coordinate of a slope.
 
int GetSlopePixelZ (int x, int y, bool ground_vehicle=false)
 Return world Z coordinate of a given point of a tile.
 
int GetSlopePixelZOutsideMap (int x, int y)
 Return world z coordinate of a given point of a tile, also for tiles outside the map (virtual "black" tiles).
 
void GetSlopePixelZOnEdge (Slope tileh, DiagDirection edge, int &z1, int &z2)
 Determine the Z height of the corners of a specific tile edge.
 
int GetSlopePixelZInCorner (Slope tileh, Corner corner)
 Determine the Z height of a corner relative to TileZ.
 
std::tuple< Slope, int > GetFoundationPixelSlope (TileIndex tile)
 Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation, the function returns the same as GetTilePixelSlope.
 
Point RemapCoords (int x, int y, int z)
 Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.
 
Point RemapCoords2 (int x, int y)
 Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.
 
Point InverseRemapCoords (int x, int y)
 Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.
 
Point InverseRemapCoords2 (int x, int y, bool clamp_to_map=false, bool *clamped=nullptr)
 Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.
 
uint ApplyFoundationToSlope (Foundation f, Slope &s)
 Applies a foundation to a slope.
 
uint ApplyPixelFoundationToSlope (Foundation f, Slope &s)
 Applies a foundation to a slope.
 
void DrawFoundation (TileInfo *ti, Foundation f)
 Draw foundation f at tile ti.
 
bool HasFoundationNW (TileIndex tile, Slope slope_here, uint z_here)
 
bool HasFoundationNE (TileIndex tile, Slope slope_here, uint z_here)
 
void DoClearSquare (TileIndex tile)
 
void RunTileLoop ()
 Gradually iterate over all tiles on the map, calling their TileLoopProcs once every TILE_UPDATE_FREQUENCY ticks.
 
void InitializeLandscape ()
 
bool GenerateLandscape (uint8_t mode)
 

Variables

static const uint SNOW_LINE_MONTHS = 12
 Number of months in the snow line table.
 
static const uint SNOW_LINE_DAYS = 32
 Number of days in each month in the snow line table.
 

Detailed Description

Functions related to OTTD's landscape.

Definition in file landscape.h.

Function Documentation

◆ ApplyFoundationToSlope()

◆ ApplyPixelFoundationToSlope()

uint ApplyPixelFoundationToSlope ( Foundation  f,
Slope s 
)
inline

Applies a foundation to a slope.

Precondition
Foundation and slope must be valid combined.
Parameters
fThe Foundation.
sThe Slope to modify.
Returns
Increment to the tile Z coordinate.

Definition at line 126 of file landscape.h.

References ApplyFoundationToSlope(), and TILE_HEIGHT.

Referenced by DrawFoundation().

◆ DoClearSquare()

void DoClearSquare ( TileIndex  tile)

Definition at line 530 of file landscape.cpp.

◆ DrawFoundation()

◆ GenerateLandscape()

◆ GetFoundationPixelSlope()

std::tuple< Slope, int > GetFoundationPixelSlope ( TileIndex  tile)
inline

Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation, the function returns the same as GetTilePixelSlope.

Parameters
tileThe tile of interest.
Returns
The slope on top of the foundation and the z of the foundation.

Definition at line 65 of file landscape.h.

References GetFoundationSlope(), and TILE_HEIGHT.

Referenced by DrawFoundation().

◆ GetFoundationSlope()

std::tuple< Slope, int > GetFoundationSlope ( TileIndex  tile)

Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation, the function returns the same as GetTileSlope.

Parameters
tileThe tile of interest.
Returns
The slope on top of the foundation and the z of the foundation slope.

Definition at line 382 of file landscape.cpp.

References _tile_type_procs, ApplyFoundationToSlope(), GetTileSlopeZ(), and GetTileType().

Referenced by GetFoundationPixelSlope(), IsPossibleCrossing(), IsRoadAllowedHere(), and TileLoop_Water().

◆ GetPartialPixelZ()

uint GetPartialPixelZ ( int  x,
int  y,
Slope  corners 
)

Determines height at given coordinate of a slope.

At the northern corner (0, 0) the result is always a multiple of TILE_HEIGHT. When the height is a fractional Z, then the height is rounded down. For example, when at the height is 0 at x = 0 and the height is 8 at x = 16 (actually x = 0 of the next tile), then height is 0 at x = 1, 1 at x = 2, and 7 at x = 15.

Parameters
xx coordinate (value from 0 to 15)
yy coordinate (value from 0 to 15)
cornersslope to examine
Returns
height of given point of given slope

Definition at line 228 of file landscape.cpp.

References GetHalftileSlopeCorner(), GetSlopeMaxPixelZ(), IsHalftileSlope(), RemoveHalftileSlope(), SLOPE_E, SLOPE_ELEVATED, SLOPE_ENW, SLOPE_EW, SLOPE_FLAT, SLOPE_N, SLOPE_NE, SLOPE_NS, SLOPE_NW, SLOPE_NWS, SLOPE_S, SLOPE_SE, SLOPE_SEN, SLOPE_STEEP_E, SLOPE_STEEP_N, SLOPE_STEEP_S, SLOPE_STEEP_W, SLOPE_SW, SLOPE_W, SLOPE_WSE, TILE_HEIGHT, and TILE_SIZE.

Referenced by CheckPartialPixelZ(), CheckPartialPixelZSlopeAddition(), and DrawRoadBits().

◆ GetSlopePixelZ()

int GetSlopePixelZ ( int  x,
int  y,
bool  ground_vehicle 
)

Return world Z coordinate of a given point of a tile.

Normally this is the Z of the ground/foundation at the given location, but in some cases the ground/foundation can differ from the Z coordinate that the (ground) vehicle passing over it would take. For example when entering a tunnel or bridge.

Parameters
xWorld X coordinate in tile "units".
yWorld Y coordinate in tile "units".
ground_vehicleWhether to get the Z coordinate of the ground vehicle, or the ground.
Returns
World Z coordinate at tile ground (vehicle) level, including slopes and foundations.

Definition at line 303 of file landscape.cpp.

References _tile_type_procs, GetTileType(), and TileVirtXY().

Referenced by AfterLoadGame(), AircraftController(), CheckGroundVehiclesAtCorrectZ(), CmdBuildAircraft(), CmdBuildRailVehicle(), CmdBuildRailWagon(), CmdBuildRoadVehicle(), CmdBuildShip(), CmdPlaceSign(), CreateEffectVehicleAbove(), DisasterTick_Big_Ufo(), DisasterTick_Zeppeliner(), DrawRailCatenaryRailway(), DrawRoadDetail(), FixVehicleInclination(), GetPCPElevation(), GetSaveSlopeZ(), GetSlopePixelZOutsideMap(), HandleCrashedAircraft(), InitializeWindowViewport(), CommandHelperBase::InternalPostResult(), InverseRemapCoords2(), RemapCoords2(), ScrollWindowTo(), SetAircraftPosition(), DisasterVehicle::UpdatePosition(), GroundVehicle< T, Type >::UpdateZPosition(), and GroundVehicle< T, Type >::UpdateZPositionAndInclination().

◆ GetSlopePixelZInCorner()

int GetSlopePixelZInCorner ( Slope  tileh,
Corner  corner 
)
inline

Determine the Z height of a corner relative to TileZ.

Precondition
The slope must not be a halftile slope.
Parameters
tilehThe slope.
cornerThe corner.
Returns
Z position of corner relative to TileZ.

Definition at line 53 of file landscape.h.

References GetSlopeZInCorner(), and TILE_HEIGHT.

Referenced by DrawRoadTypeCatenary(), and DrawTrackFence().

◆ GetSlopePixelZOnEdge()

void GetSlopePixelZOnEdge ( Slope  tileh,
DiagDirection  edge,
int &  z1,
int &  z2 
)

Determine the Z height of the corners of a specific tile edge.

Note
If a tile has a non-continuous halftile foundation, a corner can have different heights wrt. its edges.
Precondition
z1 and z2 must be initialized (typ. with TileZ). The corner heights just get added.
Parameters
tilehThe slope of the tile.
edgeThe edge of interest.
z1Gets incremented by the height of the first corner of the edge. (near corner wrt. the camera)
z2Gets incremented by the height of the second corner of the edge. (far corner wrt. the camera)

Definition at line 354 of file landscape.cpp.

References GetHalftileSlopeCorner(), IsHalftileSlope(), RemoveHalftileSlope(), SLOPE_E, SLOPE_N, SLOPE_S, SLOPE_STEEP_E, SLOPE_STEEP_N, SLOPE_STEEP_S, SLOPE_STEEP_W, SLOPE_W, SlopeWithOneCornerRaised(), and TILE_HEIGHT.

Referenced by DrawBridgePillars().

◆ GetSlopePixelZOutsideMap()

int GetSlopePixelZOutsideMap ( int  x,
int  y 
)

Return world z coordinate of a given point of a tile, also for tiles outside the map (virtual "black" tiles).

Parameters
xWorld X coordinate in tile "units", may be outside the map.
yWorld Y coordinate in tile "units", may be outside the map.
Returns
World Z coordinate at tile ground level, including slopes and foundations.

Definition at line 318 of file landscape.cpp.

References _tile_type_procs, GetSlopePixelZ(), INVALID_TILE, IsInsideBS(), MP_VOID, Map::SizeX(), Map::SizeY(), and TILE_SIZE.

Referenced by InverseRemapCoords2().

◆ GetSlopeZInCorner()

int GetSlopeZInCorner ( Slope  tileh,
Corner  corner 
)

Determine the Z height of a corner relative to TileZ.

Precondition
The slope must not be a halftile slope.
Parameters
tilehThe slope.
cornerThe corner.
Returns
Z position of corner relative to TileZ.

Definition at line 336 of file landscape.cpp.

References IsHalftileSlope(), SlopeWithOneCornerRaised(), and SteepSlope().

Referenced by GetSlopePixelZInCorner(), and TestAutoslopeOnRailTile().

◆ HasFoundationNE()

bool HasFoundationNE ( TileIndex  tile,
Slope  slope_here,
uint  z_here 
)

Definition at line 406 of file landscape.cpp.

◆ HasFoundationNW()

bool HasFoundationNW ( TileIndex  tile,
Slope  slope_here,
uint  z_here 
)

Definition at line 391 of file landscape.cpp.

◆ InitializeLandscape()

void InitializeLandscape ( )

Definition at line 809 of file landscape.cpp.

◆ InverseRemapCoords()

Point InverseRemapCoords ( int  x,
int  y 
)
inline

Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.

Function assumes z == 0. For other values of z, add z to y before the call.

Parameters
xX coordinate of the 2D coordinate.
yY coordinate of the 2D coordinate.
Returns
X and Y components of equivalent world or tile coordinate.
Note
Inverse of RemapCoords function. Smaller values may get rounded.
See also
InverseRemapCoords2

Definition at line 109 of file landscape.h.

Referenced by InverseRemapCoords2(), SmallMapWindow::SetNewScroll(), and ViewportAddLandscape().

◆ InverseRemapCoords2()

Point InverseRemapCoords2 ( int  x,
int  y,
bool  clamp_to_map,
bool *  clamped 
)

Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.

Function takes into account height of tiles and foundations.

Parameters
xX viewport 2D coordinate.
yY viewport 2D coordinate.
clamp_to_mapClamp the coordinate outside of the map to the closest, non-void tile within the map.
[out]clampedWhether coordinates were clamped.
Returns
3D world coordinate of point visible at the given screen coordinate (3D perspective).
Note
Inverse of RemapCoords2 function. Smaller values may get rounded.
See also
InverseRemapCoords

Definition at line 111 of file landscape.cpp.

References _settings_game, CeilDiv(), Clamp(), GameSettings::construction, ConstructionSettings::freeform_edges, GetSlopePixelZ(), GetSlopePixelZOutsideMap(), InverseRemapCoords(), ConstructionSettings::map_height_limit, Map::MaxX(), Map::MaxY(), TILE_HEIGHT, TILE_PIXELS, and TILE_SIZE.

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

◆ RemapCoords()

Point RemapCoords ( int  x,
int  y,
int  z 
)
inline

Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.

Parameters
xX world or tile coordinate (runs in SW direction in the 2D view).
yY world or tile coordinate (runs in SE direction in the 2D view).
zZ world or tile coordinate (runs in N direction in the 2D view).
Returns
Equivalent coordinate in the 2D view.
See also
RemapCoords2

Definition at line 79 of file landscape.h.

Referenced by AddCombinedSprite(), AddSortableSpriteToDraw(), AddTileSpriteToDraw(), CcStartStopVehicle(), DrawCommonTileSeqInGUI(), DrawGroundSpriteAt(), DrawHouseInGUI(), MarkTileDirtyByTile(), IntroGameViewportCommand::PositionForViewport(), SelectGameWindow::ReadIntroGameViewportCommands(), RemapCoords2(), SetSelectionTilesDirty(), SetupScreenshotViewport(), ShowCostOrIncomeAnimation(), ShowFeederIncomeAnimation(), ShowFillingPercent(), Vehicle::UpdateBoundingBoxCoordinates(), Sign::UpdateVirtCoord(), and ViewportDrawBoundingBoxes().

◆ RemapCoords2()

Point RemapCoords2 ( int  x,
int  y 
)
inline

Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.

Same as RemapCoords, except the Z coordinate is read from the map.

Parameters
xX world or tile coordinate (runs in SW direction in the 2D view).
yY world or tile coordinate (runs in SE direction in the 2D view).
Returns
Equivalent coordinate in the 2D view.
See also
RemapCoords

Definition at line 95 of file landscape.h.

References GetSlopePixelZ(), and RemapCoords().

Referenced by ClampViewportToMap(), Town::UpdateVirtCoord(), Station::UpdateVirtCoord(), and Waypoint::UpdateVirtCoord().

◆ RunTileLoop()

void RunTileLoop ( )

Gradually iterate over all tiles on the map, calling their TileLoopProcs once every TILE_UPDATE_FREQUENCY ticks.

Definition at line 769 of file landscape.cpp.

References _tile_type_procs, TimerGameTick::counter, GetTileType(), lengthof, Map::LogX(), Map::LogY(), MAX_MAP_SIZE_BITS, MIN_MAP_SIZE_BITS, PFE_GL_LANDSCAPE, TILE_UPDATE_FREQUENCY, and TILE_UPDATE_FREQUENCY_LOG.

Referenced by _GenerateWorld(), CreateRivers(), and StateGameLoop().

Variable Documentation

◆ SNOW_LINE_DAYS

const uint SNOW_LINE_DAYS = 32
static

Number of days in each month in the snow line table.

Definition at line 17 of file landscape.h.

Referenced by GlobalVarChangeInfo(), and SetSnowLine().

◆ SNOW_LINE_MONTHS

const uint SNOW_LINE_MONTHS = 12
static

Number of months in the snow line table.

Definition at line 16 of file landscape.h.

Referenced by GlobalVarChangeInfo(), and SetSnowLine().