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
|
#include <cglm/cglm.h>
#include "voxel.h"
#include "gl.h"
#define MATS_UBO_BINDING 1
#define FACE_UBO_BINDING 2
VOXEL_RESULT renderer_init(Renderer *renderer)
{
// load quad mesh
float quad_verts[] = {
0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,
};
u16 quad_indicies[] = { 0, 1, 2, 0, 2, 3 };
mesh_init(&renderer->quad, 6);
mesh_store_float(&renderer->quad, quad_verts, 4, 3);
mesh_store_indicies(&renderer->quad, quad_indicies, 6);
mesh_finish();
// load shader
if (shader_init(&renderer->shader, "assets/vertex.glsl", "assets/fragment.glsl") !=
GL_OK)
return VOXEL_ERROR;
// load matricies uniform
uniform_init(&renderer->matrices, sizeof(mat4) * 2);
uniform_bind(&renderer->matrices, 1);
shader_load_ubo(&renderer->shader, "Matrices", MATS_UBO_BINDING);
shader_load_ubo(&renderer->shader, "Face", FACE_UBO_BINDING);
return VOXEL_OK;
}
void renderer_start(Renderer *renderer, Camera *camera)
{
mat4 proj, view;
camera_proj(camera, proj);
camera_view(camera, view);
uniform_store(&renderer->matrices, 0, sizeof(mat4), proj);
uniform_store(&renderer->matrices, sizeof(mat4), sizeof(mat4), view);
shader_bind(&renderer->shader);
mesh_bind(&renderer->quad);
renderer->frustum = camera->frustum;
}
void renderer_draw(Renderer *renderer, Chunk *chunk)
{
Uniform mesh;
AABB aabb;
if (chunk->has_mesh == false)
return;
aabb = chunk_aabb(chunk);
if (!aabb_in_frustum(&aabb, &renderer->frustum))
return;
mesh = chunk->mesh;
uniform_bind(&mesh, FACE_UBO_BINDING);
shader_load_ivec3(&renderer->shader, "chunk_position", chunk->pos);
mesh_draw_instanced(&renderer->quad, mesh.len / sizeof(u64));
uniform_unbind(FACE_UBO_BINDING);
}
void renderer_stop(Renderer *renderer)
{
mesh_unbind(&renderer->quad);
shader_unbind();
}
void renderer_free(Renderer *renderer)
{
uniform_unbind(MATS_UBO_BINDING);
uniform_free(&renderer->matrices);
shader_free(&renderer->shader);
mesh_free(&renderer->quad);
}
|