[dali_2.3.20] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / graphics / shaders / color-visual-shader.vert
1 INPUT mediump vec2 aPosition;
2 #if defined(IS_REQUIRED_ROUNDED_CORNER) || defined(IS_REQUIRED_BORDERLINE) || defined(IS_REQUIRED_BLUR)
3 OUTPUT highp vec2 vPosition;
4 OUTPUT highp vec2 vRectSize;
5 OUTPUT highp vec2 vOptRectSize;
6 OUTPUT highp float vAliasMargin;
7 #ifdef IS_REQUIRED_ROUNDED_CORNER
8 OUTPUT highp vec4 vCornerRadius;
9 #endif
10 #endif
11
12 uniform highp mat4 uMvpMatrix;
13 uniform highp vec3 uSize;
14
15 #if defined(IS_REQUIRED_ROUNDED_CORNER) || defined(IS_REQUIRED_BORDERLINE) || defined(IS_REQUIRED_BLUR)
16 // Be used when we calculate anti-alias range near 1 pixel.
17 uniform highp vec3 uScale;
18 #endif
19
20 //Visual size and offset
21 uniform highp vec2 offset;
22 uniform highp vec2 size;
23 uniform mediump vec4 offsetSizeMode;
24 uniform mediump vec2 origin;
25 uniform mediump vec2 anchorPoint;
26 #ifdef IS_REQUIRED_BLUR
27 uniform highp float blurRadius;
28 #elif defined(IS_REQUIRED_BORDERLINE)
29 uniform highp float borderlineWidth;
30 uniform highp float borderlineOffset;
31 #endif
32 #ifdef IS_REQUIRED_ROUNDED_CORNER
33 uniform highp vec4 cornerRadius;
34 uniform mediump float cornerRadiusPolicy;
35 #endif
36 uniform highp vec2 extraSize;
37
38 vec4 ComputeVertexPosition()
39 {
40   highp vec2 visualSize = mix(size * uSize.xy, size, offsetSizeMode.zw ) + extraSize;
41   highp vec2 visualOffset = mix(offset * uSize.xy, offset, offsetSizeMode.xy);
42
43 #if defined(IS_REQUIRED_ROUNDED_CORNER) || defined(IS_REQUIRED_BORDERLINE) || defined(IS_REQUIRED_BLUR)
44   vRectSize = visualSize * 0.5;
45   vOptRectSize = vRectSize;
46
47   // Set soft anti-alias range at most 10% of visual size.
48   // The range should be inverse proportion with scale of view.
49   // To avoid divid-by-zero, let we allow minimum scale value is 0.001 (0.1%)
50   vAliasMargin = min(1.0, max(visualSize.x, visualSize.y) * 0.1) / max(0.001, max(uScale.x, uScale.y));
51
52   highp float vertexMargin = 0.0;
53 #endif
54
55 #ifdef IS_REQUIRED_ROUNDED_CORNER
56 #ifdef IS_REQUIRED_BLUR
57   highp float maxSize = max(visualSize.x, visualSize.y);
58   highp float minSize = min(visualSize.x, visualSize.y);
59 #elif defined(IS_REQUIRED_BORDERLINE)
60   highp float maxSize = max(visualSize.x, visualSize.y) + (1.0 + clamp(borderlineOffset, -1.0, 1.0)) * borderlineWidth;
61   highp float minSize = min(visualSize.x, visualSize.y) + (1.0 + clamp(borderlineOffset, -1.0, 1.0)) * borderlineWidth;
62 #else
63   highp float maxSize = max(visualSize.x, visualSize.y);
64   highp float minSize = min(visualSize.x, visualSize.y);
65 #endif
66   vCornerRadius = mix(cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
67   vCornerRadius = min(vCornerRadius, minSize * 0.5);
68   // Optimize fragment shader. 0.2929 ~= 1.0 - sqrt(0.5)
69   highp float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
70   highp float minRadius = min(min(vCornerRadius.x, vCornerRadius.y), min(vCornerRadius.z, vCornerRadius.w));
71   vOptRectSize -= 0.2929 * maxRadius + 1.0;
72
73   // Set vertex margin as vAliasMargin if we need to make some more fragments for alias.
74 #ifdef IS_REQUIRED_BLUR
75   // Let we always increase alias margin for blur case
76   vertexMargin = 2.0 * vAliasMargin;
77 #else
78   // Do not increase margin if the minRadius is small enough rather than maxSize.
79   // TODO : We should change the magic parameter, 0.49
80   vertexMargin = 2.0 * vAliasMargin * smoothstep(maxSize * 0.49, maxSize * 0.5, minRadius);
81 #endif
82 #endif
83
84 #ifdef IS_REQUIRED_BLUR
85   vPosition = aPosition * (visualSize + 2.0 * blurRadius + vertexMargin);
86   vOptRectSize -= blurRadius + 1.0;
87 #elif defined(IS_REQUIRED_BORDERLINE)
88   vPosition = aPosition * (visualSize + (1.0 + clamp(borderlineOffset, -1.0, 1.0))* borderlineWidth + vertexMargin);
89   vOptRectSize -= (1.0 - clamp(borderlineOffset, -1.0, 1.0)) * 0.5 * borderlineWidth + 1.0;
90 #elif defined(IS_REQUIRED_ROUNDED_CORNER)
91   vPosition = aPosition * (visualSize + vertexMargin);
92 #else
93   highp vec2 vPosition = aPosition * visualSize;
94 #endif
95   return vec4(vPosition + anchorPoint * visualSize + visualOffset + origin * uSize.xy, 0.0, 1.0);
96 }
97
98 void main()
99 {
100   gl_Position = uMvpMatrix * ComputeVertexPosition();
101 }