summaryrefslogtreecommitdiff
path: root/src/render.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-12-11 10:49:50 -0500
committerFreya Murphy <freya@freyacat.org>2025-12-11 10:51:40 -0500
commitfa8fa6784559ed0fc8d780e36880273f77e272c4 (patch)
tree7456a4e9148d47e409ba837bafdc6238b6c757db /src/render.c
parentadd ubos (diff)
downloadvoxel-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.c79
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);
+}