载入中...
搜索中...
未找到
BiomeRuntime.cpp
浏览该文件的文档.
2#include "procgen/Biome.h"
4
5#include <cmath>
6#include <utility>
7
8namespace eve::biome_editing {
9namespace {} // namespace
10
13
15 const IBiomeSpatialResolver& resolver) {
16 const auto diagnostics = document.validate();
17 for (const auto& diagnostic : diagnostics)
18 if (diagnostic.severity() == DiagnosticSeverity::Error)
19 return Result<void>::failure(eve::Status(EditorStatus::Rejected, diagnostics));
20
21 auto candidate = std::make_unique<procgen::BiomeRules>();
22 for (const auto& layer : document.layers()) {
23 auto spatial = resolver.resolve(layer.spatialAsset);
24 if (!spatial.ok()) return Result<void>::failure(spatial.status());
25 if (!spatial.value())
26 return eve::editing::failed<void>(EditorStatus::NotFound, RuleId("editor.biome.runtime-spatial"),
27 "Biome spatial resolver returned no spatial data");
28 if (!candidate->addLayer(layer.name, spatial.value(), layer.priority, layer.density))
29 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.biome.runtime-layer"),
30 "Biome runtime rejected a validated layer");
31 for (const auto& asset : layer.assets)
32 if (!candidate->addAsset(layer.name, asset.asset, asset.weight, asset.minScale, asset.maxScale,
33 asset.randomYaw))
34 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.biome.runtime-asset"),
35 "Biome runtime rejected a validated asset");
36 }
37 for (const auto& reference : document.exclusions()) {
38 auto spatial = resolver.resolve(reference);
39 if (!spatial.ok()) return Result<void>::failure(spatial.status());
40 if (!spatial.value())
41 return eve::editing::failed<void>(EditorStatus::NotFound, RuleId("editor.biome.runtime-exclusion-spatial"),
42 "Biome exclusion resolver returned no spatial data");
43 if (!candidate->addExclusion(spatial.value()))
44 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.biome.runtime-exclusion"),
45 "Biome runtime rejected a validated exclusion");
46 }
47 rules_ = std::move(candidate);
48 revision_ = document.revision();
49 return eve::editing::applied<void>(diagnostics);
50}
51
53 float spacing, std::uint32_t seed,
54 float jitter,
55 Revision expectedRevision) {
56 if (expectedRevision != revision_)
57 return eve::editing::failed<std::unique_ptr<procgen::PointSet>>(
58 EditorStatus::Conflict, RuleId("editor.biome.stale"), "Biome preview generation is stale");
59 if (!rules_ || !domain || !std::isfinite(spacing) || spacing <= 0 || !std::isfinite(jitter) || jitter < 0 ||
60 jitter > 1)
61 return eve::editing::failed<std::unique_ptr<procgen::PointSet>>(
62 EditorStatus::Rejected, RuleId("editor.biome.preview"), "Biome preview inputs are invalid");
63 std::unique_ptr<procgen::PointSet> points(rules_->generate(domain, spacing, seed, jitter));
64 if (!points)
65 return eve::editing::failed<std::unique_ptr<procgen::PointSet>>(
66 EditorStatus::Failed, RuleId("editor.biome.generate"), rules_->getError());
67 return eve::editing::applied<std::unique_ptr<procgen::PointSet>>(std::move(points));
68}
69} // namespace eve::biome_editing
eve::action::ActionSpatialBinding spatial
AuthorityStoreHandleRef reference
Definition Authority.cpp:24
TileLayer * layer
std::uint32_t seed
Definition PointSet.cpp:807
std::shared_ptr< const std::vector< glm::vec2 > > points
int spacing
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
Result< void > publish(const BiomeDocumentTarget &, const IBiomeSpatialResolver &)
Publish.
~BiomeDocumentRuntime()
Biome document runtime.
Result< std::unique_ptr< procgen::PointSet > > preview(procgen::SpatialData *domain, float spacing, std::uint32_t seed, float jitter, Revision expectedRevision)
Generate a PointSet from a previously published candidate.
BiomeDocumentRuntime()
Biome document runtime.
Revisioned BiomeRules asset.
Definition BiomeTarget.h:64
const std::vector< std::string > & exclusions() const
Exclusions.
const std::vector< BiomeLayerValue > & layers() const
Layers.
std::vector< EditorDiagnostic > validate() const
Validate.
Resolves copied spatial domains for BiomeRules publication.
virtual Result< procgen::SpatialData * > resolve(const std::string &) const =0
Resolve one authored spatial asset to a generation domain. @ownership Borrowed; the resolver retains ...
std::uint64_t revision() const override
Return the current revision.
Queryable spatial input for procedural pipelines.
Definition SpatialData.h:35
editing::RuleId RuleId
Definition BiomeTarget.h:40
editing::Revision Revision
Definition BiomeTarget.h:39
Result< T > failed(Status status, eve::DiagnosticCode code, RuleId rule, std::string message)
Construct a failed editing result with explicit status and diagnostic categories.