Shader:getBlock; Shader:setBlock;

This commit is contained in:
bjorn 2018-07-28 15:46:46 -07:00
parent 854431c9ea
commit a4052430a4
5 changed files with 41 additions and 8 deletions

View File

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

View File

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

View File

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

View File

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

View File

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