载入中...
搜索中...
未找到
MapIntegration.cpp
浏览该文件的文档.
2
3#include <cmath>
4#include <set>
5
6namespace eve::map_editing {
7
8Result<void> MapRoadMeshPublisher::publish(const MapDocumentTarget& document, const StableId& road,
9 Revision expectedRevision, IMapRoadMeshSink& sink,
10 int triangleBudget) const {
11 if (expectedRevision != document.revision())
12 return eve::editing::failed<void>(EditorStatus::Conflict, RuleId("editor.map.stale-road-preview"),
13 "Map document changed before road mesh publication");
14 const auto preview = document.previewRoad(road, triangleBudget);
15 if (preview.status != EditorStatus::Applied)
16 return eve::editing::failed<void>(
17 preview.status,
18 preview.diagnostics.empty() ? RuleId("editor.map.road-preview-failed")
19 : eve::editing::diagnosticRule(preview.diagnostics.front()),
20 preview.diagnostics.empty() ? "Road preview failed" : preview.diagnostics.front().message());
21 auto published = sink.publishRoad(document.targetId().value(), road, preview.documentRevision, preview.mesh);
22 if (!published.ok()) return published;
23 if (document.revision() != expectedRevision)
24 return eve::editing::failed<void>(EditorStatus::Conflict, RuleId("editor.map.road-changed-during-publish"),
25 "Map road changed while its generated mesh was being published");
26 return eve::editing::applied<void>();
27}
28
30 const std::vector<MapObjectImportRecord>& records,
31 const std::string& idPrefix) const {
33 result.documentRevision = document.revision();
34 if (layer.empty() || idPrefix.empty()) {
35 result.status = EditorStatus::Rejected;
37 eve::DiagnosticCode::InvalidArgument, RuleId("editor.map.invalid-import-target"),
38 DiagnosticSeverity::Error, "Map object import requires a target layer and stable id prefix"));
39 return result;
40 }
41 std::set<std::string> sourceIds;
42 std::set<StableId> existing;
43 for (const auto& placement : document.mapPlacements()) existing.insert(placement.id);
44 for (const auto& record : records) {
45 if (record.sourceId.empty() || record.asset.empty() || !sourceIds.insert(record.sourceId).second) {
46 result.status = EditorStatus::Conflict;
48 eve::DiagnosticCode::Conflict, RuleId("editor.map.invalid-import-object"), DiagnosticSeverity::Error,
49 "Imported objects require unique source ids and asset references"));
50 return result;
51 }
52 const StableId id(idPrefix + "/" + record.sourceId);
53 if (existing.contains(id)) {
54 result.status = EditorStatus::Conflict;
56 eve::DiagnosticCode::Conflict, RuleId("editor.map.import-id-conflict"), DiagnosticSeverity::Error,
57 "Imported placement id already exists: " + id.value()));
58 return result;
59 }
60 MapPlacementRecord placement{id,
61 layer,
62 record.asset,
63 record.x,
64 record.y,
65 record.z,
66 record.rotationX,
67 record.rotationY,
68 record.rotationZ,
69 record.scaleX,
70 record.scaleY,
71 record.scaleZ};
72 auto operation = document.makeSetPlacement(placement);
73 if (!operation.ok()) {
74 result.status = operation.code();
75 result.diagnostics.insert(result.diagnostics.end(), operation.diagnostics().begin(),
76 operation.diagnostics().end());
77 return result;
78 }
79 result.operations.push_back(std::move(operation).value());
80 existing.insert(id);
81 }
82 result.status = EditorStatus::Applied;
83 return result;
84}
85
86} // namespace eve::map_editing
ActionParameterOperation operation
double value
TileLayer * layer
std::string id
Definition PlayHost.cpp:108
Move-only operation result carrying either a value or Status.
Definition Result.h:155
bool empty() const noexcept
True when no compatibility spelling has been assigned.
Definition Identity.h:374
std::uint64_t revision() const override
Return the current revision.
Runtime-neutral sink receiving revision-tagged generated road meshes.
Definition MapDocument.h:71
virtual Result< void > publishRoad(const std::string &document, const StableId &road, Revision revision, const EditorValue &mesh)=0
Atomically publish or replace one generated road mesh.
UI-neutral map structure document with reversible domain operations.
Result< DomainOperation > makeSetPlacement(const MapPlacementRecord &placement) const override
Make set placement.
std::vector< MapPlacementRecord > mapPlacements() const override
Map placements.
MapRoadPreviewResult previewRoad(const StableId &road, int triangleBudget=10000) const
Build a deterministic XZ road strip for viewport preview and budget diagnostics.
TargetId targetId() const override
Target id.
MapObjectImportPlan plan(const MapDocumentTarget &document, const StableId &layer, const std::vector< MapObjectImportRecord > &records, const std::string &idPrefix) const
Plan stable-id placement creation without mutating the map document.
Result< void > publish(const MapDocumentTarget &document, const StableId &road, Revision expectedRevision, IMapRoadMeshSink &sink, int triangleBudget=10000) const
Generate and publish one road mesh to the supplied host sink.
RuleId diagnosticRule(const Diagnostic &diagnostic)
Return the projected editing rule, or an empty RuleId when absent.
Diagnostic ruleDiagnostic(eve::DiagnosticCode code, RuleId rule, DiagnosticSeverity severity, std::string message)
Build a common diagnostic carrying an open editing rule identity.
Side-effect-free batch import plan for map object placements.
Definition MapDocument.h:92
std::vector< DomainOperation > operations
Definition MapDocument.h:95
std::vector< EditorDiagnostic > diagnostics
Definition MapDocument.h:96
Stable object placement stored on an object layer.
Definition MapDocument.h:45