载入中...
搜索中...
未找到
RoadNetwork.h
浏览该文件的文档.
1#pragma once
2
4
5#include <cstddef>
6#include <cstdint>
7#include <string>
8#include <unordered_map>
9#include <vector>
10
11namespace eve::procgen::road {
12
20public:
22 [[nodiscard]] Result<std::uint32_t> addNode(float x, float y, float z, float junctionRadius = 6.f);
28 [[nodiscard]] Result<void> restoreNode(RoadNode node);
33 [[nodiscard]] Result<std::uint32_t> addEdge(std::uint32_t from, std::uint32_t to,
34 std::vector<RoadControlPoint> controlPoints, int lanesForward = 2,
35 int lanesBackward = 0, RoadStyle style = {});
41 [[nodiscard]] Result<void> restoreEdge(RoadEdge edge);
43 [[nodiscard]] Result<void> addLaneLink(RoadLaneConnection link);
49 [[nodiscard]] Result<void> removeLaneLink(const RoadLaneConnection& link);
55 [[nodiscard]] Result<bool> blockLaneLink(RoadLaneConnection link);
57 [[nodiscard]] Result<void> unblockLaneLink(const RoadLaneConnection& link);
69 [[nodiscard]] Result<int> connectAllTurns(std::uint32_t nodeId);
75 [[nodiscard]] Result<void> validate() const;
84 [[nodiscard]] Result<void> setNodePosition(std::uint32_t nodeId, float x, float y, float z);
91 [[nodiscard]] Result<void> setNodeJunctionRadius(std::uint32_t nodeId, float junctionRadius);
98 [[nodiscard]] Result<void> setNodeJunctionControl(std::uint32_t nodeId, RoadJunctionControl control);
108 [[nodiscard]] Result<int> mergeNodes(std::uint32_t keepNodeId, std::uint32_t removeNodeId,
109 float maxDistance);
116 [[nodiscard]] Result<void> setEdgeControlPoints(std::uint32_t edgeId, std::vector<RoadControlPoint> controlPoints);
124 [[nodiscard]] Result<int> setEdgeLaneCounts(std::uint32_t edgeId, int lanesForward, int lanesBackward);
133 [[nodiscard]] Result<void> reverseEdge(std::uint32_t edgeId);
142 [[nodiscard]] Result<int> reconnectEdgeEndpoint(std::uint32_t edgeId, bool fromEndpoint,
143 std::uint32_t nodeId);
152 [[nodiscard]] Result<std::uint32_t> detachEdgeEndpoint(std::uint32_t edgeId, bool fromEndpoint);
154 [[nodiscard]] Result<std::uint32_t> detachEdgeEndpoint(std::uint32_t edgeId, bool fromEndpoint,
155 std::uint32_t nodeId);
165 [[nodiscard]] Result<RoadEdgeSplitResult> splitEdge(std::uint32_t edgeId, std::size_t controlPointIndex,
166 float junctionRadius = 6.f);
167
178 [[nodiscard]] Result<RoadEdgeSplitResult> splitEdge(std::uint32_t edgeId, std::size_t controlPointIndex,
179 float junctionRadius, std::uint32_t nodeId,
180 std::uint32_t secondEdgeId);
190 [[nodiscard]] Result<RoadEdgeSplitResult> splitEdgeAtPosition(std::uint32_t edgeId, RoadControlPoint position,
191 float maxDistance, float junctionRadius = 6.f);
193 [[nodiscard]] Result<RoadEdgeSplitResult> splitEdgeAtPosition(std::uint32_t edgeId, RoadControlPoint position,
194 float maxDistance, float junctionRadius,
195 std::uint32_t nodeId,
196 std::uint32_t secondEdgeId);
208 [[nodiscard]] Result<RoadEdgeSplitResult> splitEdgeAtSplineParameter(std::uint32_t edgeId, float parameter,
209 float junctionRadius = 6.f,
210 std::uint32_t nodeId = 0,
211 std::uint32_t secondEdgeId = 0);
213 [[nodiscard]] Result<void> setEdgeStyle(std::uint32_t edgeId, RoadStyle style);
219 [[nodiscard]] Result<void> removeEdge(std::uint32_t edgeId);
225 [[nodiscard]] Result<void> removeNode(std::uint32_t nodeId);
227 void clear();
228
230 [[nodiscard]] int nodeCount() const noexcept { return static_cast<int>(nodes_.size()); }
232 [[nodiscard]] int edgeCount() const noexcept { return static_cast<int>(edges_.size()); }
234 [[nodiscard]] int laneLinkCount() const noexcept { return static_cast<int>(laneLinks_.size()); }
236 [[nodiscard]] int blockedLaneLinkCount() const noexcept { return static_cast<int>(blockedLaneLinks_.size()); }
238 [[nodiscard]] std::uint64_t revision() const noexcept { return revision_; }
239
241 [[nodiscard]] Result<RoadNode> nodeResult(std::uint32_t id) const;
243 [[nodiscard]] Result<RoadEdge> edgeResult(std::uint32_t id) const;
245 [[nodiscard]] const std::vector<RoadNode>& nodes() const noexcept { return nodes_; }
247 [[nodiscard]] const std::vector<RoadEdge>& edges() const noexcept { return edges_; }
249 [[nodiscard]] const std::vector<RoadLaneConnection>& laneLinks() const noexcept { return laneLinks_; }
251 [[nodiscard]] const std::vector<RoadLaneConnection>& blockedLaneLinks() const noexcept {
252 return blockedLaneLinks_;
253 }
254
256 [[nodiscard]] static Result<RoadNetwork> makeInterchange(float span = 48.f, float bridgeHeight = 8.f, int lanes = 2,
257 std::uint32_t seed = 1);
258
260 [[nodiscard]] static Result<RoadNetwork> makeStraight(float length = 36.f, int lanes = 2);
262 [[nodiscard]] static Result<RoadNetwork> makeCurve(float radius = 18.f, int lanes = 2);
264 [[nodiscard]] static Result<RoadNetwork> makeBridge(float length = 36.f, float height = 6.f, int lanes = 2);
266 [[nodiscard]] static Result<RoadNetwork> makeCross(float span = 32.f, int lanes = 2);
268 [[nodiscard]] static Result<RoadNetwork> makeTee(float span = 32.f, int lanes = 2);
270 [[nodiscard]] static Result<RoadNetwork> makeY(float span = 32.f, int lanes = 2);
279 [[nodiscard]] static Result<RoadNetwork> makeFan(float span, int lanes, std::vector<float> armAnglesDeg,
280 std::vector<bool> intoHub = {});
282 [[nodiscard]] static Result<RoadNetwork> makeFork(float span = 32.f, int lanes = 2);
284 [[nodiscard]] static Result<RoadNetwork> makeSkew(float span = 32.f, int lanes = 2);
286 [[nodiscard]] static Result<RoadNetwork> makeRoundabout(float span = 48.f, int lanes = 1);
287
293 [[nodiscard]] static Result<RoadNetwork> makeScene(const std::string& scene, float span = 36.f,
294 float bridgeHeight = 6.f, int lanes = 2, std::uint32_t seed = 1);
295
296private:
297 [[nodiscard]] Result<void> validateStyle(const RoadStyle& style) const;
298 [[nodiscard]] int findNodeIndex(std::uint32_t id) const;
299 [[nodiscard]] int findEdgeIndex(std::uint32_t id) const;
300 [[nodiscard]] Result<void> validateLaneConnection(const RoadLaneConnection& link) const;
301
302 std::vector<RoadNode> nodes_;
303 std::vector<RoadEdge> edges_;
304 std::vector<RoadLaneConnection> laneLinks_;
305 std::vector<RoadLaneConnection> blockedLaneLinks_;
306 std::unordered_map<std::uint32_t, int> nodeIndex_;
307 std::unordered_map<std::uint32_t, int> edgeIndex_;
308 std::uint32_t nextNodeId_ = 1;
309 std::uint32_t nextEdgeId_ = 1;
310 std::uint64_t revision_ = 0;
311};
312
313} // namespace eve::procgen::road
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
std::string from
float length
Definition CaveMesh.cpp:94
std::string nodeId
#define EVENGINE_API_DOMAINS
Definition Export.h:110
HexCoordinates to
Cell the unit walks towards on this segment.
Definition HexUnits.cpp:64
std::uint32_t height
std::array< float, 3 > position
float radius
std::uint32_t seed
Definition PointSet.cpp:807
std::weak_ptr< PrimitiveScene > scene
const RoadNode * node
const RoadEdge * edge
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Owning directed road graph with lane connectivity.
Definition RoadNetwork.h:19
int nodeCount() const noexcept
Node count.
int edgeCount() const noexcept
Edge count.
const std::vector< RoadEdge > & edges() const noexcept
Edges.
const std::vector< RoadLaneConnection > & laneLinks() const noexcept
Lane links.
int laneLinkCount() const noexcept
Lane link count.
const std::vector< RoadLaneConnection > & blockedLaneLinks() const noexcept
Borrow deterministic persistent turn prohibitions until the next network mutation.
const std::vector< RoadNode > & nodes() const noexcept
Nodes.
int blockedLaneLinkCount() const noexcept
Return persistent exact turn prohibitions owned by this network.
std::uint64_t revision() const noexcept
Revision.
RoadJunctionControl
Authoritative traffic-control policy applied to every approach of one junction node.
Definition RoadTypes.h:43
One authored control point on a road centerline (world space, Y-up).
Definition RoadTypes.h:12
Directed centerline edge with optional reverse lanes.
Definition RoadTypes.h:61
One legal lane-to-lane connection inside a junction.
Definition RoadTypes.h:90
Junction node owned by a road network.
Definition RoadTypes.h:51
Cross-section and structural style for one road edge.
Definition RoadTypes.h:19