载入中...
搜索中...
未找到
RoadNetworkEditTarget.h
浏览该文件的文档.
1#pragma once
2
3#include "common/Export.h"
9
10#include <cstddef>
11#include <memory>
12#include <string>
13#include <vector>
14
15namespace eve::procgen_editing {
16
28public:
29 static constexpr const char* kMoveNode = "road.node.move.v1";
30 static constexpr const char* kSetNodeRadius = "road.node.set-radius.v1";
31 static constexpr const char* kSetNodeControl = "road.node.set-junction-control.v1";
32 static constexpr const char* kSetEdgePoints = "road.edge.set-control-points.v1";
33 static constexpr const char* kSetEdgeStyle = "road.edge.set-style.v1";
34 static constexpr const char* kSetEdgeLanes = "road.edge.set-lanes.v1";
35 static constexpr const char* kReverseEdge = "road.edge.reverse.v1";
36 static constexpr const char* kReconnectEdgeEndpoint = "road.edge.reconnect-endpoint.v1";
37 static constexpr const char* kDetachEdgeEndpoint = "road.edge.detach-endpoint.v1";
38 static constexpr const char* kReattachEdgeEndpoint = "road.edge.reattach-endpoint.v1";
39 static constexpr const char* kSplitEdge = "road.edge.split.v1";
40 static constexpr const char* kSplitEdgeAtPosition = "road.edge.split-at-position.v1";
41 static constexpr const char* kUnsplitEdge = "road.edge.unsplit.v1";
42 static constexpr const char* kMergeNodes = "road.node.merge.v1";
43 static constexpr const char* kMergeNodesAndConnect = "road.node.merge-and-connect.v1";
44 static constexpr const char* kUnmergeNodes = "road.node.unmerge.v1";
45 static constexpr const char* kConnectNodeAtPosition = "road.node.connect-at-position.v1";
46 static constexpr const char* kDisconnectNodeAtPosition = "road.node.disconnect-at-position.v1";
47 static constexpr const char* kConnectEdgeIntersection = "road.edge.connect-intersection.v1";
48 static constexpr const char* kDisconnectEdgeIntersection = "road.edge.disconnect-intersection.v1";
49 static constexpr const char* kRestoreNode = "road.node.restore.v1";
50 static constexpr const char* kRemoveNode = "road.node.remove.v1";
51 static constexpr const char* kRestoreEdge = "road.edge.restore.v1";
52 static constexpr const char* kRemoveEdge = "road.edge.remove.v1";
53 static constexpr const char* kRestoreLaneLink = "road.lane-link.restore.v1";
54 static constexpr const char* kRemoveLaneLink = "road.lane-link.remove.v1";
55 static constexpr const char* kBlockLaneLink = "road.lane-link.block.v1";
56 static constexpr const char* kUnblockLaneLink = "road.lane-link.unblock.v1";
57 static constexpr const char* kRestoreLaneLinks = "road.lane-links.restore.v1";
58 static constexpr const char* kRemoveLaneLinks = "road.lane-links.remove.v1";
59
68 [[nodiscard]] static EVENGINE_API_ORCHESTRATION std::unique_ptr<RoadNetworkEditTarget> createOwned(std::string id);
69
70 editing::TargetId targetId() const override { return editing::TargetId(id_); }
71 std::uint64_t revision() const override { return network_->revision(); }
72 editing::EditRegion dirtyRegion() const override { return dirty_; }
73 void clearDirtyRegion() override { dirty_.clear(); }
76
85 [[nodiscard]] EVENGINE_API_ORCHESTRATION editing::GizmoSnapshot gizmo(std::size_t maximumPrimitives = 4096,
86 bool showLabels = true) const;
87
94 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorValue snapshotValue() const override;
102
104 const editing::DomainOperation& operation) override;
105 [[nodiscard]] EVENGINE_API_ORCHESTRATION std::unique_ptr<editing::IDomainOperationTarget> cloneDomainState()
106 const override;
108 std::unique_ptr<editing::IDomainOperationTarget> candidate) override;
109
119 float x, float y,
120 float z) const;
128 std::uint32_t nodeId, float junctionRadius) const;
136 std::uint32_t nodeId, procgen::road::RoadJunctionControl control) const;
146 std::uint32_t keepNodeId, std::uint32_t removeNodeId, float maxDistance) const;
156 std::uint32_t keepNodeId, std::uint32_t removeNodeId, float maxDistance) const;
164 std::uint32_t edgeId, std::vector<procgen::road::RoadControlPoint> points) const;
172 std::uint32_t edgeId, procgen::road::RoadStyle style) const;
181 std::uint32_t edgeId, int lanesForward, int lanesBackward) const;
189 std::uint32_t edgeId) const;
199 std::uint32_t edgeId, bool fromEndpoint, std::uint32_t nodeId) const;
209 std::uint32_t edgeId, bool fromEndpoint, std::uint32_t nodeId) const;
220 std::uint32_t edgeId, bool fromEndpoint, float maxDistance, bool connectTurns = true) const;
229 std::uint32_t edgeId, bool fromEndpoint) const;
238 std::uint32_t edgeId, std::size_t controlPointIndex, float junctionRadius = 6.f) const;
248 std::uint32_t edgeId, procgen::road::RoadControlPoint position, float maxDistance,
249 float junctionRadius = 6.f) const;
264 std::uint32_t sourceNodeId, std::uint32_t edgeId, procgen::road::RoadControlPoint position, float maxDistance,
265 float junctionRadius = 6.f, int lanesForward = 1, int lanesBackward = 0,
266 procgen::road::RoadStyle style = {}) const;
276 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeConnectEdgeIntersection(
277 std::uint32_t firstEdgeId, std::uint32_t secondEdgeId, float maximumHeightDelta = 0.5f,
278 float junctionRadius = 6.f) const;
287 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeAddNode(
288 float x, float y, float z, float junctionRadius = 6.f) const;
294 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeRemoveNode(
295 std::uint32_t nodeId) const;
306 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeAddEdge(
307 std::uint32_t from, std::uint32_t to, std::vector<procgen::road::RoadControlPoint> points, int lanesForward = 2,
308 int lanesBackward = 0, procgen::road::RoadStyle style = {}) const;
321 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeAddEdgeAndConnect(
322 std::uint32_t from, std::uint32_t to, std::vector<procgen::road::RoadControlPoint> points, int lanesForward = 2,
323 int lanesBackward = 0, procgen::road::RoadStyle style = {}) const;
329 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeRemoveEdge(
330 std::uint32_t edgeId) const;
336 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeAddLaneLink(
337 procgen::road::RoadLaneConnection link) const;
343 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeRemoveLaneLink(
344 const procgen::road::RoadLaneConnection& link) const;
346 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeBlockLaneLink(
347 procgen::road::RoadLaneConnection link) const;
349 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeUnblockLaneLink(
350 const procgen::road::RoadLaneConnection& link) const;
356 [[nodiscard]] EVENGINE_API_ORCHESTRATION EditorResult<editing::DomainOperation> makeConnectAllTurns(
357 std::uint32_t nodeId) const;
358
359private:
360 RoadNetworkEditTarget(std::string id, std::unique_ptr<procgen::road::RoadNetwork> candidate);
361 [[nodiscard]] EditorResult<editing::DomainOperation> makeMergeNodesImpl(std::uint32_t keepNodeId,
362 std::uint32_t removeNodeId,
363 float maxDistance,
364 bool connectTurns) const;
365
366 std::string id_;
367 std::unique_ptr<procgen::road::RoadNetwork> candidate_;
368 procgen::road::RoadNetwork* network_ = nullptr;
369 editing::EditRegion dirty_;
370};
371
373[[nodiscard]] EVENGINE_API_ORCHESTRATION editing::Result<void> registerRoadNetworkEditingCommands(
374 editing::IEditingCommandRegistry& registry);
375
376} // namespace eve::procgen_editing
ActionParameterOperation operation
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
std::string from
std::string nodeId
#define EVENGINE_API_ORCHESTRATION
Definition Export.h:111
HexCoordinates to
Cell the unit walks towards on this segment.
Definition HexUnits.cpp:64
std::array< float, 3 > position
std::shared_ptr< const std::vector< glm::vec2 > > points
std::string sourceNodeId
Definition UISystem.cpp:70
Move-only operation result carrying either a value or Status.
Definition Result.h:155
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
Optional candidate/publish capability for atomic domain operations.
Editable-target capability that applies owning domain operations.
IEditableTarget public API.
eve::OptionalRef< C > capability()
Query a capability through its interface-owned stable identity.
Optional capability exposing a deterministic, persistence-safe editing snapshot.
Deterministic owning value tree shared by authoring hosts.
Owning directed road graph with lane connectivity.
Definition RoadNetwork.h:19
std::uint64_t revision() const noexcept
Revision.
Transaction target that edits stable RoadNetwork node/edge ids.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeRemoveLaneLink(const procgen::road::RoadLaneConnection &link) const
Create an undoable removal of one exact manual lane connection.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeBlockLaneLink(procgen::road::RoadLaneConnection link) const
Plan a persistent prohibited turn, atomically removing an active exact link when present.
static constexpr const char * kConnectNodeAtPosition
static constexpr const char * kSplitEdgeAtPosition
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeSetEdgeLaneCounts(std::uint32_t edgeId, int lanesForward, int lanesBackward) const
Create an undoable lane-count replacement, including links invalidated by a shrink.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeReconnectEdgeEndpoint(std::uint32_t edgeId, bool fromEndpoint, std::uint32_t nodeId) const
Create an undoable operation reconnecting one road endpoint to an existing node.
EVENGINE_API_ORCHESTRATION EditorResult< void > loadSnapshot(const EditorValue &snapshot)
Atomically replace the network from a validated version-one snapshot.
static constexpr const char * kDetachEdgeEndpoint
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeAddNode(float x, float y, float z, float junctionRadius=6.f) const
Create an undoable node insertion with a reserved stable id.
EVENGINE_API_ORCHESTRATION EditorResult< void > commitDomainState(std::unique_ptr< editing::IDomainOperationTarget > candidate) override
EVENGINE_API_ORCHESTRATION editing::TargetDescriptor describe() const override
Describe the target for tools and automation.
EVENGINE_API_ORCHESTRATION std::unique_ptr< editing::IDomainOperationTarget > cloneDomainState() const override
Clone the complete target state into an owning detached candidate.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeSplitEdge(std::uint32_t edgeId, std::size_t controlPointIndex, float junctionRadius=6.f) const
Create an undoable split at an authored interior control point.
static constexpr const char * kDisconnectEdgeIntersection
static constexpr const char * kConnectEdgeIntersection
editing::EditRegion dirtyRegion() const override
Dirty region.
static constexpr const char * kReconnectEdgeEndpoint
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeReverseEdge(std::uint32_t edgeId) const
Create a self-inverse operation that reverses an edge and all direction-relative metadata.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeConnectAllTurns(std::uint32_t nodeId) const
Plan all missing legal turn links at one node as one atomic undoable operation.
EVENGINE_API_ORCHESTRATION EditorResult< void > applyDomainOperation(const editing::DomainOperation &operation) override
Apply one validated domain operation.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeSetEdgeStyle(std::uint32_t edgeId, procgen::road::RoadStyle style) const
Create an undoable stable-id edge style replacement operation.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeReconnectEdgeEndpointAndConnect(std::uint32_t edgeId, bool fromEndpoint, std::uint32_t nodeId) const
Atomically reconnect one endpoint and add missing turns involving that edge at the new junction.
static constexpr const char * kDisconnectNodeAtPosition
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeSnapEdgeEndpoint(std::uint32_t edgeId, bool fromEndpoint, float maxDistance, bool connectTurns=true) const
Snap one endpoint to the nearest distinct node inside an explicit 3D radius.
std::uint64_t revision() const override
Revision.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeSplitEdgeAtPosition(std::uint32_t edgeId, procgen::road::RoadControlPoint position, float maxDistance, float junctionRadius=6.f) const
Create an undoable nearest-centerline split from a world position.
EVENGINE_API_ORCHESTRATION EditorValue snapshotValue() const override
Serialize the complete editable network as eve.procgen.roadNetwork schema version 1.
static constexpr const char * kReattachEdgeEndpoint
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeSetNodeJunctionControl(std::uint32_t nodeId, procgen::road::RoadJunctionControl control) const
Create an undoable junction traffic-control replacement operation.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeAddEdge(std::uint32_t from, std::uint32_t to, std::vector< procgen::road::RoadControlPoint > points, int lanesForward=2, int lanesBackward=0, procgen::road::RoadStyle style={}) const
Create an undoable edge insertion with a reserved stable id.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeSetEdgeControlPoints(std::uint32_t edgeId, std::vector< procgen::road::RoadControlPoint > points) const
Create an undoable stable-id spline replacement operation.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeConnectNodeAtPosition(std::uint32_t sourceNodeId, std::uint32_t edgeId, procgen::road::RoadControlPoint position, float maxDistance, float junctionRadius=6.f, int lanesForward=1, int lanesBackward=0, procgen::road::RoadStyle style={}) const
Atomically split a road at a world position and add a branch from an existing node.
static constexpr const char * kMergeNodesAndConnect
EVENGINE_API_ORCHESTRATION void * queryCapability(const editing::CapabilityId &capability) override
Query an optional stable capability.
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.
void clearDirtyRegion() override
Clears dirty region.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeRemoveEdge(std::uint32_t edgeId) const
Create an undoable edge removal including its affected lane links.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeRemoveNode(std::uint32_t nodeId) const
Create an undoable removal for an isolated stable-id node.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeAddEdgeAndConnect(std::uint32_t from, std::uint32_t to, std::vector< procgen::road::RoadControlPoint > points, int lanesForward=2, int lanesBackward=0, procgen::road::RoadStyle style={}) const
Create an edge and every missing endpoint turn involving that edge as one undoable operation.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeConnectEdgeIntersection(std::uint32_t firstEdgeId, std::uint32_t secondEdgeId, float maximumHeightDelta=0.5f, float junctionRadius=6.f) const
Atomically convert one unique same-level crossing into a connected junction.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeMergeNodesAndConnect(std::uint32_t keepNodeId, std::uint32_t removeNodeId, float maxDistance) const
Atomically merge nearby endpoint nodes and generate every missing legal turn at the result.
static EVENGINE_API_ORCHESTRATION std::unique_ptr< RoadNetworkEditTarget > createOwned(std::string id)
Create an editor-owned empty road target for automation/composition hosts.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeAddLaneLink(procgen::road::RoadLaneConnection link) const
Create an undoable manual lane connection.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeUnblockLaneLink(const procgen::road::RoadLaneConnection &link) const
Plan removal of one persistent prohibited turn without automatically activating it.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeDetachEdgeEndpoint(std::uint32_t edgeId, bool fromEndpoint) const
Create an undoable operation detaching one endpoint onto a new coincident stable node.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeSetNodeJunctionRadius(std::uint32_t nodeId, float junctionRadius) const
Create an undoable junction-radius replacement operation.
EVENGINE_API_ORCHESTRATION RoadNetworkEditTarget(std::string id, procgen::road::RoadNetwork &network)
Bind an editor target to an externally owned road network.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeMoveNode(std::uint32_t nodeId, float x, float y, float z) const
Create an undoable stable-id node move operation.
editing::TargetId targetId() const override
Target id.
EVENGINE_API_ORCHESTRATION EditorResult< editing::DomainOperation > makeMergeNodes(std::uint32_t keepNodeId, std::uint32_t removeNodeId, float maxDistance) const
Create an undoable endpoint-node merge within an explicit 3D snap distance.
StrongId< TargetIdTag > TargetId
Definition EditingIds.h:57
RoadJunctionControl
Authoritative traffic-control policy applied to every approach of one junction node.
Definition RoadTypes.h:43
editing::Result< void > registerRoadNetworkEditingCommands(editing::IEditingCommandRegistry &registry)
Register stable road topology commands with an existing editing host.
DomainOperation public API.
EditRegion public API.
void clear()
Clears clear.
Immutable revision-tagged overlay snapshot consumed by any viewport renderer.
Stable discovery metadata exposed by every editable target.
One authored control point on a road centerline (world space, Y-up).
Definition RoadTypes.h:12
Cross-section and structural style for one road edge.
Definition RoadTypes.h:19