载入中...
搜索中...
未找到
TerrainSplatmap.cpp
浏览该文件的文档.
49Result<int> GtsHeightBlendSet::addLayer(const Heightmap& height, float contrast, float brightness, float increase) {
51 if (!validRaster(height) || !std::isfinite(contrast) || contrast < 0 || !std::isfinite(brightness) ||
52 !std::isfinite(increase)) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.gtsHeightBlend: finite layer transform required"));
54 if (impl_->layers.size() >= 8) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.gtsHeightBlend: at most eight layers supported"));
57 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.gtsHeightBlend: all height rasters must match"));
61int GtsHeightBlendSet::getLayerCount() const noexcept { return impl_ ? static_cast<int>(impl_->layers.size()) : 0; }
77 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splatmap: positive topology and valid default layer required"));
81 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splatmap: topology exceeds supported size"));
92 if (!impl_ || impl_->layers <= 0) return Result<float>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splatmap: initialize before sampling"));
93 if (layer < 0 || layer >= impl_->layers || x < 0 || x >= impl_->width || y < 0 || y >= impl_->height)
94 return Result<float>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splatmap: sample index out of range"));
99 if (!impl_ || impl_->width <= 0 || layer < 0 || layer >= impl_->layers || output.getWidth() != impl_->width ||
101 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.copyLayer: initialized source, valid layer and matching output required"));
111int TerrainSplatmap::getLastChangedSamples() const noexcept { return impl_ ? impl_->lastChanged : 0; }
118 if (&terrainA == &terrainB || !terrainA.impl_ || !terrainB.impl_ || terrainA.impl_->layers <= 0 ||
121 terrainA.impl_->width != terrainA.impl_->height || terrainB.impl_->width != terrainB.impl_->height ||
130 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.textureAlign: distinct initialized square maps and valid finite settings required"));
138 const auto near = [&](double a, double b) { return std::abs(a - b) < settings.adjacencyTolerance; };
150 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.textureAlign: terrain bounds are not adjacent"));
172 oldA[static_cast<std::size_t>(layer)] = terrainA.impl_->weights[terrainA.impl_->index(layer, xA, yA)];
173 oldB[static_cast<std::size_t>(layer)] = terrainB.impl_->weights[terrainB.impl_->index(layer, xB, yB)];
203Result<int> paintTerrainSplatLayer(TerrainSplatmap& target, const Heightmap& paint, int targetLayer) {
212 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.paintSplat: initialized matching topology, layer and normalized paint required"));
244 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.gtsHeightBlend: initialized splat, matching heights and normalized factor required"));
246 if (layer.height.getWidth() != input.impl_->width || layer.height.getHeight() != input.impl_->height)
247 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.gtsHeightBlend: topology mismatch"));
292 return Result<TerrainMultiTileReport>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.paintSplat.multitile: tiles and normalized paint required"));
298 !owners.insert(tile.splatmap).second || targetLayer < 0 || targetLayer >= tile.splatmap->impl_->layers)
299 return Result<TerrainMultiTileReport>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.paintSplat.multitile: distinct initialized owners and common target layer required"));
303 auto mapped = mapTerrainOperationMultiTile(descriptors, operationSettings, TerrainOperationDomain::Texture,
307 if (operationPaint.getWidth() != report.operationWidth || operationPaint.getHeight() != report.operationHeight)
308 return Result<TerrainMultiTileReport>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.paintSplat.multitile: paint dimensions must match the shared operation window"));
317 DiagnosticCode::InvariantViolation, "terrain.paintSplat.multitile: mapped terrain was not supplied"));
322 return Result<TerrainMultiTileReport>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.paintSplat.multitile: a selected single-layer splatmap must remain one"));
329 const float replacement = operationPaint.height(mapping.operationX + x, mapping.operationY + y);
349 return Result<TerrainMultiTileReport>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.paintSplat.multitile: changed texel count exceeds range"));
387TerrainMultiSplatWorkspace::TerrainMultiSplatWorkspace(TerrainMultiSplatWorkspace&&) noexcept = default;
388TerrainMultiSplatWorkspace& TerrainMultiSplatWorkspace::operator=(TerrainMultiSplatWorkspace&&) noexcept = default;
390Result<int> TerrainMultiSplatWorkspace::addTile(const std::string& name, const TerrainSplatmap& splatmap,
394 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.workspace: initialized named tile required"));
395 if (std::any_of(impl_->tiles.begin(), impl_->tiles.end(), [&](const auto& tile) { return tile.name == name; }))
396 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.workspace: duplicate tile name"));
398 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.workspace: topology is fixed after painting"));
410 auto checked = mapTerrainOperationMultiTile(descriptors, bounds, TerrainOperationDomain::Texture, worldMap, {name});
422 if (!impl_) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.workspace: moved-from workspace"));
426 descriptors.push_back({tile.name, &tile.splatmap, tile.originX, tile.originZ, tile.width, tile.depth,
428 auto painted = paintTerrainSplatLayerMultiTile(descriptors, operationPaint, targetLayer, operationSettings,
440Result<int> TerrainMultiSplatWorkspace::copyTile(const std::string& name, TerrainSplatmap& output) const {
441 if (!impl_) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.workspace: moved-from workspace"));
444 if (found == impl_->tiles.end()) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.workspace: tile not found"));
450 if (!impl_ || impl_->cursor <= 0) return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.workspace: no undo snapshot"));
457 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.splat.workspace: no redo snapshot"));
462int TerrainMultiSplatWorkspace::getTileCount() const noexcept { return impl_ ? static_cast<int>(impl_->tiles.size()) : 0; }
463int TerrainMultiSplatWorkspace::getLastChangedSamples() const noexcept { return impl_ ? impl_->last.changedSamples : 0; }
464int TerrainMultiSplatWorkspace::getLastAffectedTiles() const noexcept { return impl_ ? impl_->last.affectedTiles : 0; }
468int TerrainMultiSplatWorkspace::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
Owning ordered GTS layer-height rasters and their alpha-channel transforms.
Definition TerrainSplatmap.h:88
int getLayerCount() const noexcept
Return the number of owned height layers.
Definition TerrainSplatmap.cpp:61
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:21
Owning script-safe multi-terrain splat transaction and all-tile undo history. Input maps are copied....
Definition TerrainSplatmap.h:152
~TerrainMultiSplatWorkspace()
Terrain multi splat workspace.
Owning normalized terrain texture-layer weights with atomic mutation. Layers share one finite width/h...
Definition TerrainSplatmap.h:20
int getHeight() const noexcept
Current splat height, or zero before initialization.
Definition TerrainSplatmap.cpp:113
Result< int > copyLayer(int layer, Heightmap &output) const
Copy one complete texture layer into a same-sized scalar mask atomically.
Definition TerrainSplatmap.cpp:98
int getLayerCount() const noexcept
Current layer count, or zero before initialization.
Definition TerrainSplatmap.cpp:114
Result< int > initialize(int width, int height, int layerCount, int defaultLayer=0)
Initialize topology and assign all weight to defaultLayer.
Definition TerrainSplatmap.cpp:75
TerrainSplatmap & operator=(TerrainSplatmap &&) noexcept
Operator =.
Result< float > sample(int layer, int x, int y) const
Return one layer weight, or a structured range/precondition failure.
Definition TerrainSplatmap.cpp:91
int getWidth() const noexcept
Current splat width, or zero before initialization.
Definition TerrainSplatmap.cpp:112
int getLastChangedSamples() const noexcept
Number of texels changed by the last successful paint operation.
Definition TerrainSplatmap.cpp:111
Definition EvpackPointGraphLoader.h:12
Result< TerrainMultiTileReport > paintTerrainSplatLayerMultiTile(const std::vector< TerrainSplatTile > &tiles, const Heightmap &operationPaint, int targetLayer, const TerrainStampSettings &operationSettings, bool worldMapOperation, const std::vector< std::string > &validTerrainNames)
Paint one shared Pcg Texture-domain operation raster across selected tiles atomically.
Definition TerrainSplatmap.cpp:283
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
Result< int > paintTerrainSplatLayer(TerrainSplatmap &target, const Heightmap &paint, int targetLayer)
Replace one terrain layer with a normalized paint raster and proportionally renormalize all other lay...
Definition TerrainSplatmap.cpp:203
Result< int > applyGtsHeightBlend(TerrainSplatmap &output, const TerrainSplatmap &input, const GtsHeightBlendSet &heights, float blendFactor)
Recompute all splat weights using the GTS texture-height blending equation.
Definition TerrainSplatmap.cpp:239
Result< int > alignTerrainSplatTextures(TerrainSplatmap &terrainA, TerrainSplatmap &terrainB, const TerrainTextureAlignSettings &settings)
Blend texture weights on adjacent terrain edges using Pcg's synchronized-noise equation.
Definition TerrainSplatmap.cpp:116
@ InvalidArgument
@ InvariantViolation
Definition Container.h:602
float brightness
Definition TerrainSplatmap.cpp:42
Heightmap height
Definition TerrainSplatmap.cpp:42
float contrast
Definition TerrainSplatmap.cpp:42
float increase
Definition TerrainSplatmap.cpp:42
std::vector< Layer > layers
Definition TerrainSplatmap.cpp:43
TerrainMultiTileReport report
Definition TerrainSplatmap.cpp:366
std::vector< TerrainSplatmap > maps
Definition TerrainSplatmap.cpp:365
std::string name
Definition TerrainSplatmap.cpp:359
double originZ
Definition TerrainSplatmap.cpp:361
bool worldMap
Definition TerrainSplatmap.cpp:362
double width
Definition TerrainSplatmap.cpp:361
double depth
Definition TerrainSplatmap.cpp:361
TerrainSplatmap splatmap
Definition TerrainSplatmap.cpp:360
double originX
Definition TerrainSplatmap.cpp:361
std::vector< Snapshot > history
Definition TerrainSplatmap.cpp:370
TerrainMultiTileReport last
Definition TerrainSplatmap.cpp:369
void restore(const Snapshot &value)
Definition TerrainSplatmap.cpp:379
Snapshot snapshot() const
Definition TerrainSplatmap.cpp:372
std::vector< Tile > tiles
Definition TerrainSplatmap.cpp:368
Completed multi-tile stamp statistics and Pcg-compatible affected-pixel mappings.
Definition TerrainMultiTile.h:55
std::vector< float > weights
Definition TerrainSplatmap.cpp:36
std::size_t index(int layer, int x, int y) const
Definition TerrainSplatmap.cpp:37
Value configuration for a rectangular stamp in world X/Z coordinates.
Definition TerrainStamp.h:22
World-space placement and Pcg-compatible seam blending controls for two splatmaps.
Definition TerrainSplatmap.h:62