summaryrefslogtreecommitdiff
path: root/src/render.c
blob: b70832bdde6126eae8487fc8805667716c978391 (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
#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, 0, 0, 0, 1, 0, 1, 1, 0, 0,
	};
	mesh_init(&renderer->quad, 6);
	mesh_store_float(&renderer->quad, quad_verts, 6 * 3, 3);
	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);
}