revolver

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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