Clean LuaMain

Round 1-2 of code clean up
This commit is contained in:
NPO 2024-10-23 13:14:49 -04:00
parent cc8b7f0083
commit c1921f9a2e
2 changed files with 29 additions and 26 deletions

View File

@ -54,8 +54,7 @@ LuaConsoleDialog::LuaConsoleDialog(QWidget* parent) : QDialog(parent)
{ {
QWidget* w = parent; QWidget* w = parent;
MainWindow* mainWindow; MainWindow* mainWindow;
//Yoinked from ScreenPanel in Screen.cpp for (;;) //copied from ScreenPanel in Screen.cpp
for (;;)
{ {
mainWindow = qobject_cast<MainWindow*>(w); mainWindow = qobject_cast<MainWindow*>(w);
if (mainWindow) break; if (mainWindow) break;
@ -90,8 +89,7 @@ void LuaConsoleDialog::closeEvent(QCloseEvent *event)
void LuaConsoleDialog::onOpenScript() void LuaConsoleDialog::onOpenScript()
{ {
QFileInfo file = QFileInfo(QFileDialog::getOpenFileName(this, "Load Lua Script",QDir::currentPath())); QFileInfo file = QFileInfo(QFileDialog::getOpenFileName(this, "Load Lua Script",QDir::currentPath()));
if (!file.exists()) if (!file.exists()) return;
return;
currentScript = file; currentScript = file;
bundle->flagNewLua = true; bundle->flagNewLua = true;
} }
@ -113,7 +111,6 @@ void LuaConsole::onClear()
this->clear(); this->clear();
} }
LuaFunction::LuaFunction(luaFunctionPointer cf,const char* n,std::vector<LuaFunction*>* container) LuaFunction::LuaFunction(luaFunctionPointer cf,const char* n,std::vector<LuaFunction*>* container)
{ {
this->cfunction = cf; this->cfunction = cf;
@ -123,7 +120,8 @@ LuaFunction::LuaFunction(luaFunctionPointer cf,const char* n,std::vector<LuaFunc
static_assert(sizeof(LuaBundle*) <= LUA_EXTRASPACE,"LUA_EXTRASPACE too small"); static_assert(sizeof(LuaBundle*) <= LUA_EXTRASPACE,"LUA_EXTRASPACE too small");
LuaBundle* get_bundle(lua_State * L) { LuaBundle* get_bundle(lua_State * L)
{
LuaBundle* pBundle; LuaBundle* pBundle;
std::memcpy(&pBundle, lua_getextraspace(L), sizeof(LuaBundle*)); std::memcpy(&pBundle, lua_getextraspace(L), sizeof(LuaBundle*));
return pBundle; return pBundle;
@ -133,28 +131,25 @@ LuaBundle* get_bundle(lua_State * L) {
void luaHookFunction(lua_State* L, lua_Debug *arg) void luaHookFunction(lua_State* L, lua_Debug *arg)
{ {
LuaBundle* bundle = get_bundle(L); LuaBundle* bundle = get_bundle(L);
if(bundle->flagStop and (arg->event == LUA_HOOKCOUNT)) if (bundle->flagStop and (arg->event == LUA_HOOKCOUNT))
luaL_error(L, "Force Stopped"); luaL_error(L, "Force Stopped");
} }
std::vector<LuaFunction*> definedLuaFunctions;//List of all defined lua functions std::vector<LuaFunction*> definedLuaFunctions;//List of all defined lua functions
void LuaBundle::createLuaState() void LuaBundle::createLuaState()
{ {
if(!flagNewLua) if (!flagNewLua) return;
return;
overlays->clear(); overlays->clear();
flagNewLua = false; flagNewLua = false;
luaState = nullptr; luaState = nullptr;
QString qfilename = luaDialog->currentScript.fileName();
std::string fileName = luaDialog->currentScript.fileName().toStdString(); std::string fileName = luaDialog->currentScript.fileName().toStdString();
std::string filedir = luaDialog->currentScript.dir().path().toStdString(); std::string filedir = luaDialog->currentScript.dir().path().toStdString();
lua_State* L = luaL_newstate(); lua_State* L = luaL_newstate();
LuaBundle* pBundle = this; LuaBundle* pBundle = this;
std::memcpy(lua_getextraspace(L), &pBundle, sizeof(LuaBundle*)); //Write a pointer to this LuaBundle into the extra space of the new lua_State std::memcpy(lua_getextraspace(L), &pBundle, sizeof(LuaBundle*)); //Write a pointer to this LuaBundle into the extra space of the new lua_State
luaL_openlibs(L); luaL_openlibs(L);
for(LuaFunction* function : definedLuaFunctions) for (LuaFunction* function : definedLuaFunctions)
lua_register(L,function->name,function->cfunction); lua_register(L,function->name,function->cfunction);
std::filesystem::current_path(filedir.c_str()); std::filesystem::current_path(filedir.c_str());
lua_sethook(L,&luaHookFunction,LUA_MASKCOUNT,MELON_LUA_HOOK_INSTRUCTION_COUNT); lua_sethook(L,&luaHookFunction,LUA_MASKCOUNT,MELON_LUA_HOOK_INSTRUCTION_COUNT);
@ -170,8 +165,7 @@ void LuaBundle::createLuaState()
void LuaConsoleDialog::onStop() void LuaConsoleDialog::onStop()
{ {
lua_State* L = bundle->getLuaState(); if (bundle->getLuaState())
if(L)
bundle->flagStop = true; bundle->flagStop = true;
} }
@ -183,15 +177,14 @@ void LuaConsoleDialog::onPausePlay()
//Gets Called once a frame //Gets Called once a frame
void LuaBundle::luaUpdate() void LuaBundle::luaUpdate()
{ {
if(!luaState || flagPause) if (!luaState || flagPause) return;
return;
if (lua_getglobal(luaState,"_Update")!=LUA_TFUNCTION) if (lua_getglobal(luaState,"_Update")!=LUA_TFUNCTION)
{ {
emuThread->onLuaPrint("No \"_Update\" Function found, pausing script..."); emuThread->onLuaPrint("No \"_Update\" Function found, pausing script...");
flagPause = true; flagPause = true;
return; return;
} }
if(lua_pcall(luaState,0,0,0)!=0) if (lua_pcall(luaState,0,0,0)!=0)
{ {
//Handel Errors //Handel Errors
emuThread->onLuaPrint(lua_tostring(luaState,-1)); emuThread->onLuaPrint(lua_tostring(luaState,-1));
@ -238,6 +231,7 @@ void LuaBundle::luaResetOSD()
} }
} }
//TODO: Organize lua functions into different named tables similar to bizhawk.
/*-------------------------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------------------------
Start of lua function definitions Start of lua function definitions
--------------------------------------------------------------------------------------------------*/ --------------------------------------------------------------------------------------------------*/
@ -417,7 +411,7 @@ int Lua_getMouse(lua_State* L)
lua_setfield(L, -2, "X"); lua_setfield(L, -2, "X");
lua_pushinteger(L, pos.y()); lua_pushinteger(L, pos.y());
lua_setfield(L, -2, "Y"); lua_setfield(L, -2, "Y");
for(int i=0;i<6;i++) for (int i=0;i<6;i++)
{ {
lua_pushboolean(L,vals[i]); lua_pushboolean(L,vals[i]);
lua_setfield(L,-2,keys[i]); lua_setfield(L,-2,keys[i]);
@ -429,13 +423,13 @@ AddLuaFunction(Lua_getMouse,GetMouse);
int Lua_KeyboardMask(lua_State* L) int Lua_KeyboardMask(lua_State* L)
{ {
LuaBundle* bundle = get_bundle(L); LuaBundle* bundle = get_bundle(L);
lua_createtable(L,0,256); lua_createtable(L,0,256);
for (int i=0;i<256;i++){ for (int i=0;i<256;i++)
{
lua_pushboolean(L,bundle->getEmuInstance()->KeyboardMask[i]); lua_pushboolean(L,bundle->getEmuInstance()->KeyboardMask[i]);
lua_seti(L,-2,i); lua_seti(L,-2,i);
} }
return 1; return 1;//returns table of 256 booleans describing the current state of the keyboard.
} }
AddLuaFunction(Lua_KeyboardMask,KeyboardMask); AddLuaFunction(Lua_KeyboardMask,KeyboardMask);
@ -444,7 +438,7 @@ AddLuaFunction(Lua_KeyboardMask,KeyboardMask);
--------------------------------------------------------------------------------------------------*/ --------------------------------------------------------------------------------------------------*/
//TODO: Lua Colors //TODO: Lua Colors
//MakeCanvas(int x,int y,int width,int height,[int target,topScreen=0,bottomScreen=1,OSD(default)>=2)],[bool active = true]) //MakeCanvas(int x,int y,int width,int height,[int target,topScreen=0,bottomScreen=1,OSD(default)>=2)],[bool active = true])
int Lua_MakeCanvas(lua_State* L) int Lua_MakeCanvas(lua_State* L)
{ {
LuaBundle* bundle = get_bundle(L); LuaBundle* bundle = get_bundle(L);
@ -467,6 +461,7 @@ int Lua_SetCanvas(lua_State* L) //SetCanvas(int index)
{ {
LuaBundle* bundle = get_bundle(L); LuaBundle* bundle = get_bundle(L);
int index = luaL_checknumber(L,1); int index = luaL_checknumber(L,1);
bundle->luaCanvas = &bundle->overlays->at(index); bundle->luaCanvas = &bundle->overlays->at(index);
return 0; return 0;
} }
@ -497,6 +492,7 @@ int Lua_text(lua_State* L)
melonDS::u32 color = luaL_optnumber(L,4,0x00000000); melonDS::u32 color = luaL_optnumber(L,4,0x00000000);
const char* FontFamily = luaL_optlstring(L,6,"Helvetica",NULL); const char* FontFamily = luaL_optlstring(L,6,"Helvetica",NULL);
int size = luaL_optnumber(L,5,9); int size = luaL_optnumber(L,5,9);
QPainter painter(bundle->luaCanvas->imageBuffer); QPainter painter(bundle->luaCanvas->imageBuffer);
QFont font(FontFamily,size,0,false); QFont font(FontFamily,size,0,false);
//font.setStyleStrategy(QFont::NoAntialias); //font.setStyleStrategy(QFont::NoAntialias);
@ -516,6 +512,7 @@ int Lua_line(lua_State* L)
int x2 = luaL_checknumber(L,3); int x2 = luaL_checknumber(L,3);
int y2 = luaL_checknumber(L,4); int y2 = luaL_checknumber(L,4);
melonDS::u32 color = luaL_checknumber(L,5); melonDS::u32 color = luaL_checknumber(L,5);
QPainter painter(bundle->luaCanvas->imageBuffer); QPainter painter(bundle->luaCanvas->imageBuffer);
painter.setPen(color); painter.setPen(color);
painter.drawLine(x1,y1,x2,y2); painter.drawLine(x1,y1,x2,y2);
@ -531,6 +528,7 @@ int Lua_rect(lua_State* L)
int y = luaL_checknumber(L,2); int y = luaL_checknumber(L,2);
int width = luaL_checknumber(L,3); int width = luaL_checknumber(L,3);
int height = luaL_checknumber(L,4); int height = luaL_checknumber(L,4);
QPainter painter(bundle->luaCanvas->imageBuffer); QPainter painter(bundle->luaCanvas->imageBuffer);
painter.setPen(color); painter.setPen(color);
painter.drawRect(x,y,width,height); painter.drawRect(x,y,width,height);
@ -546,6 +544,7 @@ int Lua_fillrect(lua_State* L)
int y = luaL_checknumber(L,2); int y = luaL_checknumber(L,2);
int width = luaL_checknumber(L,3); int width = luaL_checknumber(L,3);
int height = luaL_checknumber(L,4); int height = luaL_checknumber(L,4);
QPainter painter(bundle->luaCanvas->imageBuffer); QPainter painter(bundle->luaCanvas->imageBuffer);
painter.setPen(color); painter.setPen(color);
painter.fillRect(x,y,width,height,color); painter.fillRect(x,y,width,height,color);
@ -561,6 +560,7 @@ int Lua_Ellipse(lua_State* L)
int y = luaL_checknumber(L,2); int y = luaL_checknumber(L,2);
int width = luaL_checknumber(L,3); int width = luaL_checknumber(L,3);
int height = luaL_checknumber(L,4); int height = luaL_checknumber(L,4);
QPainter painter(bundle->luaCanvas->imageBuffer); QPainter painter(bundle->luaCanvas->imageBuffer);
painter.setPen(color); painter.setPen(color);
painter.drawEllipse(x,y,width,height); painter.drawEllipse(x,y,width,height);
@ -593,9 +593,10 @@ int Lua_drawImage(lua_State* L)
int sy = luaL_optinteger(L,5,0); int sy = luaL_optinteger(L,5,0);
int sw = luaL_optinteger(L,6,-1); int sw = luaL_optinteger(L,6,-1);
int sh = luaL_optinteger(L,7,-1); int sh = luaL_optinteger(L,7,-1);
QPainter painter(bundle->luaCanvas->imageBuffer); QPainter painter(bundle->luaCanvas->imageBuffer);
QImage image; QImage image;
if(bundle->imageHash->contains(path)) if (bundle->imageHash->contains(path))
{ {
image=(*bundle->imageHash)[path]; image=(*bundle->imageHash)[path];
} }
@ -628,7 +629,7 @@ int Lua_getJoy(lua_State* L)
"R","L","X","Y" "R","L","X","Y"
}; };
lua_createtable(L, 0, 12); lua_createtable(L, 0, 12);
for(melonDS::u32 i=0;i<12;i++) for (melonDS::u32 i=0;i<12;i++)
{ {
lua_pushboolean(L,0 >= (buttonMask&(1<<i))); lua_pushboolean(L,0 >= (buttonMask&(1<<i)));
lua_setfield(L,-2,keys[i]); lua_setfield(L,-2,keys[i]);
@ -638,7 +639,9 @@ int Lua_getJoy(lua_State* L)
AddLuaFunction(Lua_getJoy,GetJoy); AddLuaFunction(Lua_getJoy,GetJoy);
/* /*
int Lua_setPadding(lua_State* L) //TODO: Currently only works well with force integer scaling //TODO: Currently only works well with force integer scaling
//TODO: Consider alternative ways to provide extra drawing space for lua scripts?
int Lua_setPadding(lua_State* L)
{ {
LeftPadding = abs(luaL_checkinteger(L,1)); LeftPadding = abs(luaL_checkinteger(L,1));
TopPadding = abs(luaL_checkinteger(L,2)); TopPadding = abs(luaL_checkinteger(L,2));

View File

@ -62,7 +62,7 @@ struct OverlayCanvas
bool isActive = true; // only active overlays are drawn bool isActive = true; // only active overlays are drawn
unsigned int GLTexture; // used by GL rendering unsigned int GLTexture; // used by GL rendering
bool GLTextureLoaded; bool GLTextureLoaded;
OverlayCanvas(int x, int y,int w, int h, LuaCanvasTarget target = LuaCanvasTarget::canvasTarget_OSD); OverlayCanvas(int x, int y,int w, int h, LuaCanvasTarget target = canvasTarget_OSD);
void flip();//used to swap buffers / update canvas void flip();//used to swap buffers / update canvas
bool flipped; //used to signal update to graphics. bool flipped; //used to signal update to graphics.
}; };