diff options
| author | Freya Murphy <freya@freyacat.org> | 2025-12-11 10:49:50 -0500 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2025-12-11 10:51:40 -0500 |
| commit | fa8fa6784559ed0fc8d780e36880273f77e272c4 (patch) | |
| tree | 7456a4e9148d47e409ba837bafdc6238b6c757db /src/render.c | |
| parent | add ubos (diff) | |
| download | voxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.tar.gz voxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.tar.bz2 voxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.zip | |
i did a lot
Diffstat (limited to 'src/render.c')
| -rw-r--r-- | src/render.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/render.c b/src/render.c new file mode 100644 index 0000000..b70832b --- /dev/null +++ b/src/render.c @@ -0,0 +1,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); +} |