Tue, 17 Jun 2025 20:11:53 +0200
implement rounded corners
for the time being this should be enough to close issue #384
later we add anti-aliasing, glow effects, etc.
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
1 | layout(location = 0) out vec4 diffuse; |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
2 | in vec2 uvcoord; |
15
362b7659dc76
add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
4 | uniform vec4 color; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
5 | uniform vec2 size; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
6 | #ifndef FILL |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
7 | uniform float thickness; |
137
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents:
135
diff
changeset
|
8 | #endif |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
9 | #ifdef ROUNDED_CORNERS |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
10 | uniform float radius; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
11 | #endif |
15
362b7659dc76
add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | |
362b7659dc76
add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | void main(void) { |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
14 | #ifdef ROUNDED_CORNERS |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
15 | // Calculate distances from each corner |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
16 | vec2 corner_distances[4]; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
17 | corner_distances[0] = uvcoord - vec2(radius, radius); // top-left |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
18 | corner_distances[1] = uvcoord - vec2(size.x - radius, radius); // top-right |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
19 | corner_distances[2] = uvcoord - vec2(radius, size.y - radius); // bottom-left |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
20 | corner_distances[3] = uvcoord - vec2(size.x - radius, size.y - radius); // bottom-right |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
21 | |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
22 | // Check if we're in a corner region |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
23 | bool in_corner_region = false; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
24 | int corner_idx = -1; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
25 | |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
26 | for (int i = 0; i < 4; i++) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
27 | vec2 test_point = corner_distances[i]; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
28 | vec2 corner_test = vec2(0.0); |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
29 | |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
30 | if (i == 0 && test_point.x < 0.0 && test_point.y < 0.0) { // top-left |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
31 | corner_test = test_point; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
32 | corner_idx = i; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
33 | in_corner_region = true; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
34 | break; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
35 | } else if (i == 1 && test_point.x > 0.0 && test_point.y < 0.0) { // top-right |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
36 | corner_test = test_point; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
37 | corner_idx = i; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
38 | in_corner_region = true; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
39 | break; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
40 | } else if (i == 2 && test_point.x < 0.0 && test_point.y > 0.0) { // bottom-left |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
41 | corner_test = test_point; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
42 | corner_idx = i; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
43 | in_corner_region = true; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
44 | break; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
45 | } else if (i == 3 && test_point.x > 0.0 && test_point.y > 0.0) { // bottom-right |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
46 | corner_test = test_point; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
47 | corner_idx = i; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
48 | in_corner_region = true; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
49 | break; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
50 | } |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
51 | } |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
52 | |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
53 | #ifdef FILL |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
54 | // For filled rectangle with rounded corners |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
55 | if (in_corner_region) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
56 | float dist = length(corner_distances[corner_idx]); |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
57 | if (dist > radius) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
58 | discard; // Outside the rounded corner |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
59 | } |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
60 | } else if (uvcoord.x < 0.0 || uvcoord.y < 0.0 || uvcoord.x > size.x || uvcoord.y > size.y) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
61 | discard; // Outside the rectangle |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
62 | } |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
63 | diffuse = color; |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
64 | #else // no FILL |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
65 | // For outlined rectangle with rounded corners |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
66 | if (in_corner_region) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
67 | float dist = length(corner_distances[corner_idx]); |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
68 | if (dist > radius) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
69 | discard; // Outside the rounded corner |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
70 | } else if (dist < radius - thickness) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
71 | discard; // Inside the outline |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
72 | } |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
73 | diffuse = color; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
74 | } else if (any(lessThan(uvcoord, vec2(thickness))) || any(greaterThan(uvcoord, size - thickness))) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
75 | // On a straight edge |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
76 | if (uvcoord.x >= 0.0 && uvcoord.y >= 0.0 && uvcoord.x <= size.x && uvcoord.y <= size.y) { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
77 | diffuse = color; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
78 | } else { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
79 | discard; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
80 | } |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
81 | } else { |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
82 | discard; // Inside the outline |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
83 | } |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
84 | #endif // FILL |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
85 | #else // no ROUNDED_CORNERS |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
86 | #ifdef FILL |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
87 | diffuse = color; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
88 | #else // no FILL |
157
d6c2f028d8c9
use functions instead of Boolean logic
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
89 | if (any(notEqual(1.0-step(thickness, uvcoord)+step(size-thickness, uvcoord), vec2(0.0)))) { |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
90 | diffuse = color; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
91 | } else { |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
92 | discard; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
137
diff
changeset
|
93 | } |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
94 | #endif // FILL |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
95 | #endif // ROUNDED_CORNERS |
15
362b7659dc76
add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
96 | } |