10#ifndef YAPF_COMMON_HPP
11#define YAPF_COMMON_HPP
13#include "../../core/bitmath_func.hpp"
14#include "../../tile_type.h"
15#include "../../track_type.h"
21 typedef typename Types::Tpf
Tpf;
22 typedef typename Types::NodeList::Item
Node;
23 typedef typename Node::Key
Key;
29 return *
static_cast<Tpf *
>(
this);
40 node.Set(
nullptr, tile, td, is_choice);
41 Yapf().AddStartupNode(node);
50 typedef typename Types::Tpf
Tpf;
51 typedef typename Types::NodeList::Item
Node;
52 typedef typename Node::Key
Key;
58 return *
static_cast<Tpf *
>(
this);
68 node.Set(
nullptr, forward_tile, forward_td,
false);
69 Yapf().AddStartupNode(node);
73 node.Set(
nullptr, reverse_tile, reverse_td,
false);
74 node.cost = reverse_penalty;
75 Yapf().AddStartupNode(node);
86template <
class Ttypes>
88 :
public Ttypes::PfBase
89 ,
public Ttypes::PfCost
90 ,
public Ttypes::PfCache
91 ,
public Ttypes::PfOrigin
92 ,
public Ttypes::PfDestination
93 ,
public Ttypes::PfFollow
106 static constexpr int dg_dir_to_x_offs[] = {-1, 0, 1, 0};
107 static constexpr int dg_dir_to_y_offs[] = {0, 1, 0, -1};
111 const int x1 = 2 *
TileX(start_tile) + dg_dir_to_x_offs[
static_cast<int>(exitdir)];
112 const int y1 = 2 *
TileY(start_tile) + dg_dir_to_y_offs[
static_cast<int>(exitdir)];
113 const int x2 = 2 *
TileX(destination_tile);
114 const int y2 = 2 *
TileY(destination_tile);
115 const int dx =
abs(x1 - x2);
116 const int dy =
abs(y1 - y2);
117 const int dmin = std::min(dx, dy);
118 const int dxy =
abs(dx - dy);
constexpr uint8_t FindFirstBit(T x)
Search the first set bit in a value.
constexpr T KillFirstBit(T value)
Clear the first bit in an integer.
YAPF origin provider base class - used when origin is one tile / multiple trackdirs.
Node::Key Key
key to hash tables
Tpf & Yapf()
to access inherited path finder
Types::Tpf Tpf
the pathfinder class (derived from THIS class)
void SetOrigin(TileIndex tile, TrackdirBits trackdirs)
Set origin tile / trackdir mask.
Types::NodeList::Item Node
this will be our node type
YAPF origin provider base class - used when there are two tile/trackdir origins.
Tpf & Yapf()
to access inherited path finder
void SetOrigin(TileIndex forward_tile, Trackdir forward_td, TileIndex reverse_tile=INVALID_TILE, Trackdir reverse_td=INVALID_TRACKDIR, int reverse_penalty=0)
set origin (tiles, trackdirs, etc.)
Node::Key Key
key to hash tables
Types::Tpf Tpf
the pathfinder class (derived from THIS class)
Types::NodeList::Item Node
this will be our node type
YAPF template that uses Ttypes template argument to determine all YAPF components (base classes) from...
DiagDirection
Enumeration for diagonal directions.
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
constexpr T abs(const T a)
Returns the absolute value of (scalar) variable.
static const int YAPF_TILE_CORNER_LENGTH
Length (penalty) of a corner with YAPF.
static const int YAPF_TILE_LENGTH
Length (penalty) of one tile with YAPF.
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
DiagDirection TrackdirToExitdir(Trackdir trackdir)
Maps a trackdir to the (4-way) direction the tile is exited when following that trackdir.
Trackdir
Enumeration for tracks and directions.
@ INVALID_TRACKDIR
Flag for an invalid trackdir.
TrackdirBits
Allow incrementing of Trackdir variables.
@ TRACKDIR_BIT_NONE
No track build.
int OctileDistanceCost(TileIndex start_tile, Trackdir start_td, TileIndex destination_tile)
Calculates the octile distance cost between a starting tile / trackdir and a destination tile.