diff options
Diffstat (limited to 'src/opengl/shader.c')
-rw-r--r-- | src/opengl/shader.c | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/src/opengl/shader.c b/src/opengl/shader.c new file mode 100644 index 0000000..d78b1ef --- /dev/null +++ b/src/opengl/shader.c @@ -0,0 +1,201 @@ +#include <stdbool.h> +#include <glad/glad.h> +#include <GLFW/glfw3.h> +#include <lua.h> +#include <lauxlib.h> +#include "util/util.h" + +int gl_create_shader(lua_State *L); +int gl_shader_set_source(lua_State *L); +int gl_shader_compile(lua_State *L); +int gl_shader_delete(lua_State *L); + +int gl_program_create(lua_State *L); +int gl_program_attach_shader(lua_State *L); +int gl_program_link(lua_State *L); +int gl_program_use(lua_State *L); + +int gl_uniform_get_location(lua_State *L); +int gl_uniform_1i(lua_State *L); +int gl_uniform_1f(lua_State *L); +int gl_uniform_3f(lua_State *L); +int gl_uniform_4f(lua_State *L); + +int gl_uniform_matrix_4fv(lua_State *L); + + +void setup_shader(lua_State *L, int gl_index) +{ + struct honey_tbl_t tbl[] = { + /* functions */ + H_FUNC("CreateShader", gl_create_shader), + H_FUNC("ShaderSource", gl_shader_set_source), + H_FUNC("CompileShader", gl_shader_compile), + H_FUNC("DeleteShader", gl_shader_delete), + + H_FUNC("CreateProgram", gl_program_create), + H_FUNC("AttachShader", gl_program_attach_shader), + H_FUNC("LinkProgram", gl_program_link), + H_FUNC("UseProgram", gl_program_use), + + H_FUNC("GetUniformLocation", gl_uniform_get_location), + H_FUNC("Uniform1i", gl_uniform_1i), + H_FUNC("Uniform1f", gl_uniform_1i), + H_FUNC("Uniform3f", gl_uniform_1i), + H_FUNC("Uniform4f", gl_uniform_4f), + + H_FUNC("UniformMatrix4fv", gl_uniform_matrix_4fv), + + /******** enums ********/ + /* shader types */ + H_INT("VERTEX_SHADER", GL_VERTEX_SHADER), + H_INT("FRAGMENT_SHADER", GL_FRAGMENT_SHADER), + + H_END + }; + create_table(L, tbl); + append_table(L, gl_index, lua_gettop(L)); + lua_pop(L, 1); +} + + +int gl_create_shader(lua_State *L) +{ + lua_Integer type = luaL_checkinteger(L, 1); + lua_Integer shader = glCreateShader(type); + lua_pushinteger(L, shader); + return 1; +} + + +int gl_shader_set_source(lua_State *L) +{ + lua_Integer shader = luaL_checkinteger(L, 1); + const char *code = luaL_checkstring(L, 2); + glShaderSource(shader, 1, (const GLchar * const*)&code, NULL); + return 0; +} + + +int gl_shader_compile(lua_State *L) +{ + lua_Integer shader = luaL_checkinteger(L, 1); + glCompileShader(shader); + int success; char log[1024]; + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(shader, 1024, NULL, log); + luaL_error(L, "shader compilation failed: %s", log); + } + return 0; +} + + +int gl_shader_delete(lua_State *L) +{ + lua_Integer shader = luaL_checkinteger(L, 1); + glDeleteShader(shader); + return 0; +} + + +int gl_program_create(lua_State *L) +{ + lua_Integer program = glCreateProgram(); + lua_pushinteger(L, program); + return 1; +} + + +int gl_program_attach_shader(lua_State *L) +{ + lua_Integer program, shader; + program = luaL_checkinteger(L, 1); + shader = luaL_checkinteger(L, 2); + glAttachShader(program, shader); + return 0; +} + + +int gl_program_link(lua_State *L) +{ + lua_Integer program = luaL_checkinteger(L, 1); + glLinkProgram(program); + int success; char log[1024]; + glGetProgramiv(program, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(program, 1024, NULL, log); + luaL_error(L, "shader linking failed: %s", log); + } + return 0; +} + + +int gl_program_use(lua_State *L) +{ + lua_Integer program = luaL_checkinteger(L, 1); + glUseProgram(program); + return 0; +} + + +int gl_uniform_get_location(lua_State *L) +{ + lua_Integer program = luaL_checkinteger(L, 1); + const char *name = luaL_checkstring(L, 2); + int location = glGetUniformLocation(program, (const GLchar*)name); + lua_pushinteger(L, location); + return 1; +} + + +int gl_uniform_1i(lua_State *L) +{ + lua_Integer location, v0; + location = luaL_checkinteger(L, 1); + v0 = luaL_checkinteger(L, 2); + glUniform1i(location, v0); + return 0; +} + + +int gl_uniform_1f(lua_State *L) +{ + int location = luaL_checkinteger(L, 1); + double value = luaL_checknumber(L, 2); + glUniform1f(location, value); + return 0; +} + + +int gl_uniform_3f(lua_State *L) +{ + int location = luaL_checkinteger(L, 1); + double v0 = luaL_checknumber(L, 2); + double v1 = luaL_checknumber(L, 3); + double v2 = luaL_checknumber(L, 4); + glUniform3f(location, v0, v1, v2); + return 0; +} + + +int gl_uniform_4f(lua_State *L) +{ + lua_Integer location = luaL_checkinteger(L, 1); + lua_Number v0 = luaL_checknumber(L, 2); + lua_Number v1 = luaL_checknumber(L, 3); + lua_Number v2 = luaL_checknumber(L, 4); + lua_Number v3 = luaL_checknumber(L, 5); + glUniform4f(location, v0, v1, v2, v3); + return 0; +} + + +int gl_uniform_matrix_4fv(lua_State *L) +{ + lua_Integer location = luaL_checkinteger(L, 1); + bool transpose = lua_toboolean(L, 2); + float *value = lua_touserdata(L, 3); + glUniformMatrix4fv(location, 1, transpose, value); + return 0; +} |