1#include "Generators/CPUNodeEditor/CPUNodeEditor.h"
3#include "Data/ApplicationState.h"
5#include "Utils/Utils.h"
9#include "Base/ImGuiShapes.h"
10#include "Base/NodeEditor/NodeEditor.h"
11#include "imgui_internal.h"
13#include "GLFW/glfw3.h"
16#include "Generators/CPUNodeEditor/Nodes/DummyNode.h"
17#include "Generators/CPUNodeEditor/Nodes/AddNode.h"
18#include "Generators/CPUNodeEditor/Nodes/SubNode.h"
19#include "Generators/CPUNodeEditor/Nodes/MulNode.h"
20#include "Generators/CPUNodeEditor/Nodes/DivNode.h"
21#include "Generators/CPUNodeEditor/Nodes/AbsNode.h"
22#include "Generators/CPUNodeEditor/Nodes/SinNode.h"
23#include "Generators/CPUNodeEditor/Nodes/CosNode.h"
24#include "Generators/CPUNodeEditor/Nodes/TanNode.h"
25#include "Generators/CPUNodeEditor/Nodes/BlendNode.h"
26#include "Generators/CPUNodeEditor/Nodes/CurveNode.h"
27#include "Generators/CPUNodeEditor/Nodes/NoisePerlinNode.h"
28#include "Generators/CPUNodeEditor/Nodes/NoiseCellularNode.h"
29#include "Generators/CPUNodeEditor/Nodes/NoiseValueNode.h"
30#include "Generators/CPUNodeEditor/Nodes/NoiseValueCubicNode.h"
31#include "Generators/CPUNodeEditor/Nodes/NoiseOpenSimplex2Node.h"
32#include "Generators/CPUNodeEditor/Nodes/NoiseOpenSimplex2SNode.h"
33#include "Generators/CPUNodeEditor/Nodes/MeshCoordinatesNode.h"
34#include "Generators/CPUNodeEditor/Nodes/MinMeshCoordinatesNode.h"
35#include "Generators/CPUNodeEditor/Nodes/MaxMeshCoordinatesNode.h"
36#include "Generators/CPUNodeEditor/Nodes/TextureCoordinatesNode.h"
37#include "Generators/CPUNodeEditor/Nodes/TimeBasedSeedNode.h"
38#include "Generators/CPUNodeEditor/Nodes/RandomNumberNode.h"
39#include "Generators/CPUNodeEditor/Nodes/DuplicateNode.h"
40#include "Generators/CPUNodeEditor/Nodes/MathFunctionNode.h"
41#include "Generators/CPUNodeEditor/Nodes/OutputNode.h"
42#include "Generators/CPUNodeEditor/Nodes/PixelateNode.h"
43#include "Generators/CPUNodeEditor/Nodes/VisualizerNode.h"
44#include "Generators/CPUNodeEditor/Nodes/TextureNode.h"
45#include "Generators/CPUNodeEditor/Nodes/HeightmapNode.h"
46#include "Generators/CPUNodeEditor/Nodes/HillNode.h"
47#include "Generators/CPUNodeEditor/Nodes/MinValNode.h"
48#include "Generators/CPUNodeEditor/Nodes/SquareNode.h"
49#include "Generators/CPUNodeEditor/Nodes/ClampNode.h"
55static char *stristr4(
const char *str,
const char *pattern)
66 if (toupper((
unsigned char)*str) == toupper((
unsigned char)*pattern))
75 if (toupper((
unsigned char)str[i]) != toupper((
unsigned char)pattern[i]))
86#define NODE_MAKER_COND(x) length == 0 || stristr4(x, data)
87#define NODE_MAKER_SHOW(x, y) if (NODE_MAKER_COND(y)) {if (ImGui::Button((y + std::string("##CPUNE") + uid).c_str())) { editor->AddNode(new x()); ImGui::CloseCurrentPopup(); } }
91static void ShowNodeMaker(std::string &uid,
NodeEditor *editor)
93 static char data[1000];
94 ImGui::InputTextWithHint(
"##SearchMeshNodes",
"Search ...", data,
sizeof(data));
95 int length = strlen(data);
96 ImGui::BeginChild((
"##CPUNE" + uid).c_str(), ImVec2(200, 250));
107 NODE_MAKER_SHOW(
AddNode,
"Add");
108 NODE_MAKER_SHOW(
SubNode,
"Subtract");
109 NODE_MAKER_SHOW(
MulNode,
"Multiply");
110 NODE_MAKER_SHOW(
DivNode,
"Divide");
111 NODE_MAKER_SHOW(
AbsNode,
"Absolute Value");
112 NODE_MAKER_SHOW(
SinNode,
"Sin");
113 NODE_MAKER_SHOW(
CosNode,
"Cos");
114 NODE_MAKER_SHOW(
TanNode,
"Tan");
118 NODE_MAKER_SHOW(
CurveNode,
"Curve Editor");
136 uid = GenerateId(32);
138 name =
"CPU Node Editor " + std::to_string(count++);
140 config.saveFile = GetExecutableDir() + PATH_SEPARATOR
"Data" PATH_SEPARATOR
"configs" PATH_SEPARATOR
"CPUNodeEditorconfigs.terr3d";
141 config.makeNodeFunc = [&]()
143 ImGuiNodeEditor::Suspend();
144 ImGui::OpenPopup(
"NodeMakerDropped");
145 ImGuiNodeEditor::Resume();
150 CPUNodeEditorE::CPUNodeType type = (CPUNodeEditorE::CPUNodeType)data[
"type"];
154 case CPUNodeEditorE::CPUNodeType::Dummy:
158 case CPUNodeEditorE::CPUNodeType::Output:
162 case CPUNodeEditorE::CPUNodeType::MeshCoordinates:
166 case CPUNodeEditorE::CPUNodeType::MaxMeshCoordinates:
170 case CPUNodeEditorE::CPUNodeType::MinMeshCoordinates:
174 case CPUNodeEditorE::CPUNodeType::TextureCoordinates:
178 case CPUNodeEditorE::CPUNodeType::TimeBasedSeed:
182 case CPUNodeEditorE::CPUNodeType::Duplicate:
186 case CPUNodeEditorE::CPUNodeType::Add:
190 case CPUNodeEditorE::CPUNodeType::Sub:
194 case CPUNodeEditorE::CPUNodeType::Mul:
198 case CPUNodeEditorE::CPUNodeType::Div:
202 case CPUNodeEditorE::CPUNodeType::Sin:
206 case CPUNodeEditorE::CPUNodeType::Cos:
210 case CPUNodeEditorE::CPUNodeType::Square:
214 case CPUNodeEditorE::CPUNodeType::Tan:
218 case CPUNodeEditorE::CPUNodeType::Abs:
222 case CPUNodeEditorE::CPUNodeType::Blend:
226 case CPUNodeEditorE::CPUNodeType::Curve:
230 case CPUNodeEditorE::CPUNodeType::RandomNumber:
234 case CPUNodeEditorE::CPUNodeType::NoisePerlin:
238 case CPUNodeEditorE::CPUNodeType::NoiseCellular:
242 case CPUNodeEditorE::CPUNodeType::NoiseOpenSimplex2:
246 case CPUNodeEditorE::CPUNodeType::NoiseOpenSimplex2S:
250 case CPUNodeEditorE::CPUNodeType::NoiseValue:
254 case CPUNodeEditorE::CPUNodeType::NoiseValueCubic:
258 case CPUNodeEditorE::CPUNodeType::MathFunction:
262 case CPUNodeEditorE::CPUNodeType::Texture:
266 case CPUNodeEditorE::CPUNodeType::Heightmap:
270 case CPUNodeEditorE::CPUNodeType::Pixelate:
274 case CPUNodeEditorE::CPUNodeType::Visualizer:
278 case CPUNodeEditorE::CPUNodeType::Hill:
282 case CPUNodeEditorE::CPUNodeType::Clamp:
286 case CPUNodeEditorE::CPUNodeType::MinVal:
292 Log(
"Unknown Node Type!");
303CPUNodeEditor::~CPUNodeEditor()
311 data[
"nodeEditor"] = editor->Save();
312 data[
"windowStat"] = windowStat;
313 data[
"enabled"] = enabled;
314 data[
"uiActive"] = uiActive;
321 while(appState->states.remeshing);
323 editor->Load(data[
"nodeEditor"]);
324 windowStat = data[
"windowStat"];
325 enabled = data[
"enabled"];
326 uiActive = data[
"uiActive"];
330void CPUNodeEditor::Update()
334 ImGui::Begin((name +
"##" + uid).c_str(), &windowStat);
336 if (ImGui::Button((
"Add Node##CPUNE" + uid).c_str()))
338 ImGui::OpenPopup(
"NodeMakerDropped");
343 if (ImGui::Button((
"Reset##CPUNE" + uid).c_str()))
350 if (ImGui::Button((
"Export##CPUNE" + uid).c_str()))
352 std::string file = ShowSaveFileDialog(
"*.terr3d");
356 if (file.find(
".terr3d") == std::string::npos)
361 SaveToFile(file, editor->Save().
dump(4));
367 if (ImGui::Button((
"Import##CPUNE" + uid).c_str()))
369 std::string file = ShowOpenFileDialog(
"*.terr3d");
381 if (ImGui::IsWindowFocused() && (((IsKeyDown(TERR3D_KEY_RIGHT_SHIFT) || IsKeyDown(TERR3D_KEY_LEFT_SHIFT)) && IsKeyDown(TERR3D_KEY_A)) || IsMouseButtonDown(TERR3D_MOUSE_BUTTON_MIDDLE)))
383 ImGui::OpenPopup(
"NodeMakerDropped");
386 if(ImGui::BeginPopup(
"NodeMakerDropped"))
388 ShowNodeMaker(uid, editor);
390 if (ImGui::Button((
"Close##CPUNE" + uid).c_str()))
392 ImGui::CloseCurrentPopup();
406 return editor->outputNode->Evaluate(param,
nullptr).value;
411void CPUNodeEditor::ShowSetting(
int id)
413 ImGui::InputText((
"Name##CPUNE" + uid).c_str(), name.data(), 1024);
414 ImGui::Checkbox((
"Enabled##CPUNE" + uid).c_str(), &enabled);
416 if (ImGui::Button((
"Edit##CPUNE" + uid).c_str()))
421 ImGui::Text(
"UID : %s", uid.data());
422 ImGui::Text(
"Time : %lf ms", time);
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json parse(InputType &&i, const parser_callback_t cb=nullptr, const bool allow_exceptions=true, const bool ignore_comments=false)
deserialize from a compatible input
string_t dump(const int indent=-1, const char indent_char=' ', const bool ensure_ascii=false, const error_handler_t error_handler=error_handler_t::strict) const
serialization
a class to store JSON values