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