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,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;
|
||||
|
|
|
@ -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()));
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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__)
|
||||
|
|
Loading…
Reference in New Issue