diff options
Diffstat (limited to 'src/lua/modules')
42 files changed, 2671 insertions, 2423 deletions
diff --git a/src/lua/modules/audio/audio.cpp b/src/lua/modules/audio/audio.cpp index 8e11b88..198323d 100644 --- a/src/lua/modules/audio/audio.cpp +++ b/src/lua/modules/audio/audio.cpp @@ -3,108 +3,121 @@ #include "lua/common/common.h" #include "libjin/jin.h" -namespace jin +namespace JinEngine { -namespace lua -{ + namespace Lua + { - using namespace jin::audio; - using namespace jin::filesystem; + using namespace JinEngine::Audio; + using namespace JinEngine::Filesystem; - typedef SDLAudio Audio; - typedef SDLSource Source; + typedef SDLAudio Audio; + typedef SDLSource Source; - static int l_init(lua_State* L) - { - Audio::Setting setting; - setting.samplerate = 44100; - setting.samples = 44100; - if (!Audio::get()->init(&setting)) + static int l_init(lua_State* L) { - luax_error(L, "could not init audio"); - luax_pushboolean(L, false); + Audio::Setting setting; + setting.samplerate = 44100; + setting.samples = 44100; + if (!Audio::get()->init(&setting)) + { + luax_error(L, "could not init audio"); + luax_pushboolean(L, false); + return 1; + } + luax_pushboolean(L, true); return 1; } - luax_pushboolean(L, true); - return 1; - } - - static int l_play(lua_State* L) - { - Audio::get()->play(); - return 0; - } - - static int l_stop(lua_State* L) - { - Audio::get()->stop(); - return 0; - } - - static int l_pause(lua_State* L) - { - Audio::get()->pause(); - return 0; - } - - static int l_resume(lua_State* L) - { - Audio::get()->resume(); - return 0; - } - - static int l_setVolume(lua_State* L) - { - float volume = luax_checknumber(L, 1); - Audio::get()->setVolume(volume); - return 0; - } - - static int l_newSource(lua_State* L) - { - Filesystem* fs = Filesystem::get(); - const char* f = luax_checkstring(L, 1); - if (!fs->exists(f)) + + static int l_play(lua_State* L) + { + Audio::get()->play(); + return 0; + } + + static int l_stop(lua_State* L) + { + Audio::get()->stop(); + return 0; + } + + static int l_pause(lua_State* L) + { + Audio::get()->pause(); + return 0; + } + + static int l_resume(lua_State* L) + { + Audio::get()->resume(); + return 0; + } + + static int l_setVolume(lua_State* L) + { + float volume = luax_checknumber(L, 1); + Audio::get()->setVolume(volume); + return 0; + } + + static int l_newSource(lua_State* L) { - printf("Error: no such image %s\n", f); - exit(1); + AssetDatabase* fs = AssetDatabase::get(); + const char* f = luax_checkstring(L, 1); + Buffer b; + if (!fs->exists(f)) + { + error(L, "No such image %s", f); + goto fail; + } + if (!fs->read(f, b)) + { + error(L, "Failed to read source file %s", f); + goto fail; + } + Source* src = Source::createSource((void*)&b, b.size()); + if (src == nullptr) + { + error(L, "Failed to decode source file %s", f); + goto fail; + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_AUDIO_SOURCE, sizeof(Proxy)); + proxy->bind(new Ref<Source>(src, JIN_AUDIO_SOURCE)); + return 1; + fail: + luax_pushnil(L); + return 1; } - Buffer b; - fs->read(f, &b); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_AUDIO_SOURCE, sizeof(Proxy)); - Source* src = Source::createSource(b.data, b.size); - proxy->bind(new Ref<Source>(src, JIN_AUDIO_SOURCE)); - return 1; - } - static int l_destroy(lua_State* L) - { - Audio* audio = Audio::get(); - audio->quit(); - return 0; - } - - static const luaL_Reg f[] = { - { "init", l_init }, - { "play", l_play }, - { "stop", l_stop }, - { "pause", l_pause }, - { "resume", l_resume }, - { "setVolume", l_setVolume }, - { "newSource", l_newSource }, - { "destroy", l_destroy }, - { 0, 0 } - }; - - extern int luaopen_Source(lua_State* L); - - int luaopen_audio(lua_State* L) - { - luaopen_Source(L); - - luax_newlib(L, f); - - return 1; - } -} -}
\ No newline at end of file + static int l_destroy(lua_State* L) + { + Audio* audio = Audio::get(); + audio->quit(); + return 0; + } + + static const luaL_Reg f[] = { + { "init", l_init }, + { "play", l_play }, + { "stop", l_stop }, + { "pause", l_pause }, + { "resume", l_resume }, + { "setVolume", l_setVolume }, + { "newSource", l_newSource }, + { "destroy", l_destroy }, + { 0, 0 } + }; + + extern int luaopen_Source(lua_State* L); + + int luaopen_audio(lua_State* L) + { + luaopen_Source(L); + + luax_newlib(L, f); + + return 1; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/audio/source.cpp b/src/lua/modules/audio/source.cpp index 1953121..bf43ceb 100644 --- a/src/lua/modules/audio/source.cpp +++ b/src/lua/modules/audio/source.cpp @@ -3,114 +3,114 @@ #include "lua/common/common.h" #include "lua/modules/types.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - using namespace jin::audio; - - typedef Ref<Source>& SourceRef; - - static inline SourceRef checkSource(lua_State* L) + namespace Lua { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE); - return proxy->getRef<Source>(); - } - static int l_play(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->play(); - return 0; - } - - static int l_stop(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->stop(); - return 0; - } - - static int l_pause(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->pause(); - return 0; - } - - static int l_rewind(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->rewind(); - return 0; - } - - static int l_resume(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->resume(); - return 0; - } - - static int l_isStop(lua_State* L) - { - SourceRef ref = checkSource(L); - bool isStop = ref->isStopped(); - luax_pushboolean(L, isStop); - return 1; - } - - static int l_isPaused(lua_State* L) - { - SourceRef ref = checkSource(L); - bool isPaused = ref->isPaused(); - luax_pushboolean(L, isPaused); - return 1; - } - - static int l_setVolume(lua_State* L) - { - SourceRef ref = checkSource(L); - float volume = luax_checknumber(L, 2); - ref->setVolume(volume); - return 0; - } - - static int l_setLoop(lua_State* L) - { - SourceRef ref = checkSource(L); - bool loop = luax_checkbool(L, 2); - ref->setLoop(loop); - return 0; - } - - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE); - proxy->release(); - return 0; - } - - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "play", l_play }, - { "stop", l_stop }, - { "pause", l_pause }, - { "resume", l_resume }, - { "rewind", l_rewind }, - { "isStop", l_isStop }, - { "isPaused", l_isPaused }, - { "setVolume", l_setVolume }, - { "setLoop", l_setLoop }, - { 0, 0 } - }; + using namespace JinEngine::Audio; + + typedef Ref<Source>& SourceRef; + + static inline SourceRef checkSource(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE); + return proxy->getRef<Source>(); + } + + static int l_play(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->play(); + return 0; + } + + static int l_stop(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->stop(); + return 0; + } + + static int l_pause(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->pause(); + return 0; + } + + static int l_rewind(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->rewind(); + return 0; + } + + static int l_resume(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->resume(); + return 0; + } + + static int l_isStop(lua_State* L) + { + SourceRef ref = checkSource(L); + bool isStop = ref->isStopped(); + luax_pushboolean(L, isStop); + return 1; + } + + static int l_isPaused(lua_State* L) + { + SourceRef ref = checkSource(L); + bool isPaused = ref->isPaused(); + luax_pushboolean(L, isPaused); + return 1; + } + + static int l_setVolume(lua_State* L) + { + SourceRef ref = checkSource(L); + float volume = luax_checknumber(L, 2); + ref->setVolume(volume); + return 0; + } + + static int l_setLoop(lua_State* L) + { + SourceRef ref = checkSource(L); + bool loop = luax_checkbool(L, 2); + ref->setLoop(loop); + return 0; + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE); + proxy->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "play", l_play }, + { "stop", l_stop }, + { "pause", l_pause }, + { "resume", l_resume }, + { "rewind", l_rewind }, + { "isStop", l_isStop }, + { "isPaused", l_isPaused }, + { "setVolume", l_setVolume }, + { "setLoop", l_setLoop }, + { 0, 0 } + }; - int luaopen_Source(lua_State* L) - { - luax_newtype(L, JIN_AUDIO_SOURCE, f); - return 0; - } - -} // lua -} // jin
\ No newline at end of file + int luaopen_Source(lua_State* L) + { + luax_newtype(L, JIN_AUDIO_SOURCE, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/bit/bit.cpp b/src/lua/modules/bit/bit.cpp index 5b18125..cedd60a 100644 --- a/src/lua/modules/bit/bit.cpp +++ b/src/lua/modules/bit/bit.cpp @@ -2,83 +2,83 @@ #include "libjin/jin.h" #include <cstdlib> -namespace jin +namespace JinEngine { -namespace lua -{ - - static int l_and(lua_State* L) + namespace Lua { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a & b); - return 1; - } - static int l_or(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a | b); - return 1; - } + static int l_and(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a & b); + return 1; + } - static int l_xor(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a ^ b); - return 1; - } + static int l_or(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a | b); + return 1; + } - static int l_not(lua_State* L) - { - int n = luax_checkinteger(L, 1); - luax_pushinteger(L, ~n); - return 1; - } + static int l_xor(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a ^ b); + return 1; + } - static int l_lshift(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a << b); - return 1; - } + static int l_not(lua_State* L) + { + int n = luax_checkinteger(L, 1); + luax_pushinteger(L, ~n); + return 1; + } - static int l_rshift(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a >> b); - return 1; - } + static int l_lshift(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a << b); + return 1; + } - static int l_include(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushboolean(L, (a & b) == b); - return 1; - } + static int l_rshift(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a >> b); + return 1; + } - static const luaL_Reg f[] = { - { "bAnd", l_and }, - { "bOr" , l_or }, - { "bXor", l_xor }, - { "bNot", l_not }, - { "bLs", l_lshift }, - { "bRs", l_rshift }, - { "bInc", l_include }, - { 0, 0 } - }; + static int l_include(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushboolean(L, (a & b) == b); + return 1; + } - int luaopen_bit(lua_State* L) - { - luax_newlib(L, f); + static const luaL_Reg f[] = { + { "bAnd", l_and }, + { "bOr" , l_or }, + { "bXor", l_xor }, + { "bNot", l_not }, + { "bLs", l_lshift }, + { "bRs", l_rshift }, + { "bInc", l_include }, + { 0, 0 } + }; + + int luaopen_bit(lua_State* L) + { + luax_newlib(L, f); - return 1; - } + return 1; + } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/core/core.cpp b/src/lua/modules/core/core.cpp index 0243554..a576bec 100644 --- a/src/lua/modules/core/core.cpp +++ b/src/lua/modules/core/core.cpp @@ -1,44 +1,46 @@ #include "lua/modules/luax.h" #include "libjin/jin.h" -namespace jin +namespace JinEngine { -namespace lua -{ - using namespace jin::core; - - static int l_running(lua_State* L) + namespace Lua { - static Game* game = Game::get(); - bool running = game->running(); - luax_pushboolean(L, running); - return 1; - } - static int l_stop(lua_State* L) - { - Game::get()->stop(); - return 0; - } + using namespace JinEngine::Core; - static int l_quit(lua_State* L) - { - Game::get()->quit(); - return 0; - } - - static const luaL_Reg f[] = { - {"running", l_running }, - {"stop", l_stop }, - {"quit", l_quit }, - {0, 0 } - }; - - int luaopen_core(lua_State* L) - { - luax_newlib(L, f); + static int l_running(lua_State* L) + { + static Game* game = Game::get(); + bool running = game->running(); + luax_pushboolean(L, running); + return 1; + } + + static int l_stop(lua_State* L) + { + Game::get()->stop(); + return 0; + } + + static int l_quit(lua_State* L) + { + Game::get()->quit(); + return 0; + } + + static const luaL_Reg f[] = { + { "running", l_running }, + { "stop", l_stop }, + { "quit", l_quit }, + { 0, 0 } + }; + + int luaopen_core(lua_State* L) + { + luax_newlib(L, f); + + return 1; + } - return 1; - } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/embed/boot.lua.h b/src/lua/modules/embed/boot.lua.h deleted file mode 100644 index d84ca21..0000000 --- a/src/lua/modules/embed/boot.lua.h +++ /dev/null @@ -1,178 +0,0 @@ -/* boot.lua */ -static const char* boot_lua = R"( -jin._argv[2] = jin._argv[2] or '.' -jin.filesystem.init() -jin.filesystem.mount(jin._argv[2]) - -------------------------------------------------------------------------- --- Config game -------------------------------------------------------------------------- - -jin.config = {} -if jin.filesystem.exist("config.lua") then - jin.config = require "config" -end -jin.config.width = jin.config.width or 576 -jin.config.height = jin.config.height or 448 -jin.config.vsync = jin.config.vsync or false -jin.config.title = jin.config.title or ("jin v" .. jin.version()) -jin.config.resizable = jin.config.resizable or false -jin.config.fullscreen = jin.config.fullscreen or false - -------------------------------------------------------------------------- --- Initialize sub systems -------------------------------------------------------------------------- - -jin.graphics.init(jin.config) -jin.audio.init() - -------------------------------------------------------------------------- --- Default game loop -------------------------------------------------------------------------- - -local function call(func, ...) - if func then - return func(...) - end -end - -jin.core.setHandler = function(handler) - if handler == nil then - return - end - jin.core.onLoad = handler.onLoad - jin.core.onEvent = handler.onEvent - jin.core.onUpdate = handler.onUpdate - jin.core.onDraw = handler.onDraw -end - -function jin.core.run() - call(jin.core.onLoad) - local dt = 0 - local previous = jin.time.second() - local current = previous - while jin.core.running() do - for _, e in pairs(jin.event.poll()) do - if e.type == "keydown" then - jin.keyboard.set(e.key, true) - elseif e.type == "keyup" then - jin.keyboard.set(e.key, false) - end - call(jin.core.onEvent, e) - end - - previous = current - current = jin.time.second() - dt = current - previous - - call(jin.core.onUpdate, dt) - - if jin.graphics then - jin.graphics.unbindCanvas() - jin.graphics.clear() - jin.graphics.setColor() - jin.graphics.setFont() - call(jin.core.onDraw) - jin.graphics.present() - end - - if jin.time then - jin.time.sleep(0.001) - end - end -end - -------------------------------------------------------------------------- --- No game handler -------------------------------------------------------------------------- - -jin.nogame = { - cs = 64, - sw = jin.graphics.getWidth(), - sh = jin.graphics.getHeight(), - cw = 0, - ch = 0, - ww = 6, - ww2 = 6*2, - speed = 4, - t = 0, - onLoad = function() - local nogame = jin.nogame - nogame.cw = nogame.sw / nogame.cs - nogame.ch = nogame.sh / nogame.cs - nogame.t = nogame.ww - 1 - end, - onEvent = function(e) - if e.type == 'quit' then - jin.core.stop() - end - end, - onUpdate = function(dt) - local nogame = jin.nogame - nogame.t = nogame.t + dt * nogame.speed - if nogame.t > nogame.ww2 then - nogame.t = nogame.t - nogame.ww2 - end - end, - circle = function(x, y, r) - local nogame = jin.nogame - if r % nogame.ww2 > nogame.ww then - return - end - r = math.sin((r/nogame.ww)*math.pi)*nogame.cs/2 - local fact = (x + y) / nogame.ch * nogame.cw - jin.graphics.setColor( - 155 + 100 * math.sin(fact), - 155 + 100 * math.cos(fact), - 155 + 100 * math.sin(fact * fact), - 255 - ) - jin.graphics.circle("fill", x*nogame.cs + nogame.cs/2, y*nogame.cs + nogame.cs/2, r) - end, - onDraw = function() - local nogame = jin.nogame - for y = 0, nogame.ch - 1 do - for x = 0, nogame.cw - 1 do - nogame.circle(x, y, nogame.t+x+y) - end - end - end -} - -------------------------------------------------------------------------- --- Boot jin -------------------------------------------------------------------------- - -local function onError(msg) - local tab = ' ' - print("Error:\n" .. msg) - function jin.core.onEvent(e) - if e.type == 'quit' then - jin.core.stop() - end - end - local ww, wh = jin.graphics.getSize() - function jin.core.onDraw() - jin.graphics.write("Error: ", 10, 10, 30, 3, 30) - jin.graphics.write(msg, 10, 50) - end -end - -local function boot() - if jin.filesystem.exist("main.lua") then - -- require main game script - xpcall(function() require"main" end, onError) - jin.core.run() - else - -- no game - jin.core.setHandler(jin.nogame) - jin.core.run() - end - jin.graphics.destroy() - jin.audio.destroy() - jin.core.quit() -end - -xpcall(boot, onError) - -)"; diff --git a/src/lua/modules/embed/embed.h b/src/lua/modules/embed/embed.h deleted file mode 100644 index 18ed1d8..0000000 --- a/src/lua/modules/embed/embed.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __JIN_LUA_EMBED_H -#define __JIN_LUA_EMBED_H -#include <cstring> - -namespace jin -{ -namespace embed -{ - - /** - * embed lua script to context. - */ -#define embed(L, script, name)\ - if(luax_loadbuffer(L, script, strlen(script), name) == 0)\ - lua_call(L, 0, 0); - - /** - * embed structure. - */ - struct jin_Embed - { - const char* file, *source; - }; - - static void boot(lua_State* L) - { - // embed scripts - #include "graphics.lua.h" // graphics - #include "keyboard.lua.h" // keyboard - #include "mouse.lua.h" // mouse - #include "boot.lua.h" // boot - - // embed scripts - const jin_Embed scripts[] = { - { "graphics.lua", graphics_lua }, - { "keyboard.lua", keyboard_lua }, - { "mouse.lua", mouse_lua }, - { "boot.lua", boot_lua }, - { 0, 0 } - }; - - // load all emebd lua scripts - for (int i = 0; scripts[i].file; ++i) - embed(L, scripts[i].source, scripts[i].file); - } -} -} - -#endif
\ No newline at end of file diff --git a/src/lua/modules/embed/graphics.lua.h b/src/lua/modules/embed/graphics.lua.h deleted file mode 100644 index 1414efc..0000000 --- a/src/lua/modules/embed/graphics.lua.h +++ /dev/null @@ -1,4 +0,0 @@ -/* graphics.lua */ -static const char* graphics_lua = R"( -jin.graphics = jin.graphics or {} -)"; diff --git a/src/lua/modules/embed/keyboard.lua.h b/src/lua/modules/embed/keyboard.lua.h deleted file mode 100644 index 77bf3a9..0000000 --- a/src/lua/modules/embed/keyboard.lua.h +++ /dev/null @@ -1,15 +0,0 @@ - -static const char* keyboard_lua = R"( -jin.keyboard = jin.keyboard or {} - -local keys = {} - -function jin.keyboard.isDown(k) - return keys[k] -end - -function jin.keyboard.set(k, status) - keys[k] = status -end - -)"; diff --git a/src/lua/modules/embed/mouse.lua.h b/src/lua/modules/embed/mouse.lua.h deleted file mode 100644 index 3c222f3..0000000 --- a/src/lua/modules/embed/mouse.lua.h +++ /dev/null @@ -1,14 +0,0 @@ -static const char* mouse_lua = R"( -jin.mouse = jin.mouse or {} - -local button = {} - -function jin.mouse.isDown(btn) - return button[btn] -end - -function jin.mouse.set(btn, status) - button[btn] = status -end - -)";
\ No newline at end of file diff --git a/src/lua/modules/embed/net.lua.h b/src/lua/modules/embed/net.lua.h deleted file mode 100644 index 4d89dc7..0000000 --- a/src/lua/modules/embed/net.lua.h +++ /dev/null @@ -1,4 +0,0 @@ -/* net.lua */ -static const char* net_lua = R"( -jin.net = jin.net or {} -)";
\ No newline at end of file diff --git a/src/lua/modules/embed/path.lua.h b/src/lua/modules/embed/path.lua.h deleted file mode 100644 index 648adf8..0000000 --- a/src/lua/modules/embed/path.lua.h +++ /dev/null @@ -1,14 +0,0 @@ -/* path.lua */ -static const char* path_lua = R"( -jin.path = jin.path or {} - --- game root directory -jin._root = nil - --- return full path of a given path -function jin.path.full(path) - local root = jin._dir .. '/' .. jin._argv[2] - return root .. '/' .. path -end - -)";
\ No newline at end of file diff --git a/src/lua/modules/event/event.cpp b/src/lua/modules/event/event.cpp index af9f8fc..9f565d0 100644 --- a/src/lua/modules/event/event.cpp +++ b/src/lua/modules/event/event.cpp @@ -4,103 +4,127 @@ #include "lua/modules/luax.h" #include "libjin/jin.h" -namespace jin -{ -namespace lua +namespace JinEngine { + namespace Lua + { - using namespace jin::input; + using namespace JinEngine; + using namespace JinEngine::Input; - /** - * Load event poll, return a iterator(a table). - */ - static int l_event_poll(lua_State *L) - { - // table to store events - luax_newtable(L); - static Event e; - int i = 1; - poll: - while (pollEvent(&e)) + /** + * Load event poll, return a iterator(a table). + */ + static int l_event_poll(lua_State *L) { - // each event is a table + /* table to store events */ luax_newtable(L); - switch (e.type) + static Event e; + int i = 1; + poll: + while (pollEvent(&e)) { - case EventType::QUIT: - luax_setfield_string(L, "type", "quit"); - break; + /** + * TODO: ڴСıʱҪtransform + * + */ + luax_newtable(L); + switch (e.type) + { + case EventType::QUIT: + luax_setfieldstring(L, "type", "Quit"); + break; - case EventType::KEY_DOWN: - luax_setfield_string(L, "type", "keydown"); - luax_setfield_string(L, "key", getKeyName(e.key.keysym.sym)); - break; - - case EventType::KEY_UP: - luax_setfield_string(L, "type", "keyup"); - luax_setfield_string(L, "key", getKeyName(e.key.keysym.sym)); - break; + case EventType::KEY_DOWN: + case EventType::KEY_UP: + luax_setfieldstring(L, "type", e.type == EventType::KEY_DOWN ? "KeyDown" : "KeyUp"); + luax_setfieldstring(L, "key", getKeyName(e.key.keysym.sym)); + break; - case EventType::MOUSE_MOTION: - luax_setfield_string(L, "type", "mousemotion"); - luax_setfield_number(L, "x", e.motion.x); - luax_setfield_number(L, "y", e.motion.y); - break; + case EventType::MOUSE_MOTION: + luax_setfieldstring(L, "type", "MouseMotion"); + luax_setfieldnumber(L, "x", e.motion.x); + luax_setfieldnumber(L, "y", e.motion.y); + break; - case EventType::MOUSE_BUTTON_DOWN: - luax_setfield_string(L, "type", "mousebuttondown"); - luax_setfield_string(L, "button", getButtonName(e.button.button)); - luax_setfield_number(L, "x", e.button.x); - luax_setfield_number(L, "y", e.button.y); - break; + case EventType::MOUSE_BUTTON_DOWN: + case EventType::MOUSE_BUTTON_UP: + luax_setfieldstring(L, "type", e.type == EventType::MOUSE_BUTTON_DOWN ? "MouseButtonDown" : "MouseButtonUp"); + luax_setfieldstring(L, "button", getButtonName(e.button.button)); + luax_setfieldnumber(L, "x", e.button.x); + luax_setfieldnumber(L, "y", e.button.y); + break; - case EventType::MOUSE_BUTTON_UP: - luax_setfield_string(L, "type", "mousebuttonup"); - luax_setfield_string(L, "button", getButtonName(e.button.button)); - luax_setfield_number(L, "x", e.button.x); - luax_setfield_number(L, "y", e.button.y); - break; + case EventType::MOUSE_WHEEL: + luax_setfieldstring(L, "type", "Wheel"); + if(e.wheel.x == -1) + luax_setfieldstring(L, "x", "Left"); + else if(e.wheel.x == 1) + luax_setfieldstring(L, "x", "Right"); + else + luax_setfieldstring(L, "x", "None"); + if (e.wheel.y == -1) + luax_setfieldstring(L, "y", "Near"); + else if (e.wheel.y == 1) + luax_setfieldstring(L, "y", "Far"); + else + luax_setfieldstring(L, "y", "None"); + break; - case EventType::MOUSE_WHEEL: - luax_setfield_string(L, "type", "wheel"); - if(e.wheel.x == -1) - luax_setfield_string(L, "x", "left"); - else if(e.wheel.x == 1) - luax_setfield_string(L, "x", "right"); - else - luax_setfield_string(L, "x", "none"); - if (e.wheel.y == -1) - luax_setfield_string(L, "y", "near"); - else if (e.wheel.y == 1) - luax_setfield_string(L, "y", "far"); - else - luax_setfield_string(L, "y", "none"); - break; - - default: - /* ignore other events */ - luax_pop(L, 1); // pop table out - goto poll; - break; + case EventType::JOYBUTTONDOWN: + case EventType::JOYBUTTONUP: + luax_setfieldstring(L, "type", e.type == EventType::JOYBUTTONDOWN ? "JoyButtonDown" : "JoyButtonUp"); + luax_setfieldinteger(L, "which", e.jbutton.which); + luax_setfieldstring(L, "button", Input::getJoyButtonName(e.jbutton.button)); + break; + + case EventType::JOYAXISMOTION: + luax_setfieldstring(L, "type", "JoyAxisMotion"); + luax_setfieldinteger(L, "which", e.jaxis.which); + luax_setfieldfstring(L, "axis", Input::getJoyAxisName(e.jaxis.axis)); + break; + + case EventType::JOYBALLMOTION: + case EventType::JOYHATMOTION: + + case EventType::JOYDEVICEADDED: + case EventType::JOYDEVICEREMOVED: + luax_setfieldfstring(L, "type", e.type == EventType::JOYDEVICEADDED ? "JoyDeviceAdded" : "JoyDeviceRemoved"); + luax_setfieldinteger(L, "which", e.jdevice.which); + break; + + //https://stackoverflow.com/questions/50022316/what-is-sdl-joystick-and-what-is-sdl-gamecontroller-what-are-the-relationships + case EventType::CONTROLLERBUTTONDOWN: + case EventType::CONTROLLERBUTTONUP: + + + case EventType::CONTROLLERAXISMOTION: + + + default: + /* ignore other events */ + luax_pop(L, 1); // pop table out + goto poll; + break; + } + luax_rawseti(L, -2, i++); } - luax_rawseti(L, -2, i++); + return 1; } - return 1; - } - static const luaL_Reg f[] = { - { "poll", l_event_poll }, - { 0, 0 } - }; + static const luaL_Reg f[] = { + { "poll", l_event_poll }, + { 0, 0 } + }; - /** - * load event module - */ - int luaopen_event(lua_State* L) - { - luax_newlib(L, f); - return 1; - } + /** + * load event module + */ + int luaopen_event(lua_State* L) + { + luax_newlib(L, f); + return 1; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/filesystem/filesystem.cpp b/src/lua/modules/filesystem/filesystem.cpp index 55f4c06..7466ce8 100644 --- a/src/lua/modules/filesystem/filesystem.cpp +++ b/src/lua/modules/filesystem/filesystem.cpp @@ -2,136 +2,139 @@ #include "libjin/jin.h" #include <string> -using namespace jin::filesystem; +using namespace JinEngine::Filesystem; -namespace jin +namespace JinEngine { -namespace lua -{ - - static struct + namespace Lua { - Filesystem* fs; - } context; - static int l_init(lua_State* L) - { - context.fs = Filesystem::get(); - return 0; - } - - /** - * set current game root, like - * C:/jin/games/tank/ - */ - static int l_mount(lua_State* L) - { - const char* path = luax_checkstring(L, 1); - context.fs->mount(path); - return 0; - } - - /** - * - */ - static int l_isDir(lua_State *L) - { - const char* path = luax_checkstring(L, 1); - int r = context.fs->isDir(path); - luax_pushboolean(L, r); - return 1; - } - - /** - * - */ - static int l_exist(lua_State * L) - { - const char* path = luax_checkstring(L, 1); - int r = context.fs->exists(path); - luax_pushboolean(L, r); - return 1; - } + static struct + { + AssetDatabase* fs; + } context; - static int l_isdir(lua_State* L) - { - const char* path = luax_checkstring(L, 1); - int r = context.fs->isDir(path); - luax_pushboolean(L, r); - return 1; - } - - // load but dont run it - static int loadf(lua_State* L) - { - const char* filename = lua_tostring(L, -1); - Buffer bf; - context.fs->read(filename, &bf); - luax_loadbuffer(L, (const char*)bf.data, bf.size, filename); - return 1; - } - - static int loader(lua_State* L) - { - const char * filename = lua_tostring(L, -1); + static int l_init(lua_State* L) + { + context.fs = AssetDatabase::get(); + return 0; + } - std::string tmp(filename); - tmp += ".lua"; + static int l_mount(lua_State* L) + { + const char* path = luax_checkstring(L, 1); + context.fs->mount(path); + return 0; + } - int size = tmp.size(); + static int l_exist(lua_State * L) + { + const char* path = luax_checkstring(L, 1); + int r = context.fs->exists(path); + luax_pushboolean(L, r); + return 1; + } - for (int i = 0; i<size - 4; ++i) + static int l_isDir(lua_State* L) { - if (tmp[i] == '.') - { - tmp[i] = '/'; - } + const char* path = luax_checkstring(L, 1); + int r = context.fs->isDir(path); + luax_pushboolean(L, r); + return 1; } - if (context.fs->exists(tmp.c_str())) + static int l_isFile(lua_State* L) { - lua_pop(L, 1); - lua_pushstring(L, tmp.c_str()); - return loadf(L); + const char* path = luax_checkstring(L, 1); + int r = context.fs->isFile(path); + luax_pushboolean(L, r); + return 1; } - tmp = filename; - size = tmp.size(); - for (int i = 0; i<size; ++i) + static int loadbuffer(lua_State* L) { - if (tmp[i] == '.') - tmp[i] = '/'; + const char* filename = lua_tostring(L, -1); + Buffer bf; + context.fs->read(filename, bf); + luax_loadbuffer(L, (const char*)&bf, bf.size(), filename); + return 1; } - if (context.fs->isDir(tmp.c_str())) + static int loader(lua_State* L) { - tmp += "/init.lua"; + const char * filename = lua_tostring(L, -1); + + std::string tmp(filename); + tmp += ".lua"; + + int size = tmp.size(); + + for (int i = 0; i<size - 4; ++i) + { + if (tmp[i] == '.') + { + tmp[i] = '/'; + } + } + if (context.fs->exists(tmp.c_str())) { lua_pop(L, 1); lua_pushstring(L, tmp.c_str()); - return loadf(L); + return loadbuffer(L); + } + + tmp = filename; + size = tmp.size(); + for (int i = 0; i<size; ++i) + { + if (tmp[i] == '.') + tmp[i] = '/'; } - } - lua_pushfstring(L, "\n\tno file \"%s\" in jin game directories.\n", (tmp + ".lua").c_str()); - return 1; - } + if (context.fs->isDir(tmp.c_str())) + { + tmp += "/init.lua"; + if (context.fs->exists(tmp.c_str())) + { + lua_pop(L, 1); + lua_pushstring(L, tmp.c_str()); + return loadbuffer(L); + } + } - static const luaL_Reg f[] = { - { "init", l_init }, - { "mount", l_mount }, - { "isdir", l_isDir }, - { "exist", l_exist }, - { 0, 0 } - }; + lua_pushfstring(L, "\n\tno file \"%s\" in jin game directories.\n", (tmp + ".lua").c_str()); + return 1; + } - int luaopen_filesystem(lua_State* L) - { - luax_newlib(L, f); - luax_register_searcher(L, loader, 1); - return 0; - } + static int l_read(lua_State* L) + { + AssetDatabase* fs = context.fs; + const char* file = luax_checkstring(L, 1); + unsigned int len; + Buffer buffer; + fs->read(file, buffer); + luax_pushstring(L, (char*)&buffer); + luax_pushinteger(L, buffer.size()); + return 2; + } + + static const luaL_Reg f[] = { + { "init", l_init }, + { "mount", l_mount }, + { "isDirectory", l_isDir }, + { "isFile", l_isFile }, + { "exist", l_exist }, + { "read", l_read }, + { 0, 0 } + }; + + int luaopen_filesystem(lua_State* L) + { + luax_newlib(L, f); + luax_registersearcher(L, loader, 1); + return 0; + } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/bitmap.cpp b/src/lua/modules/graphics/bitmap.cpp new file mode 100644 index 0000000..13517f9 --- /dev/null +++ b/src/lua/modules/graphics/bitmap.cpp @@ -0,0 +1,113 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + typedef Ref<Bitmap>& BitmapRef; + + static inline BitmapRef checkBitmap(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP); + return proxy->getRef<Bitmap>(); + } + + static int l_gc(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + ref.release(); + return 0; + } + + static int l_getWidth(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int w = ref->getWidth(); + luax_pushinteger(L, w); + return 1; + } + + static int l_getHeight(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int h = ref->getHeight(); + luax_pushinteger(L, h); + return 1; + } + + static int l_getSize(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int w = ref->getWidth(); + int h = ref->getHeight(); + luax_pushinteger(L, w); + luax_pushinteger(L, h); + return 2; + } + + static int l_getPixel(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int x = luax_checkinteger(L, 2); + int y = luax_checkinteger(L, 3); + Color col = ref->getPixel(x, y); + luax_pushinteger(L, col.r); + luax_pushinteger(L, col.g); + luax_pushinteger(L, col.b); + luax_pushinteger(L, col.a); + return 4; + } + + static int l_setPixel(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int x = luax_checkinteger(L, 2); + int y = luax_checkinteger(L, 3); + if (!luax_istable(L, 4)) + { + luax_typerror(L, 4, "table"); + return 1; + } + unsigned int r = luax_rawgetnumber(L, 4, 1); + unsigned int g = luax_rawgetnumber(L, 4, 2); + unsigned int b = luax_rawgetnumber(L, 4, 3); + unsigned int a = luax_rawgetnumber(L, 4, 4); + ref->setPixel(Color(r, g, b, a), x, y); + return 0; + } + + static int l_clone(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + Bitmap* bitmap = ref.getObject(); + Bitmap* b = Bitmap::clone(bitmap); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_BITMAP, sizeof(Proxy)); + proxy->bind(new Ref<Bitmap>(b, JIN_GRAPHICS_BITMAP)); + return 1; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { "getSize", l_getSize }, + { "getPixel", l_getPixel }, + { "setPixel", l_setPixel }, + { "clone", l_clone }, + { 0, 0 } + }; + + int luaopen_Bitmap(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_BITMAP, f); + return 0; + } + + } // graphics +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/canvas.cpp b/src/lua/modules/graphics/canvas.cpp index f42dfba..e49e209 100644 --- a/src/lua/modules/graphics/canvas.cpp +++ b/src/lua/modules/graphics/canvas.cpp @@ -3,73 +3,63 @@ #include "lua/common/common.h" #include "libjin/jin.h" -namespace jin -{ -namespace lua +namespace JinEngine { + namespace Lua + { - using namespace jin::graphics; + using namespace JinEngine::Graphics; - typedef Ref<Canvas>& CanvasRef; + typedef Ref<Canvas>& CanvasRef; - static inline CanvasRef checkCanvas(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); - return proxy->getRef<Canvas>(); - } - - static int l_getWidth(lua_State* L) - { - CanvasRef ref = checkCanvas(L); - luax_pushnumber(L, ref->getWidth()); - return 1; - } + static inline CanvasRef checkCanvas(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); + return proxy->getRef<Canvas>(); + } - static int l_getHeight(lua_State* L) - { - CanvasRef ref = checkCanvas(L); - luax_pushnumber(L, ref->getHeight()); - return 1; - } + static int l_getWidth(lua_State* L) + { + CanvasRef ref = checkCanvas(L); + luax_pushnumber(L, ref->getWidth()); + return 1; + } - static int l_getSize(lua_State* L) - { - CanvasRef ref = checkCanvas(L); - luax_pushnumber(L, ref->getWidth()); - luax_pushnumber(L, ref->getHeight()); - return 2; - } + static int l_getHeight(lua_State* L) + { + CanvasRef ref = checkCanvas(L); + luax_pushnumber(L, ref->getHeight()); + return 1; + } - static int l_setAnchor(lua_State* L) - { - CanvasRef ref = checkCanvas(L); - int x = luax_checknumber(L, 1); - int y = luax_checknumber(L, 2); - ref->setAnchor(x, y); - return 0; - } + static int l_getSize(lua_State* L) + { + CanvasRef ref = checkCanvas(L); + luax_pushnumber(L, ref->getWidth()); + luax_pushnumber(L, ref->getHeight()); + return 2; + } - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); - proxy->release(); - return 0; - } + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); + proxy->release(); + return 0; + } - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "getWidth", l_getWidth }, - { "getHeight", l_getHeight }, - { "getSize", l_getSize }, - { "setAnchor", l_setAnchor }, - { 0, 0 } - }; + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { "getSize", l_getSize }, + { 0, 0 } + }; - int luaopen_Canvas(lua_State* L) - { - luax_newtype(L, JIN_GRAPHICS_CANVAS, f); - return 0; - } + int luaopen_Canvas(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_CANVAS, f); + return 0; + } -}// lua -}// jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/font.cpp b/src/lua/modules/graphics/font.cpp deleted file mode 100644 index 926f2cc..0000000 --- a/src/lua/modules/graphics/font.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "lua/modules/luax.h" -#include "lua/modules/types.h" -#include "lua/common/common.h" -#include "libjin/jin.h" - -namespace jin -{ -namespace lua -{ - - using namespace jin::graphics; - - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_FONT); - proxy->release(); - return 0; - } - - static int l_box(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_FONT, sizeof(Proxy)); - Ref<Font>& ref = proxy->getRef<Font>(); - const char* text = luax_checkstring(L, 2); - int fheight = luax_checknumber(L, 3); - int spacing = luax_checknumber(L, 4); - int lheight = luax_checknumber(L, 5); - int w, h; - ref->box(text, fheight, lheight, spacing, &w, &h); - luax_pushnumber(L, w); - luax_pushnumber(L, h); - return 2; - } - - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "box", l_box }, - { 0, 0 } - }; - - int luaopen_Font(lua_State* L) - { - luax_newtype(L, JIN_GRAPHICS_FONT, f); - - return 0; - } - -} // lua -} // jin
\ No newline at end of file diff --git a/src/lua/modules/graphics/graphics.cpp b/src/lua/modules/graphics/graphics.cpp index 9c1d404..8b2d7cd 100644 --- a/src/lua/modules/graphics/graphics.cpp +++ b/src/lua/modules/graphics/graphics.cpp @@ -1,516 +1,819 @@ +#include <iostream> +#include <fstream> + +#include "libjin/jin.h" #include "lua/modules/luax.h" #include "lua/modules/types.h" -#include "libjin/jin.h" #include "lua/common/common.h" -#include "lua/modules/embed/graphics.lua.h" -namespace jin -{ -namespace lua -{ - using namespace jin::graphics; - using jin::filesystem::Filesystem; - using jin::filesystem::Buffer; - - typedef Texture Image; +using namespace std; +using namespace JinEngine; +using namespace JinEngine::Graphics; +using JinEngine::Filesystem::AssetDatabase; +using JinEngine::Filesystem::Buffer; - static struct +namespace JinEngine +{ + namespace Lua { - color curRenderColor; - color curClearColor; - Font* curFont = nullptr; - Font* defaultFont = nullptr; - } context; - static int l_init(lua_State* L) - { - Window* wnd = Window::get(); - Window::Setting setting; - setting.width = luax_getfield_integer(L, 1, "width"); - setting.height = luax_getfield_integer(L, 1, "height"); - setting.title = luax_getfield_string(L, 1, "title"); - setting.vsync = luax_getfield_bool(L, 1, "vsync"); - setting.fullscreen = luax_getfield_bool(L, 1, "fullscreen"); - setting.resizable= luax_getfield_bool(L, 1, "resizable"); - if (!wnd->init(&setting)) - { - luax_pushboolean(L, false); - return 1; - } - luax_pushboolean(L, true); - return 1; - } +#include "../../resources/font.ttf.h" - static int l_destroy(lua_State* L) - { - Window* wnd = Window::get(); - wnd->quit(); - return 0; - } - - static int l_getSize(lua_State* L) - { - Window* wnd = Window::get(); - luax_pushnumber(L, wnd->getW()); - luax_pushnumber(L, wnd->getH()); - return 2; - } + static struct + { + Color curRenderColor; + Color curClearColor; + Font* curFont = nullptr; + Font* defaultFont = nullptr; + } context; - static int l_getWidth(lua_State* L) - { - Window* wnd = Window::get(); - luax_pushnumber(L, wnd->getW()); - return 1; - } + static int l_init(lua_State* L) + { + Window* wnd = Window::get(); + Window::Setting setting; + setting.width = luax_getfieldinteger(L, 1, "width"); + setting.height = luax_getfieldinteger(L, 1, "height"); + setting.title = luax_getfieldstring(L, 1, "title"); + setting.vsync = luax_getfieldbool(L, 1, "vsync"); + setting.fullscreen = luax_getfieldbool(L, 1, "fullscreen"); + setting.resizable = luax_getfieldbool(L, 1, "resizable"); + if (!wnd->init(&setting)) + { + luax_pushboolean(L, false); + return 1; + } + { + /* load default font */ + Bitmap* bitmap = Bitmap::createBitmap(default_font_bitmap, sizeof(default_font_bitmap)); + const Color* pixels = bitmap->getPixels(); + ofstream f = ofstream(); + f.open("font.pixels", ios_base::app); + for (int y = 0; y < bitmap->getHeight(); ++y) + { + for (int x = 0; x < bitmap->getWidth(); ++x) + { + Color c = pixels[x + y * bitmap->getWidth()]; + f << (int)c.r << ","; + f << (int)c.g << ","; + f << (int)c.b << ","; + f << (int)c.a << ","; + } + } + + TextureFont* tf = TextureFont::createTextureFont(bitmap, Text(Encode::UTF8, default_charset), default_font_split, bitmap->getHeight()); + context.defaultFont = tf; + delete bitmap; + } + context.curFont = context.defaultFont; - static int l_getHeight(lua_State* L) - { - Window* wnd = Window::get(); - luax_pushnumber(L, wnd->getH()); - return 1; - } + luax_pushboolean(L, true); + return 1; + } - static int l_newImage(lua_State* L) - { - Filesystem* fs = Filesystem::get(); - const char* f = luax_checkstring(L, 1); - if (!fs->exists(f)) + static int l_setTitle(lua_State* L) { - printf("Error: no such image %s\n", f); - exit(1); + Window* wnd = Window::get(); + const char* title = luax_checkstring(L, 1); + wnd->setTitle(title); + return 0; } - Buffer b; - fs->read(f, &b); - - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_IMAGE, sizeof(Proxy)); - Image* img = Image::createTexture(b.data, b.size); - proxy->bind(new Ref<Image>(img, JIN_GRAPHICS_IMAGE)); - return 1; - } - static int l_newShader(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy)); - const char* program = luax_checkstring(L, 1); - JSLProgram* jsl = JSLProgram::createJSLProgram(program); - proxy->bind(new Ref<JSLProgram>(jsl, JIN_GRAPHICS_SHADER)); - return 1; - } - - static int l_newCanvas(lua_State* L) - { - int w = luax_checknumber(L, 1); - int h = luax_checknumber(L, 2); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_CANVAS, sizeof(Proxy)); - Canvas* cvs = Canvas::createCanvas(w, h); - proxy->bind(new Ref<Canvas>(cvs, JIN_GRAPHICS_CANVAS)); - return 1; - } - - static int l_clear(lua_State* L) - { - if (luax_gettop(L) == 0) - { - glClearColor(0, 0, 0, 1); - } - else - { - int r = luax_checknumber(L, 1); - int g = luax_checknumber(L, 2); - int b = luax_checknumber(L, 3); - int a = luax_checknumber(L, 4); - glClearColor(r / 255.f, g / 255.f, b / 255.f, a / 255.f); - } - glClear(GL_COLOR_BUFFER_BIT); - return 0; - } - - static int l_setClearColor(lua_State* L) - { - if (luax_gettop(L) == 0) - { - glClearColor(1, 1, 1, 1); - return 0; - } - - context.curClearColor.rgba.r = luax_checknumber(L, 1); - context.curClearColor.rgba.g = luax_checknumber(L, 2); - context.curClearColor.rgba.b = luax_checknumber(L, 3); - context.curClearColor.rgba.a = luax_checknumber(L, 4); - - glClearColor(context.curClearColor.rgba.r / 255.f, - context.curClearColor.rgba.g / 255.f, - context.curClearColor.rgba.b / 255.f, - context.curClearColor.rgba.a / 255.f); - return 0; - } - - static int l_present(lua_State* L) - { - Window::get()->swapBuffers(); - return 0; - } + static int l_destroy(lua_State* L) + { + Window* wnd = Window::get(); + wnd->quit(); + return 0; + } - static int l_draw(lua_State* L) - { - int x = luax_optnumber(L, 2, 0); - int y = luax_optnumber(L, 3, 0); - float sx = luax_optnumber(L, 4, 1); - float sy = luax_optnumber(L, 5, 1); - float r = luax_optnumber(L, 6, 0); - if (luax_istype(L, 1, JIN_GRAPHICS_IMAGE)) + static int l_getSize(lua_State* L) { - Proxy* proxy = (Proxy*)luax_toudata(L, 1); - Ref<Image>& tex = proxy->getRef<Image>(); - tex->draw(x, y, sx, sy, r); + Window* wnd = Window::get(); + luax_pushnumber(L, wnd->getW()); + luax_pushnumber(L, wnd->getH()); + return 2; } - else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS)) + + static int l_getWidth(lua_State* L) { - Proxy* proxy = (Proxy*)luax_toudata(L, 1); - Ref<Canvas>& p = proxy->getRef<Canvas>(); - p->draw(x, y, sx, sy, r); + Window* wnd = Window::get(); + luax_pushnumber(L, wnd->getW()); + return 1; } - else + + static int l_getHeight(lua_State* L) { - /* wrong type */ - luax_typerror(L, 1, "image or canvas"); + Window* wnd = Window::get(); + luax_pushnumber(L, wnd->getH()); + return 1; } - return 0; - } - static int l_setColor(lua_State* L) - { - if (luax_gettop(L) == 0) + static int l_newBitmap(lua_State* L) { - glColor4f(1, 1, 1, 1); - return 0; + Bitmap* bitmap = nullptr; + if (luax_gettop(L) == 2) + { + int w = luax_checkinteger(L, 1); + int h = luax_checkinteger(L, 2); + bitmap = Bitmap::createBitmap(w, h); + } + else if (luax_gettop(L) == 3) + { + int w = luax_checkinteger(L, 1); + int h = luax_checkinteger(L, 2); + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + unsigned int r = luax_rawgetnumber(L, 3, 1); + unsigned int g = luax_rawgetnumber(L, 3, 2); + unsigned int b = luax_rawgetnumber(L, 3, 3); + unsigned int a = luax_rawgetnumber(L, 3, 4); + bitmap = Bitmap::createBitmap(w, h, Color(r, g, b, a)); + } + else + { + const char* f = luax_checkstring(L, 1); + AssetDatabase* fs = AssetDatabase::get(); + if (!fs->exists(f)) + { + error(L, "No such image file %s", f); + goto fail; + } + Buffer b; + if (!fs->read(f, b)) + { + error(L, "Failed to read image %s", f); + goto fail; + } + bitmap = Bitmap::createBitmap(&b, b.size()); + if (bitmap == nullptr) + { + error(L, "Failed to decode image file %s", f); + goto fail; + } + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_BITMAP, sizeof(Proxy)); + proxy->bind(new Ref<Bitmap>(bitmap, JIN_GRAPHICS_BITMAP)); + return 1; + fail: + luax_pushnil(L); + return 1; } - context.curRenderColor.rgba.r = luax_checknumber(L, 1); - context.curRenderColor.rgba.g = luax_checknumber(L, 2); - context.curRenderColor.rgba.b = luax_checknumber(L, 3); - context.curRenderColor.rgba.a = luax_checknumber(L, 4); + /* jin.graphics.newTexture(bitmap) */ + static int l_newTexture(lua_State* L) + { + Texture* texture = nullptr; + if (luax_istype(L, 1, JIN_GRAPHICS_BITMAP)) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP); + Ref<Bitmap>& refBitmap = p->getRef<Bitmap>(); + Bitmap* bitmap = refBitmap.getObject(); + texture = Texture::createTexture(bitmap); + } + else if (luax_isstring(L, 1)) + { + const char* path = luax_checkstring(L, 1); + texture = Texture::createTexture(path); + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXTURE, sizeof(Proxy)); + proxy->bind(new Ref<Texture>(texture, JIN_GRAPHICS_TEXTURE)); + return 1; + } - glColor4f(context.curRenderColor.rgba.r / 255.f, - context.curRenderColor.rgba.g / 255.f, - context.curRenderColor.rgba.b / 255.f, - context.curRenderColor.rgba.a / 255.f); - return 0; - } + static int l_newShader(lua_State* L) + { + const char* program = luax_checkstring(L, 1); + Shader* jsl = Shader::createShader(program); + if (jsl == nullptr) + { + error(L, "Failed to compile shader"); + luax_pushnil(L); + return 1; + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy)); + proxy->bind(new Ref<Shader>(jsl, JIN_GRAPHICS_SHADER)); + return 1; + } - static int l_getColor(lua_State * L) - { - luax_pushnumber(L, context.curRenderColor.rgba.r); - luax_pushnumber(L, context.curRenderColor.rgba.g); - luax_pushnumber(L, context.curRenderColor.rgba.b); - luax_pushnumber(L, context.curRenderColor.rgba.a); - return 4; - } + static int l_newShaderf(lua_State* L) + { + const char* path = luax_checkstring(L, 1); + AssetDatabase* fs = AssetDatabase::get(); + if (!fs->exists(path)) + { + error(L, "No such shader file %s\n", path); + luax_pushnil(L); + return 1; + } + Buffer b; + fs->read(path, b); + Shader* jsl = Shader::createShader((char*)&b); + if (jsl == nullptr) + { + error(L, "Failed to compile shader"); + luax_pushnil(L); + return 1; + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy)); + proxy->bind(new Ref<Shader>(jsl, JIN_GRAPHICS_SHADER)); + return 1; + } + + static int l_newCanvas(lua_State* L) + { + int w = luax_checknumber(L, 1); + int h = luax_checknumber(L, 2); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_CANVAS, sizeof(Proxy)); + Canvas* cvs = Canvas::createCanvas(w, h); + proxy->bind(new Ref<Canvas>(cvs, JIN_GRAPHICS_CANVAS)); + return 1; + } - static int l_bindCanvas(lua_State* L) - { - if (luax_gettop(L) == 0) + static int l_clear(lua_State* L) { - // bind to default canvas - Canvas::unbind(); + glClear(GL_COLOR_BUFFER_BIT); return 0; } - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); - Ref<Canvas>& ref = proxy->getRef<Canvas>(); - ref->bind(); - return 0; - } - - static int l_unbindCanvas(lua_State* L) - { - Canvas::unbind(); - return 0; - } - static int l_useShader(lua_State* L) - { - if (luax_gettop(L) == 0) + static int l_setClearColor(lua_State* L) + { + if (luax_gettop(L) == 0) + { + glClearColor(0, 0, 0, 1); + return 0; + } + + context.curClearColor.r = luax_checknumber(L, 1); + context.curClearColor.g = luax_checknumber(L, 2); + context.curClearColor.b = luax_checknumber(L, 3); + context.curClearColor.a = luax_checknumber(L, 4); + + gl.setClearColor(context.curClearColor.r, + context.curClearColor.g, + context.curClearColor.b, + context.curClearColor.a); + return 0; + } + + static int l_present(lua_State* L) { - JSLProgram::unuse(); + Window::get()->swapBuffers(); return 0; } - if (luax_istype(L, 1, JIN_GRAPHICS_SHADER)) + + static void l_draw_texture(lua_State* L) + { + if (!luax_istype(L, 1, JIN_GRAPHICS_TEXTURE)) + return; + int x = luax_optnumber(L, 2, 0); + int y = luax_optnumber(L, 3, 0); + float sx = luax_optnumber(L, 4, 1); + float sy = luax_optnumber(L, 5, 1); + float r = luax_optnumber(L, 6, 0); + float ox = luax_optnumber(L, 7, 0); + float oy = luax_optnumber(L, 8, 0); + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Texture>& tex = proxy->getRef<Texture>(); + tex->draw(x, y, sx, sy, r, ox, oy); + } + + static void l_draw_canvas(lua_State* L) + { + if (!luax_istype(L, 1, JIN_GRAPHICS_CANVAS)) + return; + int x = luax_optnumber(L, 2, 0); + int y = luax_optnumber(L, 3, 0); + float sx = luax_optnumber(L, 4, 1); + float sy = luax_optnumber(L, 5, 1); + float r = luax_optnumber(L, 6, 0); + float ox = luax_optnumber(L, 7, 0); + float oy = luax_optnumber(L, 8, 0); + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Canvas>& p = proxy->getRef<Canvas>(); + p->draw(x, y, sx, sy, r, ox, oy); + } + + /* jin.graphics.draw(text, font, x, y) */ + static void l_draw_text(lua_State* L) + { + if (!luax_istype(L, 1, JIN_GRAPHICS_TEXT)) + return; + Proxy* p = (Proxy*)luax_toudata(L, 1); + Text* text = p->getObject<Text>(); + int x = luax_optnumber(L, 3, 0); + int y = luax_optnumber(L, 4, 0); + int spacing = luax_optnumber(L, 6, 0); + Font* font = nullptr; + Proxy* p2 = (Proxy*)luax_toudata(L, 2); + if (luax_istype(L, 2, JIN_GRAPHICS_TEXTUREFONT)) + { + TextureFont* tf = p2->getObject<TextureFont>(); + font = tf; + } + else if (luax_istype(L, 2, JIN_GRAPHICS_TTF)) + { + TTF* ttf = p2->getObject<TTF>(); + font = ttf; + } + else + { + font = context.defaultFont; + } + int lineheight = luax_optnumber(L, 5, font->getFontSize()); + font->print(*text, x, y, lineheight, spacing); + } + + /* jin.graphics.draw(page, x, y) */ + static void l_draw_page(lua_State* L) + { + if (!luax_istype(L, 1, JIN_GRAPHICS_PAGE)) + return; + int x = luax_optnumber(L, 2, 0); + int y = luax_optnumber(L, 3, 0); + Proxy* p = (Proxy*)luax_toudata(L, 1); + Page* page = p->getObject<Page>(); + Font* font = page->font; + font->print(page, x, y); + } + + static int l_draw(lua_State* L) { - Proxy* proxy = (Proxy*)luax_toudata(L, 1); - Ref<JSLProgram>& jsl = proxy->getRef<JSLProgram>(); - jsl->use(); + if (luax_istype(L, 1, JIN_GRAPHICS_TEXTURE)) + l_draw_texture(L); + else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS)) + l_draw_canvas(L); + else if (luax_istype(L, 1, JIN_GRAPHICS_TEXT)) + l_draw_text(L); + else if (luax_istype(L, 1, JIN_GRAPHICS_PAGE)) + l_draw_page(L); + else + { + luax_typerror(L, 1, "texture or canvas"); + return 1; + } + return 0; } - else + + // draw(tex, quad, x, y, sx, sy, r, ax, ay) + static int l_drawq(lua_State* L) { - luax_typerror(L, 1, "JSL shader"); + if (!luax_istable(L, 2)) + { + luax_typerror(L, 2, "table"); + return 1; + } + Math::Quad q; + q.x = luax_rawgetnumber(L, 2, 1); + q.y = luax_rawgetnumber(L, 2, 2); + q.w = luax_rawgetnumber(L, 2, 3); + q.h = luax_rawgetnumber(L, 2, 4); + luax_pop(L, 4); + int x = luax_optnumber(L, 3, 0); + int y = luax_optnumber(L, 4, 0); + float sx = luax_optnumber(L, 5, 1); + float sy = luax_optnumber(L, 6, 1); + float r = luax_optnumber(L, 7, 0); + float ox = luax_optnumber(L, 8, 0); + float oy = luax_optnumber(L, 9, 0); + + if (luax_istype(L, 1, JIN_GRAPHICS_TEXTURE)) + { + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Texture>& tex = proxy->getRef<Texture>(); + tex->draw(q, x, y, sx, sy, r, ox, oy); + } + else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS)) + { + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Canvas>& p = proxy->getRef<Canvas>(); + p->draw(q, x, y, sx, sy, r, ox, oy); + } + else + { + luax_typerror(L, 1, "texture or canvas"); + } } - return 0; - } - - static int l_unuseShader(lua_State* L) - { - JSLProgram::unuse(); - return 0; - } - static int l_setBlend(lua_State* L) - { - - return 0; - } + /* print(string, x, y, lineheight, spacing) */ + /* need set font */ + static int l_print(lua_State* L) + { + Font* font = context.curFont; + if (font == nullptr) + return 0; + unsigned length; + const char* str = luax_checklstring(L, 1, &length); + Text text(Encode::UTF8, str, length); + int x = luax_optnumber(L, 2, 0); + int y = luax_optnumber(L, 3, 0); + int lineheight = luax_optnumber(L, 4, font->getFontSize()); + int spacing = luax_optnumber(L, 5, 0); + font->print(text, x, y, lineheight, spacing); + return 0; + } - static RENDER_MODE strtomode(const char* str) - { - std::string s = std::string(str); - if (s == "fill") return RENDER_MODE::FILL; - else if (s == "line") return RENDER_MODE::LINE; - else return RENDER_MODE::NONE; - } + static int l_setColor(lua_State* L) + { + if (luax_gettop(L) == 0) + { + glColor4f(1, 1, 1, 1); + return 0; + } - static int l_drawpoint(lua_State* L) - { - int x = luax_checknumber(L, 1); - int y = luax_checknumber(L, 2); - jin::graphics::point(x, y); - - return 0; - } - - static int l_drawLine(lua_State* L) - { - int x1 = luax_checknumber(L, 1); - int y1 = luax_checknumber(L, 2); - int x2 = luax_checknumber(L, 3); - int y2 = luax_checknumber(L, 4); - jin::graphics::line(x1, y1, x2, y2); - - return 0; - } + context.curRenderColor.r = luax_checknumber(L, 1); + context.curRenderColor.g = luax_checknumber(L, 2); + context.curRenderColor.b = luax_checknumber(L, 3); + if (luax_gettop(L) == 4) + context.curRenderColor.a = luax_checknumber(L, 4); + else + context.curRenderColor.a = 255; + glColor4f(context.curRenderColor.r / 255.f, + context.curRenderColor.g / 255.f, + context.curRenderColor.b / 255.f, + context.curRenderColor.a / 255.f); + return 0; + } - static int l_drawRect(lua_State* L) - { - const char* modestr = luax_checkstring(L, 1); - RENDER_MODE mode = strtomode(modestr); - if (mode != RENDER_MODE::NONE) + static int l_getColor(lua_State * L) { - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - int w = luax_checknumber(L, 4); - int h = luax_checknumber(L, 5); - rect(mode, x, y, w, h); + luax_pushnumber(L, context.curRenderColor.r); + luax_pushnumber(L, context.curRenderColor.g); + luax_pushnumber(L, context.curRenderColor.b); + luax_pushnumber(L, context.curRenderColor.a); + return 4; } - else + + static int l_bindCanvas(lua_State* L) { - luax_typerror(L, 1, "'fill' or 'line'"); - return 1; + if (luax_gettop(L) == 0) + { + // bind to default canvas + Canvas::unbind(); + return 0; + } + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); + Ref<Canvas>& ref = proxy->getRef<Canvas>(); + Canvas::bind(ref.getObject()); + return 0; } - return 0; - } + static int l_unbindCanvas(lua_State* L) + { + Canvas::unbind(); + return 0; + } - static int l_drawCircle(lua_State* L) - { - const char* modestr = luax_checkstring(L, 1); - RENDER_MODE mode = strtomode(modestr); - if (mode != RENDER_MODE::NONE) + static int l_useShader(lua_State* L) { - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - float r = luax_checknumber(L, 4); - circle(mode, x, y, r); + if (luax_gettop(L) == 0) + { + Shader::unuse(); + return 0; + } + if (luax_istype(L, 1, JIN_GRAPHICS_SHADER)) + { + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Shader>& jsl = proxy->getRef<Shader>(); + jsl->use(); + } + else + { + luax_typerror(L, 1, "JSL shader"); + } + return 0; } - else + + static int l_setBlend(lua_State* L) { - luax_typerror(L, 1, "'fill' or 'line'"); - return 1; + + return 0; } - return 0; - } + static 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; + } - static int l_drawTriangle(lua_State* L) - { - const char* modestr = luax_checkstring(L, 1); - RENDER_MODE mode = strtomode(modestr); - if (mode != RENDER_MODE::NONE) + static int l_point(lua_State* L) { - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); + int x = luax_checknumber(L, 1); + int y = luax_checknumber(L, 2); + JinEngine::Graphics::point(x, y); + return 0; + } + + static int l_line(lua_State* L) + { + int x1 = luax_checknumber(L, 1); + int y1 = luax_checknumber(L, 2); int x2 = luax_checknumber(L, 3); int y2 = luax_checknumber(L, 4); + JinEngine::Graphics::line(x1, y1, x2, y2); + + return 0; + } - int x3 = luax_checknumber(L, 5); - int y3 = luax_checknumber(L, 6); + static int l_rect(lua_State* L) + { + const char* modestr = luax_checkstring(L, 1); + RenderMode mode = strtomode(modestr); + if (mode != RenderMode::NONE) + { + int x = luax_checknumber(L, 2); + int y = luax_checknumber(L, 3); + int w = luax_checknumber(L, 4); + int h = luax_checknumber(L, 5); + rect(mode, x, y, w, h); + } + else + { + luax_typerror(L, 1, "'fill' or 'line'"); + return 1; + } - triangle(mode, x, y, x2, y2, x3, y3); + return 0; } - else + + static int l_circle(lua_State* L) { - luax_typerror(L, 1, "'fill' or 'line'"); - return 1; + const char* modestr = luax_checkstring(L, 1); + RenderMode mode = strtomode(modestr); + if (mode != RenderMode::NONE) + { + int x = luax_checknumber(L, 2); + int y = luax_checknumber(L, 3); + float r = luax_checknumber(L, 4); + circle(mode, x, y, r); + } + else + { + luax_typerror(L, 1, "'fill' or 'line'"); + return 1; + } + + return 0; } - return 0; - } - - static int l_drawPolygon(lua_State* L) - { - const char* modestr = luax_checkstring(L, 1); - int n = luax_checknumber(L, 2); - RENDER_MODE mode = strtomode(modestr); - if (mode != RENDER_MODE::NONE) + static int l_triangle(lua_State* L) { - if (!luax_istable(L, 3)) + const char* modestr = luax_checkstring(L, 1); + RenderMode mode = strtomode(modestr); + if (mode != RenderMode::NONE) { - luax_typerror(L, 3, "table"); - return 1; + int x = luax_checknumber(L, 2); + int y = luax_checknumber(L, 3); + + int x2 = luax_checknumber(L, 3); + int y2 = luax_checknumber(L, 4); + + int x3 = luax_checknumber(L, 5); + int y3 = luax_checknumber(L, 6); + + triangle(mode, x, y, x2, y2, x3, y3); } - int tn = luax_tableidxlen(L, 3); - if (tn != n * 2) + else { - static char* emsg = \ - "number of polygon vertices doesn't match " \ - "provided n, expect %d numbers but get %d"; - luax_error(L, emsg, n * 2, tn); + luax_typerror(L, 1, "'fill' or 'line'"); return 1; } - float* p = new float[2 * n]; - for (int i = 1; i <= 2 * n; ++i) - p[i - 1] = luax_rawgetnumber(L, 3, i); - polygon(mode, p, n); - delete[] p; + + return 0; } - else + + static int l_polygon(lua_State* L) { - luax_typerror(L, 1, "'fill' or 'line'"); - return 1; - } + const char* modestr = luax_checkstring(L, 1); + int n = luax_checknumber(L, 2); + RenderMode mode = strtomode(modestr); + if (mode != RenderMode::NONE) + { + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + int tn = luax_tableidxlen(L, 3); + if (tn != n * 2) + { + static char* emsg = \ + "number of polygon vertices doesn't match " \ + "provided n, expect %d numbers but get %d"; + luax_error(L, emsg, n * 2, tn); + return 1; + } + float* p = (float*)alloca(2 * n * sizeof(float)); + for (int i = 1; i <= 2 * n; ++i) + p[i - 1] = luax_rawgetnumber(L, 3, i); + polygon(mode, p, n); + } + else + { + luax_typerror(L, 1, "'fill' or 'line'"); + return 1; + } - return 0; - } + return 0; + } - static int l_newFont(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_FONT, sizeof(Proxy)); - Font* font = new Font(); + static int l_newTTFData(lua_State* L) { - const char* path = luax_checkstring(L, 1); - Filesystem* fs = Filesystem::get(); - Buffer b = {}; - if (!fs->exists(path)) + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TTFDATA, sizeof(Proxy)); + TTFData* fd = nullptr; { - printf("Error: no such font %s\n", path); - exit(1); + const char* path = luax_checkstring(L, 1); + AssetDatabase* fs = AssetDatabase::get(); + if (!fs->exists(path)) + { + error(L, "No such font %s\n", path); + luax_pushnil(L); + return 1; + } + Buffer b; + fs->read(path, b); + fd = TTFData::createTTFData(&b, b.size()); } - fs->read(path, &b); - font->loadb((const unsigned char*)b.data); + proxy->bind(new Ref<TTFData>(fd, JIN_GRAPHICS_TTFDATA)); + return 1; } - proxy->bind(new Ref<Font>(font, JIN_GRAPHICS_FONT)); - return 1; - } - static int l_study(lua_State* L) - { - int n = luax_gettop(L); - if (n == 0) - { - if (context.defaultFont == 0) + /* newText(str[, encode]) */ + static int l_newText(lua_State* L) + { + Encode encode = Encode::UTF8; + if (luax_gettop(L) == 2) + { + const char* e = luax_checkstring(L, 2); + if (strcmp(e, "UTF8") == 0) encode = Encode::UTF8; + //else if (strcmp(e, "UTF16") == 0) encode = Encode::UTF16; + else if (strcmp(e, "ASCII") == 0) encode = Encode::ASCII; + else + { + luax_error(L, "wrong text encode %s", e); + return 0; + } + } + unsigned length; + const char* data = luax_checklstring(L, 1, &length); + Text* text = new Text(encode, data, length); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXT, sizeof(Proxy)); + proxy->bind(new Ref<Text>(text, JIN_GRAPHICS_TEXT)); + return 1; + } + + /* newTextureFont(bitmap, text, color | cellw, cellh) */ + static int l_newTextureFont(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP); + Bitmap* bitmap = p->getObject<Bitmap>(); + Text* text; + if (luax_istype(L, 2, JIN_GRAPHICS_TEXT)) { - #include "lua/resources/font.ttf.h" - // load default font - context.defaultFont = new Font(); - context.defaultFont->loadb(font_ttf); + Proxy* pt = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT); + text = pt->getObject<Text>(); } + else if (luax_isstring(L, 2)) + { + unsigned len; + const char* str = luax_checklstring(L, 2, &len); + text = new Text(Encode::UTF8, str, len); + } + else + { + luax_typerror(L, 2, "Text or string"); + return 1; + } + float cellh = luax_checknumber(L, 4); + TextureFont* textureFont = nullptr; + if (luax_istable(L, 3)) + { + unsigned int r = luax_rawgetnumber(L, 3, 1); + unsigned int g = luax_rawgetnumber(L, 3, 2); + unsigned int b = luax_rawgetnumber(L, 3, 3); + unsigned int a = luax_rawgetnumber(L, 3, 4); + textureFont = TextureFont::createTextureFont(bitmap, *text, Color(r, g, b, a), cellh); + } + else if (luax_isnumber(L, 3)) + { + float cellw = luax_checknumber(L, 3); + textureFont = TextureFont::createTextureFont(bitmap, *text, cellw, cellh); + } + else + { + luax_error(L, "bad arguments #3 to 'newTextureFont', need to be table or number"); + return 0; + } + if (luax_isstring(L, 2)) + { + // Delete temporary text. + delete text; + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXTUREFONT, sizeof(Proxy)); + proxy->bind(new Ref<TextureFont>(textureFont, JIN_GRAPHICS_TEXTUREFONT)); + return 1; + } + + /* setFont(font) */ + static int l_setFont(lua_State* L) + { + if (luax_istype(L, 1, JIN_GRAPHICS_TTF)) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF); + TTF* ttf = p->getObject<TTF>(); + context.curFont = ttf; + } + else if (luax_istype(L, 1, JIN_GRAPHICS_TEXTUREFONT)) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT); + TextureFont* tf = p->getObject<TextureFont>(); + context.curFont = tf; + } + return 0; + } + + static int l_unsetFont(lua_State* L) + { context.curFont = context.defaultFont; return 0; } - Font* font = (Font*)luax_checktype(L, 1, JIN_GRAPHICS_FONT); - context.curFont = font; - return 0; - } - - static int l_write(lua_State* L) - { - if (context.curFont == 0) - return 0; - - const char* text = luax_checkstring(L, 1); - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - - int fh = luax_optnumber(L, 4, 15); - int spacing = luax_optnumber(L, 5, 1); - int lh = luax_optnumber(L, 6, 18); - - context.curFont->render(text, x, y, fh, spacing, lh); - return 0; - } - - static int l_box(lua_State* L) - { - const char* text = luax_checkstring(L, 1); - int fontheight = luax_checknumber(L, 2); - int spacing = luax_checknumber(L, 3); - int lineheight = luax_checknumber(L, 4); - int w, h; - context.curFont->box(text, fontheight, spacing, lineheight, &w, &h); - luax_pushnumber(L, w); - luax_pushnumber(L, h); - return 2; - } - - static const luaL_Reg f[] = { - { "init", l_init }, - { "getSize", l_getSize }, - { "getWidth", l_getWidth }, - { "getHeight", l_getHeight }, - { "newImage", l_newImage }, - { "newShader", l_newShader }, - { "newCanvas", l_newCanvas }, - { "newFont", l_newFont }, - { "box", l_box }, - { "write", l_write }, - { "setClearColor", l_setClearColor }, - { "clear", l_clear }, - { "draw", l_draw }, - { "setColor", l_setColor }, - { "palette", l_getColor }, - { "present", l_present }, - { "setFont", l_study }, - { "bindCanvas", l_bindCanvas }, - { "unbindCanvas", l_unbindCanvas }, - { "useShader", l_useShader }, - { "unuseShader", l_unuseShader }, - { "point", l_drawpoint }, - { "line", l_drawLine }, - { "rect", l_drawRect }, - { "circle", l_drawCircle }, - { "triangle", l_drawTriangle }, - { "polygon", l_drawPolygon }, - { "destroy", l_destroy }, - { 0, 0 } - }; - - extern int luaopen_Image(lua_State* L); - extern int luaopen_Font(lua_State* L); - extern int luaopen_Canvas(lua_State* L); - extern int luaopen_JSL(lua_State* L); + static const luaL_Reg f[] = { + /* window */ + { "init", l_init }, + { "setTitle", l_setTitle }, + { "getSize", l_getSize }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { "destroy", l_destroy }, + /* creators */ + { "newBitmap", l_newBitmap }, + { "newTexture", l_newTexture }, + { "newShader", l_newShader }, + { "newShaderf", l_newShaderf }, + { "newCanvas", l_newCanvas }, + { "newTTFData", l_newTTFData }, + { "newText", l_newText }, + { "newTextureFont", l_newTextureFont }, + /* render */ + { "setClearColor", l_setClearColor }, + { "clear", l_clear }, + { "draw", l_draw }, + { "print", l_print }, + { "drawq", l_drawq }, + { "setColor", l_setColor }, + { "getColor", l_getColor }, + { "present", l_present }, + /* canvas */ + { "bindCanvas", l_bindCanvas }, + { "unbindCanvas", l_unbindCanvas }, + /* shader */ + { "useShader", l_useShader }, + /* shapes */ + { "point", l_point }, + { "line", l_line }, + { "rect", l_rect }, + { "circle", l_circle }, + { "triangle", l_triangle }, + { "polygon", l_polygon }, + /* font */ + { "setFont", l_setFont }, + { "unsetFont", l_unsetFont }, + { 0, 0 } + }; + + extern int luaopen_Texture(lua_State* L); + extern int luaopen_Text(lua_State* L); + extern int luaopen_TTF(lua_State* L); + extern int luaopen_TextureFont(lua_State* L); + extern int luaopen_TTFData(lua_State* L); + extern int luaopen_Page(lua_State* L); + extern int luaopen_Canvas(lua_State* L); + extern int luaopen_JSL(lua_State* L); + extern int luaopen_Bitmap(lua_State* L); - int luaopen_graphics(lua_State* L) - { - // register types - luaopen_Image(L); - luaopen_Canvas(L); - luaopen_Font(L); - luaopen_JSL(L); - - // load whole lib - luax_newlib(L, f); + int luaopen_graphics(lua_State* L) + { + // register types + luaopen_Bitmap(L); + luaopen_Texture(L); + luaopen_Canvas(L); + luaopen_TTFData(L); + luaopen_TTF(L); + luaopen_Text(L); + luaopen_TextureFont(L); + luaopen_Page(L); + luaopen_JSL(L); + + // load whole lib + luax_newlib(L, f); - return 1; - } + return 1; + } -}// lua -}// jin
\ No newline at end of file + }// lua +}// jin
\ No newline at end of file diff --git a/src/lua/modules/graphics/image.cpp b/src/lua/modules/graphics/image.cpp deleted file mode 100644 index 5824660..0000000 --- a/src/lua/modules/graphics/image.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "lua/modules/luax.h" -#include "lua/modules/types.h" -#include "lua/common/common.h" -#include "libjin/jin.h" - -namespace jin -{ -namespace lua -{ - - using namespace jin::graphics; - - typedef Texture Image; - - static inline Ref<Image>& checkImage(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_IMAGE); - return proxy->getRef<Image>(); - } - - static int l_getWidth(lua_State* L) - { - Ref<Image>& ref = checkImage(L); - luax_pushnumber(L, ref->getWidth()); - return 1; - } - - static int l_getHeight(lua_State *L) - { - Ref<Image>& ref = checkImage(L); - luax_pushnumber(L, ref->getHeight()); - return 1; - } - - static int l_getPixel(lua_State* L) - { - Ref<Image>& ref = checkImage(L); - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - color c = ref->getPixel(x, y); - luax_pushnumber(L, c.rgba.r); - luax_pushnumber(L, c.rgba.g); - luax_pushnumber(L, c.rgba.b); - luax_pushnumber(L, c.rgba.a); - return 4; - } - - static int l_setAnchor(lua_State* L) - { - Ref<Image>& ref = checkImage(L); - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - ref->setAnchor(x, y); - return 0; - } - - static int l_getSize(lua_State* L) - { - Ref<Image>& ref = checkImage(L); - luax_pushnumber(L, ref->getWidth()); - luax_pushnumber(L, ref->getHeight()); - return 2; - } - - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_IMAGE); - proxy->release(); - return 0; - } - - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "getWidth", l_getWidth }, - { "getHeight", l_getHeight }, - { "getSize", l_getSize }, - { "getPixel", l_getPixel }, - { "setAnchor", l_setAnchor }, - { 0, 0 } - }; - - int luaopen_Image(lua_State* L) - { - luax_newtype(L, JIN_GRAPHICS_IMAGE, f); - return 0; - } - -}// graphics -}// jin
\ No newline at end of file diff --git a/src/lua/modules/graphics/jsl.cpp b/src/lua/modules/graphics/jsl.cpp deleted file mode 100644 index ccd9ebd..0000000 --- a/src/lua/modules/graphics/jsl.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "lua/modules/luax.h" -#include "lua/modules/types.h" -#include "lua/common/common.h" -#include "libjin/jin.h" - -namespace jin -{ -namespace lua -{ - - using namespace jin::graphics; - - typedef Texture Image; - - static inline Ref<JSLProgram>& checkJSLProgram(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); - return proxy->getRef<JSLProgram>(); - } - - 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) - { - Ref<JSLProgram>& ref = 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); - ref->sendFloat(variable, number); - break; - } - case IMAGE: - { - Proxy* proxy = (Proxy*)luax_checktype(L, 4, JIN_GRAPHICS_IMAGE); - Ref<Image>& tex = proxy->getRef<Image>(); - ref->sendTexture(variable, tex.getObject()); - break; - } - case CANVAS: - { - Proxy* proxy = (Proxy*)luax_checktype(L, 4, JIN_GRAPHICS_CANVAS); - Ref<Canvas>& canvas = proxy->getRef<Canvas>(); - ref->sendCanvas(variable, canvas.getObject()); - break; - } - case VEC2: - { - float x = luax_checknumber(L, 4); - float y = luax_checknumber(L, 5); - ref->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); - ref->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); - ref->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); - ref->sendColor(variable, &col); - break; - } - default: - return 0; - } - } - return 1; - } - - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); - proxy->release(); - 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, JIN_GRAPHICS_SHADER, f); - return 0; - } - -} -}
\ No newline at end of file diff --git a/src/lua/modules/graphics/page.cpp b/src/lua/modules/graphics/page.cpp new file mode 100644 index 0000000..8c9e918 --- /dev/null +++ b/src/lua/modules/graphics/page.cpp @@ -0,0 +1,73 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +#include <iostream> + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + typedef Ref<Font>& FontRef; + + Page* getPage(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_PAGE); + return proxy->getObject<Page>(); + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_PAGE); + { + /* release font */ + Ref<Page>* page = &proxy->getRef<Page>(); + RefBase* font = (RefBase*)page->getUserdata(); + font->release(); + } + proxy->release(); + return 0; + } + + static int l_getSize(lua_State* L) + { + Page* page = getPage(L); + luax_pushinteger(L, page->size.w); + luax_pushinteger(L, page->size.h); + return 2; + } + + static int l_getWidth(lua_State* L) + { + Page* page = getPage(L); + luax_pushinteger(L, page->size.w); + return 1; + } + + static int l_getHeight(lua_State* L) + { + Page* page = getPage(L); + luax_pushinteger(L, page->size.h); + return 1; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "getSize", l_getSize }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { 0, 0 } + }; + + int luaopen_Page(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_PAGE, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/shader.cpp b/src/lua/modules/graphics/shader.cpp new file mode 100644 index 0000000..d7733d4 --- /dev/null +++ b/src/lua/modules/graphics/shader.cpp @@ -0,0 +1,135 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + typedef Ref<Shader>& ShaderRef; + + static inline ShaderRef checkShader(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); + return proxy->getRef<Shader>(); + } + + /** + * jsl:sendNumber("variable", 0.1) + */ + static int l_sendNumber (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + float number = luax_checknumber(L, 3); + ref->sendFloat(variable, number); + return 0; + } + + static int l_sendTexture (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + Proxy* proxy = (Proxy*)luax_checktype(L, 3, JIN_GRAPHICS_TEXTURE); + Ref<Texture>& tex = proxy->getRef<Texture>(); + ref->sendTexture(variable, tex.getObject()); + return 0; + } + + static int l_sendCanvas (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + Proxy* proxy = (Proxy*)luax_checktype(L, 3, JIN_GRAPHICS_CANVAS); + Ref<Canvas>& canvas = proxy->getRef<Canvas>(); + ref->sendCanvas(variable, canvas.getObject()); + return 0; + } + + static int l_sendVec2 (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + float x = luax_rawgetnumber(L, 3, 1); + float y = luax_rawgetnumber(L, 3, 2); + ref->sendVec2(variable, x, y); + return 0; + } + + static int l_sendVec3 (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + float x = luax_rawgetnumber(L, 3, 1); + float y = luax_rawgetnumber(L, 3, 2); + float z = luax_rawgetnumber(L, 3, 3); + ref->sendVec3(variable, x, y, z); + return 0; + } + + static int l_sendVec4 (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + float x = luax_rawgetnumber(L, 3, 1); + float y = luax_rawgetnumber(L, 3, 2); + float z = luax_rawgetnumber(L, 3, 3); + float w = luax_rawgetnumber(L, 3, 4); + ref->sendVec4(variable, x, y, z, w); + return 0; + } + + static int l_sendColor (lua_State* L) + { + return l_sendVec4(L); + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); + proxy->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "sendNumber", l_sendNumber }, + { "sendTexture", l_sendTexture }, + { "sendCanvas", l_sendCanvas }, + { "sendVec2", l_sendVec2 }, + { "sendVec3", l_sendVec3 }, + { "sendVec4", l_sendVec4 }, + { "sendColor", l_sendColor }, + { 0, 0 } + }; + + /** + * JSL program + */ + int luaopen_JSL(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_SHADER, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/text.cpp b/src/lua/modules/graphics/text.cpp new file mode 100644 index 0000000..cbc82f1 --- /dev/null +++ b/src/lua/modules/graphics/text.cpp @@ -0,0 +1,32 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + static int l_gc(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXT); + p->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { 0, 0 } + }; + + int luaopen_Text(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TEXT, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/texture.cpp b/src/lua/modules/graphics/texture.cpp new file mode 100644 index 0000000..61bfaee --- /dev/null +++ b/src/lua/modules/graphics/texture.cpp @@ -0,0 +1,65 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + typedef Ref<Texture>& TextureRef; + + static inline TextureRef checkTexture(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTURE); + return proxy->getRef<Texture>(); + } + + static int l_getWidth(lua_State* L) + { + TextureRef ref = checkTexture(L); + luax_pushnumber(L, ref->getWidth()); + return 1; + } + + static int l_getHeight(lua_State *L) + { + TextureRef ref = checkTexture(L); + luax_pushnumber(L, ref->getHeight()); + return 1; + } + + static int l_getSize(lua_State* L) + { + TextureRef ref = checkTexture(L); + luax_pushnumber(L, ref->getWidth()); + luax_pushnumber(L, ref->getHeight()); + return 2; + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTURE); + proxy->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { "getSize", l_getSize }, + { 0, 0 } + }; + + int luaopen_Texture(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TEXTURE, f); + return 0; + } + + }// lua +}// jin
\ No newline at end of file diff --git a/src/lua/modules/graphics/texture_font.cpp b/src/lua/modules/graphics/texture_font.cpp new file mode 100644 index 0000000..a2e88ba --- /dev/null +++ b/src/lua/modules/graphics/texture_font.cpp @@ -0,0 +1,67 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT); + proxy->release(); + return 0; + } + + /* typeset(Text | string, lineheight, spacing) */ + static int l_typeset(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT); + TextureFont* tf = p->getObject<TextureFont>(); + int lineheight = luax_checkinteger(L, 3); + int spacing = luax_optnumber(L, 4, 0); + Page* page = nullptr; + if (luax_isstring(L, 2)) + { + unsigned length; + const char* str = luax_checklstring(L, 2, &length); + Text text(Encode::UTF8, str, length); + page = tf->typeset(text, lineheight, spacing); + } + else if (luax_istype(L, 2, JIN_GRAPHICS_TEXT)) + { + Proxy* p2 = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT); + Text* text = p2->getObject<Text>(); + page = tf->typeset(*text, lineheight, spacing); + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_PAGE, sizeof(Proxy)); + Ref<Page>* refPage = new Ref<Page>(page, JIN_GRAPHICS_PAGE); + { + /* retain related ttf */ + Ref<TextureFont>& refTF = p->getRef<TextureFont>(); + refTF.retain(); + refPage->setUserdata(&refTF); + } + proxy->bind(refPage); + return 1; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "typeset", l_typeset }, + { 0, 0 } + }; + + int luaopen_TextureFont(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TEXTUREFONT, f); + + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/ttf.cpp b/src/lua/modules/graphics/ttf.cpp new file mode 100644 index 0000000..414c7eb --- /dev/null +++ b/src/lua/modules/graphics/ttf.cpp @@ -0,0 +1,73 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF); + { + /* release ttf data */ + Ref<TTF>* ttf = &proxy->getRef<TTF>(); + RefBase* data = (RefBase*)ttf->getUserdata(); + data->release(); + } + proxy->release(); + return 0; + } + + /* typeset(Text | string, lineheight, spacing) */ + static int l_typeset(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF); + TTF* ttf = p->getObject<TTF>(); + int lineheight = luax_optnumber(L, 3, ttf->getFontSize()); + int spacing = luax_optnumber(L, 4, 0); + Page* page = nullptr; + if (luax_isstring(L, 2)) + { + unsigned length; + const char* str = luax_checklstring(L, 2, &length); + Text text(Encode::UTF8, str, length); + page = ttf->typeset(text, lineheight, spacing); + } + else if (luax_istype(L, 2, JIN_GRAPHICS_TEXT)) + { + Proxy* p2 = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT); + Text* text = p2->getObject<Text>(); + page = ttf->typeset(*text, lineheight, spacing); + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_PAGE, sizeof(Proxy)); + Ref<Page>* refPage = new Ref<Page>(page, JIN_GRAPHICS_PAGE); + { + /* retain related ttf */ + Ref<TTF>& refTTF = p->getRef<TTF>(); + refTTF.retain(); + refPage->setUserdata(&refTTF); + } + proxy->bind(refPage); + return 1; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "typeset", l_typeset }, + { 0, 0 } + }; + + int luaopen_TTF(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TTF, f); + + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/ttfData.cpp b/src/lua/modules/graphics/ttfData.cpp new file mode 100644 index 0000000..43c3613 --- /dev/null +++ b/src/lua/modules/graphics/ttfData.cpp @@ -0,0 +1,51 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + static int l_newTTF(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTFDATA); + int fontsize = luax_checkinteger(L, 2); + Ref<TTFData>& refFontData = p->getRef<TTFData>(); + TTFData* fontData = refFontData.getObject(); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TTF, sizeof(Proxy)); + TTF* font = fontData->createTTF(fontsize); + Ref<TTF>* refTTF = new Ref<TTF>(font, JIN_GRAPHICS_TTF); + { + Ref<TTFData>& refTTFData = p->getRef<TTFData>(); + refTTFData.retain(); + refTTF->setUserdata(&refTTFData); + } + proxy->bind(refTTF); + return 1; + } + + static int l_gc(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTFDATA); + p->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "newTTF", l_newTTF }, + { 0, 0 } + }; + + int luaopen_TTFData(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TTFDATA, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/jin.cpp b/src/lua/modules/jin.cpp deleted file mode 100644 index a25ec6c..0000000 --- a/src/lua/modules/jin.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include "jin.h" -#include "lua/modules/luax.h" -#include "embed/embed.h" - -namespace jin -{ -namespace lua -{ - - extern int luaopen_core(lua_State* L); - extern int luaopen_graphics(lua_State* L); - extern int luaopen_audio(lua_State* L); - extern int luaopen_net(lua_State* L); - extern int luaopen_event(lua_State* L); - extern int luaopen_time(lua_State* L); - extern int luaopen_mouse(lua_State* L); - extern int luaopen_keyboard(lua_State* L); - extern int luaopen_filesystem(lua_State* L); - extern int luaopen_joypad(lua_State* L); - extern int luaopen_math(lua_State* L); - extern int luaopen_thread(lua_State* L); - extern int luaopen_bit(lua_State* L); - - static int l_getversion(lua_State* L) - { - luax_pushstring(L, VERSION); - return 1; - } - - static int l_getAuthor(lua_State* L) - { - luax_pushstring(L, AUTHOR); - return 1; - } - - static int l_getOS(lua_State* L) - { - #ifdef _WIN32 - luax_pushstring(L, "windows"); - #elif defined __unix__ - luax_pushstring(L, "unix"); - #elif defined __APPLE__ - luax_pushstring(L, "macos"); - #endif - return 1; - } - - static int l_revision(lua_State* L) - { - luax_pushnumber(L, REVISION); - return 1; - } - - static const luaL_Reg f[] = { - { "version", l_getversion }, - { "revision", l_revision }, - { "author", l_getAuthor }, - { "os", l_getOS }, - { 0, 0 } - }; - - // submodules - static const luaL_Reg mods[] = { - { "core", luaopen_core }, - { "event", luaopen_event }, - { "graphics", luaopen_graphics }, - { "time", luaopen_time }, - { "mouse", luaopen_mouse }, - { "keyboard", luaopen_keyboard }, - { "filesystem", luaopen_filesystem }, - { "net", luaopen_net }, - { "audio", luaopen_audio }, - { "joypad", luaopen_joypad }, - { "math", luaopen_math }, - { "thread", luaopen_thread }, - { "bit", luaopen_bit }, - { 0, 0 } - }; - - int luaopen_jin(lua_State* L) - { - // jin module is on top of the stack - luax_newlib(L, f); - - // set to global field - luax_justglobal(L, -1, MODULE_NAME); - - // register submodules - for (int i = 0; mods[i].name; ++i) - { - mods[i].func(L); - luax_setfield(L, -2, mods[i].name); - } - - return 1; - } - - void boot(lua_State* L) - { - jin::embed::boot(L); - } - -} // lua -} // jin
\ No newline at end of file diff --git a/src/lua/modules/jin.h b/src/lua/modules/jin.h deleted file mode 100644 index 07531b2..0000000 --- a/src/lua/modules/jin.h +++ /dev/null @@ -1,42 +0,0 @@ -/** -* Copyright (C) 2016~2018 chai -* -* Permission is hereby granted, free of charge, to any person obtaining a copyof -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to use, -* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the -* Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef __JIN_M_JIN_H -#define __JIN_M_JIN_H -#include "luax.h" - -#define MODULE_NAME "jin" -#define VERSION "0.1.1" -#define REVISION 101 -#define AUTHOR "chai" - -namespace jin -{ -namespace lua -{ - - int luaopen_jin(lua_State* L); - void boot(lua_State* L); - -} // jin -} // lua - -#endif // __JIN_M_JIN_H
\ No newline at end of file diff --git a/src/lua/modules/joypad/joypad.cpp b/src/lua/modules/joypad/joypad.cpp index d305878..d67a624 100644 --- a/src/lua/modules/joypad/joypad.cpp +++ b/src/lua/modules/joypad/joypad.cpp @@ -1,21 +1,21 @@ #include "libjin/jin.h" #include "lua/modules/luax.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - static const luaL_Reg f[] = { - { 0, 0 } - }; - - int luaopen_joypad(lua_State* L) + namespace Lua { - luax_newlib(L, f); - return 1; - } + static const luaL_Reg f[] = { + { 0, 0 } + }; + + int luaopen_joypad(lua_State* L) + { + luax_newlib(L, f); -} -}
\ No newline at end of file + return 1; + } + /*SDL_JoystickGetButton*/ + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/keyboard/keyboard.cpp b/src/lua/modules/keyboard/keyboard.cpp index 9d27a4f..727a51e 100644 --- a/src/lua/modules/keyboard/keyboard.cpp +++ b/src/lua/modules/keyboard/keyboard.cpp @@ -1,16 +1,16 @@ #include "lua/modules/luax.h" -#include "lua/modules/embed/keyboard.lua.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - int luaopen_keyboard(lua_State* L) + namespace Lua { - luax_newlib(L, 0); - return 1; - } + //https://wiki.libsdl.org/SDL_Keycode + + int luaopen_keyboard(lua_State* L) + { + luax_newlib(L, 0); + return 1; + } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/luax.h b/src/lua/modules/luax.h index 89e456e..f45af39 100644 --- a/src/lua/modules/luax.h +++ b/src/lua/modules/luax.h @@ -1,7 +1,6 @@ -#ifndef __JIN_LUA_LUAX_H -#define __JIN_LUA_LUAX_H +#ifndef __JIN_MODULES_LUAX_H +#define __JIN_MODULES_LUAX_H -#include "LuaJIT/lua.hpp" -#include "lua/libraries/luax/luax.h" +#include "../luax.h" #endif
\ No newline at end of file diff --git a/src/lua/modules/math/math.cpp b/src/lua/modules/math/math.cpp index fa59e04..4891762 100644 --- a/src/lua/modules/math/math.cpp +++ b/src/lua/modules/math/math.cpp @@ -1,30 +1,30 @@ #include "lua/modules/luax.h" #include "libjin/jin.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - static int l_mod(lua_State* L) + namespace Lua { - int n = luax_checkinteger(L, 1); - int m = luax_checkinteger(L, 2); - int mod = n % m; - luax_pushinteger(L, mod); - return 1; - } - static const luaL_Reg f[] = { - { "mod", l_mod }, - { 0, 0 } - }; + static int l_mod(lua_State* L) + { + int n = luax_checkinteger(L, 1); + int m = luax_checkinteger(L, 2); + int mod = n % m; + luax_pushinteger(L, mod); + return 1; + } - int luaopen_math(lua_State* L) - { - luax_newlib(L, f); - return 1; - } + static const luaL_Reg f[] = { + { "mod", l_mod }, + { 0, 0 } + }; + + int luaopen_math(lua_State* L) + { + luax_newlib(L, f); + return 1; + } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/mouse/mouse.cpp b/src/lua/modules/mouse/mouse.cpp index f907abb..9d45178 100644 --- a/src/lua/modules/mouse/mouse.cpp +++ b/src/lua/modules/mouse/mouse.cpp @@ -1,31 +1,42 @@ #include "lua/modules/luax.h" #include "libjin/jin.h" -namespace jin +namespace JinEngine { -namespace lua -{ - using namespace jin::input; - - static int l_pos(lua_State* L) + namespace Lua { - static Mouse* mouse = Mouse::get(); - int x, y; - mouse->getState(&x, &y); - luax_pushnumber(L, x); - luax_pushnumber(L, y); - return 2; - } - static const luaL_Reg f[] = { - { "position", l_pos }, - { 0, 0 } - }; + using namespace JinEngine::Input; + + static int l_pos(lua_State* L) + { + static Mouse* mouse = Mouse::get(); + int x, y; + mouse->getState(&x, &y); + luax_pushnumber(L, x); + luax_pushnumber(L, y); + return 2; + } + + static int l_setVisible(lua_State* L) + { + bool visible = luax_checkbool(L, 1); + Mouse* mouse = Mouse::get(); + mouse->setVisible(visible); + return 0; + } + + static const luaL_Reg f[] = { + { "position", l_pos }, + { "setVisible", l_setVisible }, + { 0, 0 } + }; - int luaopen_mouse(lua_State* L) - { - luax_newlib(L, f); - return 1; - } -} -}
\ No newline at end of file + int luaopen_mouse(lua_State* L) + { + luax_newlib(L, f); + return 1; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/net/Buffer.cpp b/src/lua/modules/net/Buffer.cpp index 3354518..ddfbd6b 100644 --- a/src/lua/modules/net/Buffer.cpp +++ b/src/lua/modules/net/Buffer.cpp @@ -4,133 +4,139 @@ #include "libjin/jin.h" #include "Buffer.h" -namespace jin +namespace JinEngine { -namespace lua -{ -namespace net -{ - - static inline Ref<Buffer>& checkNetBuffer(lua_State* L) + namespace Lua { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER); - return proxy->getRef<Buffer>(); - } - - // net.Buffer:append(value) -> value_length - static int l_append(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - const int vp = 2; - if (luax_isintegerstrict(L, vp)) - { - int n = luax_checkinteger(L, vp); - int size = sizeof(n); - ref->append(&n, size); - luax_pushinteger(L, size); - return 1; - } - else if (luax_isfloatstrict(L, vp)) - { - float n = luax_checknumber(L, vp); - int size = sizeof(n); - ref->append(&n, size); - luax_pushinteger(L, size); - return 1; - } - else if (luax_isbooleanstrict(L, vp)) - { - bool n = luax_checkbool(L, vp); - int size = sizeof(n); - ref->append(&n, size); - luax_pushinteger(L, size); - return 1; - } - else if (luax_isstringstrict(L, vp)) + namespace Net { - const char* str = luax_checkstring(L, vp); - int size = strlen(str) + 1; - ref->append(str, size); - luax_pushinteger(L, size); - return 1; - } - else - { - luax_typerror(L, vp, "number, bool or string"); - return 0; - } - } - // net.Buffer:grabString(offset) -> string, length - static int l_grabString(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - int offset = luax_checkinteger(L, 2); - int len; - const char* str = ref->grabString(&len, offset); - luax_pushstring(L, str); - luax_pushinteger(L, len); - return 2; - } + using namespace JinEngine; - // net.Buffer:grabInteger(offset) -> integer, length - static int l_grabInteger(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - int offset = luax_checkinteger(L, 2); - int len; - int integer = ref->grabInteger(&len, offset); - luax_pushinteger(L, integer); - luax_pushinteger(L, len); - return 2; - } + typedef Ref<Buffer>& BufferRef; - static int l_grabFloat(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - int offset = luax_checkinteger(L, 2); - int len; - float floatv = ref->grabFloat(&len, offset); - luax_pushnumber(L, floatv); - luax_pushinteger(L, len); - return 2; - } + static inline BufferRef checkNetBuffer(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER); + return proxy->getRef<Buffer>(); + } - static int l_grabBoolean(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - int offset = luax_checkinteger(L, 2); - int len; - bool boolean = ref->grabBoolean(&len, offset); - luax_pushboolean(L, boolean); - luax_pushinteger(L, len); - return 2; - } + // net.Buffer:append(value) -> value_length + static int l_append(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + const int vp = 2; + if (luax_isintegerstrict(L, vp)) + { + int n = luax_checkinteger(L, vp); + int size = sizeof(n); + ref->append(&n, size); + luax_pushinteger(L, size); + return 1; + } + else if (luax_isfloatstrict(L, vp)) + { + float n = luax_checknumber(L, vp); + int size = sizeof(n); + ref->append(&n, size); + luax_pushinteger(L, size); + return 1; + } + else if (luax_isbooleanstrict(L, vp)) + { + bool n = luax_checkbool(L, vp); + int size = sizeof(n); + ref->append(&n, size); + luax_pushinteger(L, size); + return 1; + } + else if (luax_isstringstrict(L, vp)) + { + const char* str = luax_checkstring(L, vp); + int size = strlen(str) + 1; + ref->append(str, size); + luax_pushinteger(L, size); + return 1; + } + else + { + luax_typerror(L, vp, "number, bool or string"); + return 0; + } + } - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER); - proxy->release(); - return 0; - } + // net.Buffer:grabString(offset) -> string, length + static int l_grabString(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + int offset = luax_checkinteger(L, 2); + unsigned int len; + char* data = ref->grabString(&len, offset); + Array<char> str; + str.bind(data, len); + luax_pushstring(L, &str); + luax_pushinteger(L, str.count()); + return 2; + } - static const luaL_Reg netbuffer_function[] = { - { "__gc", l_gc }, - { "append", l_append }, - { "grabString", l_grabString }, - { "grabInteger", l_grabInteger }, - { "grabBoolean", l_grabBoolean }, - { "grabFloat", l_grabFloat }, - { 0, 0 } - }; + // net.Buffer:grabInteger(offset) -> integer, length + static int l_grabInteger(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + int offset = luax_checkinteger(L, 2); + int len; + int integer = ref->grabInteger(&len, offset); + luax_pushinteger(L, integer); + luax_pushinteger(L, len); + return 2; + } -} // net + static int l_grabFloat(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + int offset = luax_checkinteger(L, 2); + int len; + float floatv = ref->grabFloat(&len, offset); + luax_pushnumber(L, floatv); + luax_pushinteger(L, len); + return 2; + } - int luaopen_Buffer(lua_State* L) - { - luax_newtype(L, JIN_NETWORK_BUFFER, net::netbuffer_function); - return 0; - } + static int l_grabBoolean(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + int offset = luax_checkinteger(L, 2); + int len; + bool boolean = ref->grabBoolean(&len, offset); + luax_pushboolean(L, boolean); + luax_pushinteger(L, len); + return 2; + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER); + proxy->release(); + return 0; + } + + static const luaL_Reg netbuffer_function[] = { + { "__gc", l_gc }, + { "append", l_append }, + { "grabString", l_grabString }, + { "grabInteger", l_grabInteger }, + { "grabBoolean", l_grabBoolean }, + { "grabFloat", l_grabFloat }, + { 0, 0 } + }; + + } // namespace Net + + int luaopen_Buffer(lua_State* L) + { + luax_newtype(L, JIN_NETWORK_BUFFER, Net::netbuffer_function); + return 0; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/net/Buffer.h b/src/lua/modules/net/Buffer.h index 31e6df8..8733778 100644 --- a/src/lua/modules/net/Buffer.h +++ b/src/lua/modules/net/Buffer.h @@ -5,92 +5,93 @@ #include <cstdlib> #include "lua/common/common.h" -namespace jin +namespace JinEngine { -namespace lua -{ -namespace net -{ - - class Buffer + namespace Lua { - public: - Buffer(size_t s = 0) - : size(s) + namespace Net { - buffer = new char[size]; - memset(buffer, 0, size); - } - Buffer(const char* data, size_t s) - : size(s) - { - buffer = new char[size]; - memcpy(buffer, data, size); - } - - ~Buffer() - { - if (buffer != nullptr) + class Buffer { - delete[] buffer; - buffer = nullptr; - size = 0; - } - } + public: + Buffer(size_t s = 0) + : size(s) + { + buffer = new char[size]; + memset(buffer, 0, size); + } - void append(const void* data, size_t s) - { - if (data == nullptr) - return; - char* buf = buffer; - buffer = new char[size + s]; - memcpy(buffer, buf, size); - memcpy(buffer + size, data, s); - delete[] buf; - size += s; - return; - } + Buffer(const char* data, size_t s) + : size(s) + { + buffer = new char[size]; + memcpy(buffer, data, size); + } - const char* grabString(int* length, int offset = 0) - { - int l = offset; - for (; l < size; ++l) - { - if (buffer[l] == 0) - break; - } - *length = l - offset + 1; - char* str = (char*)malloc(*length); - memcpy(str, buffer + offset, *length); - return str; - } + ~Buffer() + { + if (buffer != nullptr) + { + delete[] buffer; + buffer = nullptr; + size = 0; + } + } - int grabInteger(int* length, int offset = 0) - { - *length = sizeof(int); - return *((int*)(buffer + offset)); - } + void append(const void* data, size_t s) + { + if (data == nullptr) + return; + char* buf = buffer; + buffer = new char[size + s]; + memcpy(buffer, buf, size); + memcpy(buffer + size, data, s); + delete[] buf; + size += s; + return; + } - float grabFloat(int* length, int offset = 0) - { - *length = sizeof(float); - return *((float*)(buffer + offset)); - } + /* grab and create a string */ + char* grabString(unsigned int* length, int offset = 0) + { + int l = offset; + for (; l < size; ++l) + { + if (buffer[l] == 0) + break; + } + *length = l - offset + 1; + char* str = (char*)malloc(*length); + memcpy(str, buffer + offset, *length); + return str; + } - bool grabBoolean(int* length, int offset = 0) - { - *length = sizeof(bool); - return *((bool*)(buffer + offset)); - } + int grabInteger(int* length, int offset = 0) + { + *length = sizeof(int); + return *((int*)(buffer + offset)); + } + + float grabFloat(int* length, int offset = 0) + { + *length = sizeof(float); + return *((float*)(buffer + offset)); + } + + bool grabBoolean(int* length, int offset = 0) + { + *length = sizeof(bool); + return *((bool*)(buffer + offset)); + } - char* buffer; - size_t size; + char* buffer; + size_t size; - }; + }; -} // net -} // lua -} // jin + } // namespace Net + } // namespace Lua +} // namespace JinEngine #endif
\ No newline at end of file diff --git a/src/lua/modules/net/net.cpp b/src/lua/modules/net/net.cpp index a984920..4ef9ece 100644 --- a/src/lua/modules/net/net.cpp +++ b/src/lua/modules/net/net.cpp @@ -4,16 +4,17 @@ #include "lua/common/common.h" #include "Buffer.h" -namespace jin +namespace JinEngine { -namespace lua +namespace Lua { - using namespace jin::lua::net; - using namespace jin::net; + + using namespace JinEngine::Lua::Net; + using namespace JinEngine::Net; static int l_initNetwork(lua_State* L) { - jin::net::Net::get()->init(); + JinEngine::Net::NetManager::get()->init(); return 1; } @@ -56,7 +57,7 @@ namespace lua { int size = luax_checkinteger(L, 1); Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); - net::Buffer* buffer = new net::Buffer(size); + Net::Buffer* buffer = new Net::Buffer(size); proxy->bind(new Ref<Buffer>(buffer, JIN_NETWORK_BUFFER)); return 1; } @@ -81,5 +82,5 @@ namespace lua return 1; } -} // lua -} // jin
\ No newline at end of file +} // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/net/socket.cpp b/src/lua/modules/net/socket.cpp index 6d3fdfb..d6de730 100644 --- a/src/lua/modules/net/socket.cpp +++ b/src/lua/modules/net/socket.cpp @@ -4,124 +4,126 @@ #include "libjin/jin.h" #include "Buffer.h" -namespace jin -{ -namespace lua +namespace JinEngine { + namespace Lua + { - using namespace jin::net; - using namespace lua::net; + using namespace JinEngine::Net; + using namespace Lua::Net; - const int BUFFER_SIZE = 1024; + typedef Ref<Socket>& SocketRef; - static inline Ref<Socket>& checkSocket(lua_State* L, int pos = 1) - { - Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_SOCKET); - return proxy->getRef<Socket>(); - } + const int BUFFER_SIZE = 1024; - static inline Ref<Buffer>& checkNetBuffer(lua_State* L, int pos = 1) - { - Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_BUFFER); - return proxy->getRef<Buffer>(); - } + static inline SocketRef checkSocket(lua_State* L, int pos = 1) + { + Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_SOCKET); + return proxy->getRef<Socket>(); + } - // return net.Socket - static int l_accept(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - Socket* client = socket->accept(); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_SOCKET, sizeof(Proxy)); - proxy->bind(new Ref<Socket>(client, JIN_NETWORK_SOCKET)); - return 1; - } + static inline Ref<Buffer>& checkNetBuffer(lua_State* L, int pos = 1) + { + Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_BUFFER); + return proxy->getRef<Buffer>(); + } + + // return net.Socket + static int l_accept(lua_State* L) + { + SocketRef socket = checkSocket(L); + Socket* client = socket->accept(); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_SOCKET, sizeof(Proxy)); + proxy->bind(new Ref<Socket>(client, JIN_NETWORK_SOCKET)); + return 1; + } - // return net.Buffer - static int l_receive(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - char buffer[BUFFER_SIZE] = {0}; - int size = socket->receive(buffer, BUFFER_SIZE); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); - net::Buffer* netBuffer = new net::Buffer(buffer, size); - proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER)); - return 1; - } + // return net.Buffer + static int l_receive(lua_State* L) + { + SocketRef socket = checkSocket(L); + char buffer[BUFFER_SIZE] = {0}; + int size = socket->receive(buffer, BUFFER_SIZE); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); + Net::Buffer* netBuffer = new Net::Buffer(buffer, size); + proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER)); + return 1; + } - // Socket:receiveFrom(address, port) - static int l_receiveFrom(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - int address = luax_checkinteger(L, 2); - int port = luax_checkinteger(L, 3); - char buffer[BUFFER_SIZE]; - int size = socket->receiveFrom(buffer, BUFFER_SIZE, address, port); - net::Buffer* netBuffer = new net::Buffer(buffer, size); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); - proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER)); - return 1; - } + // Socket:receiveFrom(address, port) + static int l_receiveFrom(lua_State* L) + { + SocketRef socket = checkSocket(L); + int address = luax_checkinteger(L, 2); + int port = luax_checkinteger(L, 3); + char buffer[BUFFER_SIZE]; + int size = socket->receiveFrom(buffer, BUFFER_SIZE, address, port); + Net::Buffer* netBuffer = new Net::Buffer(buffer, size); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); + proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER)); + return 1; + } - // Socket:send(net.Buffer) -> data_length - static int l_send(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - Ref<Buffer>& ref = checkNetBuffer(L, 2); - int len = socket->send(ref->buffer, ref->size); - luax_pushinteger(L, len); - return 1; - } + // Socket:send(net.Buffer) -> data_length + static int l_send(lua_State* L) + { + SocketRef socket = checkSocket(L); + Ref<Buffer>& ref = checkNetBuffer(L, 2); + int len = socket->send(ref->buffer, ref->size); + luax_pushinteger(L, len); + return 1; + } - // Socket:sendTo(address, port, net.Buffer) - static int l_sendTo(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - int address = luax_checkinteger(L, 2); - int port = luax_checkinteger(L, 3); - Ref<Buffer>& buffer = checkNetBuffer(L, 4); - socket->sendTo(buffer->buffer, buffer->size, address, port); - return 0; - } + // Socket:sendTo(address, port, net.Buffer) + static int l_sendTo(lua_State* L) + { + SocketRef socket = checkSocket(L); + int address = luax_checkinteger(L, 2); + int port = luax_checkinteger(L, 3); + Ref<Buffer>& buffer = checkNetBuffer(L, 4); + socket->sendTo(buffer->buffer, buffer->size, address, port); + return 0; + } - static int l_close(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - socket->close(); - return 0; - } + static int l_close(lua_State* L) + { + SocketRef socket = checkSocket(L); + socket->close(); + return 0; + } - static int l_configBlocking(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - bool blocking = luax_checkbool(L, 2); - socket->configureBlocking(blocking); - return 0; - } + static int l_configBlocking(lua_State* L) + { + SocketRef socket = checkSocket(L); + bool blocking = luax_checkbool(L, 2); + socket->configureBlocking(blocking); + return 0; + } - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_SOCKET); - proxy->release(); - return 0; - } + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_SOCKET); + proxy->release(); + return 0; + } - static const luaL_Reg socket_function[] = { - { "__gc", l_gc }, - { "accept", l_accept }, - { "receive", l_receive }, - { "receiveFrom", l_receiveFrom }, - { "send", l_send }, - { "sendTo", l_sendTo }, - { "close", l_close }, - { "configBlocking", l_configBlocking }, - { 0, 0 } - }; + static const luaL_Reg socket_function[] = { + { "__gc", l_gc }, + { "accept", l_accept }, + { "receive", l_receive }, + { "receiveFrom", l_receiveFrom }, + { "send", l_send }, + { "sendTo", l_sendTo }, + { "close", l_close }, + { "configBlocking", l_configBlocking }, + { 0, 0 } + }; - int luaopen_Socket(lua_State* L) - { - luax_newtype(L, JIN_NETWORK_SOCKET, socket_function); - return 0; - } + int luaopen_Socket(lua_State* L) + { + luax_newtype(L, JIN_NETWORK_SOCKET, socket_function); + return 0; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/physics/physics.cpp b/src/lua/modules/physics/physics.cpp deleted file mode 100644 index a5b9162..0000000 --- a/src/lua/modules/physics/physics.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../luax.h" -#include "libjin/Physics/Physics.h" - -namespace jin -{ -namespace lua -{ - - using namespace jin::physics; - - int luaopen_physics(lua_State* L) - { - } - -} // physics -} // jin
\ No newline at end of file diff --git a/src/lua/modules/thread/Thread.cpp b/src/lua/modules/thread/Thread.cpp index 5c9cb1f..e1c5a92 100644 --- a/src/lua/modules/thread/Thread.cpp +++ b/src/lua/modules/thread/Thread.cpp @@ -1,249 +1,252 @@ #include "lua/modules/luax.h" #include "lua/modules/types.h" #include "libjin/jin.h" -#include "lua/modules/jin.h" +#include "lua/jin.h" #include "lua/common/common.h" #include "thread.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - using thread::Thread; - - int luaopen_thread(lua_State* L); - - static inline Ref<Thread>& checkThread(lua_State* L) + namespace Lua { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); - return proxy->getRef<Thread>(); - } - static int threadRunner(void* t) - { - Ref<Thread>& ref = *(Ref<Thread>*)t; - lua_State* L = lua_open(); - luax_openlibs(L); - luaopen_jin(L); - luax_getglobal(L, MODULE_NAME); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); - ref.retain(); - proxy->bind(&ref); - luax_setfield(L, -2, "_curThread"); - luax_dostring(L, ref->code.c_str()); - luax_close(L); - return 0; - } - - static int l_thread_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); - proxy->release(); - return 0; - } + using thread::Thread; - static int l_start(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - bool result = ref->start(&ref); - luax_pushboolean(L, result); - return 1; - } + typedef Ref<Thread>& ThreadRef; - static int l_wait(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - ref->wait(); - return 0; - } + int luaopen_thread(lua_State* L); - static int l_send(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - const int vp = 3; - if (luax_isnumberstrict(L, vp)) + static inline ThreadRef checkThread(lua_State* L) { - float real = luax_checknumber(L, vp); - ref->send(slot, real); + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); + return proxy->getRef<Thread>(); } - else if (luax_isbooleanstrict(L, vp)) + + static int threadRunner(void* t) { - bool bol = luax_checkbool(L, vp); - ref->send(slot, bol); + ThreadRef ref = *(Ref<Thread>*)t; + lua_State* L = lua_open(); + luax_openlibs(L); + luaopen_jin(L); + luax_getglobal(L, MODULE_NAME); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); + ref.retain(); + proxy->bind(&ref); + luax_setfield(L, -2, "_curThread"); + luax_dostring(L, ref->code.c_str()); + luax_close(L); + return 0; } - else if (luax_isstringstrict(L, vp)) + + static int l_thread_gc(lua_State* L) { - const char* str = luax_checkstring(L, vp); - ref->send(slot, str); + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); + proxy->release(); + return 0; } - else if (luax_isuserdata(L, vp)) + + static int l_start(lua_State* L) { - void* p = luax_touserdata(L, vp); - ref->send(slot, p); + ThreadRef ref = checkThread(L); + bool result = ref->start(&ref); + luax_pushboolean(L, result); + return 1; } - else if (luax_islightuserdata(L, vp)) + + static int l_wait(lua_State* L) { - void* p = luax_tolightuserdata(L, vp); - ref->send(slot, p); + ThreadRef ref = checkThread(L); + ref->wait(); + return 0; } - return 0; - } - static int l_receive(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - bool result = ref->receive(slot); - luax_pushboolean(L, result); - return 1; - } - - static int l_fetch(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - Thread::Variant v = ref->fetch(slot); - switch (v.type) + static int l_send(lua_State* L) { - case thread::Thread::Variant::INTERGER: - luax_pushinteger(L, v.integer); - break; - - case thread::Thread::Variant::BOOLEAN: - luax_pushboolean(L, v.boolean); - break; - - case thread::Thread::Variant::CSTRING: - luax_pushstring(L, v.cstring); - break; - - case thread::Thread::Variant::REAL: - luax_pushnumber(L, v.real); - break; + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + const int vp = 3; + if (luax_isnumberstrict(L, vp)) + { + float real = luax_checknumber(L, vp); + ref->send(slot, real); + } + else if (luax_isbooleanstrict(L, vp)) + { + bool bol = luax_checkbool(L, vp); + ref->send(slot, bol); + } + else if (luax_isstringstrict(L, vp)) + { + const char* str = luax_checkstring(L, vp); + ref->send(slot, str); + } + else if (luax_isuserdata(L, vp)) + { + void* p = luax_touserdata(L, vp); + ref->send(slot, p); + } + else if (luax_islightuserdata(L, vp)) + { + void* p = luax_tolightuserdata(L, vp); + ref->send(slot, p); + } + return 0; + } - case thread::Thread::Variant::POINTER: - Proxy* p = (Proxy*)v.pointer; - Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy)); - p->reference->retain(); - proxy->bind(p->reference); - break; + static int l_receive(lua_State* L) + { + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + bool result = ref->receive(slot); + luax_pushboolean(L, result); + return 1; + } + static int l_fetch(lua_State* L) + { + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + Thread::Variant v = ref->fetch(slot); + switch (v.type) + { + case thread::Thread::Variant::INTERGER: + luax_pushinteger(L, v.integer); + break; + + case thread::Thread::Variant::BOOLEAN: + luax_pushboolean(L, v.boolean); + break; + + case thread::Thread::Variant::CSTRING: + luax_pushstring(L, v.cstring); + break; + + case thread::Thread::Variant::REAL: + luax_pushnumber(L, v.real); + break; + + case thread::Thread::Variant::POINTER: + Proxy* p = (Proxy*)v.pointer; + Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy)); + p->reference->retain(); + proxy->bind(p->reference); + break; + + } + return 1; } - return 1; - } - static int l_demand(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - Thread::Variant v = ref->demand(slot); - switch (v.type) + static int l_demand(lua_State* L) { - case thread::Thread::Variant::INTERGER: - luax_pushinteger(L, v.integer); - break; + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + Thread::Variant v = ref->demand(slot); + switch (v.type) + { + case thread::Thread::Variant::INTERGER: + luax_pushinteger(L, v.integer); + break; + + case thread::Thread::Variant::BOOLEAN: + luax_pushboolean(L, v.boolean); + break; + + case thread::Thread::Variant::CSTRING: + luax_pushstring(L, v.cstring); + break; + + case thread::Thread::Variant::REAL: + luax_pushnumber(L, v.real); + break; + + case thread::Thread::Variant::POINTER: + Proxy* p = (Proxy*)v.pointer; + const char* objType = p->getObjectType(); + Proxy* proxy = (Proxy*)luax_newinstance(L, objType, sizeof(Proxy)); + p->reference->retain(); + proxy->bind(p->reference); + break; + + } + return 1; + } - case thread::Thread::Variant::BOOLEAN: - luax_pushboolean(L, v.boolean); - break; + static int l_remove(lua_State* L) + { + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + ref->remove(slot); + return 0; + } - case thread::Thread::Variant::CSTRING: - luax_pushstring(L, v.cstring); - break; + static int l_getName(lua_State* L) + { + ThreadRef ref = checkThread(L); + const char* name = ref->getName(); + luax_pushstring(L, name); + return 1; + } - case thread::Thread::Variant::REAL: - luax_pushnumber(L, v.real); - break; + static int l_isRunning(lua_State* L) + { + ThreadRef ref = checkThread(L); + bool running = ref->isRunning(); + luax_pushboolean(L, running); + return 1; + } - case thread::Thread::Variant::POINTER: - Proxy* p = (Proxy*)v.pointer; - Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy)); - p->reference->retain(); - proxy->bind(p->reference); - break; + static const luaL_Reg thread_function[] = { + { "__gc", l_thread_gc }, + { "start", l_start }, + { "wait", l_wait }, + { "send", l_send }, + { "receive", l_receive }, + { "fetch", l_fetch }, + { "demand", l_demand }, + { "remove", l_remove }, + { "getName", l_getName }, + { "isRunning", l_isRunning }, + { 0, 0 } + }; + + static int luaopen_Thread(lua_State* L) + { + luax_newtype(L, JIN_THREAD_THREAD, thread_function); + return 0; + } + + static int l_newThread(lua_State* L) + { + const char* name = luax_checkstring(L, 1); + const char* code = luax_checkstring(L, 2); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); + Thread* thread = new Thread(name, code, threadRunner); + proxy->bind(new Ref<Thread>(thread, JIN_THREAD_THREAD)); + return 1; } - return 1; - } - - static int l_remove(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - ref->remove(slot); - return 0; - } - static int l_getName(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - const char* name = ref->getName(); - luax_pushstring(L, name); - return 1; - } + static int l_getThread(lua_State* L) + { + luax_getglobal(L, MODULE_NAME); + luax_getfield(L, -1, "_curThread"); + return 1; + } - static int l_isRunning(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - bool running = ref->isRunning(); - luax_pushboolean(L, running); - return 1; - } - - static const luaL_Reg thread_function[] = { - { "__gc", l_thread_gc }, - { "start", l_start }, - { "wait", l_wait }, - { "send", l_send }, - { "receive", l_receive }, - { "fetch", l_fetch }, - { "demand", l_demand }, - { "remove", l_remove }, - { "getName", l_getName }, - { "isRunning", l_isRunning }, - { 0, 0 } - }; - - static int luaopen_Thread(lua_State* L) - { - luax_newtype(L, JIN_THREAD_THREAD, thread_function); + static const luaL_Reg f[] = { + { "newThread", l_newThread }, + { "getThread", l_getThread }, + { 0, 0 } + }; - return 0; - } - - static int l_newThread(lua_State* L) - { - const char* name = luax_checkstring(L, 1); - const char* code = luax_checkstring(L, 2); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); - Thread* thread = new Thread(name, code, threadRunner); - proxy->bind(new Ref<Thread>(thread, JIN_THREAD_THREAD)); - return 1; - } - - static int l_getThread(lua_State* L) - { - luax_getglobal(L, MODULE_NAME); - luax_getfield(L, -1, "_curThread"); - return 1; - } - - static const luaL_Reg f[] = { - { "newThread", l_newThread }, - { "getThread", l_getThread }, - { 0, 0 } - }; - - int luaopen_thread(lua_State* L) - { - luaopen_Thread(L); + int luaopen_thread(lua_State* L) + { + luaopen_Thread(L); - luax_newlib(L, f); + luax_newlib(L, f); - return 1; - } + return 1; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/thread/Thread.h b/src/lua/modules/thread/Thread.h index 645d4a1..60d588a 100644 --- a/src/lua/modules/thread/Thread.h +++ b/src/lua/modules/thread/Thread.h @@ -1,94 +1,94 @@ #include "libjin/jin.h" #include "lua/common/common.h" -namespace jin +namespace JinEngine { -namespace lua -{ -namespace thread -{ - - class Thread + namespace Lua { - public: - typedef jin::thread::Thread::Variant Variant; - typedef jin::thread::Thread::ThreadRunner ThreadRunner; - - Thread(std::string _name, std::string _code, ThreadRunner runner) - : name(_name) - , code(_code) - { - thread = new jin::thread::Thread(_name, runner); - } - - ~Thread() - { - delete thread; - } - - bool start(void* p) - { - return thread->start(p); - } - - void wait() - { - thread->wait(); - } - - void send(int slot, const Variant& value) - { - thread->send(slot, value); - } - - bool receive(int slot) - { - return thread->receive(slot); - } - - Variant fetch(int slot) + namespace thread { - return thread->fetch(slot); - } - - Variant demand(int slot) - { - return thread->demand(slot); - } - - void remove(int slot) - { - thread->remove(slot); - } - - const char* getName() - { - return name.c_str(); - } - - bool isRunning() - { - return thread->isRunning(); - } - - void lock() - { - thread->lock(); - } - - void unlock() - { - thread->unlock(); - } - - const std::string name; - const std::string code; - - private: - jin::thread::Thread* thread; - - }; -} // thread -} // lua -} // jin
\ No newline at end of file + class Thread + { + public: + typedef JinEngine::MultiThread::Thread::Variant Variant; + typedef JinEngine::MultiThread::Thread::ThreadRunner ThreadRunner; + + Thread(std::string _name, std::string _code, ThreadRunner runner) + : name(_name) + , code(_code) + { + thread = new JinEngine::MultiThread::Thread(_name, runner); + } + + ~Thread() + { + delete thread; + } + + bool start(void* p) + { + return thread->start(p); + } + + void wait() + { + thread->wait(); + } + + void send(int slot, const Variant& value) + { + thread->send(slot, value); + } + + bool receive(int slot) + { + return thread->receive(slot); + } + + Variant fetch(int slot) + { + return thread->fetch(slot); + } + + Variant demand(int slot) + { + return thread->demand(slot); + } + + void remove(int slot) + { + thread->remove(slot); + } + + const char* getName() + { + return name.c_str(); + } + + bool isRunning() + { + return thread->isRunning(); + } + + void lock() + { + thread->lock(); + } + + void unlock() + { + thread->unlock(); + } + + const std::string name; + const std::string code; + + private: + JinEngine::MultiThread::Thread* thread; + + }; + + } // thread + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/time/time.cpp b/src/lua/modules/time/time.cpp index 39743b4..f6e6f26 100644 --- a/src/lua/modules/time/time.cpp +++ b/src/lua/modules/time/time.cpp @@ -2,37 +2,37 @@ #include <SDL2/SDL.h> #include "libjin/jin.h" -namespace jin -{ -namespace lua +namespace JinEngine { + namespace Lua + { - using namespace jin::time; + using namespace JinEngine::Time; - static int l_sec(lua_State* L) - { - luax_pushnumber(L, getSecond()); - return 1; - } + static int l_sec(lua_State* L) + { + luax_pushnumber(L, getSecond()); + return 1; + } - static int l_sleep(lua_State* L) - { - double sec = luax_checknumber(L, 1); - sleep(sec * 1000.0f); - return 0; - } + static int l_sleep(lua_State* L) + { + double sec = luax_checknumber(L, 1); + sleep(sec * 1000.0f); + return 0; + } - static const luaL_Reg f[] = { - { "second", l_sec }, - { "sleep", l_sleep }, - { 0, 0 }, - }; + static const luaL_Reg f[] = { + { "second", l_sec }, + { "sleep", l_sleep }, + { 0, 0 }, + }; - int luaopen_time(lua_State* L) - { - luax_newlib(L, f); - return 1; - } + int luaopen_time(lua_State* L) + { + luax_newlib(L, f); + return 1; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/types.h b/src/lua/modules/types.h index 318f5fa..123604e 100644 --- a/src/lua/modules/types.h +++ b/src/lua/modules/types.h @@ -1,20 +1,25 @@ #ifndef __JIN_MODULES_TYPES_H #define __JIN_MODULES_TYPES_H -// graphics module -#define JIN_GRAPHICS_IMAGE "jin.graphics.Image" -#define JIN_GRAPHICS_SHADER "jin.graphics.Shader" -#define JIN_GRAPHICS_CANVAS "jin.graphics.Canvas" -#define JIN_GRAPHICS_FONT "jin.graphics.Font" - -// audio module -#define JIN_AUDIO_SOURCE "jin.Audio.Source" - -// thread module -#define JIN_THREAD_THREAD "jin.thread.Thread" - -// network module -#define JIN_NETWORK_SOCKET "jin.net.Socket" -#define JIN_NETWORK_BUFFER "jin.net.Buffer" +// graphics module +#define JIN_GRAPHICS_TEXTURE "Texture" +#define JIN_GRAPHICS_SHADER "Shader" +#define JIN_GRAPHICS_CANVAS "Canvas" +#define JIN_GRAPHICS_TEXT "Text" +#define JIN_GRAPHICS_TTFDATA "TTFData" +#define JIN_GRAPHICS_TTF "TTF" +#define JIN_GRAPHICS_TEXTUREFONT "TextureFont" +#define JIN_GRAPHICS_PAGE "Page" +#define JIN_GRAPHICS_BITMAP "Bitmap" + +// audio module +#define JIN_AUDIO_SOURCE "Source" + +// thread module +#define JIN_THREAD_THREAD "Thread" + +// network module +#define JIN_NETWORK_SOCKET "Socket" +#define JIN_NETWORK_BUFFER "Buffer" #endif
\ No newline at end of file |