blob: 5ece3547e59411c540aa14ec566d9aa4f6869888 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#pragma once
#include <gfx/renderer.h>
#include <gfx/sizes.h>
#include <math/mat4.h>
#include <math/vec3.h>
#include <stdbool.h>
#include <stddef.h>
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*);
|