$darkmode
Suckless OGL 1.0.0
A lean, high-performance C11 PBR Renderer
app_ui.h
Go to the documentation of this file.
1 
9 #ifndef APP_UI_H
10 #define APP_UI_H
11 #include "app_settings.h"
12 #include "glad/glad.h"
13 #include "ui.h"
14 #include <GLFW/glfw3.h>
15 #include <cglm/types.h>
16 #include <stdbool.h>
17 
18 /* UI Scaling and Layout Defaults */
19 static const float DEFAULT_BASE_RESOLUTION_HEIGHT = 1080.0F;
20 static const float DEFAULT_KBD_KEY_SIZE = 60.0F;
21 static const float DEFAULT_KBD_KEY_PADDING = 10.0F;
22 static const float DEFAULT_KBD_KEY_RADIUS = 10.0F;
23 static const float DEFAULT_KBD_LABEL_SCALE = 0.75F;
24 static const float DEFAULT_KBD_TITLE_Y_OFFSET = 140.0F;
25 static const float DEFAULT_KBD_DETAIL_Y_OFFSET = 100.0F;
26 
27 /* Layout and Framing */
28 static const float LUMINANCE_EPSILON = 0.0001F;
29 static const float UI_CENTER_FACTOR = 0.5F;
30 static const float GRAPH_TEXT_PADDING = 20.0F;
31 static const float DEBUG_TEXT_Y_OFFSET = DEFAULT_FONT_SIZE * 4.0F;
32 
33 /* Legend Layout Factors */
34 static const float LEGEND_Y_FACTOR = 0.6F;
35 static const float LEGEND_X_START_FACTOR = 0.25F;
36 static const float LEGEND_STEP_FACTOR = 0.18F;
37 static const float LEGEND_COMBO_STEP_MULT = 1.9F;
38 
39 /* Histogram and Graph Limits */
40 static const float GRAPH_POS_X = 20.0F;
41 static const float GRAPH_POS_Y_OFF = 200.0F;
42 static const float GRAPH_DIM_W = 300.0F;
43 static const float GRAPH_DIM_H = 100.0F;
44 enum { HISTO_BUCKETS = 256 };
45 
46 /* Cyberpunk overlay visual tweaks */
47 static const float DEFAULT_KBD_BLOOM_SCALE = 1.3F;
48 static const float DEFAULT_KBD_UNBOUND_ALPHA = 0.22F;
49 static const float DEFAULT_KBD_BOUND_ALPHA = 0.88F;
50 static const float PANEL_FRAME_ALPHA = 0.72F;
51 static const float BLOOM_MAX_INTENSITY = 0.5F;
52 static const float GLOW_HOVER_ALPHA = 0.6F;
53 static const float BLOOM_PRESS_MAX_ALPHA = 0.9F;
54 static const float HELP_BG_ALPHA = 0.88F;
55 static const float KEY_PRESSED_ALPHA = 0.95F;
56 static const float KEY_DEFAULT_ALPHA = 0.4F;
57 static const float KEY_PRESS_BRIGHTEN_MIN = 0.6F;
58 static const float HELP_TEXT_ALPHA = 0.8F;
59 static const float HELP_EXIT_HINT_X_OFF = 300.0F;
60 static const float HELP_EXIT_HINT_Y_OFF = 50.0F;
61 
62 /* UI Colors */
63 static const vec3 KEY_COLOR_DEFAULT = {0.15F, 0.15F, 0.20F};
64 static const vec3 KEY_COLOR_TOGGLE = {0.0F, 0.82F, 0.92F};
65 static const vec3 KEY_COLOR_CYCLE = {0.12F, 0.90F, 0.12F};
66 static const vec3 KEY_COLOR_COMBINATION = {1.0F, 0.56F, 0.05F};
67 static const vec3 HELP_BG_COLOR = {0.05F, 0.05F, 0.07F};
68 static const vec3 CYBER_TITLE_COLOR = {0.0F, 0.90F, 0.95F};
69 static const vec3 ENV_TEXT_COLOR = {0.7F, 0.7F, 0.7F};
70 static const vec3 GRAPH_TEXT_COLOR = {0.8F, 0.8F, 0.8F};
71 static const vec3 DEBUG_ORANGE_COLOR = {1.0F, 0.5F, 0.0F};
72 static const vec3 HISTO_BAR_COLOR_GREEN = {0.0F, 0.7F, 0.0F};
73 static const vec3 HISTO_BAR_COLOR_BLUE = {0.0F, 0.5F, 0.8F};
74 static const vec3 HISTO_BAR_COLOR_RED = {0.8F, 0.5F, 0.0F};
75 
76 /* Animation and Timing */
77 static const float GLOBAL_DIM_MAX_FALLOFF = 0.7F;
78 static const float GLOBAL_DIM_SMOOTH_FACTOR = 15.0F;
79 static const double HOVER_DECAY_DURATION = 0.15;
80 static const float HELP_PRESS_DURATION = 2.0F;
81 
82 /* Loading Indicator and Spinner */
83 static const double UI_SPINNER_SPEED = 10.0;
84 static const float UI_LOADING_TEXT_WIDTH_FACTOR = 20.0F;
85 static const float UI_SPINNER_SIZE = 64.0F;
86 static const float UI_TEXT_OFFSET_FACTOR = 0.8F;
87 static const vec3 UI_SPINNER_COLOR = {90.0F / 255.0F, 111.0F / 255.0F,
88  185.0F / 255.0F};
89 enum { UI_LOADING_TEXT_SIZE = 64 };
90 
91 /* UI Buffers and Limits */
92 enum {
99 };
100 
101 enum {
105  ROW_ASDF = 3,
106  ROW_ZXCV = 4,
107  ROW_BOTTOM = 5
108 };
109 
110 typedef struct {
111  int key;
112  int row;
113  float x_off; /* In units of KEY_SIZE + KEY_PADDING */
114  float width; /* In units of KEY_SIZE */
115  const char* label;
116 } KeyPos;
117 
118 typedef struct {
119  float key_size;
120  float key_padding;
121  float key_radius;
122  float label_scale;
126 
127 static const KeyPos KEY_LAYOUT_QWERTY[] = {
128  /* Row 0: Esc + Func */
129  {GLFW_KEY_ESCAPE, ROW_SYSTEM, 0.0F, 1.0F, "Esc"},
130  {GLFW_KEY_F1, ROW_SYSTEM, 2.0F, 1.0F, "F1"},
131  {GLFW_KEY_F2, ROW_SYSTEM, 3.0F, 1.0F, "F2"},
132  {GLFW_KEY_F3, ROW_SYSTEM, 4.0F, 1.0F, "F3"},
133  {GLFW_KEY_F4, ROW_SYSTEM, 5.0F, 1.0F, "F4"},
134  {GLFW_KEY_F5, ROW_SYSTEM, 6.5F, 1.0F, "F5"},
135  {GLFW_KEY_F6, ROW_SYSTEM, 7.5F, 1.0F, "F6"},
136  {GLFW_KEY_F7, ROW_SYSTEM, 8.5F, 1.0F, "F7"},
137  {GLFW_KEY_F8, ROW_SYSTEM, 9.5F, 1.0F, "F8"},
138  {GLFW_KEY_F9, ROW_SYSTEM, 11.5F, 1.0F, "F9"},
139  {GLFW_KEY_F10, ROW_SYSTEM, 12.5F, 1.0F, "F10"},
140  {GLFW_KEY_F11, ROW_SYSTEM, 13.5F, 1.0F, "F11"},
141  {GLFW_KEY_F12, ROW_SYSTEM, 14.5F, 1.2F, "F12"},
142 
143  /* Row 1: Numbers/Symbols */
144  {GLFW_KEY_GRAVE_ACCENT, ROW_NUMBERS, 0.0F, 1.0F, "~"},
145  {GLFW_KEY_1, ROW_NUMBERS, 1.0F, 1.0F, "1"},
146  {GLFW_KEY_2, ROW_NUMBERS, 2.0F, 1.0F, "2"},
147  {GLFW_KEY_3, ROW_NUMBERS, 3.0F, 1.0F, "3"},
148  {GLFW_KEY_4, ROW_NUMBERS, 4.0F, 1.0F, "4"},
149  {GLFW_KEY_5, ROW_NUMBERS, 5.0F, 1.0F, "5"},
150  {GLFW_KEY_6, ROW_NUMBERS, 6.0F, 1.0F, "6"},
151  {GLFW_KEY_7, ROW_NUMBERS, 7.0F, 1.0F, "7"},
152  {GLFW_KEY_8, ROW_NUMBERS, 8.0F, 1.0F, "8"},
153  {GLFW_KEY_9, ROW_NUMBERS, 9.0F, 1.0F, "9"},
154  {GLFW_KEY_0, ROW_NUMBERS, 10.0F, 1.0F, "0"},
155 
156  /* Row 2: QWERTY */
157  {GLFW_KEY_TAB, ROW_QWERTY, 0.0F, 1.5F, "Tab"},
158  {GLFW_KEY_Q, ROW_QWERTY, 1.5F, 1.0F, "Q"},
159  {GLFW_KEY_W, ROW_QWERTY, 2.5F, 1.0F, "W"},
160  {GLFW_KEY_E, ROW_QWERTY, 3.5F, 1.0F, "E"},
161  {GLFW_KEY_R, ROW_QWERTY, 4.5F, 1.0F, "R"},
162  {GLFW_KEY_T, ROW_QWERTY, 5.5F, 1.0F, "T"},
163  {GLFW_KEY_Y, ROW_QWERTY, 6.5F, 1.0F, "Y"},
164  {GLFW_KEY_U, ROW_QWERTY, 7.5F, 1.0F, "U"},
165  {GLFW_KEY_I, ROW_QWERTY, 8.5F, 1.0F, "I"},
166  {GLFW_KEY_O, ROW_QWERTY, 9.5F, 1.0F, "O"},
167  {GLFW_KEY_P, ROW_QWERTY, 10.5F, 1.0F, "P"},
168 
169  /* Row 3: ASDF */
170  {GLFW_KEY_CAPS_LOCK, ROW_ASDF, 0.0F, 1.8F, "Caps"},
171  {GLFW_KEY_A, ROW_ASDF, 1.8F, 1.0F, "A"},
172  {GLFW_KEY_S, ROW_ASDF, 2.8F, 1.0F, "S"},
173  {GLFW_KEY_D, ROW_ASDF, 3.8F, 1.0F, "D"},
174  {GLFW_KEY_F, ROW_ASDF, 4.8F, 1.0F, "F"},
175  {GLFW_KEY_G, ROW_ASDF, 5.8F, 1.0F, "G"},
176  {GLFW_KEY_H, ROW_ASDF, 6.8F, 1.0F, "H"},
177  {GLFW_KEY_J, ROW_ASDF, 7.8F, 1.0F, "J"},
178  {GLFW_KEY_K, ROW_ASDF, 8.8F, 1.0F, "K"},
179  {GLFW_KEY_L, ROW_ASDF, 9.8F, 1.0F, "L"},
180 
181  /* Row 4: ZXCV */
182  {GLFW_KEY_LEFT_SHIFT, ROW_ZXCV, 0.0F, 2.3F, "Shift"},
183  {GLFW_KEY_Z, ROW_ZXCV, 2.3F, 1.0F, "Z"},
184  {GLFW_KEY_X, ROW_ZXCV, 3.3F, 1.0F, "X"},
185  {GLFW_KEY_C, ROW_ZXCV, 4.3F, 1.0F, "C"},
186  {GLFW_KEY_V, ROW_ZXCV, 5.3F, 1.0F, "V"},
187  {GLFW_KEY_B, ROW_ZXCV, 6.3F, 1.0F, "B"},
188  {GLFW_KEY_N, ROW_ZXCV, 7.3F, 1.0F, "N"},
189  {GLFW_KEY_M, ROW_ZXCV, 8.3F, 1.0F, "M"},
190 
191  /* Row 5: Space/System */
192  {GLFW_KEY_LEFT_CONTROL, ROW_BOTTOM, 0.0F, 1.5F, "Ctrl"},
193  {GLFW_KEY_SPACE, ROW_BOTTOM, 3.8F, 6.0F, "Space"},
194  {GLFW_KEY_PAGE_UP, ROW_ZXCV, 13.5F, 1.3F, "PgUp"},
195  {GLFW_KEY_PAGE_DOWN, ROW_BOTTOM, 13.5F, 1.3F, "PgDn"},
196  {GLFW_KEY_UP, ROW_ZXCV, 15.0F, 1.0F, "Up"},
197  {GLFW_KEY_DOWN, ROW_BOTTOM, 15.0F, 1.0F, "Dn"}};
198 
199 typedef struct {
202 
207 
217  /* Cyberpunk keyboard overlay textures (PNG assets) */
218  GLuint
220  GLuint
227 } AppUIOverlay;
228 
229 typedef struct App App;
230 
235 void app_draw_help_overlay(const App* app);
236 
241 void app_draw_debug_overlay(const App* app);
242 
249 void app_render_ui(const App* app);
250 
251 /* --- Internal helper functions --- */
252 
264 int compute_luminance_histogram(const App* app, int* buckets, int size,
265  float* min_lum, float* max_lum);
266 
270 void app_ui_handle_mouse(AppUIOverlay* overlay, double xpos, double ypos,
271  int width, int height);
272 
273 #endif /* APP_UI_H */
Global application constants, configuration macros, and default values.
static const vec3 HISTO_BAR_COLOR_BLUE
Definition: app_ui.h:73
@ ROW_NUMBERS
Definition: app_ui.h:103
@ ROW_QWERTY
Definition: app_ui.h:104
@ ROW_ZXCV
Definition: app_ui.h:106
@ ROW_ASDF
Definition: app_ui.h:105
@ ROW_SYSTEM
Definition: app_ui.h:102
@ ROW_BOTTOM
Definition: app_ui.h:107
static const float DEFAULT_KBD_KEY_RADIUS
Definition: app_ui.h:22
static const float HELP_PRESS_DURATION
Definition: app_ui.h:80
static const vec3 KEY_COLOR_CYCLE
Definition: app_ui.h:65
static const float KEY_PRESS_BRIGHTEN_MIN
Definition: app_ui.h:57
static const float UI_TEXT_OFFSET_FACTOR
Definition: app_ui.h:86
void app_draw_debug_overlay(const App *app)
Draws the debug overlay with performance metrics and settings.
Definition: app_ui.c:719
static const float LEGEND_Y_FACTOR
Definition: app_ui.h:34
static const float DEFAULT_KBD_DETAIL_Y_OFFSET
Definition: app_ui.h:25
static const float BLOOM_PRESS_MAX_ALPHA
Definition: app_ui.h:53
void app_ui_init(AppUIOverlay *overlay)
Definition: app_ui.c:56
static const float HELP_EXIT_HINT_Y_OFF
Definition: app_ui.h:60
static const float UI_LOADING_TEXT_WIDTH_FACTOR
Definition: app_ui.h:84
static const float LUMINANCE_EPSILON
Definition: app_ui.h:28
static const double HOVER_DECAY_DURATION
Definition: app_ui.h:79
static const float GLOBAL_DIM_MAX_FALLOFF
Definition: app_ui.h:77
static const float HELP_BG_ALPHA
Definition: app_ui.h:54
static const vec3 KEY_COLOR_DEFAULT
Definition: app_ui.h:63
static const float GRAPH_POS_X
Definition: app_ui.h:40
static const vec3 HELP_BG_COLOR
Definition: app_ui.h:67
static const vec3 HISTO_BAR_COLOR_RED
Definition: app_ui.h:74
static const KeyPos KEY_LAYOUT_QWERTY[]
Definition: app_ui.h:127
static const float GRAPH_TEXT_PADDING
Definition: app_ui.h:30
static const vec3 HISTO_BAR_COLOR_GREEN
Definition: app_ui.h:72
static const float HELP_TEXT_ALPHA
Definition: app_ui.h:58
static const vec3 KEY_COLOR_COMBINATION
Definition: app_ui.h:66
@ UI_LOADING_TEXT_SIZE
Definition: app_ui.h:89
static const vec3 KEY_COLOR_TOGGLE
Definition: app_ui.h:64
static const float KEY_DEFAULT_ALPHA
Definition: app_ui.h:56
static const float DEFAULT_KBD_BLOOM_SCALE
Definition: app_ui.h:47
static const float GRAPH_DIM_W
Definition: app_ui.h:42
void app_render_ui(const App *app)
Main UI rendering entry point.
Definition: app_ui.c:867
@ MODIFIER_BUFFER_SIZE
Definition: app_ui.h:97
@ KEYBOARD_BUFFER_SIZE
Definition: app_ui.h:98
@ EXPOSURE_TEXT_BUFFER_SIZE
Definition: app_ui.h:96
@ ENV_TEXT_BUFFER_SIZE
Definition: app_ui.h:95
@ DEBUG_TEXT_BUFFER_SIZE
Definition: app_ui.h:93
@ RANGE_TEXT_BUFFER_SIZE
Definition: app_ui.h:94
static const float GLOW_HOVER_ALPHA
Definition: app_ui.h:52
static const float KEY_PRESSED_ALPHA
Definition: app_ui.h:55
static const float UI_SPINNER_SIZE
Definition: app_ui.h:85
static const float BLOOM_MAX_INTENSITY
Definition: app_ui.h:51
static const float LEGEND_COMBO_STEP_MULT
Definition: app_ui.h:37
static const float HELP_EXIT_HINT_X_OFF
Definition: app_ui.h:59
void app_ui_handle_mouse(AppUIOverlay *overlay, double xpos, double ypos, int width, int height)
Definition: app_ui.c:128
void app_ui_update(AppUIOverlay *overlay, double delta_time)
Definition: app_ui.c:98
static const float DEFAULT_KBD_UNBOUND_ALPHA
Definition: app_ui.h:48
static const double UI_SPINNER_SPEED
Definition: app_ui.h:83
static const float DEFAULT_KBD_LABEL_SCALE
Definition: app_ui.h:23
static const float DEFAULT_KBD_TITLE_Y_OFFSET
Definition: app_ui.h:24
static const float UI_CENTER_FACTOR
Definition: app_ui.h:29
static const vec3 GRAPH_TEXT_COLOR
Definition: app_ui.h:70
static const float GRAPH_DIM_H
Definition: app_ui.h:43
static const float DEFAULT_KBD_KEY_PADDING
Definition: app_ui.h:21
static const vec3 UI_SPINNER_COLOR
Definition: app_ui.h:87
static const float DEFAULT_BASE_RESOLUTION_HEIGHT
Definition: app_ui.h:19
static const vec3 DEBUG_ORANGE_COLOR
Definition: app_ui.h:71
@ HISTO_BUCKETS
Definition: app_ui.h:44
static const float DEFAULT_KBD_KEY_SIZE
Definition: app_ui.h:20
void app_ui_cleanup(AppUIOverlay *overlay)
Definition: app_ui.c:85
int compute_luminance_histogram(const App *app, int *buckets, int size, float *min_lum, float *max_lum)
Computes the luminance histogram from current frame data.
Definition: app_ui.c:907
static const float DEBUG_TEXT_Y_OFFSET
Definition: app_ui.h:31
static const float DEFAULT_KBD_BOUND_ALPHA
Definition: app_ui.h:49
static const float PANEL_FRAME_ALPHA
Definition: app_ui.h:50
void app_draw_help_overlay(const App *app)
Draws the help overlay with keyboard shortcuts.
Definition: app_ui.c:388
static const vec3 CYBER_TITLE_COLOR
Definition: app_ui.h:68
static const float GRAPH_POS_Y_OFF
Definition: app_ui.h:41
static const float LEGEND_STEP_FACTOR
Definition: app_ui.h:36
static const vec3 ENV_TEXT_COLOR
Definition: app_ui.h:69
static const float LEGEND_X_START_FACTOR
Definition: app_ui.h:35
static const float GLOBAL_DIM_SMOOTH_FACTOR
Definition: app_ui.h:78
static const float DEFAULT_FONT_SIZE
Definition: app_settings.h:213
Definition: app_ui.h:199
int help_pressed_key
Definition: app_ui.h:209
int show_help
Definition: app_ui.h:203
int text_overlay_mode
Definition: app_ui.h:205
UIContext ui
Definition: app_ui.h:200
KeyboardLayoutConfig kbd_config
Definition: app_ui.h:201
GLuint kbd_tex_key_base
Definition: app_ui.h:221
int help_captured_camera
Definition: app_ui.h:226
int help_hovered_key
Definition: app_ui.h:208
double help_press_timer
Definition: app_ui.h:211
double help_global_dim
Definition: app_ui.h:212
double help_hover_decay
Definition: app_ui.h:213
GLuint kbd_tex_frame
Definition: app_ui.h:219
int show_exposure_debug
Definition: app_ui.h:206
int show_info_overlay
Definition: app_ui.h:204
int help_pressed_mods
Definition: app_ui.h:210
The central state container for the entire application.
Definition: app.h:35
AppUIOverlay overlay
Definition: app.h:50
int width
Definition: app.h:56
int height
Definition: app.h:57
double delta_time
Definition: app.h:41
Definition: app_ui.h:110
int key
Definition: app_ui.h:111
const char * label
Definition: app_ui.h:115
float width
Definition: app_ui.h:114
float x_off
Definition: app_ui.h:113
int row
Definition: app_ui.h:112
Definition: app_ui.h:118
float key_padding
Definition: app_ui.h:120
float detail_y_offset
Definition: app_ui.h:124
float key_radius
Definition: app_ui.h:121
float key_size
Definition: app_ui.h:119
float title_y_offset
Definition: app_ui.h:123
float label_scale
Definition: app_ui.h:122
Persistent state for the UI system.
Definition: ui.h:49
Minimal immediate-mode User Interface (UI) library.