3 * (c) 2016 K.Ohta <whatisthis.sowhat@gmail.com>
5 * Renderer with OpenGL v2.0 .
7 * Jan 21, 2016 : Initial.
12 #include <QOpenGLFramebufferObject>
13 #include <QOpenGLFramebufferObject>
16 #include "qt_gldraw.h"
17 #include "agar_logger.h"
18 #include "qt_glutil_gl2_0.h"
19 #include "menu_flags.h"
21 //extern USING_FLAGS *using_flags;
24 GLDraw_2_0::GLDraw_2_0(GLDrawClass *parent, USING_FLAGS *p, EMU *emu) : QObject(parent)
30 gl_grid_horiz = false;
35 vert_lines = using_flags->get_screen_height();
36 horiz_pixels = using_flags->get_screen_width();
37 set_brightness = false;
43 screen_multiply = 1.0f;
44 screen_texture_width = using_flags->get_screen_width();
45 screen_texture_width_old = using_flags->get_screen_width();
46 screen_texture_height = using_flags->get_screen_height();
47 screen_texture_height_old = using_flags->get_screen_height();
50 redraw_required = false;
53 bitmap_uploaded = false;
55 // Will fix: Must fix setup of vm_buttons[].
56 button_desc_t *vm_buttons_d = using_flags->get_vm_buttons();
57 if(vm_buttons_d != NULL) {
58 for(i = 0; i < using_flags->get_max_button(); i++) {
59 # if defined(_USE_GLAPI_QT5_4)
60 uButtonTextureID[i] = new QOpenGLTexture(QOpenGLTexture::Target2D);
62 uButtonTextureID[i] = 0;
64 fButtonX[i] = -1.0 + (float)(vm_buttons_d[i].x * 2) / (float)using_flags->get_screen_width();
65 fButtonY[i] = 1.0 - (float)(vm_buttons_d[i].y * 2) / (float)using_flags->get_screen_height();
66 fButtonWidth[i] = (float)(vm_buttons_d[i].width * 2) / (float)using_flags->get_screen_width();
67 fButtonHeight[i] = (float)(vm_buttons_d[i].height * 2) / (float)using_flags->get_screen_height();
70 button_updated = false;
73 fBrightR = 1.0; // 輝度の初期化
76 set_brightness = false;
80 gl_grid_horiz = false;
83 vert_lines = using_flags->get_screen_height();
84 horiz_pixels = using_flags->get_screen_width();
88 offscreen_frame_buffer = NULL;
89 offscreen_frame_buffer_format = NULL;
91 rec_width = using_flags->get_screen_width();
92 rec_height = using_flags->get_screen_height();
96 GLDraw_2_0::~GLDraw_2_0()
98 if(buffer_screen_vertex->isCreated()) buffer_screen_vertex->destroy();
99 if(vertex_screen->isCreated()) vertex_screen->destroy();
100 if(glVertGrids != NULL) free(glVertGrids);
101 if(glHorizGrids != NULL) free(glHorizGrids);
102 if(using_flags->is_use_one_board_computer()) {
103 if(uBitmapTextureID != 0) {
104 p_wid->deleteTexture(uBitmapTextureID);
107 if(using_flags->get_max_button() > 0) {
109 for(i = 0; i < using_flags->get_max_button() > 0; i++) {
110 if(uButtonTextureID[i] != 0) p_wid->deleteTexture(uButtonTextureID[i]);
112 for(i = 0; i < using_flags->get_max_button(); i++) {
113 if(vertex_button[i]->isCreated()) vertex_button[i]->destroy();
117 if(using_flags->is_use_one_board_computer()) {
118 if(vertex_bitmap->isCreated()) vertex_bitmap->destroy();
120 if(extfunc != NULL) delete extfunc;
123 void GLDraw_2_0::initializeGL(void)
127 void GLDraw_2_0::setNormalVAO(QOpenGLShaderProgram *prg,
128 QOpenGLVertexArrayObject *vp,
130 VertexTexCoord_t *tp,
133 int vertex_loc = prg->attributeLocation("vertex");
134 int texcoord_loc = prg->attributeLocation("texcoord");
136 if(bp == NULL) return;
137 if(prg == NULL) return;
138 if(!bp->isCreated()) return;
141 bp->write(0, tp, sizeof(VertexTexCoord_t) * size);
142 prg->setAttributeBuffer(vertex_loc, GL_FLOAT, 0, 3, sizeof(VertexTexCoord_t));
143 prg->setAttributeBuffer(texcoord_loc, GL_FLOAT, 3 * sizeof(GLfloat), 2, sizeof(VertexTexCoord_t));
146 prg->setUniformValue("a_texture", 0);
150 void GLDraw_2_0::setChangeBrightness(bool flag)
152 set_brightness = flag;
155 void GLDraw_2_0::setBrightness(GLfloat r, GLfloat g, GLfloat b)
162 void GLDraw_2_0::setImgPtr(QImage *p)
167 void GLDraw_2_0::setSmoosing(bool flag)
173 void GLDraw_2_0::setVirtualVramSize(int width, int height)
176 horiz_pixels = width;
180 void GLDraw_2_0::setEmuPtr(EMU *p)
185 void GLDraw_2_0::setDrawGLGridVert(bool flag)
191 void GLDraw_2_0::setDrawGLGridHoriz(bool flag)
197 void GLDraw_2_0::initGLObjects()
199 extfunc = new QOpenGLFunctions_2_0;
200 extfunc->initializeOpenGLFunctions();
201 extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
202 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
205 void GLDraw_2_0::initFBO(void)
207 if(using_flags->is_use_one_board_computer()) {
208 bitmap_shader = new QOpenGLShaderProgram(p_wid);
209 if(bitmap_shader != NULL) {
210 bitmap_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex_shader.glsl");
211 bitmap_shader->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/normal_fragment_shader.glsl");
212 bitmap_shader->link();
215 if(using_flags->get_max_button() > 0) {
216 button_shader = new QOpenGLShaderProgram(p_wid);
217 if(button_shader != NULL) {
218 button_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex_shader.glsl");
219 button_shader->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/normal_fragment_shader.glsl");
220 button_shader->link();
223 glHorizGrids = (GLfloat *)malloc(sizeof(float) * (using_flags->get_screen_height() + 2) * 6);
224 if(glHorizGrids != NULL) {
225 doSetGridsHorizonal(using_flags->get_screen_height(), true);
227 glVertGrids = (GLfloat *)malloc(sizeof(float) * (using_flags->get_screen_width() + 2) * 6);
228 if(glVertGrids != NULL) {
229 doSetGridsVertical(using_flags->get_screen_width(), true);
231 // Will fix around vm_buttons[].
232 button_desc_t *vm_buttons_d = using_flags->get_vm_buttons();
233 if(vm_buttons_d != NULL) {
234 if(using_flags->get_max_button() > 0) {
235 vertexButtons = new QVector<VertexTexCoord_t>;
238 for(i = 0; i < using_flags->get_max_button(); i++) {
239 buffer_button_vertex[i] = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
240 buffer_button_vertex[i]->create();
241 fButtonX[i] = -1.0 + (float)(vm_buttons_d[i].x * 2) / (float)using_flags->get_screen_width();
242 fButtonY[i] = 1.0 - (float)(vm_buttons_d[i].y * 2) / (float)using_flags->get_screen_height();
243 fButtonWidth[i] = (float)(vm_buttons_d[i].width * 2) / (float)using_flags->get_screen_width();
244 fButtonHeight[i] = (float)(vm_buttons_d[i].height * 2) / (float)using_flags->get_screen_height();
246 vertex_button[i] = new QOpenGLVertexArrayObject;
247 if(vertex_button[i] != NULL) {
248 if(vertex_button[i]->create()) {
249 VertexTexCoord_t vt[4];
251 vt[0].x = fButtonX[i];
252 vt[0].y = fButtonY[i];
257 vt[1].x = fButtonX[i] + fButtonWidth[i];
258 vt[1].y = fButtonY[i];
263 vt[2].x = fButtonX[i] + fButtonWidth[i];
264 vt[2].y = fButtonY[i] - fButtonHeight[i];
269 vt[3].x = fButtonX[i];
270 vt[3].y = fButtonY[i] - fButtonHeight[i];
275 vertexButtons->append(vt[0]);
276 vertexButtons->append(vt[1]);
277 vertexButtons->append(vt[2]);
278 vertexButtons->append(vt[3]);
279 vertex_button[i]->bind();
280 buffer_button_vertex[i]->bind();
281 buffer_button_vertex[i]->allocate(4 * sizeof(VertexTexCoord_t));
283 buffer_button_vertex[i]->setUsagePattern(QOpenGLBuffer::StaticDraw);
284 buffer_button_vertex[i]->release();
285 vertex_button[i]->release();
286 setNormalVAO(button_shader, vertex_button[i],
287 buffer_button_vertex[i],
294 if(using_flags->is_use_one_board_computer()) {
295 buffer_bitmap_vertex = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
296 vertex_bitmap = new QOpenGLVertexArrayObject;
297 vertexBitmap[0].x = -1.0f;
298 vertexBitmap[0].y = -1.0f;
299 vertexBitmap[0].z = -0.1f;
300 vertexBitmap[0].s = 0.0f;
301 vertexBitmap[0].t = 0.0f;
303 vertexBitmap[1].x = +1.0f;
304 vertexBitmap[1].y = -1.0f;
305 vertexBitmap[1].z = -0.1f;
306 vertexBitmap[1].s = 1.0f;
307 vertexBitmap[1].t = 0.0f;
309 vertexBitmap[2].x = +1.0f;
310 vertexBitmap[2].y = +1.0f;
311 vertexBitmap[2].z = -0.1f;
312 vertexBitmap[2].s = 1.0f;
313 vertexBitmap[2].t = 1.0f;
315 vertexBitmap[3].x = -1.0f;
316 vertexBitmap[3].y = +1.0f;
317 vertexBitmap[3].z = -0.1f;
318 vertexBitmap[3].s = 0.0f;
319 vertexBitmap[3].t = 1.0f;
321 if(vertex_bitmap != NULL) {
322 if(vertex_bitmap->create()) {
323 buffer_bitmap_vertex->create();
324 buffer_bitmap_vertex->setUsagePattern(QOpenGLBuffer::StaticDraw);
328 c = QVector4D(1.0, 1.0, 1.0, 1.0);
329 bitmap_shader->setUniformValue("color", c);
331 vertex_bitmap->bind();
332 buffer_bitmap_vertex->bind();
333 buffer_bitmap_vertex->allocate(sizeof(vertexBitmap));
334 buffer_bitmap_vertex->release();
335 vertex_bitmap->release();
336 setNormalVAO(bitmap_shader, vertex_bitmap,
337 buffer_bitmap_vertex,
343 extfunc->glClearColor(0.0, 0.0, 0.0, 1.0);
346 void GLDraw_2_0::initLocalGLObjects(void)
348 main_shader = new QOpenGLShaderProgram(p_wid);
349 if(main_shader != NULL) {
350 main_shader->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex_shader.glsl");
351 main_shader->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/chromakey_fragment_shader.glsl");
354 buffer_screen_vertex = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
355 vertex_screen = new QOpenGLVertexArrayObject;
357 vertexFormat[0].x = -0.5f;
358 vertexFormat[0].y = -0.5f;
359 vertexFormat[0].z = -0.9f;
360 vertexFormat[0].s = 0.0f;
361 vertexFormat[0].t = 1.0f;
363 vertexFormat[1].x = +0.5f;
364 vertexFormat[1].y = -0.5f;
365 vertexFormat[1].z = -0.9f;
366 vertexFormat[1].s = 1.0f;
367 vertexFormat[1].t = 1.0f;
369 vertexFormat[2].x = +0.5f;
370 vertexFormat[2].y = +0.5f;
371 vertexFormat[2].z = -0.9f;
372 vertexFormat[2].s = 1.0f;
373 vertexFormat[2].t = 0.0f;
375 vertexFormat[3].x = -0.5f;
376 vertexFormat[3].y = +0.5f;
377 vertexFormat[3].z = -0.9f;
378 vertexFormat[3].s = 0.0f;
379 vertexFormat[3].t = 0.0f;
380 if(buffer_screen_vertex != NULL) {
381 if(buffer_screen_vertex->create()) {
384 c = QVector4D(1.0, 1.0, 1.0, 1.0);
385 main_shader->setUniformValue("color", c);
388 buffer_screen_vertex->create();
389 buffer_screen_vertex->setUsagePattern(QOpenGLBuffer::DynamicDraw);
391 if(vertex_screen != NULL) vertex_screen->bind();
392 buffer_screen_vertex->bind();
393 buffer_screen_vertex->allocate(sizeof(VertexTexCoord_t) * 4);
394 if(vertex_screen != NULL) vertex_screen->release();
395 buffer_screen_vertex->release();
396 setNormalVAO(main_shader, vertex_screen,
397 buffer_screen_vertex,
403 void GLDraw_2_0::doSetGridsHorizonal(int lines, bool force)
409 if((lines == vert_lines) && !force) return;
412 if(vert_lines <= 0) return;
413 if(vert_lines > using_flags->get_screen_height()) vert_lines = using_flags->get_screen_height();
415 delta = (2.0f * screen_height) / (float)vert_lines;
416 yf = yf - delta * 1.0f;
417 if(glHorizGrids != NULL) {
418 for(i = 0; i < (vert_lines + 1) ; i++) {
419 glHorizGrids[i * 6] = -screen_width; // XBegin
420 glHorizGrids[i * 6 + 3] = +screen_width; // XEnd
421 glHorizGrids[i * 6 + 1] = yf; // YBegin
422 glHorizGrids[i * 6 + 4] = yf; // YEnd
423 glHorizGrids[i * 6 + 2] = -0.95f; // ZBegin
424 glHorizGrids[i * 6 + 5] = -0.95f; // ZEnd
430 void GLDraw_2_0::doSetGridsVertical(int pixels, bool force)
436 if((pixels == horiz_pixels) && !force) return;
437 horiz_pixels = pixels;
438 if(horiz_pixels <= 0) return;
439 if(horiz_pixels > using_flags->get_screen_width()) horiz_pixels = using_flags->get_screen_width();
442 delta = (2.0f * screen_width) / (float)horiz_pixels;
443 xf = xf - delta * 0.75f;
444 if(glVertGrids != NULL) {
445 if(horiz_pixels > using_flags->get_screen_width()) horiz_pixels = using_flags->get_screen_width();
446 for(i = 0; i < (horiz_pixels + 1) ; i++) {
447 glVertGrids[i * 6] = xf; // XBegin
448 glVertGrids[i * 6 + 3] = xf; // XEnd
449 glVertGrids[i * 6 + 1] = -screen_height; // YBegin
450 glVertGrids[i * 6 + 4] = screen_height; // YEnd
451 glVertGrids[i * 6 + 2] = -0.95f; // ZBegin
452 glVertGrids[i * 6 + 5] = -0.95f; // ZEnd
457 void GLDraw_2_0::drawGridsMain(GLfloat *tp,
462 if(number <= 0) return;
463 extfunc->glDisable(GL_TEXTURE_2D);
464 extfunc->glDisable(GL_DEPTH_TEST);
465 extfunc->glDisable(GL_BLEND);
470 extfunc->glColor4f(color.x(), color.y(), color.z(), color.w());
471 extfunc->glLineWidth(lineWidth);
472 extfunc->glBegin(GL_LINES);
473 for(i = 0; i < (number + 1); i++) {
474 extfunc->glVertex3f(tp[p + 0], tp[p + 1], tp[p + 2]);
475 extfunc->glVertex3f(tp[p + 3], tp[p + 4], tp[p + 5]);
483 void GLDraw_2_0::drawGridsHorizonal(void)
485 QVector4D c= QVector4D(0.0f, 0.0f, 0.0f, 1.0f);
486 drawGridsMain(glHorizGrids,
492 void GLDraw_2_0::drawGridsVertical(void)
494 QVector4D c= QVector4D(0.0f, 0.0f, 0.0f, 1.0f);
495 drawGridsMain(glVertGrids,
502 void GLDraw_2_0::drawGrids(void)
504 gl_grid_horiz = using_flags->get_config_ptr()->opengl_scanline_horiz;
505 gl_grid_vert = using_flags->get_config_ptr()->opengl_scanline_vert;
506 if(gl_grid_horiz && (vert_lines > 0)) {
507 drawGridsHorizonal();
509 if(using_flags->is_use_vertical_pixel_lines()) {
510 if(gl_grid_vert && (horiz_pixels > 0)) {
516 void GLDraw_2_0::updateButtonTexture(void)
524 QFont font = QFont(QString::fromUtf8("Sans"));
525 if(button_updated) return;
526 col.setRgb(0, 0, 0, 255);
528 button_desc_t *vm_buttons_d = using_flags->get_vm_buttons();
529 if(vm_buttons_d != NULL) {
530 for(i = 0; i < using_flags->get_max_button(); i++) {
531 img = new QImage(vm_buttons_d[i].width * 4, vm_buttons_d[i].height * 4, QImage::Format_RGB32);
532 painter = new QPainter(img);
533 painter->setRenderHint(QPainter::Antialiasing, true);
534 col.setRgb(255, 255, 255, 255);
535 if(strlen(vm_buttons_d[i].caption) <= 3) {
536 font.setPixelSize((vm_buttons_d[i].width * 4) / 2);
538 font.setPixelSize((vm_buttons_d[i].width * 4) / 4);
540 painter->fillRect(0, 0, vm_buttons_d[i].width * 4, vm_buttons_d[i].height * 4, col);
541 painter->setFont(font);
542 //painter->setPen(pen);
543 rect.setWidth(vm_buttons_d[i].width * 4);
544 rect.setHeight(vm_buttons_d[i].height * 4);
547 painter->drawText(rect, Qt::AlignCenter, QString::fromUtf8(vm_buttons_d[i].caption));
548 if(uButtonTextureID[i] != 0) {
549 p_wid->deleteTexture(uButtonTextureID[i]);
551 uButtonTextureID[i] = p_wid->bindTexture(*img);
557 button_updated = true;
560 void GLDraw_2_0::drawButtons()
563 //updateButtonTexture();
564 for(i = 0; i < using_flags->get_max_button(); i++) {
566 VertexTexCoord_t vt[4];
567 vt[0].x = fButtonX[i];
568 vt[0].y = fButtonY[i];
573 vt[1].x = fButtonX[i] + fButtonWidth[i];
574 vt[1].y = fButtonY[i];
579 vt[2].x = fButtonX[i] + fButtonWidth[i];
580 vt[2].y = fButtonY[i] - fButtonHeight[i];
585 vt[3].x = fButtonX[i];
586 vt[3].y = fButtonY[i] - fButtonHeight[i];
590 c = QVector4D(1.0, 1.0, 1.0, 1.0);
591 drawMain(button_shader, vertex_button[i],
592 buffer_button_vertex[i],
600 void GLDraw_2_0::drawBitmapTexture(void)
602 if(using_flags->is_use_one_board_computer()) {
604 c = QVector4D(1.0, 1.0, 1.0, 1.0);
605 drawMain(bitmap_shader, vertex_bitmap,
606 buffer_bitmap_vertex,
613 void GLDraw_2_0::drawScreenTexture(void)
615 if(using_flags->is_use_one_board_computer()) {
616 if(uBitmapTextureID != 0) {
617 extfunc->glEnable(GL_BLEND);
618 extfunc->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
621 extfunc->glDisable(GL_BLEND);
625 smoosing = using_flags->get_config_ptr()->use_opengl_filters;
627 color = QVector4D(fBrightR, fBrightG, fBrightB, 1.0);
629 color = QVector4D(1.0, 1.0, 1.0, 1.0);
631 if(using_flags->is_use_one_board_computer()) {
632 QVector3D cc = QVector3D(0.0, 0.0, 0.0);
633 drawMain(main_shader, vertex_screen,
634 buffer_screen_vertex,
636 uVramTextureID, // v2.0
639 extfunc->glDisable(GL_BLEND);
641 drawMain(main_shader, vertex_screen,
642 buffer_screen_vertex,
644 uVramTextureID, // v2.0
649 void GLDraw_2_0::drawMain(QOpenGLShaderProgram *prg,
650 QOpenGLVertexArrayObject *vp,
652 VertexTexCoord_t *vertex_data,
661 extfunc->glEnable(GL_TEXTURE_2D);
663 //extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
664 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
665 extfunc->glBindTexture(GL_TEXTURE_2D, texid);
668 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
669 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
671 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
672 extfunc->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
675 if((bp != NULL) && (vp != NULL) && (prg != NULL)) {
676 if((bp->isCreated()) && (vp->isCreated()) && (prg->isLinked())) {
680 prg->setUniformValue("a_texture", 0);
681 prg->setUniformValue("color", color);
682 prg->setUniformValue("tex_width", (float)screen_texture_width);
683 prg->setUniformValue("tex_height", (float)screen_texture_height);
684 if(using_flags->is_use_screen_rotate()) {
685 if(using_flags->get_config_ptr()->rotate_type) {
686 prg->setUniformValue("rotate", GL_TRUE);
688 prg->setUniformValue("rotate", GL_FALSE);
691 prg->setUniformValue("rotate", GL_FALSE);
694 prg->setUniformValue("chromakey", chromakey);
695 prg->setUniformValue("do_chromakey", GL_TRUE);
697 prg->setUniformValue("do_chromakey", GL_FALSE);
699 int vertex_loc = prg->attributeLocation("vertex");
700 int texcoord_loc = prg->attributeLocation("texcoord");
701 prg->setAttributeBuffer(vertex_loc, GL_FLOAT, 0, 3, sizeof(VertexTexCoord_t));
702 prg->setAttributeBuffer(texcoord_loc, GL_FLOAT, 3 * sizeof(GLfloat), 2, sizeof(VertexTexCoord_t));
703 prg->enableAttributeArray(vertex_loc);
704 prg->enableAttributeArray(texcoord_loc);
706 extfunc->glEnableClientState(GL_VERTEX_ARRAY);
707 extfunc->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
708 extfunc->glColor3f(1.0f, 1.0f, 1.0f);
710 extfunc->glVertexPointer(3, GL_FLOAT, sizeof(VertexTexCoord_t), (void *)0);
711 extfunc->glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTexCoord_t), (void *)(0 + 3 * sizeof(GLfloat)));
712 extfunc->glDrawArrays(GL_POLYGON, 0, 4);
713 extfunc->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
714 extfunc->glDisableClientState(GL_VERTEX_ARRAY);
719 extfunc->glBindTexture(GL_TEXTURE_2D, 0);
720 extfunc->glDisable(GL_TEXTURE_2D);
727 extfunc->glBegin(GL_POLYGON);
728 for(i = 0; i < 4; i++) {
729 extfunc->glTexCoord2f(vertex_data[i].s, vertex_data[i].t);
730 extfunc->glVertex3f(vertex_data[i].x, vertex_data[i].y, vertex_data[i].z);
733 extfunc->glBindTexture(GL_TEXTURE_2D, 0);
734 extfunc->glDisable(GL_TEXTURE_2D);
739 void GLDraw_2_0::uploadBitmapTexture(QImage *p)
742 if(!using_flags->is_use_one_board_computer()) return;
743 if(p == NULL) return;
744 if(!bitmap_uploaded) {
745 if(uBitmapTextureID != 0) {
746 p_wid->deleteTexture(uBitmapTextureID);
748 uBitmapTextureID = p_wid->bindTexture(*p);
749 bitmap_uploaded = true;
754 void GLDraw_2_0::updateBitmap(QImage *p)
756 if(!using_flags->is_use_one_board_computer()) return;
757 redraw_required = true;
758 bitmap_uploaded = false;
759 uploadBitmapTexture(p);
762 void GLDraw_2_0::uploadMainTexture(QImage *p, bool use_chromakey)
765 redraw_required = true;
767 if(p == NULL) return;
771 if(vertex_screen == NULL) {
774 if(!vertex_screen->isCreated()) checkf = true;
776 if(buffer_screen_vertex == NULL) {
779 if(!buffer_screen_vertex->isCreated()) checkf = true;
781 if(main_shader == NULL) {
784 if(!main_shader->isLinked()) checkf = true;
787 QColor mask = QColor(0, 0, 0, 255);
788 QImage pp = p->QImage::createMaskFromColor(mask.rgba(), Qt::MaskOutColor);
789 if(uVramTextureID == 0) {
790 uVramTextureID = p_wid->bindTexture(pp);
792 extfunc->glBindTexture(GL_TEXTURE_2D, uVramTextureID);
793 extfunc->glTexSubImage2D(GL_TEXTURE_2D, 0,
795 pp.width(), pp.height(),
796 GL_BGRA, GL_UNSIGNED_BYTE, pp.constBits());
797 extfunc->glBindTexture(GL_TEXTURE_2D, 0);
802 // Upload to main texture
803 if(uVramTextureID == 0) {
804 uVramTextureID = p_wid->bindTexture(*p);
806 extfunc->glBindTexture(GL_TEXTURE_2D, uVramTextureID);
807 extfunc->glTexSubImage2D(GL_TEXTURE_2D, 0,
809 p->width(), p->height(),
810 GL_BGRA, GL_UNSIGNED_BYTE, p->constBits());
811 extfunc->glBindTexture(GL_TEXTURE_2D, 0);
816 void GLDraw_2_0::resizeGL(int width, int height)
818 int side = qMin(width, height);
821 extfunc->glViewport(0, 0, width, height);
822 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
824 if(!using_flags->is_use_one_board_computer() && (using_flags->get_max_button() <= 0)) {
825 doSetGridsHorizonal(vert_lines, true);
826 if(using_flags->is_use_vertical_pixel_lines()) {
827 doSetGridsVertical(horiz_pixels, true);
830 vertexFormat[0].x = -screen_width;
831 vertexFormat[0].y = -screen_height;
833 vertexFormat[1].x = +screen_width;
834 vertexFormat[1].y = -screen_height;
836 vertexFormat[2].x = +screen_width;
837 vertexFormat[2].y = +screen_height;
839 vertexFormat[3].x = -screen_width;
840 vertexFormat[3].y = +screen_height;
842 if(buffer_screen_vertex->isCreated()) {
843 setNormalVAO(main_shader, vertex_screen,
844 buffer_screen_vertex,
847 if(using_flags->is_use_one_board_computer()) {
848 if(vertex_bitmap->isCreated()) {
849 #if !defined(BITMAP_OFFSET_X)
850 #define BITMAP_OFFSET_X 0
852 #if !defined(BITMAP_OFFSET_Y)
853 #define BITMAP_OFFSET_Y 0
855 vertexBitmap[0].x = -1.0f;
856 vertexBitmap[0].y = -1.0f;
858 vertexBitmap[1].x = 1.0f - (float)BITMAP_OFFSET_X / (float)using_flags->get_screen_width();
859 vertexBitmap[1].y = -1.0f;
861 vertexBitmap[2].x = 1.0f - (float)BITMAP_OFFSET_X / (float)using_flags->get_screen_width();
862 vertexBitmap[2].y = 1.0f - (float)BITMAP_OFFSET_Y * 2.0 / (float)using_flags->get_screen_height();
864 vertexBitmap[3].x = -1.0f;
865 vertexBitmap[3].y = 1.0f - (float)BITMAP_OFFSET_Y * 2.0 / (float)using_flags->get_screen_height();
867 setNormalVAO(bitmap_shader, vertex_bitmap,
868 buffer_bitmap_vertex,
872 if(using_flags->get_max_button() > 0) {
873 updateButtonTexture();
877 void GLDraw_2_0::paintGL(void)
880 if(crt_flag || redraw_required) { //return;
884 redraw_required = false;
885 extfunc->glViewport(0, 0, p_wid->width(), p_wid->height());
886 extfunc->glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0, 1.0);
888 extfunc->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
889 extfunc->glEnable(GL_DEPTH_TEST);
890 extfunc->glDisable(GL_BLEND);
891 if(using_flags->is_use_one_board_computer()) drawBitmapTexture();
894 * VRAMの表示:テクスチャ貼った四角形
897 extfunc->glDisable(GL_BLEND);
898 if(!using_flags->is_use_one_board_computer() && (using_flags->get_max_button() <= 0)) {
905 void GLDraw_2_0::paintGL_OffScreen(int count, int w, int h)
912 void GLDraw_2_0::do_set_screen_multiply(float mul)
914 screen_multiply = mul;
915 do_set_texture_size(imgptr, screen_texture_width, screen_texture_height);
919 void GLDraw_2_0::do_set_texture_size(QImage *p, int w, int h)
921 if(w <= 0) w = using_flags->get_screen_width();
922 if(h <= 0) h = using_flags->get_screen_height();
923 float wfactor = 1.0f;
924 float hfactor = 1.0f;
930 iw = (float)p->width();
931 ih = (float)p->height();
932 //if(screen_multiply < 1.0f) {
933 p_wid->makeCurrent();
934 screen_texture_width = w;
935 screen_texture_height = h;
936 vertexFormat[0].s = 0.0f;
937 vertexFormat[0].t = (float)hh / ih;
938 vertexFormat[1].s = (float)ww / iw;
939 vertexFormat[1].t = (float)hh / ih;
940 vertexFormat[2].s = (float)ww / iw;
941 vertexFormat[2].t = 0.0f;
942 vertexFormat[3].s = 0.0f;
943 vertexFormat[3].t = 0.0f;
945 setNormalVAO(main_shader, vertex_screen,
946 buffer_screen_vertex,
948 p_wid->doneCurrent();
950 this->doSetGridsHorizonal(h, true);
951 this->doSetGridsVertical(w, true);