Cleaned up game viewer GL.

This commit is contained in:
mjbudd77 2020-06-30 19:53:29 -04:00
parent e2b853661d
commit 2762d53791
3 changed files with 47 additions and 256 deletions

View File

@ -5,6 +5,9 @@
#include <string.h>
#include <math.h>
#include <QApplication>
#include <QScreen>
#include "Qt/gl_win.h"
#include "Qt/GameViewerGL.h"
@ -17,11 +20,16 @@ gameViewGL_t::gameViewGL_t(QWidget *parent)
view_width = 0;
view_height = 0;
gltexture = 0;
use_sw_pix_remap = 0;
remap_pixBuf = NULL;
remap_pixPtr = NULL;
devPixRatio = 1.0f;
devPixRatio = 1.0f;
linearFilter = false;
QScreen *screen = QGuiApplication::primaryScreen();
if ( screen != NULL )
{
devPixRatio = screen->devicePixelRatio();
//printf("Ratio: %f \n", screen->devicePixelRatio() );
}
}
gameViewGL_t::~gameViewGL_t(void)
@ -33,34 +41,21 @@ gameViewGL_t::~gameViewGL_t(void)
// Free GL texture
if (gltexture)
{
printf("Destroying GLX Texture\n");
//printf("Destroying GL Texture\n");
glDeleteTextures(1, &gltexture);
gltexture=0;
}
doneCurrent();
if ( remap_pixBuf )
{
::free( remap_pixBuf ); remap_pixBuf = NULL;
}
if ( remap_pixPtr )
{
::free( remap_pixPtr ); remap_pixPtr = NULL;
}
}
int gameViewGL_t::init( double devPixRatioInput )
int gameViewGL_t::init( void )
{
devPixRatio = devPixRatioInput;
return 0;
}
void gameViewGL_t::buildTextures(void)
{
int ipolate = 0;
//glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_RECTANGLE);
if ( gltexture )
@ -69,71 +64,18 @@ void gameViewGL_t::buildTextures(void)
gltexture=0;
}
glGenTextures(1, &gltexture);
printf("Linear Interpolation on GL Texture: %s \n", ipolate ? "Enabled" : "Disabled");
glGenTextures(1, &gltexture);
//printf("Linear Interpolation on GL Texture: %s \n", linearFilter ? "Enabled" : "Disabled");
//glBindTexture(GL_TEXTURE_2D, gltexture);
glBindTexture( GL_TEXTURE_RECTANGLE, gltexture);
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,ipolate?GL_LINEAR:GL_NEAREST);
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,ipolate?GL_LINEAR:GL_NEAREST);
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri( GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, linearFilter ? GL_LINEAR : GL_NEAREST );
glTexParameteri( GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, linearFilter ? GL_LINEAR : GL_NEAREST );
glTexParameteri( GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glBindTexture(GL_TEXTURE_RECTANGLE, gltexture);
glTexParameteri(GL_TEXTURE_RECTANGLE,GL_TEXTURE_MAG_FILTER,ipolate?GL_LINEAR:GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE,GL_TEXTURE_MIN_FILTER,ipolate?GL_LINEAR:GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
if ( remap_pixBuf )
{
::free( remap_pixBuf ); remap_pixBuf = NULL;
}
if ( remap_pixPtr )
{
::free( remap_pixPtr ); remap_pixPtr = NULL;
}
if ( use_sw_pix_remap )
{
texture_width = view_width;
texture_height = view_height;
}
else
{
texture_width = GL_NES_WIDTH;
texture_height = GL_NES_HEIGHT;
}
if ( texture_width < GL_NES_WIDTH )
{
texture_width = GL_NES_WIDTH;
}
if ( texture_height < GL_NES_HEIGHT )
{
texture_height = GL_NES_HEIGHT;
}
if ( use_sw_pix_remap )
{
remap_pixBuf = (uint32_t*)malloc( texture_width * texture_height * sizeof(uint32_t) );
if ( remap_pixBuf )
{
memset( remap_pixBuf, 0, texture_width * texture_height * sizeof(uint32_t) );
}
remap_pixPtr = (uint32_t**)malloc( texture_width * texture_height * sizeof(uintptr_t) );
if ( remap_pixPtr )
{
memset( remap_pixPtr, 0, texture_width * texture_height * sizeof(uintptr_t) );
}
calcPixRemap();
}
glTexImage2D(GL_TEXTURE_RECTANGLE, 0,
GL_RGBA8, texture_width, texture_height, 0,
glTexImage2D( GL_TEXTURE_RECTANGLE, 0,
GL_RGBA8, GL_NES_WIDTH, GL_NES_HEIGHT, 0,
GL_BGRA, GL_UNSIGNED_BYTE, 0 );
}
@ -146,7 +88,7 @@ void gameViewGL_t::initializeGL(void)
//QOpenGLFunctions *gl = QOpenGLContext::currentContext()->functions();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
printf("GL Init!\n");
//printf("GL Init!\n");
buildTextures();
}
@ -155,7 +97,7 @@ void gameViewGL_t::resizeGL(int w, int h)
{
w = (int)( devPixRatio * w );
h = (int)( devPixRatio * h );
printf("GL Resize: %i x %i \n", w, h );
//printf("GL Resize: %i x %i \n", w, h );
glViewport(0, 0, w, h);
view_width = w;
@ -169,6 +111,8 @@ void gameViewGL_t::resizeGL(int w, int h)
void gameViewGL_t::paintGL(void)
{
int texture_width = gl_shm->ncol;
int texture_height = gl_shm->nrow;
int l=0, r=texture_width;
int t=0, b=texture_height;
@ -189,59 +133,34 @@ void gameViewGL_t::paintGL(void)
int sy=(view_height-rh)/2;
glViewport(sx, sy, rw, rh);
//glViewport( 0, 0, screen_width, screen_height);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
//glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glOrtho( 0.0, rw, 0.0, rh, -1.0, 1.0);
glDisable(GL_DEPTH_TEST);
glClearColor( 0.0, 0.0f, 0.0f, 0.0f); // Background color to black.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glEnable(GL_LINE_SMOOTH);
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_RECTANGLE);
//glBindTexture(GL_TEXTURE_2D, gltexture);
glBindTexture(GL_TEXTURE_RECTANGLE, gltexture);
//print_pixbuf();
//glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0,
// GL_RGBA, GL_UNSIGNED_BYTE, gl_shm->pixbuf );
//glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA8, 256, 256, 0,
// GL_BGRA, GL_UNSIGNED_BYTE, gl_shm->pixbuf );
if ( use_sw_pix_remap )
{
doRemap();
glTexSubImage2D(GL_TEXTURE_RECTANGLE, 0,
0, 0, texture_width, texture_height,
GL_BGRA, GL_UNSIGNED_BYTE, remap_pixBuf );
}
else
{
glTexSubImage2D(GL_TEXTURE_RECTANGLE, 0,
0, 0, texture_width, texture_height,
GL_BGRA, GL_UNSIGNED_BYTE, gl_shm->pixbuf );
}
glTexSubImage2D(GL_TEXTURE_RECTANGLE, 0,
0, 0, GL_NES_WIDTH, GL_NES_HEIGHT,
GL_BGRA, GL_UNSIGNED_BYTE, gl_shm->pixbuf );
glBegin(GL_QUADS);
//glTexCoord2f(1.0f*l/256, 1.0f*b/256); // Bottom left of picture.
//glVertex2f(-1.0f, -1.0f); // Bottom left of target.
glTexCoord2f( l, b); // Bottom left of picture.
glVertex2f( 0.0, 0.0f); // Bottom left of target.
//glTexCoord2f(1.0f*r/256, 1.0f*b/256);// Bottom right of picture.
glTexCoord2f(r, b);// Bottom right of picture.
glVertex2f( rw, 0.0f); // Bottom right of target.
//glTexCoord2f(1.0f*r/256, 1.0f*t/256); // Top right of our picture.
glTexCoord2f(r, t); // Top right of our picture.
glVertex2f( rw, rh); // Top right of target.
//glTexCoord2f(1.0f*l/256, 1.0f*t/256); // Top left of our picture.
glTexCoord2f(l, t); // Top left of our picture.
glVertex2f( 0.0f, rh); // Top left of target.
glEnd();
@ -250,118 +169,4 @@ void gameViewGL_t::paintGL(void)
glDisable(GL_TEXTURE_RECTANGLE);
//printf("Paint GL!\n");
}
void gameViewGL_t::doRemap(void)
{
int x,y,i;
i=0;
for (x=0; x<texture_width; x++)
{
for (y=0; y<texture_height; y++)
{
if ( remap_pixPtr[i] == NULL )
{
remap_pixBuf[i] = 0x00000000;
}
else
{
remap_pixBuf[i] = *remap_pixPtr[i];
}
i++;
}
}
}
void gameViewGL_t::calcPixRemap(void)
{
int w, h, s;
int i, j, x, y;
int sw, sh, rx, ry, gw, gh;
int llx, lly, urx, ury;
float sx, sy, nw, nh;
w = view_width;
h = view_height;
s = w * h * 4;
gw = gl_shm->ncol;
gh = gl_shm->nrow;
sx = (float)w / (float)gw;
sy = (float)h / (float)gh;
if (sx < sy )
{
sy = sx;
}
else
{
sx = sy;
}
sw = (int) ( (float)gw * sx );
sh = (int) ( (float)gh * sy );
llx = (w - sw) / 2;
lly = (h - sh) / 2;
urx = llx + sw;
ury = lly + sh;
i=0;
for (y=0; y<h; y++)
{
if ( (y < lly) || (y > ury) )
{
for (x=0; x<w; x++)
{
remap_pixPtr[i] = 0; i++;
}
}
else
{
for (x=0; x<w; x++)
{
if ( (x < llx) || (x > urx) )
{
remap_pixPtr[i] = 0; i++;
}
else
{
nw = (float)(x - llx) / (float)sw;
nh = (float)(y - lly) / (float)sh;
rx = (int)((float)gw * nw);
ry = (int)((float)gh * nh);
if ( rx < 0 )
{
rx = 0;
}
else if ( rx >= GL_NES_WIDTH )
{
rx = GL_NES_WIDTH-1;
}
if ( ry < 0 )
{
ry = 0;
}
else if ( ry >= GL_NES_HEIGHT )
{
ry = GL_NES_HEIGHT-1;
}
j = (ry * GL_NES_WIDTH) + rx;
remap_pixPtr[i] = &gl_shm->pixbuf[j]; i++;
//printf("Remap: (%i,%i)=%i (%i,%i)=%i \n", x,y,i, rx,ry,j );
}
}
}
}
//numRendLines = gh;
}
}

View File

@ -14,26 +14,22 @@ class gameViewGL_t : public QOpenGLWidget, protected QOpenGLFunctions
gameViewGL_t(QWidget *parent = 0);
~gameViewGL_t(void);
int init( double devPixRatio = 1.0f );
int init( void );
protected:
void initializeGL(void);
void resizeGL(int w, int h);
void paintGL(void);
void resizeGL(int w, int h);
void paintGL(void);
void buildTextures(void);
void calcPixRemap(void);
void doRemap(void);
void buildTextures(void);
void calcPixRemap(void);
void doRemap(void);
double devPixRatio;
int texture_width;
int texture_height;
int view_width;
int view_height;
GLuint gltexture;
bool use_sw_pix_remap;
uint32_t *remap_pixBuf;
uint32_t **remap_pixPtr;
double devPixRatio;
int view_width;
int view_height;
GLuint gltexture;
bool linearFilter;
private slots:
};

View File

@ -1,29 +1,19 @@
#include <QApplication>
#include <QScreen>
#include "Qt/GameApp.h"
#include "Qt/fceuWrapper.h"
int main( int argc, char *argv[] )
{
double devPixRatio = 1.0;
QApplication app(argc, argv);
QApplication app(argc, argv);
gameWin_t win;
QScreen *screen = QGuiApplication::primaryScreen();
fceuWrapperInit( argc, argv );
if ( screen != NULL )
{
devPixRatio = screen->devicePixelRatio();
printf("Ratio: %f \n", screen->devicePixelRatio() );
}
win.resize( 512, 512 );
win.show();
fceuWrapperInit( argc, argv );
win.resize( 512, 512 );
win.show();
win.viewport->init( devPixRatio );
win.viewport->init();
return app.exec();
}