mirror of https://github.com/bjornbytes/lovr.git
Shaders are objects;
This commit is contained in:
parent
9dddad1f1f
commit
a6b6754f57
|
@ -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;
|
||||
}
|
||||
|
|
17
src/shader.c
17
src/shader.c
|
@ -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 }
|
||||
};
|
||||
|
|
12
src/shader.h
12
src/shader.h
|
@ -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[];
|
||||
|
|
Loading…
Reference in New Issue