From a4052430a4592d32a3340c296ea017e4bb99ed3f Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 28 Jul 2018 15:46:46 -0700 Subject: [PATCH] Shader:getBlock; Shader:setBlock; --- src/api/graphics.c | 1 - src/api/types/shader.c | 18 ++++++++++++++++++ src/graphics/opengl.c | 17 ++++++++++++++++- src/graphics/shader.h | 7 +++++++ src/graphics/shaderBlock.h | 6 ------ 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/api/graphics.c b/src/api/graphics.c index 668eeebc..9db0510d 100644 --- a/src/api/graphics.c +++ b/src/api/graphics.c @@ -5,7 +5,6 @@ #include "graphics/material.h" #include "graphics/mesh.h" #include "graphics/model.h" -#include "graphics/shaderBlock.h" #include "data/modelData.h" #include "data/rasterizer.h" #include "data/textureData.h" diff --git a/src/api/types/shader.c b/src/api/types/shader.c index f3bdf487..448be90a 100644 --- a/src/api/types/shader.c +++ b/src/api/types/shader.c @@ -162,8 +162,26 @@ int l_lovrShaderSend(lua_State* L) { return 0; } +int l_lovrShaderGetBlock(lua_State* L) { + Shader* shader = luax_checktype(L, 1, Shader); + const char* name = luaL_checkstring(L, 2); + ShaderBlock* block = lovrShaderGetBlock(shader, name); + luax_pushobject(L, block); + return 1; +} + +int l_lovrShaderSetBlock(lua_State* L) { + Shader* shader = luax_checktype(L, 1, Shader); + const char* name = luaL_checkstring(L, 2); + ShaderBlock* block = luax_checktype(L, 3, ShaderBlock); + lovrShaderSetBlock(shader, name, block); + return 0; +} + const luaL_Reg lovrShader[] = { { "hasUniform", l_lovrShaderHasUniform }, { "send", l_lovrShaderSend }, + { "getBlock", l_lovrShaderGetBlock }, + { "setBlock", l_lovrShaderSetBlock }, { NULL, NULL } }; diff --git a/src/graphics/opengl.c b/src/graphics/opengl.c index 2fb8ded6..d9014a33 100644 --- a/src/graphics/opengl.c +++ b/src/graphics/opengl.c @@ -2,7 +2,6 @@ #include "graphics/canvas.h" #include "graphics/mesh.h" #include "graphics/shader.h" -#include "graphics/shaderBlock.h" #include "graphics/texture.h" #include "resources/shaders.h" #include "data/modelData.h" @@ -1506,6 +1505,22 @@ void lovrShaderSetTexture(Shader* shader, const char* name, Texture** data, int lovrShaderSetUniform(shader, name, UNIFORM_SAMPLER, data, count, sizeof(Texture*), "texture"); } +ShaderBlock* lovrShaderGetBlock(Shader* shader, const char* name) { + int* index = map_get(&shader->blockMap, name); + lovrAssert(index, "No shader block named '%s'", name); + + UniformBlock* block = &shader->blocks.data[*index]; + return block->source; +} + +void lovrShaderSetBlock(Shader* shader, const char* name, ShaderBlock* source) { + int* index = map_get(&shader->blockMap, name); + lovrAssert(index, "No shader block named '%s'", name); + + UniformBlock* block = &shader->blocks.data[*index]; + block->source = source; +} + // ShaderBlock ShaderBlock* lovrShaderBlockCreate(vec_uniform_t* uniforms) { diff --git a/src/graphics/shader.h b/src/graphics/shader.h index e92fa063..03b9e427 100644 --- a/src/graphics/shader.h +++ b/src/graphics/shader.h @@ -7,6 +7,7 @@ #define LOVR_MAX_UNIFORM_LENGTH 64 #define LOVR_MAX_ATTRIBUTE_LENGTH 64 +#define MAX_SHADER_BLOCK_UNIFORMS 32 typedef enum { UNIFORM_FLOAT, @@ -45,6 +46,7 @@ typedef struct { typedef vec_t(Uniform) vec_uniform_t; typedef struct Shader Shader; +typedef struct ShaderBlock ShaderBlock; Shader* lovrShaderCreate(const char* vertexSource, const char* fragmentSource); Shader* lovrShaderCreateDefault(DefaultShader type); @@ -57,3 +59,8 @@ void lovrShaderSetFloat(Shader* shader, const char* name, float* data, int count void lovrShaderSetInt(Shader* shader, const char* name, int* data, int count); void lovrShaderSetMatrix(Shader* shader, const char* name, float* data, int count); void lovrShaderSetTexture(Shader* shader, const char* name, Texture** data, int count); +ShaderBlock* lovrShaderGetBlock(Shader* shader, const char* name); +void lovrShaderSetBlock(Shader* shader, const char* name, ShaderBlock* block); + +ShaderBlock* lovrShaderBlockCreate(vec_uniform_t* uniforms); +void lovrShaderBlockDestroy(void* ref); diff --git a/src/graphics/shaderBlock.h b/src/graphics/shaderBlock.h index d81017e2..6a7dacdb 100644 --- a/src/graphics/shaderBlock.h +++ b/src/graphics/shaderBlock.h @@ -2,9 +2,3 @@ #pragma once -#define MAX_SHADER_BLOCK_UNIFORMS 32 - -typedef struct ShaderBlock ShaderBlock; - -ShaderBlock* lovrShaderBlockCreate(vec_uniform_t* uniforms); -void lovrShaderBlockDestroy(void* ref);