Skip to content

Commit 65f437e

Browse files
committed
Fix: GPU drag behavior
1 parent f832a73 commit 65f437e

16 files changed

Lines changed: 1685 additions & 584 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,4 @@
109109
"main"
110110
]
111111
}
112-
}
112+
}

src/renderer/webgl/shaders/edge/edge.frag

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ in float vShadowSize;
1717
in vec2 vShadowOffset;
1818
flat in int vEdgeType;
1919

20+
uniform bool uSimpleMode;
21+
2022
out vec4 fragColor;
2123

2224
float sdSegment(vec2 p, vec2 a, vec2 b) {
@@ -89,32 +91,44 @@ float sdArrow(vec2 p, vec2 tip, vec2 dir, float size) {
8991
}
9092

9193
void main() {
92-
float cutoff = vHalfWidth + vShadowSize + length(vShadowOffset) + vArrowSize + 2.0;
94+
if (uSimpleMode && vEdgeType == 0) {
95+
fragColor = vColor;
96+
return;
97+
}
9398

99+
// Edge SDF: type-based dispatch (always needed).
94100
float dist;
95-
float shadowDist;
96-
vec2 shadowPos = vWorldPos - vShadowOffset;
97-
98101
if (vEdgeType == 0) {
99102
dist = sdSegment(vWorldPos, vStart, vEnd);
100-
shadowDist = sdSegment(shadowPos, vStart, vEnd);
101103
} else if (vEdgeType == 1) {
102104
dist = sdBezier(vWorldPos, vStart, vControl, vEnd);
103-
shadowDist = sdBezier(shadowPos, vStart, vControl, vEnd);
104105
} else {
105106
dist = abs(length(vWorldPos - vControl) - vLoopbackRadius);
106-
shadowDist = abs(length(shadowPos - vControl) - vLoopbackRadius);
107107
}
108108

109-
float arrowDist = sdArrow(vWorldPos, vArrowTip, vArrowDir, vArrowSize);
110-
float shadowArrowDist = sdArrow(shadowPos, vArrowTip, vArrowDir, vArrowSize);
111-
112109
float edgeSdf = dist - vHalfWidth;
113-
float combinedSdf = min(edgeSdf, arrowDist);
114-
float shadowCombined = min(shadowDist - vHalfWidth, shadowArrowDist);
110+
float combinedSdf = edgeSdf;
111+
112+
if (vArrowSize > 0.0) {
113+
float arrowDist = sdArrow(vWorldPos, vArrowTip, vArrowDir, vArrowSize);
114+
combinedSdf = min(edgeSdf, arrowDist);
115+
}
115116

116117
float shadowAlpha = 0.0;
117118
if (vShadowSize > 0.0) {
119+
vec2 shadowPos = vWorldPos - vShadowOffset;
120+
float shadowDist;
121+
if (vEdgeType == 0) {
122+
shadowDist = sdSegment(shadowPos, vStart, vEnd);
123+
} else if (vEdgeType == 1) {
124+
shadowDist = sdBezier(shadowPos, vStart, vControl, vEnd);
125+
} else {
126+
shadowDist = abs(length(shadowPos - vControl) - vLoopbackRadius);
127+
}
128+
float shadowArrowDist = vArrowSize > 0.0
129+
? sdArrow(shadowPos, vArrowTip, vArrowDir, vArrowSize)
130+
: 1.0e6;
131+
float shadowCombined = min(shadowDist - vHalfWidth, shadowArrowDist);
118132
float t = max(shadowCombined, 0.0) / vShadowSize;
119133
shadowAlpha = exp(-t * t * 1.5) * 0.5 * vShadowColor.a;
120134
}
@@ -128,6 +142,10 @@ void main() {
128142

129143
if (finalAlpha < 0.001) discard;
130144

131-
vec3 finalRGB = (edgeColor.rgb * edgeColor.a + vShadowColor.rgb * shadowAlpha * (1.0 - edgeColor.a)) / finalAlpha;
132-
fragColor = vec4(finalRGB, finalAlpha);
145+
if (shadowAlpha > 0.0) {
146+
vec3 finalRGB = (edgeColor.rgb * edgeColor.a + vShadowColor.rgb * shadowAlpha * (1.0 - edgeColor.a)) / finalAlpha;
147+
fragColor = vec4(finalRGB, finalAlpha);
148+
} else {
149+
fragColor = edgeColor;
150+
}
133151
}

src/renderer/webgl/shaders/edge/edge.vert

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ void main() {
4444
vStart = aStart;
4545
vEnd = aEnd;
4646
vControl = aControl;
47-
vHalfWidth = aWidth * 0.5;
47+
float effectiveWidth = max(aWidth, 1.0 / uScale);
48+
vHalfWidth = effectiveWidth * 0.5;
4849
vLoopbackRadius = aLoopbackRadius;
4950
vArrowSize = aArrowSize;
5051
vArrowTip = aArrowTip;

src/renderer/webgl/shaders/node/node.frag

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,18 +107,21 @@ float shapeSDF(vec2 p, float r, int shapeType) {
107107
}
108108

109109
void main() {
110+
// Body SDF - always needed.
110111
float dist = shapeSDF(vUV, vNodeRadius, vShapeType);
111-
float shadowDist = shapeSDF(vUV - vShadowOffset, vNodeRadius, vShapeType);
112112

113+
float aa = 0.02 * vNodeRadius;
114+
float nodeAlpha = 1.0 - smoothstep(-aa, 0.0, dist);
115+
116+
// Shadow SDF - skip entirely when no shadow. Avoids a second full shapeSDF() call
117+
// (which is a cascade of ifs) and the exp() per fragment.
113118
float shadowAlpha = 0.0;
114119
if (vShadowBlur > 0.0) {
120+
float shadowDist = shapeSDF(vUV - vShadowOffset, vNodeRadius, vShapeType);
115121
float t = max(shadowDist, 0.0) / vShadowBlur;
116122
shadowAlpha = exp(-t * t * 1.5) * 0.5 * vShadowColor.a;
117123
}
118124

119-
float aa = 0.02 * vNodeRadius;
120-
float nodeAlpha = 1.0 - smoothstep(-aa, 0.0, dist);
121-
122125
vec4 fillColor = vColor;
123126
if (vImageAspect > 0.0 && dist < 0.0) {
124127
vec2 uv01 = (vUV / vNodeRadius) * 0.5 + 0.5;
@@ -134,9 +137,14 @@ void main() {
134137
}
135138
}
136139

137-
float borderDist = shapeSDF(vUV, vBorderThreshold, vShapeType);
138-
float borderMix = smoothstep(-aa, aa, borderDist);
139-
vec4 nodeColor = mix(fillColor, vBorderColor, borderMix);
140+
vec4 nodeColor;
141+
if (vBorderThreshold < vNodeRadius) {
142+
float borderDist = shapeSDF(vUV, vBorderThreshold, vShapeType);
143+
float borderMix = smoothstep(-aa, aa, borderDist);
144+
nodeColor = mix(fillColor, vBorderColor, borderMix);
145+
} else {
146+
nodeColor = fillColor;
147+
}
140148
nodeColor.a *= nodeAlpha;
141149

142150
float finalAlpha = nodeColor.a + shadowAlpha * (1.0 - nodeColor.a);
@@ -145,6 +153,10 @@ void main() {
145153
discard;
146154
}
147155

148-
vec3 finalRGB = (nodeColor.rgb * nodeColor.a + vShadowColor.rgb * shadowAlpha * (1.0 - nodeColor.a)) / finalAlpha;
149-
fragColor = vec4(finalRGB, finalAlpha);
156+
if (shadowAlpha > 0.0) {
157+
vec3 finalRGB = (nodeColor.rgb * nodeColor.a + vShadowColor.rgb * shadowAlpha * (1.0 - nodeColor.a)) / finalAlpha;
158+
fragColor = vec4(finalRGB, finalAlpha);
159+
} else {
160+
fragColor = nodeColor;
161+
}
150162
}

0 commit comments

Comments
 (0)