// ---------------------------------------------------------------------------- // game ui typedef struct guiskin_t { void (*drawrect)(void* userdata, const char *skin, vec4 rect); void (*getskinsize)(void* userdata, const char *skin, vec2 *size); void (*getscissorrect)(void* userdata, const char *skin, vec4 rect, vec4 *dims); bool (*ismouseinrect)(void* userdata, const char *skin, vec4 rect); void (*free)(void* userdata); void *userdata; } guiskin_t; API void gui_pushskin(guiskin_t skin); API void* gui_userdata(); API vec2 gui_getskinsize(const char *skin); API bool gui_ismouseinrect(const char *skin, vec4 rect); // -- API void gui_panel_id(int id, vec4 rect, const char *skin); API void gui_rect_id(int id, vec4 rect, const char *skin); API bool gui_button_id(int id, vec4 rect, const char *skin); API bool gui_slider_id(int id, vec4 rect, const char *skin, float min, float max, float step, float *value); API void gui_panel_end(); API void gui_popskin(); // helpers #define gui_panel(...) gui_panel_id(__LINE__, __VA_ARGS__) #define gui_rect(...) gui_rect_id(__LINE__, __VA_ARGS__) #define gui_button(...) gui_button_id(__LINE__, __VA_ARGS__) #define gui_slider(...) gui_slider_id(__LINE__, __VA_ARGS__) // default renderers /// skinned /* The skinning engine depends on an Aseprite asset with slices set up. While you can specify your own skins for various GUI widgets, some skin variants are hardcoded and expected to be present in your asset: gui_panel(): - "panel" (overridable) gui_button(): - "button" (base overridable) - "_hover" (ex. "scarybtn_hover") - "_press" gui_rect(): - no defaults, always pass your own skin/slice name gui_slider(): - "slider" (overridable) - "slider_cursor" (partially overridable, ex. "bigslider_cursor") - "_hover" (ex. "slider_cursor_hover") - "_press" */ typedef struct skinned_t { atlas_t atlas; float scale; } skinned_t; API guiskin_t gui_skinned(const char *asefile, float scale);