From 3bf08f0ca3f769c0cac68324e031e443bf337ce0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 22 May 2019 18:00:02 -0700 Subject: [PATCH] Add the ability to create default shaders; lovr.graphics.newShader('font') --- src/api/l_graphics.c | 33 ++++++++++++++++++++++++--------- src/modules/graphics/graphics.c | 2 +- src/modules/graphics/shader.c | 12 ++++++------ src/modules/graphics/shader.h | 2 +- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/api/l_graphics.c b/src/api/l_graphics.c index f2e0bd28..20d398db 100644 --- a/src/api/l_graphics.c +++ b/src/api/l_graphics.c @@ -1406,20 +1406,35 @@ static void luax_parseshaderflags(lua_State* L, int index, ShaderFlag flags[MAX_ } static int l_lovrGraphicsNewShader(lua_State* L) { - luax_readshadersource(L, 1); - luax_readshadersource(L, 2); - const char* vertexSource = lua_tostring(L, 1); - const char* fragmentSource = lua_tostring(L, 2); ShaderFlag flags[MAX_SHADER_FLAGS]; uint32_t flagCount = 0; + Shader* shader; - if (lua_istable(L, 3)) { - lua_getfield(L, 3, "flags"); - luax_parseshaderflags(L, -1, flags, &flagCount); - lua_pop(L, 1); + 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, 2); + const char* vertexSource = lua_tostring(L, 1); + const char* fragmentSource = lua_tostring(L, 2); + + if (lua_istable(L, 3)) { + lua_getfield(L, 3, "flags"); + luax_parseshaderflags(L, -1, flags, &flagCount); + lua_pop(L, 1); + } + + shader = lovrShaderCreateGraphics(vertexSource, fragmentSource, flags, flagCount); } - Shader* shader = lovrShaderCreateGraphics(vertexSource, fragmentSource, flags, flagCount); luax_pushobject(L, shader); lovrRelease(Shader, shader); return 1; diff --git a/src/modules/graphics/graphics.c b/src/modules/graphics/graphics.c index 1e6b28ed..4dfcb551 100644 --- a/src/modules/graphics/graphics.c +++ b/src/modules/graphics/graphics.c @@ -467,7 +467,7 @@ void lovrGraphicsBatch(BatchRequest* req) { // Resolve objects 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; Material* material = req->material ? req->material : (state.defaultMaterial ? state.defaultMaterial : (state.defaultMaterial = lovrMaterialCreate())); diff --git a/src/modules/graphics/shader.c b/src/modules/graphics/shader.c index 035054d7..1b3e36c8 100644 --- a/src/modules/graphics/shader.c +++ b/src/modules/graphics/shader.c @@ -58,13 +58,13 @@ static const char* getUniformTypeName(const Uniform* uniform) { return ""; } -Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type) { +Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type, ShaderFlag* flags, uint32_t flagCount) { switch (type) { - case SHADER_UNLIT: return lovrShaderInitGraphics(shader, NULL, NULL, NULL, 0); - case SHADER_CUBE: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, lovrCubeFragmentShader, NULL, 0); - case SHADER_PANO: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, lovrPanoFragmentShader, NULL, 0); - case SHADER_FONT: return lovrShaderInitGraphics(shader, NULL, lovrFontFragmentShader, NULL, 0); - case SHADER_FILL: return lovrShaderInitGraphics(shader, lovrFillVertexShader, NULL, NULL, 0); + case SHADER_UNLIT: return lovrShaderInitGraphics(shader, NULL, NULL, flags, flagCount); + case SHADER_CUBE: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, lovrCubeFragmentShader, flags, flagCount); + case SHADER_PANO: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, lovrPanoFragmentShader, flags, flagCount); + case SHADER_FONT: return lovrShaderInitGraphics(shader, NULL, lovrFontFragmentShader, flags, flagCount); + case SHADER_FILL: return lovrShaderInitGraphics(shader, lovrFillVertexShader, NULL, flags, flagCount); default: lovrThrow("Unknown default shader type"); return NULL; } } diff --git a/src/modules/graphics/shader.h b/src/modules/graphics/shader.h index 3ca2d863..10fabad5 100644 --- a/src/modules/graphics/shader.h +++ b/src/modules/graphics/shader.h @@ -123,7 +123,7 @@ typedef struct Shader { 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* lovrShaderInitDefault(Shader* shader, DefaultShader type); +Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type, ShaderFlag* flags, uint32_t flagCount); #define lovrShaderCreateGraphics(...) lovrShaderInitGraphics(lovrAlloc(Shader), __VA_ARGS__) #define lovrShaderCreateCompute(...) lovrShaderInitCompute(lovrAlloc(Shader), __VA_ARGS__) #define lovrShaderCreateDefault(...) lovrShaderInitDefault(lovrAlloc(Shader), __VA_ARGS__)