16 Procgen *pg() {
return eve::ModuleManager::getInstance<Procgen>(
"Procgen"); }
18 std::vector<std::string> algorithms()
override {
19 std::vector<std::string> out;
21 for (
int i = 0; i <
p->getAlgorithmCount(); ++i) out.push_back(
p->getAlgorithmId(i));
25 std::vector<std::string> meshRecipes()
override {
26 std::vector<std::string> out;
28 for (
int i = 0; i <
p->getMeshRecipeCount(); ++i)
29 out.push_back(
p->getMeshRecipeId(i));
33 std::vector<std::string> textureRecipes()
override {
34 std::vector<std::string> out;
36 for (
int i = 0; i <
p->getTextureRecipeCount(); ++i)
37 out.push_back(
p->getTextureRecipeId(i));
41 std::vector<std::string> pbrRecipes()
override {
42 std::vector<std::string> out;
44 for (
int i = 0; i <
p->getPbrRecipeCount(); ++i) out.push_back(
p->getPbrRecipeId(i));
48 std::string generateMap(
const std::string &algorithm,
int width,
int height, uint32_t
seed,
49 const std::vector<std::pair<std::string, std::string>> &
params,
50 std::string *err)
override {
53 if (err) *err =
"Procgen module not available";
58 if (err) *err =
"parameter allocation failed";
61 const auto parRef = std::move(parResult).takeValue();
63 if (!parView.isBound()) {
65 if (err) *err =
"parameter handle became stale";
68 auto *par = parView.get();
71 for (
const auto &kv :
params) {
72 if (kv.second.find_first_not_of(
"0123456789-") == std::string::npos)
73 par->setInt(kv.first, std::atoi(kv.second.c_str()));
75 par->setString(kv.first, kv.second);
77 auto gridResult =
p->generateHandle(algorithm, parRef);
80 if (err) *err =
"generate failed: " + gridResult.status().describe();
83 auto jsonResult =
p->gridToJson(std::move(gridResult).takeValue());
86 if (err) *err =
"serialization failed: " + jsonResult.status().describe();
89 std::string json = std::move(jsonResult).takeValue();
94 std::string buildMesh(
const std::string &recipe, uint32_t
seed,
int width,
int height,
95 int depth, std::string *err)
override {
98 if (err) *err =
"Procgen module not available";
103 if (err) *err =
"parameter allocation failed";
106 const auto parRef = std::move(parResult).takeValue();
108 if (!parView.isBound()) {
110 if (err) *err =
"parameter handle became stale";
113 auto *par = parView.get();
118 auto meshResult =
p->buildMeshHandle(recipe, parRef);
121 if (err) *err =
"build failed: " + meshResult.status().describe();
124 const auto meshRef = std::move(meshResult).takeValue();
125 auto mesh =
p->resolveMeshBuild(meshRef);
126 if (!
mesh.isBound()) {
127 p->releaseMeshBuild(meshRef).ignore(
"release failed after stale mesh lookup");
129 if (err) *err =
"build failed: mesh handle became stale";
132 std::string json =
"{\"vertices\":" + std::to_string(
mesh->getVertexCount()) +
133 ",\"triangles\":" + std::to_string(
mesh->getIndexCount() / 3) +
"}";
134 p->releaseMeshBuild(meshRef).ignore(
"release mesh after capability query");
143 static ProcgenQueryImpl
impl;
144 eve::cap::provide<eve::IProcgenQuery>(&
impl);
Procedural generation query surface (provided by the procgen module).
void ignore(std::string_view reason={}) const noexcept
Explicitly discard this result after documenting the reason.
static eve::script::Borrowed< Params > resolve(ProcgenParamsHandleRef reference) noexcept
Resolves parameters as a non-owning observation.
static eve::Result< ProcgenParamsHandleRef > newParamsHandle()
Allocates module-owned generation parameters.
static eve::Result< void > release(ProcgenParamsHandleRef reference)
Releases module-owned parameters.
std::vector< ParamSpec > params
void registerProcgenCapabilities()
Registers procgen capabilities.