载入中...
搜索中...
未找到
HeightmapTarget.cpp
浏览该文件的文档.
2
4
5#include <algorithm>
6#include <cmath>
7#include <utility>
8
9namespace eve::procgen_editing {
10
12 : id_(std::move(id)), heightmap_(heightmap) {}
13int HeightmapTarget::width() const { return heightmap_ ? heightmap_->getWidth() : 0; }
14int HeightmapTarget::height() const { return heightmap_ ? heightmap_->getHeight() : 0; }
15bool HeightmapTarget::containsCell(int x, int y) const { return heightmap_ && heightmap_->inBounds(x, y); }
16float HeightmapTarget::readScalar(int x, int y) const {
17 return containsCell(x, y) ? heightmap_->height(x, y) : 0.0F;
18}
21 if (heightmap_->height(x, y) == value) return editing::FieldWriteStatus::Unchanged;
22 heightmap_->setHeight(x, y, value);
23 ++revision_;
24 dirty_.include(x, y);
26}
27float HeightmapTarget::sampleScalar(float x, float y) const {
28 return heightmap_ ? heightmap_->sampleBilinear(x, y) : 0.0F;
29}
30
31std::unique_ptr<HeightmapTarget> createHeightmapTarget(std::string id,
32 procgen::Heightmap* heightmap) {
33 return std::make_unique<HeightmapTarget>(std::move(id), heightmap);
34}
35
37 float centerY, float radius, float strength) {
38 if (!heightmap || radius < 0.0F)
39 return eve::editing::failed<int>(
40 editing::Status::Rejected, editing::RuleId("procgen.heightmap.invalid-brush"),
41 "Heightmap brush requires a target and non-negative radius");
42 if (strength == 0.0F) {
43 return editing::Result<int>::success(0, eve::Status::success(editing::Status::NoOp));
44 }
45 const int minX = std::max(0, static_cast<int>(std::floor(centerX - radius)));
46 const int maxX = std::min(heightmap->getWidth() - 1, static_cast<int>(std::ceil(centerX + radius)));
47 const int minY = std::max(0, static_cast<int>(std::floor(centerY - radius)));
48 const int maxY = std::min(heightmap->getHeight() - 1, static_cast<int>(std::ceil(centerY + radius)));
49 const float edge = radius + 0.5F;
50 int changed = 0;
51 for (int y = minY; y <= maxY; ++y) {
52 for (int x = minX; x <= maxX; ++x) {
53 const float dx = static_cast<float>(x) - centerX;
54 const float dy = static_cast<float>(y) - centerY;
55 const float distance = std::sqrt(dx * dx + dy * dy);
56 if (distance > radius) continue;
57 const float oldHeight = heightmap->height(x, y);
58 const float newHeight = std::clamp(oldHeight + strength * (1.0F - distance / edge), 0.0F, 1.0F);
59 if (newHeight == oldHeight) continue;
60 heightmap->setHeight(x, y, newHeight);
61 ++changed;
62 }
63 }
64 return eve::editing::applied<int>(changed);
65}
66
67} // namespace eve::procgen_editing
double value
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float distance
float radius
std::string id
Definition PlayHost.cpp:108
const RoadEdge * edge
float dy
float dx
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 Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:21
int getHeight() const
Returns the height.
Definition Heightmap.cpp:17
float sampleBilinear(float x, float y) const
Bilinear height at continuous coordinate within [0, w) x [0, h).
Definition Heightmap.cpp:37
float height(int x, int y) const
Height.
Definition Heightmap.cpp:28
void setHeight(int x, int y, float h)
Sets the height.
Definition Heightmap.cpp:23
int getWidth() const
Returns the width.
Definition Heightmap.cpp:16
bool inBounds(int x, int y) const
In bounds.
Definition Heightmap.cpp:19
float readScalar(int x, int y) const override
Reads scalar.
int height() const override
Height.
bool containsCell(int x, int y) const override
True if cell.
HeightmapTarget(std::string id, procgen::Heightmap *heightmap)
Bind a live heightmap which must outlive this adapter.
editing::FieldWriteStatus writeScalar(int x, int y, float value) override
Writes scalar.
float sampleScalar(float x, float y) const override
Sample scalar.
FieldWriteStatus
FieldWriteStatus public API.
EVENGINE_API_ORCHESTRATION editing::Result< int > applyHeightmapBrush(procgen::Heightmap *heightmap, float centerX, float centerY, float radius, float strength)
Apply the legacy circular brush through the procgen authoring satellite.
std::unique_ptr< HeightmapTarget > createHeightmapTarget(std::string id, procgen::Heightmap *heightmap)
Create a heightmap adapter.
void include(int x, int y)
Include.