3 * (c) 2016 K.Ohta <whatisthis.sowhat@gmail.com>
5 * Renderer with OpenGL v3.0 (extend from renderer with OpenGL v2.0).
7 * Jan 22, 2016 : Initial.
10 #include "qt_gldraw.h"
11 #include "qt_glpack.h"
12 #include "qt_glutil_gl3_0.h"
13 #include "csp_logger.h"
14 #include "menu_flags.h"
16 //extern USING_FLAGS *using_flags;
19 const float luma_filter[24 + 1] = {
46 const float chroma_filter[24 + 1] = {
76 const float luma_filter[24 + 1] = {
103 const float chroma_filter[24 + 1] = {
130 // END "ntsc-decode-filter-3phase.inc" //
133 const float luma_filter[24 + 1] = {
161 const float chroma_filter[24 + 1] = {
188 // END "ntsc-decode-filter-3phase.inc" //
192 GLDraw_3_0::GLDraw_3_0(GLDrawClass *parent, USING_FLAGS *p, CSP_Logger *logger, EMU *emu) : GLDraw_2_0(parent, p, logger, emu)
202 for(int i = 0; i < 32; i++) {
205 grids_horizonal_buffer = NULL;
206 grids_horizonal_vertex = NULL;
208 grids_vertical_buffer = NULL;
209 grids_vertical_vertex = NULL;
210 ringing_phase = 0.0f;
213 GLDraw_3_0::~GLDraw_3_0()
216 if(main_pass != NULL) delete main_pass;
217 if(std_pass != NULL) delete std_pass;
218 if(ntsc_pass1 != NULL) delete ntsc_pass1;
219 if(ntsc_pass2 != NULL) delete ntsc_pass2;
220 for(int i = 0; i < 32; i++) {
221 if(led_pass[i] != NULL) delete led_pass[i];
224 if(grids_horizonal_buffer != NULL) {
225 if(grids_horizonal_buffer->isCreated()) grids_horizonal_buffer->destroy();
227 if(grids_horizonal_vertex != NULL) {
228 if(grids_horizonal_vertex->isCreated()) grids_horizonal_vertex->destroy();
230 if(grids_vertical_buffer != NULL) {
231 if(grids_vertical_buffer->isCreated()) grids_vertical_buffer->destroy();
233 if(grids_horizonal_vertex != NULL) {
234 if(grids_vertical_vertex->isCreated()) grids_vertical_vertex->destroy();
239 void GLDraw_3_0::initFBO(void)
241 glHorizGrids = (GLfloat *)malloc(sizeof(float) * (using_flags->get_real_screen_height() + 2) * 6);
242 if(glHorizGrids != NULL) {
243 doSetGridsHorizonal(using_flags->get_real_screen_height(), true);
245 glVertGrids = (GLfloat *)malloc(sizeof(float) * (using_flags->get_real_screen_width() + 2) * 6);
246 if(glVertGrids != NULL) {
247 doSetGridsVertical(using_flags->get_real_screen_width(), true);
249 if(using_flags->get_max_button() > 0) {
253 extfunc->glClearColor(0.0, 0.0, 0.0, 1.0);
256 void GLDraw_3_0::setNormalVAO(QOpenGLShaderProgram *prg,
257 QOpenGLVertexArrayObject *vp,
259 VertexTexCoord_t *tp,
262 int vertex_loc = prg->attributeLocation("vertex");
263 int texcoord_loc = prg->attributeLocation("texcoord");
270 VertexTexCoord_t tv[4];
294 bp->write(0, tv, sizeof(VertexTexCoord_t) * 4);
297 bp->write(0, tp, sizeof(VertexTexCoord_t) * size);
299 prg->setAttributeBuffer(vertex_loc, GL_FLOAT, 0, 3, sizeof(VertexTexCoord_t));
300 prg->setAttributeBuffer(texcoord_loc, GL_FLOAT, 3 * sizeof(GLfloat), 2, sizeof(VertexTexCoord_t));
301 prg->setUniformValue("a_texture", 0);
303 extfunc->glVertexAttribPointer(vertex_loc, 3, GL_FLOAT, GL_FALSE, sizeof(VertexTexCoord_t), 0);
304 extfunc->glVertexAttribPointer(texcoord_loc, 2, GL_FLOAT, GL_FALSE, sizeof(VertexTexCoord_t),
305 (char *)NULL + 3 * sizeof(GLfloat));
308 prg->enableAttributeArray(vertex_loc);
309 prg->enableAttributeArray(texcoord_loc);
312 void GLDraw_3_0::initGLObjects()
314 extfunc = new QOpenGLFunctions_3_0;
315 extfunc->initializeOpenGLFunctions();
316 extfunc->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texture_max_size);
319 void GLDraw_3_0::initPackedGLObject(GLScreenPack **p,
320 int _width, int _height,
321 const QString vertex_shader, const QString fragment_shader,
327 pp = new GLScreenPack(_width, _height, p_wid);
330 pp->initialize(_width, _height, vertex_shader, fragment_shader);
331 s = pp->getShaderLog();
333 csp_logger->debug_log(CSP_LOG_INFO, CSP_LOG_TYPE_GL_SHADER, "In shader of %s ", _name.toLocal8Bit().constData());
334 csp_logger->debug_log(CSP_LOG_INFO, CSP_LOG_TYPE_GL_SHADER, "Vertex: %s ", vertex_shader.toLocal8Bit().constData());
335 csp_logger->debug_log(CSP_LOG_INFO, CSP_LOG_TYPE_GL_SHADER, "Fragment: %s ", fragment_shader.toLocal8Bit().constData());
336 csp_logger->debug_log(CSP_LOG_INFO, CSP_LOG_TYPE_GL_SHADER, "%s", s.toLocal8Bit().constData());
344 bool GLDraw_3_0::initGridShaders(const QString vertex_fixed, const QString vertex_rotate, const QString fragment)
347 grids_shader = new QOpenGLShaderProgram(p_wid);
348 if(grids_shader != NULL) {
349 if(using_flags->is_use_screen_rotate()) {
350 f = grids_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, vertex_rotate);
352 f = grids_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, vertex_fixed);
354 f &= grids_shader->addShaderFromSourceFile(QOpenGLShader::Fragment, fragment);
355 f &= grids_shader->link();
360 bool GLDraw_3_0::initGridVertexObject(QOpenGLBuffer **vbo, QOpenGLVertexArrayObject **vao, int alloc_size)
362 QOpenGLBuffer *bp = NULL;
363 QOpenGLVertexArrayObject *ap = NULL;
366 *vbo = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
371 bp->allocate(alloc_size * sizeof(GLfloat) * 3 * 2);
381 *vao = new QOpenGLVertexArrayObject;
398 void GLDraw_3_0::initLocalGLObjects(void)
401 int _width = using_flags->get_screen_width();
402 int _height = using_flags->get_screen_height();
404 if((_width * 4) <= texture_max_size) {
406 low_resolution_screen = true;
410 p_wid->makeCurrent();
412 vertexFormat[0].x = -1.0f;
413 vertexFormat[0].y = -1.0f;
414 vertexFormat[0].z = -0.9f;
415 vertexFormat[0].s = 0.0f;
416 vertexFormat[0].t = 1.0f;
418 vertexFormat[1].x = +1.0f;
419 vertexFormat[1].y = -1.0f;
420 vertexFormat[1].z = -0.9f;
421 vertexFormat[1].s = 1.0f;
422 vertexFormat[1].t = 1.0f;
424 vertexFormat[2].x = +1.0f;
425 vertexFormat[2].y = +1.0f;
426 vertexFormat[2].z = -0.9f;
427 vertexFormat[2].s = 1.0f;
428 vertexFormat[2].t = 0.0f;
430 vertexFormat[3].x = -1.0f;
431 vertexFormat[3].y = +1.0f;
432 vertexFormat[3].z = -0.9f;
433 vertexFormat[3].s = 0.0f;
434 vertexFormat[3].t = 0.0f;
436 if(using_flags->is_use_one_board_computer() || (using_flags->get_max_button() > 0)) {
437 initPackedGLObject(&main_pass,
438 using_flags->get_screen_width() * 2, using_flags->get_screen_height() * 2,
439 ":/vertex_shader.glsl" , ":/chromakey_fragment_shader2.glsl",
442 initPackedGLObject(&main_pass,
443 using_flags->get_screen_width() * 2, using_flags->get_screen_height() * 2,
444 ":/vertex_shader.glsl" , ":/fragment_shader.glsl",
447 if(main_pass != NULL) {
448 setNormalVAO(main_pass->getShader(), main_pass->getVAO(),
449 main_pass->getVertexBuffer(),
452 initPackedGLObject(&std_pass,
453 using_flags->get_screen_width(), using_flags->get_screen_height(),
454 ":/vertex_shader.glsl" , ":/chromakey_fragment_shader.glsl",
456 for(int i = 0; i < 32; i++) {
457 initPackedGLObject(&(led_pass[i]),
459 ":/led_vertex_shader.glsl" , ":/led_fragment_shader.glsl",
464 initPackedGLObject(&ntsc_pass1,
466 ":/vertex_shader.glsl" , ":/ntsc_pass1.glsl",
467 "NTSC Shader Pass1");
468 initPackedGLObject(&ntsc_pass2,
470 ":/vertex_shader.glsl" , ":/ntsc_pass2.glsl",
471 "NTSC Shader Pass2");
474 QOpenGLShaderProgram *shader = ntsc_pass2->getShader();
476 ii = shader->uniformLocation("luma_filter");
478 shader->setUniformValueArray(ii, luma_filter, 24 + 1, 1);
480 ii = shader->uniformLocation("chroma_filter");
482 shader->setUniformValueArray(ii, chroma_filter, 24 + 1, 1);
487 if(using_flags->is_use_one_board_computer()) {
489 initPackedGLObject(&bitmap_block,
490 _width * 2, _height * 2,
491 ":/vertex_shader.glsl", ":/normal_fragment_shader.glsl",
492 "Background Bitmap Shader");
493 if(bitmap_block != NULL) {
494 setNormalVAO(bitmap_block->getShader(), bitmap_block->getVAO(),
495 bitmap_block->getVertexBuffer(),
499 initGridShaders(":/grids_vertex_shader_fixed.glsl", ":/grids_vertex_shader.glsl", ":/grids_fragment_shader.glsl");
501 initGridVertexObject(&grids_horizonal_buffer, &grids_horizonal_vertex, using_flags->get_real_screen_height() + 3);
502 doSetGridsHorizonal(using_flags->get_real_screen_height(), true);
504 initGridVertexObject(&grids_vertical_buffer, &grids_vertical_vertex, using_flags->get_real_screen_width() + 3);
505 doSetGridsVertical(using_flags->get_real_screen_width(), true);
507 do_set_texture_size(NULL, -1, -1);
508 p_wid->doneCurrent();
511 void GLDraw_3_0::updateGridsVAO(QOpenGLBuffer *bp,
512 QOpenGLVertexArrayObject *vp,
518 if((bp != NULL) && (vp != NULL)) {
519 if(bp->isCreated()) {
520 if(bp->size() < (int)((number + 1) * sizeof(GLfloat) * 3 * 2)) {
532 bp->allocate((number + 1) * sizeof(GLfloat) * 3 * 2);
535 bp->write(0, tp, (number + 1) * sizeof(GLfloat) * 3 * 2);
541 void GLDraw_3_0::drawGridsMain_3(QOpenGLShaderProgram *prg,
543 QOpenGLVertexArrayObject *vp,
548 if(number <= 0) return;
549 extfunc->glDisable(GL_TEXTURE_2D);
550 extfunc->glDisable(GL_DEPTH_TEST);
551 extfunc->glDisable(GL_BLEND);
553 if((bp == NULL) || (vp == NULL) || (prg == NULL)) return;
554 if((!bp->isCreated()) || (!vp->isCreated()) || (!prg->isLinked())) return;
560 //bp->read(8, &ff, sizeof(GLfloat) * 2);
561 //printf("%d %f %f\n", number, ff[0], ff[1]);
563 prg->setUniformValue("color", color);
564 prg->enableAttributeArray("vertex");
565 int vertex_loc = prg->attributeLocation("vertex");
567 extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
568 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
569 //extfunc->glEnable(GL_BLEND);
570 //extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
571 //extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE);
572 extfunc->glVertexAttribPointer(vertex_loc, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, 0);
573 extfunc->glEnableVertexAttribArray(vertex_loc);
575 extfunc->glEnableClientState(GL_VERTEX_ARRAY);
576 extfunc->glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
577 extfunc->glLineWidth(lineWidth);
578 extfunc->glVertexPointer(3, GL_FLOAT, 0, 0);
579 extfunc->glDrawArrays(GL_LINES, 0, (number + 1) * 2);
580 extfunc->glDisableClientState(GL_VERTEX_ARRAY);
581 //extfunc->glDisable(GL_BLEND);
588 void GLDraw_3_0::doSetGridsVertical(int pixels, bool force)
590 GLDraw_2_0::doSetGridsVertical(pixels, force);
591 updateGridsVAO(grids_vertical_buffer,
592 grids_vertical_vertex,
597 void GLDraw_3_0::doSetGridsHorizonal(int lines, bool force)
599 GLDraw_2_0::doSetGridsHorizonal(lines, force);
600 updateGridsVAO(grids_horizonal_buffer,
601 grids_horizonal_vertex,
606 void GLDraw_3_0::drawGridsHorizonal(void)
608 QVector4D c= QVector4D(0.0f, 0.0f, 0.0f, 1.0f);
609 drawGridsMain_3(grids_shader,
610 grids_horizonal_buffer,
611 grids_horizonal_vertex,
617 void GLDraw_3_0::drawGridsVertical(void)
619 QVector4D c= QVector4D(0.0f, 0.0f, 0.0f, 1.0f);
620 drawGridsMain_3(grids_shader,
621 grids_vertical_buffer,
622 grids_vertical_vertex,
628 void GLDraw_3_0::renderToTmpFrameBuffer_nPass(GLuint src_texture,
631 GLScreenPack *renderObject,
637 QOpenGLShaderProgram *shader = renderObject->getShader();
641 extfunc->glClearColor(0.0, 0.0, 0.0, 1.0);
642 extfunc->glClearDepth(1.0f);
643 extfunc->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
645 if((src_texture != 0) && (shader != NULL)) {
646 extfunc->glEnable(GL_TEXTURE_2D);
647 renderObject->bind();
648 //extfunc->glViewport(0, 0, src_w, src_h);
649 extfunc->glViewport(0, 0, dst_w, dst_h);
650 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
651 extfunc->glActiveTexture(GL_TEXTURE0);
652 extfunc->glBindTexture(GL_TEXTURE_2D, src_texture);
653 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
654 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
655 //extfunc->glColor4f(1.0, 1.0, 1.0, 1.0);
656 shader->setUniformValue("a_texture", 0);
657 //shader->setUniformValue("a_texture", src_texture);
659 ii = shader->uniformLocation("source_size");
661 QVector4D source_size = QVector4D((float)src_w, (float)src_h, 0, 0);
662 shader->setUniformValue(ii, source_size);
664 ii = shader->uniformLocation("target_size");
666 QVector4D target_size = QVector4D((float)dst_w, (float)dst_h, 0, 0);
667 shader->setUniformValue(ii, target_size);
669 ii = shader->uniformLocation("phase");
671 ringing_phase = ringing_phase + 0.093;
672 if(ringing_phase > 1.0) ringing_phase = ringing_phase - 1.0;
673 shader->setUniformValue(ii, ringing_phase);
675 //ii = shader->uniformLocation("luma_filter");
677 // shader->setUniformValueArray(ii, luma_filter, 24 + 1, 1);
679 //ii = shader->uniformLocation("chroma_filter");
681 // shader->setUniformValueArray(ii, chroma_filter, 24 + 1, 1);
685 QVector4D c(fBrightR, fBrightG, fBrightB, 1.0);
686 QVector3D chromakey(0.0, 0.0, 0.0);
688 ii = shader->uniformLocation("color");
690 shader->setUniformValue(ii, c);
692 ii = shader->uniformLocation("do_chromakey");
696 ij = shader->uniformLocation("chromakey");
698 shader->setUniformValue(ij, chromakey);
700 shader->setUniformValue(ii, GL_TRUE);
702 shader->setUniformValue(ii, GL_FALSE);
705 //shader->setUniformValue("tex_width", (float)w);
706 //shader->setUniformValue("tex_height", (float)h);
708 shader->enableAttributeArray("texcoord");
709 shader->enableAttributeArray("vertex");
711 int vertex_loc = shader->attributeLocation("vertex");
712 int texcoord_loc = shader->attributeLocation("texcoord");
713 extfunc->glEnableVertexAttribArray(vertex_loc);
714 extfunc->glEnableVertexAttribArray(texcoord_loc);
715 extfunc->glEnable(GL_VERTEX_ARRAY);
717 extfunc->glDrawArrays(GL_POLYGON, 0, 4);
719 extfunc->glViewport(0, 0, dst_w, dst_h);
720 extfunc->glOrtho(0.0f, (float)dst_w, 0.0f, (float)dst_h, -1.0, 1.0);
721 renderObject->release();
722 extfunc->glBindTexture(GL_TEXTURE_2D, 0);
723 extfunc->glDisable(GL_TEXTURE_2D);
730 void GLDraw_3_0::uploadMainTexture(QImage *p, bool use_chromakey)
733 redraw_required = true;
734 if(p == NULL) return;
735 //redraw_required = true;
737 if(uVramTextureID == 0) {
738 uVramTextureID = p_wid->bindTexture(*p);
741 // Upload to main texture
742 extfunc->glBindTexture(GL_TEXTURE_2D, uVramTextureID);
743 extfunc->glTexSubImage2D(GL_TEXTURE_2D, 0,
745 //screen_texture_width * 2,
746 //screen_texture_height * 2,
747 p->width(), p->height(),
748 GL_BGRA, GL_UNSIGNED_BYTE, p->constBits());
749 extfunc->glBindTexture(GL_TEXTURE_2D, 0);
751 if(using_flags->is_support_tv_render() && (using_flags->get_config_ptr()->rendering_type == CONFIG_RENDER_TYPE_TV)) {
752 renderToTmpFrameBuffer_nPass(uVramTextureID,
753 screen_texture_width,
754 screen_texture_height,
756 ntsc_pass1->getViewportWidth(),
757 ntsc_pass1->getViewportHeight());
759 renderToTmpFrameBuffer_nPass(ntsc_pass1->getTexture(),
760 ntsc_pass1->getViewportWidth(),
761 ntsc_pass1->getViewportHeight(),
763 ntsc_pass2->getViewportWidth(),
764 ntsc_pass2->getViewportHeight());
765 uTmpTextureID = ntsc_pass2->getTexture();
767 renderToTmpFrameBuffer_nPass(uVramTextureID,
768 screen_texture_width,
769 screen_texture_height,
771 std_pass->getViewportWidth(),
772 std_pass->getViewportHeight(),
776 uTmpTextureID = std_pass->getTexture();
777 //std_pass->release();
782 void GLDraw_3_0::drawScreenTexture(void)
784 if(using_flags->is_use_one_board_computer()) {
785 extfunc->glEnable(GL_BLEND);
786 extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
788 extfunc->glDisable(GL_BLEND);
792 smoosing = using_flags->get_config_ptr()->use_opengl_filters;
794 color = QVector4D(fBrightR, fBrightG, fBrightB, 1.0);
796 color = QVector4D(1.0, 1.0, 1.0, 1.0);
798 if(using_flags->is_use_one_board_computer()) {
800 uTmpTextureID, // v2.0
802 true, QVector3D(0.0, 0.0, 0.0));
803 extfunc->glDisable(GL_BLEND);
806 uTmpTextureID, // v2.0
812 void GLDraw_3_0::drawMain(GLScreenPack *obj,
820 QOpenGLShaderProgram *prg = obj->getShader();
821 QOpenGLVertexArrayObject *vp = obj->getVAO();
822 QOpenGLBuffer *bp = obj->getVertexBuffer();
826 extfunc->glEnable(GL_TEXTURE_2D);
830 extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
831 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
832 extfunc->glActiveTexture(GL_TEXTURE0);
833 extfunc->glBindTexture(GL_TEXTURE_2D, texid);
835 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
836 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
838 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
839 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
841 prg->setUniformValue("a_texture", 0);
843 ii = prg->uniformLocation("color");
845 prg->setUniformValue(ii, color);
848 ii = prg->uniformLocation("tex_width");
850 prg->setUniformValue(ii, (float)screen_texture_width);
853 ii = prg->uniformLocation("tex_height");
855 prg->setUniformValue(ii, (float)screen_texture_height);
857 if(using_flags->is_use_screen_rotate()) {
858 if(using_flags->get_config_ptr()->rotate_type) {
859 prg->setUniformValue("rotate", GL_TRUE);
861 prg->setUniformValue("rotate", GL_FALSE);
864 prg->setUniformValue("rotate", GL_FALSE);
868 ii = prg->uniformLocation("chromakey");
870 prg->setUniformValue(ii, chromakey);
872 ii = prg->uniformLocation("do_chromakey");
874 prg->setUniformValue(ii, GL_TRUE);
877 ii = prg->uniformLocation("do_chromakey");
879 prg->setUniformValue(ii, GL_FALSE);
883 prg->enableAttributeArray("texcoord");
884 prg->enableAttributeArray("vertex");
885 int vertex_loc = prg->attributeLocation("vertex");
886 int texcoord_loc = prg->attributeLocation("texcoord");
887 extfunc->glEnableVertexAttribArray(vertex_loc);
888 extfunc->glEnableVertexAttribArray(texcoord_loc);
889 extfunc->glEnable(GL_VERTEX_ARRAY);
890 extfunc->glDrawArrays(GL_POLYGON, 0, 4);
895 extfunc->glBindTexture(GL_TEXTURE_2D, 0);
896 extfunc->glDisable(GL_TEXTURE_2D);
900 void GLDraw_3_0::drawButtonsMain(int num, bool f_smoosing)
902 GLuint texid = uButtonTextureID[num];
903 QOpenGLBuffer *bp = buffer_button_vertex[num];
904 QOpenGLShaderProgram *prg = button_shader;
905 QOpenGLVertexArrayObject *vp = vertex_button[num];
909 color = QVector4D(1.0, 1.0, 1.0, 1.0);
911 if((bp != NULL) && (vp != NULL) && (prg != NULL)) {
912 if((bp->isCreated()) && (vp->isCreated()) && (prg->isLinked())) {
916 extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
917 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
918 extfunc->glActiveTexture(GL_TEXTURE0);
919 extfunc->glBindTexture(GL_TEXTURE_2D, texid);
921 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
922 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
924 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
925 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
927 prg->setUniformValue("a_texture", 0);
929 ii = prg->uniformLocation("color");
931 prg->setUniformValue(ii, color);
933 ii = prg->uniformLocation("do_chromakey");
935 prg->setUniformValue(ii, GL_FALSE);
937 if(using_flags->is_use_screen_rotate()) {
938 if(using_flags->get_config_ptr()->rotate_type) {
939 prg->setUniformValue("rotate", GL_TRUE);
941 prg->setUniformValue("rotate", GL_FALSE);
944 prg->setUniformValue("rotate", GL_FALSE);
946 int vertex_loc = prg->attributeLocation("vertex");
947 int texcoord_loc = prg->attributeLocation("texcoord");
948 //prg->setAttributeBuffer(vertex_loc, GL_FLOAT, 0, 3, sizeof(VertexTexCoord_t));
949 //prg->setAttributeBuffer(texcoord_loc, GL_FLOAT, 3 * sizeof(GLfloat), 2, sizeof(VertexTexCoord_t));
950 prg->enableAttributeArray(vertex_loc);
951 prg->enableAttributeArray(texcoord_loc);
952 extfunc->glEnableVertexAttribArray(vertex_loc);
953 extfunc->glEnableVertexAttribArray(texcoord_loc);
954 extfunc->glEnable(GL_VERTEX_ARRAY);
955 extfunc->glDrawArrays(GL_POLYGON, 0, 4);
959 extfunc->glBindTexture(GL_TEXTURE_2D, 0);
960 extfunc->glDisable(GL_TEXTURE_2D);
967 void GLDraw_3_0::drawButtons(void)
969 for(int i = 0; i < using_flags->get_max_button(); i++) {
970 drawButtonsMain(i, false);
974 void GLDraw_3_0::drawBitmapTexture(void)
976 QVector4D color = QVector4D(1.0f, 1.0f, 1.0f, 1.0f);
977 smoosing = using_flags->get_config_ptr()->use_opengl_filters;
979 if(using_flags->is_use_one_board_computer()) {
980 extfunc->glDisable(GL_BLEND);
981 drawMain(bitmap_block,
987 void GLDraw_3_0::drawLedMain(GLScreenPack *obj,
990 QOpenGLShaderProgram *prg = obj->getShader();
991 QOpenGLVertexArrayObject *vp = obj->getVAO();
992 QOpenGLBuffer *bp = obj->getVertexBuffer();
996 extfunc->glDisable(GL_TEXTURE_2D);
997 extfunc->glEnable(GL_BLEND);
998 extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1002 extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
1003 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
1004 ii = prg->uniformLocation("color");
1006 prg->setUniformValue(ii, color);
1009 prg->enableAttributeArray("vertex");
1010 int vertex_loc = prg->attributeLocation("vertex");
1011 extfunc->glEnableVertexAttribArray(vertex_loc);
1012 extfunc->glEnable(GL_VERTEX_ARRAY);
1013 extfunc->glDrawArrays(GL_POLYGON, 0, 4);
1018 extfunc->glDisable(GL_TEXTURE_2D);
1019 extfunc->glDisable(GL_BLEND);
1024 void GLDraw_3_0::drawOsdLeds()
1027 QVector4D color_off;
1028 uint32_t bit = 0x00000001;
1030 color_on = QVector4D(0.95, 0.0, 0.05, 1.0);
1031 color_off = QVector4D(0.05,0.05, 0.05, 0.10);
1033 color_on = QVector4D(0.00,0.00, 0.00, 0.0);
1034 color_off = QVector4D(0.00,0.00, 0.00, 0.0);
1037 if(osd_led_status_bak != osd_led_status) {
1038 for(int i = 0; i < osd_led_bit_width; i++) {
1039 if((bit & osd_led_status) == (bit & osd_led_status_bak)) {
1043 drawLedMain(led_pass[i],
1044 ((osd_led_status & bit) != 0) ? color_on : color_off);
1047 osd_led_status_bak = osd_led_status;
1052 void GLDraw_3_0::paintGL(void)
1054 //p_wid->makeCurrent();
1056 if(crt_flag || redraw_required) { //return;
1060 redraw_required = false;
1061 extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
1062 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
1064 extfunc->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1065 extfunc->glEnable(GL_DEPTH_TEST);
1066 extfunc->glDisable(GL_BLEND);
1067 if(using_flags->is_use_one_board_computer() || using_flags->is_use_bitmap()) {
1068 extfunc->glEnable(GL_BLEND);
1069 drawBitmapTexture();
1071 if(using_flags->get_max_button() > 0) {
1072 extfunc->glEnable(GL_BLEND);
1075 drawScreenTexture();
1076 extfunc->glDisable(GL_BLEND);
1077 if(!using_flags->is_use_one_board_computer() && (using_flags->get_max_button() <= 0)) {
1083 extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
1084 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
1088 //p_wid->doneCurrent();
1091 void GLDraw_3_0::setBrightness(GLfloat r, GLfloat g, GLfloat b)
1097 if(imgptr != NULL) {
1098 p_wid->makeCurrent();
1099 if(uVramTextureID != 0) {
1100 uVramTextureID = p_wid->bindTexture(*imgptr);
1102 if(using_flags->is_use_one_board_computer() || (using_flags->get_max_button() > 0)) {
1103 uploadMainTexture(imgptr, true);
1105 uploadMainTexture(imgptr, false);
1108 p_wid->doneCurrent();
1112 void GLDraw_3_0::set_texture_vertex(float wmul, float hmul)
1114 float wfactor = 1.0f;
1115 float hfactor = 1.0f;
1117 vertexTmpTexture[0].x = -1.0f;
1118 vertexTmpTexture[0].y = -1.0f;
1119 vertexTmpTexture[0].z = -0.1f;
1120 vertexTmpTexture[0].s = 0.0f;
1121 vertexTmpTexture[0].t = 0.0f;
1123 vertexTmpTexture[1].x = wfactor;
1124 vertexTmpTexture[1].y = -1.0f;
1125 vertexTmpTexture[1].z = -0.1f;
1126 vertexTmpTexture[1].s = wmul;
1127 vertexTmpTexture[1].t = 0.0f;
1129 vertexTmpTexture[2].x = wfactor;
1130 vertexTmpTexture[2].y = hfactor;
1131 vertexTmpTexture[2].z = -0.1f;
1132 vertexTmpTexture[2].s = wmul;
1133 vertexTmpTexture[2].t = hmul;
1135 vertexTmpTexture[3].x = -1.0f;
1136 vertexTmpTexture[3].y = hfactor;
1137 vertexTmpTexture[3].z = -0.1f;
1138 vertexTmpTexture[3].s = 0.0f;
1139 vertexTmpTexture[3].t = hmul;
1142 void GLDraw_3_0::set_led_vertex(int xbit)
1144 float xbase, ybase, zbase;
1145 VertexTexCoord_t vertex[4];
1147 if((xbit < 0) || (xbit >=32)) return;
1148 xbase = 0.0f + (1.0f / 32.0f) * 31.0f - ((1.0f * (float)xbit) / 32.0f) + (1.0f / 128.0f);
1149 ybase = -1.0f + (2.0f / 64.0f) * 1.5f;
1151 vertex[0].x = xbase;
1152 vertex[0].y = ybase;
1153 vertex[0].z = zbase;
1157 vertex[1].x = xbase + (1.0f / 64.0f);
1158 vertex[1].y = ybase;
1159 vertex[1].z = zbase;
1163 vertex[2].x = xbase + (1.0f / 64.0f);
1164 vertex[2].y = ybase - (1.0f / 64.0f);
1165 vertex[2].z = zbase;
1169 vertex[3].x = xbase;
1170 vertex[3].y = ybase - (1.0f / 64.0f);
1171 vertex[3].z = zbase;
1175 setNormalVAO(led_pass[xbit]->getShader(), led_pass[xbit]->getVAO(),
1176 led_pass[xbit]->getVertexBuffer(),
1180 void GLDraw_3_0::do_set_screen_multiply(float mul)
1182 screen_multiply = mul;
1183 do_set_texture_size(imgptr, screen_texture_width, screen_texture_height);
1186 void GLDraw_3_0::do_set_texture_size(QImage *p, int w, int h)
1188 if(w <= 0) w = using_flags->get_real_screen_width();
1189 if(h <= 0) h = using_flags->get_real_screen_height();
1193 iw = (float)p->width();
1194 ih = (float)p->height();
1196 iw = (float)using_flags->get_real_screen_width();
1197 ih = (float)using_flags->get_real_screen_height();
1199 //printf("%dx%d -> %fx%f\n", w, h, iw, ih);
1201 screen_texture_width = w;
1202 screen_texture_height = h;
1204 p_wid->makeCurrent();
1206 set_texture_vertex((float)w / iw, (float)h / ih);
1207 setNormalVAO(std_pass->getShader(), std_pass->getVAO(),
1208 std_pass->getVertexBuffer(),
1209 vertexTmpTexture, 4);
1210 //set_texture_vertex(p, p_wid->width(), p_wid->height(), w, h);
1211 set_texture_vertex((float)w / iw, (float)h / ih);
1212 setNormalVAO(ntsc_pass1->getShader(), ntsc_pass1->getVAO(),
1213 ntsc_pass1->getVertexBuffer(),
1214 vertexTmpTexture, 4);
1216 set_texture_vertex(1.0f, 1.0f);
1217 setNormalVAO(ntsc_pass2->getShader(), ntsc_pass2->getVAO(),
1218 ntsc_pass2->getVertexBuffer(),
1219 vertexTmpTexture, 4);
1223 p_wid->deleteTexture(uVramTextureID);
1224 uVramTextureID = p_wid->bindTexture(*p);
1226 vertexFormat[0].x = -1.0f;
1227 vertexFormat[0].y = -1.0f;
1228 vertexFormat[0].z = -0.9f;
1229 vertexFormat[1].x = 1.0f;
1230 vertexFormat[1].y = -1.0f;
1231 vertexFormat[1].z = -0.9f;
1232 vertexFormat[2].x = 1.0f;
1233 vertexFormat[2].y = 1.0f;
1234 vertexFormat[2].z = -0.9f;
1235 vertexFormat[3].x = -1.0f;
1236 vertexFormat[3].y = 1.0f;
1237 vertexFormat[3].z = -0.9f;
1239 vertexFormat[0].s = 0.0f;
1240 //vertexFormat[0].t = (float)h / ih;
1241 //vertexFormat[1].s = (float)w / iw;
1242 //vertexFormat[1].t = (float)h / ih;
1243 //vertexFormat[2].s = (float)w / iw;
1244 vertexFormat[0].t = 1.0f;
1245 vertexFormat[1].s = 1.0f;
1246 vertexFormat[1].t = 1.0f;
1247 vertexFormat[2].s = 1.0f;
1248 vertexFormat[2].t = 0.0f;
1249 vertexFormat[3].s = 0.0f;
1250 vertexFormat[3].t = 0.0f;
1252 setNormalVAO(main_pass->getShader(), main_pass->getVAO(),
1253 main_pass->getVertexBuffer(),
1256 this->doSetGridsHorizonal(h, true);
1257 this->doSetGridsVertical(w, true);
1258 p_wid->doneCurrent();
1262 void GLDraw_3_0::resizeGL_Screen(void)
1264 if(main_pass != NULL) {
1265 setNormalVAO(main_pass->getShader(), main_pass->getVAO(),
1266 main_pass->getVertexBuffer(),
1271 void GLDraw_3_0::resizeGL(int width, int height)
1273 //int side = qMin(width, height);
1274 p_wid->makeCurrent();
1275 extfunc->glViewport(0, 0, width, height);
1276 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
1278 if(!using_flags->is_use_one_board_computer() && (using_flags->get_max_button() <= 0)) {
1279 doSetGridsHorizonal(vert_lines, true);
1280 if(using_flags->is_use_vertical_pixel_lines()) {
1281 doSetGridsVertical(horiz_pixels, true);
1284 resizeGL_SetVertexs();
1286 if(using_flags->is_use_one_board_computer()) {
1287 setNormalVAO(bitmap_block->getShader(), bitmap_block->getVAO(),
1288 bitmap_block->getVertexBuffer(),
1291 if(using_flags->get_max_button() > 0) {
1292 updateButtonTexture();
1294 p_wid->doneCurrent();