shader/rectangle_frag.glsl

Wed, 18 Jun 2025 23:55:08 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 18 Jun 2025 23:55:08 +0200
changeset 159
da7ebfcdd159
parent 158
f650994ec543
permissions
-rw-r--r--

add combination of filled rectangle with a border

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
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
4 uniform vec2 size;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
5 #ifdef FILL
151
42960d0c879b adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
6 uniform vec4 color;
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
7 #endif
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
8 #ifdef BORDER
151
42960d0c879b adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
9 uniform float thickness;
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
10 uniform vec4 border_color;
137
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 135
diff changeset
11 #endif
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
12 #ifdef ROUNDED_CORNERS
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
13 uniform float radius;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
14 #endif
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 void main(void) {
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
17 #ifdef ROUNDED_CORNERS
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
18 // Calculate distances from each corner
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
19 vec2 corner_distances[4];
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
20 corner_distances[0] = uvcoord - vec2(radius, radius); // top-left
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
21 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
22 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
23 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
24
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
25 // Check if we're in a corner region
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
26 bool in_corner_region = false;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
27 int corner_idx = -1;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
28
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
29 for (int i = 0; i < 4; i++) {
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
30 vec2 test_point = corner_distances[i];
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
31 vec2 corner_test = vec2(0.0);
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
32
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
33 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
34 corner_test = test_point;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
35 corner_idx = i;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
36 in_corner_region = true;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
37 break;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
38 } 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
39 corner_test = test_point;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
40 corner_idx = i;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
41 in_corner_region = true;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
42 break;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
43 } 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
44 corner_test = test_point;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
45 corner_idx = i;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
46 in_corner_region = true;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
47 break;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
48 } 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
49 corner_test = test_point;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
50 corner_idx = i;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
51 in_corner_region = true;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
52 break;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
53 }
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
54 }
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
55
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
56 #ifndef BORDER
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
57 // For filled rectangle with rounded corners
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
58 if (in_corner_region) {
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
59 float dist = length(corner_distances[corner_idx]);
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
60 if (dist > radius) {
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
61 discard; // Outside the rounded corner
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
62 }
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
63 } else if (uvcoord.x < 0.0 || uvcoord.y < 0.0 || uvcoord.x > size.x || uvcoord.y > size.y) {
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
64 // TODO: at the moment we don't have fragments here, but we will with glow
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
65 discard; // Outside the rectangle
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
66 }
151
42960d0c879b adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
67 diffuse = color;
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
68 #else // BORDER
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
69 // For outlined rectangle with rounded corners
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
70 if (in_corner_region) {
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
71 float dist = length(corner_distances[corner_idx]);
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
72 if (dist > radius) {
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
73 discard; // Outside the rounded corner
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
74 } else if (dist < radius - thickness) {
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
75 // Inside the outline
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
76 #ifdef FILL
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
77 diffuse = color;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
78 #else
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
79 discard;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
80 #endif
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
81 } else {
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
82 // the corner outline
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
83 diffuse = border_color;
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
84 }
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
85 } 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
86 // On a straight edge
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
87 if (uvcoord.x >= 0.0 && uvcoord.y >= 0.0 && uvcoord.x <= size.x && uvcoord.y <= size.y) {
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
88 diffuse = border_color;
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
89 } else {
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
90 discard;
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
91 }
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
92 } else {
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
93 // Inside the outline
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
94 #ifdef FILL
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
95 diffuse = color;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
96 #else
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
97 discard;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
98 #endif
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
99 }
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
100 #endif // BORDER
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
101 #else // no ROUNDED_CORNERS
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
102 #ifdef BORDER
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
103 if (any(notEqual(1.0-step(thickness, uvcoord)+step(size-thickness, uvcoord), vec2(0.0)))) {
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
104 diffuse = border_color;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
105 } else {
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
106 // Inside the outline
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
107 #ifdef FILL
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
108 diffuse = color;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
109 #else
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
110 discard;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
111 #endif
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
112 }
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
113 #else // no BORDER
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
114 diffuse = color;
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
115 #endif // BORDER
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
116 #endif // ROUNDED_CORNERS
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
117 }

mercurial