OSDN Git Service

[Qt][OSD][LAMP] Improbe LED displaying.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 30 Jul 2017 15:57:29 +0000 (00:57 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 30 Jul 2017 15:57:29 +0000 (00:57 +0900)
16 files changed:
source/src/qt/common/emu_thread.cpp
source/src/qt/common/qrc/shaders.qrc
source/src/qt/gui/draw_thread.cpp
source/src/qt/gui/draw_thread.h
source/src/qt/gui/led_fragment_shader.glsl [new file with mode: 0644]
source/src/qt/gui/led_vertex_shader.glsl [new file with mode: 0644]
source/src/qt/gui/mainwidget_base.h
source/src/qt/gui/menu_main.cpp
source/src/qt/gui/normal_fragment_shader.glsl
source/src/qt/gui/qt_gldraw.cpp
source/src/qt/gui/qt_gldraw.h
source/src/qt/gui/qt_glutil.cpp
source/src/qt/gui/qt_glutil_gl2_0.cpp
source/src/qt/gui/qt_glutil_gl2_0.h
source/src/qt/gui/qt_glutil_gl3_0.cpp
source/src/qt/gui/qt_glutil_gl3_0.h

index 3da2f82..2876e33 100644 (file)
@@ -122,6 +122,7 @@ void EmuThreadClass::get_fd_string(void)
        QString iname;
        QString alamp;
        uint32_t access_drv = 0;
+       bool lamp_stat = false;
        access_drv = p_emu->is_floppy_disk_accessed();
        {
                for(i = 0; i < (int)using_flags->get_max_drive(); i++) {
@@ -129,10 +130,9 @@ void EmuThreadClass::get_fd_string(void)
                        alamp.clear();
                        if(p_emu->is_floppy_disk_inserted(i)) {
                                if(i == (access_drv - 1)) {
-                                       emit sig_set_access_lamp(i + 10, true);
+                                       lamp_stat = true;
                                        alamp = QString::fromUtf8("<FONT COLOR=RED>●</FONT>"); // ðŸ’ŸU+1F4BE Floppy Disk
                                } else {
-                                       emit sig_set_access_lamp(i + 10, false);
                                        alamp = QString::fromUtf8("<FONT COLOR=BLUE>○</FONT>"); // ðŸ’ŸU+1F4BE Floppy Disk
                                }
                                //tmpstr = alamp;
@@ -149,6 +149,7 @@ void EmuThreadClass::get_fd_string(void)
                                alamp = QString::fromUtf8("×");
                        }
                        if(alamp != fd_lamp[i]) {
+                               emit sig_set_access_lamp(i + 2, lamp_stat);
                                emit sig_change_access_lamp(CSP_DockDisks_Domain_FD, i, alamp);
                                fd_lamp[i] = alamp;
                        }
@@ -156,6 +157,7 @@ void EmuThreadClass::get_fd_string(void)
                                emit sig_change_osd(CSP_DockDisks_Domain_FD, i, tmpstr);
                                fd_text[i] = tmpstr;
                        }
+                       lamp_stat = false;
                }
        }
 #endif
@@ -169,12 +171,14 @@ void EmuThreadClass::get_qd_string(void)
        QString alamp;
        QString tmpstr;
        uint32_t access_drv = 0;
+       bool lamp_stat = false;
        access_drv = p_emu->is_quick_disk_accessed();
        for(i = 0; i < using_flags->get_max_qd(); i++) {
                tmpstr.clear();
                if(p_emu->is_quick_disk_inserted(i)) {
                        if(i == (access_drv - 1)) {
                                alamp = QString::fromUtf8("<FONT COLOR=RED>●</FONT>"); // ðŸ’œã€€U+1F4BD MiniDisc
+                               lamp_stat = true;
                        } else {
                                alamp = QString::fromUtf8("<FONT COLOR=BLUE>○</FONT>"); // ðŸ’œU+1F4BD MiniDisc
                        }
@@ -188,7 +192,9 @@ void EmuThreadClass::get_qd_string(void)
                if(tmpstr != qd_text[i]) {
                        emit sig_change_access_lamp(CSP_DockDisks_Domain_QD, i, tmpstr);
                        qd_text[i] = tmpstr;
+                       emit sig_set_access_lamp(i + 10, lamp_stat);
                }
+               lamp_stat = false;
        }
 #endif
 }      
@@ -204,7 +210,11 @@ void EmuThreadClass::get_tape_string()
                        const _TCHAR *ts = p_emu->get_tape_message(i);
                        if(ts != NULL) {
                                tmpstr = QString::fromUtf8(ts);
-                               tmpstr = QString::fromUtf8("<FONT COLOR=RED>") + tmpstr + QString::fromUtf8("</FONT>");
+                               if(p_emu->is_tape_recording(i)) {
+                                       tmpstr = QString::fromUtf8("<FONT COLOR=RED><B>") + tmpstr + QString::fromUtf8("</B></FONT>");
+                               } else {
+                                       tmpstr = QString::fromUtf8("<FONT COLOR=GREEN><B>") + tmpstr + QString::fromUtf8("</B></FONT>");
+                               }                                       
                        }
                } else {
                        tmpstr = QString::fromUtf8("<FONT COLOR=BLUE>   EMPTY   </FONT>");
index 6897309..74852fa 100644 (file)
@@ -5,6 +5,8 @@
     <file alias="normal_fragment_shader.glsl">../../gui/normal_fragment_shader.glsl</file>
     <file alias="chromakey_fragment_shader.glsl">../../gui/chromakey_fragment_shader.glsl</file>
     <file alias="chromakey_fragment_shader2.glsl">../../gui/chromakey_fragment_shader2.glsl</file>
+    <file alias="led_fragment_shader.glsl">../../gui/led_fragment_shader.glsl</file>
+    <file alias="led_vertex_shader.glsl">../../gui/led_vertex_shader.glsl</file>
     <file alias="vertex_shader.glsl">../../gui/vertex_shader.glsl</file>
     <file alias="grids_fragment_shader.glsl">../../gui/grids_fragment_shader.glsl</file>
     <file alias="grids_vertex_shader.glsl">../../gui/grids_vertex_shader.glsl</file>
index 5f96c85..4bc4456 100644 (file)
@@ -36,6 +36,7 @@ DrawThreadClass::DrawThreadClass(OSD *o, CSP_Logger *logger,QObject *parent) : Q
        do_change_refresh_rate(screen->refreshRate());
        connect(screen, SIGNAL(refreshRateChanged(qreal)), this, SLOT(do_change_refresh_rate(qreal)));
        connect(this, SIGNAL(sig_update_screen(bitmap_t *)), glv, SLOT(update_screen(bitmap_t *)), Qt::QueuedConnection);
+       connect(this, SIGNAL(sig_update_osd()), glv, SLOT(update_osd()), Qt::QueuedConnection);
        connect(this, SIGNAL(sig_push_frames_to_avio(int, int, int)), glv->extfunc, SLOT(paintGL_OffScreen(int, int, int)));
        //connect(this, SIGNAL(sig_call_draw_screen()), p_osd, SLOT(draw_screen()));
        //connect(this, SIGNAL(sig_call_no_draw_screen()), p_osd, SLOT(no_draw_screen()));
@@ -78,15 +79,21 @@ void DrawThreadClass::doExit(void)
 
 void DrawThreadClass::doWork(const QString &param)
 {
-
+       int ncount = 0;
        bRunThread = true;
        do {
                if(bDrawReq) {
                        if(draw_screen_buffer != NULL) {
                                bDrawReq = false;
                                emit sig_update_screen(draw_screen_buffer);
+                       } else {
+                               if(ncount == 0) emit sig_update_osd();
                        }
+               } else {
+                       if(ncount == 0) emit sig_update_osd();
                }
+               ncount++;
+               if(ncount >= 8) ncount = 0; 
                if(rec_frame_count > 0) {
                        emit sig_push_frames_to_avio(rec_frame_count,
                                                                                 rec_frame_width, rec_frame_height);
index 0dbb49d..14bf980 100644 (file)
@@ -62,6 +62,7 @@ signals:
        int sig_draw_frames(int);
        int message_changed(QString);
        int sig_update_screen(bitmap_t *);
+       int sig_update_osd(void);
        int sig_draw_timing(bool);
        int sig_push_frames_to_avio(int, int, int);
        int sig_call_draw_screen();
diff --git a/source/src/qt/gui/led_fragment_shader.glsl b/source/src/qt/gui/led_fragment_shader.glsl
new file mode 100644 (file)
index 0000000..9a755a8
--- /dev/null
@@ -0,0 +1,7 @@
+uniform vec4 color;
+void main ()
+{
+       gl_FragColor = color;
+}
+
+
diff --git a/source/src/qt/gui/led_vertex_shader.glsl b/source/src/qt/gui/led_vertex_shader.glsl
new file mode 100644 (file)
index 0000000..60e6e6b
--- /dev/null
@@ -0,0 +1,9 @@
+attribute vec3 vertex;
+void main ()
+{
+    vec4 tmpvar_1;
+    tmpvar_1.w = 1.0;
+    tmpvar_1.xyz = vertex.xyz;
+    gl_Position = tmpvar_1;
+}
+
index 387ffa3..7945fbb 100644 (file)
@@ -693,6 +693,7 @@ signals:
        int sig_stop_auto_key(void);
        int sig_set_display_osd(bool);
        int sig_display_osd_leds(int,bool);
+       int sig_set_led_width(int);
        int sig_set_orientation_osd(int);
 
        int quit_debugger_thread(void);
index 5c4ebe9..abbd9ad 100644 (file)
@@ -326,7 +326,8 @@ void Ui_MainWindowBase::setupUi(void)
                graphicsView->setAttribute(Qt::WA_InputMethodEnabled, false); // Disable [Zenkaku / Hankaku] with IM.
                graphicsView->setAttribute(Qt::WA_KeyboardFocusChange, false);
                graphicsView->setAttribute(Qt::WA_KeyCompression, false);
-               
+               connect(this, SIGNAL(sig_set_display_osd(bool)), graphicsView, SLOT(do_set_display_osd(bool)));
+               connect(this, SIGNAL(sig_set_led_width(int)), graphicsView, SLOT(do_set_led_width(int)));
                //graphicsView->setFocusPolicy(Qt::StrongFocus);
                //this->setFocusPolicy(Qt::ClickFocus);
        }
@@ -351,29 +352,35 @@ void Ui_MainWindowBase::setupUi(void)
                pCentralLayout->addWidget(driveData);
                driveData->setVisible(false);
                graphicsView->setVisible(true);
+               //emit sig_set_display_osd(true);
                break;
        case 1:
                pCentralLayout->addWidget(driveData);
                pCentralLayout->addWidget(graphicsView);
                driveData->setVisible(true);
                graphicsView->setVisible(true);
+               //emit sig_set_display_osd(false);
                break;
        case 2:
                pCentralLayout->addWidget(graphicsView);
                pCentralLayout->addWidget(driveData);
                driveData->setVisible(true);
                graphicsView->setVisible(true);
+               //emit sig_set_display_osd(false);
                break;
-       }       
+       default:
+               pCentralLayout->addWidget(graphicsView);
+               pCentralLayout->addWidget(driveData);
+               driveData->setVisible(true);
+               graphicsView->setVisible(true);
+               //emit sig_set_display_osd(false);
+               break;
+       }
        driveData->setOrientation(using_flags->get_config_ptr()->virtual_media_position);
        connect(this, SIGNAL(sig_set_orientation_osd(int)), driveData, SLOT(setOrientation(int)));
-       //connect(this, SIGNAL(sig_resize_osd(int)), driveData, SLOT(setScreenWidth(int)));
        connect(graphicsView, SIGNAL(sig_resize_osd(int)), driveData, SLOT(setScreenWidth(int)));
 
        MainWindow->setFocusProxy(graphicsView);
-       //driveData->setAllowedAreas(Qt::RightToolBarArea | Qt::BottomToolBarArea);
-       //MainWindow->addToolBar(driveData);
-       //MainWindow->setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
        MainWindow->centralWidget()->adjustSize();
        MainWindow->adjustSize();
 
@@ -411,17 +418,26 @@ void Ui_MainWindowBase::setupUi(void)
        menuDebugger = new QMenu(menuControl);
        menuDebugger->setObjectName(QString::fromUtf8("menuDebugger"));
        menuDebugger->setToolTipsVisible(true);
+       int _led_width = 0;
        if(using_flags->is_use_fd()) {
                int i;
                for(i = 0; i < using_flags->get_max_drive(); i++) CreateFloppyMenu(i, i + 1);
+               _led_width = _led_width + 8;
        }
        if(using_flags->is_use_qd()) {
                int i;
                for(i = 0; i < using_flags->get_max_qd(); i++) CreateQuickDiskMenu(i, i + 1);
+               _led_width = _led_width + 2;
        }
        if(using_flags->is_use_tape()) {
                for(int i = 0; i < using_flags->get_max_tape(); i++) CreateCMTMenu(i);
+               _led_width = _led_width + 2;
        }
+       if(using_flags->get_max_scsi() > 0) {
+               _led_width = _led_width + using_flags->get_max_scsi() - 1;
+       }
+       emit sig_set_led_width(_led_width);
+       
        CreateScreenMenu();
        if(using_flags->is_use_cart()) {
                int i;
@@ -1146,7 +1162,7 @@ void Ui_MainWindowBase::do_set_visible_virtual_media_none()
        pCentralLayout->removeWidget(graphicsView);
        pCentralLayout->addWidget(driveData);
        pCentralLayout->addWidget(graphicsView);
-       emit sig_set_display_osd(true);
+       //emit sig_set_display_osd(true);
 }
 
 void Ui_MainWindowBase::do_set_visible_virtual_media_upper()
@@ -1159,7 +1175,7 @@ void Ui_MainWindowBase::do_set_visible_virtual_media_upper()
        pCentralLayout->removeWidget(graphicsView);
        pCentralLayout->addWidget(driveData);
        pCentralLayout->addWidget(graphicsView);
-       emit sig_set_display_osd(false);
+       //emit sig_set_display_osd(false);
 }
 
 void Ui_MainWindowBase::do_set_visible_virtual_media_lower()
@@ -1172,7 +1188,7 @@ void Ui_MainWindowBase::do_set_visible_virtual_media_lower()
        pCentralLayout->removeWidget(graphicsView);
        pCentralLayout->addWidget(graphicsView);
        pCentralLayout->addWidget(driveData);
-       emit sig_set_display_osd(false);
+       //emit sig_set_display_osd(false);
 }
 
 void Ui_MainWindowBase::do_set_visible_virtual_media_left()
@@ -1184,7 +1200,7 @@ void Ui_MainWindowBase::do_set_visible_virtual_media_left()
        emit sig_set_orientation_osd(3);
        pCentralLayout->removeWidget(driveData);
        pCentralLayout->addWidget(driveData, 1, 0);
-       emit sig_set_display_osd(false);
+       //emit sig_set_display_osd(false);
 #endif
 }
 
@@ -1197,7 +1213,7 @@ void Ui_MainWindowBase::do_set_visible_virtual_media_right()
        emit sig_set_orientation_osd(4);
        pCentralLayout->removeWidget(driveData);
        pCentralLayout->addWidget(driveData, 1, 2);
-       emit sig_set_display_osd(false);
+       //emit sig_set_display_osd(false);
 #endif
 }
 
index abf49b0..bfbbab5 100644 (file)
@@ -1,8 +1,6 @@
-varying vec2 v_texcoord;
 uniform vec4 color;
-uniform sampler2D a_texture;
 void main ()
 {
-       gl_FragColor = (texture2D (a_texture, v_texcoord) * color);
+               gl_FragColor = color;
 }
 
index a28992a..9c8d9eb 100644 (file)
@@ -162,6 +162,12 @@ GLDrawClass::~GLDrawClass()
 
 }
 
+void GLDrawClass::do_set_led_width(int bitwidth)
+{
+       if(extfunc != NULL) {
+               extfunc->do_set_led_width(bitwidth);
+       }
+}
 void GLDrawClass::set_emu_launched()
 {
        emu_launched = true;
index 9ddab64..93c7a00 100644 (file)
@@ -113,6 +113,7 @@ public slots:
        void releaseKeyCode(void);
        
        void update_screen(bitmap_t *);
+       void update_osd(void);
        void resizeGL(int width, int height);
        void mouseMoveEvent(QMouseEvent *event);
        void mousePressEvent(QMouseEvent *event);
@@ -143,6 +144,8 @@ public slots:
        void do_disable_mouse(void);
        void do_set_display_osd(bool onoff);
        void do_display_osd_leds(int lednum,bool onoff);
+       void do_set_led_width(int bitwidth);
+
 signals:
        void update_screenChanged(int tick);
        void do_notify_move_mouse(int x, int y);
index f7c6dde..353779a 100644 (file)
@@ -41,6 +41,11 @@ void GLDrawClass::update_screen(bitmap_t *p)
        }
 }
 
+void GLDrawClass::update_osd(void)
+{
+               this->update();
+}
+
 void GLDrawClass::InitContextCL(void)
 {
 }
index 1f841a2..6191177 100644 (file)
@@ -47,6 +47,8 @@ GLDraw_2_0::GLDraw_2_0(GLDrawClass *parent, USING_FLAGS *p, CSP_Logger *logger,
        extfunc_2 = NULL;
        redraw_required = false;
        osd_led_status = 0x00000000;
+       osd_led_status_bak = 0x00000000;
+       osd_led_bit_width = 12;
        osd_onoff = true;
 
        uBitmapTextureID = 0;
@@ -175,37 +177,44 @@ void GLDraw_2_0::drawOsdLeds()
        extfunc_2->glDisable(GL_DEPTH_TEST);
        extfunc_2->glViewport(0, 0, p_wid->width(), p_wid->height());
        extfunc_2->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
-       if(osd_onoff) {
-               uint32_t _bit = 0x00000001;
-               for(int ii = 0; ii < 32; ii++) {
-                       
-                       vertex[0].x = xbase;
-                       vertex[0].y = ybase;
-                       vertex[0].z = zbase;
-                       
-                       vertex[1].x = xbase + (1.0f / 64.0f);
-                       vertex[1].y = ybase;
-                       vertex[1].z = zbase;
-                       
-                       vertex[2].x = xbase + (1.0f / 64.0f);
-                       vertex[2].y = ybase - (1.0f / 64.0f);
-                       vertex[2].z = zbase;
+       if(osd_led_status != osd_led_status_bak) {
+               if(osd_onoff) {
+                       uint32_t _bit = 0x00000001;
+                       for(int ii = 0; ii < osd_led_bit_width; ii++) {
+                               if((_bit & osd_led_status) == (_bit & osd_led_status_bak)) {
+                                       xbase = xbase - (1.0f / 32.0f);
+                                       _bit <<= 1;
+                                       continue;
+                               }
+                               vertex[0].x = xbase;
+                               vertex[0].y = ybase;
+                               vertex[0].z = zbase;
+                               
+                               vertex[1].x = xbase + (1.0f / 64.0f);
+                               vertex[1].y = ybase;
+                               vertex[1].z = zbase;
+                               
+                               vertex[2].x = xbase + (1.0f / 64.0f);
+                               vertex[2].y = ybase - (1.0f / 64.0f);
+                               vertex[2].z = zbase;
                        
-                       vertex[3].x = xbase;
-                       vertex[3].y = ybase - (1.0f / 64.0f);
-                       vertex[3].z = zbase;
-                       if(_bit & osd_led_status) {
-                               extfunc_2->glColor4f(color_on.x(), color_on.y(), color_on.z(), color_on.w());
-                       } else {
-                               extfunc_2->glColor4f(color_off.x(), color_off.y(), color_off.z(), color_off.w());
-                       }                       
-                       extfunc_2->glBegin(GL_POLYGON);
-                       for(int j = 0; j < 4; j++) {
-                               extfunc_2->glVertex3f(vertex[j].x, vertex[j].y, vertex[j].z);
+                               vertex[3].x = xbase;
+                               vertex[3].y = ybase - (1.0f / 64.0f);
+                               vertex[3].z = zbase;
+                               if(_bit & osd_led_status) {
+                                       extfunc_2->glColor4f(color_on.x(), color_on.y(), color_on.z(), color_on.w());
+                               } else {
+                                       extfunc_2->glColor4f(color_off.x(), color_off.y(), color_off.z(), color_off.w());
+                               }                       
+                               extfunc_2->glBegin(GL_POLYGON);
+                               for(int j = 0; j < 4; j++) {
+                                       extfunc_2->glVertex3f(vertex[j].x, vertex[j].y, vertex[j].z);
+                               }
+                               extfunc_2->glEnd();
+                               xbase = xbase - (1.0f / 32.0f);
+                               _bit <<= 1;
                        }
-                       extfunc_2->glEnd();
-                       xbase = xbase - (1.0f / 32.0f);
-                       _bit <<= 1;
+                       osd_led_status_bak = osd_led_status;
                }
        }
 }
@@ -983,10 +992,13 @@ void GLDraw_2_0::paintGL(void)
                 */
                drawScreenTexture();
                extfunc_2->glDisable(GL_BLEND);
-               drawOsdLeds();
                if(!using_flags->is_use_one_board_computer() && (using_flags->get_max_button() <= 0)) {
                        drawGrids();
                }
+               drawOsdLeds();
+               extfunc_2->glFlush();
+       } else {
+               drawOsdLeds();
                extfunc_2->glFlush();
        }
        //p_wid->doneCurrent();
@@ -1042,3 +1054,8 @@ void GLDraw_2_0::do_set_texture_size(QImage *p, int w, int h)
        this->doSetGridsHorizonal(h, true);
        this->doSetGridsVertical(w, true);
 }
+
+void GLDraw_2_0::do_set_led_width(int bitwidth)
+{
+       if((bitwidth >= 0) && (bitwidth < 32)) osd_led_bit_width = bitwidth;
+}
index 123324e..eb08d1b 100644 (file)
@@ -132,6 +132,8 @@ protected:
        bool emu_launched;
 
        uint32_t osd_led_status;
+       uint32_t osd_led_status_bak;
+       int osd_led_bit_width;
        bool osd_onoff;
 public:
        GLDraw_2_0(GLDrawClass *parent, USING_FLAGS *p, CSP_Logger *logger, EMU *emu = 0);
@@ -175,6 +177,7 @@ public slots:
        void set_emu_launched(void);
        void do_set_display_osd(bool onoff);
        void do_display_osd_leds(int lednum, bool onoff);
+       void do_set_led_width(int bitwidth);
 signals:
        int sig_push_image_to_movie(int, int, int, QImage *);
 };
index b398483..f60f2e6 100644 (file)
@@ -199,7 +199,9 @@ GLDraw_3_0::GLDraw_3_0(GLDrawClass *parent, USING_FLAGS *p, CSP_Logger *logger,
        std_pass = NULL;
        ntsc_pass1 = NULL;
        ntsc_pass2 = NULL;
-       
+       for(int i = 0; i < 32; i++) {
+               led_pass[i] = NULL;
+       }
        grids_horizonal_buffer = NULL;
        grids_horizonal_vertex = NULL;
        
@@ -215,6 +217,9 @@ GLDraw_3_0::~GLDraw_3_0()
        if(std_pass   != NULL) delete std_pass;
        if(ntsc_pass1 != NULL) delete ntsc_pass1;
        if(ntsc_pass2 != NULL) delete ntsc_pass2;
+       for(int i = 0; i < 32; i++) {
+               if(led_pass[i] != NULL) delete led_pass[i];
+       }
        
        if(grids_horizonal_buffer != NULL) {
                if(grids_horizonal_buffer->isCreated()) grids_horizonal_buffer->destroy();
@@ -448,6 +453,13 @@ void GLDraw_3_0::initLocalGLObjects(void)
                                           using_flags->get_screen_width(), using_flags->get_screen_height(),
                                           ":/vertex_shader.glsl" , ":/chromakey_fragment_shader.glsl",
                                           "Standard Shader");
+       for(int i = 0; i < 32; i++) {
+               initPackedGLObject(&(led_pass[i]),
+                                          10, 10,
+                                          ":/led_vertex_shader.glsl" , ":/led_fragment_shader.glsl",
+                                          "LED Shader");
+               set_led_vertex(i);
+       }
 
        initPackedGLObject(&ntsc_pass1,
                                           _width, _height,
@@ -772,7 +784,6 @@ void GLDraw_3_0::drawScreenTexture(void)
        if(using_flags->is_use_one_board_computer()) {
                extfunc->glEnable(GL_BLEND);
                extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-               //extfunc->glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
        } else {
                extfunc->glDisable(GL_BLEND);
        }
@@ -973,12 +984,48 @@ void GLDraw_3_0::drawBitmapTexture(void)
        }
 }
 
+void GLDraw_3_0::drawLedMain(GLScreenPack *obj,
+                                                        QVector4D color)
+{
+       QOpenGLShaderProgram *prg = obj->getShader();
+       QOpenGLVertexArrayObject *vp = obj->getVAO();
+       QOpenGLBuffer *bp = obj->getVertexBuffer();
+       int ii;
+               
+       {
+               extfunc->glDisable(GL_TEXTURE_2D);
+               extfunc->glEnable(GL_BLEND);
+               extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+               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);
+               ii = prg->uniformLocation("color");
+               if(ii >= 0) {
+                       prg->setUniformValue(ii,  color);
+               }
+               
+               prg->enableAttributeArray("vertex");
+               int vertex_loc = prg->attributeLocation("vertex");
+               extfunc->glEnableVertexAttribArray(vertex_loc);
+               extfunc->glEnable(GL_VERTEX_ARRAY);
+               extfunc->glDrawArrays(GL_POLYGON, 0, 4);
+               bp->release();
+               vp->release();
+               
+               prg->release();
+               extfunc->glDisable(GL_TEXTURE_2D);
+               extfunc->glDisable(GL_BLEND);
+       }
+
+}
+
 void GLDraw_3_0::drawOsdLeds()
 {
        QVector4D color_on;
        QVector4D color_off;
-       VertexTexCoord_t vertex[4];
-       float xbase, ybase, zbase;
+       uint32_t bit = 0x00000001;
        if(osd_onoff) {
                color_on = QVector4D(0.95, 0.0, 0.05, 1.0);
                color_off = QVector4D(0.05,0.05, 0.05, 0.10);
@@ -986,52 +1033,18 @@ void GLDraw_3_0::drawOsdLeds()
                color_on = QVector4D(0.00,0.00, 0.00, 0.0);
                color_off = QVector4D(0.00,0.00, 0.00, 0.0);
        }
-       xbase = 0.0f + (1.0f / 32.0f) * 31.0f + (1.0f / 128.0f);
-       ybase = -1.0f + (2.0f / 64.0f) * 1.5f;
-       zbase = -0.999f;
-       
-       extfunc->glEnable(GL_BLEND);
-       extfunc->glDisable(GL_TEXTURE_2D);
-       extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-       extfunc->glDisable(GL_DEPTH_TEST);
-       extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
-       extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
        if(osd_onoff) {
-               uint32_t _bit = 0x00000001;
-               
-               xbase = 0.0f + (1.0f / 32.0f) * 31.0f + (1.0f / 128.0f);
-               ybase = -1.0f + (2.0f / 64.0f) * 1.5f;
-               ybase = 0.0f;
-               xbase = -1.0f + 0.1f;
-               zbase = -0.999f;
-               for(int ii = 0; ii < 32; ii++) {
-                       
-                       vertex[0].x = xbase;
-                       vertex[0].y = ybase;
-                       vertex[0].z = zbase;
-                       
-                       vertex[1].x = xbase + (1.0f / 64.0f);
-                       vertex[1].y = ybase;
-                       vertex[1].z = zbase;
-                       
-                       vertex[2].x = xbase + (1.0f / 64.0f);
-                       vertex[2].y = ybase - (1.0f / 64.0f);
-                       vertex[2].z = zbase;
-                       
-                       vertex[3].x = xbase;
-                       vertex[3].y = ybase - (1.0f / 64.0f);
-                       vertex[3].z = zbase;
-                       if(_bit & osd_led_status) {
-                               extfunc->glColor4f(color_on.x(), color_on.y(), color_on.z(), color_on.w());
-                       } else {
-                               extfunc->glColor4f(color_off.x(), color_off.y(), color_off.z(), color_off.w());
+               if(osd_led_status_bak != osd_led_status) {
+                       for(int i = 0; i < osd_led_bit_width; i++) {
+                               if((bit & osd_led_status) == (bit & osd_led_status_bak)) {
+                                       bit <<= 1;
+                                       continue;
+                               }
+                               drawLedMain(led_pass[i],
+                                                       ((osd_led_status & bit) != 0) ? color_on : color_off);
+                               bit <<= 1;
                        }
-                       extfunc->glEnableClientState(GL_VERTEX_ARRAY);
-                       extfunc->glVertexPointer(3, GL_FLOAT, sizeof(VertexTexCoord_t),(void *)vertex);
-                       extfunc->glDrawArrays(GL_POLYGON, 0, 16);
-                       extfunc->glDisableClientState(GL_VERTEX_ARRAY);
-                       xbase = xbase - (1.0f / 32.0f);
-                       _bit <<= 1;
+                       osd_led_status_bak = osd_led_status;
                }
        }
 }
@@ -1066,7 +1079,12 @@ void GLDraw_3_0::paintGL(void)
                }
                drawOsdLeds();
                extfunc->glFlush();
-       }
+       } else {
+               extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
+               extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
+               drawOsdLeds();
+               extfunc->glFlush();
+       }               
        //p_wid->doneCurrent();
 }
 
@@ -1121,6 +1139,44 @@ void GLDraw_3_0::set_texture_vertex(float wmul, float hmul)
        vertexTmpTexture[3].t = hmul;
 }
 
+void GLDraw_3_0::set_led_vertex(int xbit)
+{
+       float xbase, ybase, zbase;
+       VertexTexCoord_t vertex[4];
+
+       if((xbit < 0) || (xbit >=32)) return;
+       xbase = 0.0f + (1.0f / 32.0f) * 31.0f - ((1.0f * (float)xbit) / 32.0f) + (1.0f / 128.0f);
+       ybase = -1.0f + (2.0f / 64.0f) * 1.5f;
+       zbase = -0.999f;
+       vertex[0].x = xbase;
+       vertex[0].y = ybase;
+       vertex[0].z = zbase;
+       vertex[0].s = 0.0f;
+       vertex[0].t = 0.0f;
+       
+       vertex[1].x = xbase + (1.0f / 64.0f);
+       vertex[1].y = ybase;
+       vertex[1].z = zbase;
+       vertex[1].s = 1.0f;
+       vertex[1].t = 0.0f;
+       
+       vertex[2].x = xbase + (1.0f / 64.0f);
+       vertex[2].y = ybase - (1.0f / 64.0f);
+       vertex[2].z = zbase;
+       vertex[2].s = 1.0f;
+       vertex[2].t = 1.0f;
+       
+       vertex[3].x = xbase;
+       vertex[3].y = ybase - (1.0f / 64.0f);
+       vertex[3].z = zbase;
+       vertex[3].s = 0.0f;
+       vertex[3].t = 1.0f;
+       
+       setNormalVAO(led_pass[xbit]->getShader(), led_pass[xbit]->getVAO(),
+                                led_pass[xbit]->getVertexBuffer(),
+                                vertex, 4);
+}
+
 void GLDraw_3_0::do_set_screen_multiply(float mul)
 {
        screen_multiply = mul;
index 42d1ee4..488f0f0 100644 (file)
@@ -28,6 +28,7 @@ protected:
        GLScreenPack *ntsc_pass1;
        GLScreenPack *ntsc_pass2;
        GLScreenPack *bitmap_block;
+       GLScreenPack *led_pass[32];
 
        VertexTexCoord_t vertexTmpTexture[4];
        
@@ -79,6 +80,8 @@ protected:
        virtual void drawBitmapTexture(void);
        virtual void drawButtonsMain(int num, bool f_smoosing);
        virtual void drawOsdLeds();
+       virtual void drawLedMain(GLScreenPack *obj, QVector4D color);
+       virtual void set_led_vertex(int bit);
 
 public:
        GLDraw_3_0(GLDrawClass *parent, USING_FLAGS *p, CSP_Logger *logger, EMU *emu = 0);