OSDN Git Service

[Draw][Qt][OpenGL] Implement selectable OpenGL render. Works excepts grid line.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 22 Jan 2016 06:32:37 +0000 (15:32 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 22 Jan 2016 06:32:37 +0000 (15:32 +0900)
source/src/qt/common/qt_gldraw.cpp
source/src/qt/common/qt_gldraw.h
source/src/qt/common/qt_glevents.cpp
source/src/qt/common/qt_glutil.cpp
source/src/qt/common/qt_glutil_gl2_0.cpp
source/src/qt/common/qt_glutil_gl3_0.cpp
source/src/qt/gui/menu_main.cpp

index 2cace1f..c02a76b 100644 (file)
@@ -53,8 +53,6 @@ void GLDrawClass::drawGrids(void)
 }
 
 
-#if 0 // v3.0
-#endif
 void GLDrawClass::drawUpdateTexture(bitmap_t *p)
 {
        //p_emu->lock_vm();
@@ -132,8 +130,11 @@ void GLDrawClass::resizeGL(int width, int height)
        double ww, hh;
        if(extfunc != NULL) {
                extfunc->resizeGL(width, height);
+       } else {
+               draw_width = width;
+               draw_height = height;
+               delay_update = true;
        }
-       redraw_required = true;
        //do_set_texture_size(imgptr, screen_texture_width, screen_texture_height);
        AGAR_DebugLog(AGAR_LOG_DEBUG, "ResizeGL: %dx%d", width , height);
        emit sig_resize_uibar(width, height);
@@ -149,15 +150,15 @@ void GLDrawClass::paintGL(void)
        int i;
 
        SaveToPixmap(); // If save requested, then Save to Pixmap.
-#if !defined(USE_MINIMUM_RENDERING)
-       redraw_required = true;
-#endif
-       if(!redraw_required) return;
        if(extfunc != NULL) {
+               if(delay_update) {
+                       extfunc->setVirtualVramSize(vram_width, vram_height);
+                       extfunc->resizeGL(draw_width, draw_height);
+                       delay_update = false;
+               }
                extfunc->paintGL();
        }
        emit sig_draw_timing(false);
-       redraw_required = false;
 }
 
 #ifndef GL_MULTISAMPLE
@@ -173,8 +174,15 @@ GLDrawClass::GLDrawClass(QWidget *parent)
 {
        save_pixmap_req = false;
        enable_mouse = true;
+       p_emu = NULL;
        filename_screen_pixmap.clear();
-       
+       //imgptr = NULL;
+       extfunc = NULL;
+       vram_width = SCREEN_WIDTH;
+       vram_height = SCREEN_HEIGHT;
+       draw_width = SCREEN_WIDTH;
+       draw_height = SCREEN_HEIGHT;
+       delay_update = false;
        this->initKeyCode();
 }
 
index ff66fd0..2b657ab 100644 (file)
@@ -29,14 +29,17 @@ class GLDrawClass: public QGLWidget
 {
        Q_OBJECT
  private:
-       int draw_width;
-       int draw_height;
        EMU *p_emu;
-       QImage *imgptr;
+
        bool enable_mouse;
        GLfloat screen_width, screen_height;
+       int vram_width;
+       int vram_height;
+       int draw_width;
+       int draw_height;
+       
+       bool delay_update;
 
-       bool redraw_required;
  protected:
        struct NativeScanCode NativeScanCode[257];
        struct NativeVirtualKeyCode NativeVirtualKeyCode[257];
index 7fbda05..93a2f0f 100644 (file)
@@ -146,6 +146,8 @@ void GLDrawClass::do_set_screen_multiply(float mul)
 
 void GLDrawClass::do_set_texture_size(QImage *p, int w, int h)
 {
+       vram_width = w;
+       vram_height = h;
        if(extfunc != NULL) extfunc->do_set_texture_size(p, w, h);
 }
 
index 59d170e..c3be0c9 100644 (file)
@@ -25,7 +25,7 @@ void GLDrawClass::update_screen(bitmap_t *p)
        //if(tick < (1000 / 75)) tick = 1000 / 75;
        if(p != NULL) {
                this->makeCurrent();
-               imgptr = &(p->pImage);
+               //imgptr = &(p->pImage);
                drawUpdateTexture(p);
                this->doneCurrent();
                this->update();
@@ -86,6 +86,10 @@ void GLDrawClass::setVirtualVramSize(int width, int height)
 {
        if(extfunc != NULL) {
                extfunc->setVirtualVramSize(width, height);
+       } else {
+               vram_width = width;
+               vram_height = height;
+               delay_update = true;
        }
 }
 
@@ -113,20 +117,24 @@ void GLDrawClass::InitFBO(void)
        int i;
        GLfloat xf, yf, delta;
        QOpenGLContext *glContext = QOpenGLContext::currentContext();
+#if 1
        QOpenGLFunctions_3_0 *funcs_3_0 = glContext->versionFunctions<QOpenGLFunctions_3_0>();
        if((funcs_3_0 != NULL) && (extfunc == NULL)){
                extfunc = new GLDraw_3_0(this);
+               AGAR_DebugLog(AGAR_LOG_DEBUG, "Use OpenGL v3.0");
        }
-       
+#endif
        QOpenGLFunctions_2_0 *funcs_2_0 = glContext->versionFunctions<QOpenGLFunctions_2_0>();
        if((funcs_2_0 != NULL)  && (extfunc == NULL)){
                extfunc = new GLDraw_2_0(this);
+               AGAR_DebugLog(AGAR_LOG_DEBUG, "Use OpenGL v2.0");
        }
        if(extfunc != NULL) {
                extfunc->initGLObjects();
                extfunc->initFBO();
                extfunc->initLocalGLObjects();
        } else {
+               AGAR_DebugLog(AGAR_LOG_DEBUG, "None using OpenGL.");
 //str_gl_version = QString::fromUtf8("None");
        }
 }
index 361b0d0..2120c24 100644 (file)
@@ -36,7 +36,7 @@ GLDraw_2_0::GLDraw_2_0(GLDrawClass *parent, EMU *emu) : QObject(parent)
        screen_texture_height_old = SCREEN_HEIGHT;
        p_emu = emu;
        extfunc = NULL;
-       redraw_required = true;
+       redraw_required = false;
 #ifdef ONE_BOARD_MICRO_COMPUTER
        uBitmapTextureID = 0;
        bitmap_uploaded = false;
@@ -186,17 +186,13 @@ void GLDraw_2_0::initGLObjects()
 {
        extfunc = new QOpenGLFunctions_2_0;
        extfunc->initializeOpenGLFunctions();
+       extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
+       extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
 }      
 
 void GLDraw_2_0::initFBO(void)
 {
-       main_shader = new QOpenGLShaderProgram(p_wid);
-       if(main_shader != NULL) {
-               main_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex_shader.glsl");
-               main_shader->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fragment_shader.glsl");
-               main_shader->link();
-       }
-       
+
        grids_shader_horizonal = new QOpenGLShaderProgram(p_wid);
 #if defined(USE_SCREEN_ROTATE)   
        if(grids_shader_horizonal != NULL) {
@@ -241,6 +237,7 @@ void GLDraw_2_0::initFBO(void)
                }
        }
 # endif
+       
        glHorizGrids = (GLfloat *)malloc(sizeof(float) * (SCREEN_HEIGHT + 2) * 6);
        if(glHorizGrids != NULL) {
                buffer_grid_horizonal = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
@@ -259,7 +256,7 @@ void GLDraw_2_0::initFBO(void)
                                vertex_grid_horizonal->release();
                
                        }
-                       //doSetGridsHorizonal(SCREEN_HEIGHT, true);
+                       doSetGridsHorizonal(SCREEN_HEIGHT, true);
                }
        }
        glVertGrids  = (GLfloat *)malloc(sizeof(float) * (SCREEN_WIDTH + 2) * 6);
@@ -274,9 +271,10 @@ void GLDraw_2_0::initFBO(void)
                                buffer_grid_vertical->setUsagePattern(QOpenGLBuffer::StaticDraw);
                                vertex_grid_vertical->release();
                                buffer_grid_vertical->release();
-                               //doSetGridsVertical(SCREEN_WIDTH, true);
+                               doSetGridsVertical(SCREEN_WIDTH, true);
                        }
                }
+       }
 # if defined(MAX_BUTTONS)
                {
                        vertexButtons = new QVector<VertexTexCoord_t>;
@@ -372,8 +370,8 @@ void GLDraw_2_0::initFBO(void)
                           
                           buffer_bitmap_vertex->create();
                           buffer_bitmap_vertex->setUsagePattern(QOpenGLBuffer::StaticDraw);
-                          int vertex_loc = main_shader->attributeLocation("vertex");
-                          int texcoord_loc = main_shader->attributeLocation("texcoord");
+                          int vertex_loc = bitmap_shader->attributeLocation("vertex");
+                          int texcoord_loc = bitmap_shader->attributeLocation("texcoord");
                           
                           vertex_bitmap->bind();
                           buffer_bitmap_vertex->bind();
@@ -386,57 +384,7 @@ void GLDraw_2_0::initFBO(void)
                   }
           }
 #endif
-          buffer_screen_vertex = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
-          vertex_screen = new QOpenGLVertexArrayObject;
-          if(vertex_screen != NULL) {
-                  if(vertex_screen->create()) {
-                          {
-                                  QVector4D c;
-                                  c = QVector4D(1.0, 1.0, 1.0, 1.0);
-                                  main_shader->setUniformValue("color", c);
-                          }
-                          vertexFormat[0].x = -0.5f;
-                          vertexFormat[0].y = -0.5f;
-                          vertexFormat[0].z = -0.9f;
-                          vertexFormat[0].s = 0.0f;
-                          vertexFormat[0].t = 1.0f;
-                          
-                          vertexFormat[1].x = +0.5f;
-                          vertexFormat[1].y = -0.5f;
-                          vertexFormat[1].z = -0.9f;
-                          vertexFormat[1].s = 1.0f;
-                          vertexFormat[1].t = 1.0f;
-                          
-                          vertexFormat[2].x = +0.5f;
-                          vertexFormat[2].y = +0.5f;
-                          vertexFormat[2].z = -0.9f;
-                          vertexFormat[2].s = 1.0f;
-                          vertexFormat[2].t = 0.0f;
-                          
-                          vertexFormat[3].x = -0.5f;
-                          vertexFormat[3].y = +0.5f;
-                          vertexFormat[3].z = -0.9f;
-                          vertexFormat[3].s = 0.0f;
-                          vertexFormat[3].t = 0.0f;
-                          
-                          
-                          buffer_screen_vertex->create();
-                          buffer_screen_vertex->setUsagePattern(QOpenGLBuffer::DynamicDraw);
-                          
-                          vertex_screen->bind();
-                          buffer_screen_vertex->bind();
-                          buffer_screen_vertex->allocate(sizeof(VertexTexCoord_t) * 4);
-                          vertex_screen->release();
-                          buffer_screen_vertex->release();
-                          setNormalVAO(main_shader, vertex_screen,
-                                                       buffer_screen_vertex,
-                                                       vertexFormat, 4);
-                          QMatrix4x4 mat;
-                          mat.ortho(-1.0, 1.0, -1.0, +1.0, -1.0, 1.0);
-                          mat.translate(0, 0, 0);
-                  }
-          }
-       }
+       
        bGL_PIXEL_UNPACK_BUFFER_BINDING = false;
        // Init view
        extfunc->glClearColor(0.0, 0.0, 0.0, 1.0);
@@ -444,6 +392,62 @@ void GLDraw_2_0::initFBO(void)
 
 void GLDraw_2_0::initLocalGLObjects(void)
 {
+       main_shader = new QOpenGLShaderProgram(p_wid);
+       if(main_shader != NULL) {
+               main_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex_shader.glsl");
+               main_shader->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/chromakey_fragment_shader.glsl");
+               main_shader->link();
+       }
+       buffer_screen_vertex = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
+       vertex_screen = new QOpenGLVertexArrayObject;
+       if(vertex_screen != NULL) {
+               if(vertex_screen->create()) {
+                       {
+                               QVector4D c;
+                               c = QVector4D(1.0, 1.0, 1.0, 1.0);
+                               main_shader->setUniformValue("color", c);
+                       }
+                       vertexFormat[0].x = -0.5f;
+                       vertexFormat[0].y = -0.5f;
+                       vertexFormat[0].z = -0.9f;
+                       vertexFormat[0].s = 0.0f;
+                       vertexFormat[0].t = 1.0f;
+                       
+                       vertexFormat[1].x = +0.5f;
+                       vertexFormat[1].y = -0.5f;
+                       vertexFormat[1].z = -0.9f;
+                       vertexFormat[1].s = 1.0f;
+                       vertexFormat[1].t = 1.0f;
+                       
+                       vertexFormat[2].x = +0.5f;
+                       vertexFormat[2].y = +0.5f;
+                       vertexFormat[2].z = -0.9f;
+                       vertexFormat[2].s = 1.0f;
+                       vertexFormat[2].t = 0.0f;
+                       
+                       vertexFormat[3].x = -0.5f;
+                       vertexFormat[3].y = +0.5f;
+                       vertexFormat[3].z = -0.9f;
+                       vertexFormat[3].s = 0.0f;
+                       vertexFormat[3].t = 0.0f;
+                       
+                       
+                       buffer_screen_vertex->create();
+                       buffer_screen_vertex->setUsagePattern(QOpenGLBuffer::DynamicDraw);
+                       
+                       vertex_screen->bind();
+                       buffer_screen_vertex->bind();
+                       buffer_screen_vertex->allocate(sizeof(VertexTexCoord_t) * 4);
+                       vertex_screen->release();
+                       buffer_screen_vertex->release();
+                       setNormalVAO(main_shader, vertex_screen,
+                                                buffer_screen_vertex,
+                                                vertexFormat, 4);
+                       //QMatrix4x4 mat;
+                       //mat.ortho(-1.0, 1.0, -1.0, +1.0, -1.0, 1.0);
+                       //mat.translate(0, 0, 0);
+               }
+       }
 }
 
 void GLDraw_2_0::doSetGridsHorizonal(int lines, bool force)
@@ -471,6 +475,8 @@ void GLDraw_2_0::doSetGridsHorizonal(int lines, bool force)
                        yf = yf + delta;
                }
        }
+       //AGAR_DebugLog(AGAR_LOG_DEBUG, "Set H-Lines: %d (%dx%d), %f, %d", vert_lines, p_wid->width(), p_wid->height()
+       //                        ,delta, vertex_grid_horizonal->isCreated()? 1 : 0);
        if(vertex_grid_horizonal->isCreated()) {
                vertex_grid_horizonal->bind();
                buffer_grid_horizonal->bind();
@@ -545,6 +551,8 @@ void GLDraw_2_0::drawGridsMain(QOpenGLShaderProgram *prg,
                vp->bind();
                bp->bind();
                prg->bind();
+               //extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
+               //extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
                extfunc->glLineWidth(lineWidth);
                prg->setUniformValue("color", color);
                prg->enableAttributeArray("vertex");
@@ -649,7 +657,6 @@ void GLDraw_2_0::drawScreenTexture(void)
                color = QVector4D(1.0, 1.0, 1.0, 1.0);
        }                       
        {
-               main_shader->setUniformValue("color", color);
                drawMain(main_shader, vertex_screen,
                                 buffer_screen_vertex, uVramTextureID, // v2.0
                                 color, smoosing);
@@ -697,7 +704,13 @@ void GLDraw_2_0::drawMain(QOpenGLShaderProgram *prg,
                }
 #else          
                prg->setUniformValue("rotate", GL_FALSE);
-#endif    
+#endif
+               if(do_chromakey) {
+                       prg->setUniformValue("chromakey", chromakey);
+                       prg->setUniformValue("do_chromakey", GL_TRUE);
+               } else {
+                       prg->setUniformValue("do_chromakey", GL_FALSE);
+               }                       
                prg->enableAttributeArray("texcoord");
                prg->enableAttributeArray("vertex");
                int vertex_loc = prg->attributeLocation("vertex");
@@ -745,6 +758,7 @@ void GLDraw_2_0::uploadMainTexture(QImage *p, bool use_chromakey)
        // set vertex
        redraw_required = true;
        imgptr = p;
+       if(p == NULL) return;
        if(uVramTextureID == 0) {
                uVramTextureID = p_wid->bindTexture(*p);
        }
@@ -825,10 +839,11 @@ void GLDraw_2_0::resizeGL(int width, int height)
 void GLDraw_2_0::paintGL(void)
 {
        int i;
-       if(!crt_flag) return;
+       if(!crt_flag && !redraw_required) return;
        if(p_emu != NULL) {
                crt_flag = false;
        }
+       redraw_required = false;
        extfunc->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        extfunc->glEnable(GL_DEPTH_TEST);
        extfunc->glDisable(GL_BLEND);
@@ -863,28 +878,30 @@ void GLDraw_2_0::do_set_texture_size(QImage *p, int w, int h)
        float wfactor = 1.0f;
        float hfactor = 1.0f;
        float iw, ih;
-       imgptr = p;
-       if(p != NULL) {
-               iw = (float)p->width();
-               ih = (float)p->height();
-       } else {
-               iw = (float)SCREEN_WIDTH;
-               ih = (float)SCREEN_HEIGHT;
-       }
        if(p != NULL) {
                int ww = w;
                int hh = h;
+               imgptr = p;
+               iw = (float)p->width();
+               ih = (float)p->height();
                //if(screen_multiply < 1.0f) {
-               if((w > p_wid->width()) || (h > p_wid->height())) {
-                       ww = (int)(screen_multiply * (float)w);
-                       hh = (int)(screen_multiply * (float)h);
-                       wfactor = screen_multiply * 2.0f - 1.0f;
-                       hfactor = -screen_multiply * 2.0f + 1.0f;
-               }
+               p_wid->makeCurrent();
                screen_texture_width = w;
                screen_texture_height = h;
+               vertexFormat[0].s = 0.0f;
+               vertexFormat[0].t = (float)hh / ih;
+               vertexFormat[1].s = (float)ww / iw;
+               vertexFormat[1].t = (float)hh / ih;
+               vertexFormat[2].s = (float)ww / iw;
+               vertexFormat[2].t = 0.0f;
+               vertexFormat[3].s = 0.0f;
+               vertexFormat[3].t = 0.0f;
                
-               this->doSetGridsHorizonal(h, true);
-               this->doSetGridsVertical(w, true);
-       }
+               setNormalVAO(main_shader, vertex_screen,
+                                        buffer_screen_vertex,
+                                        vertexFormat, 4);
+               p_wid->doneCurrent();
+       }               
+       this->doSetGridsHorizonal(h, true);
+       this->doSetGridsVertical(w, true);
 }
index c80bf52..6a140d5 100644 (file)
@@ -60,6 +60,62 @@ void GLDraw_3_0::initGLObjects()
 void GLDraw_3_0::initLocalGLObjects(void)
 {
 
+       main_shader = new QOpenGLShaderProgram(p_wid);
+       if(main_shader != NULL) {
+               main_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex_shader.glsl");
+               main_shader->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fragment_shader.glsl");
+               main_shader->link();
+       }
+       buffer_screen_vertex = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
+       vertex_screen = new QOpenGLVertexArrayObject;
+       if(vertex_screen != NULL) {
+               if(vertex_screen->create()) {
+                       {
+                               QVector4D c;
+                               c = QVector4D(1.0, 1.0, 1.0, 1.0);
+                               main_shader->setUniformValue("color", c);
+                       }
+                       vertexFormat[0].x = -0.5f;
+                       vertexFormat[0].y = -0.5f;
+                       vertexFormat[0].z = -0.9f;
+                       vertexFormat[0].s = 0.0f;
+                       vertexFormat[0].t = 1.0f;
+                       
+                       vertexFormat[1].x = +0.5f;
+                       vertexFormat[1].y = -0.5f;
+                       vertexFormat[1].z = -0.9f;
+                       vertexFormat[1].s = 1.0f;
+                       vertexFormat[1].t = 1.0f;
+                       
+                       vertexFormat[2].x = +0.5f;
+                       vertexFormat[2].y = +0.5f;
+                       vertexFormat[2].z = -0.9f;
+                       vertexFormat[2].s = 1.0f;
+                       vertexFormat[2].t = 0.0f;
+                       
+                       vertexFormat[3].x = -0.5f;
+                       vertexFormat[3].y = +0.5f;
+                       vertexFormat[3].z = -0.9f;
+                       vertexFormat[3].s = 0.0f;
+                       vertexFormat[3].t = 0.0f;
+                       
+                       
+                       buffer_screen_vertex->create();
+                       buffer_screen_vertex->setUsagePattern(QOpenGLBuffer::DynamicDraw);
+                       
+                       vertex_screen->bind();
+                       buffer_screen_vertex->bind();
+                       buffer_screen_vertex->allocate(sizeof(VertexTexCoord_t) * 4);
+                       vertex_screen->release();
+                       buffer_screen_vertex->release();
+                       setNormalVAO(main_shader, vertex_screen,
+                                                buffer_screen_vertex,
+                                                vertexFormat, 4);
+                       //QMatrix4x4 mat;
+                       //mat.ortho(-1.0, 1.0, -1.0, +1.0, -1.0, 1.0);
+                       //mat.translate(0, 0, 0);
+               }
+       }
        tmp_shader = new QOpenGLShaderProgram(p_wid);
        if(tmp_shader != NULL) {
                tmp_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/tmp_vertex_shader.glsl");
@@ -161,6 +217,8 @@ void GLDraw_3_0::uploadMainTexture(QImage *p, bool use_chromakey)
 {
        // set vertex
        redraw_required = true;
+       if(p == NULL) return;
+       //redraw_required = true;
        imgptr = p;
        if(uVramTextureID == 0) {
                uVramTextureID = p_wid->bindTexture(*p);
index 4ffc241..e6e1fbd 100644 (file)
@@ -195,6 +195,7 @@ void Ui_MainWindow::setupUi(void)
 #endif
 
        connect(this, SIGNAL(sig_update_screen(void)), graphicsView, SLOT(update(void)));
+       //connect(this, SIGNAL(sig_update_screen(void)), graphicsView, SLOT(updateGL(void)));
 
        menuMachine = new QMenu(menubar);
        menuMachine->setObjectName(QString::fromUtf8("menuMachine"));