Add the ability to create default shaders;

lovr.graphics.newShader('font')
This commit is contained in:
bjorn 2019-05-22 18:00:02 -07:00
parent c464bde609
commit 3bf08f0ca3
4 changed files with 32 additions and 17 deletions

View File

@ -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;

View File

@ -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()));

View File

@ -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;
}
}

View File

@ -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__)