/* This file is part of RetroFE. * * RetroFE is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * RetroFE is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with RetroFE. If not, see . */ #include "RetroFE.h" #include "StateMachine.h" #include "Utility/Log.h" #include "Utility/Utils.h" #include "SDL.h" #include "Graphics/Component/Image.h" #include "Graphics/Component/Component.h" #include "Lua/LuaDisplay.h" #include "Lua/LuaImage.h" #include "Lua/LuaLog.h" #include "Lua/LuaEvent.h" #include #ifdef __linux #include #include #include #include #endif #ifdef WIN32 #include #include #include #endif static int lua_registerOnInit(lua_State *l) { // std::string function = lua_tostring(l, 1); // events.registerOnInit(function); return 0; } const luaL_Reg RetroFE::luaImageFuncs[] = { // Creation {"create", LuaImage::create}, {"loadFile", LuaImage::loadFile}, {"getOriginalWidth", LuaImage::getOriginalWidth}, {"getOriginalHeight", LuaImage::getOriginalHeight}, {"getOriginalDimensions", LuaImage::getOriginalDimensions}, {"getX", LuaImage::getX}, {"getY", LuaImage::getY}, {"getPosition", LuaImage::getPosition}, {"getWidth", LuaImage::getWidth}, {"getHeight", LuaImage::getHeight}, {"getDimensions", LuaImage::getDimensions}, {"getRotate", LuaImage::getRotate}, {"getAlpha", LuaImage::getAlpha}, {"setX", LuaImage::setX}, {"setY", LuaImage::setY}, {"setPosition", LuaImage::setPosition}, {"setWidth", LuaImage::setWidth}, {"setHeight", LuaImage::setHeight}, {"setDimensions", LuaImage::setDimensions}, {"setRotate", LuaImage::setRotate}, {"setAlpha", LuaImage::setAlpha}, {"addAnimation", LuaImage::addAnimation}, {"animate", LuaImage::animate}, {"destroy", LuaImage::destroy}, {NULL, NULL} }; const luaL_Reg RetroFE::luaDisplayFuncs[] = { {"getCenter", LuaDisplay::getCenter}, {"getDimensions", LuaDisplay::getDimensions}, {NULL, NULL} }; const luaL_Reg RetroFE::luaLogFuncs[] = { {"debug", LuaLog::debug}, {"info", LuaLog::info}, {"notice", LuaLog::notice}, {"warning", LuaLog::warning}, {"error", LuaLog::error}, {NULL, NULL} }; void RetroFE::initializeLua() { lua_.initialize(); LuaImage::initialize(factory_); lua_newtable(lua_.state); luaL_setfuncs (lua_.state, luaDisplayFuncs, 0); lua_pushvalue(lua_.state, -1); lua_setglobal(lua_.state, "display"); lua_newtable(lua_.state); luaL_setfuncs (lua_.state, luaImageFuncs, 0); lua_pushvalue(lua_.state, -1); lua_setglobal(lua_.state, "image"); lua_newtable(lua_.state); luaL_setfuncs (lua_.state, luaLogFuncs, 0); lua_pushvalue(lua_.state, -1); lua_setglobal(lua_.state, "log"); } void RetroFE::reloadLuaScripts() { std::string path = config_.absolutePath + "/layouts/LUATest/Page.lua"; luaL_loadfile(lua_.state, path.c_str()); lua_pcall(lua_.state, 0, LUA_MULTRET, 0); luaEvent_.registerCallback("onInitEnter", "onInitEnter", "onInitEnterComplete"); luaEvent_.registerCallback("onInitExit", "onInitExit", "onInitExitComplete"); } RetroFE::RetroFE(Configuration &c) : config_(c) { } RetroFE::~RetroFE() { } void RetroFE::run() { if(!SDL::initialize(config_)) return; initializeLua(); StateMachine state(lua_.state, &luaEvent_); reloadLuaScripts(); // events.triggerOnInit(lua_.state); bool quit = false; double currentTime = 0; double lastTime = 0; double deltaTime = 0; while(!quit) { lastTime = currentTime; currentTime = static_cast(SDL_GetTicks()) / 1000; if(lastTime == 0) { lastTime = currentTime; } if (currentTime < lastTime) { currentTime = lastTime; } deltaTime = currentTime - lastTime; state.update((float)deltaTime); SDL_LockMutex(SDL::getMutex()); SDL_SetRenderDrawColor(SDL::getRenderer(), 0x0, 0x0, 0x00, 0xFF); SDL_RenderClear(SDL::getRenderer()); for(std::map::iterator it = factory_.components.begin(); it != factory_.components.end(); it++) { it->second->update((float)deltaTime); } for(std::map::iterator it = factory_.components.begin(); it != factory_.components.end(); it++) { it->second->draw(); } SDL_RenderPresent(SDL::getRenderer()); SDL_UnlockMutex(SDL::getMutex()); double sleepTime = 1000.0/60.0 - deltaTime*1000; if(sleepTime > 0) { SDL_Delay(static_cast(sleepTime)); } } }