#include #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); }