shader/ellipsis_frag.glsl

Wed, 02 Jul 2025 23:55:50 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 02 Jul 2025 23:55:50 +0200
changeset 175
e5544920377e
parent 173
bd57fe3f6360
permissions
-rw-r--r--

improve macros in datatypes.h - fixes #692

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