shader/rectangle_frag.glsl

Tue, 17 Jun 2025 20:11:53 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 17 Jun 2025 20:11:53 +0200
changeset 158
f650994ec543
parent 157
d6c2f028d8c9
permissions
-rw-r--r--

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 }

mercurial