summaryrefslogtreecommitdiff
path: root/scene/gui
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui')
-rw-r--r--scene/gui/color_picker.cpp49
-rw-r--r--scene/gui/control.cpp94
-rw-r--r--scene/gui/control.h6
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);