载入中...
搜索中...
未找到
RoadNetworkEditTarget.cpp
浏览该文件的文档.
53bool readSmallInt(const EditorValue& value, const char* name, int minimum, int maximum, int& output);
62 auto sampleEdge = [](const procgen::road::RoadEdge& edge) -> Result<std::vector<ParameterSample>> {
114 if (firstParameter <= epsilon || firstParameter >= 1.f - epsilon || secondParameter <= epsilon ||
154 if (!readId(value, "id", id) || !readSmallInt(value, "junctionControl", 0, 3, encoded)) return false;
159EditorValue encodeEdge(std::uint32_t id, const std::vector<procgen::road::RoadControlPoint>& points) {
163 encoded.emplace_back(EditorValue::Array{EditorValue(point.x), EditorValue(point.y), EditorValue(point.z)});
193 readNumber(value, "curbWidth", style.curbWidth) && readNumber(value, "curbHeight", style.curbHeight) &&
196 readNumber(value, "deckThickness", style.deckThickness) && readNumber(value, "pierWidth", style.pierWidth) &&
197 readNumber(value, "pierDepth", style.pierDepth) && readNumber(value, "pierSpacing", style.pierSpacing) &&
199 readNumber(value, "markingWidth", style.markingWidth) && readNumber(value, "dashLength", style.dashLength) &&
209bool decodeEdge(const EditorValue& value, std::uint32_t& id, std::vector<procgen::road::RoadControlPoint>& points) {
241 if (!readId(value, "id", node.id) || !readNumber(value, "x", node.x) || !readNumber(value, "y", node.y) ||
255bool readSmallInt(const EditorValue& value, const char* name, int minimum, int maximum, int& output) {
274 if (!readId(value, "inEdge", link.inEdge) || !readSmallInt(value, "inLane", 0, 7, link.inLane) ||
284EditorValue encodeBlockedLink(const procgen::road::RoadLaneConnection& link, bool restoreActive) {
290bool decodeBlockedLink(const EditorValue& value, procgen::road::RoadLaneConnection& link, bool& restoreActive) {
296bool sameLink(const procgen::road::RoadLaneConnection& left, const procgen::road::RoadLaneConnection& right) {
309bool decodeLinks(const EditorValue& value, std::vector<procgen::road::RoadLaneConnection>& links) {
336bool decodeLaneCounts(const EditorValue& value, std::uint32_t& edgeId, int& lanesForward, int& lanesBackward,
367bool decodeReconnectEndpoint(EditorValue const& value, std::uint32_t& edgeId, bool& fromEndpoint,
380EditorValue encodeDetachEndpoint(std::uint32_t edgeId, bool fromEndpoint, std::uint32_t nodeId) {
420EditorValue encodeSplit(std::uint32_t edgeId, std::size_t controlPointIndex, float junctionRadius,
429bool decodeSplit(const EditorValue& value, std::uint32_t& edgeId, std::size_t& controlPointIndex,
441EditorValue encodePositionSplit(std::uint32_t edgeId, procgen::road::RoadControlPoint position, float maxDistance,
463EditorValue encodeMergeNodes(std::uint32_t keepNodeId, std::uint32_t removeNodeId, float maxDistance) {
469bool decodeMergeNodes(const EditorValue& value, std::uint32_t& keepNodeId, std::uint32_t& removeNodeId,
552EditorValue encodeConnectAtPosition(std::uint32_t edgeId, procgen::road::RoadControlPoint position,
568 return decodePositionSplit(value, edgeId, position, maxDistance, junctionRadius, nodeId, secondEdgeId) &&
577 auto object = *encodeUnsplit(original, originalLinks, originalBlockedLinks, nodeId, secondEdgeId)
588 return decodeUnsplit(value, original, originalLinks, originalBlockedLinks, nodeId, secondEdgeId) &&
611bool decodePoint(const EditorValue& value, const char* name, procgen::road::RoadControlPoint& point) {
629 return readId(value, "firstEdgeId", firstEdgeId) && readId(value, "secondEdgeId", secondEdgeId) &&
634 readNumber(value, "junctionRadius", junctionRadius) && readId(value, "firstNodeId", firstNodeId) &&
672 const auto* encodedBlockedLinks = blockedValue ? blockedValue->getIf<EditorValue::Array>() : nullptr;
723 !readId(value, "to", edge.to) || !readSmallInt(value, "lanesForward", 0, 8, edge.lanesForward) ||
728 if (!encodedStyle || !decodeStyle(*encodedStyle, styleEdgeId, edge.style) || styleEdgeId != edge.id) return false;
732 const auto* blockedArray = encodedBlocked ? encodedBlocked->getIf<EditorValue::Array>() : nullptr;
757editing::GizmoPrimitive linePrimitive(std::string id, const procgen::road::RoadControlPoint& from,
778RoadNetworkEditTarget::RoadNetworkEditTarget(std::string id, procgen::road::RoadNetwork& network)
786RoadNetworkEditTarget::RoadNetworkEditTarget(std::string id, std::unique_ptr<procgen::road::RoadNetwork> candidate)
800editing::GizmoSnapshot RoadNetworkEditTarget::gizmo(std::size_t maximumPrimitives, bool showLabels) const {
874 for (const auto& link : network_->blockedLaneLinks()) blockedLaneLinks.push_back(encodeLink(link));
897 if (!schema || *schema != "eve.procgen.roadNetwork" || !version || *version != 1 || !nodes || !edges ||
902 if (nodes->size() > maximumNodes || edges->size() > maximumEdges || links->size() > maximumLinks ||
910 return reject<void>("editor.road.invalid-snapshot-node", "Road snapshot contains an invalid node");
918 return reject<void>("editor.road.invalid-snapshot-edge", "Road snapshot contains an invalid edge");
949std::unique_ptr<editing::IDomainOperationTarget> RoadNetworkEditTarget::cloneDomainState() const {
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
eve::OptionalRef< C > capability()
Query a capability through its interface-owned stable identity.
Definition EditableTarget.h:82
Optional capability exposing a deterministic, persistence-safe editing snapshot.
Definition EditableTarget.h:247
static CapabilityId editingCapabilityId()
Stable capability identity shared by every editable domain target.
Definition EditableTarget.h:252
Deterministic owning value tree shared by authoring hosts.
Definition EditingValue.h:19
Owning multi-segment 3D spline with deterministic bounded sampling.
Definition SplinePath.h:91
Result< void > setKindResult(std::string_view kind)
Select linear, catmullRom, quadraticBezier, or cubic bezier interpolation.
Definition SplinePath.cpp:41
Owning directed road graph with lane connectivity.
Definition RoadNetwork.h:19
Result< void > addLaneLink(RoadLaneConnection link)
Register one legal turn inside a shared junction node.
Definition RoadNetwork.cpp:356
Result< void > restoreNode(RoadNode node)
Restore a node with an explicit stable id for undo/import paths.
Definition RoadNetwork.cpp:230
Result< void > validate() const
Validate graph, endpoint and lane-link invariants without mutation.
Definition RoadNetwork.cpp:467
Result< bool > blockLaneLink(RoadLaneConnection link)
Persistently forbid one exact legal lane connection and remove it if currently active.
Definition RoadNetwork.cpp:372
const std::vector< RoadLaneConnection > & laneLinks() const noexcept
Lane links.
Definition RoadNetwork.h:249
const std::vector< RoadLaneConnection > & blockedLaneLinks() const noexcept
Borrow deterministic persistent turn prohibitions until the next network mutation.
Definition RoadNetwork.h:251
Result< void > restoreEdge(RoadEdge edge)
Restore an edge with an explicit stable id for undo/import paths.
Definition RoadNetwork.cpp:295
Transaction target that edits stable RoadNetwork node/edge ids.
Definition RoadNetworkEditTarget.h:27
EVENGINE_API_ORCHESTRATION EditorResult< void > loadSnapshot(const EditorValue &snapshot)
Atomically replace the network from a validated version-one snapshot.
Definition RoadNetworkEditTarget.cpp:884
EVENGINE_API_ORCHESTRATION EditorResult< void > commitDomainState(std::unique_ptr< editing::IDomainOperationTarget > candidate) override
Definition RoadNetworkEditTarget.cpp:954
EVENGINE_API_ORCHESTRATION editing::TargetDescriptor describe() const override
Describe the target for tools and automation.
Definition RoadNetworkEditTarget.cpp:789
EVENGINE_API_ORCHESTRATION std::unique_ptr< editing::IDomainOperationTarget > cloneDomainState() const override
Clone the complete target state into an owning detached candidate.
Definition RoadNetworkEditTarget.cpp:949
EVENGINE_API_ORCHESTRATION EditorValue snapshotValue() const override
Serialize the complete editable network as eve.procgen.roadNetwork schema version 1.
Definition RoadNetworkEditTarget.cpp:860
EVENGINE_API_ORCHESTRATION void * queryCapability(const editing::CapabilityId &capability) override
Query an optional stable capability.
Definition RoadNetworkEditTarget.cpp:794
EVENGINE_API_ORCHESTRATION editing::GizmoSnapshot gizmo(std::size_t maximumPrimitives=4096, bool showLabels=true) const
Build a renderer-neutral authoring overlay from stable road identities.
Definition RoadNetworkEditTarget.cpp:800
static EVENGINE_API_ORCHESTRATION std::unique_ptr< RoadNetworkEditTarget > createOwned(std::string id)
Create an editor-owned empty road target for automation/composition hosts.
Definition RoadNetworkEditTarget.cpp:781
EVENGINE_API_ORCHESTRATION RoadNetworkEditTarget(std::string id, procgen::road::RoadNetwork &network)
Bind an editor target to an externally owned road network.
Definition RoadNetworkEditTarget.cpp:778
Result< T > applied(T value, std::vector< Diagnostic > diagnostics={})
Construct an Applied result with an owning payload and optional diagnostics.
Definition EditingResult.h:43
Diagnostic ruleDiagnostic(eve::DiagnosticCode code, RuleId rule, DiagnosticSeverity severity, std::string message)
Build a common diagnostic carrying an open editing rule identity.
Definition EditingResult.h:25
RoadJunctionControl
Authoritative traffic-control policy applied to every approach of one junction node.
Definition RoadTypes.h:43
@ Uncontrolled
Edge trafficPriority resolves right-of-way without a mandatory stop.
RoadLaneDirection
Travel direction of a lane relative to the authored edge centerline.
Definition RoadTypes.h:79
EditorValue encodeReconnectEndpoint(std::uint32_t edgeId, bool fromEndpoint, std::uint32_t nodeId, const std::vector< procgen::road::RoadLaneConnection > &restoreLinks, const std::vector< procgen::road::RoadLaneConnection > &restoreBlockedLinks)
Definition RoadNetworkEditTarget.cpp:356
EditorValue encodeNode(std::uint32_t id, float x, float y, float z)
Definition RoadNetworkEditTarget.cpp:134
bool decodeEdge(const EditorValue &value, std::uint32_t &id, std::vector< procgen::road::RoadControlPoint > &points)
Definition RoadNetworkEditTarget.cpp:209
editing::GizmoPrimitive linePrimitive(std::string id, const procgen::road::RoadControlPoint &from, const procgen::road::RoadControlPoint &to)
Definition RoadNetworkEditTarget.cpp:757
bool decodeReattachEndpoint(const EditorValue &value, std::uint32_t &edgeId, bool &fromEndpoint, std::uint32_t &oldNodeId, std::uint32_t &detachedNodeId, std::vector< procgen::road::RoadLaneConnection > &restoreLinks, std::vector< procgen::road::RoadLaneConnection > &restoreBlockedLinks)
Definition RoadNetworkEditTarget.cpp:406
bool decodeDisconnectAtPosition(const EditorValue &value, procgen::road::RoadEdge &original, std::vector< procgen::road::RoadLaneConnection > &originalLinks, std::vector< procgen::road::RoadLaneConnection > &originalBlockedLinks, std::uint32_t &nodeId, std::uint32_t &secondEdgeId, std::uint32_t &branchEdgeId)
Definition RoadNetworkEditTarget.cpp:583
EditorValue encodeIntersectionConnect(std::uint32_t firstEdgeId, std::uint32_t secondEdgeId, float firstParameter, float secondParameter, procgen::road::RoadControlPoint mergedPoint, float maximumHeightDelta, float junctionRadius, const procgen::road::RoadEdgeSplitResult &firstSplit, const procgen::road::RoadEdgeSplitResult &secondSplit)
Definition RoadNetworkEditTarget.cpp:592
bool decodeDetachEndpoint(const EditorValue &value, std::uint32_t &edgeId, bool &fromEndpoint, std::uint32_t &nodeId)
Definition RoadNetworkEditTarget.cpp:386
bool readOptionalBool(const EditorValue &value, const char *name, bool &output)
Definition RoadNetworkEditTarget.cpp:44
EditorValue encodeSplit(std::uint32_t edgeId, std::size_t controlPointIndex, float junctionRadius, const procgen::road::RoadEdgeSplitResult &result)
Definition RoadNetworkEditTarget.cpp:420
EditorValue encodeDisconnectAtPosition(const procgen::road::RoadEdge &original, const std::vector< procgen::road::RoadLaneConnection > &originalLinks, const std::vector< procgen::road::RoadLaneConnection > &originalBlockedLinks, std::uint32_t nodeId, std::uint32_t secondEdgeId, std::uint32_t branchEdgeId)
Definition RoadNetworkEditTarget.cpp:572
bool decodeMergeNodes(const EditorValue &value, std::uint32_t &keepNodeId, std::uint32_t &removeNodeId, float &maxDistance)
Definition RoadNetworkEditTarget.cpp:469
bool decodeNodeRecord(const EditorValue &value, procgen::road::RoadNode &node)
Definition RoadNetworkEditTarget.cpp:240
bool readOptionalNumber(const EditorValue &value, const char *name, float &output)
Definition RoadNetworkEditTarget.cpp:40
bool decodeLink(const EditorValue &value, procgen::road::RoadLaneConnection &link)
Definition RoadNetworkEditTarget.cpp:272
bool decodeStyle(const EditorValue &value, std::uint32_t &id, procgen::road::RoadStyle &style)
Definition RoadNetworkEditTarget.cpp:191
EditorValue encodeUnmergeNodes(const procgen::road::RoadNode &removedNode, const std::vector< procgen::road::RoadEdge > &affectedEdges, const std::vector< procgen::road::RoadLaneConnection > &affectedLinks, const std::vector< procgen::road::RoadLaneConnection > &affectedBlockedLinks)
Definition RoadNetworkEditTarget.cpp:475
EditorValue encodeConnectAtPosition(std::uint32_t edgeId, procgen::road::RoadControlPoint position, float maxDistance, float junctionRadius, const procgen::road::RoadEdgeSplitResult &split, const procgen::road::RoadEdge &branch)
Definition RoadNetworkEditTarget.cpp:552
EditorValue encodeLink(const procgen::road::RoadLaneConnection &link)
Definition RoadNetworkEditTarget.cpp:263
bool readId(const EditorValue &value, const char *name, std::uint32_t &output)
Definition RoadNetworkEditTarget.cpp:22
bool decodeLinks(const EditorValue &value, std::vector< procgen::road::RoadLaneConnection > &links)
Definition RoadNetworkEditTarget.cpp:309
bool decodePoint(const EditorValue &value, const char *name, procgen::road::RoadControlPoint &point)
Definition RoadNetworkEditTarget.cpp:611
bool sameLink(const procgen::road::RoadLaneConnection &left, const procgen::road::RoadLaneConnection &right)
Definition RoadNetworkEditTarget.cpp:296
EditorValue encodeIntersectionDisconnect(const procgen::road::RoadEdge &first, const procgen::road::RoadEdge &second, const std::vector< procgen::road::RoadLaneConnection > &links, const std::vector< procgen::road::RoadLaneConnection > &blockedLinks, std::uint32_t sharedNodeId, std::uint32_t firstSecondEdgeId, std::uint32_t secondSecondEdgeId)
Definition RoadNetworkEditTarget.cpp:640
const EditorValue * field(const EditorValue &value, const char *name)
Definition RoadNetworkEditTarget.cpp:15
EditorValue encodeMergeNodes(std::uint32_t keepNodeId, std::uint32_t removeNodeId, float maxDistance)
Definition RoadNetworkEditTarget.cpp:463
EditorValue encodeEdge(std::uint32_t id, const std::vector< procgen::road::RoadControlPoint > &points)
Definition RoadNetworkEditTarget.cpp:159
bool decodePositionSplit(const EditorValue &value, std::uint32_t &edgeId, procgen::road::RoadControlPoint &position, float &maxDistance, float &junctionRadius, std::uint32_t &nodeId, std::uint32_t &secondEdgeId)
Definition RoadNetworkEditTarget.cpp:453
EditorValue encodeNodeRadius(std::uint32_t id, float junctionRadius)
Definition RoadNetworkEditTarget.cpp:138
bool decodeUnmergeNodes(const EditorValue &value, procgen::road::RoadNode &removedNode, std::vector< procgen::road::RoadEdge > &affectedEdges, std::vector< procgen::road::RoadLaneConnection > &affectedLinks, std::vector< procgen::road::RoadLaneConnection > &affectedBlockedLinks)
Definition RoadNetworkEditTarget.cpp:494
bool decodeNodeRadius(const EditorValue &value, std::uint32_t &id, float &junctionRadius)
Definition RoadNetworkEditTarget.cpp:142
bool decodeLaneCounts(const EditorValue &value, std::uint32_t &edgeId, int &lanesForward, int &lanesBackward, std::vector< procgen::road::RoadLaneConnection > &restoreLinks, std::vector< procgen::road::RoadLaneConnection > &restoreBlockedLinks)
Definition RoadNetworkEditTarget.cpp:336
bool decodeUnsplit(const EditorValue &value, procgen::road::RoadEdge &edge, std::vector< procgen::road::RoadLaneConnection > &links, std::vector< procgen::road::RoadLaneConnection > &blockedLinks, std::uint32_t &nodeId, std::uint32_t &secondEdgeId)
Definition RoadNetworkEditTarget.cpp:543
bool readNumber(const EditorValue &value, const char *name, float &output)
Definition RoadNetworkEditTarget.cpp:30
EditorValue encodeEdgeRecord(const procgen::road::RoadEdge &edge, const std::vector< procgen::road::RoadLaneConnection > &links, const std::vector< procgen::road::RoadLaneConnection > &blockedLinks)
Definition RoadNetworkEditTarget.cpp:699
EditorValue encodeNodeControl(std::uint32_t id, procgen::road::RoadJunctionControl control)
Definition RoadNetworkEditTarget.cpp:146
bool decodeIntersectionDisconnect(const EditorValue &value, procgen::road::RoadEdge &first, procgen::road::RoadEdge &second, std::vector< procgen::road::RoadLaneConnection > &links, std::vector< procgen::road::RoadLaneConnection > &blockedLinks, std::uint32_t &sharedNodeId, std::uint32_t &firstSecondEdgeId, std::uint32_t &secondSecondEdgeId)
Definition RoadNetworkEditTarget.cpp:661
EditorValue encodeUnsplit(const procgen::road::RoadEdge &edge, const std::vector< procgen::road::RoadLaneConnection > &links, const std::vector< procgen::road::RoadLaneConnection > &blockedLinks, std::uint32_t nodeId, std::uint32_t secondEdgeId)
Definition RoadNetworkEditTarget.cpp:534
bool decodeIntersectionConnect(const EditorValue &value, std::uint32_t &firstEdgeId, std::uint32_t &secondEdgeId, float &firstParameter, float &secondParameter, procgen::road::RoadControlPoint &mergedPoint, float &maximumHeightDelta, float &junctionRadius, std::uint32_t &firstNodeId, std::uint32_t &firstSecondEdgeId, std::uint32_t &secondNodeId, std::uint32_t &secondSecondEdgeId)
Definition RoadNetworkEditTarget.cpp:623
EditorValue encodeDetachEndpoint(std::uint32_t edgeId, bool fromEndpoint, std::uint32_t nodeId)
Definition RoadNetworkEditTarget.cpp:380
bool decodeConnectAtPosition(const EditorValue &value, std::uint32_t &edgeId, procgen::road::RoadControlPoint &position, float &maxDistance, float &junctionRadius, std::uint32_t &nodeId, std::uint32_t &secondEdgeId, procgen::road::RoadEdge &branch)
Definition RoadNetworkEditTarget.cpp:562
bool decodeBlockedLink(const EditorValue &value, procgen::road::RoadLaneConnection &link, bool &restoreActive)
Definition RoadNetworkEditTarget.cpp:290
bool decodeReconnectEndpoint(EditorValue const &value, std::uint32_t &edgeId, bool &fromEndpoint, std::uint32_t &nodeId, std::vector< procgen::road::RoadLaneConnection > &restoreLinks, std::vector< procgen::road::RoadLaneConnection > &restoreBlockedLinks)
Definition RoadNetworkEditTarget.cpp:367
bool readSmallInt(const EditorValue &value, const char *name, int minimum, int maximum, int &output)
Definition RoadNetworkEditTarget.cpp:255
EditorValue encodeLinks(const std::vector< procgen::road::RoadLaneConnection > &links)
Definition RoadNetworkEditTarget.cpp:302
bool decodeSplit(const EditorValue &value, std::uint32_t &edgeId, std::size_t &controlPointIndex, float &junctionRadius, std::uint32_t &nodeId, std::uint32_t &secondEdgeId)
Definition RoadNetworkEditTarget.cpp:429
bool decodeEdgeRecord(const EditorValue &value, procgen::road::RoadEdge &edge, std::vector< procgen::road::RoadLaneConnection > &links, std::vector< procgen::road::RoadLaneConnection > *blockedLinks)
Definition RoadNetworkEditTarget.cpp:719
EditorValue encodeReattachEndpoint(std::uint32_t edgeId, bool fromEndpoint, std::uint32_t oldNodeId, std::uint32_t detachedNodeId, const std::vector< procgen::road::RoadLaneConnection > &restoreLinks, const std::vector< procgen::road::RoadLaneConnection > &restoreBlockedLinks)
Definition RoadNetworkEditTarget.cpp:394
Result< RoadIntersection > findUniqueInteriorIntersection(const procgen::road::RoadEdge &first, const procgen::road::RoadEdge &second, float maximumHeightDelta)
Definition RoadNetworkEditTarget.cpp:55
bool decodeNodeControl(const EditorValue &value, std::uint32_t &id, procgen::road::RoadJunctionControl &control)
Definition RoadNetworkEditTarget.cpp:151
EditorValue encodeLaneCounts(std::uint32_t edgeId, int lanesForward, int lanesBackward, const std::vector< procgen::road::RoadLaneConnection > &restoreLinks, const std::vector< procgen::road::RoadLaneConnection > &restoreBlockedLinks)
Definition RoadNetworkEditTarget.cpp:323
EditorValue encodeBlockedLink(const procgen::road::RoadLaneConnection &link, bool restoreActive)
Definition RoadNetworkEditTarget.cpp:284
EditorValue encodePositionSplit(std::uint32_t edgeId, procgen::road::RoadControlPoint position, float maxDistance, float junctionRadius, const procgen::road::RoadEdgeSplitResult &result)
Definition RoadNetworkEditTarget.cpp:441
EditorValue encodeStyle(std::uint32_t id, const procgen::road::RoadStyle &style)
Definition RoadNetworkEditTarget.cpp:167
EditorValue encodeNodeRecord(const procgen::road::RoadNode &node)
Definition RoadNetworkEditTarget.cpp:231
Definition HeightmapBrush.h:9
@ PreconditionViolation
Definition Container.h:602
Renderer-neutral wire primitive for authoring viewport overlays.
Definition EditingGizmo.h:12
Immutable revision-tagged overlay snapshot consumed by any viewport renderer.
Definition EditingGizmo.h:27
std::vector< GizmoPrimitive > primitives
Definition EditingGizmo.h:31
std::vector< Diagnostic > diagnostics
Definition EditingGizmo.h:32
Stable discovery metadata exposed by every editable target.
Definition EditableTarget.h:39
One spline anchor with incoming and outgoing handle offsets.
Definition SplinePath.h:15
One authored control point on a road centerline (world space, Y-up).
Definition RoadTypes.h:12
Stable identities produced by one atomic edge split.
Definition RoadTypes.h:72
Directed centerline edge with optional reverse lanes.
Definition RoadTypes.h:61
One legal lane-to-lane connection inside a junction.
Definition RoadTypes.h:90
RoadLaneDirection outDirection
Definition RoadTypes.h:96
RoadLaneDirection inDirection
Definition RoadTypes.h:95
Cross-section and structural style for one road edge.
Definition RoadTypes.h:19
float sideObjectStartOffset
Empty distance before the first side-object anchor.
Definition RoadTypes.h:36
int trafficPriority
Higher incoming-road values win uncontrolled junction priority.
Definition RoadTypes.h:35