载入中...
搜索中...
未找到
TerrainDetailLayer.cpp
浏览该文件的文档.
47 return std::isfinite(settings.minimumFitness) && settings.minimumFitness >= 0 && settings.minimumFitness <= 1 &&
49 std::isfinite(settings.density) && settings.density >= 0 && double(settings.density) < double(INT_MAX) &&
117Result<int> TerrainDetailLayer::apply(const Heightmap& fitness, const TerrainDetailSettings& settings, int32_t seed) {
124 auto [resource, inserted] = next->resources.try_emplace(settings.namespaceId, impl_->counts.size(), 0);
139 target[index] = nearestEven(std::clamp(float(target[index]) + sign * amount, 0.0F, settings.density));
151 const TerrainDetailSettings& settings, const TerrainStampSettings& operationSettings, int32_t seed,
155 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.detail.multitile: valid tiles and settings required"));
162 DiagnosticCode::InvalidArgument, "terrain.detail.multitile: distinct initialized layers required"));
175 DiagnosticCode::InvalidArgument, "terrain.detail.multitile: operation fitness dimensions must match window"));
179 DiagnosticCode::InvalidArgument, "terrain.detail.multitile: finite operation fitness required"));
197 auto [resource, inserted] = next->resources.try_emplace(settings.namespaceId, next->counts.size(), 0);
200 if (settings.mode == TerrainDetailMode::Replace) std::fill(targetCounts.begin(), targetCounts.end(), 0);
207 const float fitness = operationFitness.data()[size_t(operationZ) * report.operationWidth + operationX];
222 DiagnosticCode::InvalidArgument, "terrain.detail.multitile: changed cell count exceeds integer range"));
272TerrainMultiDetailWorkspace::TerrainMultiDetailWorkspace(TerrainMultiDetailWorkspace&&) noexcept = default;
273TerrainMultiDetailWorkspace& TerrainMultiDetailWorkspace::operator=(TerrainMultiDetailWorkspace&&) noexcept = default;
275Result<int> TerrainMultiDetailWorkspace::addTile(const std::string& name, const TerrainDetailLayer& layer,
281 if (std::any_of(impl_->tiles.begin(), impl_->tiles.end(), [&](const auto& tile) { return tile.name == name; }))
283 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.detail.workspace: duplicate tile name"));
286 DiagnosticCode::InvalidArgument, "terrain.detail.workspace: topology is fixed after applying"));
300 auto checked = mapTerrainOperationMultiTile(descriptors, bounds, TerrainOperationDomain::TerrainDetail,
316 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.detail.workspace: moved-from workspace"));
320 descriptors.push_back({tile.name, &tile.layer, tile.originX, tile.originZ, tile.width, tile.depth,
322 auto applied = applyTerrainDetailMultiTile(descriptors, operationFitness, settings, operationSettings, seed,
334Result<int> TerrainMultiDetailWorkspace::copyTile(const std::string& name, TerrainDetailLayer& output) const {
337 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.detail.workspace: moved-from workspace"));
342 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.detail.workspace: tile not found"));
351 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.detail.workspace: no undo snapshot"));
362 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.detail.workspace: no redo snapshot"));
370int TerrainMultiDetailWorkspace::getTileCount() const noexcept { return impl_ ? int(impl_->tiles.size()) : 0; }
380int TerrainMultiDetailWorkspace::getAppliedCount() const noexcept { return impl_ ? impl_->cursor : 0; }
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
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
Owned integer terrain-detail layer, independent of graphics and resource registries....
Definition TerrainDetailLayer.h:35
Result< int > reset(int width, int height, int count=0)
Reset positive dimensions and uniform nonnegative count atomically.
Definition TerrainDetailLayer.cpp:84
TerrainDetailLayer & operator=(TerrainDetailLayer &&) noexcept
Transfer ownership, releasing previous counts.
Result< int > sample(int x, int z) const
Read an integer value copy; empty state or invalid coordinates return InvalidArgument.
Definition TerrainDetailLayer.cpp:94
Result< int > clearResource(std::uint64_t namespaceId)
Remove one resource layer atomically and return its changed cell count.
Definition TerrainDetailLayer.cpp:104
Result< int > apply(const Heightmap &fitness, const TerrainDetailSettings &settings, int32_t seed)
Apply a finite aligned fitness map with source thinning and nearest-even integer rounding.
Definition TerrainDetailLayer.cpp:117
int getWidth() const noexcept
Return width, zero when empty or moved-from.
Definition TerrainDetailLayer.cpp:82
int getHeight() const noexcept
Return height, zero when empty or moved-from.
Definition TerrainDetailLayer.cpp:83
Result< int > sampleResource(std::uint64_t namespaceId, int x, int z) const
Read one resource layer without exposing mutable storage; an absent namespace reads as zero.
Definition TerrainDetailLayer.cpp:98
Owning script-safe multi-terrain detail transaction workspace. Input layers are copied on insertion....
Definition TerrainMultiTile.h:178
~TerrainMultiDetailWorkspace()
Terrain multi detail workspace.
constexpr HexDirection next(HexDirection d) noexcept
The next direction clockwise (NW wraps to NE).
Definition HexMetrics.h:76
Definition EvpackPointGraphLoader.h:12
Result< TerrainMultiTileReport > mapTerrainOperationMultiTile(const std::vector< TerrainOperationTile > &tiles, const TerrainStampSettings &settings, TerrainOperationDomain domain, bool worldMapOperation, const std::vector< std::string > &validTerrainNames)
Calculate Pcg-compatible local and shared pixel rectangles for any multi-terrain raster domain.
Definition TerrainMultiTile.cpp:71
@ TerrainDetail
Result< TerrainMultiTileReport > applyTerrainDetailMultiTile(const std::vector< TerrainDetailTile > &tiles, const Heightmap &operationFitness, const TerrainDetailSettings &settings, const TerrainStampSettings &operationSettings, int32_t seed, bool worldMapOperation, const std::vector< std::string > &validTerrainNames)
Definition TerrainDetailLayer.cpp:149
@ InvalidArgument
Definition Container.h:602
std::map< std::uint64_t, std::vector< int > > resources
Definition TerrainDetailLayer.cpp:57
Result< int > rebuildTotals()
Definition TerrainDetailLayer.cpp:58
std::vector< int > counts
Definition TerrainDetailLayer.cpp:56
Effective detail rule settings; density is rule density times global spawn density.
Definition TerrainDetailLayer.h:17
TerrainMultiTileReport report
Definition TerrainDetailLayer.cpp:240
std::vector< TerrainDetailLayer > layers
Definition TerrainDetailLayer.cpp:239
double width
Definition TerrainDetailLayer.cpp:235
double originX
Definition TerrainDetailLayer.cpp:235
bool worldMap
Definition TerrainDetailLayer.cpp:236
std::string name
Definition TerrainDetailLayer.cpp:233
TerrainDetailLayer layer
Definition TerrainDetailLayer.cpp:234
double depth
Definition TerrainDetailLayer.cpp:235
double originZ
Definition TerrainDetailLayer.cpp:235
std::vector< Snapshot > history
Definition TerrainDetailLayer.cpp:244
std::vector< Tile > tiles
Definition TerrainDetailLayer.cpp:242
Impl(const Impl &other)
Definition TerrainDetailLayer.cpp:248
TerrainMultiTileReport last
Definition TerrainDetailLayer.cpp:243
void restore(const Snapshot &snapshot)
Definition TerrainDetailLayer.cpp:264
Snapshot snapshot() const
Definition TerrainDetailLayer.cpp:257
Impl()=default
int cursor
Definition TerrainDetailLayer.cpp:245
Completed multi-tile stamp statistics and Pcg-compatible affected-pixel mappings.
Definition TerrainMultiTile.h:55
Value configuration for a rectangular stamp in world X/Z coordinates.
Definition TerrainStamp.h:22