载入中...
搜索中...
未找到
PcgInstancePublisher.cpp
浏览该文件的文档.
2
4
5namespace eve::procgen_editing {
6namespace {
7
8Result<editing::DomainOperation> failOp(const char* rule, std::string message) {
9 return eve::editing::rejected<editing::DomainOperation>(editing::RuleId(rule), std::move(message));
10}
11
12Result<void> failVoid(const char* rule, std::string message) {
13 return eve::editing::rejected<void>(editing::RuleId(rule), std::move(message));
14}
15
16const EditorValue* field(const EditorValue& value, const char* key) {
17 const auto* object = value.getIf<EditorValue::Object>();
18 if (!object) return nullptr;
19 const auto found = object->find(key);
20 return found == object->end() ? nullptr : &found->second;
21}
22
23std::string stringField(const EditorValue& value, const char* key) {
24 const EditorValue* found = field(value, key);
25 if (!found) return {};
26 if (const auto* text = found->getIf<std::string>()) return *text;
27 return {};
28}
29
30std::string statusText(const eve::Status& status) {
31 if (const auto* diagnostic = status.primaryDiagnostic()) return std::string(diagnostic->message());
32 if (!status.diagnostics().empty()) return std::string(status.diagnostics().front().message());
33 return "procgen operation failed";
34}
35
36} // namespace
37
39 const std::string& assetAttribute,
40 const std::string& defaultAsset) const {
41 if (batchId.empty()) return failOp("editor.pcg.publish.batch-id", "publish requires a non-empty batch id");
42
45 operation.inverseType = kRemoveType;
46 operation.hasInverse = true;
47 operation.mergeKey = std::string("pcg-instances:") + batchId;
48
50 payload["batchId"] = EditorValue(batchId);
51 payload["assetAttribute"] = EditorValue(assetAttribute.empty() ? std::string("mesh") : assetAttribute);
52 payload["defaultAsset"] = EditorValue(defaultAsset);
53 operation.payload = EditorValue(std::move(payload));
54
55 EditorValue::Object inverse;
56 inverse["batchId"] = EditorValue(batchId);
57 operation.inverse = EditorValue(std::move(inverse));
58 return eve::editing::applied(std::move(operation));
59}
60
62 if (batchId.empty()) return failOp("editor.pcg.remove.batch-id", "remove requires a non-empty batch id");
63
66 operation.hasInverse = false;
67 operation.mergeKey = std::string("pcg-instances:") + batchId;
69 payload["batchId"] = EditorValue(batchId);
70 operation.payload = EditorValue(std::move(payload));
71 return eve::editing::applied(std::move(operation));
72}
73
77 if (operation.type != kPublishType)
78 return failVoid("editor.pcg.publish.type", "applyPublish requires a publishInstances operation");
79 const std::string batchId = stringField(operation.payload, "batchId");
80 if (batchId.empty()) return failVoid("editor.pcg.publish.batch-id", "publish payload is missing batchId");
81 const std::string assetAttribute = stringField(operation.payload, "assetAttribute");
82 const std::string defaultAsset = stringField(operation.payload, "defaultAsset");
83 auto published =
84 procgen.publishInstances(batchId, points, assetAttribute.empty() ? "mesh" : assetAttribute, defaultAsset);
85 if (!published.ok()) return failVoid("editor.pcg.publish.failed", statusText(published.status()));
86 return eve::editing::applied();
87}
88
92 if (operation.type == kPublishType && operation.hasInverse) {
93 removeOp.type = kRemoveType;
94 removeOp.payload = operation.inverse;
95 }
96 if (removeOp.type != kRemoveType)
97 return failVoid("editor.pcg.operation", "unsupported PCG instance operation type");
98 const std::string batchId = stringField(removeOp.payload, "batchId");
99 if (batchId.empty()) return failVoid("editor.pcg.remove.batch-id", "remove payload is missing batchId");
100 auto removed = procgen.removeInstances(batchId);
101 if (!removed.ok()) return failVoid("editor.pcg.remove.failed", statusText(removed.status()));
102 return eve::editing::applied();
103}
104
105} // namespace eve::procgen_editing
ActionParameterOperation operation
double value
Value::Object payload
std::string message
std::uint32_t key
wgpu::PopErrorScopeStatus status
std::string text
std::shared_ptr< const std::vector< glm::vec2 > > points
bool found
int removed
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Structured status and zero or more diagnostics for an operation.
Definition Status.h:68
std::map< std::string, Value > Object
const T * getIf() const
Return an immediately borrowed typed value.
Procedural generation module. Phase A: runtime maps (semantic Grid2D → TileLayer)....
Definition Procgen.h:146
eve::Result< void > publishInstances(const std::string &batchId, ProcgenPointSetHandleRef points, const std::string &assetAttribute, const std::string &defaultAsset)
Definition Procgen.cpp:923
eve::Result< void > removeInstances(const std::string &batchId)
Removes instances.
Definition Procgen.cpp:943
Result< void > applyPublish(procgen::Procgen &procgen, const editing::DomainOperation &operation, procgen::ProcgenPointSetHandleRef points) const
Execute a planPublish operation with a live point-set handle.
Result< editing::DomainOperation > planPublish(const std::string &batchId, const std::string &assetAttribute="mesh", const std::string &defaultAsset={}) const
Build a publish operation whose inverse removes the same batch id.
Result< void > apply(procgen::Procgen &procgen, const editing::DomainOperation &operation) const
Execute a planRemove operation, or undo a publish by applying its inverse payload.
Result< editing::DomainOperation > planRemove(const std::string &batchId) const
Build a remove operation (inverse empty; redo requires a fresh publish plan).
StrongId< RuleIdTag > RuleId
Definition EditingIds.h:60
Result< T > applied(T value, std::vector< Diagnostic > diagnostics={})
Construct an Applied result with an owning payload and optional diagnostics.
const EditorValue * field(const EditorValue &value, const char *name)
DomainOperation public API.
Handle plus owner-lifetime epoch for a non-ECS registry object.