载入中...
搜索中...
未找到
Procgen.cpp
浏览该文件的文档.
1#include "procgen/Procgen.h"
2
4
5#include "image/ImageData.h"
6
9#include "procgen/Semantic.h"
14
15#include "graphics/Graphics.h"
16#include "graphics/Mesh.h"
17#include "graphics/Texture.h"
18#include "image/ImageData.h"
19
20#include <simplesquirrel/simplesquirrel.hpp>
21
22#include <vector>
23
24namespace eve::procgen {
25
27
34 // Sensible pixel-RPG default palette (games override GIDs to match tileset).
35 setPaletteGid("default", "empty", 0);
36 setPaletteGid("default", "wall", 1);
37 setPaletteGid("default", "floor", 2);
38 setPaletteGid("default", "corridor", 2);
39 setPaletteGid("default", "door", 3);
40 setPaletteGid("default", "water", 4);
41 setPaletteGid("default", "sand", 5);
42 setPaletteGid("default", "grass", 6);
43 setPaletteGid("default", "dirt", 7);
44 setPaletteGid("default", "stone", 8);
45 setPaletteGid("default", "snow", 9);
46 setPaletteGid("dungeon_default", "empty", 0);
47 setPaletteGid("dungeon_default", "wall", 1);
48 setPaletteGid("dungeon_default", "floor", 2);
49 setPaletteGid("dungeon_default", "corridor", 2);
50 setPaletteGid("dungeon_default", "door", 3);
51}
52
53Params *Procgen::newParams() { return new Params(); }
55
57 auto *g = new Grid2D();
58 g->resize(width, height);
59 return g;
60}
61
62bool Procgen::runGenerate(const std::string &algorithmId, const Params &params, Grid2D &out) {
63 lastError_.clear();
65 if (!GeneratorRegistry::instance().generate(algorithmId, params, out, lastError_)) {
66 if (lastError_.empty()) lastError_ = "generate failed";
67 return false;
68 }
69 return true;
70}
71
72Grid2D *Procgen::generate(const std::string &algorithmId, Params *params) {
73 if (!params) {
74 lastError_ = "generate: null params";
75 return nullptr;
76 }
77 auto *grid = new Grid2D();
78 if (!runGenerate(algorithmId, *params, *grid)) {
79 delete grid;
80 return nullptr;
81 }
82 return grid;
83}
84
85bool Procgen::generateTo(const std::string &algorithmId, Params *params, OutputSpec *output) {
86 if (!params) {
87 lastError_ = "generateTo: null params";
88 return false;
89 }
90 if (!output) {
91 lastError_ = "generateTo: null output";
92 return false;
93 }
94 Grid2D grid;
95 if (!runGenerate(algorithmId, *params, grid)) return false;
96
97 const std::string target = output->getTarget();
98 if (target == "grid") {
99 lastError_ = "generateTo: target 'grid' has no sink; use generate()";
100 return false;
101 }
102 if (target == "tilelayer") {
103 return applyToLayer(&grid, output->getPalette(), output->getLayer());
104 }
105 if (target == "json") {
106 if (!writeGridJson(grid, output->getPath(), &lastError_)) return false;
107 return true;
108 }
109 lastError_ = "generateTo: unknown target '" + target + "' (use grid|tilelayer|json)";
110 return false;
111}
112
113bool Procgen::applyToLayer(Grid2D *grid, const std::string &palette, map::TileLayer *layer) {
114 if (!grid) {
115 lastError_ = "applyToLayer: null grid";
116 return false;
117 }
118 if (!palettes_.applyToLayer(*grid, palette, layer, &lastError_)) return false;
119 return true;
120}
121
122void Procgen::setPaletteGid(const std::string &palette, const std::string &semantic, int gid) {
123 palettes_.setGid(palette, semantic, gid);
124}
125
126int Procgen::getPaletteGid(const std::string &palette, const std::string &semantic) const {
127 return palettes_.getGid(palette, semantic);
128}
129
131 algorithmIdsCache_ = GeneratorRegistry::instance().list();
132 return int(algorithmIdsCache_.size());
133}
134
135std::string Procgen::getAlgorithmId(int index) const {
136 if (algorithmIdsCache_.empty()) algorithmIdsCache_ = GeneratorRegistry::instance().list();
137 if (index < 0 || index >= int(algorithmIdsCache_.size())) return {};
138 return algorithmIdsCache_[size_t(index)];
139}
140
141bool Procgen::hasAlgorithm(const std::string &algorithmId) const {
142 return GeneratorRegistry::instance().has(algorithmId);
143}
144
146 if (!grid) {
147 lastError_ = "autotileGrid: null grid";
148 return false;
149 }
151}
152
154
155std::string Procgen::lastError() const { return lastError_; }
156
157std::string Procgen::gridToJson(Grid2D *grid) const {
158 if (!grid) return "{}";
159 return eve::procgen::gridToJson(*grid);
160}
161
162image::ImageData *Procgen::generateImage(const std::string &recipeId, Params *params) {
163 lastError_.clear();
164 if (!params) {
165 lastError_ = "generateImage: null params";
166 return nullptr;
167 }
169 image::ImageData *img =
170 TextureRecipeRegistry::instance().generate(recipeId, *params, lastError_);
171 if (!img && lastError_.empty()) lastError_ = "generateImage failed";
172 return img;
173}
174
175image::ImageData *Procgen::generateNormalImage(const std::string &recipeId, Params *params) {
176 image::ImageData *albedo = generateImage(recipeId, params);
177 if (!albedo) return nullptr;
178 const int w = albedo->getWidth();
179 const int h = albedo->getHeight();
180 auto *px = static_cast<const uint8_t *>(albedo->getData());
181 std::vector<float> height(size_t(w * h));
182 for (int i = 0; i < w * h; ++i) {
183 const size_t o = size_t(i) * 4u;
184 height[size_t(i)] =
185 (float(px[o]) * 0.299f + float(px[o + 1]) * 0.587f + float(px[o + 2]) * 0.114f) /
186 255.f;
187 }
188 const bool seamless = params->getInt("seamless", 1) != 0;
189 const float strength = params->getFloat("normalStrength", 4.f);
190 image::ImageData *nrm = heightToNormalImage(height, w, h, strength, seamless);
191 delete albedo;
192 return nrm;
193}
194
195graphics::Texture *Procgen::generateTexture(const std::string &recipeId, Params *params,
196 graphics::Graphics *gfx) {
197 if (!gfx) {
198 lastError_ = "generateTexture: null Graphics";
199 return nullptr;
200 }
201 image::ImageData *img = generateImage(recipeId, params);
202 if (!img) return nullptr;
203 const bool seamless = !params || params->getInt("seamless", 1) != 0;
204 auto *tex = gfx->newTexture(img->getWidth(), img->getHeight(),
205 static_cast<const uint8_t *>(img->getData()), seamless, seamless);
206 delete img;
207 return tex;
208}
209
212 textureRecipeIdsCache_ = TextureRecipeRegistry::instance().list();
213 return int(textureRecipeIdsCache_.size());
214}
215
216std::string Procgen::getTextureRecipeId(int index) const {
217 if (textureRecipeIdsCache_.empty()) {
219 textureRecipeIdsCache_ = TextureRecipeRegistry::instance().list();
220 }
221 if (index < 0 || index >= int(textureRecipeIdsCache_.size())) return {};
222 return textureRecipeIdsCache_[size_t(index)];
223}
224
225bool Procgen::hasTextureRecipe(const std::string &recipeId) const {
227 return TextureRecipeRegistry::instance().has(recipeId);
228}
229
231
233
234float Procgen::cloudCoverageAt(CloudField *field, float x, float z, float time) {
235 lastError_.clear();
236 if (!field) {
237 lastError_ = "cloudCoverageAt: null field";
238 return 0.f;
239 }
240 return field->coverageAt(x, z, time);
241}
242
243float Procgen::cloudShadowFactor(CloudShadow *shadow, float x, float z, float time) {
244 lastError_.clear();
245 if (!shadow) {
246 lastError_ = "cloudShadowFactor: null shadow";
247 return 1.f;
248 }
249 return shadow->shadowFactorAt(x, z, time);
250}
251
252void Procgen::sampleCloud(CloudField *field, float *out, int w, int h, float time, float x0,
253 float z0, float extent) {
254 lastError_.clear();
255 if (!field) {
256 lastError_ = "sampleCloud: null field";
257 return;
258 }
259 field->sample(out, w, h, time, x0, z0, extent);
260}
261
262void Procgen::sampleCloudShadow(CloudShadow *shadow, float *out, int w, int h, float time,
263 float x0, float z0, float extent) {
264 lastError_.clear();
265 if (!shadow) {
266 lastError_ = "sampleCloudShadow: null shadow";
267 return;
268 }
269 shadow->sampleCoverage(out, w, h, time, x0, z0, extent);
270}
271
272PbrTextureSet *Procgen::generatePbrMaterial(const std::string &recipeId, Params *params) {
273 lastError_.clear();
274 if (!params) {
275 lastError_ = "generatePbrMaterial: null params";
276 return nullptr;
277 }
279 PbrTextureSet *set = PbrRecipeRegistry::instance().generate(recipeId, *params, lastError_);
280 if (!set && lastError_.empty()) lastError_ = "generatePbrMaterial failed";
281 return set;
282}
283
286 pbrRecipeIdsCache_ = PbrRecipeRegistry::instance().list();
287 return int(pbrRecipeIdsCache_.size());
288}
289
290std::string Procgen::getPbrRecipeId(int index) const {
291 if (pbrRecipeIdsCache_.empty()) {
293 pbrRecipeIdsCache_ = PbrRecipeRegistry::instance().list();
294 }
295 if (index < 0 || index >= int(pbrRecipeIdsCache_.size())) return {};
296 return pbrRecipeIdsCache_[size_t(index)];
297}
298
299bool Procgen::hasPbrRecipe(const std::string &recipeId) const {
301 return PbrRecipeRegistry::instance().has(recipeId);
302}
303
304MeshBuild *Procgen::buildMesh(const std::string &recipeId, Params *params) {
305 lastError_.clear();
306 if (!params) {
307 lastError_ = "buildMesh: null params";
308 return nullptr;
309 }
311 auto *mesh = new MeshBuild();
312 if (!MeshRecipeRegistry::instance().generate(recipeId, *params, *mesh, lastError_)) {
313 if (lastError_.empty()) lastError_ = "buildMesh failed";
314 delete mesh;
315 return nullptr;
316 }
317 return mesh;
318}
319
320graphics::Mesh *Procgen::generateMesh(const std::string &recipeId, Params *params,
321 graphics::Graphics *gfx) {
322 if (!gfx) {
323 lastError_ = "generateMesh: null Graphics";
324 return nullptr;
325 }
326 MeshBuild *cpu = buildMesh(recipeId, params);
327 if (!cpu) return nullptr;
328 graphics::Mesh *gpu =
329 gfx->newMeshFromArrays(cpu->positions().data(), cpu->normals().data(), cpu->uvs().data(),
330 cpu->getVertexCount(), cpu->indices().data(), cpu->getIndexCount());
331 delete cpu;
332 return gpu;
333}
334
337 meshRecipeIdsCache_ = MeshRecipeRegistry::instance().list();
338 return int(meshRecipeIdsCache_.size());
339}
340
341std::string Procgen::getMeshRecipeId(int index) const {
342 if (meshRecipeIdsCache_.empty()) {
344 meshRecipeIdsCache_ = MeshRecipeRegistry::instance().list();
345 }
346 if (index < 0 || index >= int(meshRecipeIdsCache_.size())) return {};
347 return meshRecipeIdsCache_[size_t(index)];
348}
349
350bool Procgen::hasMeshRecipe(const std::string &recipeId) const {
352 return MeshRecipeRegistry::instance().has(recipeId);
353}
354
356
360
362 lastError_.clear();
363 if (!params) {
364 lastError_ = "generateHeightmap: null params";
365 return nullptr;
366 }
367 const TerrainSampler sampler = TerrainSampler::fromParams(*params);
368 return new Heightmap(Heightmap::generate(sampler, params->getWidth(), params->getHeight()));
369}
370
371bool Procgen::heightmapToGrid(Heightmap *heightmap, Params *params, Grid2D *out) {
372 lastError_.clear();
373 if (!heightmap) {
374 lastError_ = "heightmapToGrid: null heightmap";
375 return false;
376 }
377 if (!out) {
378 lastError_ = "heightmapToGrid: null grid";
379 return false;
380 }
381 const TerrainBands bands = params ? TerrainBands::fromParams(*params) : TerrainBands();
382 if (!heightmap->toGrid(*out, bands)) {
383 lastError_ = "heightmapToGrid: heightmap is empty";
384 return false;
385 }
386 return true;
387}
388
389void Procgen::expose(ssq::Table &table) {
390 auto cls = table.addClass(name, Procgen::create, false);
391 expose(cls);
392
393 auto params = table.addClass<Params>(
394 "ProcgenParams", std::function<Params *()>([]() -> Params * { return nullptr; }), true);
395 params.addFunc("setSeed", &Params::setSeed);
396 params.addFunc("getSeed", &Params::getSeed);
397 params.addFunc("setSize", &Params::setSize);
398 params.addFunc("getWidth", &Params::getWidth);
399 params.addFunc("getHeight", &Params::getHeight);
400 params.addFunc("setInt", &Params::setInt);
401 params.addFunc("setFloat", &Params::setFloat);
402 params.addFunc("setString", &Params::setString);
403 params.addFunc("has", &Params::has);
404 params.addFunc("getInt", &Params::getInt);
405 params.addFunc("getFloat", &Params::getFloat);
406 params.addFunc("getString", &Params::getString);
407
408 auto output = table.addClass<OutputSpec>(
409 "ProcgenOutput", std::function<OutputSpec *()>([]() -> OutputSpec * { return nullptr; }),
410 true);
411 output.addFunc("setTarget", &OutputSpec::setTarget);
412 output.addFunc("getTarget", &OutputSpec::getTarget);
413 output.addFunc("setLayer", &OutputSpec::setLayer);
414 output.addFunc("getLayer", &OutputSpec::getLayer);
415 output.addFunc("setPalette", &OutputSpec::setPalette);
416 output.addFunc("getPalette", &OutputSpec::getPalette);
417 output.addFunc("setPath", &OutputSpec::setPath);
418 output.addFunc("getPath", &OutputSpec::getPath);
419
420 auto grid = table.addClass<Grid2D>(
421 "ProcgenGrid2D", std::function<Grid2D *()>([]() -> Grid2D * { return nullptr; }), true);
422 grid.addFunc("resize", &Grid2D::resize);
423 grid.addFunc("getWidth", &Grid2D::getWidth);
424 grid.addFunc("getHeight", &Grid2D::getHeight);
425 grid.addFunc("setCell", &Grid2D::setCell);
426 grid.addFunc("getCell", &Grid2D::getCell);
427 grid.addFunc("setDetail", &Grid2D::setDetail);
428 grid.addFunc("getDetail", &Grid2D::getDetail);
429 grid.addFunc("fill", &Grid2D::fill);
430 grid.addFunc("setMeta", &Grid2D::setMeta);
431 grid.addFunc("getMeta", &Grid2D::getMeta);
432 grid.addFunc("clearObjects", &Grid2D::clearObjects);
433 grid.addFunc("addObjectAt", &Grid2D::addObjectAt);
434 grid.addFunc("addObject", &Grid2D::addObject);
435 grid.addFunc("getObjectCount", &Grid2D::getObjectCount);
436 grid.addFunc("getObjectName", &Grid2D::getObjectName);
437 grid.addFunc("getObjectType", &Grid2D::getObjectType);
438 grid.addFunc("getObjectX", &Grid2D::getObjectX);
439 grid.addFunc("getObjectY", &Grid2D::getObjectY);
440 grid.addFunc("getObjectWidth", &Grid2D::getObjectWidth);
441 grid.addFunc("getObjectHeight", &Grid2D::getObjectHeight);
442 grid.addFunc("getObjectGid", &Grid2D::getObjectGid);
443
444 auto mesh = table.addClass<MeshBuild>(
445 "ProcgenMeshBuild", std::function<MeshBuild *()>([]() -> MeshBuild * { return nullptr; }),
446 true);
447 mesh.addFunc("clear", &MeshBuild::clear);
448 mesh.addFunc("getVertexCount", &MeshBuild::getVertexCount);
449 mesh.addFunc("getIndexCount", &MeshBuild::getIndexCount);
450 mesh.addFunc("empty", &MeshBuild::empty);
451 mesh.addFunc("getPositionX", &MeshBuild::getPositionX);
452 mesh.addFunc("getPositionY", &MeshBuild::getPositionY);
453 mesh.addFunc("getPositionZ", &MeshBuild::getPositionZ);
454 mesh.addFunc("getNormalX", &MeshBuild::getNormalX);
455 mesh.addFunc("getNormalY", &MeshBuild::getNormalY);
456 mesh.addFunc("getNormalZ", &MeshBuild::getNormalZ);
457 mesh.addFunc("getUvU", &MeshBuild::getUvU);
458 mesh.addFunc("getUvV", &MeshBuild::getUvV);
459 mesh.addFunc("getIndex", &MeshBuild::getIndex);
460 mesh.addFunc("setMeta", &MeshBuild::setMeta);
461 mesh.addFunc("getMeta", &MeshBuild::getMeta);
462
463 auto sampler = table.addClass<TerrainSampler>(
464 "ProcgenTerrainSampler",
465 std::function<TerrainSampler *()>([]() -> TerrainSampler * { return nullptr; }), true);
466 sampler.addFunc("sample", &TerrainSampler::sample);
467 sampler.addFunc("sampleTile", &TerrainSampler::sampleTile);
468 sampler.addFunc("setSeed", &TerrainSampler::setSeed);
469 sampler.addFunc("getSeed", &TerrainSampler::getSeed);
470 sampler.addFunc("setScale", &TerrainSampler::setScale);
471 sampler.addFunc("getScale", &TerrainSampler::getScale);
472 sampler.addFunc("setFrequency", &TerrainSampler::setFrequency);
473 sampler.addFunc("getFrequency", &TerrainSampler::getFrequency);
474 sampler.addFunc("setWavelength", &TerrainSampler::setWavelength);
475 sampler.addFunc("getWavelength", &TerrainSampler::getWavelength);
476 sampler.addFunc("setOctaves", &TerrainSampler::setOctaves);
477 sampler.addFunc("getOctaves", &TerrainSampler::getOctaves);
478 sampler.addFunc("setLacunarity", &TerrainSampler::setLacunarity);
479 sampler.addFunc("getLacunarity", &TerrainSampler::getLacunarity);
480 sampler.addFunc("setGain", &TerrainSampler::setGain);
481 sampler.addFunc("getGain", &TerrainSampler::getGain);
482 sampler.addFunc("setRidge", &TerrainSampler::setRidge);
483 sampler.addFunc("getRidge", &TerrainSampler::getRidge);
484 sampler.addFunc("setWarp", &TerrainSampler::setWarp);
485 sampler.addFunc("getWarp", &TerrainSampler::getWarp);
486 sampler.addFunc("setExponent", &TerrainSampler::setExponent);
487 sampler.addFunc("getExponent", &TerrainSampler::getExponent);
488 sampler.addFunc("setContinent", &TerrainSampler::setContinent);
489 sampler.addFunc("getContinent", &TerrainSampler::getContinent);
490 sampler.addFunc("setIsland", &TerrainSampler::setIsland);
491 sampler.addFunc("getIsland", &TerrainSampler::getIsland);
492 sampler.addFunc("setCoastSoftness", &TerrainSampler::setCoastSoftness);
493 sampler.addFunc("getCoastSoftness", &TerrainSampler::getCoastSoftness);
494 sampler.addFunc("setWorldSize", &TerrainSampler::setWorldSize);
495 sampler.addFunc("getWorldWidth", &TerrainSampler::getWorldWidth);
496 sampler.addFunc("getWorldHeight", &TerrainSampler::getWorldHeight);
497 sampler.addFunc("setBase", &TerrainSampler::setBase);
498 sampler.addFunc("getBase", &TerrainSampler::getBase);
499 sampler.addFunc("setAmplitude", &TerrainSampler::setAmplitude);
500 sampler.addFunc("getAmplitude", &TerrainSampler::getAmplitude);
501 sampler.addFunc("setClamp", &TerrainSampler::setClamp);
502 sampler.addFunc("isClamped", &TerrainSampler::isClamped);
503 sampler.addFunc("getClampMin", &TerrainSampler::getClampMin);
504 sampler.addFunc("getClampMax", &TerrainSampler::getClampMax);
505
506 auto heightmap = table.addClass<Heightmap>(
507 "ProcgenHeightmap", std::function<Heightmap *()>([]() -> Heightmap * { return nullptr; }),
508 true);
509 heightmap.addFunc("resize", &Heightmap::resize);
510 heightmap.addFunc("getWidth", &Heightmap::getWidth);
511 heightmap.addFunc("getHeight", &Heightmap::getHeight);
512 heightmap.addFunc("setHeight", &Heightmap::setHeight);
513 heightmap.addFunc("height", &Heightmap::height);
514 heightmap.addFunc("sampleBilinear", &Heightmap::sampleBilinear);
515 heightmap.addFunc("sampleBilinearSeamless", &Heightmap::sampleBilinearSeamless);
516
517 auto cloud = table.addClass<CloudField>(
518 "ProcgenCloudField",
519 std::function<CloudField *()>([]() -> CloudField * { return nullptr; }), true);
520 cloud.addFunc("setSeed", &CloudField::setSeed);
521 cloud.addFunc("setWorldScale", &CloudField::setWorldScale);
522 cloud.addFunc("setCoverage", &CloudField::setCoverage);
523 cloud.addFunc("setSoftness", &CloudField::setSoftness);
524 cloud.addFunc("setDetail", &CloudField::setDetail);
525 cloud.addFunc("setWind", &CloudField::setWind);
526 cloud.addFunc("setOctaves", &CloudField::setOctaves);
527 cloud.addFunc("setWarp", &CloudField::setWarp);
528 cloud.addFunc("setSeamless", &CloudField::setSeamless);
529 cloud.addFunc("coverageAt", &CloudField::coverageAt);
530
531 auto cloudShadow = table.addClass<CloudShadow>(
532 "ProcgenCloudShadow",
533 std::function<CloudShadow *()>([]() -> CloudShadow * { return nullptr; }), true);
534 cloudShadow.addFunc("setSunDirection", &CloudShadow::setSunDirection);
535 cloudShadow.addFunc("setCloudAltitude", &CloudShadow::setCloudAltitude);
536 cloudShadow.addFunc("setStrength", &CloudShadow::setStrength);
537 cloudShadow.addFunc("coverageAt", &CloudShadow::coverageAt);
538 cloudShadow.addFunc("shadowFactorAt", &CloudShadow::shadowFactorAt);
539 auto pbr = table.addClass<PbrTextureSet>(
540 "ProcgenPbrMaterial",
541 std::function<PbrTextureSet *()>([]() -> PbrTextureSet * { return nullptr; }), true);
542 pbr.addFunc("destroy", &PbrTextureSet::destroy);
543 pbr.addFunc("getAlbedoWidth", [](const PbrTextureSet *s) { return s->albedo->getWidth(); });
544 pbr.addFunc("getAlbedoHeight", [](const PbrTextureSet *s) { return s->albedo->getHeight(); });
545 pbr.addFunc("getNormalWidth", [](const PbrTextureSet *s) { return s->normal->getWidth(); });
546 pbr.addFunc("getRoughnessWidth", [](const PbrTextureSet *s) { return s->roughness->getWidth(); });
547 pbr.addFunc("getMetallicWidth", [](const PbrTextureSet *s) { return s->metallic->getWidth(); });
548 pbr.addFunc("getHeightWidth", [](const PbrTextureSet *s) { return s->height->getWidth(); });
549 pbr.addFunc("getAoWidth", [](const PbrTextureSet *s) { return s->ao->getWidth(); });
550 pbr.addFunc("hasAllMaps", [](const PbrTextureSet *s) {
551 return s->albedo && s->normal && s->roughness && s->metallic && s->height && s->ao;
552 });
553}
554
555void Procgen::expose(ssq::Class &cls) {
556 cls.addFunc("getName", &Procgen::getName);
557 cls.addFunc("newParams", &Procgen::newParams);
558 cls.addFunc("newOutput", &Procgen::newOutput);
559 cls.addFunc("newGrid", &Procgen::newGrid);
560 cls.addFunc("generate", &Procgen::generate);
561 cls.addFunc("generateTo", &Procgen::generateTo);
562 cls.addFunc("applyToLayer", &Procgen::applyToLayer);
563 cls.addFunc("setPaletteGid", &Procgen::setPaletteGid);
564 cls.addFunc("getPaletteGid", &Procgen::getPaletteGid);
565 cls.addFunc("getAlgorithmCount", &Procgen::getAlgorithmCount);
566 cls.addFunc("getAlgorithmId", &Procgen::getAlgorithmId);
567 cls.addFunc("hasAlgorithm", &Procgen::hasAlgorithm);
568 cls.addFunc("autotileGrid", &Procgen::autotileGrid);
569 cls.addFunc("randomSeed", &Procgen::randomSeed);
570 cls.addFunc("lastError", &Procgen::lastError);
571 cls.addFunc("gridToJson", &Procgen::gridToJson);
572 cls.addFunc("generateImage", &Procgen::generateImage);
573 cls.addFunc("generateNormalImage", &Procgen::generateNormalImage);
574 cls.addFunc("generateTexture", &Procgen::generateTexture);
575 cls.addFunc("getTextureRecipeCount", &Procgen::getTextureRecipeCount);
576 cls.addFunc("getTextureRecipeId", &Procgen::getTextureRecipeId);
577 cls.addFunc("hasTextureRecipe", &Procgen::hasTextureRecipe);
578 cls.addFunc("generatePbrMaterial", &Procgen::generatePbrMaterial);
579 cls.addFunc("getPbrRecipeCount", &Procgen::getPbrRecipeCount);
580 cls.addFunc("getPbrRecipeId", &Procgen::getPbrRecipeId);
581 cls.addFunc("hasPbrRecipe", &Procgen::hasPbrRecipe);
582 cls.addFunc("buildMesh", &Procgen::buildMesh);
583 cls.addFunc("generateMesh", &Procgen::generateMesh);
584 cls.addFunc("getMeshRecipeCount", &Procgen::getMeshRecipeCount);
585 cls.addFunc("getMeshRecipeId", &Procgen::getMeshRecipeId);
586 cls.addFunc("hasMeshRecipe", &Procgen::hasMeshRecipe);
587 cls.addFunc("newTerrainSampler", &Procgen::newTerrainSampler);
588 cls.addFunc("newHeightmap", &Procgen::newHeightmap);
589 cls.addFunc("generateHeightmap", &Procgen::generateHeightmap);
590 cls.addFunc("heightmapToGrid", &Procgen::heightmapToGrid);
591 cls.addFunc("newCloudField", &Procgen::newCloudField);
592 cls.addFunc("newCloudShadow", &Procgen::newCloudShadow);
593 cls.addFunc("cloudCoverageAt", &Procgen::cloudCoverageAt);
594 cls.addFunc("cloudShadowFactor", &Procgen::cloudShadowFactor);
595 cls.addFunc("sampleCloud", &Procgen::sampleCloud);
596 cls.addFunc("sampleCloudShadow", &Procgen::sampleCloudShadow);
597}
598
599} // namespace eve::procgen
HSQOBJECT cls
Definition ECS.cpp:21
int z
Definition Grass.cpp:135
float height
Definition Grass.cpp:235
int x
Definition Grass.cpp:135
int h
int w
std::vector< Colorf > px
Texture * albedo
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
int width
TileLayer * layer
Mesh * mesh
const char * name
Definition RockMesh.cpp:21
uint32_t s
Definition Weather.cpp:28
uint32_t semantic
Definition WfcSimple.cpp:15
virtual std::string getName() const =0
virtual Texture * newTexture(int width, int height, const uint8_t *rgba, bool repeatU=false, bool repeatV=false)=0
virtual Mesh * newMeshFromArrays(const float *posXYZ, const float *nrmXYZ, const float *uvST, int vertexCount, const uint32_t *indices, int indexCount)=0
Upload a triangle mesh from packed CPU arrays. Owned by Graphics. posXYZ required (vertexCount*3)....
GPU mesh handle (+ optional CPU morph targets).
Definition Mesh.h:18
GPU texture created via Graphics::newTexture. Owns GPU resources through an opaque backend handle.
Definition Texture.h:17
Represents raw pixel data.
Definition ImageData.h:26
void * getData() const
ECS tile layer entity. Script mutates tile GIDs / tileset / draw; TileRenderSystem batch-draws atlas ...
Definition TileLayer.h:30
Deterministic, seamlessly-tiling, time-animated procedural cloud field.
Definition CloudField.h:17
void setSeamless(bool seamless)
void setWorldScale(float worldScale)
void setWarp(float warp)
float coverageAt(float x, float z, float time) const
Cloud coverage at world (x, z) and time t, in [0,1].
void setDetail(float detail)
void setSoftness(float softness)
void setOctaves(int octaves)
void setSeed(uint32_t seed)
void setCoverage(float coverage)
void sample(float *out, int width, int height, float time, float x0, float z0, float extent) const
void setWind(float speed, float angleRad)
Cloud shadows cast onto the ground plane.
Definition CloudShadow.h:21
void setSunDirection(float x, float y, float z)
float coverageAt(float x, float z, float time) const
Cloud coverage projected onto ground (x, z) at time t, in [0,1].
void sampleCoverage(float *out, int width, int height, float time, float x0, float z0, float extent) const
Fill a buffer with projected coverage for a world region.
float shadowFactorAt(float x, float z, float time) const
Light multiplier in [0,1]: 1 = fully lit, (1-strength) = fully shadowed.
void setCloudAltitude(float altitude)
void setStrength(float strength)
void registerBuiltins()
Register built-in DTL / custom map algorithms (idempotent).
bool has(const std::string &id) const
static GeneratorRegistry & instance()
std::vector< std::string > list() const
Intermediate 2D generation result. cells store semantic ids (see Semantic.h), not tile GIDs — convert...
Definition Grid2D.h:16
void setDetail(int x, int y, int value)
Per-cell detail layer (0..255), parallel to cells. Semantics stay in cells (palette/GID compatible); ...
Definition Grid2D.cpp:37
std::string getObjectType(int i) const
Definition Grid2D.cpp:79
int getWidth() const
Definition Grid2D.cpp:20
float getObjectWidth(int i) const
Definition Grid2D.cpp:91
int getDetail(int x, int y) const
Definition Grid2D.cpp:42
void resize(int width, int height)
Definition Grid2D.cpp:13
float getObjectY(int i) const
Definition Grid2D.cpp:87
void fill(int semantic)
Definition Grid2D.cpp:33
void setCell(int x, int y, int semantic)
Definition Grid2D.cpp:23
void addObject(const std::string &name, const std::string &type, float x, float y, float width, float height, int gid)
Definition Grid2D.cpp:60
int getCell(int x, int y) const
Definition Grid2D.cpp:28
float getObjectX(int i) const
Definition Grid2D.cpp:83
void addObjectAt(const std::string &name, const std::string &type, float x, float y)
Script-friendly: name/type + tile coords.
Definition Grid2D.cpp:56
int getObjectCount() const
Definition Grid2D.cpp:73
int getObjectGid(int i) const
Definition Grid2D.cpp:99
float getObjectHeight(int i) const
Definition Grid2D.cpp:95
std::string getObjectName(int i) const
Definition Grid2D.cpp:75
void setMeta(const std::string &key, const std::string &value)
Definition Grid2D.cpp:47
int getHeight() const
Definition Grid2D.cpp:21
std::string getMeta(const std::string &key, const std::string &defaultValue) const
Definition Grid2D.cpp:49
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:19
float sampleBilinear(float x, float y) const
Bilinear height at continuous coordinate within [0, w) x [0, h).
Definition Heightmap.cpp:37
bool toGrid(Grid2D &out, const TerrainBands &bands) const
Classify heights into a semantic Grid2D (source for tilemap generation).
Definition Heightmap.cpp:84
void resize(int width, int height)
Definition Heightmap.cpp:10
float height(int x, int y) const
Definition Heightmap.cpp:28
float sampleBilinearSeamless(float x, float y) const
Bilinear height with wrap-around (seamless tiling).
Definition Heightmap.cpp:52
void setHeight(int x, int y, float h)
Definition Heightmap.cpp:23
static Heightmap generate(const TerrainSampler &sampler, int width, int height)
Materialize a Heightmap by sampling sampler at every pixel center.
Definition Heightmap.cpp:69
CPU triangle mesh from procedural mesh recipes (e.g. marching cubes). Positions/normals are xyz-packe...
Definition MeshBuild.h:14
float getPositionZ(int i) const
Definition MeshBuild.cpp:52
const std::vector< float > & positions() const
Definition MeshBuild.h:39
float getPositionY(int i) const
Definition MeshBuild.cpp:48
std::string getMeta(const std::string &key, const std::string &defaultValue) const
Definition MeshBuild.cpp:83
const std::vector< float > & normals() const
Definition MeshBuild.h:40
float getNormalZ(int i) const
Definition MeshBuild.cpp:64
void setMeta(const std::string &key, const std::string &value)
Definition MeshBuild.cpp:81
float getNormalY(int i) const
Definition MeshBuild.cpp:60
int getIndexCount() const
Definition MeshBuild.cpp:41
float getUvU(int i) const
Definition MeshBuild.cpp:68
int getVertexCount() const
Definition MeshBuild.cpp:40
float getUvV(int i) const
Definition MeshBuild.cpp:72
float getNormalX(int i) const
Definition MeshBuild.cpp:56
int getIndex(int i) const
Definition MeshBuild.cpp:76
float getPositionX(int i) const
Definition MeshBuild.cpp:44
const std::vector< float > & uvs() const
Definition MeshBuild.h:41
const std::vector< uint32_t > & indices() const
Definition MeshBuild.h:42
std::vector< std::string > list() const
static MeshRecipeRegistry & instance()
bool has(const std::string &id) const
Configurable generation sink. target: "grid" | "tilelayer" | "json"
Definition OutputSpec.h:15
void setLayer(map::TileLayer *layer)
std::string getPath() const
map::TileLayer * getLayer() const
void setTarget(const std::string &target)
Definition OutputSpec.cpp:7
void setPalette(const std::string &paletteName)
std::string getTarget() const
Definition OutputSpec.cpp:8
void setPath(const std::string &path)
std::string getPalette() const
bool applyToLayer(const Grid2D &grid, const std::string &palette, map::TileLayer *layer, std::string *error) const
Definition Palette.cpp:24
void setGid(const std::string &palette, const std::string &semantic, int gid)
Definition Palette.cpp:9
int getGid(const std::string &palette, const std::string &semantic) const
Definition Palette.cpp:13
Generation parameters. Algorithm-specific keys live in values as strings (no overloads; typed setters...
Definition Params.h:13
uint32_t getSeed() const
Definition Params.cpp:8
void setSize(int width, int height)
Definition Params.cpp:10
void setInt(const std::string &key, int value)
Definition Params.cpp:17
int getHeight() const
Definition Params.cpp:15
int getWidth() const
Definition Params.cpp:14
bool has(const std::string &key) const
Definition Params.cpp:21
float getFloat(const std::string &key, float defaultValue) const
Definition Params.cpp:32
void setSeed(uint32_t seed)
Definition Params.cpp:7
void setFloat(const std::string &key, float value)
Definition Params.cpp:18
std::string getString(const std::string &key, const std::string &defaultValue) const
Definition Params.cpp:41
int getInt(const std::string &key, int defaultValue) const
Definition Params.cpp:23
void setString(const std::string &key, const std::string &value)
Definition Params.cpp:19
static PbrRecipeRegistry & instance()
std::vector< std::string > list() const
PbrTextureSet * generate(const std::string &id, const Params &params, std::string &error) const
bool has(const std::string &id) const
Procedural generation module. Phase A: runtime maps (semantic Grid2D → TileLayer)....
Definition Procgen.h:37
int getTextureRecipeCount() const
Definition Procgen.cpp:210
CloudField * newCloudField()
New deterministic, tiling, time-animated cloud field (caller owns).
Definition Procgen.cpp:230
bool hasTextureRecipe(const std::string &recipeId) const
Definition Procgen.cpp:225
Grid2D * generate(const std::string &algorithmId, Params *params)
Definition Procgen.cpp:72
void sampleCloud(CloudField *field, float *out, int w, int h, float time, float x0, float z0, float extent)
Definition Procgen.cpp:252
float cloudCoverageAt(CloudField *field, float x, float z, float time)
Cloud coverage at world (x, z) and time (via a CloudField).
Definition Procgen.cpp:234
void setPaletteGid(const std::string &palette, const std::string &semantic, int gid)
Definition Procgen.cpp:122
void sampleCloudShadow(CloudShadow *shadow, float *out, int w, int h, float time, float x0, float z0, float extent)
Definition Procgen.cpp:262
graphics::Texture * generateTexture(const std::string &recipeId, Params *params, graphics::Graphics *gfx)
Upload recipe to GPU. repeatU/V follow params "seamless" (default on). Caller owns Texture*.
Definition Procgen.cpp:195
bool applyToLayer(Grid2D *grid, const std::string &palette, map::TileLayer *layer)
Definition Procgen.cpp:113
image::ImageData * generateImage(const std::string &recipeId, Params *params)
RGBA8 ImageData (caller owns). Pixel-friendly recipes: tex.soil/stone/marble/water/sky_cloud.
Definition Procgen.cpp:162
Params * newParams()
Definition Procgen.cpp:53
std::string getAlgorithmId(int index) const
Definition Procgen.cpp:135
bool heightmapToGrid(Heightmap *heightmap, Params *params, Grid2D *out)
Classify a heightmap into a semantic Grid2D using params bands (waterMax…).
Definition Procgen.cpp:371
Heightmap * generateHeightmap(Params *params)
Build a sampler from params (seed/scale/octaves/…) and materialize it (caller owns).
Definition Procgen.cpp:361
Heightmap * newHeightmap(int width, int height)
Empty in-memory heightmap (caller owns).
Definition Procgen.cpp:357
Grid2D * newGrid(int width, int height)
Definition Procgen.cpp:56
image::ImageData * generateNormalImage(const std::string &recipeId, Params *params)
Normal map derived from albedo luminance (caller owns).
Definition Procgen.cpp:175
bool generateTo(const std::string &algorithmId, Params *params, OutputSpec *output)
Definition Procgen.cpp:85
CloudShadow * newCloudShadow()
New sun projection over a cloud field → ground shadows (caller owns).
Definition Procgen.cpp:232
OutputSpec * newOutput()
Definition Procgen.cpp:54
std::string getMeshRecipeId(int index) const
Definition Procgen.cpp:341
bool hasPbrRecipe(const std::string &recipeId) const
Definition Procgen.cpp:299
int getMeshRecipeCount() const
Definition Procgen.cpp:335
bool hasAlgorithm(const std::string &algorithmId) const
Definition Procgen.cpp:141
int getPaletteGid(const std::string &palette, const std::string &semantic) const
Definition Procgen.cpp:126
std::string getPbrRecipeId(int index) const
Definition Procgen.cpp:290
float cloudShadowFactor(CloudShadow *shadow, float x, float z, float time)
Light multiplier in [0,1] from a CloudShadow at world (x, z) and time.
Definition Procgen.cpp:243
int getPbrRecipeCount() const
Definition Procgen.cpp:284
int getAlgorithmCount() const
Definition Procgen.cpp:130
uint32_t randomSeed()
Fresh non-zero seed for regenerating a level.
Definition Procgen.cpp:153
graphics::Mesh * generateMesh(const std::string &recipeId, Params *params, graphics::Graphics *gfx)
Build + upload to GPU Mesh (owned by Graphics).
Definition Procgen.cpp:320
bool hasMeshRecipe(const std::string &recipeId) const
Definition Procgen.cpp:350
std::string gridToJson(Grid2D *grid) const
Definition Procgen.cpp:157
MeshBuild * buildMesh(const std::string &recipeId, Params *params)
CPU mesh (caller owns). Recipes: mesh.marchingcubes, mesh.hexplanet.
Definition Procgen.cpp:304
std::string lastError() const
Definition Procgen.cpp:155
PbrTextureSet * generatePbrMaterial(const std::string &recipeId, Params *params)
Full metallic-roughness PBR set (albedo/normal/roughness/metallic/height/ao) derived from a single di...
Definition Procgen.cpp:272
std::string getTextureRecipeId(int index) const
Definition Procgen.cpp:216
TerrainSampler * newTerrainSampler()
Sampling function over continuous map coordinates (caller owns).
Definition Procgen.cpp:355
bool autotileGrid(Grid2D *grid)
Post-process a generated grid: fill each wall cell's detail with an 8-bit neighbour mask (autotile di...
Definition Procgen.cpp:145
Deterministic terrain height sampling (Red Blob Games / Perlin fBm recipe).
float sample(float x, float y) const
float sampleTile(int tileX, int tileY) const
Height at the center of map tile (tileX, tileY).
void setLacunarity(float lacunarity)
void setFrequency(float frequency)
void setContinent(float continent)
void setClamp(bool enabled, float minHeight, float maxHeight)
void setAmplitude(float amplitude)
void setScale(float scale)
Cycles per world unit (alias of frequency). Default 1/32.
void setCoastSoftness(float softness)
Shore width of the land mask smoothstep. Smaller = cleaner, harder coast.
void setWorldSize(int width, int height)
void setExponent(float exponent)
static TerrainSampler fromParams(const Params &params)
void setWavelength(float wavelength)
Distance per large oscillation. Sets frequency = 1/wavelength.
bool has(const std::string &id) const
std::vector< std::string > list() const
image::ImageData * generate(const std::string &id, const Params &params, std::string &error) const
static TextureRecipeRegistry & instance()
uint32_t randomSeedValue()
Produce a fresh seed suitable for regenerating a level (never 0).
bool writeGridJson(const Grid2D &grid, const std::string &path, std::string *error)
image::ImageData * heightToNormalImage(const std::vector< float > &height, int w, int h, float strength, bool seamless)
bool autotileGridInPlace(Grid2D &grid)
Post-process any generated Grid2D: fill each wall cell's detail with an 8-bit neighbour mask describi...
std::string gridToJson(const Grid2D &grid)
Compact JSON for debugging / reload workflows (not full Tiled).
Full metallic-roughness PBR map set. All maps are caller-owned; call destroy() (or delete each pointe...
Definition PbrMaterial.h:24
static TerrainBands fromParams(const Params &params)