Wed, 18 Jun 2025 23:55:08 +0200
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 | } |