载入中...
搜索中...
未找到
ParamSchema.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <iomanip>
5#include <sstream>
6#include <utility>
7
8namespace eve::procgen {
9namespace {
10
11std::string floatString(float value) {
12 std::ostringstream stream;
13 stream << std::setprecision(9) << value;
14 return stream.str();
15}
16
17} // namespace
18
20 int step) {
21 ParamDescriptor result;
22 result.key = std::move(key);
23 result.displayName = std::move(label);
24 result.kind = ParamKind::Integer;
25 result.defaultValue = std::to_string(defaultValue);
26 result.hasMinimum = result.hasMaximum = true;
27 result.minimum = minimum;
28 result.maximum = maximum;
29 result.step = step;
30 return result;
31}
32
34 float maximum, float step) {
35 ParamDescriptor result;
36 result.key = std::move(key);
37 result.displayName = std::move(label);
38 result.kind = ParamKind::Float;
39 result.defaultValue = floatString(defaultValue);
40 result.hasMinimum = result.hasMaximum = true;
41 result.minimum = minimum;
42 result.maximum = maximum;
43 result.step = step;
44 return result;
45}
46
48 ParamDescriptor result;
49 result.key = std::move(key);
50 result.displayName = std::move(label);
51 result.kind = ParamKind::Boolean;
52 result.defaultValue = defaultValue ? "1" : "0";
53 return result;
54}
55
56ParamDescriptor ParamDescriptor::text(std::string key, std::string label, std::string defaultValue) {
57 ParamDescriptor result;
58 result.key = std::move(key);
59 result.displayName = std::move(label);
60 result.kind = ParamKind::String;
61 result.defaultValue = std::move(defaultValue);
62 return result;
63}
64
65ParamDescriptor ParamDescriptor::choice(std::string key, std::string label, std::string defaultValue,
66 std::vector<std::string> choices) {
67 ParamDescriptor result = text(std::move(key), std::move(label), std::move(defaultValue));
68 result.kind = ParamKind::Choice;
69 result.choices = std::move(choices);
70 return result;
71}
72
73RecipeDescriptor RecipeDescriptor::grid(std::string id, std::string displayName, std::string category, int minimumWidth,
74 int minimumHeight, int maximumWidth, int maximumHeight) {
75 RecipeDescriptor result;
76 result.id = std::move(id);
77 result.displayName = std::move(displayName);
78 result.category = std::move(category);
79 result.params.push_back(ParamDescriptor::integer("seed", "Seed", 1, 0, 2147483647, 1));
80 result.params.push_back(ParamDescriptor::integer("width", "Width", 32, minimumWidth, maximumWidth, 1));
81 result.params.push_back(ParamDescriptor::integer("height", "Height", 32, minimumHeight, maximumHeight, 1));
82 return result;
83}
84
85const ParamDescriptor* RecipeDescriptor::find(const std::string& key) const {
86 const auto it =
87 std::find_if(params.begin(), params.end(), [&](const ParamDescriptor& param) { return param.key == key; });
88 return it == params.end() ? nullptr : &*it;
89}
90
92 for (const ParamDescriptor& param : params) {
93 if (values.has(param.key)) continue;
94 switch (param.kind) {
95 case ParamKind::Integer: values.setInt(param.key, std::stoi(param.defaultValue)); break;
96 case ParamKind::Boolean: values.setBool(param.key, std::stoi(param.defaultValue) != 0); break;
97 case ParamKind::Float: values.setFloat(param.key, std::stof(param.defaultValue)); break;
99 case ParamKind::Choice: values.setString(param.key, param.defaultValue); break;
100 }
101 }
102}
103
104const ParamDescriptor* RecipeDescriptor::at(int index) const {
105 return index < 0 || index >= int(params.size()) ? nullptr : &params[size_t(index)];
106}
107
108std::string RecipeDescriptor::getParamKey(int index) const {
109 const ParamDescriptor* param = at(index);
110 return param ? param->key : std::string{};
111}
112
114 const ParamDescriptor* param = at(index);
115 return param ? param->displayName : std::string{};
116}
117
119 const ParamDescriptor* param = at(index);
120 return param ? param->description : std::string{};
121}
122
124 const ParamDescriptor* param = at(index);
125 return param ? param->category : std::string{};
126}
127
128std::string RecipeDescriptor::getParamKind(int index) const {
129 const ParamDescriptor* param = at(index);
130 if (!param) return {};
131 switch (param->kind) {
132 case ParamKind::Integer: return "int";
133 case ParamKind::Float: return "float";
134 case ParamKind::Boolean: return "bool";
135 case ParamKind::String: return "string";
136 case ParamKind::Choice: return "choice";
137 }
138 return {};
139}
140
142 const ParamDescriptor* param = at(index);
143 return param ? param->defaultValue : std::string{};
144}
145
147 const ParamDescriptor* param = at(index);
148 return param && param->hasMinimum;
149}
150
152 const ParamDescriptor* param = at(index);
153 return param && param->hasMaximum;
154}
155
157 const ParamDescriptor* param = at(index);
158 return param ? float(param->minimum) : 0.f;
159}
160
162 const ParamDescriptor* param = at(index);
163 return param ? float(param->maximum) : 0.f;
164}
165
167 const ParamDescriptor* param = at(index);
168 return param ? float(param->step) : 0.f;
169}
170
172 const ParamDescriptor* param = at(index);
173 return param && param->advanced;
174}
175
177 const ParamDescriptor* param = at(index);
178 return param ? int(param->choices.size()) : 0;
179}
180
181std::string RecipeDescriptor::getParamChoice(int paramIndex, int choiceIndex) const {
182 const ParamDescriptor* param = at(paramIndex);
183 if (!param || choiceIndex < 0 || choiceIndex >= int(param->choices.size())) return {};
184 return param->choices[size_t(choiceIndex)];
185}
186
187} // namespace eve::procgen
double value
std::string label
std::map< std::string, Var > values
float maximum[3]
float minimum[3]
std::uint32_t key
std::string text
std::set< std::string > choices
float step
Definition TreeMesh.cpp:314
const char * category
uint32_t index
std::size_t at
Owning, typed generation parameters.
Definition Params.h:27
const char * defaultValue
UI-independent metadata for one procedural recipe parameter.
Definition ParamSchema.h:14
static ParamDescriptor boolean(std::string key, std::string label, bool defaultValue)
Construct a Boolean descriptor stored as zero or one in Params.
static ParamDescriptor choice(std::string key, std::string label, std::string defaultValue, std::vector< std::string > choices)
Construct a finite-choice string descriptor.
static ParamDescriptor floating(std::string key, std::string label, float defaultValue, float minimum, float maximum, float step)
Construct a bounded floating-point descriptor.
std::vector< std::string > choices
Definition ParamSchema.h:26
static ParamDescriptor integer(std::string key, std::string label, int defaultValue, int minimum, int maximum, int step=1)
Construct a bounded integer descriptor.
static ParamDescriptor text(std::string key, std::string label, std::string defaultValue)
Construct a free-form string descriptor.
Complete metadata and parameter schema shared by every procgen recipe family.
Definition ParamSchema.h:52
int getParamChoiceCount(int index) const
Return the number of choices for one parameter.
static RecipeDescriptor grid(std::string id, std::string displayName, std::string category, int minimumWidth, int minimumHeight, int maximumWidth=4096, int maximumHeight=4096)
Create a schema with common seed, width and height parameters.
float getParamMaximum(int index) const
Return a numeric maximum.
float getParamStep(int index) const
Return the suggested numeric editing step.
const ParamDescriptor * find(const std::string &key) const
Find one parameter descriptor by stable key.
std::string getParamLabel(int index) const
Return a parameter label by index.
std::string getParamDescription(int index) const
Return parameter help text by index.
std::string getParamKey(int index) const
Return a parameter key by index.
std::string getParamDefault(int index) const
Return the schema default encoded as text.
float getParamMinimum(int index) const
Return a numeric minimum.
bool paramHasMaximum(int index) const
Test whether a numeric maximum exists.
std::string getParamCategory(int index) const
Return a parameter category by index.
std::vector< ParamDescriptor > params
Definition ParamSchema.h:56
void applyDefaults(Params &params) const
Fill missing Params values from this schema.
bool paramHasMinimum(int index) const
Test whether a numeric minimum exists.
bool isParamAdvanced(int index) const
Test whether compact inspectors should hide the field.
std::string getParamChoice(int paramIndex, int choiceIndex) const
Return one choice.
std::string getParamKind(int index) const
Return the portable parameter kind.