diff options
Diffstat (limited to 'src/lua/modules')
-rw-r--r-- | src/lua/modules/graphics/je_lua_graphics.cpp | 24 | ||||
-rw-r--r-- | src/lua/modules/thread/je_lua_thread.cpp | 8 | ||||
-rw-r--r-- | src/lua/modules/time/je_lua_time.cpp | 44 | ||||
-rw-r--r-- | src/lua/modules/time/je_lua_timer.cpp | 140 | ||||
-rw-r--r-- | src/lua/modules/time/je_lua_timer.h | 5 | ||||
-rw-r--r-- | src/lua/modules/types.h | 1 |
6 files changed, 178 insertions, 44 deletions
diff --git a/src/lua/modules/graphics/je_lua_graphics.cpp b/src/lua/modules/graphics/je_lua_graphics.cpp index 24cdf59..3ff5710 100644 --- a/src/lua/modules/graphics/je_lua_graphics.cpp +++ b/src/lua/modules/graphics/je_lua_graphics.cpp @@ -482,7 +482,7 @@ namespace JinEngine } if (luax_istype(L, 1, JIN_GRAPHICS_SHADER)) { - Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); Shared<Shader>& jsl = proxy->getShared<Shader>(); jsl->use(); } @@ -499,16 +499,6 @@ namespace JinEngine return 0; } - LUA_IMPLEMENT RenderMode strtomode(const char* str) - { - std::string s = std::string(str); - if (s == "fill") - return RenderMode::FILL; - else if (s == "line") - return RenderMode::LINE; - else return RenderMode::NONE; - } - LUA_IMPLEMENT int l_point(lua_State* L) { int x = luax_checknumber(L, 1); @@ -531,8 +521,7 @@ namespace JinEngine LUA_IMPLEMENT int l_rect(lua_State* L) { - const char* modestr = luax_checkstring(L, 1); - RenderMode mode = strtomode(modestr); + RenderMode mode = static_cast<RenderMode>(luax_checkinteger(L, 1)); if (mode != RenderMode::NONE) { int x = luax_checknumber(L, 2); @@ -552,8 +541,7 @@ namespace JinEngine LUA_IMPLEMENT int l_circle(lua_State* L) { - const char* modestr = luax_checkstring(L, 1); - RenderMode mode = strtomode(modestr); + RenderMode mode = static_cast<RenderMode>(luax_checkinteger(L, 1)); if (mode != RenderMode::NONE) { int x = luax_checknumber(L, 2); @@ -572,8 +560,7 @@ namespace JinEngine LUA_IMPLEMENT int l_triangle(lua_State* L) { - const char* modestr = luax_checkstring(L, 1); - RenderMode mode = strtomode(modestr); + RenderMode mode = static_cast<RenderMode>(luax_checkinteger(L, 1)); if (mode != RenderMode::NONE) { int x = luax_checknumber(L, 2); @@ -598,9 +585,8 @@ namespace JinEngine LUA_IMPLEMENT int l_polygon(lua_State* L) { - const char* modestr = luax_checkstring(L, 1); + RenderMode mode = static_cast<RenderMode>(luax_checkinteger(L, 1)); int n = luax_checknumber(L, 2); - RenderMode mode = strtomode(modestr); if (mode != RenderMode::NONE) { if (!luax_istable(L, 3)) diff --git a/src/lua/modules/thread/je_lua_thread.cpp b/src/lua/modules/thread/je_lua_thread.cpp index dfe45e5..8b8d1d5 100644 --- a/src/lua/modules/thread/je_lua_thread.cpp +++ b/src/lua/modules/thread/je_lua_thread.cpp @@ -126,8 +126,8 @@ namespace JinEngine case Thread::Variant::POINTER: Proxy* p = (Proxy*)v.pointer; Proxy* proxy = luax_newinstance(L, p->getObjectType()); - p->reference->retain(); - proxy->bind(p->reference); + p->retain(); + proxy->bind(p->shared); break; } @@ -161,8 +161,8 @@ namespace JinEngine Proxy* p = (Proxy*)v.pointer; const char* objType = p->getObjectType(); Proxy* proxy = luax_newinstance(L, objType); - p->reference->retain(); - proxy->bind(p->reference); + p->retain(); + proxy->bind(p->shared); break; } diff --git a/src/lua/modules/time/je_lua_time.cpp b/src/lua/modules/time/je_lua_time.cpp index c9f3563..e565eab 100644 --- a/src/lua/modules/time/je_lua_time.cpp +++ b/src/lua/modules/time/je_lua_time.cpp @@ -2,6 +2,7 @@ #include "lua/common/je_lua_common.h" #include "lua/modules/luax.h" #include "libjin/jin.h" +#include "../types.h" using namespace JinEngine::Time; @@ -10,6 +11,12 @@ namespace JinEngine namespace Lua { + static struct + { + float previous; + float current; + } context; + LUA_IMPLEMENT int l_sec(lua_State* L) { luax_pushnumber(L, getSecond()); @@ -18,19 +25,46 @@ namespace JinEngine LUA_IMPLEMENT int l_sleep(lua_State* L) { - double sec = luax_checknumber(L, 1); + double sec = luax_checknumber(L, 1); sleep(sec * 1000.0f); - return 0; + return 0; + } + + LUA_IMPLEMENT int l_newTimer(lua_State* L) + { + Proxy* proxy = luax_newinstance(L, JIN_TIME_TIMER); + proxy->bind(new Shared<Timer>(new Timer(), JIN_TIME_TIMER)); + return 1; + } + + LUA_IMPLEMENT int l_getDelta(lua_State* L) + { + luax_pushnumber(L, context.current - context.previous); + return 1; + } + + LUA_IMPLEMENT int l_step(lua_State* L) + { + context.previous = context.current; + context.current = getSecond(); + return 0; } LUA_IMPLEMENT const luaL_Reg f[] = { - { "second", l_sec }, - { "sleep", l_sleep }, - { 0, 0 }, + { "second", l_sec }, + { "sleep", l_sleep }, + { "newTimer", l_newTimer }, + { "step", l_step }, + { "getDelta", l_getDelta }, + { 0, 0 }, }; + LUA_PORT int luaopen_Timer(lua_State* L); + LUA_EXPORT int luaopen_time(lua_State* L) { + luaopen_Timer(L); + luax_newlib(L, f); return 1; } diff --git a/src/lua/modules/time/je_lua_timer.cpp b/src/lua/modules/time/je_lua_timer.cpp index e57c666..c79c16b 100644 --- a/src/lua/modules/time/je_lua_timer.cpp +++ b/src/lua/modules/time/je_lua_timer.cpp @@ -2,28 +2,146 @@ #include "lua/common/je_lua_common.h" #include "je_lua_timer.h" +using namespace JinEngine::Time; + namespace JinEngine { namespace Lua { -/* - typedef Shared<Timer>& TimerRef; - LUA_IMPLEMENT inline TimerRef checkTimer(lua_State* L) + typedef Shared<Timer>& SharedTimer; + + class Callback + { + public: + Callback() + { + } + ~Callback() + { + delete func; + delete param; + } + + Reference* func; + Reference* param; + }; + +#define TIMER_CALLBACK \ +[=](void* data)->void { \ + Callback* cbk = static_cast<Callback*>(data); \ + cbk->func->push(); \ + cbk->param->push(); \ + luax_call(L, 1, 0); \ +} + +#define FINISH_CALLBACK \ +[=](void* data) { \ + Callback* cbk = static_cast<Callback*>(data); \ + delete cbk; \ +} + + LUA_IMPLEMENT inline SharedTimer checkTimer(lua_State* L) { Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_TIME_TIMER); return proxy->getShared<Timer>(); } -*/ + + // timer:every(time, callback, parameter) LUA_IMPLEMENT int l_every(lua_State* L) { - //TimerRef shared = checkTimer(L); - //Timer* timer = shared.getObject(); - //int n = luax_checkinteger(L, 1); - //int shared = luax_ref(L, 2); - //timer->every(n, [](void* data)->void { - // - //}, ); + SharedTimer shared = checkTimer(L); + Timer* timer = shared.getObject(); + float s = luax_checknumber(L, 2); + Callback* callback = new Callback(); + callback->func = new Reference(L, 3); + callback->param = new Reference(L, 4); + Timer::Handler* handler = timer->every(s, TIMER_CALLBACK, callback, FINISH_CALLBACK); + Proxy* proxy = luax_newinstance(L, JIN_TIME_HANDLER); + proxy->bind(new Shared<Timer::Handler>(handler, JIN_TIME_HANDLER)); + return 1; + } + + // timer:after(time, callback, parameter) + LUA_IMPLEMENT int l_after(lua_State* L) + { + SharedTimer shared = checkTimer(L); + Timer* timer = shared.getObject(); + float s = luax_checknumber(L, 2); + Callback* callback = new Callback(); + callback->func = new Reference(L, 3); + callback->param = new Reference(L, 4); + Timer::Handler* handler = timer->after(s, TIMER_CALLBACK, callback, FINISH_CALLBACK); + Proxy* proxy = luax_newinstance(L, JIN_TIME_HANDLER); + proxy->bind(new Shared<Timer::Handler>(handler, JIN_TIME_HANDLER)); + return 1; + } + + // timer:repeat(time, callback, parameter) + LUA_IMPLEMENT int l_repeat(lua_State* L) + { + SharedTimer shared = checkTimer(L); + Timer* timer = shared.getObject(); + float s = luax_checknumber(L, 2); + int count = luax_checkinteger(L, 3); + Callback* callback = new Callback(); + callback->func = new Reference(L, 4); + callback->param = new Reference(L, 5); + Timer::Handler* handler = timer->repeat(s, count, TIMER_CALLBACK, callback, FINISH_CALLBACK); + Proxy* proxy = luax_newinstance(L, JIN_TIME_HANDLER); + proxy->bind(new Shared<Timer::Handler>(handler, JIN_TIME_HANDLER)); + return 1; + } + + LUA_IMPLEMENT int l_update(lua_State* L) + { + SharedTimer shared = checkTimer(L); + Timer* timer = shared.getObject(); + float s = luax_checknumber(L, 2); + timer->update(s); + return 0; + } + + LUA_IMPLEMENT int l_cancel(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_TIME_TIMER); + Timer* timer = p->getObject<Timer>(); + Proxy* ph = (Proxy*)luax_checktype(L, 2, JIN_TIME_HANDLER); + Timer::Handler* handler = ph->getObject<Timer::Handler>(); + timer->cancel(handler); + return 0; + } + + LUA_IMPLEMENT int l_cancelAll(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_TIME_TIMER); + Timer* timer = p->getObject<Timer>(); + timer->cancelAll(); + return 0; + } + + LUA_IMPLEMENT int l_gc(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_TIME_TIMER); + p->release(); + return 0; + } + + LUA_IMPLEMENT const luaL_Reg f[] = { + { "__gc", l_gc }, + { "every", l_every }, + { "after", l_after }, + { "duplicate", l_repeat }, + { "update", l_update }, + { "cancel", l_cancel }, + { "cancelAll", l_cancelAll }, + { 0, 0 } + }; + + LUA_EXPORT int luaopen_Timer(lua_State* L) + { + luax_newtype(L, JIN_TIME_TIMER, f); + return 0; } } diff --git a/src/lua/modules/time/je_lua_timer.h b/src/lua/modules/time/je_lua_timer.h index 9beadf5..6382c38 100644 --- a/src/lua/modules/time/je_lua_timer.h +++ b/src/lua/modules/time/je_lua_timer.h @@ -8,11 +8,6 @@ namespace JinEngine namespace Lua { - class Timer : public JinEngine::Time::Timer - { - - }; - } } diff --git a/src/lua/modules/types.h b/src/lua/modules/types.h index c6600dc..1ed1016 100644 --- a/src/lua/modules/types.h +++ b/src/lua/modules/types.h @@ -24,5 +24,6 @@ // time module #define JIN_TIME_TIMER "Timer" +#define JIN_TIME_HANDLER "Handler" #endif
\ No newline at end of file |