载入中...
搜索中...
未找到
TerrainGenerationSession.cpp
浏览该文件的文档.
30 for (std::size_t i = 0; i < sizeof(T); ++i) bytes.push_back(static_cast<char>((bits >> (i * 8)) & 255U));
39 std::underlying_type_t<T> raw{}; if (!scalar(raw)) return false; value = static_cast<T>(raw); return true;
43 std::uint32_t raw{}; if (!scalar(raw)) return false; value = std::bit_cast<float>(raw); return std::isfinite(value);
45 std::uint64_t raw{}; if (!scalar(raw)) return false; value = std::bit_cast<double>(raw); return std::isfinite(value);
61 if (!reader.scalar(width) || !reader.scalar(height) || width <= 0 || height <= 0 || width > INT_MAX / height)
70 for (unsigned char value : bytes) { result.push_back(digits[value >> 4]); result.push_back(digits[value & 15]); }
77 auto nibble = [](char c) { return c >= '0' && c <= '9' ? c - '0' : c >= 'a' && c <= 'f' ? c - 'a' + 10 : -1; };
113 return state.water.advanceHydraulic(state.terrain, state.sediment, c.water, c.sediment, c.thermal, c.iterations);
153Result<int> execute(Heightmap& h, const SmoothRecord& c) { return applyTerrainSmooth(h, c.mask, c.settings); }
154Result<int> execute(Heightmap& h, const RidgeRecord& c) { return applyTerrainRidges(h, c.mask, c.settings); }
155Result<int> execute(Heightmap& h, const TerraceRecord& c) { return applyTerrainTerrace(h, c.mask, c.settings); }
156Result<int> execute(Heightmap& h, const PowerRecord& c) { return applyTerrainPower(h, c.mask, c.power); }
175#define SESSION_STAMP_FIELDS(X) X(originX) X(originZ) X(spacingX) X(spacingZ) X(centerX) X(centerZ) X(width) X(depth) X(rotation) X(amplitude) X(baseHeight) X(blendStrength) X(operation)
177#define SESSION_RIDGE_FIELDS(X) X(mixStrength) X(exponent) X(strength) X(minimum) X(maximum) X(passes)
179#define SESSION_MIX_FIELDS(X) X(minimum) X(maximum) X(midpoint) X(strength) X(clipMinimum) X(clipMaximum)
180#define SESSION_WATER_FIELDS(X) X(spacingX) X(spacingZ) X(heightScale) X(waterScale) X(dt) X(precipitation) X(evaporation) X(flowAcceleration)
182#define SESSION_THERMAL_FIELDS(X) X(spacingX) X(spacingZ) X(heightScale) X(reposeSlope) X(dt) X(iterations)
187template <> void writeSessionValue(SessionWriter& writer, const TerrainStampSettings& value) { SESSION_STAMP_FIELDS(SESSION_WRITE_FIELD) }
188template <> bool readSessionValue(SessionReader& reader, TerrainStampSettings& value) { SESSION_STAMP_FIELDS(SESSION_READ_FIELD) return true; }
189template <> void writeSessionValue(SessionWriter& writer, const TerrainSmoothSettings& value) { SESSION_SMOOTH_FIELDS(SESSION_WRITE_FIELD) }
190template <> bool readSessionValue(SessionReader& reader, TerrainSmoothSettings& value) { SESSION_SMOOTH_FIELDS(SESSION_READ_FIELD) return true; }
191template <> void writeSessionValue(SessionWriter& writer, const TerrainRidgeSettings& value) { SESSION_RIDGE_FIELDS(SESSION_WRITE_FIELD) }
192template <> bool readSessionValue(SessionReader& reader, TerrainRidgeSettings& value) { SESSION_RIDGE_FIELDS(SESSION_READ_FIELD) return true; }
193template <> void writeSessionValue(SessionWriter& writer, const TerrainTerraceSettings& value) { SESSION_TERRACE_FIELDS(SESSION_WRITE_FIELD) }
194template <> bool readSessionValue(SessionReader& reader, TerrainTerraceSettings& value) { SESSION_TERRACE_FIELDS(SESSION_READ_FIELD) return true; }
195template <> void writeSessionValue(SessionWriter& writer, const TerrainHeightMixSettings& value) { SESSION_MIX_FIELDS(SESSION_WRITE_FIELD) }
196template <> bool readSessionValue(SessionReader& reader, TerrainHeightMixSettings& value) { SESSION_MIX_FIELDS(SESSION_READ_FIELD) return true; }
197template <> void writeSessionValue(SessionWriter& writer, const TerrainWaterSettings& value) { SESSION_WATER_FIELDS(SESSION_WRITE_FIELD) }
198template <> bool readSessionValue(SessionReader& reader, TerrainWaterSettings& value) { SESSION_WATER_FIELDS(SESSION_READ_FIELD) return true; }
199template <> void writeSessionValue(SessionWriter& writer, const TerrainSedimentSettings& value) { SESSION_SEDIMENT_FIELDS(SESSION_WRITE_FIELD) }
200template <> bool readSessionValue(SessionReader& reader, TerrainSedimentSettings& value) { SESSION_SEDIMENT_FIELDS(SESSION_READ_FIELD) return true; }
201template <> void writeSessionValue(SessionWriter& writer, const TerrainThermalSettings& value) { SESSION_THERMAL_FIELDS(SESSION_WRITE_FIELD) }
202template <> bool readSessionValue(SessionReader& reader, TerrainThermalSettings& value) { SESSION_THERMAL_FIELDS(SESSION_READ_FIELD) return true; }
252TerrainGenerationSession::TerrainGenerationSession(TerrainGenerationSession&&) noexcept = default;
253TerrainGenerationSession& TerrainGenerationSession::operator=(TerrainGenerationSession&&) noexcept = default;
263int TerrainGenerationSession::getOperationCount() const noexcept { return impl_ ? int(impl_->commands.size()) : 0; }
264int TerrainGenerationSession::getAppliedCount() const noexcept { return impl_ ? impl_->cursor : 0; }
271 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.session: cancel pending replay first"));
306Result<int> TerrainGenerationSession::contrast(const Heightmap& mask, float strength, float featureSize) {
309Result<int> TerrainGenerationSession::smooth(const Heightmap& mask, const TerrainSmoothSettings& settings) {
312Result<int> TerrainGenerationSession::ridges(const Heightmap& mask, const TerrainRidgeSettings& settings) {
315Result<int> TerrainGenerationSession::terrace(const Heightmap& mask, const TerrainTerraceSettings& settings) {
321Result<int> TerrainGenerationSession::heightCurve(const Heightmap& mask, const Heightmap& curve, float minimum,
341 if (!impl_ || !impl_->current || !validRaster(output) || output.getWidth() != impl_->baseline.getWidth() ||
346Result<int> TerrainGenerationSession::exportWater(Heightmap& output, TerrainWaterChannel channel) const {
347 if (!impl_ || !impl_->current) return invalid("terrain.session: initialized simulation required");
381 if (!impl_ || impl_->replayStatus != TerrainSessionRunStatus::Pending || !impl_->replayCandidate ||
411 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.session.cancelReplay: no pending replay"));
434 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.session: invalid operation index"));
438 if (!impl_ || !impl_->current || !validRaster(output) || output.getWidth() != impl_->current->terrain.getWidth() ||
447 DiagnosticCode::InvalidArgument, "terrain.session.snapshot: initialized idle session required"));
500 DiagnosticCode::InvalidArgument, "terrain.session.restore: editable idle session and bounded JSON required"));
511 if (!schema || *schema != "eve.procgen.terrain-generation-session" || !version || *version != 1 || !payload)
520 !reader.scalar(candidate->access) || !reader.scalar(count) || count > kMaximumSessionCommands ||
522 (candidate->access != TerrainSessionAccess::Editable && candidate->access != TerrainSessionAccess::Locked))
534 case 0: { StampRecord v; valid = readSessionHeightmap(reader, v.stamp) && readSessionHeightmap(reader, v.local) && readSessionHeightmap(reader, v.global) && readSessionValue(reader, v.settings); command.operation = std::move(v); break; }
535 case 1: { ContrastRecord v; valid = readSessionHeightmap(reader, v.mask) && reader.scalar(v.strength) && reader.scalar(v.featureSize); command.operation = std::move(v); break; }
536 case 2: { SmoothRecord v; valid = readSessionHeightmap(reader, v.mask) && readSessionValue(reader, v.settings); command.operation = std::move(v); break; }
537 case 3: { RidgeRecord v; valid = readSessionHeightmap(reader, v.mask) && readSessionValue(reader, v.settings); command.operation = std::move(v); break; }
538 case 4: { TerraceRecord v; valid = readSessionHeightmap(reader, v.mask) && readSessionValue(reader, v.settings); command.operation = std::move(v); break; }
539 case 5: { PowerRecord v; valid = readSessionHeightmap(reader, v.mask) && reader.scalar(v.power); command.operation = std::move(v); break; }
540 case 6: { CurveRecord v; valid = readSessionHeightmap(reader, v.mask) && readSessionHeightmap(reader, v.curve) && reader.scalar(v.minimum) && reader.scalar(v.maximum); command.operation = std::move(v); break; }
541 case 7: { MixRecord v; valid = readSessionHeightmap(reader, v.local) && readSessionHeightmap(reader, v.global) && readSessionValue(reader, v.settings); command.operation = std::move(v); break; }
542 case 8: { SimulationResetRecord v; valid = reader.scalar(v.depth); command.operation = v; break; }
543 case 9: { ThermalRecord v; valid = readSessionValue(reader, v.settings); command.operation = v; break; }
#define SESSION_SEDIMENT_FIELDS(X)
Definition TerrainGenerationSession.cpp:181
Owning, renderer-independent dynamic values.
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
static Result< Value > fromJson(std::string_view json)
Parse one strict JSON value into an owning Value.
Definition Value.cpp:57
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:21
Owned in-memory terrain operation session; records native stamps, scalar effects and erosion....
Definition TerrainGenerationSession.h:32
Result< int > resetSimulation(float depth=0)
Record a simulation reset: zero sediment, flux and velocity; set uniform nonnegative water depth....
Definition TerrainGenerationSession.cpp:329
Result< TerrainSessionRunStatus > beginReplay()
Start replaying the applied history into a private candidate without changing current terrain.
Definition TerrainGenerationSession.cpp:365
Result< std::string > snapshotJson() const
Serialize schema version 1 with the complete replayable operation history.
Definition TerrainGenerationSession.cpp:444
Result< TerrainSessionRunStatus > stepReplay(int maxOperations)
Execute at most maxOperations commands and publish once when the candidate completes.
Definition TerrainGenerationSession.cpp:380
Result< int > power(const Heightmap &mask, float power)
Record power transform; copies all borrowed inputs and values.
Definition TerrainGenerationSession.cpp:318
Result< int > copySediment(Heightmap &output) const
Copy signed current sediment into a matching finite output, including while locked.
Definition TerrainGenerationSession.cpp:340
Result< bool > operationEnabled(int index) const
Read a command's enabled flag, or InvalidArgument for an out-of-range history index.
Definition TerrainGenerationSession.cpp:431
Result< int > exportWater(Heightmap &output, TerrainWaterChannel channel) const
Copy a raw water channel into a matching finite output, including while locked.
Definition TerrainGenerationSession.cpp:346
Result< int > terrace(const Heightmap &mask, const TerrainTerraceSettings &settings)
Record terracing; copies all borrowed inputs and values.
Definition TerrainGenerationSession.cpp:315
Result< int > contrast(const Heightmap &mask, float strength, float featureSize)
Record nine-tap contrast; copies all borrowed inputs and values.
Definition TerrainGenerationSession.cpp:306
Result< int > heightCurve(const Heightmap &mask, const Heightmap &curve, float minimum, float maximum)
Record height-curve transform; copies all borrowed inputs and values.
Definition TerrainGenerationSession.cpp:321
int getReplayCompletedOperations() const noexcept
Return commands visited by the current or most recent staged replay.
Definition TerrainGenerationSession.cpp:260
Result< int > hydraulic(const TerrainWaterSettings &water, const TerrainSedimentSettings &sediment, const TerrainThermalSettings &thermal, int iterations)
Record complete water/sediment/thermal iterations using preceding simulation state....
Definition TerrainGenerationSession.cpp:335
Result< int > copyTerrain(Heightmap &output) const
Copy current terrain into an existing matching finite output; allowed while locked.
Definition TerrainGenerationSession.cpp:437
Result< int > ridges(const Heightmap &mask, const TerrainRidgeSettings &settings)
Record ridge iteration; copies all borrowed inputs and values.
Definition TerrainGenerationSession.cpp:312
Result< int > setOperationEnabled(int index, bool enabled)
Toggle a command and replay the applied prefix atomically; index is history-local,...
Definition TerrainGenerationSession.cpp:418
Result< void > setAccess(TerrainSessionAccess access)
Change only the edit policy; unlocking is always permitted, invalid enum values are rejected.
Definition TerrainGenerationSession.cpp:265
Result< int > smooth(const Heightmap &mask, const TerrainSmoothSettings &settings)
Record two-pass smoothing; copies all borrowed inputs and values.
Definition TerrainGenerationSession.cpp:309
Result< int > heightMix(const Heightmap &local, const Heightmap &global, const TerrainHeightMixSettings &settings)
Record height mixing; copies all borrowed inputs and values.
Definition TerrainGenerationSession.cpp:325
Result< int > redo()
Move the applied prefix forward one command and replay; no redo returns InvalidArgument.
Definition TerrainGenerationSession.cpp:417
TerrainSessionAccess getAccess() const noexcept
Read current edit policy; moved-from sessions are editable.
Definition TerrainGenerationSession.cpp:254
Result< void > restoreJson(const std::string &json)
Atomically restore schema version 1 and rebuild the applied prefix before publication.
Definition TerrainGenerationSession.cpp:495
int getOperationCount() const noexcept
Count all recorded commands, including the redo suffix.
Definition TerrainGenerationSession.cpp:263
TerrainGenerationSession()
Construct an empty editable session.
Result< int > stamp(const Heightmap &stamp, const TerrainStampSettings &settings, const Heightmap &localMask, const Heightmap &globalMask)
Append an owned stamp command, truncating redo only on success; locked sessions reject it.
Definition TerrainGenerationSession.cpp:286
Result< TerrainSessionRunStatus > cancelReplay()
Cancel a pending replay and discard its private candidate without changing current terrain.
Definition TerrainGenerationSession.cpp:408
Result< int > reset(const Heightmap &baseline)
Copy a finite baseline, zero sediment/water and clear history atomically; locked sessions reject rese...
Definition TerrainGenerationSession.cpp:276
Result< int > undo()
Move the applied prefix back one command and replay; no history returns InvalidArgument.
Definition TerrainGenerationSession.cpp:416
Result< int > replay()
Re-evaluate the applied history prefix from baseline atomically; locked sessions reject it.
Definition TerrainGenerationSession.cpp:364
Result< int > thermal(const TerrainThermalSettings &settings)
Record thermal erosion using accumulated sediment; water is preserved. Settings are copied.
Definition TerrainGenerationSession.cpp:332
TerrainSessionRunStatus getReplayStatus() const noexcept
Return the staged replay lifecycle status.
Definition TerrainGenerationSession.cpp:257
int getAppliedCount() const noexcept
Count commands in the applied prefix, including disabled commands.
Definition TerrainGenerationSession.cpp:264
~TerrainGenerationSession()
Destroy owned terrain and command snapshots.
Result< int > publish(Heightmap &target, std::vector< float > candidate)
Publish.
Definition TerrainRasterInternal.h:62
Definition EvpackPointGraphLoader.h:12
Result< int > applyTerrainTerrace(Heightmap &target, const Heightmap &mask, const TerrainTerraceSettings &settings)
Terrace scalar heights using nearest-even rounding and the shader's one-sided bevel.
Definition TerrainEffect.cpp:125
Result< int > applyTerrainContrast(Heightmap &target, const Heightmap &mask, float strength, float featureSize)
Apply the nine-tap Pcg contrast equation to native scalar heights.
Definition TerrainEffect.cpp:26
TerrainSessionRunStatus
Observable lifecycle of a caller-driven staged session replay.
Definition TerrainGenerationSession.h:20
Result< int > applyTerrainHeightMix(Heightmap &target, const Heightmap &local, const Heightmap &global, const TerrainHeightMixSettings &settings)
Mix centered local brush heights into terrain, then globally mask and clip.
Definition TerrainEffect.cpp:179
Result< int > applyTerrainSmooth(Heightmap &target, const Heightmap &mask, const TerrainSmoothSettings &settings)
Apply Pcg's horizontal then vertical seven-pair weighted smooth passes.
Definition TerrainEffect.cpp:49
Result< int > applyTerrainPower(Heightmap &target, const Heightmap &mask, float power)
Apply the Pcg PowerOf control: lerp(height,pow(height,4-power),mask).
Definition TerrainEffect.cpp:142
TerrainSessionAccess
Edit policy for the owned operation history and terrain.
Definition TerrainGenerationSession.h:18
TerrainWaterChannel
Stored scalar channels; Pcg erosion masks read FluxRight or VelocityX, not vector magnitude.
Definition TerrainWaterField.h:11
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
Result< int > applyTerrainRidges(Heightmap &target, const Heightmap &mask, const TerrainRidgeSettings &settings)
Apply ordered horizontal/vertical ridge powers, neighbor mixing and per-pass clipping.
Definition TerrainEffect.cpp:89
Result< int > applyTerrainThermal(Heightmap &heights, Heightmap &sediment, const TerrainThermalSettings &settings)
Apply the source thermal equation, publishing height and sediment together.
Definition TerrainErosion.cpp:7
Result< int > applyTerrainHeightCurve(Heightmap &target, const Heightmap &mask, const Heightmap &curve, float minimum, float maximum)
Apply the height-transform shader's smoothstep and one-row height curve.
Definition TerrainEffect.cpp:160
std::vector< RuntimeTensor > execute(const Node &n, const std::vector< const RuntimeTensor * > &in, OnnxCompute *compute)
Execute.
Definition OnnxExecute.cpp:207
@ InvalidArgument
bool enabled
Definition TerrainGenerationSession.cpp:172
std::variant< StampRecord, ContrastRecord, SmoothRecord, RidgeRecord, TerraceRecord, PowerRecord, CurveRecord, MixRecord, SimulationResetRecord, ThermalRecord, HydraulicRecord > operation
Definition TerrainGenerationSession.cpp:171
int replayNext
Definition TerrainGenerationSession.cpp:222
Heightmap baseline
Definition TerrainGenerationSession.cpp:215
TerrainSessionAccess access
Definition TerrainGenerationSession.cpp:219
Result< int > rebuild()
Definition TerrainGenerationSession.cpp:231
std::optional< SessionState > replayCandidate
Definition TerrainGenerationSession.cpp:221
std::vector< Command > commands
Definition TerrainGenerationSession.cpp:217
Impl()=default
TerrainSessionRunStatus replayStatus
Definition TerrainGenerationSession.cpp:220
Impl(const Impl &other)
Definition TerrainGenerationSession.cpp:224
bool editable() const
Definition TerrainGenerationSession.cpp:227
std::shared_ptr< const SessionState > current
Definition TerrainGenerationSession.cpp:216
int cursor
Definition TerrainGenerationSession.cpp:218
Mix-height scalar controls; delta scale is maximum-minimum, independent of clipping bounds....
Definition TerrainEffect.h:102
Ridge controls in caller height units, with explicit clipping bounds. Defaults match the Pcg packed s...
Definition TerrainEffect.h:32
Effective sediment coefficients from Hydraulic.compute, after UI conversion. The source hardcodes har...
Definition TerrainErosion.h:14
Two-pass smoothing controls; radius in texels, verticality in [-1,1], strength in [0,...
Definition TerrainEffect.h:22
Value configuration for a rectangular stamp in world X/Z coordinates.
Definition TerrainStamp.h:22
Terrace frequency in inverse height units, interior bevel in [0,1], strength in [0,...
Definition TerrainEffect.h:39
Explicit simulation controls for the Pcg eight-neighbor thermal kernel. Height differences are multip...
Definition TerrainErosion.h:114
Explicit constants for the source hydraulic water-flow equations, after UI unit conversion.
Definition TerrainWaterField.h:14