summaryrefslogtreecommitdiff
path: root/gfx/include/gfx/renderer.h
blob: 9236e3f5858d7cbe27d7382b6ed495e3f5b9eeed (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#pragma once

#include <math/aabb2.h>
#include <math/aabb3.h>
#include <math/camera.h>
#include <math/defs.h>
#include <math/mat4.h>
#include <math/vec3.h>
#include <math/vec4.h>

typedef struct RenderBackend RenderBackend;
typedef struct Scene         Scene;
typedef struct SceneCamera   SceneCamera;

typedef struct ImmRenderer ImmRenderer;
typedef struct Renderer    Renderer;

// -----------------------------------------------------------------------------
// Main Renderer.
// -----------------------------------------------------------------------------

typedef enum RenderSceneMode {
  RenderDefault,
  RenderDebug,
  RenderNormals,
  RenderNormalMappedNormals,
  RenderTangents
} RenderSceneMode;

typedef struct RenderSceneParams {
  RenderSceneMode    mode;
  const Scene*       scene;
  const SceneCamera* camera;
} RenderSceneParams;

/// Render the scene.
void gfx_render_scene(Renderer*, const RenderSceneParams*);

/// Update the scene.
void gfx_update(Scene*, const SceneCamera*, R t);

// -----------------------------------------------------------------------------
// Immediate Mode Renderer.
// -----------------------------------------------------------------------------

/// Prepare the graphics systems for immediate-mode rendering.
///
/// Call this before issuing any immediate-mode rendering draws.
void gfx_imm_start(ImmRenderer*);

/// End immediate mode rendering.
///
/// Call this after issuing immediate-mode rendering draws and before swapping
/// buffers.
void gfx_imm_end(ImmRenderer*);

/// Draw a set of triangles.
void gfx_imm_draw_triangles(ImmRenderer*, const vec3[], size_t num_triangles);

/// Draw a triangle.
void gfx_imm_draw_triangle(ImmRenderer*, const vec3[3]);

/// Draw a bounding box.
void gfx_imm_draw_aabb2(ImmRenderer*, aabb2);

/// Draw a bounding box.
void gfx_imm_draw_aabb3(ImmRenderer*, aabb3);

/// Draw a box.
///
/// The vertices must be given in the following order:
///
///     7 ----- 6
///    /       /|
///   3 ----- 2 |
///   |       | |
///   | 4 ----- 5
///   |/      |/
///   0 ----- 1
void gfx_imm_draw_box3(ImmRenderer* renderer, const vec3 vertices[8]);

/// Set the camera.
void gfx_imm_set_camera(ImmRenderer*, const Camera*);

/// Load an identity model matrix. Clears the matrix stack.
void gfx_imm_load_identity(ImmRenderer* renderer);

/// Push the given matrix to the matrix stack.
void gfx_imm_push_matrix(ImmRenderer* renderer, const mat4* matrix);

/// Pop the top of the matrix stack.
void gfx_imm_pop_matrix(ImmRenderer* renderer);

/// Push a translation matrix to the matrix stack.
void gfx_imm_translate(ImmRenderer* renderer, vec3 offset);

/// Set the model matrix. Clears the matrix stack.
void gfx_imm_set_model_matrix(ImmRenderer*, const mat4*);

/// Set the view-projection matrix.
void gfx_imm_set_view_projection_matrix(ImmRenderer*, const mat4*);

/// Set the render colour.
void gfx_imm_set_colour(ImmRenderer*, vec4 colour);