@solidtv/renderer 1.5.6 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/src/core/CoreNode.js +2 -2
  2. package/dist/src/core/CoreNode.js.map +1 -1
  3. package/dist/src/core/Stage.js +9 -1
  4. package/dist/src/core/Stage.js.map +1 -1
  5. package/dist/src/core/lib/WebGlContextWrapper.d.ts +17 -1
  6. package/dist/src/core/lib/WebGlContextWrapper.js +21 -0
  7. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  8. package/dist/src/core/lib/colorParser.d.ts +4 -1
  9. package/dist/src/core/lib/colorParser.js +16 -6
  10. package/dist/src/core/lib/colorParser.js.map +1 -1
  11. package/dist/src/core/platforms/web/WebPlatform.js +60 -50
  12. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  13. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +4 -0
  14. package/dist/src/core/renderers/canvas/CanvasRenderer.js +28 -13
  15. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  16. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +1 -0
  17. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  18. package/dist/src/core/renderers/webgl/SdfRenderOp.js +2 -2
  19. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -1
  20. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +43 -0
  21. package/dist/src/core/renderers/webgl/WebGlRenderer.js +109 -10
  22. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  23. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +21 -13
  24. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  25. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +8 -3
  26. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +12 -11
  27. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  28. package/dist/src/core/shaders/canvas/Rounded.js +3 -3
  29. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  30. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +3 -3
  31. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  32. package/dist/src/core/shaders/canvas/utils/render.js +3 -3
  33. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  34. package/dist/src/core/shaders/webgl/Border.js +12 -11
  35. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  36. package/dist/src/core/shaders/webgl/HolePunch.js +12 -5
  37. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  38. package/dist/src/core/shaders/webgl/LinearGradient.js +3 -19
  39. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  40. package/dist/src/core/shaders/webgl/RadialGradient.js +3 -20
  41. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  42. package/dist/src/core/shaders/webgl/RadialProgress.js +15 -23
  43. package/dist/src/core/shaders/webgl/RadialProgress.js.map +1 -1
  44. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +35 -32
  45. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  46. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +58 -45
  47. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  48. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +15 -13
  49. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  50. package/dist/src/core/shaders/webgl/Shadow.js +4 -5
  51. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  52. package/dist/src/core/text-rendering/SdfTextRenderer.js +23 -10
  53. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  54. package/dist/src/core/text-rendering/TextLayoutEngine.js +14 -2
  55. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -1
  56. package/dist/src/utils.js +1 -1
  57. package/dist/src/utils.js.map +1 -1
  58. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  59. package/package.json +1 -1
  60. package/src/core/CoreNode.ts +2 -2
  61. package/src/core/Stage.renderListUpdate.test.ts +73 -0
  62. package/src/core/Stage.ts +11 -1
  63. package/src/core/lib/WebGlContextWrapper.test.ts +23 -1
  64. package/src/core/lib/WebGlContextWrapper.ts +23 -1
  65. package/src/core/lib/colorParser.test.ts +46 -0
  66. package/src/core/lib/colorParser.ts +17 -6
  67. package/src/core/platforms/web/WebPlatform.ts +63 -52
  68. package/src/core/renderers/canvas/CanvasRenderer.test.ts +230 -0
  69. package/src/core/renderers/canvas/CanvasRenderer.ts +29 -15
  70. package/src/core/renderers/canvas/CanvasShaderNode.test.ts +73 -0
  71. package/src/core/renderers/canvas/CanvasShaderNode.ts +1 -0
  72. package/src/core/renderers/webgl/SdfRenderOp.ts +2 -2
  73. package/src/core/renderers/webgl/WebGlRenderer.reuseRenderOp.test.ts +122 -0
  74. package/src/core/renderers/webgl/WebGlRenderer.sdfBuffer.test.ts +302 -0
  75. package/src/core/renderers/webgl/WebGlRenderer.ts +151 -11
  76. package/src/core/renderers/webgl/WebGlShaderProgram.reuseRenderOp.test.ts +150 -0
  77. package/src/core/renderers/webgl/WebGlShaderProgram.ts +27 -15
  78. package/src/core/renderers/webgl/WebGlShaderProgram.uniformDedup.test.ts +4 -2
  79. package/src/core/renderers/webgl/internal/ShaderUtils.test.ts +124 -0
  80. package/src/core/renderers/webgl/internal/ShaderUtils.ts +14 -13
  81. package/src/core/shaders/canvas/Rounded.ts +3 -3
  82. package/src/core/shaders/canvas/RoundedWithShadow.ts +3 -3
  83. package/src/core/shaders/canvas/utils/render.ts +3 -3
  84. package/src/core/shaders/webgl/Border.ts +12 -11
  85. package/src/core/shaders/webgl/HolePunch.ts +12 -5
  86. package/src/core/shaders/webgl/LinearGradient.ts +3 -19
  87. package/src/core/shaders/webgl/RadialGradient.ts +3 -20
  88. package/src/core/shaders/webgl/RadialProgress.ts +15 -23
  89. package/src/core/shaders/webgl/RoundedWithBorder.ts +35 -32
  90. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +58 -45
  91. package/src/core/shaders/webgl/RoundedWithShadow.ts +15 -13
  92. package/src/core/shaders/webgl/Shadow.ts +4 -5
  93. package/src/core/text-rendering/SdfTextRenderer.test.ts +177 -0
  94. package/src/core/text-rendering/SdfTextRenderer.ts +38 -10
  95. package/src/core/text-rendering/TextLayoutEngine.ts +15 -2
  96. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +99 -0
  97. package/src/utils.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../../../src/core/shaders/canvas/utils/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../../../src/core/shaders/canvas/utils/render.ts"],"names":[],"mappings":"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"}
@@ -129,24 +129,25 @@ export const Border = {
129
129
  float outerDist = box(boxUv + v_outerBorderUv, v_outerSize - edgeWidth);
130
130
  float innerDist = box(boxUv + v_innerBorderUv, v_innerSize - edgeWidth);
131
131
 
132
- if(u_borderGap == 0.0) {
133
- float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
134
- float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
135
- resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
136
- resultColor = mix(resultColor, color, innerAlpha);
137
- gl_FragColor = resultColor * u_alpha;
138
- return;
139
- }
132
+ float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
133
+ float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
140
134
 
141
135
  float nodeDist = box(boxUv, v_halfDimensions - edgeWidth);
142
136
  float nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
143
137
 
144
138
  float borderDist = max(-innerDist, outerDist);
145
139
  float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);
146
- resultColor = mix(resultColor, color, nodeAlpha);
147
- resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
148
140
 
149
- gl_FragColor = resultColor * u_alpha;
141
+ // Branchless gap select -- Mali 400 serializes uniform branches, so both
142
+ // composites are computed and mix()-selected on hasGap instead.
143
+ vec4 resNoGap = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
144
+ resNoGap = mix(resNoGap, color, innerAlpha);
145
+
146
+ vec4 resGap = mix(resultColor, color, nodeAlpha);
147
+ resGap = mix(resGap, u_borderColor, borderAlpha * u_borderColor.a);
148
+
149
+ float hasGap = step(0.0001, abs(u_borderGap));
150
+ gl_FragColor = mix(resNoGap, resGap, hasGap) * u_alpha;
150
151
  }
151
152
  `,
152
153
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Border.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/Border.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAEf,MAAM,gCAAgC,CAAC;AAIxC,MAAM,CAAC,MAAM,MAAM,GAAiC;IAClD,KAAK,EAAE,cAAc,CAAC,KAAK;IAC3B,MAAM,CAAC,IAAI;QACT,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,CAAS,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,KAAM,CAAC,GAAa,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,KAAe,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EP;IACD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DT;CACF,CAAC"}
1
+ {"version":3,"file":"Border.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/Border.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAEf,MAAM,gCAAgC,CAAC;AAIxC,MAAM,CAAC,MAAM,MAAM,GAAiC;IAClD,KAAK,EAAE,cAAc,CAAC,KAAK;IAC3B,MAAM,CAAC,IAAI;QACT,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,CAAS,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,KAAM,CAAC,GAAa,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,KAAe,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EP;IACD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DT;CACF,CAAC"}
@@ -36,11 +36,18 @@ export const HolePunch = {
36
36
  void main() {
37
37
  vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
38
38
  vec2 p = (v_textureCoords.xy * u_dimensions.xy - u_pos) - u_size;
39
- vec4 r = u_radius;
40
- r.xy = (p.x > 0.0) ? r.yz : r.xw;
41
- r.x = (p.y > 0.0) ? r.y : r.x;
42
- p = abs(p) - u_size + r.x;
43
- float dist = min(max(p.x, p.y), 0.0) + length(max(p, 0.0)) - r.x + 2.0;
39
+
40
+ // Branchless radius selection based on quadrant
41
+ // x: TL, y: TR, z: BR, w: BL
42
+ vec2 stepVal = step(vec2(0.0), p);
43
+ float r = mix(
44
+ mix(u_radius.x, u_radius.y, stepVal.x),
45
+ mix(u_radius.w, u_radius.z, stepVal.x),
46
+ stepVal.y
47
+ );
48
+
49
+ p = abs(p) - u_size + r;
50
+ float dist = min(max(p.x, p.y), 0.0) + length(max(p, 0.0)) - r + 2.0;
44
51
  float roundedAlpha = 1.0 - smoothstep(0.0, u_pixelRatio, dist);
45
52
  gl_FragColor = mix(color, vec4(0.0), min(color.a, roundedAlpha));
46
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HolePunch.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/HolePunch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EACL,iBAAiB,GAElB,MAAM,mCAAmC,CAAC;AAI3C,MAAM,CAAC,MAAM,SAAS,GAAoC;IACxD,KAAK,EAAE,iBAAiB,CAAC,KAAK;IAC9B,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,0DAA0D;QAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAEvD,IAAI,CAAC,UAAU,CACb,UAAU,EACV,uBAAuB,CAAC,KAAK,CAAC,MAAc,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAChE,CAAC;IACJ,CAAC;IACD,eAAe,CAAC,KAAqB;QACnC,OAAO,eAAe,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCT;CACF,CAAC"}
1
+ {"version":3,"file":"HolePunch.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/HolePunch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EACL,iBAAiB,GAElB,MAAM,mCAAmC,CAAC;AAI3C,MAAM,CAAC,MAAM,SAAS,GAAoC;IACxD,KAAK,EAAE,iBAAiB,CAAC,KAAK;IAC9B,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,0DAA0D;QAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAEvD,IAAI,CAAC,UAAU,CACb,UAAU,EACV,uBAAuB,CAAC,KAAK,CAAC,MAAc,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAChE,CAAC;IACJ,CAAC;IACD,eAAe,CAAC,KAAqB;QACnC,OAAO,eAAe,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCT;CACF,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { getNormalizedRgbaComponents } from '../../lib/utils.js';
2
2
  import { LinearGradientTemplate, } from '../templates/LinearGradientTemplate.js';
3
+ import { genGradientColors } from '../../renderers/webgl/internal/ShaderUtils.js';
3
4
  export const LinearGradient = {
4
5
  props: LinearGradientTemplate.props,
5
6
  update(node) {
@@ -45,7 +46,6 @@ export const LinearGradient = {
45
46
  # endif
46
47
 
47
48
  #define MAX_STOPS ${props.colors.length}
48
- #define LAST_STOP ${props.colors.length - 1}
49
49
 
50
50
  uniform float u_alpha;
51
51
 
@@ -61,24 +61,8 @@ export const LinearGradient = {
61
61
 
62
62
  vec4 getGradientColor(float dist) {
63
63
  dist = clamp(dist, 0.0, 1.0);
64
-
65
- if(dist <= u_stops[0]) {
66
- return u_colors[0];
67
- }
68
-
69
- if(dist >= u_stops[LAST_STOP]) {
70
- return u_colors[LAST_STOP];
71
- }
72
-
73
- for(int i = 0; i < LAST_STOP; i++) {
74
- float left = u_stops[i];
75
- float right = u_stops[i + 1];
76
- if(dist >= left && dist <= right) {
77
- float lDist = smoothstep(left, right, dist);
78
- return mix(u_colors[i], u_colors[i + 1], lDist);
79
- }
80
- }
81
- return u_colors[LAST_STOP];
64
+ ${genGradientColors(props.colors.length)}
65
+ return colorOut;
82
66
  }
83
67
 
84
68
  void main() {
@@ -1 +1 @@
1
- {"version":3,"file":"LinearGradient.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/LinearGradient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LinearGradient.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/LinearGradient.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { getNormalizedRgbaComponents } from '../../lib/utils.js';
2
2
  import { RadialGradientTemplate, } from '../templates/RadialGradientTemplate.js';
3
+ import { genGradientColors } from '../../renderers/webgl/internal/ShaderUtils.js';
3
4
  export const RadialGradient = {
4
5
  props: RadialGradientTemplate.props,
5
6
  update(node) {
@@ -26,7 +27,6 @@ export const RadialGradient = {
26
27
  # endif
27
28
 
28
29
  #define MAX_STOPS ${props.colors.length}
29
- #define LAST_STOP ${props.colors.length - 1}
30
30
 
31
31
  uniform float u_alpha;
32
32
  uniform vec2 u_dimensions;
@@ -45,25 +45,8 @@ export const RadialGradient = {
45
45
 
46
46
  vec4 getGradientColor(float dist) {
47
47
  dist = clamp(dist, 0.0, 1.0);
48
-
49
- if(dist <= u_stops[0]) {
50
- return u_colors[0];
51
- }
52
-
53
- if(dist >= u_stops[LAST_STOP]) {
54
- return u_colors[LAST_STOP];
55
- }
56
-
57
- for(int i = 0; i < LAST_STOP; i++) {
58
- float left = u_stops[i];
59
- float right = u_stops[i + 1];
60
- if(dist >= left && dist <= right) {
61
- float lDist = smoothstep(left, right, dist);
62
- return mix(u_colors[i], u_colors[i + 1], lDist);
63
- }
64
- }
65
-
66
- return u_colors[LAST_STOP];
48
+ ${genGradientColors(props.colors.length)}
49
+ return colorOut;
67
50
  }
68
51
 
69
52
  void main() {
@@ -1 +1 @@
1
- {"version":3,"file":"RadialGradient.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RadialGradient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,sBAAsB,GAEvB,MAAM,wCAAwC,CAAC;AAIhD,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,KAAK,EAAE,sBAAsB,CAAC,KAAK;IACnC,MAAM,CAAC,IAAc;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC;QAC1B,IAAI,CAAC,SAAS,CACZ,cAAc,EACd,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EACvB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CACxB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,2BAA2B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,eAAe,CAAC,KAA0B;QACxC,OAAO,UAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IACD,QAAQ,CAAC,QAAuB,EAAE,KAA0B;QAC1D,OAAO;;;;;;;0BAOe,KAAK,CAAC,MAAM,CAAC,MAAM;0BACnB,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiD5C,CAAC;IACJ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"RadialGradient.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RadialGradient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,sBAAsB,GAEvB,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAElF,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,KAAK,EAAE,sBAAsB,CAAC,KAAK;IACnC,MAAM,CAAC,IAAc;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC;QAC1B,IAAI,CAAC,SAAS,CACZ,cAAc,EACd,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EACvB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CACxB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,2BAA2B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,eAAe,CAAC,KAA0B;QACxC,OAAO,UAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IACD,QAAQ,CAAC,QAAuB,EAAE,KAA0B;QAC1D,OAAO;;;;;;;0BAOe,KAAK,CAAC,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;;;;;UAmBnC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;;;;;;;;;;;;;KAa3C,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { getNormalizedRgbaComponents } from '../../lib/utils.js';
2
2
  import { RadialProgressTemplate, } from '../templates/RadialProgressTemplate.js';
3
+ import { genGradientColors } from '../../renderers/webgl/internal/ShaderUtils.js';
3
4
  export const RadialProgress = {
4
5
  props: RadialProgressTemplate.props,
5
6
  time: true,
@@ -38,7 +39,6 @@ export const RadialProgress = {
38
39
  # endif
39
40
 
40
41
  #define MAX_STOPS ${maxStops}
41
- #define LAST_STOP ${maxStops - 1}
42
42
  #define CAP_ROUND ${props.cap}
43
43
  #define HAS_TRACK ${props.trackColor !== 0 ? 1 : 0}
44
44
 
@@ -68,22 +68,8 @@ export const RadialProgress = {
68
68
 
69
69
  vec4 getGradientColor(float dist) {
70
70
  dist = clamp(dist, 0.0, 1.0);
71
-
72
- if (dist <= u_stops[0]) {
73
- return u_colors[0];
74
- }
75
- if (dist >= u_stops[LAST_STOP]) {
76
- return u_colors[LAST_STOP];
77
- }
78
- for (int i = 0; i < LAST_STOP; i++) {
79
- float left = u_stops[i];
80
- float right = u_stops[i + 1];
81
- if (dist >= left && dist <= right) {
82
- float lDist = smoothstep(left, right, dist);
83
- return mix(u_colors[i], u_colors[i + 1], lDist);
84
- }
85
- }
86
- return u_colors[LAST_STOP];
71
+ ${genGradientColors(maxStops)}
72
+ return colorOut;
87
73
  }
88
74
 
89
75
  // Coverage of a disc centered at \`c\` with radius \`r\` at pixel \`p\` (with 1px AA)
@@ -97,9 +83,13 @@ export const RadialProgress = {
97
83
  // Effective progress: when u_duration > 0 the shader self-animates from
98
84
  // u_time, otherwise we use the static u_progress prop. countdown == 1
99
85
  // drains (1 -> 0), countdown == 0 fills (0 -> 1).
100
- float cyclePos = u_duration > 0.0 ? fract(u_time / u_duration) : 0.0;
101
- float animProgress = u_countdown > 0.5 ? 1.0 - cyclePos : cyclePos;
102
- float progress = u_duration > 0.0 ? animProgress : u_progress;
86
+ // Branchless (Mali 400 serializes uniform branches): the mix()-guarded
87
+ // denominator keeps the division finite when u_duration == 0 -- a
88
+ // max()-clamped epsilon would overflow fp16 mediump to Inf/NaN.
89
+ float hasDuration = step(0.0001, u_duration);
90
+ float cyclePos = fract(u_time / mix(1.0, u_duration, hasDuration)) * hasDuration;
91
+ float animProgress = mix(cyclePos, 1.0 - cyclePos, step(0.5, u_countdown));
92
+ float progress = mix(u_progress, animProgress, hasDuration);
103
93
 
104
94
  vec2 p = v_nodeCoords.xy * u_dimensions - u_center;
105
95
  float dist = length(p);
@@ -116,7 +106,7 @@ export const RadialProgress = {
116
106
 
117
107
  // Filled arc coverage (1 if in filled arc, else 0). When progress >= 1 the
118
108
  // whole ring is filled regardless of \`t\` -- guards against the mod() seam.
119
- float arcCoverage = progress >= 1.0 ? 1.0 : step(t, progress);
109
+ float arcCoverage = max(step(1.0, progress), step(t, progress));
120
110
  float fillCoverage = ringCoverage * arcCoverage;
121
111
 
122
112
  #if CAP_ROUND
@@ -132,8 +122,10 @@ export const RadialProgress = {
132
122
  #endif
133
123
 
134
124
  // Sample gradient. Normalize \`t\` to the *filled* portion so the gradient
135
- // spans the visible arc end-to-end regardless of progress.
136
- float gradT = progress > 0.0 ? clamp(t / progress, 0.0, 1.0) : 0.0;
125
+ // spans the visible arc end-to-end regardless of progress. mix()-guarded
126
+ // denominator: safe at progress == 0 without fp16 overflow.
127
+ float hasProgress = step(0.000001, progress);
128
+ float gradT = clamp(t / mix(1.0, progress, hasProgress), 0.0, 1.0) * hasProgress;
137
129
  vec4 fillCol = getGradientColor(gradT);
138
130
 
139
131
  // Composite: track under fill (if track enabled), both gated by ringCoverage.
@@ -1 +1 @@
1
- {"version":3,"file":"RadialProgress.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RadialProgress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RadialProgress.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RadialProgress.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,15 @@ export const RoundedWithBorder = {
53
53
  v_innerSize = vec2(0.0);
54
54
  v_outerSize = vec2(0.0);
55
55
 
56
+ // Defaults for the zero-border case: the fragment shader is branchless
57
+ // and always evaluates the border SDFs, so every varying must carry a
58
+ // finite value (an unwritten varying is undefined and can poison the
59
+ // final mix() with NaN).
60
+ v_outerBorderUv = vec2(0.0);
61
+ v_innerBorderUv = vec2(0.0);
62
+ v_outerBorderRadius = u_radius;
63
+ v_innerBorderRadius = u_radius;
64
+
56
65
  if(borderZero == 0.0) {
57
66
  vec4 adjustedBorderWidth = u_borderWidth - 1.0 + clamp(u_borderWidth, -1.0, 1.0);
58
67
 
@@ -61,9 +70,6 @@ export const RoundedWithBorder = {
61
70
  float borderBottom = adjustedBorderWidth.z;
62
71
  float borderLeft = adjustedBorderWidth.w;
63
72
 
64
- v_outerBorderUv = vec2(0.0);
65
- v_innerBorderUv = vec2(0.0);
66
-
67
73
  vec2 borderSize = vec2(borderRight + borderLeft, borderTop + borderBottom);
68
74
  vec2 extraSize = borderSize * u_borderAlign;
69
75
  float gapLeft = step(0.001, borderLeft) * u_borderGap;
@@ -148,52 +154,49 @@ export const RoundedWithBorder = {
148
154
  varying vec4 v_outerBorderRadius;
149
155
  varying vec2 v_halfDimensions;
150
156
 
157
+ // Branchless quadrant radius select (r: x TL, y TR, z BR, w BL) --
158
+ // Mali 400-class fragment pipelines serialize any branch, ternaries included.
159
+ float quadRadius(vec2 p, vec4 r) {
160
+ vec2 stepVal = step(vec2(0.0), p);
161
+ return mix(mix(r.x, r.y, stepVal.x), mix(r.w, r.z, stepVal.x), stepVal.y);
162
+ }
163
+
151
164
  float roundedBox(vec2 p, vec2 s, vec4 r) {
152
- r.xy = (p.x > 0.0) ? r.yz : r.xw;
153
- r.x = (p.y > 0.0) ? r.y : r.x;
154
- vec2 q = abs(p) - s + r.x;
155
- return (min(max(q.x, q.y), 0.0) + length(max(q, 0.0))) - r.x;
165
+ float rad = quadRadius(p, r);
166
+ vec2 q = abs(p) - s + rad;
167
+ return (min(max(q.x, q.y), 0.0) + length(max(q, 0.0))) - rad;
156
168
  }
157
169
 
158
170
  void main() {
159
171
  vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
160
- vec4 resultColor = vec4(0.0);
161
172
  vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
162
173
  float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));
163
174
  float edgeWidth = 1.0 / u_pixelRatio;
164
175
 
165
- float nodeDist;
166
- float nodeAlpha;
167
-
168
- if(borderZero == 1.0) {
169
- nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
170
- nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
171
- gl_FragColor = (color * nodeAlpha) * u_alpha;
172
- return;
173
- }
176
+ float nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
177
+ float nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
174
178
 
175
179
  float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - edgeWidth, v_outerBorderRadius);
176
180
  float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - edgeWidth, v_innerBorderRadius);
177
-
178
- if(u_borderGap == 0.0) {
179
- float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
180
- float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
181
- resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
182
- resultColor = mix(resultColor, color, innerAlpha);
183
- gl_FragColor = resultColor * u_alpha;
184
- return;
185
- }
186
-
187
- nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
188
- nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
181
+ float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
189
182
  float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
190
- float gapAlpha = max(0.0, innerAlpha - nodeAlpha);
191
183
 
184
+ float gapAlpha = max(0.0, innerAlpha - nodeAlpha);
192
185
  float borderDist = max(-innerDist, outerDist);
193
186
  float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);
194
187
 
195
- resultColor = (color * nodeAlpha) + (u_fillColor * gapAlpha);
196
- resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
188
+ // Branchless path select -- Mali 400 serializes uniform branches, so all
189
+ // three composites (no gap / gap / zero border) are computed and
190
+ // mix()-selected instead of if/else'd.
191
+ vec4 resNoGap = mix(vec4(0.0), u_borderColor, outerAlpha * u_borderColor.a);
192
+ resNoGap = mix(resNoGap, color, innerAlpha);
193
+
194
+ vec4 resGap = (color * nodeAlpha) + (u_fillColor * gapAlpha);
195
+ resGap = mix(resGap, u_borderColor, borderAlpha * u_borderColor.a);
196
+
197
+ float hasGap = step(0.0001, abs(u_borderGap));
198
+ vec4 resultColor = mix(resNoGap, resGap, hasGap);
199
+ resultColor = mix(resultColor, color * nodeAlpha, borderZero);
197
200
  gl_FragColor = resultColor * u_alpha;
198
201
  }
199
202
  `,
@@ -1 +1 @@
1
- {"version":3,"file":"RoundedWithBorder.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RoundedWithBorder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,yBAAyB,GAE1B,MAAM,2CAA2C,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAA4C;IACxE,KAAK,EAAE,yBAAyB,CAAC,KAAK;IACtC,MAAM,CAAC,IAAc;QACnB,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,KAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,UAAU,CAAS,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,KAAM,CAAC,YAAY,CAAW,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,cAAc,CAAW,CAAC,CAAC;QAEvE,IAAI,CAAC,UAAU,CACb,UAAU,EACV,uBAAuB,CAAC,IAAI,CAAC,KAAM,CAAC,MAAc,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGP;IACD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFT;CACF,CAAC"}
1
+ {"version":3,"file":"RoundedWithBorder.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RoundedWithBorder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,yBAAyB,GAE1B,MAAM,2CAA2C,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAA4C;IACxE,KAAK,EAAE,yBAAyB,CAAC,KAAK;IACtC,MAAM,CAAC,IAAc;QACnB,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,KAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,UAAU,CAAS,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,KAAM,CAAC,YAAY,CAAW,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,cAAc,CAAW,CAAC,CAAC;QAEvE,IAAI,CAAC,UAAU,CACb,UAAU,EACV,uBAAuB,CAAC,IAAI,CAAC,KAAM,CAAC,MAAc,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+GP;IACD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6ET;CACF,CAAC"}
@@ -58,6 +58,15 @@ export const RoundedWithBorderAndShadow = {
58
58
  v_innerSize = vec2(0.0);
59
59
  v_outerSize = vec2(0.0);
60
60
 
61
+ // Defaults for the zero-border case: the fragment shader is branchless
62
+ // and always evaluates the border SDFs, so every varying must carry a
63
+ // finite value (an unwritten varying is undefined and can poison the
64
+ // final mix() with NaN).
65
+ v_outerBorderUv = vec2(0.0);
66
+ v_innerBorderUv = vec2(0.0);
67
+ v_outerBorderRadius = u_radius;
68
+ v_innerBorderRadius = u_radius;
69
+
61
70
  if(borderZero == 0.0) {
62
71
  vec4 adjustedBorderWidth = u_borderWidth - 1.0 + clamp(u_borderWidth, -1.0, 1.0);
63
72
 
@@ -66,9 +75,6 @@ export const RoundedWithBorderAndShadow = {
66
75
  float borderBottom = adjustedBorderWidth.z;
67
76
  float borderLeft = adjustedBorderWidth.w;
68
77
 
69
- v_outerBorderUv = vec2(0.0);
70
- v_innerBorderUv = vec2(0.0);
71
-
72
78
  vec2 borderSize = vec2(borderRight + borderLeft, borderTop + borderBottom);
73
79
  vec2 extraSize = borderSize * u_borderAlign;
74
80
  float gapLeft = step(0.001, borderLeft) * u_borderGap;
@@ -153,67 +159,74 @@ export const RoundedWithBorderAndShadow = {
153
159
  varying vec4 v_outerBorderRadius;
154
160
  varying vec2 v_halfDimensions;
155
161
 
162
+ // Branchless quadrant radius select (r: x TL, y TR, z BR, w BL) --
163
+ // Mali 400-class fragment pipelines serialize any branch, ternaries included.
164
+ float quadRadius(vec2 p, vec4 r) {
165
+ vec2 stepVal = step(vec2(0.0), p);
166
+ return mix(mix(r.x, r.y, stepVal.x), mix(r.w, r.z, stepVal.x), stepVal.y);
167
+ }
168
+
156
169
  float roundedBox(vec2 p, vec2 s, vec4 r) {
157
- r.xy = (p.x > 0.0) ? r.yz : r.xw;
158
- r.x = (p.y > 0.0) ? r.y : r.x;
159
- vec2 q = abs(p) - s + r.x;
160
- return (min(max(q.x, q.y), 0.0) + length(max(q, 0.0))) - r.x;
170
+ float rad = quadRadius(p, r);
171
+ vec2 q = abs(p) - s + rad;
172
+ return (min(max(q.x, q.y), 0.0) + length(max(q, 0.0))) - rad;
161
173
  }
162
174
 
163
175
  float shadowBox(vec2 p, vec2 s, vec4 r) {
164
- r.xy = (p.x > 0.0) ? r.yz : r.xw;
165
- r.x = (p.y > 0.0) ? r.y : r.x;
166
- vec2 q = abs(p) - s + r.x;
167
- float dist = min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - r.x;
176
+ float rad = quadRadius(p, r);
177
+ vec2 q = abs(p) - s + rad;
178
+ float dist = min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - rad;
168
179
  return 1.0 - smoothstep(-u_shadow.w, u_shadow.w + u_shadow.z, dist);
169
180
  }
170
181
 
171
182
  void main() {
172
183
  vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
173
- vec4 resultColor = vec4(0.0);
174
184
  vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
175
185
  float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));
176
186
  float edgeWidth = 1.0 / u_pixelRatio;
177
- float nodeDist;
178
- float nodeAlpha;
179
- float shadowAlpha;
180
-
181
- if(borderZero == 1.0) {
182
- nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
183
- nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
184
- shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - edgeWidth, u_radius + u_shadow.z);
185
- resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
186
- gl_FragColor = mix(resultColor, color, nodeAlpha) * u_alpha;
187
- return;
188
- }
189
187
 
190
- if(v_outerSize.x > v_halfDimensions.x || v_outerSize.y > v_halfDimensions.y) {
191
- shadowAlpha = shadowBox(boxUv + v_outerBorderUv - u_shadow.xy, v_outerSize + u_shadow.w - edgeWidth, v_outerBorderRadius + u_shadow.z);
192
- }
193
- else {
194
- shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - edgeWidth, u_radius + u_shadow.z);
195
- }
188
+ float nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
189
+ float nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
190
+
191
+ // Shadow geometry select, branchless: when the border grows the quad
192
+ // beyond the node (outer size exceeds half dimensions on either axis)
193
+ // the shadow hugs the outer border box, otherwise the node box. This
194
+ // replaces a varying-driven if/else (worst offender: diverges per
195
+ // fragment) with a step()/mix() parameter select into ONE shadowBox call.
196
+ // When borderZero, v_outerSize is vec2(0.0) so outerSel is 0 and the
197
+ // node-box parameters win, matching the old zero-border path.
198
+ float outerSel = max(
199
+ step(v_halfDimensions.x, v_outerSize.x),
200
+ step(v_halfDimensions.y, v_outerSize.y)
201
+ );
202
+ float shadowAlpha = shadowBox(
203
+ boxUv + v_outerBorderUv * outerSel - u_shadow.xy,
204
+ mix(v_halfDimensions, v_outerSize, outerSel) + u_shadow.w - edgeWidth,
205
+ mix(u_radius, v_outerBorderRadius, outerSel) + u_shadow.z
206
+ );
196
207
 
197
208
  float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - edgeWidth, v_outerBorderRadius);
198
209
  float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - edgeWidth, v_innerBorderRadius);
210
+ float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
211
+ float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
199
212
 
200
- if(u_borderGap == 0.0) {
201
- float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
202
- float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
203
- resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
204
- resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
205
- resultColor = mix(resultColor, color, innerAlpha);
206
- gl_FragColor = resultColor * u_alpha;
207
- return;
208
- }
209
-
210
- nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
211
- nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
212
213
  float borderDist = max(-innerDist, outerDist);
213
214
  float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);
214
- resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
215
- resultColor = mix(resultColor, color, nodeAlpha);
216
- resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
215
+
216
+ // Branchless path select -- Mali 400 serializes uniform branches, so all
217
+ // three composites (no gap / gap / zero border) are computed and
218
+ // mix()-selected instead of if/else'd.
219
+ vec4 shadowBase = u_shadowColor * shadowAlpha;
220
+
221
+ vec4 resNoGap = mix(shadowBase, u_borderColor, outerAlpha * u_borderColor.a);
222
+ resNoGap = mix(resNoGap, color, innerAlpha);
223
+
224
+ vec4 resFill = mix(shadowBase, color, nodeAlpha);
225
+ vec4 resGap = mix(resFill, u_borderColor, borderAlpha * u_borderColor.a);
226
+
227
+ float hasGap = step(0.0001, abs(u_borderGap));
228
+ vec4 resultColor = mix(resNoGap, resGap, hasGap);
229
+ resultColor = mix(resultColor, resFill, borderZero);
217
230
  gl_FragColor = resultColor * u_alpha;
218
231
  }
219
232
  `,
@@ -1 +1 @@
1
- {"version":3,"file":"RoundedWithBorderAndShadow.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RoundedWithBorderAndShadow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,kCAAkC,GAEnC,MAAM,oDAAoD,CAAC;AAE5D,MAAM,CAAC,MAAM,0BAA0B,GACrC;IACE,KAAK,EAAE,kCAAkC,CAAC,KAAK;IAC/C,MAAM,CAAC,IAAc;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,UAAU,CAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,KAAM,CAAC,YAAY,CAAW,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,cAAc,CAAW,CAAC,CAAC;QAEvE,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAExD,IAAI,CAAC,UAAU,CACb,UAAU,EACV,uBAAuB,CAAC,KAAK,CAAC,MAAc,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2GT;IACC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgGX;CACA,CAAC"}
1
+ {"version":3,"file":"RoundedWithBorderAndShadow.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RoundedWithBorderAndShadow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,kCAAkC,GAEnC,MAAM,oDAAoD,CAAC;AAE5D,MAAM,CAAC,MAAM,0BAA0B,GACrC;IACE,KAAK,EAAE,kCAAkC,CAAC,KAAK;IAC/C,MAAM,CAAC,IAAc;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,UAAU,CAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,KAAM,CAAC,YAAY,CAAW,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,KAAM,CAAC,cAAc,CAAW,CAAC,CAAC;QAEvE,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAExD,IAAI,CAAC,UAAU,CACb,UAAU,EACV,uBAAuB,CAAC,KAAK,CAAC,MAAc,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiHT;IACC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuGX;CACA,CAAC"}
@@ -88,18 +88,23 @@ export const RoundedWithShadow = {
88
88
  varying vec4 v_shadowRadius;
89
89
  varying vec2 v_shadowSmooth;
90
90
 
91
+ // Branchless quadrant radius select (r: x TL, y TR, z BR, w BL) --
92
+ // Mali 400-class fragment pipelines serialize any branch, ternaries included.
93
+ float quadRadius(vec2 p, vec4 r) {
94
+ vec2 stepVal = step(vec2(0.0), p);
95
+ return mix(mix(r.x, r.y, stepVal.x), mix(r.w, r.z, stepVal.x), stepVal.y);
96
+ }
97
+
91
98
  float roundedBox(vec2 p, vec2 s, vec4 r) {
92
- r.xy = (p.x > 0.0) ? r.yz : r.xw;
93
- r.x = (p.y > 0.0) ? r.y : r.x;
94
- vec2 q = abs(p) - s + r.x;
95
- return (min(max(q.x, q.y), 0.0) + length(max(q, 0.0))) - r.x;
99
+ float rad = quadRadius(p, r);
100
+ vec2 q = abs(p) - s + rad;
101
+ return (min(max(q.x, q.y), 0.0) + length(max(q, 0.0))) - rad;
96
102
  }
97
103
 
98
104
  float shadowBox(vec2 p, vec2 s, vec4 r) {
99
- r.xy = (p.x > 0.0) ? r.yz : r.xw;
100
- r.x = (p.y > 0.0) ? r.y : r.x;
101
- vec2 q = abs(p) - s + r.x;
102
- float dist = min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - r.x;
105
+ float rad = quadRadius(p, r);
106
+ vec2 q = abs(p) - s + rad;
107
+ float dist = min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - rad;
103
108
  return 1.0 - smoothstep(v_shadowSmooth.x, v_shadowSmooth.y, dist);
104
109
  }
105
110
 
@@ -109,11 +114,8 @@ export const RoundedWithShadow = {
109
114
  float boxDist = roundedBox(v_boxUv, v_boxSize, u_radius);
110
115
  float roundedAlpha = 1.0 - smoothstep(v_boxSmooth.x, v_boxSmooth.y, boxDist);
111
116
 
112
- vec4 resColor = vec4(0.0);
113
- if (u_shadow_color.a > 0.0) {
114
- float shadowAlpha = shadowBox(v_shadowBox, v_shadowSize, v_shadowRadius);
115
- resColor = u_shadow_color * shadowAlpha;
116
- }
117
+ float shadowAlpha = shadowBox(v_shadowBox, v_shadowSize, v_shadowRadius);
118
+ vec4 resColor = u_shadow_color * (shadowAlpha * step(0.0001, u_shadow_color.a));
117
119
 
118
120
  resColor = mix(resColor, color, min(color.a, roundedAlpha));
119
121
  gl_FragColor = resColor * u_alpha;
@@ -1 +1 @@
1
- {"version":3,"file":"RoundedWithShadow.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RoundedWithShadow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,yBAAyB,GAE1B,MAAM,2CAA2C,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAA4C;IACxE,KAAK,EAAE,yBAAyB,CAAC,KAAK;IACtC,MAAM,CAAC,IAAc;QACnB,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAM,CAAC,cAAc,CAAE,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,KAAM,CAAC,mBAAmB,CAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CACb,UAAU,EACV,uBAAuB,CAAC,IAAI,CAAC,KAAM,CAAC,MAAc,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDP;IACD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDT;CACF,CAAC"}
1
+ {"version":3,"file":"RoundedWithShadow.js","sourceRoot":"","sources":["../../../../../src/core/shaders/webgl/RoundedWithShadow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,yBAAyB,GAE1B,MAAM,2CAA2C,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAA4C;IACxE,KAAK,EAAE,yBAAyB,CAAC,KAAK;IACtC,MAAM,CAAC,IAAc;QACnB,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAM,CAAC,cAAc,CAAE,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,KAAM,CAAC,mBAAmB,CAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CACb,UAAU,EACV,uBAAuB,CAAC,IAAI,CAAC,KAAM,CAAC,MAAc,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDP;IACD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDT;CACF,CAAC"}