diff --git a/routing/bicycle_directions.cpp b/routing/bicycle_directions.cpp index 362d52741d..38e169b815 100644 --- a/routing/bicycle_directions.cpp +++ b/routing/bicycle_directions.cpp @@ -169,6 +169,8 @@ bool BicycleDirectionsEngine::Generate(IndexRoadGraph const & graph, vector & routeGeometry, vector & segments) { + CHECK(m_numMwmIds, ()); + m_adjacentEdges.clear(); m_pathSegments.clear(); turns.clear(); @@ -198,7 +200,7 @@ bool BicycleDirectionsEngine::Generate(IndexRoadGraph const & graph, vector(highwayClass) > static_cast(maxClassForPossibleTurns)) @@ -79,11 +79,11 @@ bool KeepTurnByHighwayClass(CarDirection turn, TurnCandidates const & possibleTu * \brief Returns false when other possible turns leads to service roads; */ bool KeepRoundaboutTurnByHighwayClass(CarDirection turn, TurnCandidates const & possibleTurns, - TurnInfo const & turnInfo) + TurnInfo const & turnInfo, NumMwmIds const & numMwmIds) { for (auto const & t : possibleTurns.candidates) { - if (t.m_segmentRange == turnInfo.m_outgoing.m_segmentRange) + if (t.m_segment == turnInfo.m_outgoing.m_segmentRange.GetFirstSegment(numMwmIds)) continue; if (static_cast(t.highwayClass) != static_cast(ftypes::HighwayClass::Service)) return true; @@ -252,7 +252,7 @@ bool TurnInfo::IsSegmentsValid() const return true; } -IRouter::ResultCode MakeTurnAnnotation(turns::IRoutingResult const & result, +IRouter::ResultCode MakeTurnAnnotation(turns::IRoutingResult const & result, NumMwmIds const & numMwmIds, RouterDelegate const & delegate, vector & junctions, Route::TTurns & turnsDir, Route::TStreets & streets, vector & segments) @@ -286,7 +286,7 @@ IRouter::ResultCode MakeTurnAnnotation(turns::IRoutingResult const & result, turns::TurnInfo turnInfo(loadedSegments[segmentIndex - 1], *loadedSegmentIt); if (turnItem.m_turn == turns::CarDirection::None) - turns::GetTurnDirection(result, turnInfo, turnItem); + turns::GetTurnDirection(result, numMwmIds, turnInfo, turnItem); // Lane information. if (turnItem.m_turn != turns::CarDirection::None) @@ -537,7 +537,8 @@ CarDirection IntermediateDirection(const double angle) return FindDirectionByAngle(kLowerBounds, angle); } -void GetTurnDirection(IRoutingResult const & result, TurnInfo & turnInfo, TurnItem & turn) +void GetTurnDirection(IRoutingResult const & result, NumMwmIds const & numMwmIds, + TurnInfo & turnInfo, TurnItem & turn) { if (!turnInfo.IsSegmentsValid() || turnInfo.m_ingoing.m_segmentRange.IsEmpty()) return; @@ -586,9 +587,9 @@ void GetTurnDirection(IRoutingResult const & result, TurnInfo & turnInfo, TurnIt } else { - if (nodes.candidates.front().m_segmentRange == turnInfo.m_outgoing.m_segmentRange) + if (nodes.candidates.front().m_segment == turnInfo.m_outgoing.m_segmentRange.GetFirstSegment(numMwmIds)) turn.m_turn = LeftmostDirection(turnAngle); - else if (nodes.candidates.back().m_segmentRange == turnInfo.m_outgoing.m_segmentRange) + else if (nodes.candidates.back().m_segment == turnInfo.m_outgoing.m_segmentRange.GetFirstSegment(numMwmIds)) turn.m_turn = RightmostDirection(turnAngle); else turn.m_turn = intermediateDirection; @@ -597,14 +598,14 @@ void GetTurnDirection(IRoutingResult const & result, TurnInfo & turnInfo, TurnIt if (turnInfo.m_ingoing.m_onRoundabout || turnInfo.m_outgoing.m_onRoundabout) { bool const keepTurnByHighwayClass = - KeepRoundaboutTurnByHighwayClass(turn.m_turn, nodes, turnInfo); + KeepRoundaboutTurnByHighwayClass(turn.m_turn, nodes, turnInfo, numMwmIds); turn.m_turn = GetRoundaboutDirection(turnInfo.m_ingoing.m_onRoundabout, turnInfo.m_outgoing.m_onRoundabout, hasMultiTurns, keepTurnByHighwayClass); return; } - bool const keepTurnByHighwayClass = KeepTurnByHighwayClass(turn.m_turn, nodes, turnInfo); + bool const keepTurnByHighwayClass = KeepTurnByHighwayClass(turn.m_turn, nodes, turnInfo, numMwmIds); if (!turn.m_keepAnyway && !keepTurnByHighwayClass) { turn.m_turn = CarDirection::None; diff --git a/routing/turns_generator.hpp b/routing/turns_generator.hpp index b221c18f34..e50b59db67 100644 --- a/routing/turns_generator.hpp +++ b/routing/turns_generator.hpp @@ -8,6 +8,8 @@ #include "routing/turn_candidate.hpp" #include "routing/segment.hpp" +#include "routing_common/num_mwm_id.hpp" + #include "traffic/traffic_info.hpp" #include "std/function.hpp" @@ -43,7 +45,7 @@ using TGetIndexFunction = function)>; * \param traffic road traffic information. * \return routing operation result code. */ -IRouter::ResultCode MakeTurnAnnotation(turns::IRoutingResult const & result, +IRouter::ResultCode MakeTurnAnnotation(turns::IRoutingResult const & result, NumMwmIds const & numMwmIds, RouterDelegate const & delegate, vector & points, Route::TTurns & turnsDir, Route::TStreets & streets, vector & segments); @@ -128,7 +130,8 @@ CarDirection GetRoundaboutDirection(bool isIngoingEdgeRoundabout, bool isOutgoin * \param turnInfo is used for cashing some information while turn calculation. * \param turn is used for keeping the result of turn calculation. */ -void GetTurnDirection(IRoutingResult const & result, turns::TurnInfo & turnInfo, TurnItem & turn); +void GetTurnDirection(IRoutingResult const & result, NumMwmIds const & numMwmIds, + turns::TurnInfo & turnInfo, TurnItem & turn); /*! * \brief Finds an U-turn that starts from master segment and returns how many segments it lasts.