#ifndef ui_hpp #define ui_hpp #include "maths.hpp" #include "video.hpp" struct Arena; struct UI { struct Vertex { float x, y, u, v, r, g, b, a; }; struct Colour { uint8_t r, g, b, a; Colour(unsigned rgb, uint8_t a = 0xff); float r_f() { return (float)r / 255.0f; }; float g_f() { return (float)g / 255.0f; }; float b_f() { return (float)b / 255.0f; }; float a_f() { return (float)a / 255.0f; }; }; struct Vertex_Buffer { Staged_Buffer buf; Buffer_Id indices; int usage; void init(Device* dev); void init_indices(Device* dev); void destroy(UI* ui); void update_buffer(Context& ctx); void add_quad( UI* ui, int x, int y, int w, int h, float u0, float v0, float u1, float v1, Colour col ); void add_rect( UI* ui, int x, int y, int w, int h, Colour col ); void add_char(UI* ui, int x, int y, char ch, Colour col); void add_text( UI* ui, int x, int y, const char* txt, Colour col ); void draw( UI* ui, Context& ctx, Pipeline& pip, Render_Pass& rp ); Vertex_Buffer* next; }; struct Rect { int x, y, w, h; }; Heap* heap; Device* device; Texture_Id atlas; Shader_Id shader; Vertex_Format_Id vertex_format; Sampler_Id sampler; Staged_Buffer cbuffer; Vertex_Buffer mesh; struct UI_CBuffer { m4f projection; }; struct { int vert_binding; int atlas_binding; int config_binding; } shader_info; static int text_width(const char* t); static int text_height(const char* t); static UI* create(Device* dev, Arena* a, Shader_Id sh); void init( Device* dev, Heap* h, Texture_Id atlas, Shader_Id sh ); void destroy(); void update(Arena* s); void render(Arena* s, Texture_Id target); }; #endif