Wed, 02 Jul 2025 23:21:17 +0200
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 | } |