载入中...
搜索中...
未找到
PcgTreeManager.cpp
浏览该文件的文档.
2
3#include "procgen/PointSet.h"
4
5#include <cmath>
6
7namespace eve::procgen {
8namespace {
9bool finite(float value) { return std::isfinite(value); }
10} // namespace
11
12Result<void> PcgTreeManager::reset(float minimumX, float minimumZ, float width, float depth) {
13 if (!finite(minimumX) || !finite(minimumZ) || !finite(width) || !finite(depth) ||
14 width <= 0 || depth <= 0 || !finite(minimumX + width) || !finite(minimumZ + depth))
15 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "finite positive world bounds are required",
16 "procgen.pcgTreeManager"));
17 minimumX_ = minimumX; minimumZ_ = minimumZ; width_ = width; depth_ = depth;
18 trees_.clear();
19 configured_ = true;
20 return Result<void>::success();
21}
22
23Result<int> PcgTreeManager::addTree(float worldX, float worldZ, int prototypeIndex) {
24 if (!configured_) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "reset must configure bounds before insertion",
25 "procgen.pcgTreeManager"));
26 if (!finite(worldX) || !finite(worldZ) || prototypeIndex < 0)
27 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "finite position and non-negative prototype index are required",
28 "procgen.pcgTreeManager"));
29 if (worldX < minimumX_ || worldZ < minimumZ_ || worldX >= minimumX_ + width_ ||
30 worldZ >= minimumZ_ + depth_)
31 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "tree position lies outside manager bounds",
32 "procgen.pcgTreeManager"));
33 trees_.push_back({worldX, worldZ, prototypeIndex});
34 return Result<int>::success(static_cast<int>(trees_.size()));
35}
36
38 if (!configured_) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "reset must configure bounds before insertion",
39 "procgen.pcgTreeManager"));
40 if (prototypeIndex < 0) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "prototype index must be non-negative",
41 "procgen.pcgTreeManager"));
42 std::vector<Tree> candidate = trees_;
43 candidate.reserve(candidate.size() + static_cast<std::size_t>(points.getCount()));
44 for (const auto& point : points.points()) {
45 if (!finite(point.x) || !finite(point.z) || point.x < minimumX_ || point.z < minimumZ_ ||
46 point.x >= minimumX_ + width_ || point.z >= minimumZ_ + depth_)
47 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "all PointSet trees must lie inside manager bounds",
48 "procgen.pcgTreeManager"));
49 candidate.push_back({point.x, point.z, prototypeIndex});
50 }
51 trees_.swap(candidate);
52 return Result<int>::success(static_cast<int>(trees_.size()));
53}
54
55Result<int> PcgTreeManager::countInRange(float worldX, float worldZ, float range) const {
56 if (!configured_) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "reset must configure bounds before queries",
57 "procgen.pcgTreeManager"));
58 if (!finite(worldX) || !finite(worldZ) || !finite(range) || range < 0)
59 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "finite position and non-negative range are required",
60 "procgen.pcgTreeManager"));
61 int count = 0;
62 for (const auto& tree : trees_)
63 if (tree.x >= worldX - range && tree.x <= worldX + range &&
64 tree.z >= worldZ - range && tree.z <= worldZ + range)
65 ++count;
67}
68int PcgTreeManager::getCount() const noexcept { return static_cast<int>(trees_.size()); }
69} // namespace eve::procgen
double value
std::uint32_t width
Range range
bool finite
std::shared_ptr< const std::vector< glm::vec2 > > points
std::uint32_t count
std::uint32_t depth
glm::vec3 point
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
Result< int > addTrees(const PointSet &trees, int prototypeIndex)
Atomically append every world-space XZ position from a PointSet under one prototype index.
Result< void > reset(float minimumX, float minimumZ, float width, float depth)
Atomically reset the index to finite positive world XZ bounds.
Result< int > countInRange(float worldX, float worldZ, float range) const
Count trees in the inclusive axis-aligned square centered at XZ with the supplied range.
int getCount() const noexcept
Result< int > addTree(float worldX, float worldZ, int prototypeIndex)
Add one tree when its finite position is within the configured half-open world bounds.
Script-friendly collection of attributed 3D samples.
Definition PointSet.h:59