2018-08-01 01:23:04 +00:00
|
|
|
#include "api.h"
|
|
|
|
#include "graphics/shader.h"
|
|
|
|
#include "math/transform.h"
|
|
|
|
|
2018-08-06 17:42:19 +00:00
|
|
|
int l_lovrShaderBlockGetOffset(lua_State* L) {
|
|
|
|
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
|
|
|
|
const char* field = luaL_checkstring(L, 2);
|
|
|
|
const Uniform* uniform = lovrShaderBlockGetUniform(block, field);
|
|
|
|
lua_pushinteger(L, uniform->offset);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2018-08-01 01:23:04 +00:00
|
|
|
int l_lovrShaderBlockGetSize(lua_State* L) {
|
|
|
|
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
|
|
|
|
lua_pushinteger(L, lovrShaderBlockGetSize(block));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2018-08-06 17:41:57 +00:00
|
|
|
int l_lovrShaderBlockIsWritable(lua_State* L) {
|
|
|
|
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
|
|
|
|
lua_pushboolean(L, lovrShaderBlockGetType(block) == BLOCK_STORAGE);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2018-08-01 01:23:04 +00:00
|
|
|
int l_lovrShaderBlockSend(lua_State* L) {
|
|
|
|
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
|
2018-08-06 17:42:23 +00:00
|
|
|
if (lua_type(L, 2) == LUA_TSTRING) {
|
|
|
|
const char* name = luaL_checkstring(L, 2);
|
|
|
|
const Uniform* uniform = lovrShaderBlockGetUniform(block, name);
|
|
|
|
lovrAssert(uniform, "Unknown uniform for ShaderBlock '%s'", name);
|
|
|
|
uint8_t* data = ((uint8_t*) lovrShaderBlockMap(block)) + uniform->offset;
|
|
|
|
luax_checkuniform(L, 3, uniform, data, name);
|
|
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
Blob* blob = luax_checktype(L, 1, Blob);
|
|
|
|
void* data = lovrShaderBlockMap(block);
|
|
|
|
size_t blockSize = lovrShaderBlockGetSize(block);
|
|
|
|
size_t copySize = MIN(blockSize, blob->size);
|
|
|
|
memcpy(data, blob->data, copySize);
|
|
|
|
lua_pushinteger(L, copySize);
|
|
|
|
return 1;
|
|
|
|
}
|
2018-08-01 01:23:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const luaL_Reg lovrShaderBlock[] = {
|
2018-08-06 17:42:19 +00:00
|
|
|
{ "getOffset", l_lovrShaderBlockGetOffset },
|
2018-08-01 01:23:04 +00:00
|
|
|
{ "getSize", l_lovrShaderBlockGetSize },
|
2018-08-06 17:41:57 +00:00
|
|
|
{ "isWritable", l_lovrShaderBlockIsWritable },
|
2018-08-01 01:23:04 +00:00
|
|
|
{ "send", l_lovrShaderBlockSend },
|
|
|
|
{ NULL, NULL }
|
|
|
|
};
|