@@ -68,6 +68,7 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
6868 varying vec4 v_innerRadius;
6969 varying vec2 v_innerSize;
7070 varying vec2 v_halfDimensions;
71+ varying float v_borderZero;
7172
7273 void main() {
7374 vec2 screenSpace = vec2(2.0 / u_resolution.x, -2.0 / u_resolution.y);
@@ -81,18 +82,23 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
8182
8283 v_halfDimensions = u_dimensions * 0.5;
8384
84- v_innerRadius = vec4(
85- max(0.0, u_radius.x - max(u_borderWidth.x, u_borderWidth.w) - 0.5),
86- max(0.0, u_radius.y - max(u_borderWidth.x, u_borderWidth.y) - 0.5),
87- max(0.0, u_radius.z - max(u_borderWidth.z, u_borderWidth.y) - 0.5),
88- max(0.0, u_radius.w - max(u_borderWidth.z, u_borderWidth.w) - 0.5)
89- );
90-
91- v_innerSize = (vec2(u_dimensions.x - (u_borderWidth[3] + u_borderWidth[1]) - 1.0, u_dimensions.y - (u_borderWidth[0] + u_borderWidth[2])) - 2.0) * 0.5;
92-
9385 v_color = a_color;
9486 v_nodeCoords = a_nodeCoords + (screenSpace + shadowEdge) / (u_dimensions);
9587 v_textureCoords = a_textureCoords + (screenSpace + shadowEdge) / (u_dimensions);
88+
89+ v_borderZero = u_borderWidth == vec4(0.0) ? 1.0 : 0.0;
90+
91+
92+ if(v_borderZero == 0.0) {
93+ v_innerRadius = vec4(
94+ max(0.0, u_radius.x - max(u_borderWidth.x, u_borderWidth.w) - 0.5),
95+ max(0.0, u_radius.y - max(u_borderWidth.x, u_borderWidth.y) - 0.5),
96+ max(0.0, u_radius.z - max(u_borderWidth.z, u_borderWidth.y) - 0.5),
97+ max(0.0, u_radius.w - max(u_borderWidth.z, u_borderWidth.w) - 0.5)
98+ );
99+
100+ v_innerSize = (vec2(u_dimensions.x - (u_borderWidth[3] + u_borderWidth[1]) - 1.0, u_dimensions.y - (u_borderWidth[0] + u_borderWidth[2])) - 2.0) * 0.5;
101+ }
96102 }
97103 ` ,
98104 fragment : `
@@ -122,6 +128,7 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
122128 varying vec2 v_halfDimensions;
123129 varying vec4 v_innerRadius;
124130 varying vec2 v_innerSize;
131+ varying float v_borderZero;
125132
126133 float roundedBox(vec2 p, vec2 s, vec4 r) {
127134 r.xy = (p.x > 0.0) ? r.yz : r.xw;
@@ -146,15 +153,20 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
146153
147154 float outerAlpha = 1.0 - smoothstep(0.0, 1.0, outerDist);
148155
156+ float shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w, u_radius + u_shadow.z);
157+ vec4 shadow = mix(vec4(0.0), u_shadowColor, shadowAlpha);
158+
159+ if(v_borderZero == 1.0) {
160+ gl_FragColor = mix(shadow, color, outerAlpha) * u_alpha;
161+ return;
162+ }
163+
149164 boxUv.x += u_borderWidth.y > u_borderWidth.w ? (u_borderWidth.y - u_borderWidth.w) * 0.5 : -(u_borderWidth.w - u_borderWidth.y) * 0.5;
150165 boxUv.y += u_borderWidth.z > u_borderWidth.x ? ((u_borderWidth.z - u_borderWidth.x) * 0.5 + 0.5) : -(u_borderWidth.x - u_borderWidth.z) * 0.5;
151166
152167 float innerDist = roundedBox(boxUv, v_innerSize, v_innerRadius);
153168 float innerAlpha = 1.0 - smoothstep(0.0, 1.0, innerDist);
154169
155- float shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w, u_radius + u_shadow.z);
156-
157- vec4 shadow = mix(vec4(0.0), u_shadowColor, shadowAlpha);
158170 vec4 resColor = mix(u_borderColor, color, innerAlpha);
159171 resColor = mix(shadow, resColor, outerAlpha);
160172 gl_FragColor = resColor * u_alpha;
0 commit comments