diff options
Diffstat (limited to 'scene/gui')
-rw-r--r-- | scene/gui/color_picker.cpp | 49 | ||||
-rw-r--r-- | scene/gui/control.cpp | 94 | ||||
-rw-r--r-- | scene/gui/control.h | 6 |
3 files changed, 105 insertions, 44 deletions
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 1bdb6c458f..2acb7b4bfd 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -38,6 +38,10 @@ void ColorPicker::_notification(int p_what) { switch(p_what) { case NOTIFICATION_THEME_CHANGED: { + uv_material->set_shader(get_shader("uv_editor")); + uv_material->set_shader_param("H", h); + + w_material->set_shader(get_shader("w_editor")); _update_controls(); } break; @@ -337,55 +341,16 @@ ColorPicker::ColorPicker() : _update_color(); updating=false; - const char *uv_shader_code= - "vec3 nd1sl2=vec3(UV,0);\n" - "uniform float H=0;\n" - "float nd4sl0=H;\n" - "float nd7sl0=nd1sl2.x;\n" - "float nd7sl1=nd1sl2.y;\n" - "float nd7sl2=nd1sl2.z;\n" - "float nd2sl1def=-1;\n" - "float nd2sl0=nd7sl1*nd2sl1def;\n" - "float nd6sl1def=1;\n" - "float nd6sl0=nd2sl0+nd6sl1def;\n" - "vec3 nd3sl0=vec3(nd4sl0,nd7sl0,nd6sl0);\n" - "vec3 nd5sl0;\n" - "{\n" - " vec3 c = nd3sl0;\n" - " vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" - " vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n" - " nd5sl0=c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n" - "}\n" - "COLOR.rgb=nd5sl0;"; - - const char *w_shader_code= - "vec3 nd1sl2=vec3(UV,0);\n" - "float nd2sl0=nd1sl2.x;\n" - "float nd2sl1=nd1sl2.y;\n" - "float nd2sl2=nd1sl2.z;\n" - "float nd3sl1def=1;\n" - "float nd3sl2def=1;\n" - "vec3 nd3sl0=vec3(nd2sl1,nd3sl1def,nd3sl2def);\n" - "vec3 nd6sl0;\n" - "{\n" - " vec3 c = nd3sl0;\n" - " vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" - " vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n" - " nd6sl0=c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n" - "}\n" - "COLOR.rgb=nd6sl0;"; - set_color(Color(1,1,1)); uv_material.instance(); - Ref<Shader> s_uv = memnew( Shader(Shader::MODE_CANVAS_ITEM) ); - s_uv->set_code("", uv_shader_code, ""); + Ref<Shader> s_uv = get_shader("uv_editor"); uv_material->set_shader(s_uv); uv_material->set_shader_param("H", h); w_material.instance(); - Ref<Shader> s_w = (memnew( Shader(Shader::MODE_CANVAS_ITEM) )); - s_w->set_code("", w_shader_code, ""); + + Ref<Shader> s_w = get_shader("w_editor"); w_material->set_shader(s_w); uv_edit->set_material(uv_material); diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index 5a8ecfeffe..e93b252979 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -140,6 +140,11 @@ bool Control::_set(const StringName& p_name, const Variant& p_value) { data.icon_override.erase(dname); notification(NOTIFICATION_THEME_CHANGED); update(); + } else if (name.begins_with("custom_shaders/")) { + String dname = name.get_slicec('/',1); + data.shader_override.erase(dname); + notification(NOTIFICATION_THEME_CHANGED); + update(); } else if (name.begins_with("custom_styles/")) { String dname = name.get_slicec('/',1); data.style_override.erase(dname); @@ -168,6 +173,10 @@ bool Control::_set(const StringName& p_name, const Variant& p_value) { String dname = name.get_slicec('/',1); notification(NOTIFICATION_THEME_CHANGED); add_icon_override(dname,p_value); + } else if (name.begins_with("custom_shaders/")) { + String dname = name.get_slicec('/',1); + add_shader_override(dname,p_value); + notification(NOTIFICATION_THEME_CHANGED); } else if (name.begins_with("custom_styles/")) { String dname = name.get_slicec('/',1); add_style_override(dname,p_value); @@ -220,6 +229,10 @@ bool Control::_get(const StringName& p_name,Variant &r_ret) const { String name = sname.get_slicec('/',1); r_ret= data.icon_override.has(name)?Variant(data.icon_override[name]):Variant(); + } else if (sname.begins_with("custom_shaders/")) { + String name = sname.get_slicec('/',1); + + r_ret= data.shader_override.has(name)?Variant(data.shader_override[name]):Variant(); } else if (sname.begins_with("custom_styles/")) { String name = sname.get_slicec('/',1); @@ -269,6 +282,18 @@ void Control::_get_property_list( List<PropertyInfo> *p_list) const { } { List<StringName> names; + theme->get_shader_list(get_type_name(),&names); + for(List<StringName>::Element *E=names.front();E;E=E->next()) { + + uint32_t hint= PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_CHECKABLE; + if (data.shader_override.has(E->get())) + hint|=PROPERTY_USAGE_STORAGE|PROPERTY_USAGE_CHECKED; + + p_list->push_back( PropertyInfo(Variant::OBJECT,"custom_shaders/"+E->get(),PROPERTY_HINT_RESOURCE_TYPE, "CanvasItemShader,CanvasItemShaderGraph",hint) ); + } + } + { + List<StringName> names; theme->get_stylebox_list(get_type_name(),&names); for(List<StringName>::Element *E=names.front();E;E=E->next()) { @@ -1384,6 +1409,35 @@ Ref<Texture> Control::get_icon(const StringName& p_name,const StringName& p_type } +Ref<Shader> Control::get_shader(const StringName& p_name,const StringName& p_type) const { + if (p_type==StringName()) { + + const Ref<Shader>* sdr = data.shader_override.getptr(p_name); + if (sdr) + return *sdr; + } + + StringName type = p_type?p_type:get_type_name(); + + // try with custom themes + Control *theme_owner = data.theme_owner; + + while(theme_owner) { + + if (theme_owner->data.theme->has_shader(p_name, type)) + return data.theme_owner->data.theme->get_shader(p_name, type ); + Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL; + + if (parent) + theme_owner=parent->data.theme_owner; + else + theme_owner=NULL; + + } + + return Theme::get_default()->get_shader( p_name, type ); +} + Ref<StyleBox> Control::get_stylebox(const StringName& p_name,const StringName& p_type) const { if (p_type==StringName()) { @@ -1530,7 +1584,37 @@ bool Control::has_icon(const StringName& p_name,const StringName& p_type) const } return Theme::get_default()->has_icon( p_name, type ); + +} + +bool Control::has_shader(const StringName &p_name, const StringName &p_type) const +{ + if (p_type==StringName()) { + const Ref<Shader>* sdr = data.shader_override.getptr(p_name); + if (sdr) + return true; + } + + StringName type = p_type?p_type:get_type_name(); + + // try with custom themes + Control *theme_owner = data.theme_owner; + + while(theme_owner) { + if (theme_owner->data.theme->has_shader(p_name, type)) + return true; + Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL; + + if (parent) + theme_owner=parent->data.theme_owner; + else + theme_owner=NULL; + + } + + return Theme::get_default()->has_shader( p_name, type ); + } bool Control::has_stylebox(const StringName& p_name,const StringName& p_type) const { @@ -1996,7 +2080,14 @@ void Control::add_icon_override(const StringName& p_name, const Ref<Texture>& p_ data.icon_override[p_name]=p_icon; notification(NOTIFICATION_THEME_CHANGED); update(); + +} +void Control::add_shader_override(const StringName &p_name, const Ref<Shader> &p_shader) { + ERR_FAIL_COND(p_shader.is_null()); + data.shader_override[p_name]=p_shader; + notification(NOTIFICATION_THEME_CHANGED); + update(); } void Control::add_style_override(const StringName& p_name, const Ref<StyleBox>& p_style) { @@ -2837,8 +2928,9 @@ void Control::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_theme","theme:Theme"),&Control::set_theme); ObjectTypeDB::bind_method(_MD("get_theme:Theme"),&Control::get_theme); - + ObjectTypeDB::bind_method(_MD("add_icon_override","name","texture:Texture"),&Control::add_icon_override); + ObjectTypeDB::bind_method(_MD("add_shader_override","name","shader:Shader"),&Control::add_shader_override); ObjectTypeDB::bind_method(_MD("add_style_override","name","stylebox:StyleBox"),&Control::add_style_override); ObjectTypeDB::bind_method(_MD("add_font_override","name","font:Font"),&Control::add_font_override); ObjectTypeDB::bind_method(_MD("add_color_override","name","color"),&Control::add_color_override); diff --git a/scene/gui/control.h b/scene/gui/control.h index 0ead632aab..4908b07295 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -144,6 +144,7 @@ private: NodePath focus_neighbour[4]; HashMap<StringName, Ref<Texture>, StringNameHasher > icon_override; + HashMap<StringName, Ref<Shader>, StringNameHasher > shader_override; HashMap<StringName, Ref<StyleBox>, StringNameHasher > style_override; HashMap<StringName, Ref<Font>, StringNameHasher > font_override; HashMap<StringName, Color, StringNameHasher > color_override; @@ -357,18 +358,21 @@ public: /* SKINNING */ void add_icon_override(const StringName& p_name, const Ref<Texture>& p_icon); + void add_shader_override(const StringName& p_name, const Ref<Shader>& p_shader); void add_style_override(const StringName& p_name, const Ref<StyleBox>& p_style); void add_font_override(const StringName& p_name, const Ref<Font>& p_font); void add_color_override(const StringName& p_name, const Color& p_color); void add_constant_override(const StringName& p_name, int p_constant); Ref<Texture> get_icon(const StringName& p_name,const StringName& p_type=StringName()) const; + Ref<Shader> get_shader(const StringName &p_name, const StringName &p_type=StringName()) const; Ref<StyleBox> get_stylebox(const StringName& p_name,const StringName& p_type=StringName()) const; Ref<Font> get_font(const StringName& p_name,const StringName& p_type=StringName()) const; Color get_color(const StringName& p_name,const StringName& p_type=StringName()) const; int get_constant(const StringName& p_name,const StringName& p_type=StringName()) const; bool has_icon(const StringName& p_name,const StringName& p_type=StringName()) const; + bool has_shader(const StringName& p_name,const StringName& p_type=StringName()) const; bool has_stylebox(const StringName& p_name,const StringName& p_type=StringName()) const; bool has_font(const StringName& p_name,const StringName& p_type=StringName()) const; bool has_color(const StringName& p_name,const StringName& p_type=StringName()) const; @@ -400,7 +404,7 @@ public: Control(); ~Control(); - + }; VARIANT_ENUM_CAST(Control::AnchorType); |