Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions src/core/renderers/webgl/WebGlShaderProgram.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,6 @@ export class WebGlShaderProgram implements CoreShaderProgram {
}

const program = createProgram(glw, vertexShader, fragmentShader);
if (!program) {
throw new Error();
}

this.program = program;
this.attributeLocations = glw.getAttributeLocations(program);

Expand Down
6 changes: 4 additions & 2 deletions src/core/renderers/webgl/internal/ShaderUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,11 @@ export function createProgram(
return program;
}

console.warn(glw.getProgramInfoLog(program));
const infoLog =
glw.getProgramInfoLog(program) || 'Unknown program link error';
console.warn(infoLog);
glw.deleteProgram(program);
return undefined;
throw new Error(`Unable to link shader program: ${infoLog}`);
}

export const DefaultVertexSource = `
Expand Down
18 changes: 8 additions & 10 deletions src/core/shaders/webgl/Border.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,10 @@ export const Border: WebGlShaderType<BorderProps> = {
varying vec2 v_outerBorderUv;
varying vec2 v_innerBorderUv;
varying vec2 v_halfDimensions;
varying float v_edgeWidth;

void main() {
vec2 screenSpace = vec2(2.0 / u_resolution.x, -2.0 / u_resolution.y);
vec2 edge = clamp(a_nodeCoords * 2.0 - vec2(1.0), -1.0, 1.0);
v_edgeWidth = 1.0 / u_pixelRatio;

float borderTop = u_borderWidth.x;
float borderRight = u_borderWidth.y;
Expand Down Expand Up @@ -120,7 +118,6 @@ export const Border: WebGlShaderType<BorderProps> = {
varying vec2 v_outerBorderUv;
varying vec2 v_innerBorderUv;
varying vec2 v_halfDimensions;
varying float v_edgeWidth;

float box(vec2 p, vec2 s) {
vec2 q = abs(p) - s;
Expand All @@ -131,24 +128,25 @@ export const Border: WebGlShaderType<BorderProps> = {
vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
vec4 resultColor = vec4(0.0);
vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
float edgeWidth = 1.0 / u_pixelRatio;

float outerDist = box(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth);
float innerDist = box(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth);
float outerDist = box(boxUv + v_outerBorderUv, v_outerSize - edgeWidth);
float innerDist = box(boxUv + v_innerBorderUv, v_innerSize - edgeWidth);

if(u_borderGap == 0.0) {
float outerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, outerDist);
float innerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist);
float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
resultColor = mix(resultColor, color, innerAlpha);
gl_FragColor = resultColor * u_alpha;
return;
}

float nodeDist = box(boxUv, v_halfDimensions - v_edgeWidth);
float nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
float nodeDist = box(boxUv, v_halfDimensions - edgeWidth);
float nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);

float borderDist = max(-innerDist, outerDist);
float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);
resultColor = mix(resultColor, color, nodeAlpha);
resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);

Expand Down
33 changes: 15 additions & 18 deletions src/core/shaders/webgl/RoundedWithBorder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,20 +53,18 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
varying vec4 v_innerBorderRadius;
varying vec4 v_outerBorderRadius;
varying vec2 v_halfDimensions;
varying float v_edgeWidth;
varying float v_borderZero;

void main() {
vec2 vertexPos = a_position * u_pixelRatio;
vec2 screenSpace = vec2(2.0 / u_resolution.x, -2.0 / u_resolution.y);
vec2 edge = clamp(a_nodeCoords * 2.0 - vec2(1.0), -1.0, 1.0);
vec2 edgeOffset = vec2(0.0);
float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));

v_borderZero = u_borderWidth == vec4(0.0) ? 1.0 : 0.0;
v_innerSize = vec2(0.0);
v_outerSize = vec2(0.0);

if(v_borderZero == 0.0) {
if(borderZero == 0.0) {
float borderTop = u_borderWidth.x;
float borderRight = u_borderWidth.y;
float borderBottom = u_borderWidth.z;
Expand Down Expand Up @@ -125,7 +123,6 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
v_textureCoords = a_textureCoords + (screenSpace + edgeOffset) / (u_dimensions);

v_halfDimensions = u_dimensions * 0.5;
v_edgeWidth = 1.0 / u_pixelRatio;
}
`,
fragment: `
Expand Down Expand Up @@ -159,8 +156,6 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
varying vec4 v_innerBorderRadius;
varying vec4 v_outerBorderRadius;
varying vec2 v_halfDimensions;
varying float v_edgeWidth;
varying float v_borderZero;

float roundedBox(vec2 p, vec2 s, vec4 r) {
r.xy = (p.x > 0.0) ? r.yz : r.xw;
Expand All @@ -173,36 +168,38 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
vec4 resultColor = vec4(0.0);
vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));
float edgeWidth = 1.0 / u_pixelRatio;

float nodeDist;
float nodeAlpha;

if(v_borderZero == 1.0) {
nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
if(borderZero == 1.0) {
nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
gl_FragColor = (color * nodeAlpha) * u_alpha;
return;
}

float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth, v_outerBorderRadius);
float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth, v_innerBorderRadius);
float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - edgeWidth, v_outerBorderRadius);
float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - edgeWidth, v_innerBorderRadius);

if(u_borderGap == 0.0) {
float outerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, outerDist);
float innerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist);
float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
resultColor = mix(resultColor, color, innerAlpha);
gl_FragColor = resultColor * u_alpha;
return;
}

nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
float innerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist);
nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
float gapAlpha = max(0.0, innerAlpha - nodeAlpha);

float borderDist = max(-innerDist, outerDist);
float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);

resultColor = (color * nodeAlpha) + (u_fillColor * gapAlpha);
resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
Expand Down
38 changes: 17 additions & 21 deletions src/core/shaders/webgl/RoundedWithBorderAndShadow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,22 +59,19 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
varying vec4 v_innerBorderRadius;
varying vec4 v_outerBorderRadius;
varying vec2 v_halfDimensions;
varying float v_edgeWidth;
varying float v_borderZero;

void main() {
vec2 screenSpace = vec2(2.0 / u_resolution.x, -2.0 / u_resolution.y);
vec2 edge = clamp(a_nodeCoords * 2.0 - vec2(1.0), -1.0, 1.0);
float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));

vec2 edgeOffset = edge * ((u_shadow.w * 2.0)+ u_shadow.z) + u_shadow.xy;
vec2 vertexPos = (a_position + edge + edgeOffset) * u_pixelRatio;

v_borderZero = u_borderWidth == vec4(0.0) ? 1.0 : 0.0;

v_innerSize = vec2(0.0);
v_outerSize = vec2(0.0);

if(v_borderZero == 0.0) {
if(borderZero == 0.0) {
float borderTop = u_borderWidth.x;
float borderRight = u_borderWidth.y;
float borderBottom = u_borderWidth.z;
Expand Down Expand Up @@ -129,7 +126,6 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
gl_Position = vec4(vertexPos.x * screenSpace.x - 1.0, -sign(screenSpace.y) * (vertexPos.y * -abs(screenSpace.y)) + 1.0, 0.0, 1.0);

v_halfDimensions = u_dimensions * 0.5;
v_edgeWidth = 1.0 / u_pixelRatio;
v_color = a_color;
v_nodeCoords = a_nodeCoords + (screenSpace + edgeOffset) / (u_dimensions);
v_textureCoords = a_textureCoords + (screenSpace + edgeOffset) / (u_dimensions);
Expand Down Expand Up @@ -167,8 +163,6 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
varying vec4 v_innerBorderRadius;
varying vec4 v_outerBorderRadius;
varying vec2 v_halfDimensions;
varying float v_edgeWidth;
varying float v_borderZero;

float roundedBox(vec2 p, vec2 s, vec4 r) {
r.xy = (p.x > 0.0) ? r.yz : r.xw;
Expand All @@ -189,43 +183,45 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
vec4 resultColor = vec4(0.0);
vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));
float edgeWidth = 1.0 / u_pixelRatio;
float nodeDist;
float nodeAlpha;
float shadowAlpha;

if(v_borderZero == 1.0) {
nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - v_edgeWidth, u_radius + u_shadow.z);
if(borderZero == 1.0) {
nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - edgeWidth, u_radius + u_shadow.z);
resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
gl_FragColor = mix(resultColor, color, nodeAlpha) * u_alpha;
return;
}

if(v_outerSize.x > v_halfDimensions.x || v_outerSize.y > v_halfDimensions.y) {
shadowAlpha = shadowBox(boxUv + v_outerBorderUv - u_shadow.xy, v_outerSize + u_shadow.w - v_edgeWidth, v_outerBorderRadius + u_shadow.z);
shadowAlpha = shadowBox(boxUv + v_outerBorderUv - u_shadow.xy, v_outerSize + u_shadow.w - edgeWidth, v_outerBorderRadius + u_shadow.z);
}
else {
shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - v_edgeWidth, u_radius + u_shadow.z);
shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - edgeWidth, u_radius + u_shadow.z);
}

float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth, v_outerBorderRadius);
float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth, v_innerBorderRadius);
float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - edgeWidth, v_outerBorderRadius);
float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - edgeWidth, v_innerBorderRadius);

if(u_borderGap == 0.0) {
float outerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, outerDist);
float innerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist);
float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
resultColor = mix(resultColor, color, innerAlpha);
gl_FragColor = resultColor * u_alpha;
return;
}

nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
float borderDist = max(-innerDist, outerDist);
float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);
resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
resultColor = mix(resultColor, color, nodeAlpha);
resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
Expand Down
Loading