parent
f16fe763a3
commit
db78366131
|
@ -206,7 +206,6 @@ private:
|
|||
static void audioCallback(void* data, Uint8* stream, int len);
|
||||
static void micCallback(void* data, Uint8* stream, int len);
|
||||
|
||||
|
||||
void onKeyPress(QKeyEvent* event);
|
||||
void onKeyRelease(QKeyEvent* event);
|
||||
void keyReleaseAll();
|
||||
|
|
|
@ -71,9 +71,8 @@ void EmuInstance::inputInit()
|
|||
hotkeyMask = 0;
|
||||
lastHotkeyMask = 0;
|
||||
|
||||
for (int i=0;i<256;i++){
|
||||
for (int i=0;i<256;i++)
|
||||
KeyboardMask[i]=false;
|
||||
}
|
||||
|
||||
joystick = nullptr;
|
||||
controller = nullptr;
|
||||
|
@ -224,7 +223,7 @@ void EmuInstance::onKeyPress(QKeyEvent* event)
|
|||
{
|
||||
if (event->key()<256)
|
||||
KeyboardMask[event->key()]=true;
|
||||
if ((event->key()&0x01000000)>0 && (event->key()&0xff)<0x41) //special keys (there is probably a less messy way to write this...)
|
||||
if ((event->key()&(1<<24))!=0 && (event->key()&0xff)<'A') //Special Keys
|
||||
KeyboardMask[0xff - (event->key()&0xff)]=true;
|
||||
|
||||
int keyHK = getEventKeyVal(event);
|
||||
|
@ -246,7 +245,7 @@ void EmuInstance::onKeyRelease(QKeyEvent* event)
|
|||
{
|
||||
if (event->key()<256)
|
||||
KeyboardMask[event->key()]=false;
|
||||
if ((event->key()&0x01000000)>0 && (event->key()&0xff)<0x41)//special keys
|
||||
if ((event->key()&(1<<24))!=0 && (event->key()&0xff)<'A')//Special keys
|
||||
KeyboardMask[0xff - (event->key()&0xff)]=false;
|
||||
|
||||
int keyHK = getEventKeyVal(event);
|
||||
|
|
|
@ -442,10 +442,9 @@ void EmuThread::run()
|
|||
|
||||
handleMessages();
|
||||
|
||||
|
||||
LuaConsoleDialog* dialog = emuInstance->getMainWindow()->getLuaDialog();
|
||||
//Lua Script Stuff (-for now happens at the end of each frame regardless of emuStatus)
|
||||
if(dialog!=nullptr)
|
||||
if (dialog!=nullptr)
|
||||
{
|
||||
LuaBundle* lua = dialog->getLuaBundle();
|
||||
lua->createLuaState();//Create LuaState if needed
|
||||
|
|
|
@ -46,9 +46,9 @@ public slots:
|
|||
//Based on ScreenLayout::GetScreenTransforms
|
||||
enum LuaCanvasTarget
|
||||
{
|
||||
TopScreen = 0,
|
||||
BottomScreen = 1,
|
||||
OSD = 2 //Used for drawing to OSD / non-screen target
|
||||
canvasTarget_TopScreen = 0,
|
||||
canvasTarget_BottomScreen = 1,
|
||||
canvasTarget_OSD = 2 //Used for drawing to OSD / non-screen target
|
||||
};
|
||||
|
||||
struct OverlayCanvas
|
||||
|
@ -58,11 +58,11 @@ struct OverlayCanvas
|
|||
QImage* buffer1;
|
||||
QImage* buffer2;
|
||||
QRect rectangle;
|
||||
LuaCanvasTarget target = OSD;
|
||||
LuaCanvasTarget target = canvasTarget_OSD;
|
||||
bool isActive = true; // only active overlays are drawn
|
||||
unsigned int GLTexture; // used by GL rendering
|
||||
bool GLTextureLoaded;
|
||||
OverlayCanvas(int x, int y,int w, int h, LuaCanvasTarget target = LuaCanvasTarget::OSD);
|
||||
OverlayCanvas(int x, int y,int w, int h, LuaCanvasTarget target = LuaCanvasTarget::canvasTarget_OSD);
|
||||
void flip();//used to swap buffers / update canvas
|
||||
bool flipped; //used to signal update to graphics.
|
||||
};
|
||||
|
|
|
@ -66,42 +66,44 @@ void main()
|
|||
//Fragment Shader for overlay copied from melonPrimeDS project.
|
||||
const char* kScreenFS_overlay = R"(#version 140
|
||||
|
||||
uniform sampler2D OverlayTex;
|
||||
uniform sampler2D OverlayTex;
|
||||
|
||||
smooth in vec2 fTexcoord;
|
||||
smooth in vec2 fTexcoord;
|
||||
|
||||
uniform vec2 uOverlayPos;
|
||||
uniform vec2 uOverlaySize;
|
||||
uniform int uOverlayScreenType;
|
||||
uniform vec2 uOverlayPos;
|
||||
uniform vec2 uOverlaySize;
|
||||
uniform int uOverlayScreenType;
|
||||
|
||||
out vec4 oColor;
|
||||
out vec4 oColor;
|
||||
|
||||
void main()
|
||||
void main()
|
||||
{
|
||||
const vec2 dsSize = vec2(256.0, 193.0); // +1 on y for pixel gap
|
||||
|
||||
vec2 uv = fTexcoord * vec2(1.0, 2.0);
|
||||
|
||||
if (uOverlayScreenType < 1)
|
||||
{
|
||||
const vec2 dsSize = vec2(256.0, 193.0); // +1 on y for pixel gap
|
||||
|
||||
vec2 uv = fTexcoord * vec2(1.0, 2.0);
|
||||
|
||||
if (uOverlayScreenType < 1) {
|
||||
// top screen
|
||||
uv -= uOverlayPos / dsSize;
|
||||
uv *= dsSize / uOverlaySize;
|
||||
} else {
|
||||
// bottom screen
|
||||
uv -= vec2(0.0, 1.0);
|
||||
uv -= (uOverlayPos + vec2(0.0, 1.0)) / dsSize;
|
||||
uv *= dsSize / uOverlaySize;
|
||||
}
|
||||
|
||||
vec4 pixel = texture(OverlayTex, uv);
|
||||
pixel.rgb *= pixel.a;
|
||||
|
||||
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
|
||||
oColor = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
} else {
|
||||
oColor = pixel.bgra;
|
||||
}
|
||||
// top screen
|
||||
uv -= uOverlayPos / dsSize;
|
||||
uv *= dsSize / uOverlaySize;
|
||||
} else {
|
||||
// bottom screen
|
||||
uv -= vec2(0.0, 1.0);
|
||||
uv -= (uOverlayPos + vec2(0.0, 1.0)) / dsSize;
|
||||
uv *= dsSize / uOverlaySize;
|
||||
}
|
||||
|
||||
vec4 pixel = texture(OverlayTex, uv);
|
||||
pixel.rgb *= pixel.a;
|
||||
|
||||
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0)
|
||||
{
|
||||
oColor = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
} else {
|
||||
oColor = pixel.bgra;
|
||||
}
|
||||
}
|
||||
)";
|
||||
|
||||
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
#include "font.h"
|
||||
#include "LuaMain.h"
|
||||
|
||||
|
||||
using namespace melonDS;
|
||||
|
||||
|
||||
|
@ -679,6 +678,7 @@ void ScreenPanelNative::drawOverlays(QPainter* painter,int type)
|
|||
if (!dialog)
|
||||
return;
|
||||
LuaBundle* lua = dialog->getLuaBundle();
|
||||
|
||||
for (auto lo = lua->overlays->begin(); lo != lua->overlays->end();)
|
||||
{
|
||||
OverlayCanvas& overlay = *lo;
|
||||
|
@ -736,7 +736,7 @@ void ScreenPanelNative::paintEvent(QPaintEvent* event)
|
|||
|
||||
painter.resetTransform();
|
||||
|
||||
drawOverlays(&painter,LuaCanvasTarget::OSD);
|
||||
drawOverlays(&painter,canvasTarget_OSD);
|
||||
|
||||
for (auto it = osdItems.begin(); it != osdItems.end(); )
|
||||
{
|
||||
|
@ -904,7 +904,7 @@ void ScreenPanelGL::initOpenGL()
|
|||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)(0));
|
||||
|
||||
transferLayout();
|
||||
//TODO: Lookinto seeing if we can just re-use screen shader for this...
|
||||
|
||||
OpenGL::CompileVertexFragmentProgram(overlayShader,
|
||||
kScreenVS,kScreenFS_overlay,
|
||||
"OverlayShader",
|
||||
|
@ -915,7 +915,6 @@ void ScreenPanelGL::initOpenGL()
|
|||
|
||||
overlayScreenSizeULoc = glGetUniformLocation(overlayShader, "uScreenSize");
|
||||
overlayTransformULoc = glGetUniformLocation(overlayShader, "uTransform");
|
||||
|
||||
overlayPosULoc = glGetUniformLocation(overlayShader, "uOverlayPos");
|
||||
overlaySizeULoc = glGetUniformLocation(overlayShader, "uOverlaySize");
|
||||
overlayScreenTypeULoc = glGetUniformLocation(overlayShader, "uOverlayScreenType");
|
||||
|
@ -946,20 +945,19 @@ void ScreenPanelGL::deinitOpenGL()
|
|||
|
||||
glDeleteProgram(overlayShader);
|
||||
|
||||
//Double Check that this actually works lol...
|
||||
std::vector<OverlayCanvas>* overlays=nullptr;
|
||||
if (mainWindow->getLuaDialog())
|
||||
overlays = mainWindow->getLuaDialog()->getLuaBundle()->overlays;
|
||||
for (auto lo = overlays->begin(); lo != overlays->end();)
|
||||
{
|
||||
OverlayCanvas& overlay = *lo;
|
||||
lo++;
|
||||
if (!overlay.GLTextureLoaded)
|
||||
continue;
|
||||
glDeleteTextures(1,&overlay.GLTexture);
|
||||
overlay.GLTextureLoaded=false;
|
||||
std::vector<OverlayCanvas>* overlays = mainWindow->getLuaDialog()->getLuaBundle()->overlays;
|
||||
for (auto lo = overlays->begin(); lo != overlays->end();)
|
||||
{
|
||||
OverlayCanvas& overlay = *lo;
|
||||
lo++;
|
||||
if (!overlay.GLTextureLoaded)
|
||||
continue;
|
||||
glDeleteTextures(1,&overlay.GLTexture);
|
||||
overlay.GLTextureLoaded=false;
|
||||
}
|
||||
}
|
||||
|
||||
glContext->DoneCurrent();
|
||||
|
||||
lastScreenWidth = lastScreenHeight = -1;
|
||||
|
@ -1002,12 +1000,11 @@ void ScreenPanelGL::osdDeleteItem(OSDItem* item)
|
|||
|
||||
void ScreenPanelGL::drawOverlays(int type,int screen)
|
||||
{
|
||||
LuaConsoleDialog* dialog = mainWindow->getLuaDialog();
|
||||
if (!dialog)
|
||||
if (!mainWindow->getLuaDialog())
|
||||
return;
|
||||
LuaBundle* lua = dialog->getLuaBundle();
|
||||
|
||||
for (auto lo = lua->overlays->begin(); lo != lua->overlays->end();)
|
||||
std::vector<OverlayCanvas>* overlays = mainWindow->getLuaDialog()->getLuaBundle()->overlays;
|
||||
for (auto lo = overlays->begin(); lo != overlays->end();)
|
||||
{
|
||||
OverlayCanvas& overlay = *lo;
|
||||
lo++;
|
||||
|
@ -1030,7 +1027,7 @@ void ScreenPanelGL::drawOverlays(int type,int screen)
|
|||
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,overlay.rectangle.width(),overlay.rectangle.height(),GL_RGBA,GL_UNSIGNED_BYTE,overlay.displayBuffer->bits());
|
||||
overlay.flipped = false;
|
||||
}
|
||||
if(type == LuaCanvasTarget::OSD) // OSD gets drawn differently then top or bottom screen target
|
||||
if(type == canvasTarget_OSD) // OSD gets drawn differently then top or bottom screen target
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, overlay.GLTexture);
|
||||
glUniform2i(osdPosULoc,overlay.rectangle.left(),overlay.rectangle.top());
|
||||
|
@ -1049,7 +1046,6 @@ void ScreenPanelGL::drawOverlays(int type,int screen)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void ScreenPanelGL::drawScreenGL()
|
||||
{
|
||||
if (!glContext) return;
|
||||
|
@ -1162,7 +1158,7 @@ void ScreenPanelGL::drawScreenGL()
|
|||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
drawOverlays(LuaCanvasTarget::OSD,0);
|
||||
drawOverlays(canvasTarget_OSD,0);
|
||||
|
||||
for (auto it = osdItems.begin(); it != osdItems.end(); )
|
||||
{
|
||||
|
|
|
@ -224,7 +224,6 @@ private:
|
|||
GLuint overlayShader;
|
||||
GLuint overlayScreenSizeULoc, overlayTransformULoc;
|
||||
GLuint overlayPosULoc, overlaySizeULoc, overlayScreenTypeULoc;
|
||||
|
||||
};
|
||||
|
||||
#endif // SCREEN_H
|
||||
|
|
|
@ -410,7 +410,6 @@ MainWindow::MainWindow(int id, EmuInstance* inst, QWidget* parent) :
|
|||
actLuaScript = menu->addAction("Lua Script");
|
||||
connect(actLuaScript,&QAction::triggered,this,&MainWindow::onOpenLuaScript);
|
||||
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
actEnableCheats = menu->addAction("Enable cheats");
|
||||
|
@ -1681,7 +1680,7 @@ void MainWindow::onOpenPowerManagement()
|
|||
|
||||
void MainWindow::onOpenLuaScript()
|
||||
{
|
||||
if (this->luaDialog) // only one at a time.
|
||||
if (this->luaDialog)
|
||||
return;
|
||||
this->luaDialog = new LuaConsoleDialog(this);
|
||||
this->luaDialog->show();
|
||||
|
|
Loading…
Reference in New Issue