From 7a0e4c822caa0d91506f693cb0cea2188927939f Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Wed, 7 Jan 2015 01:45:46 -0300 Subject: [PATCH] -Visual Shader Editing Finished, PLEASE TEST! --- drivers/gles2/rasterizer_gles2.cpp | 56 ++-- drivers/gles2/rasterizer_gles2.h | 3 +- scene/gui/graph_edit.cpp | 50 +++ scene/gui/graph_edit.h | 4 + scene/resources/shader.cpp | 7 +- scene/resources/shader_graph.cpp | 286 +++++++++++++----- scene/resources/shader_graph.h | 6 +- tools/editor/icons/icon_graph_comment.png | Bin 0 -> 310 bytes .../editor/icons/icon_graph_cube_uniform.png | Bin 0 -> 652 bytes tools/editor/icons/icon_graph_input.png | Bin 0 -> 585 bytes tools/editor/icons/icon_graph_rgb.png | Bin 0 -> 174 bytes tools/editor/icons/icon_graph_rgb_op.png | Bin 0 -> 280 bytes tools/editor/icons/icon_graph_rgb_uniform.png | Bin 0 -> 419 bytes tools/editor/icons/icon_graph_scalar.png | Bin 0 -> 328 bytes .../editor/icons/icon_graph_scalar_interp.png | Bin 0 -> 352 bytes tools/editor/icons/icon_graph_scalar_op.png | Bin 0 -> 238 bytes .../icons/icon_graph_scalar_uniform.png | Bin 0 -> 392 bytes .../icons/icon_graph_scalars_to_vec.png | Bin 0 -> 300 bytes tools/editor/icons/icon_graph_texscreen.png | Bin 0 -> 578 bytes .../icons/icon_graph_texture_uniform.png | Bin 0 -> 358 bytes tools/editor/icons/icon_graph_time.png | Bin 0 -> 678 bytes tools/editor/icons/icon_graph_vec_dp.png | Bin 0 -> 279 bytes tools/editor/icons/icon_graph_vec_interp.png | Bin 0 -> 332 bytes tools/editor/icons/icon_graph_vec_length.png | Bin 0 -> 303 bytes tools/editor/icons/icon_graph_vec_op.png | Bin 0 -> 256 bytes .../editor/icons/icon_graph_vec_scalar_op.png | Bin 0 -> 267 bytes .../icons/icon_graph_vec_to_scalars.png | Bin 0 -> 306 bytes .../editor/icons/icon_graph_vecs_to_xform.png | Bin 0 -> 288 bytes tools/editor/icons/icon_graph_vector.png | Bin 0 -> 480 bytes .../icons/icon_graph_vector_uniform.png | Bin 0 -> 531 bytes tools/editor/icons/icon_graph_xform.png | Bin 0 -> 262 bytes tools/editor/icons/icon_graph_xform_mult.png | Bin 0 -> 311 bytes .../icons/icon_graph_xform_scalar_func.png | Bin 0 -> 378 bytes .../editor/icons/icon_graph_xform_to_vecs.png | Bin 0 -> 272 bytes .../editor/icons/icon_graph_xform_uniform.png | Bin 0 -> 346 bytes .../icons/icon_graph_xform_vec_func.png | Bin 0 -> 389 bytes .../icons/icon_graph_xform_vec_imult.png | Bin 0 -> 430 bytes .../icons/icon_graph_xform_vec_mult.png | Bin 0 -> 422 bytes .../plugins/shader_graph_editor_plugin.cpp | 135 ++++++--- .../plugins/shader_graph_editor_plugin.h | 2 + 40 files changed, 397 insertions(+), 152 deletions(-) create mode 100644 tools/editor/icons/icon_graph_comment.png create mode 100644 tools/editor/icons/icon_graph_cube_uniform.png create mode 100644 tools/editor/icons/icon_graph_input.png create mode 100644 tools/editor/icons/icon_graph_rgb.png create mode 100644 tools/editor/icons/icon_graph_rgb_op.png create mode 100644 tools/editor/icons/icon_graph_rgb_uniform.png create mode 100644 tools/editor/icons/icon_graph_scalar.png create mode 100644 tools/editor/icons/icon_graph_scalar_interp.png create mode 100644 tools/editor/icons/icon_graph_scalar_op.png create mode 100644 tools/editor/icons/icon_graph_scalar_uniform.png create mode 100644 tools/editor/icons/icon_graph_scalars_to_vec.png create mode 100644 tools/editor/icons/icon_graph_texscreen.png create mode 100644 tools/editor/icons/icon_graph_texture_uniform.png create mode 100644 tools/editor/icons/icon_graph_time.png create mode 100644 tools/editor/icons/icon_graph_vec_dp.png create mode 100644 tools/editor/icons/icon_graph_vec_interp.png create mode 100644 tools/editor/icons/icon_graph_vec_length.png create mode 100644 tools/editor/icons/icon_graph_vec_op.png create mode 100644 tools/editor/icons/icon_graph_vec_scalar_op.png create mode 100644 tools/editor/icons/icon_graph_vec_to_scalars.png create mode 100644 tools/editor/icons/icon_graph_vecs_to_xform.png create mode 100644 tools/editor/icons/icon_graph_vector.png create mode 100644 tools/editor/icons/icon_graph_vector_uniform.png create mode 100644 tools/editor/icons/icon_graph_xform.png create mode 100644 tools/editor/icons/icon_graph_xform_mult.png create mode 100644 tools/editor/icons/icon_graph_xform_scalar_func.png create mode 100644 tools/editor/icons/icon_graph_xform_to_vecs.png create mode 100644 tools/editor/icons/icon_graph_xform_uniform.png create mode 100644 tools/editor/icons/icon_graph_xform_vec_func.png create mode 100644 tools/editor/icons/icon_graph_xform_vec_imult.png create mode 100644 tools/editor/icons/icon_graph_xform_vec_mult.png diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index fdf73a6c21..2092187431 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -1545,13 +1545,15 @@ void RasterizerGLES2::shader_set_default_texture_param(RID p_shader, const Strin Shader *shader=shader_owner.get(p_shader); ERR_FAIL_COND(!shader); - ERR_FAIL_COND(!texture_owner.owns(p_texture)); + ERR_FAIL_COND(p_texture.is_valid() && !texture_owner.owns(p_texture)); if (p_texture.is_valid()) shader->default_textures[p_name]=p_texture; else shader->default_textures.erase(p_name); + _shader_make_dirty(shader); + } RID RasterizerGLES2::shader_get_default_texture_param(RID p_shader, const StringName& p_name) const{ @@ -1606,6 +1608,7 @@ void RasterizerGLES2::material_set_param(RID p_material, const StringName& p_par material->shader_version=0; //get default! } else { E->get().value=p_value; + E->get().inuse=true; } } else { @@ -1613,6 +1616,7 @@ void RasterizerGLES2::material_set_param(RID p_material, const StringName& p_par ud.index=-1; ud.value=p_value; ud.istexture=p_value.get_type()==Variant::_RID; /// cache it being texture + ud.inuse=true; material->shader_params[p_param]=ud; //may be got at some point, or erased } @@ -1644,7 +1648,7 @@ Variant RasterizerGLES2::material_get_param(RID p_material, const StringName& p_ } - if (material->shader_params.has(p_param)) + if (material->shader_params.has(p_param) && material->shader_params[p_param].inuse) return material->shader_params[p_param].value; else return Variant(); @@ -4876,31 +4880,46 @@ _FORCE_INLINE_ void RasterizerGLES2::_update_material_shader_params(Material *p_ Material::UniformData ud; - bool keep=true; + bool keep=true; //keep material value + bool has_old = old_mparams.has(E->key()); + bool old_inuse=has_old && old_mparams[E->key()].inuse; - if (!old_mparams.has(E->key())) + if (!has_old || !old_inuse) keep=false; else if (old_mparams[E->key()].value.get_type()!=E->value().default_value.get_type()) { - - if (old_mparams[E->key()].value.get_type()==Variant::OBJECT) { + //type changed between old and new + /*if (old_mparams[E->key()].value.get_type()==Variant::OBJECT) { if (E->value().default_value.get_type()!=Variant::_RID) //hackfor textures keep=false; } else if (!old_mparams[E->key()].value.is_num() || !E->value().default_value.get_type()) + keep=false;*/ + + //value is invalid because type differs and default is not null + if (E->value().default_value.get_type()!=Variant::NIL) keep=false; } + ud.istexture=(E->get().type==ShaderLanguage::TYPE_TEXTURE || E->get().type==ShaderLanguage::TYPE_CUBEMAP); + if (keep) { ud.value=old_mparams[E->key()].value; + //print_line("KEEP: "+String(E->key())); } else { - ud.value=E->value().default_value; + if (ud.istexture && p_material->shader_cache->default_textures.has(E->key())) + ud.value=p_material->shader_cache->default_textures[E->key()]; + else + ud.value=E->value().default_value; + old_inuse=false; //if reverted to default, obviously did not work + //print_line("NEW: "+String(E->key())+" because: hasold-"+itos(old_mparams.has(E->key()))); //if (old_mparams.has(E->key())) // print_line(" told "+Variant::get_type_name(old_mparams[E->key()].value.get_type())+" tnew "+Variant::get_type_name(E->value().default_value.get_type())); } - ud.istexture=(E->get().type==ShaderLanguage::TYPE_TEXTURE || E->get().type==ShaderLanguage::TYPE_CUBEMAP); + ud.index=idx++; + ud.inuse=old_inuse; mparams[E->key()]=ud; } @@ -5021,23 +5040,8 @@ bool RasterizerGLES2::_setup_material(const Geometry *p_geometry,const Material E->get().value=RID(); //nullify, invalid texture rid=RID(); } - } else { - - } - if (!rid.is_valid()) { - //use from default textures - Map::Element *F=p_material->shader_cache->default_textures.find(E->key()); - if (F) { - t=texture_owner.get(F->get()); - if (!t) { - p_material->shader_cache->default_textures.erase(E->key()); - } - } - } - - glActiveTexture(GL_TEXTURE0+texcoord); glUniform1i(loc,texcoord); //TODO - this could happen automatically on compile... if (t) { @@ -5061,12 +5065,6 @@ bool RasterizerGLES2::_setup_material(const Geometry *p_geometry,const Material } - for (Map::Element *E=p_material->shader_cache->default_textures.front();E;E=E->next()) { - if (p_material->shader_params.has(E->key())) - continue; - - - } if (p_material->shader_cache->has_texscreen && framebuffer.active) { material_shader.set_uniform(MaterialShaderGLES2::TEXSCREEN_SCREEN_MULT,Vector2(float(viewport.width)/framebuffer.width,float(viewport.height)/framebuffer.height)); diff --git a/drivers/gles2/rasterizer_gles2.h b/drivers/gles2/rasterizer_gles2.h index dc596f9f6c..aa6a4e1f67 100644 --- a/drivers/gles2/rasterizer_gles2.h +++ b/drivers/gles2/rasterizer_gles2.h @@ -241,8 +241,9 @@ class RasterizerGLES2 : public Rasterizer { struct UniformData { + bool inuse; bool istexture; - Variant value; + Variant value; int index; }; diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 957e63e3ce..5f38d541b7 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -265,6 +265,37 @@ void GraphEdit::_top_layer_input(const InputEvent& p_ev) { Vector2 pos = gn->get_connection_input_pos(j)+gn->get_pos(); if (pos.distance_to(mpos)::Element*E=connections.front();E;E=E->next()) { + + if (E->get().to==gn->get_name() && E->get().to_port==j) { + + Node*fr = get_node(String(E->get().from)); + if (fr && fr->cast_to()) { + + connecting_from=E->get().from; + connecting_index=E->get().from_port; + connecting_out=true; + connecting_type=fr->cast_to()->get_connection_output_type(E->get().from_port); + connecting_color=fr->cast_to()->get_connection_output_color(E->get().from_port); + connecting_target=false; + connecting_to=pos; + + emit_signal("disconnection_request",E->get().from,E->get().from_port,E->get().to,E->get().to_port); + fr = get_node(String(connecting_from)); //maybe it was erased + if (fr && fr->cast_to()) { + connecting=true; + } + return; + } + + } + } + } + + connecting=true; connecting_from=gn->get_name(); connecting_index=j; @@ -474,11 +505,26 @@ void GraphEdit::clear_connections() { } +void GraphEdit::set_right_disconnects(bool p_enable) { + + right_disconnects=p_enable; +} + +bool GraphEdit::is_right_disconnects_enabled() const{ + + return right_disconnects; +} + + void GraphEdit::_bind_methods() { ObjectTypeDB::bind_method(_MD("connect_node:Error","from","from_port","to","to_port"),&GraphEdit::connect_node); ObjectTypeDB::bind_method(_MD("is_node_connected","from","from_port","to","to_port"),&GraphEdit::is_node_connected); ObjectTypeDB::bind_method(_MD("disconnect_node","from","from_port","to","to_port"),&GraphEdit::disconnect_node); + + ObjectTypeDB::bind_method(_MD("set_right_disconnects","enable"),&GraphEdit::set_right_disconnects); + ObjectTypeDB::bind_method(_MD("is_right_disconnects_enabled"),&GraphEdit::is_right_disconnects_enabled); + ObjectTypeDB::bind_method(_MD("_graph_node_moved"),&GraphEdit::_graph_node_moved); ObjectTypeDB::bind_method(_MD("_graph_node_raised"),&GraphEdit::_graph_node_raised); @@ -489,9 +535,12 @@ void GraphEdit::_bind_methods() { ObjectTypeDB::bind_method(_MD("_input_event"),&GraphEdit::_input_event); ADD_SIGNAL(MethodInfo("connection_request",PropertyInfo(Variant::STRING,"from"),PropertyInfo(Variant::INT,"from_slot"),PropertyInfo(Variant::STRING,"to"),PropertyInfo(Variant::INT,"to_slot"))); + ADD_SIGNAL(MethodInfo("disconnection_request",PropertyInfo(Variant::STRING,"from"),PropertyInfo(Variant::INT,"from_slot"),PropertyInfo(Variant::STRING,"to"),PropertyInfo(Variant::INT,"to_slot"))); } + + GraphEdit::GraphEdit() { top_layer=NULL; top_layer=memnew(GraphEditFilter(this)); @@ -511,6 +560,7 @@ GraphEdit::GraphEdit() { top_layer->add_child(v_scroll); updating=false; connecting=false; + right_disconnects=false; h_scroll->connect("value_changed", this,"_scroll_moved"); v_scroll->connect("value_changed", this,"_scroll_moved"); diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h index f8a2f3fee7..1df2776cef 100644 --- a/scene/gui/graph_edit.h +++ b/scene/gui/graph_edit.h @@ -51,6 +51,7 @@ private: + bool right_disconnects; bool updating; List connections; @@ -86,6 +87,9 @@ public: void get_connection_list(List *r_connections); + void set_right_disconnects(bool p_enable); + bool is_right_disconnects_enabled() const; + GraphEdit(); }; diff --git a/scene/resources/shader.cpp b/scene/resources/shader.cpp index e47b2432f2..f3e625917a 100644 --- a/scene/resources/shader.cpp +++ b/scene/resources/shader.cpp @@ -144,10 +144,13 @@ void Shader::_set_code(const Dictionary& p_string) { void Shader::set_default_texture_param(const StringName& p_param,const Ref& p_texture) { - if (p_texture.is_valid()) + if (p_texture.is_valid()) { default_textures[p_param]=p_texture; - else + VS::get_singleton()->shader_set_default_texture_param(shader,p_param,p_texture->get_rid()); + } else { default_textures.erase(p_param); + VS::get_singleton()->shader_set_default_texture_param(shader,p_param,RID()); + } } Ref Shader::get_default_texture_param(const StringName& p_param) const{ diff --git a/scene/resources/shader_graph.cpp b/scene/resources/shader_graph.cpp index a06a70be9f..4c81724841 100644 --- a/scene/resources/shader_graph.cpp +++ b/scene/resources/shader_graph.cpp @@ -57,6 +57,84 @@ Array ShaderGraph::_get_connections(ShaderType p_type) const { return arr; } +void ShaderGraph::_set_data(const Dictionary &p_data) { + + Dictionary d=p_data; + ERR_FAIL_COND(!d.has("shaders")); + Array sh=d["shaders"]; + ERR_FAIL_COND(sh.size()!=3); + + for(int t=0;t<3;t++) { + Array data=sh[t]; + ERR_FAIL_COND((data.size()%6)!=0); + shader[t].node_map.clear(); + for(int i=0;i::Element*E=shader[i].node_map.front();E;E=E->next()) { + + data[idx+0]=E->key(); + data[idx+1]=E->get().type; + data[idx+2]=E->get().pos; + data[idx+3]=E->get().param1; + data[idx+4]=E->get().param2; + + Array conns; + conns.resize(E->get().connections.size()*3); + int idx2=0; + for(Map::Element*F=E->get().connections.front();F;F=F->next()) { + + conns[idx2+0]=F->key(); + conns[idx2+1]=F->get().id; + conns[idx2+2]=F->get().slot; + idx2+=3; + } + data[idx+5]=conns; + idx+=6; + } + sh.push_back(data); + } + + Dictionary data; + data["shaders"]=sh; + return data; +} + + void ShaderGraph::_bind_methods() { ObjectTypeDB::bind_method(_MD("_update_shader"),&ShaderGraph::_update_shader); @@ -147,6 +225,11 @@ void ShaderGraph::_bind_methods() { ObjectTypeDB::bind_method(_MD("node_set_state","shader_type","id","state"),&ShaderGraph::node_set_state); ObjectTypeDB::bind_method(_MD("node_get_state:var","shader_type","id"),&ShaderGraph::node_get_state); + ObjectTypeDB::bind_method(_MD("_set_data"),&ShaderGraph::_set_data); + ObjectTypeDB::bind_method(_MD("_get_data"),&ShaderGraph::_get_data); + + ADD_PROPERTY( PropertyInfo(Variant::DICTIONARY,"_data",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR), _SCS("_set_data"),_SCS("_get_data")); + //void get_connections(ShaderType p_which,List *p_connections) const; @@ -347,7 +430,7 @@ void ShaderGraph::_bind_methods() { } -String ShaderGraph::_find_unique_name(ShaderType p_which, const String& p_base) { +String ShaderGraph::_find_unique_name(const String& p_base) { @@ -358,15 +441,19 @@ String ShaderGraph::_find_unique_name(ShaderType p_which, const String& p_base) tocmp+="_"+itos(idx); } bool valid=true; - for (Map::Element *E=shader[p_which].node_map.front();E;E=E->next()) { - if (E->get().type!=NODE_SCALAR_INPUT && E->get().type!=NODE_VEC_INPUT && E->get().type==NODE_RGB_INPUT && E->get().type==NODE_XFORM_INPUT && E->get().type==NODE_TEXTURE_INPUT && E->get().type==NODE_CUBEMAP_INPUT) - continue; - String name = E->get().param1; - if (name==tocmp) { - valid=false; + for(int i=0;i<3;i++) { + if (!valid) break; - } + for (Map::Element *E=shader[i].node_map.front();E;E=E->next()) { + if (E->get().type!=NODE_SCALAR_INPUT && E->get().type!=NODE_VEC_INPUT && E->get().type==NODE_RGB_INPUT && E->get().type==NODE_XFORM_INPUT && E->get().type==NODE_TEXTURE_INPUT && E->get().type==NODE_CUBEMAP_INPUT) + continue; + String name = E->get().param1; + if (name==tocmp) { + valid=false; + break; + } + } } if (!valid) { @@ -424,12 +511,12 @@ void ShaderGraph::node_add(ShaderType p_type, NodeType p_node_type,int p_id) { case NODE_XFORM_TO_VEC: {} break; // 3 scalar input: {} break; 1 vec3 output case NODE_SCALAR_INTERP: {} break; // scalar interpolation (with optional curve) case NODE_VEC_INTERP: {} break; // vec3 interpolation (with optional curve) - case NODE_SCALAR_INPUT: {node.param1=_find_unique_name(p_type,"Scalar"); node.param2=0;} break; // scalar uniform (assignable in material) - case NODE_VEC_INPUT: {node.param1=_find_unique_name(p_type,"Vec3");node.param2=Vector3();} break; // vec3 uniform (assignable in material) - case NODE_RGB_INPUT: {node.param1=_find_unique_name(p_type,"Color");node.param2=Color();} break; // color uniform (assignable in material) - case NODE_XFORM_INPUT: {node.param1=_find_unique_name(p_type,"XForm"); node.param2=Transform();} break; // mat4 uniform (assignable in material) - case NODE_TEXTURE_INPUT: {node.param1=_find_unique_name(p_type,"Tex"); } break; // texture input (assignable in material) - case NODE_CUBEMAP_INPUT: {node.param1=_find_unique_name(p_type,"Cube"); } break; // cubemap input (assignable in material) + case NODE_SCALAR_INPUT: {node.param1=_find_unique_name("Scalar"); node.param2=0;} break; // scalar uniform (assignable in material) + case NODE_VEC_INPUT: {node.param1=_find_unique_name("Vec3");node.param2=Vector3();} break; // vec3 uniform (assignable in material) + case NODE_RGB_INPUT: {node.param1=_find_unique_name("Color");node.param2=Color();} break; // color uniform (assignable in material) + case NODE_XFORM_INPUT: {node.param1=_find_unique_name("XForm"); node.param2=Transform();} break; // mat4 uniform (assignable in material) + case NODE_TEXTURE_INPUT: {node.param1=_find_unique_name("Tex"); } break; // texture input (assignable in material) + case NODE_CUBEMAP_INPUT: {node.param1=_find_unique_name("Cube"); } break; // cubemap input (assignable in material) case NODE_OUTPUT: {} break; // output (shader type dependent) case NODE_COMMENT: {} break; // comment case NODE_TYPE_MAX: {}; @@ -881,8 +968,9 @@ void ShaderGraph::input_node_set_name(ShaderType p_type,int p_id,const String& p ERR_FAIL_COND(!p_name.is_valid_identifier()); Node& n = shader[p_type].node_map[p_id]; ERR_FAIL_COND(n.type!=NODE_SCALAR_INPUT && n.type!=NODE_VEC_INPUT && n.type==NODE_RGB_INPUT && n.type==NODE_XFORM_INPUT && n.type==NODE_TEXTURE_INPUT && n.type==NODE_CUBEMAP_INPUT); + n.param1=""; - n.param1=_find_unique_name(p_type,p_name); + n.param1=_find_unique_name(p_name); _request_update(); } @@ -1097,59 +1185,74 @@ ShaderGraph::~ShaderGraph() { const ShaderGraph::InOutParamInfo ShaderGraph::inout_param_info[]={ //material vertex in - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Vertex","SRC_VERTEX",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Normal","SRC_NORMAL",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Tangent","SRC_TANGENT",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"BinormalF","SRC_BINORMALF",SLOT_TYPE_SCALAR,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"WorldMatrix","WORLD_MATRIX",SLOT_TYPE_XFORM,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"InvCameraMatrix","INV_CAMERA_MATRIX",SLOT_TYPE_XFORM,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"ProjectionMatrix","PROJECTION_MATRIX",SLOT_TYPE_XFORM,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"ModelviewMatrix","MODELVIEW_MATRIX",SLOT_TYPE_XFORM,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"InstanceID","INSTANCE_ID",SLOT_TYPE_SCALAR,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Time","TIME",SLOT_TYPE_SCALAR,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Vertex","SRC_VERTEX","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Normal","SRC_NORMAL","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Tangent","SRC_TANGENT","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"BinormalF","SRC_BINORMALF","",SLOT_TYPE_SCALAR,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Color","SRC_COLOR","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Alpha","SRC_ALPHA","",SLOT_TYPE_SCALAR,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV","SRC_UV","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV2","SRC_UV2","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"WorldMatrix","WORLD_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"InvCameraMatrix","INV_CAMERA_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"ProjectionMatrix","PROJECTION_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"ModelviewMatrix","MODELVIEW_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"InstanceID","INSTANCE_ID","",SLOT_TYPE_SCALAR,SLOT_IN}, + //material vertex out - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Vertex","VERTEX",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Normal","NORMAL",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Tangent","TANGENT",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Binormal","BINORMAL",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV","UV",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV2","UV2",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Color","COLOR.rgb",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Alpha","COLOR.a",SLOT_TYPE_SCALAR,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Var1","VAR1.rgb",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Var2","VAR2.rgb",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"SpecExp","SPEC_EXP",SLOT_TYPE_SCALAR,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_VERTEX,"PointSize","POINT_SIZE",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Vertex","VERTEX","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Normal","NORMAL","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Tangent","TANGENT","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Binormal","BINORMAL","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV","UV",".xy",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV2","UV2",".xy",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Color","COLOR.rgb","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Alpha","COLOR.a","",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Var1","VAR1.rgb","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Var2","VAR2.rgb","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"SpecExp","SPEC_EXP","",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_VERTEX,"PointSize","POINT_SIZE","",SLOT_TYPE_SCALAR,SLOT_OUT}, //pixel vertex in - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Vertex","VERTEX",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Position","POSITION",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Normal","IN_NORMAL",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Tangent","TANGENT",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Binormal","BINORMAL",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UV","UV",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UV2","UV2",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UVScreen","SCREEN_UV",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"PointCoord","POINT_COORD",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Color","COLOR.rgb",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Alpha","COLOR.a",SLOT_TYPE_SCALAR,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"InvCameraMatrix","INV_CAMERA_MATRIX",SLOT_TYPE_XFORM,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Time","TIME",SLOT_TYPE_SCALAR,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Var1","VAR1.rgb",SLOT_TYPE_VEC,SLOT_IN}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Var2","VAR2.rgb",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Vertex","VERTEX","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Position","POSITION","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Normal","IN_NORMAL","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Tangent","TANGENT","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Binormal","BINORMAL","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UV","vec3(UV,0);","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UV2","UV2","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UVScreen","SCREEN_UV","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"PointCoord","POINT_COORD","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Color","COLOR.rgb","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Alpha","COLOR.a","",SLOT_TYPE_SCALAR,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"InvCameraMatrix","INV_CAMERA_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Var1","VAR1.rgb","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Var2","VAR2.rgb","",SLOT_TYPE_VEC,SLOT_IN}, //pixel vertex out - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Diffuse","DIFFUSE_OUT",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"DiffuseAlpha","ALPHA_OUT",SLOT_TYPE_SCALAR,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Specular","SPECULAR",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"SpecularExp","SPECULAR",SLOT_TYPE_SCALAR,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Emission","EMISSION",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Glow","GLOW",SLOT_TYPE_SCALAR,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"ShadeParam","SHADE_PARAM",SLOT_TYPE_SCALAR,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Normal","NORMAL",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"NormalMap","NORMALMAP",SLOT_TYPE_VEC,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"NormalMapDepth","NORMALMAP_DEPTH",SLOT_TYPE_SCALAR,SLOT_OUT}, - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Discard","DISCARD",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Diffuse","DIFFUSE_OUT","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"DiffuseAlpha","ALPHA_OUT","",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Specular","SPECULAR","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"SpecularExp","SPECULAR","",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Emission","EMISSION","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Glow","GLOW","",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"ShadeParam","SHADE_PARAM","",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Normal","NORMAL","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"NormalMap","NORMALMAP","",SLOT_TYPE_VEC,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"NormalMapDepth","NORMALMAP_DEPTH","",SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Discard","DISCARD",">0.5",SLOT_TYPE_SCALAR,SLOT_OUT}, + //light in + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Normal","NORMAL","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"LightDir","LIGHT_DIR","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"LightDiffuse","LIGHT_DIFFUSE","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"LightSpecular","LIGHT_SPECULAR","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"EyeVec","EYE_VEC","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Diffuse","DIFFUSE","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Specular","SPECULAR","",SLOT_TYPE_VEC,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"SpecExp","SPECULAR_EXP","",SLOT_TYPE_SCALAR,SLOT_IN}, + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"ShadeParam","SHADE_PARAM","",SLOT_TYPE_SCALAR,SLOT_IN}, + //light out + {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Light","LIGHT","",SLOT_TYPE_VEC,SLOT_OUT}, //end - {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,NULL,NULL,SLOT_TYPE_SCALAR,SLOT_OUT}, + {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,NULL,NULL,NULL,SLOT_TYPE_SCALAR,SLOT_OUT}, }; @@ -1174,7 +1277,7 @@ const ShaderGraph::NodeSlotInfo ShaderGraph::node_slot_info[]= { {NODE_SCALAR_CONST,{SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, //scalar constant {NODE_VEC_CONST,{SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, //vec3 constant - {NODE_RGB_CONST,{SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, //rgb constant (shows a color picker instead) + {NODE_RGB_CONST,{SLOT_MAX},{SLOT_TYPE_VEC,SLOT_TYPE_SCALAR,SLOT_MAX}}, //rgb constant (shows a color picker instead) {NODE_XFORM_CONST,{SLOT_MAX},{SLOT_TYPE_XFORM,SLOT_MAX}}, // 4x4 matrix constant {NODE_TIME,{SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // time in seconds {NODE_SCREEN_TEX,{SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // screen texture sampler (takes UV) (only usable in fragment shader) @@ -1381,6 +1484,14 @@ void ShaderGraph::_update_shader() { String code[3]; + List names; + get_default_texture_param_list(&names); + + for (List::Element *E=names.front();E;E=E->next()) { + set_default_texture_param(E->get(),Ref()); + } + + for(int i=0;i<3;i++) { int idx=0; @@ -1437,11 +1548,13 @@ void ShaderGraph::_update_shader() { bool failed=false; if (i==SHADER_TYPE_FRAGMENT && get_mode()==MODE_MATERIAL) { - code[i]+="vec3 DIFFUSE_OUT=vec3(0,0,0);"; - code[i]+="float ALPHA_OUT=0;"; + code[i]+="vec3 DIFFUSE_OUT=vec3(0,0,0);\n"; + code[i]+="float ALPHA_OUT=0;\n"; } + Map inputs_xlate; + Map input_names_xlate; Set inputs_used; for(int j=0;jid)+"sl"+itos(idx)); inputs_xlate[vname]=String(typestr[iop->slot_type])+" "+vname+"="+iop->variable+";\n"; + input_names_xlate[vname]=iop->variable; idx++; } iop++; @@ -1476,7 +1590,7 @@ void ShaderGraph::_update_shader() { String iname=("nd"+itos(n->connections[idx].id)+"sl"+itos(n->connections[idx].slot)); if (node_get_type(ShaderType(i),n->connections[idx].id)==NODE_INPUT) inputs_used.insert(iname); - code[i]+=String(iop->variable)+"="+iname+";\n"; + code[i]+=String(iop->variable)+"="+iname+String(iop->postfix)+";\n"; if (i==SHADER_TYPE_FRAGMENT && get_mode()==MODE_MATERIAL && String(iop->name)=="DiffuseAlpha") use_alpha=true; } @@ -1488,8 +1602,7 @@ void ShaderGraph::_update_shader() { if (i==SHADER_TYPE_FRAGMENT && get_mode()==MODE_MATERIAL) { if (use_alpha) { - code[i]+="DIFFUSE_ALPHA.rgb=DIFFUSE_OUT;\n"; - code[i]+="DIFFUSE_ALPHA.a=ALPHA_OUT;\n"; + code[i]+="DIFFUSE_ALPHA=vec4(DIFFUSE_OUT,ALPHA_OUT);\n"; } else { code[i]+="DIFFUSE=DIFFUSE_OUT;\n"; } @@ -1506,13 +1619,19 @@ void ShaderGraph::_update_shader() { } String iname="nd"+itos(n->connections[k].id)+"sl"+itos(n->connections[k].slot); inputs.push_back(iname); - if (node_get_type(ShaderType(i),n->connections[k].id)==NODE_INPUT) + if (node_get_type(ShaderType(i),n->connections[k].id)==NODE_INPUT) { inputs_used.insert(iname); + } } if (failed) break; + + if (n->type==NODE_TEXTURE_INPUT || n->type==NODE_CUBEMAP_INPUT) { + + set_default_texture_param(n->param1,n->param2); + } _add_node_code(ShaderType(i),n,inputs,code[i]); } @@ -1521,11 +1640,31 @@ void ShaderGraph::_update_shader() { if (failed) continue; + for(Set::Element *E=inputs_used.front();E;E=E->next()) { ERR_CONTINUE( !inputs_xlate.has(E->get())); code[i]=inputs_xlate[E->get()]+code[i]; + String name=input_names_xlate[E->get()]; + + if (i==SHADER_TYPE_VERTEX && get_mode()==MODE_MATERIAL) { + if (name==("SRC_COLOR")) + code[i]="vec3 SRC_COLOR=COLOR.rgb;\n"+code[i]; + if (name==("SRC_ALPHA")) + code[i]="float SRC_ALPHA=COLOR.a;\n"+code[i]; + if (name==("SRC_UV")) + code[i]="vec3 SRC_UV=vec3(UV,0);\n"+code[i]; + if (name==("SRC_UV2")) + code[i]="float SRC_UV2=vec3(UV2,0);\n"+code[i]; + } else if (i==SHADER_TYPE_FRAGMENT && get_mode()==MODE_MATERIAL) { + if (name==("IN_NORMAL")) + code[i]="vec3 IN_NORMAL=NORMAL;\n"+code[i]; + } + } + + + shader[i].error=GRAPH_OK; print_line("ShADER: "+code[i]); } @@ -1568,6 +1707,7 @@ void ShaderGraph::_add_node_code(ShaderType p_type,Node *p_node,const Vectorparam1; code+=OUTNAME(p_node->id,0)+"=vec3("+rtos(col.r)+","+rtos(col.g)+","+rtos(col.b)+");\n"; + code+=OUTNAME(p_node->id,1)+"="+rtos(col.a)+";\n"; }break; case NODE_XFORM_CONST: { @@ -1744,7 +1884,7 @@ void ShaderGraph::_add_node_code(ShaderType p_type,Node *p_node,const Vectorparam1; - String rname="_read_tex"+itos(p_node->id); + String rname="rt_read_tex"+itos(p_node->id); code +="uniform texture "+name+";"; code +="vec4 "+rname+"=tex("+name+","+p_inputs[0]+".xy);\n"; code += OUTNAME(p_node->id,0)+"="+rname+".rgb;\n"; @@ -1755,7 +1895,7 @@ void ShaderGraph::_add_node_code(ShaderType p_type,Node *p_node,const Vectorparam1; code +="uniform cubemap "+name+";"; - String rname="_read_tex"+itos(p_node->id); + String rname="rt_read_tex"+itos(p_node->id); code +="vec4 "+rname+"=texcube("+name+","+p_inputs[0]+".xy);\n"; code += OUTNAME(p_node->id,0)+"="+rname+".rgb;\n"; code += OUTNAME(p_node->id,1)+"="+rname+".a;\n"; diff --git a/scene/resources/shader_graph.h b/scene/resources/shader_graph.h index c73895db8a..984164b449 100644 --- a/scene/resources/shader_graph.h +++ b/scene/resources/shader_graph.h @@ -115,7 +115,7 @@ public: private: - String _find_unique_name(ShaderType p_which, const String& p_base); + String _find_unique_name(const String& p_base); struct SourceSlot { @@ -151,6 +151,7 @@ private: ShaderType shader_type; const char *name; const char *variable; + const char *postfix; SlotType slot_type; SlotDir dir; }; @@ -175,6 +176,9 @@ private: Array _get_node_list(ShaderType p_type) const; Array _get_connections(ShaderType p_type) const; + + void _set_data(const Dictionary& p_data); + Dictionary _get_data() const; protected: static void _bind_methods(); diff --git a/tools/editor/icons/icon_graph_comment.png b/tools/editor/icons/icon_graph_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7889c51093dc90f4eb7fd0800f329e188c6630 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(|vqv>CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJltK*E;s`&E zX=@GRzi6dNT_>a%LQDg%*6w}$%5hq1EkiQHZ57Wd2DN*?efPTiPk#RMiskgOi3Y~C zGOJ#Bh4S-1S=uq@R@FLH>6ted9^Jlp)vD6Os`u%M67QtMXU<%;Dr&||{nJGWX~hg0 zT}da-eA#!!q4XT9OG)3N7j7<%Gh-iF?5q2n%CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJltKRAjH*^NfLkNz&8BF+}5hX|H#- za3DkL{_1qK$tgy@L76=>Lb_MHIHbjRcgKpbKd}q#SBT!>be*8r6|qD_{92T%ulF03 zWhYgPXI|f{Cvr6F{4i^hc9(Pm2%Mz}J#}*>pt~s~eynZ@) z-OSq>wL7W0`nTN&tG>rx0xTuFV-F=b?R}+ip~TPT&QGbcX_J#Sdgx8JW}Y`AP-LyD zXVA;C-DjFO`<6yj*7O&cxMcg<%6}-!pU%HrRxft1^UF*J`u>Ap|R9s63cB9 zi66-+vzBD6tqq?0gTe~ HDWM4fbM+dR literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_input.png b/tools/editor/icons/icon_graph_input.png new file mode 100644 index 0000000000000000000000000000000000000000..a396bc2350230b0bcbf2158411810afb7d3a34df GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVpOKxJ-QdYp-b4ll#%rD~jv*T7_fFcMcPl{T z*#6h{*UNa07I}83yg0$pIcsf6f}_#dsI+gtrD|FCyHqlZm4&dq>NT7?F?ddlbU{PH z@3M}Jpwcy0jBB62s5$)e9RH8|u5o5g9ET(>A2N^$(V8m8pyK&yZ`kVEuQu-;I0To+ zK3#gU^zN&#Uzgu3uvim4&6TA=rSE8o)!#?E-c>8Qlo)9<2(-%d7_Pnl{=8j@omogf0=2|;f#VJ&CW3KeJ+~!qN zR6KQVO`rbtsgcBz*|LjnOL*;?IOT( z=j%C=eRlsW{Cx95uNmV8>o?DOf9;<5ypnxi6!&l6r};${TinXd6xN)XAp2R}X$8+z jt$bP0l+XkKHaYfd literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_rgb.png b/tools/editor/icons/icon_graph_rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..abffaedd3478b19c16b823c912f2086cafd47918 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVpOKxJSAVk63poY`25V0j#}JM4$q5pySJ-=a zczAg7r%w5In5E_Y-DIAs?g#6I_Z?rcFdgVpOKweOxbu-{(1%mhNYe^jv*T7lM@!0C%8O& zbASJTd%L53eSHOAbzV&Rzl_T`>GF{&f5nalh~;d15y$i6{DA`p6v}?fDKj%OAHFxi zdj{LX;#=CGs&o9(3rk8;YE~~fa^S#$0|lAy?)>NB;o*@~7vO4=nDWnfiSr?*o25Qa z+O$sp`}_O<;@=ONUS?YSzGs_w?2Q12wPj@g$9uMkhs^HnZkIY_;2ZH+FuvqLultuD bQZ@_>7h=tS?yqw!0Qu0<)z4*}Q$iB}s;p}! literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_rgb_uniform.png b/tools/editor/icons/icon_graph_rgb_uniform.png new file mode 100644 index 0000000000000000000000000000000000000000..92c79997efd9f4961f5aa7308744b55843a1819f GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(|vqv>CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvA*K&CkwUL2=(ZJKiF+}71)JcYZ zOpX$*`~S~xWH3B3!6P~GAfwJRrWR)jYrcd;n}(CqVh&t04u}%ue;}qZ@8FTXfCcZ2 zen-F2(^hkYAnMvFqaGcJ7o-s_ee`ruU*oc1y%#HN#0S)o0c|NbO&wQK!1d%T7jU zuaJM$oZ7jI3!THQD)M>Q1k*3P{KMgK`AXl)%RDZpj+kCZ-@SHLp-9j+Esmry>}UjN_m?0`kfhCgiEuf(qR UTj}tffq{X+)78&qol`;+0D6X^FdgVpOKxJll{=^)&~p>3|Bo}978nDCnre!YY>c0 zC_WI#&BnG&ukAliRS!>34iC?N{{Mf^UwFR%WRdzND>a_Q|BQ80QxdkMCj62A|K)x5 z!}|XcQ8OhZi!M&xn6RrcaKc0T!}s^|^z=N^*^^W!t;266={SdnHV)x0SXSeyyTmS$4oBnJ5!+2h0szA{r!I#F|})cs%DCx|MUE>2if!E_y7Ep0)CbZ XvG(rImzJK50)>dDtDnm{r-UW|5?F)+ literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_scalar_interp.png b/tools/editor/icons/icon_graph_scalar_interp.png new file mode 100644 index 0000000000000000000000000000000000000000..4f178a27c4176bc588afe9649995c070fd291382 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(|vqv>CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvAQT!o#;THn~!&^@m#}JM4M=#oI zw}tQQ&|Sm2JND#tgM{i!b6wp^>zTVRD(z#ucf9D5 z^yBC`PhVL*-*s+2U%jmF$*prAIKSGx@X4(OjaSMaPg;GYT*-dPzTbB>yC(19{qsyU z-1lUux=C?`Pwn@RqS(V~$5y_7=etbLCFA~X(UV<$fosac zifoS?G^_F?MsWB<9JJmRd_Q)2%=Zobu6MTm;9%S{EoS?MM#Hp1p{<7vcr9|h*10=A z``D2F=Ga-@xB~HLo#Sg4ul#56QjUF_eaU6tpZ9+-{rw&&uur$Oo`HdZ!PC{xWt~$( F698c6lez!^ literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_scalar_op.png b/tools/editor/icons/icon_graph_scalar_op.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc4cae94cf35637e85d71f3c9961361c9b6ee83 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVpOKweL|nn(=L`l0hH6h2#}JM4$q5V06I`CX z;obQ~etyz()2f26IxRfTOd4&Q9&C7OzlpcnSuar|;m~uF8o%_EgoK2O)k}^XIB?)V z!NH8f^($`F>%96WoU42<;OHY6k;`+hzc6(A`@{b09Fxa;s}Hs0y71Mpv9YnuP>cE4 iVQj^5^l^QgBPYX-bs8(5Uz~mmCK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvA(~Fw3{v`tgqo}8gV~EE2sgpMP zF*ypf?Vr0>Caz=p>o-#bI+xDcy1^xB#oC&A)pEW(OId}iw7KFAaCK*k=%q6rzZX>@ zb!g>*`19t!-=5KExR_DGb;N<4)j<-gvw}SR<(RGQG_FlO?+v?u0 z`C^lsw&b4_W)FKP@ANllbGgpy)P>vcz51KzX&CIXeO6TPiFnzYn`7BmHXMy%d@yIx zkAf>wPHPoKuX9Pnac15(+P$5@BZYIfQ^BJD?61XVJ@DD+lkhKS0Q>?)pX7{G&EF30`?MstbH(ggao#5d(#U#WaYtqao zwe}z0Pdxl3$=81JUxo%J(S|G4i{dp_e!u$eRE-)#nn6sN#rpR<@?19E4E5p)FdgVpOKxJ-*_wQwaW|)jORUF978nD&z)qSJvmY2 zX#Mw}pZ8^MT_(6{ZIhSO>`3$2)}{v!9;p`!va_p;9}G-?UdO=tQTatiaI4zUWf#qS zw`P9&S2^$Xgpe)~5&f7Qhi$(XoVWZiUzK6itatBt#ClCDBU`+z9=E&3g#~;$vMlR} zzRubFZV$ES_^Qs*XP%RONjR_hb!1)o<41k|f1?{&IvBW)MScGKqTmikYK_+HwQpB- z@bs9Y=cYNvIpi^_Ib5CW&O5=+`j2BqUpwc84yIZb=AOoU2UZE+qn0xy z+`rwP`^{}T+m>~4@lh{o?s-n`I`98mS6=+&)MH88ZoaA$Pdw_YqjY=q_1qoRyJK!N zTFt}UgxPp9!F};OXk;vd$@?2>{&%0Y3l$ literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_texture_uniform.png b/tools/editor/icons/icon_graph_texture_uniform.png new file mode 100644 index 0000000000000000000000000000000000000000..7517ac1d927ceedd955fd45646a538738a014296 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(|vqv>CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJltKkXymBU={-d!)H$y#}JM4b0-;k zA5IWxoB#Vq)-5f^EtgbOK6D0LS!!Xmt^Snh>i@^CF8$Z^U|EoW5ld&Yf~csY&GevL zC&O>8((iV(e}89DSy%P)&hyKR6PS_@q;J)0_;P@E*`(B)27Gr+6-*|JrPd`q_Y0a* zsjS5}hhgQ+{_O$##Z4a`U$!gwbe_Q1$4l3#l!RU|zv>nE%*IBn`AjTbgcS`TwyMG?z@_L(}soOVK)|J#$eC3_l>;HUbynq`60|SGn LtDnm{r-UW|o9L1- literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_time.png b/tools/editor/icons/icon_graph_time.png new file mode 100644 index 0000000000000000000000000000000000000000..b61e45589ff32b50818e1e7051fc83b20332874d GIT binary patch literal 678 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVpOKxJPkQER{|p8OCSy+*#}JM4v6FnWg%d?u z=YOxAyzE+-bmv0(ErA=FI=GLv?hq8eyR$%D%k_>YYkiZwn>ST(V@y{IZ%V*A%PF&)3{#D$$z0ZsI+1KAUJ~*#&d;aNB%Qnd57J za5wLNLBZUo zcfCKl8DU#yzx6SaZsU1CA|i!I-T@@~qPp8l7yeCzZd g-FdgVpOKweRU?4=vN!_+!xB#y#}JM4Z!c`*I~X9* z_VByCW$zKy8Cwe#t)eG(Na$2a?qJ?3u`43y+czzrM{nLaR$scWVCW&eyW)EK&rb*U zUsKUl>d%^XB#(2#vxkfmTi5?(I3QJ>TXgg3!;1$_gx_M`(0E7moadV~hTOcRDbDU{ zW*1&&H%Xy_GYIbPeIE1%CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvAWxSPeu$X~?;ijjHV~EE2xtA7t zxdaNZJ$Qe|maC~_1DDw9n;Y(CY|NRUYqt1cp17ENf_wt+uF!)^E~anD+0wDE@!j5O zobBBb=MEIi_&>k?N4s(6x0(fNQd1{ZKhiUDb&CF=S+Uc7N=o>StnP!nw|X8kT>sdn zT2?60B+j$p5Z}HDQg)JN4@BSZ=$I>Pcj%Q&|Hjt}SLGb^#Pt8Ksh3zCH(zFf jz107stNhnR{ov*>G^jl9`+hnD0|SGntDnm{r-UW|aq56n literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_vec_length.png b/tools/editor/icons/icon_graph_vec_length.png new file mode 100644 index 0000000000000000000000000000000000000000..60ade8c90a5a4666cd451f024bebec7b3fedf5bb GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVpOKweRcIPJ*HQ)shCQAxjv*T7uTC=LYATR8 zdjEgF5KEkr&Mpt$O2+KYwip!~m(qroC@CrKtg;n;g1l{yY>hsewj{WE=I(p@`^Uk@ zwsHY>x_!L=4xOm)o$|-<_Vp51ExQv_?{c*<7}#H#E|4@~iKp>-J4>s#8Y(*l8(voJ zdRDbdjY0UytxWfa?(Pf%hH5K1)-Brfy`n>F-JE?z`I5QHA2{DJWHMe-+PSs&!2el> x!BVF;hEy^&d{O(|`ZPtVRPXtsW2u$X%Gi(DSzCzmFAN2F+|$+1Wt~$(698rPYCiw~ literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_vec_op.png b/tools/editor/icons/icon_graph_vec_op.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a7a51123e63c4c5a0bd3000e2bed14a57bfb40 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVpOKwe#PE}CO)3KeL$9ZcV~EE2py0ze|&WlOA_8#rIVG^tN&ed=V>ug;ER|Dy9Z83)oIymQF{$M$G>474} z$I+^)Y;0_7ZAZOx|0iF)!_CQ^(mdk?Z|F46FVdQ&MBb@07>&x Ap8x;= literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_vec_scalar_op.png b/tools/editor/icons/icon_graph_vec_scalar_op.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f4e7a1962fbfcf2c25f87ea32351e872560532 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVpOKweR4wD{iN_2K3^P1k978nDCnqd0PjGqW zVlf<&l#>U1**2tnmAAkH0NPooRJEzX2fBivb25uj7o`Wx2w}3q5 M>FVdQ&MBb@0G!)hZvX%Q literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_vec_to_scalars.png b/tools/editor/icons/icon_graph_vec_to_scalars.png new file mode 100644 index 0000000000000000000000000000000000000000..a677a7cc5337560546fd3df8f22f5f2b2b9876c7 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(}{30vJv_WiOn` zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvA5Dz}wkj}usu;0_gF+}71(TN-R z4kn1S?qB^j+hi`!{{zY%yCQ5G4{9y5>u@=e@qx#Ux%1#E=k`1sx6JhmZ*>W{9-5g~ zRQzt|bD1BeED9!U4PhdT8{WMABDyh2 zVD{K}TBzWp$q(4WmfonF^lF9l^oN>V@)7sHX4GGLSYN<+c#4zj0%sQs1_lNOPgg&e IbxsLQ0DCQVumAu6 literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_vecs_to_xform.png b/tools/editor/icons/icon_graph_vecs_to_xform.png new file mode 100644 index 0000000000000000000000000000000000000000..51216c93eb8338f112cedcdb7649a662da1ef4e6 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(|vqv>CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvAG@ZZW!yyI+hP9q9jv*T7w@y;z zI}{+`a^KALE7J)nj>wBqCXPxwnE4Jz8d$t*a1d&8`M)GyK+j3AyHQ`tZpo4yqmyaI zvrnE|lf&oy*jabEc%`}jkBveON(>41_UxO2kFMMnuCs@~mg~lL*5zG{OTW*M^xN9H zNOHLi`@{trhObhtGK;lwbX+*UDKBO#hsC=0G3?PR&!&Wg78y_e)fv{6did&#-m?;M ol4AEJ|IFdgVpOKxJoBtnMegFdlW3H!*V~EE2wUhRHM+b^D z?EgF|%zR9aH_+-G#Cl4+x;#rAaa5+e@&tM=gbZKHSF&i?yX4hVmiZQ zx`63Vf=*)4YVHHo38$sL>nghy&iL)G$Zx~=>)MXh8hp&zF`ufZy*s;L)vE2QeqEL_ z-*Aj~UG?5ci)=&pzPQKJq`_BwZAXi}eB$S;mF!P8ci7ywjfr8>@E6Z+^65OWd}h(V zOH$9>e>yJH^p#@x*|diL{4TBu6}b_Qjeei)nEPzKvg_@RJ$2UKGCir>T2`%(E)LtcPAIS2d(}ck#g?GXG=41QAzD)m7c64jVR?9y|RhvF; ddRpQ0jCK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvA6PYuiESiCVae=3cV~EE2(n)*s zE(eG->@Tj(-M+-a&BQ@ai21FIN^`;k_1+_gm<<%;7&_;kRfua~Pk6xli$#>jW5pzH z4Q6gG2qzch4N$nKK`{eLR1$`rjY=BYrE)f$K?VN@V=fhq(+FKA2f7zy2zSZ%I(?r^!sQ j3Q3014zpBFZvQ{cY65e0l)y~}1_lOCS3j3^P6FdgVpOKxJ$F$sAL6w1lVX~)-V~EE2?XV`N-al7+|*S4@DK5=Tb3mm&tP4>v8QJuyNF2E4hxGJlK=kqrzE7L zD0nF=Gan9f^gB1@KM&6v9v+_A5)u-RIxqcreSbe^j*ri42}y|?|Nj1ef40L_S=g*s z%{*_;|MLeve6VLeoZI~Rx_(0N;U?`bU)IMKFNn3_<7HszaFdgVpOKweQN{LRlm!C=!x2vx#}JM4S1%g+F$eOr zJgkp#sd{S7eAQ35??9r4rOy%#amPn8De)UM1=$^5Zu8i|g)pja zkay40^!Sy;FdgVpOKweMIccq>I4G=BfF=IV~EE2yOR{XofAdc z=6{ZrG!ozu<83-Czri5&;B1qeJNi;Ay4-5r^#^z8IUhbCUr@eXp=rjubzNr_#B#F? z*Yv*pE_=A_c-QNyQ^ghh`p<0(9@K}JpPDuI#kagW_sbWrnR)(9{<0<0+B&WT-e+>i zPz>_V%Cxwg!Boui;K*Hu3iG6O=NVPDZO=B~O<-LhHQjZg(t!;h{&5-1sIS(nTe~P= zW{$|zU{`thN8Z7`r;WVSj9&kSFQntp{J{#%Q~loCIIP%kt+ZI literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_xform_to_vecs.png b/tools/editor/icons/icon_graph_xform_to_vecs.png new file mode 100644 index 0000000000000000000000000000000000000000..847261f726b6035ed650512eff6cffdda70e8b00 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(|vqv>CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvA;&}7-y#NCP!(2}n#}JM4TPGQE zF&T=uq#u$?k#_yp6nAv>%^Q{6-h$rI%)28ZD!G#l#bzy-(Xso*f&4=U3_d%FY`N3Z z%3ma*!On1x=bn!3y63;s`HQCuEswpfz424pgm5; zds$(xZ2gX`2@)!CDt@=7IX=qV@<>^?tY-HVi`P3>bxSB6=b5H+Jd5M-qon%3tIhY^ Xx4fbr^xK1hfq}u()z4*}Q$iB}&qZN6 literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_xform_uniform.png b/tools/editor/icons/icon_graph_xform_uniform.png new file mode 100644 index 0000000000000000000000000000000000000000..94c9759b2575bfefda737c63cabb3fab98b852c3 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(|vqv>CK-B;8-e zz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns~;XJlvA=X}s zp1uG7xm?D911v8-OJpBdo%K%Y68nTtGF%G62h`ItldhfeIOB09=zw=}f7aG4 z)q7`so_zP~l-v~a@5-hKfx^qvZ=8NtvBYlvN`Lh`4+TQ&JIjtIr)+OtwJ5Ch@4xdN zAs>samTtd!;db86b7|+bcU|nLGWem_c9<`$@pR3<{6kDrwwuV;o?cr%J@2Ix$NK}) zcQ;IX=GM)(gz3YgRhAP>*<-e8GR|D}EWXm-^%DQi*{2v77#KWV{an^LB{Ts5h5n5L literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_graph_xform_vec_func.png b/tools/editor/icons/icon_graph_xform_vec_func.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ba528896ee092ca418d38512f8d395ac8830de GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVpOKweMbl3F(g6krMj=lZ#}JM4cPDN1aw?Q* z-G6_+cE^)T(k%D9SMTm_7W~2VD2R8L$JQTgH(xAzk>F|}dgaXmw_q1r#|1a6U7YW} z+q--r)AT#9b?%oucwF${{}TJJ?0Y>wFkG1bqyO(pdxnD5UUv%vSXO)TFtRvrh$@#6 z2^X8Yl5>K~N!^A=`c}c0U;8$5yxbEw>ncN)@PC%gdo?=E&aPn)*t^e`xkdkd_m?U* zV{Hr1>1$Y=dCQkbp6tY(&^o&u946{TT|AVzl&8KO; zJZE}pv--m9g3^Lg&+y()Z#WgyGMO#Ti%yq3zD3qSXqU2M+ysBSnAh&<`%UDP=g!>t m+4j`BC6}Au-aIQ`bw!=twD0aC*A>xvXFdgVpOKweN$aDF${z*>Mr%(O#}JM4XD9CW3rQ3? zQvX@8o~tn+KyZ@og_QkC9~m_|Zh9zQHA|D0OJJV5l(&DwM2|IQ3U}=orna`;I<@X3 ztKQUwOPU;GPClXHHsvSikV?_x}GH8CO3~`ku_PU|K56ZHeN# zTHn?4F0Xoim9QupN%#`}1R6OCjg@6W5X znVDab9C+(Z?1R-yq&A32-Hn(~p>DXa{ivCN_U7v^jy+Oay4xYcJ8Hk@N?rkmec}t5 z6<)GBOuWKqBi2+eIbTLjPGVng>xZQ#cD0t1r0b>Le5p)Uwf}cFTWoVqFdgVpOKweNy2h+X$=Ddqp_!pV~EE2vlI8~J12@9 ztAC!mRaRYC!bP)hpSoW)l*E!1Fl@Y|H=+rrbAwldY3d4kb1r-y0VF7NDV)l3$- zaKTe~R?IbqIOoeh%C1V@pa1{mo7vt6r>>gEtWmXX!&Hu6uIF$4(`SFUz4kxP`!|i1 UeB2G~vq9nQ>FVdQ&MBb@00a}N=l}o! literal 0 HcmV?d00001 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 @@ -383,6 +383,41 @@ void ShaderGraphView::_connection_request(const String& p_from, int p_from_slot, ur->commit_action(); +} + +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::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 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) { @@ -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;iget_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;iget_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)); } diff --git a/tools/editor/plugins/shader_graph_editor_plugin.h b/tools/editor/plugins/shader_graph_editor_plugin.h index 26dbd1ac6e..8be3b3293e 100644 --- a/tools/editor/plugins/shader_graph_editor_plugin.h +++ b/tools/editor/plugins/shader_graph_editor_plugin.h @@ -66,6 +66,8 @@ class ShaderGraphView : public Node { void _connection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot); + void _disconnection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot); + void _node_removed(int p_id); void _node_moved(const Vector2& p_from, const Vector2& p_to,int p_id); void _move_node(int p_id,const Vector2& p_to);