aboutsummaryrefslogtreecommitdiff
path: root/src/renderer/imm_renderer_impl.h
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*);