platform_gfx.h (8225B)
1 ////////////////////////////////////////////////////////////////// 2 // platform_gfx.h 3 4 ////////////////////////////////////////////////////////////////// 5 // forward declares 6 7 typedef struct rv_event_t rv_event_t; 8 9 ////////////////////////////////////////////////////////////////// 10 // Window creation 11 12 typedef struct { 13 rv_str8 name; 14 bool32 attach_render; 15 bool32 vsync; 16 rv_rect rect; 17 } rv_window_desc_t; 18 19 typedef struct rv_window_handle_t rv_window_handle_t; 20 21 RV_GLOBAL rv_window_handle_t* rv_create_window(rv_window_desc_t desc); 22 RV_GLOBAL void rv_destroy_window(rv_window_handle_t** handle); 23 24 ////////////////////////////////////////////////////////////////// 25 // Keyboard Input 26 27 typedef enum rv_keycode_t { 28 RV_KEYCODE_INVALID, 29 RV_KEYCODE_SPACE, 30 RV_KEYCODE_APOSTROPHE, /* ' */ 31 RV_KEYCODE_COMMA, /* , */ 32 RV_KEYCODE_MINUS, /* - */ 33 RV_KEYCODE_PERIOD, /* . */ 34 RV_KEYCODE_SLASH, /* / */ 35 RV_KEYCODE_0, 36 RV_KEYCODE_1, 37 RV_KEYCODE_2, 38 RV_KEYCODE_3, 39 RV_KEYCODE_4, 40 RV_KEYCODE_5, 41 RV_KEYCODE_6, 42 RV_KEYCODE_7, 43 RV_KEYCODE_8, 44 RV_KEYCODE_9, 45 RV_KEYCODE_SEMICOLON, /* ; */ 46 RV_KEYCODE_EQUAL, /* = */ 47 RV_KEYCODE_A, 48 RV_KEYCODE_B, 49 RV_KEYCODE_C, 50 RV_KEYCODE_D, 51 RV_KEYCODE_E, 52 RV_KEYCODE_F, 53 RV_KEYCODE_G, 54 RV_KEYCODE_H, 55 RV_KEYCODE_I, 56 RV_KEYCODE_J, 57 RV_KEYCODE_K, 58 RV_KEYCODE_L, 59 RV_KEYCODE_M, 60 RV_KEYCODE_N, 61 RV_KEYCODE_O, 62 RV_KEYCODE_P, 63 RV_KEYCODE_Q, 64 RV_KEYCODE_R, 65 RV_KEYCODE_S, 66 RV_KEYCODE_T, 67 RV_KEYCODE_U, 68 RV_KEYCODE_V, 69 RV_KEYCODE_W, 70 RV_KEYCODE_X, 71 RV_KEYCODE_Y, 72 RV_KEYCODE_Z, 73 RV_KEYCODE_BAR, 74 RV_KEYCODE_LEFT_BRACKET, /* [ */ 75 RV_KEYCODE_BACKSLASH, /* \ */ 76 RV_KEYCODE_RIGHT_BRACKET, /* ] */ 77 RV_KEYCODE_GRAVE_ACCENT, /* ` */ 78 RV_KEYCODE_ACUTE_ACCENT, /* ´ */ 79 RV_KEYCODE_DIAERESIS, /* ¨ */ 80 RV_KEYCODE_CIRCUMFLEX, /* ^ */ 81 RV_KEYCODE_TILDE, /* ~ */ 82 RV_KEYCODE_WORLD_1, /* non-US #1 */ 83 RV_KEYCODE_WORLD_2, /* non-US #2 */ 84 RV_KEYCODE_ESC, 85 RV_KEYCODE_ENTER, 86 RV_KEYCODE_TAB, 87 RV_KEYCODE_BACKSPACE, 88 RV_KEYCODE_INSERT, 89 RV_KEYCODE_DELETE, 90 RV_KEYCODE_RIGHT, 91 RV_KEYCODE_LEFT, 92 RV_KEYCODE_DOWN, 93 RV_KEYCODE_UP, 94 RV_KEYCODE_PAGE_UP, 95 RV_KEYCODE_PAGE_DOWN, 96 RV_KEYCODE_HOME, 97 RV_KEYCODE_END, 98 RV_KEYCODE_CAPS_LOCK, 99 RV_KEYCODE_SCROLL_LOCK, 100 RV_KEYCODE_NUM_LOCK, 101 RV_KEYCODE_PRINT_SCREEN, 102 RV_KEYCODE_PAUSE, 103 RV_KEYCODE_F1, 104 RV_KEYCODE_F2, 105 RV_KEYCODE_F3, 106 RV_KEYCODE_F4, 107 RV_KEYCODE_F5, 108 RV_KEYCODE_F6, 109 RV_KEYCODE_F7, 110 RV_KEYCODE_F8, 111 RV_KEYCODE_F9, 112 RV_KEYCODE_F10, 113 RV_KEYCODE_F11, 114 RV_KEYCODE_F12, 115 RV_KEYCODE_F13, 116 RV_KEYCODE_F14, 117 RV_KEYCODE_F15, 118 RV_KEYCODE_F16, 119 RV_KEYCODE_F17, 120 RV_KEYCODE_F18, 121 RV_KEYCODE_F19, 122 RV_KEYCODE_F20, 123 RV_KEYCODE_F21, 124 RV_KEYCODE_F22, 125 RV_KEYCODE_F23, 126 RV_KEYCODE_F24, 127 RV_KEYCODE_F25, 128 RV_KEYCODE_KP_0, 129 RV_KEYCODE_KP_1, 130 RV_KEYCODE_KP_2, 131 RV_KEYCODE_KP_3, 132 RV_KEYCODE_KP_4, 133 RV_KEYCODE_KP_5, 134 RV_KEYCODE_KP_6, 135 RV_KEYCODE_KP_7, 136 RV_KEYCODE_KP_8, 137 RV_KEYCODE_KP_9, 138 RV_KEYCODE_KP_DECIMAL, 139 RV_KEYCODE_KP_DIVIDE, 140 RV_KEYCODE_KP_MULTIPLY, 141 RV_KEYCODE_KP_SUBTRACT, 142 RV_KEYCODE_KP_ADD, 143 RV_KEYCODE_KP_ENTER, 144 RV_KEYCODE_KP_EQUAL, 145 RV_KEYCODE_LEFT_SHIFT, 146 RV_KEYCODE_LEFT_CONTROL, 147 RV_KEYCODE_LEFT_ALT, 148 RV_KEYCODE_LEFT_SUPER, 149 RV_KEYCODE_RIGHT_SHIFT, 150 RV_KEYCODE_RIGHT_CONTROL, 151 RV_KEYCODE_RIGHT_ALT, 152 RV_KEYCODE_RIGHT_SUPER, 153 RV_KEYCODE_MENU, 154 155 RV_KEYCODE_COUNT 156 } rv_keycode_t; 157 158 typedef enum { 159 RV_KEY_MOD_NONE = 0, 160 RV_KEY_MOD_1 = (1 << 0), 161 RV_KEY_MOD_2 = (1 << 1), 162 RV_KEY_MOD_3 = (1 << 2), 163 RV_KEY_MOD_4 = (1 << 3), 164 RV_KEY_MOD_5 = (1 << 4), 165 RV_KEY_MOD_7 = (1 << 5), 166 RV_KEY_MOD_8 = (1 << 7), 167 168 RV_KEY_MOD_SHIFT = RV_KEY_MOD_1, 169 RV_KEY_MOD_LOCK = RV_KEY_MOD_2, 170 RV_KEY_MOD_CTRL = RV_KEY_MOD_3, 171 RV_KEY_MOD_ALT = RV_KEY_MOD_4, 172 RV_KEY_MOD_NUM_LOCK = RV_KEY_MOD_5, 173 RV_KEY_MOD_SUPER = RV_KEY_MOD_7, 174 RV_KEY_MOD_ALTGR = RV_KEY_MOD_8, 175 } rv_key_mods_t; 176 177 typedef enum { 178 RV_MOUSE_0 = (1 << 0), 179 RV_MOUSE_1 = (1 << 1), 180 RV_MOUSE_2 = (1 << 2), 181 RV_MOUSE_3 = (1 << 3), 182 RV_MOUSE_4 = (1 << 4), 183 RV_MOUSE_5 = (1 << 5), 184 RV_MOUSE_6 = (1 << 6), 185 RV_MOUSE_7 = (1 << 7), 186 RV_MOUSE_8 = (1 << 8), 187 RV_MOUSE_9 = (1 << 9), 188 RV_MOUSE_10 = (1 << 10), 189 RV_MOUSE_11 = (1 << 11), 190 RV_MOUSE_12 = (1 << 12), 191 RV_MOUSE_13 = (1 << 13), 192 RV_MOUSE_14 = (1 << 14), 193 RV_MOUSE_15 = (1 << 15), 194 RV_MOUSE_16 = (1 << 16), 195 RV_MOUSE_17 = (1 << 17), 196 RV_MOUSE_18 = (1 << 18), 197 RV_MOUSE_19 = (1 << 19), 198 RV_MOUSE_20 = (1 << 20), 199 RV_MOUSE_21 = (1 << 21), 200 RV_MOUSE_22 = (1 << 22), 201 RV_MOUSE_23 = (1 << 23), 202 RV_MOUSE_24 = (1 << 24), 203 RV_MOUSE_25 = (1 << 25), 204 RV_MOUSE_26 = (1 << 26), 205 RV_MOUSE_27 = (1 << 27), 206 RV_MOUSE_28 = (1 << 28), 207 RV_MOUSE_29 = (1 << 29), 208 RV_MOUSE_30 = (1 << 30), 209 RV_MOUSE_31 = (1 << 31), 210 211 RV_MOUSE_PRIMARY = RV_MOUSE_0, 212 RV_MOUSE_SECONDARY = RV_MOUSE_1, 213 RV_MOUSE_LEFT = RV_MOUSE_0, 214 RV_MOUSE_RIGHT = RV_MOUSE_1, 215 RV_MOUSE_MIDDLE = RV_MOUSE_2, 216 RV_MOUSE_SCROLL_UP = RV_MOUSE_3, 217 RV_MOUSE_SCROLL_DOWN = RV_MOUSE_4, 218 } rv_mouse_mask_t; 219 220 typedef struct { 221 bool8 last_state[RV_KEYCODE_COUNT]; 222 bool8 current_state[RV_KEYCODE_COUNT]; 223 u8 mods; 224 u8 group; 225 226 u64 last_mouse_state; 227 u64 current_mouse_state; 228 } rv_keyboard_context_t; 229 230 // updated when rv_get_events() is called 231 RV_GLOBAL rv_keyboard_context_t rv_keyboard_context; 232 233 RV_GLOBAL void rv_keyboard_context_update(rv_keyboard_context_t* kbd_ctx, rv_event_t* events); 234 235 RV_GLOBAL bool32 rv_key_pressed(rv_keycode_t keycode); 236 RV_GLOBAL bool32 rv_key_down(rv_keycode_t keycode); 237 RV_GLOBAL bool32 rv_key_released(rv_keycode_t keycode); 238 RV_GLOBAL bool32 rv_key_changed(rv_keycode_t keycode); 239 240 RV_GLOBAL bool32 rv_key_mod(u8 mask); 241 242 RV_GLOBAL bool32 rv_mouse_pressed(u32 mask); // any button pressed 243 RV_GLOBAL bool32 rv_mouse_down(u32 mask); // any button down 244 RV_GLOBAL bool32 rv_mouse_released(u32 mask); // any button released 245 RV_GLOBAL bool32 rv_mouse_changed(u32 mask); // any button changed 246 247 248 ////////////////////////////////////////////////////////////////// 249 // Event polling 250 251 typedef enum { 252 RV_EVENT_INVALID, 253 254 RV_EVENT_WINDOW_RESIZE, 255 RV_EVENT_WINDOW_CLOSE, 256 257 RV_EVENT_KEY_PRESS, 258 RV_EVENT_KEY_RELEASE, 259 260 RV_EVENT_BUTTON_PRESS, 261 RV_EVENT_BUTTON_RELEASE, 262 263 RV_EVENT_WINDOW_ENTER, 264 RV_EVENT_WINDOW_LEAVE, 265 } rv_window_event_type_t; 266 267 struct rv_event_t { 268 rv_event_t* next; 269 rv_window_event_type_t type; 270 271 union { 272 struct _rv_key_press_releaase { 273 rv_keycode_t keycode; 274 rv_window_handle_t* window; 275 rv_str8 string; 276 u8 mods; 277 u8 group; 278 u8 native_keycode; // non-layout-sensetive, only for custom logic 279 } key_press; 280 struct _rv_key_press_releaase key_release; 281 282 struct _rv_button_press_releaase { 283 u32 button; // 1, 2, 3, 4... 284 rv_window_handle_t* window; 285 } button_press; 286 struct _rv_button_press_releaase button_release; 287 288 rv_window_handle_t* window_resize; 289 rv_window_handle_t* window_close; 290 rv_window_handle_t* window_enter; 291 rv_window_handle_t* window_leave; 292 }; 293 }; 294 295 typedef enum { 296 RV_EVENT_FLAGS_NONE = 0, 297 } rv_event_flags_t; 298 299 RV_GLOBAL rv_event_t* rv_get_events(rv_arena* arena, rv_event_flags_t flags); // non-blocking 300 // TODO(Samdal): blocking event function? 301 302 303 ////////////////////////////////////////////////////////////////// 304 // Querying 305 306 // if NULL, will get the last created window 307 RV_GLOBAL rv_vec2 rv_window_size(rv_window_handle_t* window); 308 RV_GLOBAL rv_vec2 rv_window_mouse_pos(rv_window_handle_t* window); 309 310 ////////////////////////////////////////////////////////////////// 311 // Rendering 312 313 // if NULL, will get the last created window 314 RV_GLOBAL void rv_window_render_begin(rv_window_handle_t* window); 315 RV_GLOBAL void rv_window_render_end(rv_window_handle_t* window); 316