aboutsummaryrefslogtreecommitdiff
path: root/src/renderer/imm_renderer_impl.h
blob: 61b49a78ab7bde919cb7b3146ebdd056fc2021be (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
#pragma once

#include <gfx/sizes.h>

#include <math/vec3.h>

#include <stdbool.h>
#include <stddef.h>

typedef struct Geometry      Geometry;
typedef struct GfxCore       GfxCore;
typedef struct IBL           IBL;
typedef struct LLR           LLR;
typedef struct Material      Material;
typedef struct ShaderProgram ShaderProgram;
typedef struct Texture       Texture;

/// 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.
/// TODO: Flush the buffer when it reaches its maximum size to remove this
///  constraint.
typedef struct ImmRenderer {
  GfxCore* gfxcore;
  LLR*     llr;

  ShaderProgram* shader; // Immediate-mode shader program for primitives.
  Geometry*      triangles;
  size_t         num_triangle_verts; // Number of triangle verts this frame.
  // TODO: wireframe rendering.
  struct {
    bool wireframe : 1;
  } flags;
  vec3 triangle_verts[GFX_IMM_MAX_NUM_TRIANGLES * 3];
} ImmRenderer;

/// Create a new immediate mode renderer.
bool gfx_imm_make(ImmRenderer*, GfxCore*, LLR*);

/// Destroy the immediate mode renderer.
void gfx_imm_destroy(ImmRenderer*);