Shaders are objects;

This commit is contained in:
bjorn 2016-08-02 21:24:18 -07:00
parent 9dddad1f1f
commit a6b6754f57
3 changed files with 37 additions and 4 deletions

View File

@ -50,8 +50,8 @@ int lovrGraphicsSetClearColor(lua_State* L) {
// TODO default shader
int lovrGraphicsSetShader(lua_State* L) {
GLuint shader = (GLuint) luaL_checknumber(L, 1);
glUseProgram(shader);
Shader* shader = (Shader*) luax_checkshader(L, 1);
glUseProgram(shader->id);
return 0;
}
@ -94,10 +94,13 @@ int lovrGraphicsNewShader(lua_State* L) {
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertexShaderSource);
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderSource);
GLuint shader = linkShaders(vertexShader, fragmentShader);
GLuint id = linkShaders(vertexShader, fragmentShader);
Shader* shader = (Shader*) malloc(sizeof(Shader));
shader->id = id;
if (shader) {
lua_pushnumber(L, shader);
luax_pushshader(L, shader);
} else {
lua_pushnil(L);
}
@ -122,5 +125,6 @@ int lovrPushGraphics(lua_State* L) {
luaL_register(L, NULL, lovrGraphics);
luaRegisterType(L, "Model", lovrModel);
luaRegisterType(L, "Buffer", lovrBuffer);
luaRegisterType(L, "Shader", lovrShader);
return 1;
}

View File

@ -2,6 +2,19 @@
#include <stdlib.h>
#include "util.h"
void luax_pushshader(lua_State* L, Shader* shader) {
Shader** userdata = (Shader**) lua_newuserdata(L, sizeof(Shader*));
luaL_getmetatable(L, "Shader");
lua_setmetatable(L, -2);
*userdata = shader;
}
Shader* luax_checkshader(lua_State* L, int index) {
return *(Shader**) luaL_checkudata(L, index, "Shader");
}
GLuint compileShader(GLenum type, const char* source) {
GLuint shader = glCreateShader(type);
@ -51,3 +64,7 @@ GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader) {
return shader;
}
const luaL_Reg lovrShader[] = {
{ NULL, NULL }
};

View File

@ -1,4 +1,16 @@
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include "glfw.h"
typedef struct {
GLuint id;
} Shader;
void luax_pushshader(lua_State* L, Shader* shader);
Shader* luax_checkshader(lua_State* L, int index);
GLuint compileShader(GLuint type, const char* filename);
GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader);
extern const luaL_Reg lovrShader[];