/* * 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 . */ /** @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 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 */