shader/rectangle_frag.glsl

Wed, 02 Jul 2025 23:21:17 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 02 Jul 2025 23:21:17 +0200
changeset 174
0009b982bc7d
parent 159
da7ebfcdd159
permissions
-rw-r--r--

resolve TODOs regarding input.h

a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array

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