shader/ellipsis_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 173
bd57fe3f6360
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

173
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
1
16
c5dde81b6fb2 add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
2 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
3 in vec2 uvcoord;
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4
173
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
5 uniform vec2 radii;
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
6 #ifdef FILL
151
42960d0c879b adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
7 uniform vec4 color;
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
8 #endif
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
9 #ifdef BORDER
151
42960d0c879b adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
10 uniform float thickness;
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
11 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
12 #endif
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 void main(void) {
173
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
15 // Calculate center of the ellipse
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
16 vec2 center = radii;
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
17
173
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
18 // Calculate position relative to center
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
19 vec2 pos = uvcoord - center;
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
20
173
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
21 // For an ellipse, we need to calculate normalized distance based on the formula:
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
22 // (x/a)² + (y/b)² = 1 where a and b are the semi-axes
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
23 vec2 normalized = pos / center;
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
24
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
25 // Calculate squared distance in ellipse space
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
26 // Value = 1.0 exactly at the ellipse boundary
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
27 float dist_squared = dot(normalized, normalized);
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
28
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
29 #ifndef BORDER
173
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
30 // For filled ellipse
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
31 if (dist_squared > 1.0) {
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
32 discard; // Outside the ellipse
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
33 }
151
42960d0c879b adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
34 diffuse = color;
173
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
35 #else // BORDER
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
36 // For outlined ellipse
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
37 // Calculate inner border threshold based on thickness
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
38 // We need to determine the inner ellipse boundary
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
39 float border_ratio = thickness / min(center.x, center.y);
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
40
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
41 // The inner ellipse has a smaller radius but follows the same equation
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
42 // We need to calculate what normalized value corresponds to the inner ellipse
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
43 float inner_threshold = 1.0 - border_ratio;
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
44 inner_threshold = inner_threshold * inner_threshold; // Square it because we're comparing to dist_squared
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
45
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
46 if (dist_squared > 1.0) {
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
47 discard; // Outside the ellipse
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
48 } else if (dist_squared > inner_threshold) {
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
49 // In the border region
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
50 diffuse = border_color;
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
51 } else {
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
52 // Inside the outline
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
53 #ifdef FILL
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
54 diffuse = color;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
55 #else
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
56 discard;
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
57 #endif
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
58 }
159
da7ebfcdd159 add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
59 #endif // BORDER
173
bd57fe3f6360 add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents: 159
diff changeset
60 }

mercurial