载入中...
搜索中...
未找到
TerrainSpawnPlan.cpp
浏览该文件的文档.
2
3#include <algorithm>
4
5namespace eve::procgen {
6namespace {
7const std::string& ruleId(const TerrainSpawnRule& rule) {
8 return std::visit([](const auto& value) -> const std::string& { return value.ruleId; }, rule);
9}
10} // namespace
11
12bool TerrainSpawnPlan::contains(const std::string& id) const {
13 return std::any_of(rules_.begin(), rules_.end(), [&](const auto& rule) { return ruleId(rule) == id; });
14}
15
16Result<int> TerrainSpawnPlan::addSplat(const std::string& id, const Heightmap& paint, int targetLayer,
18 if (id.empty() || contains(id))
20 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.spawnPlan: nonempty unique rule ID required"));
21 if (targetLayer < 0)
23 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.spawnPlan: nonnegative splat layer required"));
24 auto candidate = rules_;
25 candidate.emplace_back(TerrainSplatSpawnRule{id, paint, operation, targetLayer});
26 rules_.swap(candidate);
27 return Result<int>::success(static_cast<int>(rules_.size()));
28}
29
30Result<int> TerrainSpawnPlan::addDetail(const std::string& id, const Heightmap& fitness,
33 std::int32_t seed) {
34 if (id.empty() || contains(id))
36 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.spawnPlan: nonempty unique rule ID required"));
37 auto candidate = rules_;
38 candidate.emplace_back(TerrainDetailSpawnRule{id, fitness, settings, operation, mode, seed});
39 rules_.swap(candidate);
40 return Result<int>::success(static_cast<int>(rules_.size()));
41}
42
43Result<int> TerrainSpawnPlan::addTrees(const std::string& id, const Heightmap& fitness,
46 if (id.empty() || contains(id))
48 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.spawnPlan: nonempty unique rule ID required"));
49 auto candidate = rules_;
50 candidate.emplace_back(TerrainTreeSpawnRule{id, fitness, settings, operation, mode});
51 rules_.swap(candidate);
52 return Result<int>::success(static_cast<int>(rules_.size()));
53}
54
55Result<int> TerrainSpawnPlan::addObjects(const std::string& id, const Heightmap& fitness,
58 if (id.empty() || contains(id))
60 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.spawnPlan: nonempty unique rule ID required"));
61 auto candidate = rules_;
62 candidate.emplace_back(TerrainObjectSpawnRule{id, fitness, settings, operation, mode});
63 rules_.swap(candidate);
64 return Result<int>::success(static_cast<int>(rules_.size()));
65}
66
67Result<int> TerrainSpawnPlan::addProbes(const std::string& id, const Heightmap& fitness,
70 if (id.empty() || contains(id))
72 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.spawnPlan: nonempty unique rule ID required"));
73 auto candidate = rules_;
74 candidate.emplace_back(TerrainProbeSpawnRule{id, fitness, settings, operation, mode});
75 rules_.swap(candidate);
76 return Result<int>::success(static_cast<int>(rules_.size()));
77}
78
80 const TerrainStampSettings& operation, const Heightmap& localMask,
81 const Heightmap& globalMask) {
82 if (id.empty() || contains(id))
84 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.spawnPlan: nonempty unique rule ID required"));
85 auto candidate = rules_;
86 candidate.emplace_back(TerrainModifierStampSpawnRule{id, stamp, localMask, globalMask, operation});
87 rules_.swap(candidate);
88 return Result<int>::success(static_cast<int>(rules_.size()));
89}
90
92 auto candidate = rules_;
93 auto found = std::find_if(candidate.begin(), candidate.end(), [&](const auto& rule) { return ruleId(rule) == id; });
94 if (found == candidate.end())
96 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.spawnPlan: rule ID not found"));
97 std::visit([&](auto& value) { value.enabled = enabled; }, *found);
98 rules_.swap(candidate);
99 return Result<void>::success();
100}
101
102int TerrainSpawnPlan::getRuleCount() const noexcept { return static_cast<int>(rules_.size()); }
103const std::vector<TerrainSpawnRule>& TerrainSpawnPlan::rules() const noexcept { return rules_; }
104
105} // namespace eve::procgen
ActionParameterOperation operation
double value
std::string id
Definition PlayHost.cpp:108
std::uint32_t seed
Definition PointSet.cpp:807
bool found
TerrainThermalSettings settings
Heightmap stamp
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:21
const std::vector< TerrainSpawnRule > & rules() const noexcept
Return immutable ordered rules for transactional execution.
Result< int > addProbes(const std::string &ruleId, const Heightmap &fitness, const TerrainProbePlacementSettings &settings, const TerrainStampSettings &operation, TerrainProbeOperationMode mode)
Append an owned reflection or light probe rule after validating a nonempty unique rule ID.
int getRuleCount() const noexcept
Return the number of retained rules.
Result< int > addSplat(const std::string &ruleId, const Heightmap &paint, int targetLayer, const TerrainStampSettings &operation)
Append an owned terrain texture rule after validating a nonempty unique rule ID.
Result< int > addTrees(const std::string &ruleId, const Heightmap &fitness, const TerrainTreePlacementSettings &settings, const TerrainStampSettings &operation, TerrainTreeOperationMode mode)
Append an owned tree rule after validating a nonempty unique rule ID.
Result< void > setEnabled(const std::string &ruleId, bool enabled)
Enable or disable a stable rule without changing its order.
Result< int > addDetail(const std::string &ruleId, const Heightmap &fitness, const TerrainDetailSettings &settings, const TerrainStampSettings &operation, TerrainDetailMode mode, std::int32_t seed)
Append an owned detail rule after validating a nonempty unique rule ID.
Result< int > addObjects(const std::string &ruleId, const Heightmap &fitness, const TerrainObjectPlacementSettings &settings, const TerrainStampSettings &operation, TerrainObjectOperationMode mode)
Append an owned object rule after validating a nonempty unique rule ID.
Result< int > addModifierStamp(const std::string &ruleId, const Heightmap &stamp, const TerrainStampSettings &operation, const Heightmap &localMask, const Heightmap &globalMask)
Append an owned TerrainModifierStamp with independent local and global mask snapshots.
TerrainProbeOperationMode
Mutation performed by a multi-terrain probe rule.
TerrainDetailMode
Native detail-density operation corresponding to Pcg SpawnMode.
std::variant< TerrainSplatSpawnRule, TerrainDetailSpawnRule, TerrainTreeSpawnRule, TerrainObjectSpawnRule, TerrainProbeSpawnRule, TerrainModifierStampSpawnRule > TerrainSpawnRule
TerrainObjectOperationMode
Mutation performed by a multi-terrain game-object operation.
TerrainTreeOperationMode
Pcg SetTerrainTrees operation branch. Add and Replace both append after upstream clearing policy.
bool enabled
Effective detail rule settings; density is rule density times global spawn density.
One owned Pcg-style detail spawn rule.
One owned Pcg TerrainModifierStamp rule, including both ordered mask domains.
Deterministic Pcg SetTerrainGameObjects scan, collision and resource configuration.
One owned Pcg-style game-object spawn rule.
Deterministic value settings for Pcg SetProbes terrain scanning.
One owned Pcg-style reflection or light probe spawn rule.
One owned Pcg-style terrain texture spawn rule.
Value configuration for a rectangular stamp in world X/Z coordinates.
Explicit deterministic tree placement configuration for one terrain rectangle and resource.
One owned Pcg-style tree spawn rule.