1#include "NoiseLayers/NoiseLayer.h"
4#include "FastNoiseLite.h"
6#define MAKE_IMGUI_ID(x) ("##NoiseLayer" + std::to_string(index) + x).c_str()
7#define MAKE_IMGUI_LABEL(x) (x + std::string("##NoiseLayer") + std::to_string(index)).c_str()
9static const char *noiseTypes[] = {
"Perlin",
"Cellular",
"OpenSimplex2",
"OpenSimplex2S",
"Value",
"Value Cubic"};
10static const char *fractalTypes[] = {
"None",
"FBm",
"Ridged",
"PingPong" };
11static const char *distFuncs[] = {
"EuclideanSq",
"Euclidean",
"Manhattan",
"Euclidean Manhattan Hybrid" };
13static void SetNoiseType(FastNoiseLite *noiseGen,
int type)
18 noiseGen->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Perlin);
22 noiseGen->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Cellular);
26 noiseGen->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_OpenSimplex2);
30 noiseGen->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_OpenSimplex2S);
34 noiseGen->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Value);
38 noiseGen->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_ValueCubic);
42 noiseGen->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Perlin);
47static void SetFractalType(FastNoiseLite *noiseGen,
int type)
52 noiseGen->SetFractalType(FastNoiseLite::FractalType::FractalType_None);
56 noiseGen->SetFractalType(FastNoiseLite::FractalType::FractalType_FBm);
60 noiseGen->SetFractalType(FastNoiseLite::FractalType::FractalType_Ridged);
64 noiseGen->SetFractalType(FastNoiseLite::FractalType::FractalType_PingPong);
68 noiseGen->SetFractalType(FastNoiseLite::FractalType::FractalType_None);
73static void SetDistanceFunc(FastNoiseLite *noiseGen,
int func)
78 noiseGen->SetCellularDistanceFunction(FastNoiseLite::CellularDistanceFunction::CellularDistanceFunction_EuclideanSq);
82 noiseGen->SetCellularDistanceFunction(FastNoiseLite::CellularDistanceFunction::CellularDistanceFunction_Euclidean);
86 noiseGen->SetCellularDistanceFunction(FastNoiseLite::CellularDistanceFunction::CellularDistanceFunction_Manhattan);
90 noiseGen->SetCellularDistanceFunction(FastNoiseLite::CellularDistanceFunction::CellularDistanceFunction_Hybrid);
94 noiseGen->SetCellularDistanceFunction(FastNoiseLite::CellularDistanceFunction::CellularDistanceFunction_EuclideanSq);
100NoiseLayer::NoiseLayer()
110 weightedStrength = 0.0f;
111 pingPongStrength = 2.0f;
113 cellularJitter = 1.0f;
114 noiseGen =
new FastNoiseLite();
116 name =
"Noise Layer\0 ";
117 offset[0] = offset[1] = offset[2] = 0.0f;
119 noiseTypeStr = noiseTypes[0];
120 fractalTypeStr = fractalTypes[0];
121 distFuncStr = distFuncs[0];
124NoiseLayer::~NoiseLayer()
132 data[
"noiseType"] = noiseType;
133 data[
"frequency"] = frequency;
135 data[
"lacunarity"] = lacunarity;
136 data[
"weightedStrength"] = weightedStrength;
137 data[
"octaves"] = octaves;
138 data[
"pingPongStrength"] = pingPongStrength;
140 data[
"strength"] = strength;
141 data[
"fractalType"] = fractalType;
142 data[
"distanceFunc"] = distanceFunc;
143 data[
"cellularJitter"] = cellularJitter;
144 data[
"offsetX"] = offset[0];
145 data[
"offsetY"] = offset[1];
146 data[
"offsetZ"] = offset[2];
148 data[
"enabled"] = enabled;
154 frequency = data[
"frequency"];
155 noiseGen->SetFrequency(frequency);
157 noiseGen->SetSeed(seed);
158 lacunarity = data[
"lacunarity"];
159 noiseGen->SetFractalLacunarity(lacunarity);
160 weightedStrength = data[
"weightedStrength"];
161 noiseGen->SetFractalWeightedStrength(weightedStrength);
162 octaves = data[
"octaves"];
163 noiseGen->SetFractalOctaves(octaves);
164 pingPongStrength = data[
"pingPongStrength"];
165 noiseGen->SetFractalPingPongStrength(pingPongStrength);
167 noiseGen->SetFractalGain(gain);
168 strength = data[
"strength"];
169 fractalType = data[
"fractalType"];
170 distanceFunc = data[
"distanceFunc"];
171 cellularJitter = data[
"cellularJitter"];
173 enabled = data[
"enabled"];
174 offset[0] = data[
"offsetX"];
175 offset[1] = data[
"offsetY"];
176 offset[2] = data[
"offsetZ"];
177 noiseType = data[
"noiseType"];
178 noiseTypeStr = noiseTypes[noiseType];
179 fractalTypeStr = fractalTypes[fractalType];
180 distFuncStr = distFuncs[distanceFunc];
181 SetNoiseType(noiseGen, noiseType);
182 SetFractalType(noiseGen, fractalType);
183 SetDistanceFunc(noiseGen, distanceFunc);
188 return enabled ? noiseGen->GetNoise(input.x + offset[0], input.y + offset[1], input.z + offset[2]) * strength : 0.0f;
191void NoiseLayer::Render(
int index)
194 ImGui::Text(name.data());
195 ImGui::InputTextWithHint(MAKE_IMGUI_ID(
"Name Input"),
"Name", name.data(), name.capacity());
197 ImGui::Checkbox(MAKE_IMGUI_LABEL(
"Enabled"), &enabled);
198 ImGui::Text(
"Offsets:");
199 ImGui::DragFloat3(MAKE_IMGUI_ID(
"Offsets"), offset, 0.1f);
200 ImGui::Text(
"Noise Type : ");
203 if (ImGui::BeginCombo(MAKE_IMGUI_ID(
"Noise Type Selector"), noiseTypeStr))
205 for (
int n = 0; n < 6; n++)
207 bool isSelected = (noiseTypeStr == noiseTypes[n]);
209 if (ImGui::Selectable(noiseTypes[n], isSelected))
211 noiseTypeStr = noiseTypes[n];
213 SetNoiseType(noiseGen, noiseType);
217 ImGui::SetItemDefaultFocus();
225 ImGui::Text(
"Fractal Type : ");
228 if (ImGui::BeginCombo(MAKE_IMGUI_ID(
"Fractal Type Selector"), fractalTypeStr))
230 for (
int n = 0; n < 4; n++)
232 bool isSelected = (fractalTypeStr == fractalTypes[n]);
234 if (ImGui::Selectable(fractalTypes[n], isSelected))
236 fractalTypeStr = fractalTypes[n];
238 SetFractalType(noiseGen, fractalType);
242 ImGui::SetItemDefaultFocus();
250 if (ImGui::DragInt(MAKE_IMGUI_LABEL(
"Seed"), &seed))
252 noiseGen->SetSeed(seed);
255 if (ImGui::DragFloat(MAKE_IMGUI_LABEL(
"Frequency"), &frequency, 0.001f))
257 noiseGen->SetFrequency(frequency);
260 ImGui::DragFloat(MAKE_IMGUI_LABEL(
"Strength"), &strength, 0.1f);
262 if (fractalType != 0)
264 if (ImGui::DragInt(MAKE_IMGUI_LABEL(
"Octaves"), &octaves, 0.05f))
266 noiseGen->SetFractalOctaves(octaves);
269 if (ImGui::DragFloat(MAKE_IMGUI_LABEL(
"Lacunarity"), &lacunarity, 0.1f))
271 noiseGen->SetFractalLacunarity(lacunarity);
274 if (ImGui::DragFloat(MAKE_IMGUI_LABEL(
"Gain"), &gain, 0.1f))
276 noiseGen->SetFractalGain(gain);
279 if (ImGui::DragFloat(MAKE_IMGUI_LABEL(
"Weighted Strength"), &weightedStrength, 0.01f))
281 noiseGen->SetFractalWeightedStrength(weightedStrength);
284 if (ImGui::DragFloat(MAKE_IMGUI_LABEL(
"Ping Pong Strength"), &pingPongStrength, 0.01f))
286 noiseGen->SetFractalPingPongStrength(pingPongStrength);
292 if (ImGui::DragFloat(MAKE_IMGUI_LABEL(
"Cellur Jitter"), &cellularJitter, 0.01f))
294 noiseGen->SetCellularJitter(cellularJitter);
297 ImGui::Text(
"Cellular Distance Function : ");
300 if (ImGui::BeginCombo(MAKE_IMGUI_ID(
"Cellular Distance Function"), distFuncStr))
302 for (
int n = 0; n < 4; n++)
304 bool isSelected = (distFuncStr == distFuncs[n]);
306 if (ImGui::Selectable(distFuncs[n], isSelected))
308 distFuncStr = distFuncs[n];
310 SetFractalType(noiseGen, distanceFunc);
314 ImGui::SetItemDefaultFocus();
a class to store JSON values