# Conflicts: # .github/workflows/ci-build.yml # .github/workflows/codeql.yml # .github/workflows/commit-checker.yml # .github/workflows/release-linux-legacy.yml # .github/workflows/release-linux.yml # .github/workflows/release-macos.yml # .github/workflows/release-windows-store.yml # .github/workflows/release-windows.yml # .github/workflows/upload-cdn.yml # .github/workflows/upload-gog.yml # .github/workflows/upload-steam.yml # src/console_cmds.cpp # src/core/math_func.hpp # src/fios.cpp # src/fios.h # src/intro_gui.cpp # src/network/network_server.cpp # src/openttd.cpp # src/settings.cpp # src/settings_gui.cpp # src/settings_internal.h # src/settings_table.cpp # src/settings_type.h # src/table/settings.h.preamble # src/table/settings/company_settings.ini # src/table/settings/currency_settings.ini # src/table/settings/difficulty_settings.ini # src/table/settings/economy_settings.ini # src/table/settings/game_settings.ini # src/table/settings/gui_settings.ini # src/table/settings/linkgraph_settings.ini # src/table/settings/locale_settings.ini # src/table/settings/misc_settings.ini # src/table/settings/multimedia_settings.ini # src/table/settings/network_private_settings.ini # src/table/settings/network_settings.ini # src/table/settings/news_display_settings.ini # src/table/settings/old_gameopt_settings.ini # src/table/settings/pathfinding_settings.ini # src/table/settings/script_settings.ini # src/table/settings/win32_settings.ini # src/table/settings/window_settings.ini # src/table/settings/world_settings.ini # src/viewport.cpp # src/viewport_func.h # src/window.cpp
		
			
				
	
	
		
			185 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			8.6 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, uint32_t delta_ms);
 | 
						|
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 (also used for catenary pylons on diagonal track under bridges for similar reasons)
 | 
						|
	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 */
 |