mirror of https://github.com/bjornbytes/lovr.git
Add the ability to create default shaders;
lovr.graphics.newShader('font')
This commit is contained in:
parent
c464bde609
commit
3bf08f0ca3
|
@ -1406,12 +1406,25 @@ static void luax_parseshaderflags(lua_State* L, int index, ShaderFlag flags[MAX_
|
||||||
}
|
}
|
||||||
|
|
||||||
static int l_lovrGraphicsNewShader(lua_State* L) {
|
static int l_lovrGraphicsNewShader(lua_State* L) {
|
||||||
|
ShaderFlag flags[MAX_SHADER_FLAGS];
|
||||||
|
uint32_t flagCount = 0;
|
||||||
|
Shader* shader;
|
||||||
|
|
||||||
|
if (lua_isstring(L, 1) && (lua_istable(L, 2) || lua_gettop(L) == 1)) {
|
||||||
|
DefaultShader shaderType = luaL_checkoption(L, 1, NULL, DefaultShaders);
|
||||||
|
|
||||||
|
if (lua_istable(L, 2)) {
|
||||||
|
lua_getfield(L, 2, "flags");
|
||||||
|
luax_parseshaderflags(L, -1, flags, &flagCount);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
shader = lovrShaderCreateDefault(shaderType, flags, flagCount);
|
||||||
|
} else {
|
||||||
luax_readshadersource(L, 1);
|
luax_readshadersource(L, 1);
|
||||||
luax_readshadersource(L, 2);
|
luax_readshadersource(L, 2);
|
||||||
const char* vertexSource = lua_tostring(L, 1);
|
const char* vertexSource = lua_tostring(L, 1);
|
||||||
const char* fragmentSource = lua_tostring(L, 2);
|
const char* fragmentSource = lua_tostring(L, 2);
|
||||||
ShaderFlag flags[MAX_SHADER_FLAGS];
|
|
||||||
uint32_t flagCount = 0;
|
|
||||||
|
|
||||||
if (lua_istable(L, 3)) {
|
if (lua_istable(L, 3)) {
|
||||||
lua_getfield(L, 3, "flags");
|
lua_getfield(L, 3, "flags");
|
||||||
|
@ -1419,7 +1432,9 @@ static int l_lovrGraphicsNewShader(lua_State* L) {
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader* shader = lovrShaderCreateGraphics(vertexSource, fragmentSource, flags, flagCount);
|
shader = lovrShaderCreateGraphics(vertexSource, fragmentSource, flags, flagCount);
|
||||||
|
}
|
||||||
|
|
||||||
luax_pushobject(L, shader);
|
luax_pushobject(L, shader);
|
||||||
lovrRelease(Shader, shader);
|
lovrRelease(Shader, shader);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -467,7 +467,7 @@ void lovrGraphicsBatch(BatchRequest* req) {
|
||||||
|
|
||||||
// Resolve objects
|
// Resolve objects
|
||||||
Canvas* canvas = state.canvas ? state.canvas : state.camera.canvas;
|
Canvas* canvas = state.canvas ? state.canvas : state.camera.canvas;
|
||||||
Shader* shader = state.shader ? state.shader : (state.defaultShaders[req->shader] ? state.defaultShaders[req->shader] : (state.defaultShaders[req->shader] = lovrShaderCreateDefault(req->shader)));
|
Shader* shader = state.shader ? state.shader : (state.defaultShaders[req->shader] ? state.defaultShaders[req->shader] : (state.defaultShaders[req->shader] = lovrShaderCreateDefault(req->shader, NULL, 0)));
|
||||||
Pipeline* pipeline = req->pipeline ? req->pipeline : &state.pipeline;
|
Pipeline* pipeline = req->pipeline ? req->pipeline : &state.pipeline;
|
||||||
Material* material = req->material ? req->material : (state.defaultMaterial ? state.defaultMaterial : (state.defaultMaterial = lovrMaterialCreate()));
|
Material* material = req->material ? req->material : (state.defaultMaterial ? state.defaultMaterial : (state.defaultMaterial = lovrMaterialCreate()));
|
||||||
|
|
||||||
|
|
|
@ -58,13 +58,13 @@ static const char* getUniformTypeName(const Uniform* uniform) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type) {
|
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type, ShaderFlag* flags, uint32_t flagCount) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SHADER_UNLIT: return lovrShaderInitGraphics(shader, NULL, NULL, NULL, 0);
|
case SHADER_UNLIT: return lovrShaderInitGraphics(shader, NULL, NULL, flags, flagCount);
|
||||||
case SHADER_CUBE: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, lovrCubeFragmentShader, NULL, 0);
|
case SHADER_CUBE: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, lovrCubeFragmentShader, flags, flagCount);
|
||||||
case SHADER_PANO: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, lovrPanoFragmentShader, NULL, 0);
|
case SHADER_PANO: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, lovrPanoFragmentShader, flags, flagCount);
|
||||||
case SHADER_FONT: return lovrShaderInitGraphics(shader, NULL, lovrFontFragmentShader, NULL, 0);
|
case SHADER_FONT: return lovrShaderInitGraphics(shader, NULL, lovrFontFragmentShader, flags, flagCount);
|
||||||
case SHADER_FILL: return lovrShaderInitGraphics(shader, lovrFillVertexShader, NULL, NULL, 0);
|
case SHADER_FILL: return lovrShaderInitGraphics(shader, lovrFillVertexShader, NULL, flags, flagCount);
|
||||||
default: lovrThrow("Unknown default shader type"); return NULL;
|
default: lovrThrow("Unknown default shader type"); return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,7 +123,7 @@ typedef struct Shader {
|
||||||
|
|
||||||
Shader* lovrShaderInitGraphics(Shader* shader, const char* vertexSource, const char* fragmentSource, ShaderFlag* flags, uint32_t flagCount);
|
Shader* lovrShaderInitGraphics(Shader* shader, const char* vertexSource, const char* fragmentSource, ShaderFlag* flags, uint32_t flagCount);
|
||||||
Shader* lovrShaderInitCompute(Shader* shader, const char* source, ShaderFlag* flags, uint32_t flagCount);
|
Shader* lovrShaderInitCompute(Shader* shader, const char* source, ShaderFlag* flags, uint32_t flagCount);
|
||||||
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type);
|
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type, ShaderFlag* flags, uint32_t flagCount);
|
||||||
#define lovrShaderCreateGraphics(...) lovrShaderInitGraphics(lovrAlloc(Shader), __VA_ARGS__)
|
#define lovrShaderCreateGraphics(...) lovrShaderInitGraphics(lovrAlloc(Shader), __VA_ARGS__)
|
||||||
#define lovrShaderCreateCompute(...) lovrShaderInitCompute(lovrAlloc(Shader), __VA_ARGS__)
|
#define lovrShaderCreateCompute(...) lovrShaderInitCompute(lovrAlloc(Shader), __VA_ARGS__)
|
||||||
#define lovrShaderCreateDefault(...) lovrShaderInitDefault(lovrAlloc(Shader), __VA_ARGS__)
|
#define lovrShaderCreateDefault(...) lovrShaderInitDefault(lovrAlloc(Shader), __VA_ARGS__)
|
||||||
|
|
Loading…
Reference in New Issue