diff options
Diffstat (limited to 'src/lua/graphics/luaopen_JSL.cpp')
-rw-r--r-- | src/lua/graphics/luaopen_JSL.cpp | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/lua/graphics/luaopen_JSL.cpp b/src/lua/graphics/luaopen_JSL.cpp new file mode 100644 index 0000000..93ca5d3 --- /dev/null +++ b/src/lua/graphics/luaopen_JSL.cpp @@ -0,0 +1,146 @@ +#include "lua/luax.h" +#include "libjin/jin.h" +#include "lua/luaopen_types.h" + +namespace jin +{ +namespace lua +{ + + using namespace render; + + static inline JSLProgram* checkJSLProgram(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, TYPE_JSL); + if(proxy != nullptr) + return (JSLProgram*)proxy->object; + return nullptr; + } + + static enum VARIABLE_TYPE + { + INVALID = 0, + + NUMBER, + IMAGE, + CANVAS, + VEC2, + VEC3, + VEC4, + COLOR, + }; + + static VARIABLE_TYPE strtotype(const char* str) + { + std::string s = std::string(str); + if (s == "number") return NUMBER; + else if (s == "Image") return IMAGE; + else if (s == "Canvas") return CANVAS; + else if (s == "vec2") return VEC2; + else if (s == "vec3") return VEC3; + else if (s == "vec4") return VEC4; + else if (s == "Color") return COLOR; + else return INVALID; + } + + /** + * Use send function send variables to JSL program. + */ + static int l_send(lua_State* L) + { + JSLProgram* jsl = checkJSLProgram(L); + // number Image Texel + const char* typestr = luax_checkstring(L, 2); + // variable name + const char* variable = luax_checkstring(L, 3); + if (typestr != nullptr) + { + int type = strtotype(typestr); + switch (type) + { + case NUMBER: + { + float number = luax_checknumber(L, 4); + jsl->sendFloat(variable, number); + break; + } + case IMAGE: + { + Proxy* proxy = (Proxy*)luax_checktype(L, 4, TYPE_IMAGE); + Image* img = (Image*)proxy->object; + jsl->sendImage(variable, img); + break; + } + case CANVAS: + { + Proxy* proxy = (Proxy*)luax_checktype(L, 4, TYPE_IMAGE); + Canvas* canvas = (Canvas*)proxy->object; + jsl->sendCanvas(variable, canvas); + break; + } + case VEC2: + { + float x = luax_checknumber(L, 4); + float y = luax_checknumber(L, 5); + jsl->sendVec2(variable, x, y); + break; + } + case VEC3: + { + float x = luax_checknumber(L, 4); + float y = luax_checknumber(L, 5); + float z = luax_checknumber(L, 6); + jsl->sendVec3(variable, x, y, z); + break; + } + case VEC4: + { + float x = luax_checknumber(L, 4); + float y = luax_checknumber(L, 5); + float z = luax_checknumber(L, 6); + float w = luax_checknumber(L, 7); + jsl->sendVec4(variable, x, y, z, w); + break; + } + case COLOR: + { + color col; + col.rgba.r = luax_checkinteger(L, 4); + col.rgba.g = luax_checkinteger(L, 5); + col.rgba.b = luax_checkinteger(L, 6); + col.rgba.a = luax_checkinteger(L, 7); + jsl->sendColor(variable, &col); + break; + } + default: + return 0; + } + } + return 1; + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, TYPE_JSL); + JSLProgram* jsl = (JSLProgram*)proxy->object; + delete jsl; + return 0; + } + + static const luaL_Reg f[] = { + {"__gc", l_gc }, + {"send", l_send}, + {0, 0} + }; + + /** + * JSL program + */ + int luaopen_JSL(lua_State* L) + { + luax_newtype(L, TYPE_JSL, f); + return 0; + } + +} +}
\ No newline at end of file |