将widget和其子控件进行灰度和正常进行显示切换
LayoutConfig.setWidgetGrayEffect = function (widget,enable, shaderName = undefined) {
var shader = LayoutConfig.getShaderMap(shaderName || (enable ? "ui_gray" : "ui_normal"));
if (widget) {
var children = widget.getChildren();
for (var i in children) {
LayoutConfig.setWidgetGrayEffect(children[i], enable);
}
if (!widget.getString) {
widget.setShaderProgram(shader);
}
if (widget.getVirtualRenderer) {
var children = widget.getVirtualRenderer().getChildren();
for (var i in children) {
LayoutConfig.setWidgetGrayEffect(children[i], enable);
}
if (!widget.getVirtualRenderer().getString) {
widget.getVirtualRenderer().setShaderProgram(shader);
}
}
}
};
LayoutConfig.getShaderMap = function (n) {
var _s = this._shaderMap[n];
if (_s) {
//cc.log("LayoutConfig.getShaderMap: " + n + " Cache");
return _s;
}
var b_n = "res/shader/" + n;
var v_n = b_n + ".vsh";
var f_n = b_n + ".fsh";
_s = new cc.GLProgram(v_n, f_n);
_s.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
_s.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
_s.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
_s.link();
_s.updateUniforms();
this._shaderMap[n] = _s;
//cc.log("LayoutConfig.getShaderMap: " + n + " New");
return _s;
};
ui_gray.fsh
#ifdef GL_ES
precision lowp float;
#endif
varying vec2 v_texCoord;
void main()
{
vec4 c = texture2D(CC_Texture0, v_texCoord);
float grey = dot(c.rgb, vec3(0.4, 0.4, 0.2));
gl_FragColor = vec4(grey, grey, grey, c.a);
}
ui_gray.vsh
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
#ifdef GL_ES
varying mediump vec2 v_texCoord;
#else
varying vec2 v_texCoord;
#endif
void main()
{
gl_Position = CC_PMatrix * a_position;
v_texCoord = a_texCoord;
}
ui_normal.fsh
#ifdef GL_ES
precision lowp float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
gl_FragColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
}
ui_normal.vsh
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif
void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}