composite texture - ux

This commit is contained in:
Mikulas Florek 2023-07-28 12:37:48 +02:00
parent 005ce88da9
commit aac6b6aa29

View file

@ -512,7 +512,7 @@ struct PixelNode final : CompositeTexture::Node {
bool gui() override { bool gui() override {
outputSlot(); outputSlot();
if constexpr (TYPE == CompositeTexture::NodeType::PIXEL_COLOR) ImGui::TextUnformatted("Pixel"); if constexpr (TYPE == CompositeTexture::NodeType::PIXEL_COLOR) ImGui::TextUnformatted("Pixel color");
if constexpr (TYPE == CompositeTexture::NodeType::PIXEL_X) ImGui::TextUnformatted("Pixel X"); if constexpr (TYPE == CompositeTexture::NodeType::PIXEL_X) ImGui::TextUnformatted("Pixel X");
if constexpr (TYPE == CompositeTexture::NodeType::PIXEL_Y) ImGui::TextUnformatted("Pixel Y"); if constexpr (TYPE == CompositeTexture::NodeType::PIXEL_Y) ImGui::TextUnformatted("Pixel Y");
if constexpr (TYPE == CompositeTexture::NodeType::PIXEL_CTX_W) ImGui::TextUnformatted("Pixel context width"); if constexpr (TYPE == CompositeTexture::NodeType::PIXEL_CTX_W) ImGui::TextUnformatted("Pixel context width");
@ -2572,17 +2572,46 @@ struct CompositeTextureEditorWindow : StudioApp::GUIPlugin, NodeEditor {
}; };
void visitNodeTypes(INodeTypeVisitor& visitor) { void visitNodeTypes(INodeTypeVisitor& visitor) {
if (visitor.beginCategory("Generate")) {
visitor
.visitType("Circle", CompositeTexture::NodeType::CIRCLE, 'O')
.visitType("Circular splatter", CompositeTexture::NodeType::CIRCULAR_SPLATTER)
.visitType("Gradient", CompositeTexture::NodeType::GRADIENT)
.visitType("Grid splatter", CompositeTexture::NodeType::SPLATTER)
.endCategory();
}
if (visitor.beginCategory("Image")) {
visitor
.visitType("Crop", CompositeTexture::NodeType::CROP)
.visitType("Flip", CompositeTexture::NodeType::FLIP, 'F')
.visitType("Input", CompositeTexture::NodeType::INPUT)
.visitType("Resize", CompositeTexture::NodeType::RESIZE, 'R')
.visitType("Translate", CompositeTexture::NodeType::TRANSLATE)
.endCategory();
}
if (visitor.beginCategory("Math")) { if (visitor.beginCategory("Math")) {
visitor visitor
.visitType("Curve", CompositeTexture::NodeType::CURVE, 'C') .visitType("Curve", CompositeTexture::NodeType::CURVE, 'C')
.visitType("Divide", CompositeTexture::NodeType::DIVIDE, 'D') .visitType("Divide", CompositeTexture::NodeType::DIVIDE, 'D')
.visitType("Invert", CompositeTexture::NodeType::INVERT, 'I') .visitType("Invert", CompositeTexture::NodeType::INVERT, 'I')
.visitType("Min", CompositeTexture::NodeType::MIN) .visitType("Min", CompositeTexture::NodeType::MIN)
.visitType("Mix", CompositeTexture::NodeType::MIX)
.visitType("Max", CompositeTexture::NodeType::MAX) .visitType("Max", CompositeTexture::NodeType::MAX)
.visitType("Multiply", CompositeTexture::NodeType::MULTIPLY, 'M') .visitType("Multiply", CompositeTexture::NodeType::MULTIPLY, 'M')
.visitType("Step", CompositeTexture::NodeType::STEP) .visitType("Step", CompositeTexture::NodeType::STEP)
.endCategory(); .endCategory();
} }
if (visitor.beginCategory("Misc")) {
visitor
.visitType("Color", CompositeTexture::NodeType::COLOR, '4')
.visitType("Constant", CompositeTexture::NodeType::CONSTANT, '1')
.visitType("Merge", CompositeTexture::NodeType::MERGE)
.visitType("Set alpha", CompositeTexture::NodeType::SET_ALPHA)
.visitType("Splat", CompositeTexture::NodeType::SPLAT, 'S')
.visitType("Split", CompositeTexture::NodeType::SPLIT)
.visitType("Static switch", CompositeTexture::NodeType::STATIC_SWITCH, 'W')
.endCategory();
}
if (visitor.beginCategory("Noise")) { if (visitor.beginCategory("Noise")) {
visitor visitor
.visitType("Cell noise", CompositeTexture::NodeType::CELLULAR_NOISE) .visitType("Cell noise", CompositeTexture::NodeType::CELLULAR_NOISE)
@ -2591,35 +2620,24 @@ struct CompositeTextureEditorWindow : StudioApp::GUIPlugin, NodeEditor {
.visitType("Wave noise", CompositeTexture::NodeType::WAVE_NOISE) .visitType("Wave noise", CompositeTexture::NodeType::WAVE_NOISE)
.endCategory(); .endCategory();
} }
if (visitor.beginCategory("Pixel")) {
visitor
.visitType("Color", CompositeTexture::NodeType::PIXEL_COLOR)
.visitType("Context width", CompositeTexture::NodeType::PIXEL_CTX_W, 'W')
.visitType("Context height", CompositeTexture::NodeType::PIXEL_CTX_H, 'H')
.visitType("Processor", CompositeTexture::NodeType::PIXEL_PROCESSOR)
.visitType("X", CompositeTexture::NodeType::PIXEL_X, 'X')
.visitType("Y", CompositeTexture::NodeType::PIXEL_Y, 'Y')
.endCategory();
}
visitor.visitType("Brightness", CompositeTexture::NodeType::BRIGHTNESS, 'B') visitor.visitType("Brightness", CompositeTexture::NodeType::BRIGHTNESS, 'B')
.visitType("Circle", CompositeTexture::NodeType::CIRCLE, 'O')
.visitType("Circular splatter", CompositeTexture::NodeType::CIRCULAR_SPLATTER)
.visitType("Color", CompositeTexture::NodeType::COLOR, '4')
.visitType("Constant", CompositeTexture::NodeType::CONSTANT, '1')
.visitType("Contrast", CompositeTexture::NodeType::CONTRAST) .visitType("Contrast", CompositeTexture::NodeType::CONTRAST)
.visitType("Crop", CompositeTexture::NodeType::CROP)
.visitType("Flip", CompositeTexture::NodeType::FLIP, 'F')
.visitType("Gamma", CompositeTexture::NodeType::GAMMA) .visitType("Gamma", CompositeTexture::NodeType::GAMMA)
.visitType("Gradient", CompositeTexture::NodeType::GRADIENT)
.visitType("Gradient map", CompositeTexture::NodeType::GRADIENT_MAP, 'G') .visitType("Gradient map", CompositeTexture::NodeType::GRADIENT_MAP, 'G')
.visitType("Grayscale", CompositeTexture::NodeType::GRAYSCALE) .visitType("Grayscale", CompositeTexture::NodeType::GRAYSCALE)
.visitType("Input", CompositeTexture::NodeType::INPUT) .visitType("Sharpen", CompositeTexture::NodeType::SHARPEN);
.visitType("Merge", CompositeTexture::NodeType::MERGE)
.visitType("Mix", CompositeTexture::NodeType::MIX)
.visitType("Pixel color", CompositeTexture::NodeType::PIXEL_COLOR)
.visitType("Pixel X", CompositeTexture::NodeType::PIXEL_X, 'X')
.visitType("Pixel Y", CompositeTexture::NodeType::PIXEL_Y, 'Y')
.visitType("Pixel context width", CompositeTexture::NodeType::PIXEL_CTX_W, 'W')
.visitType("Pixel context height", CompositeTexture::NodeType::PIXEL_CTX_H, 'H')
.visitType("Pixel processor", CompositeTexture::NodeType::PIXEL_PROCESSOR)
.visitType("Resize", CompositeTexture::NodeType::RESIZE, 'R')
.visitType("Set alpha", CompositeTexture::NodeType::SET_ALPHA)
.visitType("Sharpen", CompositeTexture::NodeType::SHARPEN)
.visitType("Splat", CompositeTexture::NodeType::SPLAT, 'S')
.visitType("Splatter", CompositeTexture::NodeType::SPLATTER)
.visitType("Split", CompositeTexture::NodeType::SPLIT)
.visitType("Static switch", CompositeTexture::NodeType::STATIC_SWITCH, 'W')
.visitType("Translate", CompositeTexture::NodeType::TRANSLATE);
} }
void onCanvasClicked(ImVec2 pos, i32 hovered_link) override { void onCanvasClicked(ImVec2 pos, i32 hovered_link) override {
@ -2658,28 +2676,58 @@ struct CompositeTextureEditorWindow : StudioApp::GUIPlugin, NodeEditor {
void onContextMenu(ImVec2 pos) override { void onContextMenu(ImVec2 pos) override {
ImGuiEx::filter("Filter", m_filter, sizeof(m_filter), 150, ImGui::IsWindowAppearing()); ImGuiEx::filter("Filter", m_filter, sizeof(m_filter), 150, ImGui::IsWindowAppearing());
struct : INodeTypeVisitor { if (m_filter[0]) {
bool beginCategory(const char* category) { return ImGui::BeginMenu(category); } struct : INodeTypeVisitor {
void endCategory() { ImGui::EndMenu(); } bool beginCategory(const char* _category) {
category = _category;
INodeTypeVisitor& visitType(const char* _label, CompositeTexture::NodeType type, char shortcut) override { category.add(" / ");
StaticString<64> label(_label); return true;
if (shortcut) label.append(" (LMB + ", shortcut, ")");
if ((!win->m_filter[0] || stristr(_label, win->m_filter)) && (ImGui::IsKeyPressed(ImGuiKey_Enter) || ImGui::MenuItem(label))) {
node = win->m_resource.addNode(type);
win->m_filter[0] = '\0';
ImGui::CloseCurrentPopup();
} }
return *this; void endCategory() { category = ""; }
INodeTypeVisitor& visitType(const char* _label, CompositeTexture::NodeType type, char shortcut) override {
StaticString<128> label(category, _label);
if (shortcut) label.append(" (LMB + ", shortcut, ")");
if (!node && stristr(label, win->m_filter) && (ImGui::IsKeyPressed(ImGuiKey_Enter) || ImGui::MenuItem(label))) {
node = win->m_resource.addNode(type);
ImGui::CloseCurrentPopup();
}
return *this;
}
StaticString<64> category;
CompositeTextureEditorWindow* win;
CompositeTexture::Node* node = nullptr;
} visitor;
visitor.win = this;
visitNodeTypes(visitor);
if (visitor.node) {
visitor.node->m_pos = pos;
pushUndo(NO_MERGE_UNDO);
}
}
else {
struct : INodeTypeVisitor {
bool beginCategory(const char* category) { return ImGui::BeginMenu(category); }
void endCategory() { ImGui::EndMenu(); }
INodeTypeVisitor& visitType(const char* _label, CompositeTexture::NodeType type, char shortcut) override {
StaticString<64> label(_label);
if (shortcut) label.append(" (LMB + ", shortcut, ")");
if (!node && (ImGui::IsKeyPressed(ImGuiKey_Enter) || ImGui::MenuItem(label))) {
node = win->m_resource.addNode(type);
ImGui::CloseCurrentPopup();
}
return *this;
}
CompositeTextureEditorWindow* win;
CompositeTexture::Node* node = nullptr;
} visitor;
visitor.win = this;
visitNodeTypes(visitor);
if (visitor.node) {
visitor.node->m_pos = pos;
pushUndo(NO_MERGE_UNDO);
} }
CompositeTextureEditorWindow* win;
CompositeTexture::Node* node = nullptr;
} visitor;
visitor.win = this;
visitNodeTypes(visitor);
if (visitor.node) {
visitor.node->m_pos = pos;
pushUndo(NO_MERGE_UNDO);
} }
} }