TerraForge3D  2.3.1
3D Terrain And Landscape Generator
GeneratorMask.cpp
1#include "Generators/GeneratorMask.h"
2#include "Generators/MaskLayerHelper.h"
3#include "Data/ApplicationState.h"
4
5#include "imgui/imgui.h"
6
7
8
9GeneratorMaskManager::GeneratorMaskManager(ComputeKernel *kernel, std::string id, ApplicationState *as)
10{
11 uid = id;
12 appState = as;
13
14 if(kernel)
15 {
16 kernel->CreateBuffer("mask_items_count", CL_MEM_READ_WRITE, sizeof(int));
17 kernel->CreateBuffer("mask_items", CL_MEM_READ_WRITE, sizeof(GeneratorMask) * MAX_GENERATOR_MASKS);
18 }
19}
20
21
22GeneratorMaskManager::~GeneratorMaskManager()
23{
24}
25
26nlohmann::json GeneratorMaskManager::SaveGeneratorMask(GeneratorMask mask)
27{
28 nlohmann::json data;
29 data["type"] = mask.type;
30 data["posX"] = mask.pos[0];
31 data["posY"] = mask.pos[1];
32 data["posZ"] = mask.pos[2];
33 data["d1.0"] = mask.d1[0];
34 data["d1.1"] = mask.d1[1];
35 data["d1.2"] = mask.d1[2];
36 data["d1.3"] = mask.d1[3];
37 data["d2.0"] = mask.d2[0];
38 data["d2.1"] = mask.d2[1];
39 data["d2.2"] = mask.d2[2];
40 data["d2.3"] = mask.d2[3];
41 data["d3.0"] = mask.d3[0];
42 data["d3.1"] = mask.d3[1];
43 data["d3.2"] = mask.d3[2];
44 data["d3.3"] = mask.d3[3];
45 data["d4.0"] = mask.d4[0];
46 data["d4.1"] = mask.d4[1];
47 data["d4.2"] = mask.d4[2];
48 data["d4.3"] = mask.d4[3];
49 return data;
50}
51
52GeneratorMask GeneratorMaskManager::LoadGeneratorMask(nlohmann::json data)
53{
54 GeneratorMask mask;
55 mask.type = data["type"] ;
56 mask.pos[0] = data["posX"];
57 mask.pos[1] = data["posY"];
58 mask.pos[2] = data["posZ"];
59 mask.d1[0] = data["d1.0"];
60 mask.d1[1] = data["d1.1"];
61 mask.d1[2] = data["d1.2"];
62 mask.d1[3] = data["d1.3"];
63 mask.d2[0] = data["d2.0"];
64 mask.d2[1] = data["d2.1"];
65 mask.d2[2] = data["d2.2"];
66 mask.d2[3] = data["d2.3"];
67 mask.d3[0] = data["d3.0"];
68 mask.d3[1] = data["d3.1"];
69 mask.d3[2] = data["d3.2"];
70 mask.d3[3] = data["d3.3"];
71 mask.d4[0] = data["d4.0"];
72 mask.d4[1] = data["d4.1"];
73 mask.d4[2] = data["d4.2"];
74 mask.d4[3] = data["d4.3"];
75 return mask;
76}
77
78nlohmann::json GeneratorMaskManager::Save()
79{
80 nlohmann::json data;
81 data["uid"] = uid;
82 data["enabled"] = enabled;
83 data["gmcount"] = gmcount;
84 data["count"] = masks.size();
85 data["type"] = type;
86 nlohmann::json msks;
87
88 for(int i=0; i<masks.size(); i++)
89 {
90 msks.push_back(SaveGeneratorMask(masks[i]));
91 }
92
93 data["masks"] = msks;
94 return data;
95}
96
97void GeneratorMaskManager::Load(nlohmann::json data)
98{
99 uid = data["uid"];
100 enabled = data["enabled"];
101 gmcount = data["gmcount"];
102 type = data["type"];
103 masks.clear();
104
105 for(int i=0; i<data["count"]; i++)
106 {
107 masks.push_back(LoadGeneratorMask(data["masks"][i]));
108 }
109}
110
111float GeneratorMaskManager::EvaluateAt(float x, float y, float z, float value)
112{
113 float m = 0.0f;
114
115 for(int i=0; i<masks.size(); i++)
116 {
117 if(masks[i].type == MASK_LAYER_HILL)
118 {
119 m += EvaluateHillMask(&masks[i], x, y, z);
120 }
121
122 else if(masks[i].type == MASK_LAYER_CRATOR)
123 {
124 m += EvaluateCratorMask(&masks[i], x, y, z);
125 }
126
127 else if(masks[i].type == MASK_LAYER_CLIFF)
128 {
129 m += EvaluateCliffMask(&masks[i], x, y, z);
130 }
131 }
132
133 switch(type)
134 {
135 case GeneratorMask_Additive:
136 {
137 value = value + m;
138 break;
139 }
140
141 case GeneratorMask_AverageAdditive:
142 {
143 m = m / (float)masks.size();
144 value = value + m;
145 break;
146 }
147
148 case GeneratorMask_Multiplicative:
149 {
150 value = value * m;
151 break;
152 }
153
154 case GeneratorMask_AverageMultiplicative:
155 {
156 m = m / (float)masks.size();
157 value = value * m;
158 break;
159 }
160
161 default:
162 break;
163 };
164
165 return value;
166}
167
168void GeneratorMaskManager::ShowSettings()
169{
170 ImGui::Checkbox(("Enabled##GMSK" + uid).c_str(), &enabled);
171
172 if (ImGui::BeginCombo("Masking Mode##GMSK", generator_mask_type_names[type]))
173 {
174 for (int n = 0; n < IM_ARRAYSIZE(generator_mask_type_names); n++)
175 {
176 bool is_selected = (type == n);
177
178 if (ImGui::Selectable(generator_mask_type_names[n], is_selected))
179 {
180 type = (GeneratorMaskType)n;
181 }
182
183 if (is_selected)
184 {
185 ImGui::SetItemDefaultFocus(); // You may set the initial focus when opening the combo (scrolling + for keyboard navigation support)
186 }
187 }
188
189 ImGui::EndCombo();
190 }
191
192 for(int i=0; i<masks.size(); i++)
193 {
194 if(ImGui::CollapsingHeader(("Custom Base Mask Layer " + std::to_string(i) + "##GMSK" + uid).c_str()))
195 {
196 if(masks[i].type == MASK_LAYER_HILL)
197 {
198 ShowHillMaskSettingS(&masks[i], uid + std::to_string(i));
199 }
200
201 else if(masks[i].type == MASK_LAYER_CRATOR)
202 {
203 ShowCratorMaskSettingS(&masks[i], uid + std::to_string(i));
204 }
205
206 else if(masks[i].type == MASK_LAYER_CLIFF)
207 {
208 ShowCliffMaskSettingS(&masks[i], uid + std::to_string(i));
209 }
210
211 if(ImGui::Button(("Delete##GMSK" + std::to_string(i) + uid).c_str()))
212 {
213 while(appState->states.remeshing);
214
215 masks.erase(masks.begin() + i);
216 break;
217 }
218 }
219
220 ImGui::Separator();
221 }
222
223 if(ImGui::Button(("Add##GMSK" + uid).c_str()))
224 {
225 ImGui::OpenPopup(("AddMaskLayer##GMSK" + uid).c_str());
226 }
227
228 if(ImGui::BeginPopup(("AddMaskLayer##GMSK" + uid).c_str()))
229 {
230 if(ImGui::Button(("Hill##GMSK" + uid).c_str()))
231 {
232 masks.push_back(GeneratorMask());
233 masks.back().type = MASK_LAYER_HILL;
234 masks.back().d1[0] = masks.back().d1[1] = masks.back().d1[2] = 1.0f;
235 gmcount++;
236 ImGui::CloseCurrentPopup();
237 }
238
239 if(ImGui::Button(("Crater##GMSK" + uid).c_str()))
240 {
241 masks.push_back(GeneratorMask());
242 masks.back().type = MASK_LAYER_CRATOR;
243 masks.back().d1[0] = masks.back().d3[0] = masks.back().d3[1] = 1.0f;
244 gmcount++;
245 ImGui::CloseCurrentPopup();
246 }
247
248 if(ImGui::Button(("Cliff##GMSK" + uid).c_str()))
249 {
250 masks.push_back(GeneratorMask());
251 masks.back().type = MASK_LAYER_CLIFF;
252 masks.back().d1[2] = masks.back().d1[1] = 1.0f;
253 gmcount++;
254 ImGui::CloseCurrentPopup();
255 }
256
257 ImGui::EndPopup();
258 }
259}
void push_back(basic_json &&val)
add an object to an array
Definition: json.hpp:23148
a class to store JSON values
Definition: json.hpp:17860
@ value
the parser finished reading a JSON value