#pragma once #include #include #include #include #include #include typedef struct Geometry Geometry; typedef struct ShaderProgram ShaderProgram; /// Immediate mode renderer. /// /// Currently, the immediate mode renderer can only draw up to a maximum number /// of primitives per frame. It does not adjust this number dynamically. Keeps /// things simple while the extra complexity is not needed. typedef struct ImmRenderer { GfxCore* gfxcore; ShaderProgram* shader; Geometry* triangles; size_t num_triangle_verts; // Number of triangle verts this frame. // TODO: wireframe rendering. struct { bool wireframe : 1; } flags; vec3 triangle_verts[IMM_MAX_NUM_TRIANGLES * 3]; // Matrix stack contains pre-multiplied matrices. // It is also never empty. The top of the stack is an identity matrix when the // stack is "empty" from the user's perspective. mat4 matrix_stack[IMM_MAX_NUM_MATRICES]; int stack_pointer; } ImmRenderer; /// Create a new immediate mode renderer. bool imm_renderer_make(ImmRenderer*, GfxCore*); /// Destroy the immediate mode renderer. void imm_renderer_destroy(ImmRenderer*); /// Flush draw commands. void imm_renderer_flush(ImmRenderer*);