#pragma once #define STB_TRUETYPE_IMPLEMENTATION #include "stb_truetype.h" #include "../core.h" #include "../math.h" #include "../array/array.h" #define BATCH_SIZE 2000 struct TextChar { s64 lsb; s64 advance; Vec2 bbox0; Vec2 bbox1; Vec2 size; }; struct TextState { r32 scale; u32 pixel_size; s32 ascent; s32 descent; s32 linegap; u32 texture_atlas_id; u32 sp; u32 vao; u32 vbo; u32 chunk_size; IVec2 bbox0; IVec2 bbox1; stbtt_fontinfo font; s32* char_indexes; Mat4* transforms; TextChar* char_map; }; struct GLRenderer { // colored quad b8 cq_init; u32 cq_sp; u32 cq_vao; // camera Vec3 preset_up_dir; Mat4 cam_proj; // ui camera b8 ui_cam_update; Vec3 ui_cam_pos; Vec3 ui_cam_look; Mat4 ui_cam_view; // game camera b8 cam_update; Vec3 cam_pos; Vec3 cam_look; Mat4 cam_view; // Batched cq // batching buffer u32 cq_batch_sp; u32 cq_batch_vao; u32 cq_batch_vbo; u32 cq_batch_count; r32_array cq_pos_batch; r32_array cq_color_batch; // Batched line u32 line_sp; u32 line_vao; u32 line_vbo; u32 line_batch_count; r32_array line_pos_batch; r32_array line_color_batch; // ui text TextState ui_text; }; u32 gl_shader_program(char *vs, char *fs); u32 gl_shader_program_from_path(const char *vspath, const char *fspath); // ==================== QUADS ==================== u32 gl_setup_colored_quad(u32 sp); void gl_draw_colored_quad( GLRenderer* renderer, Vec3 position, Vec2 size, Vec3 color ); // batched renderer void gl_setup_colored_quad_optimized( GLRenderer* renderer, u32 sp ); void gl_draw_colored_quad_optimized( GLRenderer* renderer, Vec3 position, Vec2 size, Vec3 color ); void gl_cq_flush(GLRenderer *renderer); // ==================== LINE ==================== void gl_setup_line(GLRenderer *renderer, u32 sp); void gl_draw_line( GLRenderer *renderer, Vec3 start, Vec3 end, Vec3 color ); void gl_line_flush(GLRenderer *renderer); // ==================== FONT RENDERING ==================== void gl_setup_text(TextState *uistate); void gl_render_text(GLRenderer *renderer, char *text, Vec2 position, Vec3 color, r32 font_size); void gl_text_flush(GLRenderer *renderer, u32 render_count);