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);
|