From 970eab7cf4fd4096ffafa47730ca418c34c1b832 Mon Sep 17 00:00:00 2001 From: nsubiron Date: Fri, 16 Feb 2018 16:50:06 +0100 Subject: [PATCH 1/2] MapGen: Keep count of the visited half-edges --- .../Carla/Source/Carla/CityMapGenerator.cpp | 75 ++++++++++++------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp index 070dae978..a94818cd4 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp @@ -16,11 +16,32 @@ #include "Paths.h" #include +#include #ifdef CARLA_ROAD_GENERATOR_EXTRA_LOG #include #endif // CARLA_ROAD_GENERATOR_EXTRA_LOG +// ============================================================================= +// -- Private types ------------------------------------------------------------ +// ============================================================================= + +class FHalfEdgeCounter { +public: + + using HalfEdge = MapGen::DoublyConnectedEdgeList::HalfEdge; + + bool IsVisited(const HalfEdge &InHalfEdge) + { + return Set.insert(&InHalfEdge).second && + Set.insert(&MapGen::DoublyConnectedEdgeList::GetPair(InHalfEdge)).second; + } + +private: + + std::unordered_set Set; +}; + // ============================================================================= // -- Constructor and destructor ----------------------------------------------- // ============================================================================= @@ -135,35 +156,39 @@ void ACityMapGenerator::GenerateRoads() const uint32 margin = CityMapMeshTag::GetRoadIntersectionSize() / 2u; + FHalfEdgeCounter HalfEdgeCounter; + // For each edge add road segment. for (auto &edge : graph.GetHalfEdges()) { - auto source = Graph::GetSource(edge).GetPosition(); - auto target = Graph::GetTarget(edge).GetPosition(); + if (HalfEdgeCounter.IsVisited(edge)) { + auto source = Graph::GetSource(edge).GetPosition(); + auto target = Graph::GetTarget(edge).GetPosition(); - if (source.x == target.x) { - // vertical - auto y = 1u + margin + std::min(source.y, target.y); - auto end = std::max(source.y, target.y) - margin; - for (; y < end; ++y) { - AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneLeft, source.x, y, HALF_PI); - AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneRight, source.x, y, HALF_PI); - AddInstance(ECityMapMeshTag::RoadTwoLanes_SidewalkLeft, source.x, y, HALF_PI); - AddInstance(ECityMapMeshTag::RoadTwoLanes_SidewalkRight, source.x, y, HALF_PI); - AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneMarkingBroken, source.x, y, HALF_PI); + if (source.x == target.x) { + // vertical + auto y = 1u + margin + std::min(source.y, target.y); + auto end = std::max(source.y, target.y) - margin; + for (; y < end; ++y) { + AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneLeft, source.x, y, HALF_PI); + AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneRight, source.x, y, HALF_PI); + AddInstance(ECityMapMeshTag::RoadTwoLanes_SidewalkLeft, source.x, y, HALF_PI); + AddInstance(ECityMapMeshTag::RoadTwoLanes_SidewalkRight, source.x, y, HALF_PI); + AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneMarkingBroken, source.x, y, HALF_PI); + } + } else if (source.y == target.y) { + // horizontal + auto x = 1u + margin + std::min(source.x, target.x); + auto end = std::max(source.x, target.x) - margin; + for (; x < end; ++x) { + AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneLeft, x, source.y); + AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneRight, x, source.y); + AddInstance(ECityMapMeshTag::RoadTwoLanes_SidewalkLeft, x, source.y); + AddInstance(ECityMapMeshTag::RoadTwoLanes_SidewalkRight, x, source.y); + AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneMarkingBroken, x, source.y); + } + } else { + UE_LOG(LogCarla, Warning, TEXT("Diagonal edge ignored")); } - } else if (source.y == target.y) { - // horizontal - auto x = 1u + margin + std::min(source.x, target.x); - auto end = std::max(source.x, target.x) - margin; - for (; x < end; ++x) { - AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneLeft, x, source.y); - AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneRight, x, source.y); - AddInstance(ECityMapMeshTag::RoadTwoLanes_SidewalkLeft, x, source.y); - AddInstance(ECityMapMeshTag::RoadTwoLanes_SidewalkRight, x, source.y); - AddInstance(ECityMapMeshTag::RoadTwoLanes_LaneMarkingBroken, x, source.y); - } - } else { - UE_LOG(LogCarla, Warning, TEXT("Diagonal edge ignored")); } } From 3c8f58d4db6e3fda39bdcc6fb5a26f64687e0d18 Mon Sep 17 00:00:00 2001 From: nsubiron Date: Fri, 16 Feb 2018 16:59:42 +0100 Subject: [PATCH 2/2] Rename function --- .../CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp index a94818cd4..b18aa766a 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/CityMapGenerator.cpp @@ -31,7 +31,7 @@ public: using HalfEdge = MapGen::DoublyConnectedEdgeList::HalfEdge; - bool IsVisited(const HalfEdge &InHalfEdge) + bool Insert(const HalfEdge &InHalfEdge) { return Set.insert(&InHalfEdge).second && Set.insert(&MapGen::DoublyConnectedEdgeList::GetPair(InHalfEdge)).second; @@ -160,7 +160,7 @@ void ACityMapGenerator::GenerateRoads() // For each edge add road segment. for (auto &edge : graph.GetHalfEdges()) { - if (HalfEdgeCounter.IsVisited(edge)) { + if (HalfEdgeCounter.Insert(edge)) { auto source = Graph::GetSource(edge).GetPosition(); auto target = Graph::GetTarget(edge).GetPosition();