载入中...
搜索中...
未找到
TerrainMultiTile.cpp
浏览该文件的文档.
27bool selected(const TerrainHeightTile& tile, bool worldMap, const std::unordered_set<std::string>& allowed) {
31 return Result<TerrainMultiTileReport>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, message));
36 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.multitile: at least one tile required"));
40 if (tile.name.empty() || !tile.heightmap || !validRaster(*tile.heightmap) || !finite(tile.originX) ||
41 !finite(tile.originZ) || !finite(tile.width) || !finite(tile.depth) || tile.width <= 0 || tile.depth <= 0 ||
42 tile.heightmap->getWidth() < 2 || tile.heightmap->getHeight() < 2 || !targets.insert(tile.heightmap).second)
44 DiagnosticCode::InvalidArgument, "terrain.multitile: valid named distinct height tiles required"));
52 } else if (tile.heightmap->getWidth() != topology.width || tile.heightmap->getHeight() != topology.height ||
65 DiagnosticCode::InvalidArgument, "terrain.multitile: tile origins must align to whole tile spans"));
73 TerrainOperationDomain domain, bool worldMapOperation, const std::vector<std::string>& validTerrainNames) {
74 if (tiles.empty() || !finite(settings.centerX) || !finite(settings.centerZ) || !finite(settings.width) ||
75 !finite(settings.depth) || !finite(settings.rotation) || settings.width <= 0 || settings.depth <= 0)
78 if (!heightmap && domain != TerrainOperationDomain::Texture && domain != TerrainOperationDomain::Tree &&
79 domain != TerrainOperationDomain::TerrainDetail && domain != TerrainOperationDomain::GameObject &&
92 if (tile.name.empty() || !names.insert(tile.name).second || !finite(tile.originX) || !finite(tile.originZ) ||
116 const double c = std::abs(std::cos(settings.rotation)), s = std::abs(std::sin(settings.rotation));
141 const long long operationMaxX = static_cast<long long>(report.operationX) + report.operationWidth;
142 const long long operationMaxY = static_cast<long long>(report.operationY) + report.operationHeight;
145 if (tile.worldMap != worldMapOperation || (!allowed.empty() && !allowed.contains(tile.name))) continue;
146 if (!(minX < tile.originX + tile.width && maxX > tile.originX && minZ < tile.originZ + tile.depth &&
151 const long long localX = std::max(0LL, static_cast<long long>(report.operationX) - coordinateX);
152 const long long localY = std::max(0LL, static_cast<long long>(report.operationY) - coordinateY);
153 const long long localMaxX = std::min(static_cast<long long>(resolutionX), operationMaxX - coordinateX);
154 const long long localMaxY = std::min(static_cast<long long>(resolutionY), operationMaxY - coordinateY);
157 for (long long value : {coordinateX, coordinateY, localX, localY, affectedWidth, affectedHeight})
171 const std::vector<TerrainHeightTile>& tiles, const Heightmap& stamp, const TerrainStampSettings& settings,
174 if (tiles.empty() || !validRaster(stamp) || !validRaster(localMask) || !validRaster(globalMask))
177 !finite(settings.depth) || !finite(settings.rotation) || settings.width <= 0 || settings.depth <= 0)
185 if (!topologyResult.ok()) return Result<TerrainMultiTileReport>::failure(topologyResult.status());
189 const double c = std::abs(std::cos(settings.rotation)), s = std::abs(std::sin(settings.rotation));
210 if (operationWidth > std::numeric_limits<int>::max() || operationHeight > std::numeric_limits<int>::max())
258Result<int> stitchTerrainHeightmaps(const TerrainHeightTile& terrainA, const TerrainHeightTile& terrainB,
267 !finite(terrainB.width) || !finite(terrainB.depth) || terrainA.width <= 0 || terrainA.depth <= 0 ||
269 settings.extraSeamSize >= terrainA.heightmap->getWidth() || !std::isfinite(settings.maxDifference) ||
272 DiagnosticCode::InvalidArgument, "terrain.stitch: distinct matching square tiles and valid seam required"));
293 const double edgeSpacing = direction == Direction::North || direction == Direction::South ? spacingZ : spacingX;
296 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.stitch: tiles do not share an edge"));
391TerrainMultiTileWorkspace::TerrainMultiTileWorkspace(TerrainMultiTileWorkspace&&) noexcept = default;
392TerrainMultiTileWorkspace& TerrainMultiTileWorkspace::operator=(TerrainMultiTileWorkspace&&) noexcept = default;
394Result<int> TerrainMultiTileWorkspace::addTile(const std::string& name, const Heightmap& heightmap, double originX,
396 if (!impl_ || name.empty() || !validRaster(heightmap) || heightmap.getWidth() < 2 || heightmap.getHeight() < 2 ||
397 !finite(originX) || !finite(originZ) || !finite(width) || !finite(depth) || width <= 0 || depth <= 0)
400 if (std::any_of(impl_->tiles.begin(), impl_->tiles.end(), [&](const auto& tile) { return tile.name == name; }))
423Result<int> TerrainMultiTileWorkspace::stamp(const Heightmap& stampRaster, const TerrainStampSettings& settings,
433 descriptors.push_back({tile.name, &tile.heightmap, tile.originX, tile.originZ, tile.width, tile.depth,
435 auto result = applyTerrainStampMultiTile(descriptors, stampRaster, settings, localMask, globalMask,
447Result<int> TerrainMultiTileWorkspace::copyTile(const std::string& name, Heightmap& output) const {
451 auto found = std::find_if(impl_->tiles.begin(), impl_->tiles.end(), [&](const auto& tile) { return tile.name == name; });
458Result<int> TerrainMultiTileWorkspace::stitch(const std::string& terrainA, const std::string& terrainB,
462 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.multitile.workspace: two tile names required"));
471 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.multitile.workspace: stitch tile not found"));
472 TerrainHeightTile descA{a->name, &a->heightmap, a->originX, a->originZ, a->width, a->depth, a->worldMap};
485int TerrainMultiTileWorkspace::getTileCount() const noexcept { return impl_ ? int(impl_->tiles.size()) : 0; }
486int TerrainMultiTileWorkspace::getLastAffectedTiles() const noexcept { return impl_ ? impl_->last.affectedTiles : 0; }
487int TerrainMultiTileWorkspace::getLastChangedSamples() const noexcept { return impl_ ? impl_->last.changedSamples : 0; }
524int TerrainMultiTileWorkspace::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
Owning script-safe collection of height tiles with atomic multi-tile operations. Tiles are copied on ...
Definition TerrainMultiTile.h:128
~TerrainMultiTileWorkspace()
Terrain multi tile workspace.
Result< int > publish(Heightmap &target, std::vector< float > candidate)
Publish.
Definition TerrainRasterInternal.h:62
Definition EvpackPointGraphLoader.h:12
Result< TerrainMultiTileReport > applyTerrainStampMultiTile(const std::vector< TerrainHeightTile > &tiles, const Heightmap &stamp, const TerrainStampSettings &settings, const Heightmap &localMask, const Heightmap &globalMask, bool worldMapOperation, const std::vector< std::string > &validTerrainNames)
Apply one world-space stamp to all selected intersecting height tiles atomically.
Definition TerrainMultiTile.cpp:170
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 > stitchTerrainHeightmaps(const TerrainHeightTile &terrainA, const TerrainHeightTile &terrainB, const TerrainHeightStitchSettings &settings)
Stitch the overlapping shared edge of two grid-aligned height tiles with Pcg's seam interpolation.
Definition TerrainMultiTile.cpp:258
Result< int > applyTerrainStamp(Heightmap &target, const Heightmap &stamp, const TerrainStampSettings &s, const Heightmap &localMask, const Heightmap &globalMask)
Apply a rotated, bilinearly sampled stamp; publish only after all checks succeed.
Definition TerrainStamp.cpp:41
TerrainOperationDomain
Pcg multi-terrain pixel domain; only heightmaps share the border sample between adjacent tiles.
Definition TerrainMultiTile.h:30
@ GameObject
@ TerrainDetail
@ InvalidArgument
Definition Container.h:602
Pcg terrain-height seam controls; maxDifference is retained for source-profile compatibility.
Definition TerrainMultiTile.h:16
Borrowed mutable height tile participating in one synchronous world operation.
Definition TerrainMultiTile.h:22
Completed multi-tile stamp statistics and Pcg-compatible affected-pixel mappings.
Definition TerrainMultiTile.h:55
std::vector< TerrainAffectedPixels > mappings
Definition TerrainMultiTile.h:59
int operationHeight
Definition TerrainMultiTile.h:58
int changedSamples
Definition TerrainMultiTile.h:57
int affectedTiles
Definition TerrainMultiTile.h:56
int operationWidth
Definition TerrainMultiTile.h:58
TerrainMultiTileReport report
Definition TerrainMultiTile.cpp:372
std::vector< Heightmap > heightmaps
Definition TerrainMultiTile.cpp:371
Heightmap heightmap
Definition TerrainMultiTile.cpp:364
double depth
Definition TerrainMultiTile.cpp:365
double originX
Definition TerrainMultiTile.cpp:365
bool worldMap
Definition TerrainMultiTile.cpp:366
std::string name
Definition TerrainMultiTile.cpp:363
double originZ
Definition TerrainMultiTile.cpp:365
double width
Definition TerrainMultiTile.cpp:365
Snapshot snapshot() const
Definition TerrainMultiTile.cpp:376
std::vector< Snapshot > history
Definition TerrainMultiTile.cpp:374
std::vector< Tile > tiles
Definition TerrainMultiTile.cpp:368
void restore(const Snapshot &snapshot)
Definition TerrainMultiTile.cpp:383
TerrainMultiTileReport last
Definition TerrainMultiTile.cpp:369
Value configuration for a rectangular stamp in world X/Z coordinates.
Definition TerrainStamp.h:22