载入中...
搜索中...
未找到
VegetationConverterController.cpp
浏览该文件的文档.
2
3namespace eve::editor {
4namespace {
5std::vector<EditorDiagnostic> project(const std::vector<Diagnostic>& diagnostics) { return diagnostics; }
6} // namespace
7
12
15 : preparer_(preparer), publisher_(publisher) {}
16
18 std::uint64_t expectedPublicationGeneration) {
19 if (request.package.packageId.isNil() || request.package.packageName.empty() ||
20 request.package.packageVersion.empty() || request.objects.empty())
21 return editing::failed<void>(EditorStatus::Rejected, RuleId("editor.vegetation-converter.request"),
22 "Vegetation conversion requires package identity and at least one object");
23 request_ = std::move(request);
24 candidate_.reset();
25 expectedPublicationGeneration_ = expectedPublicationGeneration;
26 ++state_.requestRevision;
27 state_.preparedRevision = 0;
28 state_.publicationGeneration = 0;
29 state_.objectCount = request_->objects.size();
30 state_.assetCount = 0;
31 state_.findingCount = 0;
32 state_.diagnostics.clear();
34 return editing::applied<void>();
35}
36
38 if (!request_)
39 return editing::failed<void>(EditorStatus::Rejected, RuleId("editor.vegetation-converter.no-request"),
40 "Set a vegetation conversion request before preparing it");
41 auto prepared = preparer_.prepare(*request_);
42 if (!prepared.ok()) {
43 candidate_.reset();
44 state_.preparedRevision = 0;
45 state_.assetCount = 0;
46 state_.findingCount = 0;
47 state_.diagnostics = project(prepared.diagnostics());
49 return Result<void>::failure(prepared.status());
50 }
51 candidate_ = std::move(prepared).takeValue();
52 state_.preparedRevision = state_.requestRevision;
53 state_.assetCount = candidate_->manifest.assets.size();
54 state_.findingCount = candidate_->findings.size();
55 state_.diagnostics.clear();
57 return editing::applied<void>();
58}
59
61 if (!candidate_ || state_.preparedRevision != state_.requestRevision)
62 return editing::failed<std::uint64_t>(EditorStatus::Conflict,
63 RuleId("editor.vegetation-converter.stale-candidate"),
64 "Prepare the current vegetation request before publishing it");
65 auto published = publisher_.publish(*candidate_, expectedPublicationGeneration_);
66 if (!published.ok()) {
67 state_.diagnostics = published.diagnostics();
69 return published;
70 }
71 expectedPublicationGeneration_ = published.value();
72 state_.publicationGeneration = published.value();
73 state_.diagnostics.clear();
75 return published;
76}
77
79 request_.reset();
80 candidate_.reset();
81 state_ = {};
82 expectedPublicationGeneration_ = 0;
83 return editing::applied<void>();
84}
85
87
88} // namespace eve::editor
const GltfImportRequest & request
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Worker boundary used to prepare a complete vegetation package candidate.
virtual Result< asset_import::PreparedAssetImport > prepare(const asset_import::UnityVegetationBatchImportRequest &request) const =0
Prepare an owning candidate without external mutation or retained request references.
Atomic host publication boundary for one prepared vegetation package.
virtual Result< std::uint64_t > publish(const asset_import::PreparedAssetImport &candidate, std::uint64_t expectedGeneration)=0
Publish one immutable complete candidate.
Result< asset_import::PreparedAssetImport > prepare(const asset_import::UnityVegetationBatchImportRequest &request) const override
Prepare.
Result< std::uint64_t > publish()
Publish the candidate only when it still matches the current request revision.
VegetationConverterController(const IVegetationConversionPreparer &preparer, IVegetationConversionPublisher &publisher)
Vegetation converter controller.
Result< void > setRequest(asset_import::UnityVegetationBatchImportRequest request, std::uint64_t expectedPublicationGeneration)
Replace the complete owning request and invalidate any older candidate.
VegetationConverterState state() const
Return an owning state snapshot for desktop or in-game UI hosts.
Result< void > clear()
Discard request, candidate and diagnostics.
Result< void > prepare()
Prepare the current request as one detached EVA candidate.
Result< PreparedAssetImport > prepareUnityVegetationConversionBatch(const UnityVegetationBatchImportRequest &request)
Prepare several vegetation objects as one all-or-nothing EVA candidate.
eve::editing::RuleId RuleId
Definition EditorIds.h:32
ssq::Table project(HSQUIRRELVM vm, const eve::Result< void > &result)
Project a completed editing result that has no payload.
Owning ordered set of independently converted vegetation objects published as one package.
Host-visible state of the TVE conversion tool.