12std::uint64_t mix(std::uint64_t
value)
noexcept {
13 value += 0x9E3779B97F4A7C15ULL;
19std::uint64_t coordinateHash(std::uint64_t
seed,
int x,
int y, std::uint64_t stream)
noexcept {
20 return mix(
seed ^ (std::uint64_t(std::uint32_t(
x)) << 32U) ^
21 std::uint64_t(std::uint32_t(
y)) ^ stream);
24int floorDivGeneration(
int value,
int divisor)
noexcept {
25 return value >= 0 ?
value / divisor : -((-
value + divisor - 1) / divisor);
28int interpolatedNoise(std::uint64_t
seed,
int coordinate,
int spacing,
29 std::uint64_t stream)
noexcept {
30 const int lattice = floorDivGeneration(coordinate,
spacing);
32 const int first = int(coordinateHash(
seed, lattice, 0, stream) % 20001ULL) - 10000;
33 const int second = int(coordinateHash(
seed, lattice + 1, 0, stream) % 20001ULL) - 10000;
38 const int band = floorDivGeneration(worldX, 192);
39 return PixelBiome(coordinateHash(
seed, band, 0, 0x42494F4D45ULL) % 4ULL);
45 const auto& definition = catalog.definition(
material);
46 cell.temperature = definition.defaultTemperature;
47 cell.lifetime = std::uint8_t(std::min<std::uint16_t>(
48 definition.defaultLifetime, std::numeric_limits<std::uint8_t>::max()));
64 "pixelworld.generation"));
67void hashByte(std::uint64_t&
hash, std::uint8_t
value)
noexcept {
69 hash *= 1099511628211ULL;
73void hashValue(std::uint64_t&
hash, T
value)
noexcept {
74 using Unsigned = std::make_unsigned_t<T>;
75 const Unsigned bits =
static_cast<Unsigned
>(
value);
77 hashByte(
hash, std::uint8_t(bits >> (
index * 8U)));
85 std::uint64_t sourceLastEditSequence) {
87 return invalidGeneration(
"unsupported PixelWorld generation schema version",
"schemaVersion");
89 return invalidGeneration(
"generation region bounds are inverted",
"region");
93 return invalidGeneration(
"generation region exceeds 65536 Chunks",
"region");
94 if (sourceRevision == 0)
95 return invalidGeneration(
"source revision must be positive",
"sourceRevision");
97 return invalidGeneration(
"generation Catalog must provide the built-in terrain material ids",
99 if (
request.terrainAmplitude < 0 ||
request.terrainAmplitude > 4096)
100 return invalidGeneration(
"terrain amplitude must be in [0, 4096]",
"terrainAmplitude");
101 if (
request.caveThreshold > 10'000)
102 return invalidGeneration(
"cave threshold must be in [0, 10000]",
"caveThreshold");
103 std::uint64_t stampCells = 0;
107 std::uint64_t(
stamp.width) * std::uint64_t(
stamp.height) !=
stamp.cells.size())
108 return invalidGeneration(
"stamp dimensions must match its row-major cells",
109 "stamps[" + std::to_string(
index) +
"]");
110 stampCells +=
stamp.cells.size();
111 if (stampCells > 4'194'304)
112 return invalidGeneration(
"material stamps exceed the cell budget",
"stamps");
115 return invalidGeneration(
"stamp references an unknown material",
116 "stamps[" + std::to_string(
index) +
"].cells");
122 output.batch.sourceRevision = sourceRevision;
123 output.batch.sourceTick = sourceTick;
124 output.batch.sourceLastEditSequence = sourceLastEditSequence;
127 std::uint64_t
hash = 1469598103934665603ULL;
129 for (
int chunkY =
request.region.minY; chunkY <=
request.region.maxY; ++chunkY)
130 for (
int chunkX =
request.region.minX; chunkX <=
request.region.maxX; ++chunkX) {
145 const int surface =
request.surfaceY +
146 interpolatedNoise(
request.seed, worldX, 32, 0x53555246414345ULL) *
147 request.terrainAmplitude / 10000;
149 if (worldY >= surface) {
150 const int depth = worldY - surface;
151 const std::uint64_t caveNoise = coordinateHash(
152 request.seed, floorDivGeneration(worldX, 5),
153 floorDivGeneration(worldY, 5), 0x43415645ULL) % 10001ULL;
154 const bool cave =
depth > 5 && caveNoise <
request.caveThreshold;
157 if (worldY >=
request.waterLevel &&
158 coordinateHash(
request.seed, worldX, worldY, 0x5741544552ULL) % 5ULL == 0)
161 const std::uint64_t feature = coordinateHash(
162 request.seed, worldX, worldY, 0x46454154555245ULL);
163 cell = defaultCell(catalog, terrainMaterial(
biome,
depth, feature));
173 for (
int stampY = 0; stampY <
stamp.height; ++stampY)
174 for (
int stampX = 0; stampX <
stamp.width; ++stampX) {
175 const int worldX =
stamp.originX + stampX;
176 const int worldY =
stamp.originY + stampY;
181 std::size_t(worldX - chunkMinX)] =
182 stamp.cells[std::size_t(stampY) * std::size_t(
stamp.width) + stampX];
186 hashValue(
hash, std::int32_t(chunkX));
187 hashValue(
hash, std::int32_t(chunkY));
189 hashValue(
hash, std::uint16_t(
cell.material));
192 hashValue(
hash,
cell.thermalRemainder);
194 output.batch.chunks.push_back(std::move(snapshot));
195 output.chunks.push_back(summary);
std::array< std::uint8_t, 32 > hash
const GltfImportRequest & request
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.
Move-only operation result carrying either a value or Status.
static Result success(T value)
Construct a successful result owning value.
static Result failure(Status status)
Construct a failed result from a structured status.
Owning immutable material and reaction table used by one PixelWorld.
std::span< const MaterialDefinition > definitions() const noexcept
Borrow immutable definitions until this catalog is destroyed.
std::uint64_t fingerprint() const noexcept
Stable deterministic fingerprint included in world snapshots.
eve::Result< PixelWorldGenerationOutput > generatePixelWorld(const PixelWorldGenerationRequest &request, const MaterialCatalog &catalog, std::uint64_t sourceRevision, eve::SimulationTick sourceTick, std::uint64_t sourceLastEditSequence)
Generate a seamless canonical Chunk batch without mutating a PixelWorld.
MaterialId
Compact stable material identifier stored in each authoritative cell.
PixelBiome
Stable coarse biome selected from deterministic world coordinates.
constexpr int kPixelChunkSize
Compact authoritative state for one simulated world pixel.
std::uint64_t catalogFingerprint
Owning, immutable projection of one authoritative simulation chunk.
std::vector< PixelCell > cells
Deterministic diagnostics for one generated Chunk.
std::uint32_t stampedCells
Owning row-major material stamp applied after terrain and cave generation.
Owning generated correction plus reproducibility evidence.
Versioned bounded request for deterministic biome and cave generation.
static constexpr std::uint32_t kSchemaVersion