summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xassets/fragment.glsl2
-rwxr-xr-xassets/vertex.glsl6
-rw-r--r--src/main.c3
-rw-r--r--src/mesh.c40
-rw-r--r--src/mesh.h16
-rw-r--r--src/shader.c18
-rw-r--r--src/shader.h11
7 files changed, 67 insertions, 29 deletions
diff --git a/assets/fragment.glsl b/assets/fragment.glsl
index 831a8ab..4065771 100755
--- a/assets/fragment.glsl
+++ b/assets/fragment.glsl
@@ -1,4 +1,4 @@
-#version 330
+#version 330 core
flat in uint pass_data;
diff --git a/assets/vertex.glsl b/assets/vertex.glsl
index a0af427..d14d852 100755
--- a/assets/vertex.glsl
+++ b/assets/vertex.glsl
@@ -1,12 +1,12 @@
-#version 330
+#version 330 core
in vec3 position;
in uint data;
-flat out uint pass_data;
-
uniform mat4 proj_view;
+flat out uint pass_data;
+
void main(void)
{
gl_Position = proj_view * vec4(position, 1.0);
diff --git a/src/main.c b/src/main.c
index 2ed1a49..4ba34e5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3,6 +3,7 @@
#include "voxel.h"
#include "window.h"
#include "shader.h"
+#include "mesh.h"
int main(void)
{
@@ -35,7 +36,7 @@ int main(void)
camera_proj_view(&camera, proj_view);
shader_bind(shader);
- shader_loadm4f(0, proj_view);
+ shader_load_mat4(0, proj_view);
mesh_bind(&mesh);
mesh_draw(&mesh);
mesh_unbind(&mesh);
diff --git a/src/mesh.c b/src/mesh.c
index 6b2951b..8ee5ace 100644
--- a/src/mesh.c
+++ b/src/mesh.c
@@ -10,13 +10,13 @@ void mesh_init(Mesh *mesh, int vertex_count)
glBindVertexArray(mesh->vao);
}
-static void mesh_store(Mesh *mesh, void *data, int data_len, int dimensions, GLenum type)
+static void mesh_store(Mesh *mesh, void *data, int len, int dimensions, GLenum type)
{
GLuint vbo;
GLint index = mesh->vbos_count;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, data_len, data, GL_STATIC_DRAW);
+ glBufferData(GL_ARRAY_BUFFER, len, data, GL_STATIC_DRAW);
glEnableVertexAttribArray(index);
if (type == GL_FLOAT)
glVertexAttribPointer(index, dimensions, type, GL_FALSE, 0, 0);
@@ -25,26 +25,24 @@ static void mesh_store(Mesh *mesh, void *data, int data_len, int dimensions, GLe
mesh->vbos[mesh->vbos_count++] = vbo;
}
-void mesh_storef(Mesh *mesh, float *data, int data_len, int dimensions)
+void mesh_storef(Mesh *mesh, float *data, int count, int dimensions)
{
- mesh_store(mesh, data, data_len * sizeof(float), dimensions, GL_FLOAT);
+ mesh_store(mesh, data, count * sizeof(float), dimensions, GL_FLOAT);
}
-void mesh_storei(Mesh *mesh, int *data, int data_len, int dimensions)
+void mesh_storei(Mesh *mesh, int *data, int count, int dimensions)
{
- mesh_store(mesh, data, data_len * sizeof(int), dimensions, GL_INT);
+ mesh_store(mesh, data, count * sizeof(int), dimensions, GL_INT);
}
-void mesh_storeu(Mesh *mesh, unsigned int *data, int data_len, int dimensions)
+void mesh_storeu(Mesh *mesh, unsigned int *data, int count, int dimensions)
{
- mesh_store(mesh, data, data_len * sizeof(unsigned int), dimensions,
- GL_UNSIGNED_INT);
+ mesh_store(mesh, data, count * sizeof(unsigned int), dimensions, GL_UNSIGNED_INT);
}
-void mesh_storeb(Mesh *mesh, unsigned char *data, int data_len, int dimensions)
+void mesh_storeb(Mesh *mesh, unsigned char *data, int count, int dimensions)
{
- mesh_store(mesh, data, data_len * sizeof(unsigned char), dimensions,
- GL_UNSIGNED_BYTE);
+ mesh_store(mesh, data, count * sizeof(unsigned char), dimensions, GL_UNSIGNED_BYTE);
}
void mesh_finish(void)
@@ -71,8 +69,26 @@ void mesh_draw(Mesh *mesh)
glDrawArrays(GL_TRIANGLES, 0, mesh->vertex_count);
}
+void mesh_draw_instanced(Mesh *mesh, int count)
+{
+ glDrawArraysInstanced(GL_TRIANGLES, 0, mesh->vertex_count, count);
+}
+
void mesh_free(Mesh *mesh)
{
glDeleteBuffers(mesh->vbos_count, mesh->vbos);
glDeleteVertexArrays(1, &mesh->vao);
}
+
+void uniform_init(Uniform *uniform, void *data, int len)
+{
+ glGenBuffers(1, &uniform->id);
+ glBindBuffer(GL_UNIFORM_BUFFER, uniform->id);
+ glBufferData(GL_UNIFORM_BUFFER, len, data, GL_STATIC_DRAW);
+ glBindBuffer(GL_UNIFORM_BUFFER, 0);
+}
+
+void uniform_free(Uniform *uniform)
+{
+ glDeleteBuffers(1, &uniform->id);
+}
diff --git a/src/mesh.h b/src/mesh.h
index e15b222..451803e 100644
--- a/src/mesh.h
+++ b/src/mesh.h
@@ -12,12 +12,20 @@ typedef struct {
} Mesh;
void mesh_init(Mesh *mesh, int vertex_count);
-void mesh_storef(Mesh *mesh, float *data, int data_len, int dimensions);
-void mesh_storei(Mesh *mesh, int *data, int data_len, int dimensions);
-void mesh_storeu(Mesh *mesh, unsigned int *data, int data_len, int dimensions);
-void mesh_storeb(Mesh *mesh, unsigned char *data, int data_len, int dimensions);
+void mesh_storef(Mesh *mesh, float *data, int count, int dimensions);
+void mesh_storei(Mesh *mesh, int *data, int count, int dimensions);
+void mesh_storeu(Mesh *mesh, unsigned int *data, int count, int dimensions);
+void mesh_storeb(Mesh *mesh, unsigned char *data, int count, int dimensions);
void mesh_finish(void);
void mesh_bind(Mesh *mesh);
void mesh_unbind(Mesh *mesh);
void mesh_draw(Mesh *mesh);
+void mesh_draw_instanced(Mesh *mesh, int count);
void mesh_free(Mesh *mesh);
+
+typedef struct {
+ GLuint id;
+} Uniform;
+
+void uniform_init(Uniform *uniform, void *data, int len);
+void uniform_free(Uniform *uniform);
diff --git a/src/shader.c b/src/shader.c
index eefcfc2..26bb92b 100644
--- a/src/shader.c
+++ b/src/shader.c
@@ -6,6 +6,8 @@
#include "voxel.h"
#include "shader.h"
+static GLint current_program;
+
static char *read_file(const char *filename)
{
FILE *file;
@@ -136,6 +138,7 @@ failure:
void shader_bind(Shader *shader)
{
+ current_program = shader->program_id;
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
@@ -146,6 +149,7 @@ void shader_bind(Shader *shader)
void shader_unbind(void)
{
+ current_program = 0;
glDisable(GL_CULL_FACE);
glUseProgram(0);
}
@@ -165,22 +169,28 @@ GLint shader_uniform_location(Shader *shader, const char *name)
return glGetUniformLocation(shader->program_id, name);
}
-void shader_loadf(GLint location, float value)
+void shader_load_float(GLint location, float value)
{
glUniform1f(location, value);
}
-void shader_loadi(GLint location, int value)
+void shader_load_int(GLint location, int value)
{
glUniform1i(location, value);
}
-void shader_loadv3f(GLint location, vec3 value)
+void shader_load_vec3(GLint location, vec3 value)
{
glUniform3f(location, value[0], value[1], value[2]);
}
-void shader_loadm4f(GLint location, mat4 value)
+void shader_load_mat4(GLint location, mat4 value)
{
glUniformMatrix4fv(location, 1, GL_FALSE, (float *)value);
}
+
+void shader_load_ubo(GLint location, GLuint index, Uniform *uniform)
+{
+ glUniformBlockBinding(current_program, index, location);
+ glBindBufferBase(GL_UNIFORM_BUFFER, location, uniform->id);
+}
diff --git a/src/shader.h b/src/shader.h
index 931dd33..e6f794e 100644
--- a/src/shader.h
+++ b/src/shader.h
@@ -3,6 +3,8 @@
#include <GL/gl.h>
#include <cglm/cglm.h>
+#include "mesh.h"
+
typedef struct {
GLuint program_id;
GLuint vertex_id;
@@ -16,7 +18,8 @@ void shader_unbind(void);
void shader_free(Shader *shader);
GLint shader_uniform_location(Shader *shader, const char *name);
-void shader_loadf(GLint location, float value);
-void shader_loadi(GLint location, int value);
-void shader_loadv3f(GLint location, vec3 value);
-void shader_loadm4f(GLint location, mat4 value);
+void shader_load_float(GLint location, float value);
+void shader_load_int(GLint location, int value);
+void shader_load_vec3(GLint location, vec3 value);
+void shader_load_mat4(GLint location, mat4 value);
+void shader_load_ubo(GLint location, GLuint index, Uniform *uniform);