载入中...
搜索中...
未找到
Procgen.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Module.h"
7#include "procgen/Biome.h"
8#include "procgen/Grid2D.h"
9#include "procgen/GridGraph.h"
10#include "procgen/MeshBuild.h"
11#include "procgen/MeshGraph.h"
12#include "procgen/OutputSpec.h"
13#include "procgen/Palette.h"
14#include "procgen/ParamSchema.h"
15#include "procgen/Params.h"
16#include "procgen/PointGraph.h"
17#include "procgen/PointSet.h"
21#include "procgen/SpatialData.h"
34
35#include <memory>
36#include <span>
37#include <string>
38#include <unordered_map>
39#include <vector>
40
41namespace eve::graphics {
42class Graphics;
43class Texture;
44class Mesh;
45class Shader;
46class Renderable3D;
47} // namespace eve::graphics
48
49namespace eve::image {
50class ImageData;
51} // namespace eve::image
52
53namespace eve::data {
54class ByteData;
55} // namespace eve::data
56
57namespace eve::procgen {
58struct PbrTextureSet;
59class GtsTerrainLodSet;
60class PcgMeshLodSet;
61
138
147public:
150 Procgen();
152 ~Procgen() override;
153
158 [[nodiscard]] static eve::Result<ProcgenParamsHandleRef> newParamsHandle();
160 [[nodiscard]] static eve::script::Borrowed<Params> resolve(ProcgenParamsHandleRef reference) noexcept;
164 [[nodiscard]] static bool isStale(ProcgenParamsHandleRef reference) noexcept;
166 [[nodiscard]] eve::Result<ProcgenOutputHandleRef> newOutputHandle();
168 [[nodiscard]] eve::script::Borrowed<OutputSpec> resolveOutput(ProcgenOutputHandleRef reference) noexcept;
170 [[nodiscard]] eve::Result<void> releaseOutput(ProcgenOutputHandleRef reference);
172 [[nodiscard]] bool isOutputStale(ProcgenOutputHandleRef reference) const noexcept;
174 [[nodiscard]] static eve::Result<ProcgenGridHandleRef> newGridHandle(int width, int height);
176 [[nodiscard]] static eve::script::Borrowed<Grid2D> resolve(ProcgenGridHandleRef reference) noexcept;
180 [[nodiscard]] static bool isStale(ProcgenGridHandleRef reference) noexcept;
181
182 // --- Script-first point pipelines ---
184 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> newPointSetHandle();
186 [[nodiscard]] eve::script::Borrowed<PointSet> resolvePointSet(ProcgenPointSetHandleRef reference) noexcept;
188 [[nodiscard]] eve::Result<void> releasePointSet(ProcgenPointSetHandleRef reference);
190 [[nodiscard]] bool isPointSetStale(ProcgenPointSetHandleRef reference) const noexcept;
191 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> sampleGridHandle(int width, int depth, float spacing,
192 uint32_t seed, float jitter);
195 float minHeight, float maxHeight);
198 float minDensity, float maxDensity);
200 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> filterBoxHandle(ProcgenPointSetHandleRef input, float minX,
201 float minY, float minZ, float maxX, float maxY,
202 float maxZ, bool invert = false);
205 float minDegrees, float maxDegrees);
209 bool invert = false);
211 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> filterSplineDistanceHandle(
212 ProcgenPointSetHandleRef input, ProcgenPointSetHandleRef controlPoints, float minDistance, float maxDistance);
214 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> excludeRadiusHandle(ProcgenPointSetHandleRef input, float x,
215 float z, float radius);
218 uint32_t seed, float amountX, float amountZ);
222 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> projectToHeightmapHandle(ProcgenPointSetHandleRef input,
224 float originX, float originZ,
225 float cellSize, float heightScale);
227 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> sampleSplineHandle(ProcgenPointSetHandleRef controlPoints,
228 float spacing, uint32_t seed,
229 float lateralJitter);
231 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> poissonDiskHandle(int width, int depth, float radius,
232 uint32_t seed, int maxPoints);
240 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> intersectPointsHandle(ProcgenPointSetHandleRef first,
243 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> differencePointsHandle(ProcgenPointSetHandleRef first,
246 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> transformPointsHandle(ProcgenPointSetHandleRef input,
247 float translateX, float translateY,
248 float translateZ, float yawDegrees,
249 float scaleX, float scaleY, float scaleZ);
251 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> transformPoints3DHandle(
252 ProcgenPointSetHandleRef input, float translateX, float translateY, float translateZ, float pitchDegrees,
253 float yawDegrees, float rollDegrees, float scaleX, float scaleY, float scaleZ);
257 bool inheritTargetAttributes);
260 float inputMin, float inputMax,
261 float outputMin, float outputMax,
262 bool clampOutput);
264 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> mathFloatAttributeHandle(ProcgenPointSetHandleRef input,
265 const std::string& attribute,
266 const std::string& outputAttribute,
267 const std::string& operation,
268 float operand, float defaultValue);
270 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> filterFloatAttributeHandle(ProcgenPointSetHandleRef input,
271 const std::string& name,
272 float minValue, float maxValue,
273 bool invert);
275 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> filterStringAttributeHandle(ProcgenPointSetHandleRef input,
276 const std::string& name,
277 const std::string& value,
278 bool invert);
280 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> excludeGridMaskHandle(
281 ProcgenPointSetHandleRef input, ProcgenGridHandleRef mask, float originX, float originZ, float cellSize,
282 int semantic, float clearance, int maximumChecks);
284 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> densityCullHandle(ProcgenPointSetHandleRef input, uint32_t seed,
285 float multiplier);
287 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> projectToWorldHandle(ProcgenPointSetHandleRef input, float maxY,
288 float minY, std::uint64_t maskBits,
289 bool keepUnmatched);
290
291 // --- Spatial data and composable PCG domains ---
295 [[nodiscard]] eve::Result<ProcgenSpatialDataHandleRef> boxVolumeHandle(float minX, float minY, float minZ,
296 float maxX, float maxY, float maxZ);
298 [[nodiscard]] eve::Result<ProcgenSpatialDataHandleRef> sphereVolumeHandle(float x, float y, float z, float radius);
300 [[nodiscard]] eve::Result<ProcgenSpatialDataHandleRef> polygonVolumeHandle(ProcgenPointSetHandleRef controlPoints,
301 float minY, float maxY);
303 [[nodiscard]] eve::Result<ProcgenSpatialDataHandleRef> splineDataHandle(ProcgenPointSetHandleRef controlPoints,
304 float radius);
306 [[nodiscard]] eve::Result<ProcgenSpatialDataHandleRef> heightfieldDataHandle(ProcgenHeightmapHandleRef heightmap,
307 float originX, float originZ,
308 float cellSize, float heightScale);
311 float originX, float originZ,
312 float cellSize, float minValue,
313 float maxValue, float minY,
314 float maxY);
317 float tolerance);
329 float spacing, uint32_t seed, float jitter);
333 bool invert);
335 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> projectToSpatialHandle(ProcgenPointSetHandleRef input,
337
339 [[nodiscard]] eve::Result<ProcgenRuntimeGenerationHandleRef> newRuntimeGenerationHandle(uint32_t worldSeed);
341 [[nodiscard]] eve::Result<ProcgenPointGraphHandleRef> newPointGraphHandle();
343 [[nodiscard]] eve::Result<ProcgenMeshModifierGraphHandleRef> newMeshModifierGraphHandle();
345 [[nodiscard]] eve::Result<ProcgenMeshDeformationSessionHandleRef> newMeshDeformationSessionHandle();
347 [[nodiscard]] eve::Result<ProcgenDynamicMeshUvPaintSessionHandleRef> newDynamicMeshUvPaintSessionHandle();
349 [[nodiscard]] eve::Result<ProcgenSplinePathHandleRef> newSplinePathHandle();
350 [[nodiscard]] eve::Result<ProcgenGridGraphHandleRef> newGridGraphHandle();
351 [[nodiscard]] eve::Result<ProcgenMeshGraphHandleRef> newMeshGraphHandle();
352 [[nodiscard]] eve::Result<ProcgenBiomeRulesHandleRef> newBiomeRulesHandle();
353 [[nodiscard]] eve::Result<ProcgenShapeGrammarHandleRef> newShapeGrammarHandle();
354 [[nodiscard]] eve::Result<ProcgenLSystemHandleRef> newLSystemHandle();
355 [[nodiscard]] eve::script::Borrowed<SpatialData> resolveSpatialData(ProcgenSpatialDataHandleRef reference) noexcept;
356 [[nodiscard]] eve::script::Borrowed<RuntimeGeneration> resolveRuntimeGeneration(
359 [[nodiscard]] eve::script::Borrowed<PointGraph> resolvePointGraph(ProcgenPointGraphHandleRef reference) noexcept;
361 [[nodiscard]] eve::script::Borrowed<MeshModifierGraph> resolveMeshModifierGraph(
364 [[nodiscard]] eve::script::Borrowed<MeshDeformationSession> resolveMeshDeformationSession(
367 [[nodiscard]] eve::script::Borrowed<DynamicMeshUvPaintSession> resolveDynamicMeshUvPaintSession(
370 [[nodiscard]] eve::script::Borrowed<SplinePath> resolveSplinePath(ProcgenSplinePathHandleRef reference) noexcept;
371 [[nodiscard]] eve::script::Borrowed<GridGraph> resolveGridGraph(ProcgenGridGraphHandleRef reference) noexcept;
372 [[nodiscard]] eve::script::Borrowed<MeshGraph> resolveMeshGraph(ProcgenMeshGraphHandleRef reference) noexcept;
373 [[nodiscard]] eve::script::Borrowed<BiomeRules> resolveBiomeRules(ProcgenBiomeRulesHandleRef reference) noexcept;
374 [[nodiscard]] eve::script::Borrowed<ShapeGrammar> resolveShapeGrammar(
377 [[nodiscard]] eve::script::Borrowed<LSystem> resolveLSystem(ProcgenLSystemHandleRef reference) noexcept;
397 [[nodiscard]] bool isStale(ProcgenSpatialDataHandleRef reference) const noexcept;
398 [[nodiscard]] bool isStale(ProcgenRuntimeGenerationHandleRef reference) const noexcept;
399 [[nodiscard]] bool isStale(ProcgenPointGraphHandleRef reference) const noexcept;
401 [[nodiscard]] bool isStale(ProcgenMeshModifierGraphHandleRef reference) const noexcept;
403 [[nodiscard]] bool isStale(ProcgenMeshDeformationSessionHandleRef reference) const noexcept;
405 [[nodiscard]] bool isStale(ProcgenDynamicMeshUvPaintSessionHandleRef reference) const noexcept;
407 [[nodiscard]] bool isStale(ProcgenSplinePathHandleRef reference) const noexcept;
408 [[nodiscard]] bool isStale(ProcgenGridGraphHandleRef reference) const noexcept;
409 [[nodiscard]] bool isStale(ProcgenMeshGraphHandleRef reference) const noexcept;
410 [[nodiscard]] bool isStale(ProcgenBiomeRulesHandleRef reference) const noexcept;
411 [[nodiscard]] bool isStale(ProcgenShapeGrammarHandleRef reference) const noexcept;
412 [[nodiscard]] bool isStale(ProcgenLSystemHandleRef reference) const noexcept;
413
414 [[nodiscard]] eve::Result<void> publishInstances(const std::string& batchId, ProcgenPointSetHandleRef points,
415 const std::string& assetAttribute,
416 const std::string& defaultAsset);
418 [[nodiscard]] eve::Result<void> removeInstances(const std::string& batchId);
420 [[nodiscard]] eve::Result<void> publishCellInstances(const std::string& prefix, const ProcgenCellRequest& request,
422 const std::string& assetAttribute,
423 const std::string& defaultAsset);
436 [[nodiscard]] eve::Result<uint64_t> publishCellSnapshot(const std::string& prefix,
438 ProcgenPointSetHandleRef points, uint64_t targetRevision,
439 const std::string& assetAttribute,
440 const std::string& defaultAsset);
453 [[nodiscard]] eve::Result<uint64_t> publishCellInstanceDelta(const std::string& prefix,
455 const PointDelta& delta, uint64_t targetRevision,
456 const std::string& assetAttribute,
457 const std::string& defaultAsset);
469 [[nodiscard]] eve::Result<uint64_t> synchronizeCellInstances(const std::string& prefix,
470 const RuntimeGeneration& runtime,
472 const std::string& assetAttribute,
473 const std::string& defaultAsset);
491 [[nodiscard]] eve::Result<uint64_t> synchronizeCellInstancesAtomic(
492 const std::string& prefix, const std::vector<const RuntimeGeneration*>& runtimes,
493 const std::vector<const ProcgenCellRequest*>& requests, const std::string& assetAttribute,
494 const std::string& defaultAsset);
496 [[nodiscard]] eve::Result<void> removeCellInstances(const std::string& prefix, const ProcgenCellRequest& request);
503 [[nodiscard]] eve::Result<uint64_t> removeCellInstancesAtomic(
504 const std::string& prefix, const std::vector<const ProcgenCellRequest*>& requests);
519 [[nodiscard]] eve::Result<uint64_t> completeCellCleanupAtomic(
520 const std::string& prefix, const std::vector<RuntimeGeneration*>& runtimes,
521 const std::vector<const ProcgenCellRequest*>& requests);
523 int getPublishedInstanceCount(const std::string& batchId) const;
525 int getPublishedCreatedCount(const std::string& batchId) const;
527 int getPublishedReusedCount(const std::string& batchId) const;
529 int getPublishedRemovedCount(const std::string& batchId) const;
531 uint32_t deriveSeed(uint32_t parent, const std::string& scope) const;
532
533 // --- Atomic script rebuilds ---
535 [[nodiscard]] static eve::Result<ProcgenContextHandleRef> beginSystemHandle(const std::string& name, uint32_t seed);
537 [[nodiscard]] static eve::Result<ProcgenContextHandleRef> beginCachedSystemHandle(const std::string& name,
538 uint32_t seed,
539 const std::string& buildKey);
541 [[nodiscard]] static eve::script::Borrowed<ProcgenContext> resolve(ProcgenContextHandleRef reference) noexcept;
545 [[nodiscard]] static bool isStale(ProcgenContextHandleRef reference) noexcept;
546 [[nodiscard]] eve::Result<void> commitSystem(ProcgenContextHandleRef context);
547 [[nodiscard]] eve::Result<void> abortSystem(ProcgenContextHandleRef context);
548 [[nodiscard]] eve::Result<void> removeSystem(const std::string& name);
549 bool hasSystem(const std::string& name) const;
551 uint64_t getSystemRevision(const std::string& name) const;
553 uint32_t getSystemSeed(const std::string& name) const;
555 std::string getSystemBuildKey(const std::string& name) const;
557 int getSystemOutputCount(const std::string& name) const;
559 std::string getSystemOutputName(const std::string& name, int index) const;
561 int getSystemDebugStageCount(const std::string& name) const;
563 std::string getSystemDebugStageName(const std::string& name, int index) const;
565 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> getSystemOutputHandle(const std::string& name,
566 const std::string& outputName) const;
568 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> getSystemDebugStageHandle(const std::string& name,
569 const std::string& stageName) const;
571 [[nodiscard]] eve::Result<ProcgenPointSetHandleRef> getPreviousSystemDebugStageHandle(
572 const std::string& name, const std::string& stageName) const;
574 uint64_t getPreviousSystemRevision(const std::string& name) const;
576 std::string getSystemDebugReport(const std::string& name) const;
578 std::string getSystemDebugDiffReport(const std::string& name) const;
579
580 // --- Phase A: maps ---
582 [[nodiscard]] eve::Result<ProcgenGridHandleRef> generateHandle(const std::string& algorithmId,
585 [[nodiscard]] eve::Result<void> generateTo(const std::string& algorithmId, ProcgenParamsHandleRef params,
588 [[nodiscard]] eve::Result<void> applyToLayer(ProcgenGridHandleRef grid, const std::string& palette,
590
592 void setPaletteGid(const std::string& palette, const std::string& semantic, int gid);
594 int getPaletteGid(const std::string& palette, const std::string& semantic) const;
595
597 int getAlgorithmCount() const;
599 std::string getAlgorithmId(int index) const;
601 bool hasAlgorithm(const std::string& algorithmId) const;
603 [[nodiscard]] eve::Result<RecipeDescriptor> getAlgorithmSchema(const std::string& algorithmId) const;
606 std::string getAlgorithmDisplayName(const std::string& algorithmId) const;
609 std::string getAlgorithmCategory(const std::string& algorithmId) const;
612 int getAlgorithmParamCount(const std::string& algorithmId) const;
615 std::string getAlgorithmParamKey(const std::string& algorithmId, int index) const;
618 std::string getAlgorithmParamLabel(const std::string& algorithmId, int index) const;
621 std::string getAlgorithmParamDescription(const std::string& algorithmId, int index) const;
624 std::string getAlgorithmParamCategory(const std::string& algorithmId, int index) const;
627 std::string getAlgorithmParamKind(const std::string& algorithmId, int index) const;
630 std::string getAlgorithmParamDefault(const std::string& algorithmId, int index) const;
633 bool algorithmParamHasMinimum(const std::string &algorithmId, int index) const;
636 bool algorithmParamHasMaximum(const std::string &algorithmId, int index) const;
639 float getAlgorithmParamMinimum(const std::string& algorithmId, int index) const;
642 float getAlgorithmParamMaximum(const std::string& algorithmId, int index) const;
645 float getAlgorithmParamStep(const std::string& algorithmId, int index) const;
648 bool isAlgorithmParamAdvanced(const std::string& algorithmId, int index) const;
651 int getAlgorithmParamChoiceCount(const std::string& algorithmId, int index) const;
655 std::string getAlgorithmParamChoice(const std::string& algorithmId, int paramIndex, int choiceIndex) const;
659 [[nodiscard]] eve::Result<void> applyAlgorithmDefaults(const std::string& algorithmId,
661
666 [[nodiscard]] eve::Result<void> autotileGrid(ProcgenGridHandleRef grid);
667
669 uint32_t randomSeed();
670
673
674 // --- Phase B: textures ---
676 [[nodiscard]] eve::Result<ProcgenImageHandleRef> generateImageHandle(const std::string& recipeId,
690 [[nodiscard]] static eve::script::Borrowed<image::ImageData> resolve(ProcgenImageHandleRef reference) noexcept;
703 [[nodiscard]] static bool isStale(ProcgenImageHandleRef reference) noexcept;
704
705 [[nodiscard]] eve::Result<ProcgenNormalImageHandleRef> generateNormalImageHandle(const std::string& recipeId,
719 [[nodiscard]] static eve::script::Borrowed<image::ImageData> resolve(
733 [[nodiscard]] static bool isStale(ProcgenNormalImageHandleRef reference) noexcept;
747 [[nodiscard]] eve::script::Borrowed<graphics::Texture> generateTextureBorrowed(const std::string& recipeId,
749 graphics::Graphics* gfx);
750
752 int getTextureRecipeCount() const;
754 std::string getTextureRecipeId(int index) const;
756 bool hasTextureRecipe(const std::string& recipeId) const;
758 [[nodiscard]] eve::Result<RecipeDescriptor> getTextureRecipeSchema(const std::string& recipeId) const;
760 [[nodiscard]] eve::Result<void> applyTextureRecipeDefaults(const std::string& recipeId,
762
763 // --- Phase E: dynamic clouds + cloud shadows ---
765 [[nodiscard]] eve::Result<ProcgenCloudFieldHandleRef> newCloudFieldHandle();
766 [[nodiscard]] eve::script::Borrowed<CloudField> resolveCloudField(ProcgenCloudFieldHandleRef) noexcept;
767 [[nodiscard]] eve::Result<void> releaseCloudField(ProcgenCloudFieldHandleRef);
768 [[nodiscard]] bool isCloudFieldStale(ProcgenCloudFieldHandleRef) const noexcept;
770 [[nodiscard]] eve::Result<ProcgenCloudShadowHandleRef> newCloudShadowHandle();
771 [[nodiscard]] eve::script::Borrowed<CloudShadow> resolveCloudShadow(ProcgenCloudShadowHandleRef) noexcept;
772 [[nodiscard]] eve::Result<void> releaseCloudShadow(ProcgenCloudShadowHandleRef);
773 [[nodiscard]] bool isCloudShadowStale(ProcgenCloudShadowHandleRef) const noexcept;
775 [[nodiscard]] eve::Result<float> cloudCoverageAt(ProcgenCloudFieldHandleRef field, float x, float z, float time);
777 [[nodiscard]] eve::Result<float> cloudShadowFactor(ProcgenCloudShadowHandleRef shadow, float x, float z,
778 float time);
780 [[nodiscard]] eve::Result<void> sampleCloud(ProcgenCloudFieldHandleRef field, std::span<float> out, int w, int h,
781 float time, float x0, float z0, float extent);
783 [[nodiscard]] eve::Result<void> sampleCloudShadow(ProcgenCloudShadowHandleRef shadow, std::span<float> out, int w,
784 int h, float time, float x0, float z0, float extent);
791 [[nodiscard]] eve::Result<ProcgenPbrMaterialHandleRef> generatePbrMaterialHandle(const std::string& recipeId,
794 [[nodiscard]] eve::script::Borrowed<PbrTextureSet> resolvePbrMaterial(ProcgenPbrMaterialHandleRef) noexcept;
796 [[nodiscard]] eve::Result<void> releasePbrMaterial(ProcgenPbrMaterialHandleRef);
798 [[nodiscard]] bool isPbrMaterialStale(ProcgenPbrMaterialHandleRef) const noexcept;
799
801 int getPbrRecipeCount() const;
803 std::string getPbrRecipeId(int index) const;
805 bool hasPbrRecipe(const std::string& recipeId) const;
807 [[nodiscard]] eve::Result<RecipeDescriptor> getPbrRecipeSchema(const std::string& recipeId) const;
809 [[nodiscard]] eve::Result<void> applyPbrRecipeDefaults(const std::string& recipeId,
811
812 // --- Mesh recipes (Marching Cubes, …) ---
818 [[nodiscard]] eve::Result<ProcgenMeshBuildHandleRef> buildMeshHandle(const std::string& recipeId,
821 [[nodiscard]] eve::script::Borrowed<MeshBuild> resolveMeshBuild(ProcgenMeshBuildHandleRef) noexcept;
823 [[nodiscard]] eve::Result<void> releaseMeshBuild(ProcgenMeshBuildHandleRef);
825 [[nodiscard]] bool isMeshBuildStale(ProcgenMeshBuildHandleRef) const noexcept;
833 [[nodiscard]] eve::Result<GeneratedArtifact> buildArtifact(const std::string& recipeId,
844 [[nodiscard]] eve::Result<ArtifactPublishReceipt> publishArtifact(const std::string& recipeId,
848 [[nodiscard]] const ArtifactStore& artifactStore() const noexcept { return artifactStore_; }
851 [[nodiscard]] eve::script::Borrowed<graphics::Mesh> uploadMeshBorrowed(const MeshBuild &mesh,
852 graphics::Graphics &gfx);
868 [[nodiscard]] eve::Result<void> configureGtsTerrainTileLods(
869 const GtsTerrainLodSet& lods, int tileIndex, graphics::Renderable3D& renderable,
870 graphics::Graphics& gfx, float worldDiameter, float verticalFovDegrees,
871 float originX = 0.f, float originY = 0.f, float originZ = 0.f);
883 [[nodiscard]] eve::Result<void> configurePcgMeshLods(const PcgMeshLodSet& lods,
884 graphics::Renderable3D& renderable,
885 graphics::Graphics& gfx, float worldDiameter,
886 float verticalFovDegrees);
888 [[nodiscard]] eve::script::Borrowed<graphics::Mesh> generateMeshBorrowed(const std::string& recipeId,
890 graphics::Graphics* gfx);
891
893 int getMeshRecipeCount() const;
895 std::string getMeshRecipeId(int index) const;
897 bool hasMeshRecipe(const std::string& recipeId) const;
899 [[nodiscard]] eve::Result<RecipeDescriptor> getMeshRecipeSchema(const std::string& recipeId) const;
901 [[nodiscard]] eve::Result<void> applyMeshRecipeDefaults(const std::string& recipeId,
903
904 // --- Phase D: terrain height sampling ---
906 [[nodiscard]] eve::Result<ProcgenTerrainSamplerHandleRef> newTerrainSamplerHandle();
907 [[nodiscard]] eve::script::Borrowed<TerrainSampler> resolveTerrainSampler(ProcgenTerrainSamplerHandleRef) noexcept;
908 [[nodiscard]] eve::Result<void> releaseTerrainSampler(ProcgenTerrainSamplerHandleRef);
909 [[nodiscard]] bool isTerrainSamplerStale(ProcgenTerrainSamplerHandleRef) const noexcept;
911 [[nodiscard]] eve::Result<ProcgenHeightmapHandleRef> newHeightmapHandle(int width, int height);
915 [[nodiscard]] eve::Result<ProcgenHeightmapHandleRef> adoptHeightmap(Heightmap heightmap);
916 [[nodiscard]] eve::script::Borrowed<Heightmap> resolveHeightmap(ProcgenHeightmapHandleRef) noexcept;
917 [[nodiscard]] eve::Result<void> releaseHeightmap(ProcgenHeightmapHandleRef);
918 [[nodiscard]] bool isHeightmapStale(ProcgenHeightmapHandleRef) const noexcept;
920 bool heightmapToGrid(Heightmap* heightmap, Params* params, Grid2D* out);
922 bool erodeTerrainThermal(Heightmap* heightmap, int iterations, float talus, float strength);
924 bool erodeTerrainHydraulic(Heightmap* heightmap, int iterations, float rainfall, float evaporation, float capacity,
925 float erosion, float deposition);
927 bool erodeTerrainFluvial(Heightmap* heightmap, int iterations, float riverThreshold, float incision, float maxDepth,
928 float bankWidth);
930 bool erodeTerrainFluvialAdvanced(Heightmap* heightmap, int iterations, float riverThreshold, float incision,
931 float maxDepth, float bankWidth, float maxBreachDepth);
933 bool erodeTerrainFluvialScaled(Heightmap* heightmap, int iterations, float riverThreshold, float incision,
934 float maxDepth, float bankWidth, float maxBreachDepth, float coordinateScale);
936 TerrainErosionMap* erodeTerrainFluvialDetailed(Heightmap* heightmap, int iterations, float riverThreshold,
937 float incision, float maxDepth, float bankWidth,
938 float maxBreachDepth, float coordinateScale);
940 TerrainLayers* analyzeTerrain(Heightmap* heightmap, float riverThreshold, float seaLevel, float latitude);
942 TerrainLayers* analyzeTerrainScaled(Heightmap* heightmap, float riverThreshold, float seaLevel, float latitude,
943 float coordinateScale);
945 data::ByteData* bakeTerrainAsset(Heightmap* heightmap, TerrainLayers* layers, int chunkSize);
947 TerrainMeshChunk* buildTerrainChunk(Heightmap* heightmap, TerrainLayers* layers, int originX, int originY,
948 int cellsX, int cellsY, int lod, float cellSize, float heightScale,
949 float skirtDepth);
951 int selectTerrainLod(Heightmap* heightmap, int originX, int originY, int cellsX, int cellsY, int maxLod,
952 float cellSize, float heightScale, float cameraDistance, float viewportHeight,
953 float verticalFovDegrees, float targetPixelError);
955 graphics::Mesh* generateTerrainChunkMesh(TerrainMeshChunk* chunk, graphics::Graphics* gfx);
957 graphics::Mesh* generateTerrainRiverMesh(Heightmap* heightmap, TerrainLayers* layers, graphics::Graphics* gfx,
958 int originX, int originY, int cellsX, int cellsY, float cellSize,
959 float heightScale, float minWidth, float maxWidth, float heightOffset);
961 graphics::Mesh* generateTerrainRiverMeshAdvanced(Heightmap* heightmap, TerrainLayers* layers,
962 graphics::Graphics* gfx, int originX, int originY, int cellsX,
963 int cellsY, float cellSize, float heightScale, float minWidth,
964 float maxWidth, float heightOffset, float minSurfaceSlope,
965 float maxSurfaceSlope);
967 graphics::Mesh* generateTerrainLakeMesh(Heightmap* heightmap, TerrainLayers* layers, graphics::Graphics* gfx,
968 int originX, int originY, int cellsX, int cellsY, float cellSize,
969 float heightScale, float minimumDepth, float heightOffset);
971 image::ImageData* generateTerrainSplatMap(TerrainMeshChunk* chunk);
973 image::ImageData* generateTerrainAlbedoMap(TerrainMeshChunk* chunk);
975 image::ImageData* generateTerrainErosionMap(TerrainErosionMap* erosion, float exposure);
977 image::ImageData* generateTerrainWearMap(TerrainErosionMap* erosion, float exposure);
979 image::ImageData* generateTerrainDepositionMap(TerrainErosionMap* erosion, float exposure);
981 graphics::Shader* createTerrainMaterialShader(graphics::Graphics* gfx);
983 graphics::Shader* createTerrainWaterShader(graphics::Graphics* gfx);
985 [[nodiscard]] eve::Result<ProcgenHeightmapHandleRef> generateHeightmapHandle(ProcgenParamsHandleRef params);
987 [[nodiscard]] eve::Result<ProcgenGridHandleRef> heightmapToGrid(ProcgenHeightmapHandleRef heightmap,
989
991 PaletteTable& palettes() { return palettes_; }
992
993private:
994 bool runGenerate(const std::string& algorithmId, const Params& params, Grid2D& out);
995 ArtifactId nextCompatibilityArtifactId() noexcept;
996
997 struct OwnershipState;
998 std::unique_ptr<OwnershipState> ownership_;
999
1000 PaletteTable palettes_;
1001 mutable std::string lastError_;
1002 mutable std::vector<std::string> algorithmIdsCache_;
1003 mutable std::vector<std::string> textureRecipeIdsCache_;
1004 mutable std::vector<std::string> pbrRecipeIdsCache_;
1005 mutable std::vector<std::string> meshRecipeIdsCache_;
1006 std::unordered_map<std::string, ProcgenSystemSnapshot> systems_;
1007 std::unordered_map<std::string, ProcgenSystemSnapshot> previousSystems_;
1008 ArtifactStore artifactStore_;
1009 std::uint64_t nextArtifactSequence_ = 1;
1010 eve::script::RuntimeObjectRegistry<Params, ProcgenParamsHandleTag> params_;
1011 eve::script::RuntimeObjectRegistry<Grid2D, ProcgenGridHandleTag> grids_;
1012 eve::script::RuntimeObjectRegistry<ProcgenContext, ProcgenContextHandleTag> contexts_;
1013 eve::script::RuntimeObjectRegistry<SpatialData, ProcgenSpatialDataHandleTag> spatialData_;
1014 eve::script::RuntimeObjectRegistry<RuntimeGeneration, ProcgenRuntimeGenerationHandleTag> runtimeGenerations_;
1015 eve::script::RuntimeObjectRegistry<PointGraph, ProcgenPointGraphHandleTag> pointGraphs_;
1016 eve::script::RuntimeObjectRegistry<MeshModifierGraph, ProcgenMeshModifierGraphHandleTag> meshModifierGraphs_;
1018 meshDeformationSessions_;
1020 dynamicMeshUvPaintSessions_;
1021 eve::script::RuntimeObjectRegistry<SplinePath, ProcgenSplinePathHandleTag> splinePaths_;
1022 eve::script::RuntimeObjectRegistry<GridGraph, ProcgenGridGraphHandleTag> gridGraphs_;
1023 eve::script::RuntimeObjectRegistry<MeshGraph, ProcgenMeshGraphHandleTag> meshGraphs_;
1024 eve::script::RuntimeObjectRegistry<BiomeRules, ProcgenBiomeRulesHandleTag> biomeRules_;
1025 eve::script::RuntimeObjectRegistry<ShapeGrammar, ProcgenShapeGrammarHandleTag> shapeGrammars_;
1026 eve::script::RuntimeObjectRegistry<LSystem, ProcgenLSystemHandleTag> lsystems_;
1027};
1028
1029} // namespace eve::procgen
ActionParameterOperation operation
double value
float w
Definition AnimClip.cpp:738
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
std::string output
eve::action::ActionSpatialBinding spatial
AuthorityStoreHandleRef reference
Definition Authority.cpp:24
int mask
std::map< std::string, Var > values
EvpackChunkInput input
Definition Evpack.cpp:170
#define EVENGINE_API_DOMAINS
Definition Export.h:110
std::string palette
const GltfImportRequest & request
std::uint32_t capacity
HexVec3 left
HexVec3 right
std::int32_t second
std::int32_t first
int h
std::uint32_t height
std::uint32_t width
JobScope scope
std::int32_t parent
std::string name
TileLayer * layer
float radius
std::string script
Definition PlayHost.cpp:116
std::uint32_t seed
Definition PointSet.cpp:807
std::shared_ptr< const std::vector< glm::vec2 > > points
std::function< eve::Result< void >()> release
Definition Procgen.cpp:86
Mesh * mesh
int lod
const SquirrelValueOptions & options
Explicit Value/Owned/Borrowed semantics at the Squirrel boundary.
int spacing
int iterations
Definition TreeMesh.cpp:311
uint32_t index
const UnitySourceAsset & source
std::uint32_t depth
const VegetationPresetContext & context
uint32_t semantic
Definition WfcSimple.cpp:15
EVENGINE_API_FOUNDATION public API.
Definition Module.h:46
Move-only operation result carrying either a value or Status.
Definition Result.h:155
In-memory byte buffer implementing eve::Data (ref-counted).
Definition ByteData.h:13
Id128 public API.
Definition Identity.h:112
GPU mesh handle (+ optional CPU morph targets).
Definition Mesh.h:25
EVENGINE_API_BACKENDS public API.
Custom GPU program.
Definition Shader.h:39
Represents raw pixel data.
Definition ImageData.h:38
ECS tile layer entity. Script mutates tile GIDs / tileset / draw; TileRenderSystem batch-draws atlas ...
Definition TileLayer.h:32
In-memory owner and publisher for generated artifacts.
Data-driven biome distribution rules compatible with PointGraph and scene batches.
Definition Biome.h:40
Integrates dynamic-mesh hit mapping with the canonical image UV-paint session.
Intermediate 2D generation result. cells store semantic ids (see Semantic.h), not tile GIDs — convert...
Definition Grid2D.h:36
Deterministic data-flow graph for grid generation and explicit grid-to-point composition.
Definition GridGraph.h:35
Owned result of the GTS split-and-sequential-simplify pipeline.
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:21
General stochastic bracketed L-system engine.
Definition LSystem.h:55
CPU triangle mesh from procedural mesh recipes (e.g. marching cubes). Positions/normals are xyz-packe...
Definition MeshBuild.h:19
Stateful CPU sculpting session with explicit bake, restore, and undo semantics.
Typed procedural mesh graph composing grid, point and topology domains.
Definition MeshGraph.h:21
Deterministic CPU data-flow graph for procedural mesh deformation and composition.
Named palette: semantic name -> tile GID. Unmapped semantics become GID 0.
Definition Palette.h:16
Owning, typed generation parameters.
Definition Params.h:27
Owned generic mesh LOD output generated with Pcg's independent-per-level policy.
Definition PcgMeshLod.h:144
EVENGINE_API_DOMAINS public API.
Definition PointGraph.h:66
One immutable runtime-generation cell request returned to script.
Staging area for one atomic rebuild of a named procedural system.
Procedural generation module. Phase A: runtime maps (semantic Grid2D → TileLayer)....
Definition Procgen.h:146
const ArtifactStore & artifactStore() const noexcept
Borrow the compatibility facade's published CPU artifact store.
Definition Procgen.h:848
bool heightmapToGrid(Heightmap *heightmap, Params *params, Grid2D *out)
Compatibility facade that classifies a heightmap into a semantic Grid2D.
~Procgen() override
Procgen.
PaletteTable & palettes()
Palettes.
Definition Procgen.h:991
View-driven partition and hierarchical procedural generation scheduler.
Module-based shape grammar expanded continuously along a 3D polyline.
Queryable spatial input for procedural pipelines.
Definition SpatialData.h:35
Owning multi-segment 3D spline with deterministic bounded sampling.
Definition SplinePath.h:91
Script-friendly ownership wrapper for baked hydrology and climate layers.
One renderable heightfield chunk plus four ecological material weights.
Definition TerrainMesh.h:27
Non-owning C++ observation with no implicit lifetime extension.
const char * defaultValue
std::vector< ParamSpec > params
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
std::string gridToJson(const Grid2D &grid)
Compact JSON for debugging / reload workflows (not full Tiled).
uint32_t deriveSeed(uint32_t parent, const std::string &scope)
Stable label-based seed derivation; independent pipeline branches do not perturb each other.
Definition PointSet.cpp:459
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
Required provider set for one artifact publication transaction.
Transactional identity-based change set between two point snapshots.
Definition PointDelta.h:16
Handle domain for module-owned biome rules.
Definition Procgen.h:107
Handle domain for module-owned cloud fields.
Definition Procgen.h:77
Handle domain for module-owned cloud shadow fields.
Definition Procgen.h:79
Handle domain for module-owned procedural rebuild contexts.
Definition Procgen.h:67
Handle domain for module-owned dynamic-mesh UV paint sessions.
Definition Procgen.h:99
Handle domain for module-owned grid graphs.
Definition Procgen.h:103
Handle domain for module-owned procedural grids.
Definition Procgen.h:65
Handle domain for module-owned heightmaps.
Definition Procgen.h:75
Handle domain for module-owned generated images.
Definition Procgen.h:85
Handle domain for module-owned L-system engines.
Definition Procgen.h:111
Handle domain for module-owned CPU mesh builds.
Definition Procgen.h:83
Handle domain for module-owned interactive mesh deformation sessions.
Definition Procgen.h:97
Handle domain for module-owned mesh graphs.
Definition Procgen.h:105
Handle domain for module-owned mesh modifier graphs.
Definition Procgen.h:95
Handle domain for module-owned generated normal images.
Definition Procgen.h:87
Handle domain for module-owned output specifications.
Definition Procgen.h:69
Handle domain for module-owned procedural parameter objects.
Definition Procgen.h:63
Handle domain for module-owned PBR material sets.
Definition Procgen.h:81
Handle domain for module-owned point graphs.
Definition Procgen.h:93
Handle domain for module-owned point-set intermediates.
Definition Procgen.h:71
Handle domain for module-owned runtime-generation schedulers.
Definition Procgen.h:91
Handle domain for module-owned shape grammars.
Definition Procgen.h:109
Handle domain for module-owned spatial data.
Definition Procgen.h:89
Handle domain for module-owned 3D spline paths.
Definition Procgen.h:101
Immutable committed snapshot retained by Procgen across script reloads.
Handle domain for module-owned terrain samplers.
Definition Procgen.h:73
Per-cell diagnostic outputs produced by an erosion stage.