summaryrefslogtreecommitdiffstats
path: root/tools/editor/plugins/shader_graph_editor_plugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/editor/plugins/shader_graph_editor_plugin.cpp')
-rw-r--r--tools/editor/plugins/shader_graph_editor_plugin.cpp137
1 files changed, 90 insertions, 47 deletions
diff --git a/tools/editor/plugins/shader_graph_editor_plugin.cpp b/tools/editor/plugins/shader_graph_editor_plugin.cpp
index 710f11e726..54e8268574 100644
--- a/tools/editor/plugins/shader_graph_editor_plugin.cpp
+++ b/tools/editor/plugins/shader_graph_editor_plugin.cpp
@@ -385,6 +385,41 @@ void ShaderGraphView::_connection_request(const String& p_from, int p_from_slot,
}
+void ShaderGraphView::_disconnection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+
+ int from_idx=-1;
+ int to_idx=-1;
+ for (Map<int,GraphNode*>::Element *E=node_map.front();E;E=E->next()) {
+
+ if (p_from==E->get()->get_name())
+ from_idx=E->key();
+ if (p_to==E->get()->get_name())
+ to_idx=E->key();
+ }
+
+ ERR_FAIL_COND(from_idx==-1);
+ ERR_FAIL_COND(to_idx==-1);
+
+ if (!graph->is_node_connected(type,from_idx,p_from_slot,to_idx,p_to_slot))
+ return; //nothing to disconnect
+
+ ur->create_action("Disconnect Graph Nodes");
+
+ List<ShaderGraph::Connection> conns;
+
+ graph->get_node_connections(type,&conns);
+ //disconnect/reconnect dependencies
+ ur->add_do_method(graph.ptr(),"disconnect_node",type,from_idx,p_from_slot,to_idx,p_to_slot);
+ ur->add_undo_method(graph.ptr(),"connect_node",type,from_idx,p_from_slot,to_idx,p_to_slot);
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+
+
+}
+
void ShaderGraphView::_node_removed(int p_id) {
UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
@@ -433,8 +468,8 @@ void ShaderGraphView::_create_node(int p_id) {
GraphNode *gn = memnew( GraphNode );
gn->set_show_close_button(true);
Color typecol[4]={
- Color(0.2,1,0.2),
- Color(0.7,0.1,1),
+ Color(0.9,0.4,1),
+ Color(0.8,1,0.2),
Color(1,0.2,0.2),
Color(0,1,1)
};
@@ -1262,6 +1297,7 @@ void ShaderGraphView::_bind_methods() {
ObjectTypeDB::bind_method("_move_node",&ShaderGraphView::_move_node);
ObjectTypeDB::bind_method("_node_removed",&ShaderGraphView::_node_removed);
ObjectTypeDB::bind_method("_connection_request",&ShaderGraphView::_connection_request);
+ ObjectTypeDB::bind_method("_disconnection_request",&ShaderGraphView::_disconnection_request);
ObjectTypeDB::bind_method("_scalar_const_changed",&ShaderGraphView::_scalar_const_changed);
ObjectTypeDB::bind_method("_vec_const_changed",&ShaderGraphView::_vec_const_changed);
@@ -1318,6 +1354,22 @@ void ShaderGraphEditor::_add_node(int p_type) {
void ShaderGraphEditor::_notification(int p_what) {
if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ for(int i=0;i<ShaderGraph::NODE_TYPE_MAX;i++) {
+
+ if (i==ShaderGraph::NODE_OUTPUT)
+ continue;
+ String nn = node_names[i];
+ String ic = nn.get_slice(":",0);
+ String v = nn.get_slice(":",1);
+ bool addsep=false;
+ if (nn.ends_with(":")) {
+ addsep=true;
+ }
+ menu->get_popup()->add_icon_item(get_icon(ic,"EditorIcons"),v,i);
+ if (addsep)
+ menu->get_popup()->add_separator();
+ }
menu->get_popup()->connect("item_pressed",this,"_add_node");
@@ -1332,38 +1384,38 @@ void ShaderGraphEditor::_bind_methods() {
const char* ShaderGraphEditor::node_names[ShaderGraph::NODE_TYPE_MAX]={
- "Input", // all inputs (shader type dependent)
- "Scalar Constant", //scalar constant
- "Vector Constant", //vec3 constant
- "RGB Constant", //rgb constant (shows a color picker instead)
- "XForm Constant", // 4x4 matrix constant
- "Time:", // time in seconds
- "Screen Sample", // screen texture sampler (takes uv) (only usable in fragment shader)
- "Scalar Operator", // scalar vs scalar op (mul", add", div", etc)
- "Vector Operator", // vec3 vs vec3 op (mul",ad",div",crossprod",etc)
- "Scalar+Vector Operator", // vec3 vs scalar op (mul", add", div", etc)
- "RGB Operator:", // vec3 vs vec3 rgb op (with scalar amount)", like brighten", darken", burn", dodge", multiply", etc.
- "XForm Multiply", // mat4 x mat4
- "XForm+Vector Multiply", // mat4 x vec3 mult (with no-translation option)
- "XForm+Vector InvMultiply:", // mat4 x vec3 inverse mult (with no-translation option)
- "Scalar Function", // scalar function (sin", cos", etc)
- "Vector Function", // vector function (normalize", negate", reciprocal", rgb2hsv", hsv2rgb", etc", etc)
- "Vector Length", // vec3 length
- "Dot Product:", // vec3 . vec3 (dot product -> scalar output)
- "Vector -> Scalars", // 1 vec3 input", 3 scalar outputs
- "Scalars -> Vector", // 3 scalar input", 1 vec3 output
- "XForm -> Vectors", // 3 vec input", 1 xform output
- "Vectors -> XForm:", // 3 vec input", 1 xform output
- "Scalar Interpolate", // scalar interpolation (with optional curve)
- "Vector Interpolate:", // vec3 interpolation (with optional curve)
- "Scalar Uniform", // scalar uniform (assignable in material)
- "Vector Uniform", // vec3 uniform (assignable in material)
- "RGB Uniform", // color uniform (assignable in material)
- "XForm Uniform", // mat4 uniform (assignable in material)
- "Texture Uniform", // texture input (assignable in material)
- "CubeMap Uniform:", // cubemap input (assignable in material)
+ "GraphInput:Input", // all inputs (shader type dependent)
+ "GraphScalar:Scalar Constant", //scalar constant
+ "GraphVector:Vector Constant", //vec3 constant
+ "GraphRgb:RGB Constant", //rgb constant (shows a color picker instead)
+ "GraphXform:XForm Constant", // 4x4 matrix constant
+ "GraphTime:Time:", // time in seconds
+ "GraphTexscreen:Screen Sample", // screen texture sampler (takes uv) (only usable in fragment shader)
+ "GraphScalarOp:Scalar Operator", // scalar vs scalar op (mul", add", div", etc)
+ "GraphVecOp:Vector Operator", // vec3 vs vec3 op (mul",ad",div",crossprod",etc)
+ "GraphVecScalarOp:Scalar+Vector Operator", // vec3 vs scalar op (mul", add", div", etc)
+ "GraphRgbOp:RGB Operator:", // vec3 vs vec3 rgb op (with scalar amount)", like brighten", darken", burn", dodge", multiply", etc.
+ "GraphXformMult:XForm Multiply", // mat4 x mat4
+ "GraphXformVecMult:XForm+Vector Multiply", // mat4 x vec3 mult (with no-translation option)
+ "GraphXformVecImult:Form+Vector InvMultiply:", // mat4 x vec3 inverse mult (with no-translation option)
+ "GraphXformScalarFunc:Scalar Function", // scalar function (sin", cos", etc)
+ "GraphXformVecFunc:Vector Function", // vector function (normalize", negate", reciprocal", rgb2hsv", hsv2rgb", etc", etc)
+ "GraphVecLength:Vector Length", // vec3 length
+ "GraphVecDp:Dot Product:", // vec3 . vec3 (dot product -> scalar output)
+ "GraphVecToScalars:Vector -> Scalars", // 1 vec3 input", 3 scalar outputs
+ "GraphScalarsToVec:Scalars -> Vector", // 3 scalar input", 1 vec3 output
+ "GraphXformToVecs:XForm -> Vectors", // 3 vec input", 1 xform output
+ "GraphVecsToXform:Vectors -> XForm:", // 3 vec input", 1 xform output
+ "GraphScalarInterp:Scalar Interpolate", // scalar interpolation (with optional curve)
+ "GraphVecInterp:Vector Interpolate:", // vec3 interpolation (with optional curve)
+ "GraphScalarUniform:Scalar Uniform", // scalar uniform (assignable in material)
+ "GraphVectorUniform:Vector Uniform", // vec3 uniform (assignable in material)
+ "GraphRgbUniform:RGB Uniform", // color uniform (assignable in material)
+ "GraphXformUniform:XForm Uniform", // mat4 uniform (assignable in material)
+ "GraphTextureUniform:Texture Uniform", // texture input (assignable in material)
+ "GraphCubeUniform:CubeMap Uniform:", // cubemap input (assignable in material)
"Output", // output (shader type dependent)
- "Comment", // comment
+ "GraphComment:Comment", // comment
};
@@ -1374,20 +1426,7 @@ ShaderGraphEditor::ShaderGraphEditor() {
menu->set_text("Add..");
hbc->add_child(menu);
add_child(hbc);
- for(int i=0;i<ShaderGraph::NODE_TYPE_MAX;i++) {
-
- if (i==ShaderGraph::NODE_OUTPUT)
- continue;
- String v = node_names[i];
- bool addsep=false;
- if (v.ends_with(":")) {
- addsep=true;
- v=v.substr(0,v.length()-1);
- }
- menu->get_popup()->add_item(v,i);
- if (addsep)
- menu->get_popup()->add_separator();
- }
+
tabs = memnew(TabContainer);
tabs->set_v_size_flags(SIZE_EXPAND_FILL);
@@ -1404,8 +1443,12 @@ ShaderGraphEditor::ShaderGraphEditor() {
graph_edits[i]->get_graph_edit()->set_name(sname[i]);
tabs->add_child(graph_edits[i]->get_graph_edit());
graph_edits[i]->get_graph_edit()->connect("connection_request",graph_edits[i],"_connection_request");
+ graph_edits[i]->get_graph_edit()->connect("disconnection_request",graph_edits[i],"_disconnection_request");
+ graph_edits[i]->get_graph_edit()->set_right_disconnects(true);
}
+ tabs->set_current_tab(1);
+
set_custom_minimum_size(Size2(100,300));
}