48 typedef typename Types::Tpf Tpf; ///< the pathfinder class (derived from THIS class) |
48 typedef typename Types::Tpf Tpf; ///< the pathfinder class (derived from THIS class) |
49 typedef typename Types::NodeList::Titem Node; ///< this will be our node type |
49 typedef typename Types::NodeList::Titem Node; ///< this will be our node type |
50 typedef typename Node::Key Key; ///< key to hash tables |
50 typedef typename Node::Key Key; ///< key to hash tables |
51 |
51 |
52 protected: |
52 protected: |
53 TileIndex m_org_tile; ///< first origin tile |
53 TileIndex m_orgTile; ///< first origin tile |
54 TrackdirBits m_org_td_bits; ///< first origin trackdirbits |
54 Trackdir m_orgTd; ///< first origin trackdir |
55 TileIndex m_rev_tile; ///< second (reversed) origin tile |
55 TileIndex m_revTile; ///< second (reversed) origin tile |
56 TrackdirBits m_rev_td_bits; ///< second (reversed) origin trackdir |
56 Trackdir m_revTd; ///< second (reversed) origin trackdir |
57 int m_reverse_penalty; ///< penalty to be added for using the reversed origin |
57 int m_reverse_penalty; ///< penalty to be added for using the reversed origin |
58 bool m_treat_first_red_two_way_signal_as_eol; ///< in some cases (leaving station) we need to handle first two-way signal differently |
58 bool m_treat_first_red_two_way_signal_as_eol; ///< in some cases (leaving station) we need to handle first two-way signal differently |
59 |
59 |
60 /// to access inherited path finder |
60 /// to access inherited path finder |
61 FORCEINLINE Tpf& Yapf() {return *static_cast<Tpf*>(this);} |
61 FORCEINLINE Tpf& Yapf() {return *static_cast<Tpf*>(this);} |
62 |
62 |
63 public: |
63 public: |
64 /// set origin (tiles, trackdirs, etc.) |
64 /// set origin (tiles, trackdirs, etc.) |
65 void SetOrigin(TileIndex tile, TrackdirBits td_bits, TileIndex tiler = INVALID_TILE, TrackdirBits tdr_bits = INVALID_TRACKDIR_BIT, int reverse_penalty = 0, bool treat_first_red_two_way_signal_as_eol = true) |
65 void SetOrigin(TileIndex tile, Trackdir td, TileIndex tiler = INVALID_TILE, Trackdir tdr = INVALID_TRACKDIR, int reverse_penalty = 0, bool treat_first_red_two_way_signal_as_eol = true) |
66 { |
66 { |
67 m_org_tile = tile; |
67 m_orgTile = tile; |
68 m_org_td_bits = td_bits; |
68 m_orgTd = td; |
69 m_rev_tile = tiler; |
69 m_revTile = tiler; |
70 m_rev_td_bits = tdr_bits; |
70 m_revTd = tdr; |
71 m_reverse_penalty = reverse_penalty; |
71 m_reverse_penalty = reverse_penalty; |
72 m_treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol; |
72 m_treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol; |
73 } |
73 } |
74 |
74 |
75 /// Called when YAPF needs to place origin nodes into open list |
75 /// Called when YAPF needs to place origin nodes into open list |
76 void PfSetStartupNodes() |
76 void PfSetStartupNodes() |
77 { |
77 { |
78 if (m_org_tile != INVALID_TILE && m_org_td_bits != INVALID_TRACKDIR_BIT) { |
78 if (m_orgTile != INVALID_TILE && m_orgTd != INVALID_TRACKDIR) { |
79 for (TrackdirBits td_bits = m_org_td_bits; td_bits != TRACKDIR_BIT_NONE; td_bits = (TrackdirBits)KillFirstBit2x64(td_bits)) { |
79 Node& n1 = Yapf().CreateNewNode(); |
80 Node& n = Yapf().CreateNewNode(); |
80 n1.Set(NULL, m_orgTile, m_orgTd, false); |
81 Trackdir td = (Trackdir)FindFirstBit2x64(td_bits); |
81 Yapf().AddStartupNode(n1); |
82 n.Set(NULL, m_org_tile, td, false); |
|
83 Yapf().AddStartupNode(n); |
|
84 } |
|
85 } |
82 } |
86 if (m_rev_tile != INVALID_TILE && m_rev_td_bits != INVALID_TRACKDIR_BIT) { |
83 if (m_revTile != INVALID_TILE && m_revTd != INVALID_TRACKDIR) { |
87 for (TrackdirBits td_bits = m_rev_td_bits; td_bits != TRACKDIR_BIT_NONE; td_bits = (TrackdirBits)KillFirstBit2x64(td_bits)) { |
84 Node& n2 = Yapf().CreateNewNode(); |
88 Node& n = Yapf().CreateNewNode(); |
85 n2.Set(NULL, m_revTile, m_revTd, false); |
89 Trackdir td = (Trackdir)FindFirstBit2x64(td_bits); |
86 n2.m_cost = m_reverse_penalty; |
90 n.Set(NULL, m_rev_tile, td, false); |
87 Yapf().AddStartupNode(n2); |
91 n.m_cost = m_reverse_penalty; |
|
92 Yapf().AddStartupNode(n); |
|
93 } |
|
94 } |
88 } |
95 } |
89 } |
96 |
90 |
97 /// return true if first two-way signal should be treated as dead end |
91 /// return true if first two-way signal should be treated as dead end |
98 FORCEINLINE bool TreatFirstRedTwoWaySignalAsEOL() |
92 FORCEINLINE bool TreatFirstRedTwoWaySignalAsEOL() |