commit
						2a7d7aaa66
					
				 8 changed files with 985 additions and 0 deletions
			
			
		| @ -0,0 +1,481 @@ | |||||
|  | #include <QImageReader> | ||||
|  | #include <QOpenGLFunctions> | ||||
|  | #include <QOpenGLBuffer> | ||||
|  | 
 | ||||
|  | #include "OpenGLHandler.h" | ||||
|  | 
 | ||||
|  | OpenGLHandler::OpenGLHandler() : _texture(QOpenGLTexture::Target2D) | ||||
|  | { | ||||
|  |     if(!_context.create()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't create GL _context."; | ||||
|  | 
 | ||||
|  |         return; | ||||
|  |     } | ||||
|  |     _surface.setFormat(_context.format()); | ||||
|  |     _surface.create(); | ||||
|  | 
 | ||||
|  |     if(!_surface.isValid()) | ||||
|  |     { | ||||
|  |         qDebug() << "_surface not valid."; | ||||
|  | 
 | ||||
|  |         return; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     if(!_context.makeCurrent(&_surface)) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't make _context current."; | ||||
|  | 
 | ||||
|  |         return; | ||||
|  |     } | ||||
|  |     _image = new QImage("/home/mmt/Desktop/Projects/OpenGLOffscreen/sono.jpg"); | ||||
|  |     _fbo = new QOpenGLFramebufferObject(_image->size()); | ||||
|  | 
 | ||||
|  |     _context.functions()->glViewport(0, 0, _image->width(), _image->height()); | ||||
|  |     fun = new QOpenGLFunctions_3_3_Core(); | ||||
|  | 
 | ||||
|  |     if(!fun->initializeOpenGLFunctions()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't init GL functions."; | ||||
|  | 
 | ||||
|  |         return; | ||||
|  |     } | ||||
|  |     _shader = new QOpenGLShaderProgram(&_context); | ||||
|  |     loadChars(); | ||||
|  | } | ||||
|  | 
 | ||||
|  | bool OpenGLHandler::prepareShader(QString vertexShader, QString fragmentShader) | ||||
|  | { | ||||
|  |     if(!_shader->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader)) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't add vertex shader."; | ||||
|  | 
 | ||||
|  |         return false; | ||||
|  |     } | ||||
|  |     if(!_shader->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader)) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't add fragment shader."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  |     if(!_shader->link()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't link program."; | ||||
|  | 
 | ||||
|  |         return false; | ||||
|  |     } | ||||
|  |     if(!_shader->bind()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't bind program."; | ||||
|  | 
 | ||||
|  |         return false; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     return true; | ||||
|  | } | ||||
|  | 
 | ||||
|  | bool OpenGLHandler::prepareTexture(const QImage& image) | ||||
|  | { | ||||
|  |     _texture.setData(image); | ||||
|  |     _texture.bind(); | ||||
|  |     if(!_texture.isBound()) | ||||
|  |     { | ||||
|  |         qDebug() << "Texture not bound."; | ||||
|  | 
 | ||||
|  |         return false; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     return true; | ||||
|  | } | ||||
|  | 
 | ||||
|  | bool OpenGLHandler::prepareCoords(QOpenGLBuffer vertexBuf, QOpenGLBuffer indexBuf) | ||||
|  | { | ||||
|  |     VertexData vertices[] = | ||||
|  |     { | ||||
|  |         {{ -0.5f, +0.5f }, { 0.0f, 0.0f }}, //top-left
 | ||||
|  |         {{ +0.5f, +0.5f }, { 1.0f, 0.0f }}, //top-right
 | ||||
|  |         {{ -0.5f, -0.5f }, { 0.0f, 1.0f }}, //bottom-left
 | ||||
|  |         {{ +0.5f, -0.5f }, { 1.0f, 1.0f }} //bottom-right
 | ||||
|  | //{{ -0.5f, +0.5f }, { 0.0f, 0.0f }}, //top-left
 | ||||
|  | //{{ +0.5f, +0.5f }, { 1.0f, 0.0f }}, //top-right
 | ||||
|  | //{{ -0.5f, -0.5f }, { 0.0f, 1.0f }}, //bottom-left
 | ||||
|  | //{{ +0.5f, -0.5f }, { 1.0f, 1.0f }} //bottom-right
 | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     GLuint indices[] = | ||||
|  |     { | ||||
|  |         0, 1, 2, 3 | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     if(!vertexBuf.create()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't create vertex buffer."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     if(!indexBuf.create()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't create index buffer."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     if(!vertexBuf.bind()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't bind vertex buffer."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  |     vertexBuf.allocate(vertices, 4 * sizeof(VertexData)); | ||||
|  |     if(!indexBuf.bind()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't bind index buffer."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  |     indexBuf.allocate(indices, 4 * sizeof(GLuint)); | ||||
|  | 
 | ||||
|  |     return true; | ||||
|  | } | ||||
|  | 
 | ||||
|  | void OpenGLHandler::loadChars() | ||||
|  | { | ||||
|  |     if(FT_Init_FreeType(&_ft)) | ||||
|  |     { | ||||
|  |         qDebug() << "ERROR::FREETYPE: Could not init FreeType Library"; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     if(FT_New_Face(_ft, "/home/mmt/.fonts/Roboto-Black.ttf", 0, &_face)) | ||||
|  |     { | ||||
|  |         qDebug() << "ERROR::FREETYPE: Failed to load font"; | ||||
|  |     } | ||||
|  |     FT_Set_Pixel_Sizes(_face, 0, 48); | ||||
|  |     if(FT_Load_Char(_face, 'X', FT_LOAD_RENDER)) | ||||
|  |     { | ||||
|  |         qDebug() << "ERROR::FREETYTPE: Failed to load Glyph"; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //disable byte-alignment restriction
 | ||||
|  | 
 | ||||
|  |     int i = 0; | ||||
|  |     for(unsigned char c = 0; c < 128; c++) | ||||
|  |     { | ||||
|  |         //load character glyph
 | ||||
|  |         if(FT_Load_Char(_face, c, FT_LOAD_RENDER)) | ||||
|  |         { | ||||
|  |             qDebug() << "ERROR::FREETYTPE: Failed to load Glyph\n"; | ||||
|  |             continue; | ||||
|  |         } | ||||
|  | //// generate texture
 | ||||
|  |         unsigned int texture; | ||||
|  |         glGenTextures(1, &texture); | ||||
|  |         glBindTexture(GL_TEXTURE_2D, texture); | ||||
|  |         glTexImage2D( | ||||
|  |             GL_TEXTURE_2D, | ||||
|  |             0, | ||||
|  |             GL_RED, | ||||
|  |             _face->glyph->bitmap.width, | ||||
|  |             _face->glyph->bitmap.rows, | ||||
|  |             0, | ||||
|  |             GL_RED, | ||||
|  |             GL_UNSIGNED_BYTE, | ||||
|  |             _face->glyph->bitmap.buffer | ||||
|  |             ); | ||||
|  | //qDebug() << _face->glyph->bitmap.palette_mode;
 | ||||
|  | //QImage chImage(_face->glyph->bitmap.buffer, _face->glyph->bitmap.width,
 | ||||
|  | //_face->glyph->bitmap.rows,
 | ||||
|  | //QImage::Format::Format_Grayscale8);
 | ||||
|  | //chImage.save("/home/mmt/Desktop/chr/" + static_cast<QString>(i++) + ".png");
 | ||||
|  | 
 | ||||
|  | //// set texture options
 | ||||
|  |         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | ||||
|  |         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | ||||
|  |         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|  |         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
|  |         //now store character for later use
 | ||||
|  |         Character character = { | ||||
|  |             texture, | ||||
|  |             glm::ivec2(_face->glyph->bitmap.width, _face->glyph->bitmap.rows), | ||||
|  |             glm::ivec2(_face->glyph->bitmap_left, _face->glyph->bitmap_top), | ||||
|  |             _face->glyph->advance.x | ||||
|  |         }; | ||||
|  |         _characters.insert(c, character); | ||||
|  |     } | ||||
|  |     glBindTexture(GL_TEXTURE_2D, 0); | ||||
|  |     FT_Done_Face(_face); | ||||
|  |     FT_Done_FreeType(_ft); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void OpenGLHandler::processText() | ||||
|  | { | ||||
|  |     QString vertexShadre = | ||||
|  |         "#version 330 core\n" | ||||
|  |         "layout (location = 4) in vec4 vertex;" | ||||
|  |         "out vec2 TexCoords;" | ||||
|  |         "uniform mat4 projection;" | ||||
|  |         "void main()" | ||||
|  |         "{" | ||||
|  |         "    gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);" | ||||
|  |         "    TexCoords.x = vertex.z;" | ||||
|  |         "    TexCoords.y = vertex.w;" | ||||
|  |         "}"; | ||||
|  |     QString fragShadre = | ||||
|  |         "#version 330 core\n" | ||||
|  |         "in vec2 TexCoords;" | ||||
|  |         "out vec4 color;" | ||||
|  |         "uniform sampler2D text;" | ||||
|  |         "uniform vec3 textColor;" | ||||
|  |         "void main()" | ||||
|  |         "{" | ||||
|  |         "    vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);" | ||||
|  |         "    color = vec4(textColor, 1.00) * sampled;" | ||||
|  |         "}"; | ||||
|  |     prepareShader(vertexShadre, fragShadre); | ||||
|  | //_shader->link();
 | ||||
|  | //_shader->bind();
 | ||||
|  | //fun->glEnable(GL_CULL_FACE);
 | ||||
|  |     fun->glEnable(GL_BLEND); | ||||
|  | //glBlendFunc(GL_ONE, GL_ZERO);
 | ||||
|  |     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
|  |     QMatrix4x4 qProjection; | ||||
|  |     QRect temp(0.0f, static_cast<float>(320), 0.0f, static_cast<float>(480)); | ||||
|  |     qProjection.ortho(temp); | ||||
|  |     _shader->setUniformValueArray(_shader->uniformLocation("projection"), &qProjection, 1); | ||||
|  |     fun->glGenVertexArrays(1, &chVAO); | ||||
|  |     fun->glGenBuffers(1, &chVBO); | ||||
|  |     fun->glBindVertexArray(chVAO); | ||||
|  |     fun->glBindBuffer(GL_ARRAY_BUFFER, chVBO); | ||||
|  |     fun->glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW); | ||||
|  |     fun->glEnableVertexAttribArray(4); | ||||
|  |     fun->glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0); | ||||
|  |     fun->glBindBuffer(GL_ARRAY_BUFFER, 0); | ||||
|  |     fun->glBindVertexArray(0); | ||||
|  | 
 | ||||
|  |     RenderText("This is sample text", -0.8f, -.8f, .003f, glm::vec3(0.5, 0.8f, 0.2f)); | ||||
|  |     RenderText("(C) LearnOpenGL.com", -0.5f, 0.00f, 0.005f, glm::vec3(0.3, 0.7f, 0.9f)); | ||||
|  |     //glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
 | ||||
|  |     //-------------------------------------------------------------------------------
 | ||||
|  | //glfwSwapBuffers(_window);
 | ||||
|  | //glfwPollEvents();
 | ||||
|  |     auto log = _shader->log(); | ||||
|  |     if(log != "") | ||||
|  |     { | ||||
|  |         qDebug() << "log : " << log; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     fun->glDeleteVertexArrays(1, &chVAO); | ||||
|  |     fun->glDeleteBuffers(1, &chVBO); | ||||
|  |     _shader->removeAllShaders(); | ||||
|  |     fun->glDisable(GL_BLEND); | ||||
|  |     glDisable(GL_CULL_FACE); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void OpenGLHandler::RenderText(std::string text, float x, float y, float scale, glm::vec3 color) | ||||
|  | { | ||||
|  |     //activate corresponding render state
 | ||||
|  |     _shader->setUniformValue(_shader->uniformLocation("textColor"), color.x, color.y, color.z); | ||||
|  |     glActiveTexture(GL_TEXTURE0); | ||||
|  |     fun->glBindVertexArray(chVAO); | ||||
|  | 
 | ||||
|  |     //iterate through all characters
 | ||||
|  |     std::string::const_iterator c; | ||||
|  |     for(c = text.begin(); c != text.end(); c++) | ||||
|  |     { | ||||
|  | //qDebug() << "here";
 | ||||
|  |         Character ch = _characters[*c]; | ||||
|  | 
 | ||||
|  |         float xpos = x + ch.Bearing.x * scale; | ||||
|  |         float ypos = y - (ch.Size.y - ch.Bearing.y) * scale; | ||||
|  |         //qDebug() << "xpos = " << xpos;
 | ||||
|  |         float w = ch.Size.x * scale; | ||||
|  |         float h = ch.Size.y * scale; | ||||
|  | //qDebug() << ypos + h;
 | ||||
|  |         //update VBO for each character
 | ||||
|  |         float vertices[6][4] = { | ||||
|  |             { xpos, ypos + h, 0.0f, 0.0f }, | ||||
|  |             { xpos, ypos, 0.0f, 1.0f }, | ||||
|  |             { xpos + w, ypos, 1.0f, 1.0f }, | ||||
|  | 
 | ||||
|  |             { xpos, ypos + h, 0.0f, 0.0f }, | ||||
|  |             { xpos + w, ypos, 1.0f, 1.0f }, | ||||
|  |             { xpos + w, ypos + h, 1.0f, 0.0f } | ||||
|  |         }; | ||||
|  |         //render glyph texture over quad
 | ||||
|  |         glBindTexture(GL_TEXTURE_2D, ch.TextureID); | ||||
|  |         //update content of VBO memory
 | ||||
|  |         fun->glBindBuffer(GL_ARRAY_BUFFER, chVBO); | ||||
|  |         fun->glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); //be sure to use
 | ||||
|  |         //glBufferSubData and not
 | ||||
|  |         //glBufferData
 | ||||
|  | 
 | ||||
|  |         fun->glBindBuffer(GL_ARRAY_BUFFER, 0); | ||||
|  |         //render quad
 | ||||
|  |         glDrawArrays(GL_TRIANGLES, 0, 6); | ||||
|  |         //now advance cursors for next glyph (note that advance is number of 1/64 pixels)
 | ||||
|  |         x += (ch.Advance >> 6) * scale; //bitshift by 6 to get value in pixels (2^6 = 64 (divide
 | ||||
|  |                                         //amount of 1/64th pixels by 64 to get amount of pixels))
 | ||||
|  |     } | ||||
|  |     fun->glBindVertexArray(0); | ||||
|  |     glBindTexture(GL_TEXTURE_2D, 0); | ||||
|  | } | ||||
|  | 
 | ||||
|  | bool OpenGLHandler::prepareCoords2(QOpenGLBuffer vertexBuf, QOpenGLBuffer indexBuf) | ||||
|  | { | ||||
|  |     VertexData vertices[] = | ||||
|  |     { | ||||
|  |         {{ -1.0f, +1.0f }, { 0.0f, 1.0f }}, //top-left
 | ||||
|  |         {{ +1.0f, +1.0f }, { 1.0f, 1.0f }},     //top-right
 | ||||
|  |         {{ -1.0f, -1.0f }, { 0.0f, 0.0f }},     //bottom-left
 | ||||
|  |         {{ +1.0f, -1.0f }, { 1.0f, 0.0f }}      //bottom-right
 | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     GLuint indices[] = | ||||
|  |     { | ||||
|  |         0, 1, 2, 3 | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     if(!vertexBuf.create()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't create vertex buffer."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     if(!indexBuf.create()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't create index buffer."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     if(!vertexBuf.bind()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't bind vertex buffer."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  |     vertexBuf.allocate(vertices, 4 * sizeof(VertexData)); | ||||
|  |     if(!indexBuf.bind()) | ||||
|  |     { | ||||
|  |         qDebug() << "Can't bind index buffer."; | ||||
|  | 
 | ||||
|  |         return {}; | ||||
|  |     } | ||||
|  |     indexBuf.allocate(indices, 4 * sizeof(GLuint)); | ||||
|  | 
 | ||||
|  |     return true; | ||||
|  | } | ||||
|  | 
 | ||||
|  | QString OpenGLHandler::getImage(QImage img) | ||||
|  | { | ||||
|  |     QByteArray byteArray; | ||||
|  |     QBuffer buffer(&byteArray); | ||||
|  |     buffer.open(QIODevice::WriteOnly); | ||||
|  |     img.save(&buffer, "png"); | ||||
|  |     //save image data in string
 | ||||
|  |     QString image("data:image/png;base64,"); | ||||
|  |     image.append(QString::fromLatin1(byteArray.toBase64().data())); | ||||
|  | 
 | ||||
|  |     return image; | ||||
|  | } | ||||
|  | 
 | ||||
|  | OpenGLHandler::~OpenGLHandler() | ||||
|  | { | ||||
|  |     delete _image; | ||||
|  |     delete _fbo; | ||||
|  |     delete _shader; | ||||
|  | } | ||||
|  | 
 | ||||
|  | void OpenGLHandler::processImage(const QImage& image, | ||||
|  |                                  const QString& vertexShader, | ||||
|  |                                  const QString& fragmentShader, | ||||
|  |                                  const QString& textureVar, | ||||
|  |                                  const QString& vertexPosVar, | ||||
|  |                                  const QString& textureCoordVar) | ||||
|  | { | ||||
|  | //fun->glEnable(GL_BLEND);
 | ||||
|  |     bool a; | ||||
|  |     QOpenGLBuffer vertexBuf(QOpenGLBuffer::VertexBuffer); | ||||
|  |     QOpenGLBuffer indexBuf(QOpenGLBuffer::IndexBuffer); | ||||
|  |     a = prepareShader(vertexShader, fragmentShader); | ||||
|  |     a = prepareTexture(image); | ||||
|  |     a = prepareCoords(vertexBuf, indexBuf); | ||||
|  | 
 | ||||
|  |     int offset = 0; | ||||
|  |     _shader->enableAttributeArray(vertexPosVar.toLatin1().data()); | ||||
|  |     _shader->setAttributeBuffer(vertexPosVar.toLatin1().data(), GL_FLOAT, offset, 2, | ||||
|  |                                 sizeof(VertexData)); | ||||
|  |     offset += sizeof(QVector2D); | ||||
|  |     _shader->enableAttributeArray(textureCoordVar.toLatin1().data()); | ||||
|  |     _shader->setAttributeBuffer(textureCoordVar.toLatin1().data(), GL_FLOAT, offset, 2, | ||||
|  |                                 sizeof(VertexData)); | ||||
|  | 
 | ||||
|  |     _shader->setUniformValue(textureVar.toLatin1().data(), 0); | ||||
|  | 
 | ||||
|  |     fun->glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, Q_NULLPTR); | ||||
|  | 
 | ||||
|  |     _shader->disableAttributeArray(vertexPosVar.toLatin1().data()); | ||||
|  |     _shader->disableAttributeArray(textureCoordVar.toLatin1().data()); | ||||
|  |     _shader->disableAttributeArray(textureVar.toLatin1().data()); | ||||
|  | 
 | ||||
|  |     _shader->removeAllShaders(); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void OpenGLHandler::flipImage() | ||||
|  | { | ||||
|  |     QString textureVar = "texture"; | ||||
|  |     QString vertexPosVar = "aPosition"; | ||||
|  |     QString textureCoordVar = "aTexCoord"; | ||||
|  |     QString flipVertexShader = | ||||
|  |         "attribute vec4 aPosition;\n" | ||||
|  |         "attribute vec2 aTexCoord;\n" | ||||
|  |         "varying vec2 vTexCoord;\n" | ||||
|  |         "void main()\n" | ||||
|  |         "{\n" | ||||
|  |         "   gl_Position = aPosition;\n" | ||||
|  |         "   vTexCoord.x = -aTexCoord.x;\n" | ||||
|  |         "   vTexCoord.y = aTexCoord.y;\n" | ||||
|  |         "}"; | ||||
|  |     QString flipFragmentShader = | ||||
|  |         "uniform sampler2D texture;\n" | ||||
|  |         "varying vec2 vTexCoord;\n" | ||||
|  |         "void main()\n" | ||||
|  |         "{\n" | ||||
|  |         "   gl_FragColor = texture2D(texture, vTexCoord);\n" | ||||
|  |         "}"; | ||||
|  |     prepareShader(flipVertexShader, ""); | ||||
|  |     QOpenGLBuffer vertexBuf(QOpenGLBuffer::VertexBuffer); | ||||
|  |     QOpenGLBuffer indexBuf(QOpenGLBuffer::IndexBuffer); | ||||
|  |     prepareCoords2(vertexBuf, indexBuf); | ||||
|  | 
 | ||||
|  |     int offset = 0; | ||||
|  |     _shader->enableAttributeArray(vertexPosVar.toLatin1().data()); | ||||
|  |     _shader->setAttributeBuffer(vertexPosVar.toLatin1().data(), GL_FLOAT, offset, 2, | ||||
|  |                                 sizeof(VertexData)); | ||||
|  |     offset += sizeof(QVector2D); | ||||
|  |     _shader->enableAttributeArray(textureCoordVar.toLatin1().data()); | ||||
|  |     _shader->setAttributeBuffer(textureCoordVar.toLatin1().data(), GL_FLOAT, offset, 2, | ||||
|  |                                 sizeof(VertexData)); | ||||
|  | 
 | ||||
|  |     _shader->setUniformValue(textureVar.toLatin1().data(), 0); | ||||
|  |     fun->glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, Q_NULLPTR); | ||||
|  |     _shader->disableAttributeArray(vertexPosVar.toLatin1().data()); | ||||
|  |     _shader->disableAttributeArray(textureCoordVar.toLatin1().data()); | ||||
|  |     _shader->disableAttributeArray(textureVar.toLatin1().data()); | ||||
|  |     _shader->removeAllShaders(); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void OpenGLHandler::run() | ||||
|  | { | ||||
|  | //fun->glClearColor(0, 1, 1, 1);
 | ||||
|  | //fun->glClear(GL_COLOR_BUFFER_BIT);
 | ||||
|  |     processImage(*_image, vertexShader, fragmentShader, "texture", "aPosition", | ||||
|  |                  "aTexCoord"); | ||||
|  |     processText(); | ||||
|  | //flipImage();
 | ||||
|  |     auto ret = _fbo->toImage(true); | ||||
|  | //auto address = getImage(ret);
 | ||||
|  | 
 | ||||
|  |     ret.save("/home/mmt/Desktop/test.png"); | ||||
|  | } | ||||
| @ -0,0 +1,90 @@ | |||||
|  | #ifndef OPENGLHANDLER_H | ||||
|  | #define OPENGLHANDLER_H | ||||
|  | 
 | ||||
|  | #include <QtCore> | ||||
|  | #include <QImage> | ||||
|  | #include <QOpenGLContext> | ||||
|  | #include <QOffscreenSurface> | ||||
|  | #include <QOpenGLFramebufferObject> | ||||
|  | #include <QOpenGLShaderProgram> | ||||
|  | #include <QOpenGLTexture> | ||||
|  | #include <QOpenGLBuffer> | ||||
|  | #include <ft2build.h> | ||||
|  | #include <glm/glm.hpp> | ||||
|  | #include <glm/gtc/matrix_transform.hpp> | ||||
|  | #include <glm/gtc/type_ptr.hpp> | ||||
|  | #include <QtGui/QOpenGLFunctions_3_3_Core> | ||||
|  | 
 | ||||
|  | #include FT_FREETYPE_H | ||||
|  | 
 | ||||
|  | struct VertexData | ||||
|  | { | ||||
|  |     QVector2D position; | ||||
|  |     QVector2D texCoord; | ||||
|  | }; | ||||
|  | 
 | ||||
|  | struct Character { | ||||
|  |     unsigned int TextureID;  //ID handle of the glyph texture
 | ||||
|  |     glm::ivec2 Size;         //Size of glyph
 | ||||
|  |     glm::ivec2 Bearing;      //Offset from baseline to left/top of glyph
 | ||||
|  |     long Advance;    //Offset to advance to next glyph
 | ||||
|  | }; | ||||
|  | 
 | ||||
|  | class OpenGLHandler | ||||
|  | { | ||||
|  | public: | ||||
|  |     OpenGLHandler(); | ||||
|  |     ~OpenGLHandler(); | ||||
|  | 
 | ||||
|  |     void run(); | ||||
|  |     void processImage(const QImage& image, | ||||
|  |                       const QString& vertexShader, | ||||
|  |                       const QString& fragmentShader, | ||||
|  |                       const QString& textureVar, | ||||
|  |                       const QString& vertexPosVar, | ||||
|  |                       const QString& textureCoordVar); | ||||
|  | 
 | ||||
|  | private: | ||||
|  |     QOpenGLFunctions_3_3_Core* fun; | ||||
|  |     QOpenGLContext _context; | ||||
|  |     QOffscreenSurface _surface; | ||||
|  |     QOpenGLFramebufferObject* _fbo; | ||||
|  |     QImage* _image; | ||||
|  |     QOpenGLShaderProgram* _shader; | ||||
|  |     QOpenGLTexture _texture; | ||||
|  |     FT_Library _ft; | ||||
|  |     FT_Face _face; | ||||
|  |     QMap<char, Character> _characters; | ||||
|  | 
 | ||||
|  |     QString vertexShader = | ||||
|  |         "attribute vec4 aPosition;\n" | ||||
|  |         "attribute vec2 aTexCoord;\n" | ||||
|  |         "varying vec2 vTexCoord;\n" | ||||
|  |         "void main()\n" | ||||
|  |         "{\n" | ||||
|  |         "   gl_Position = aPosition;\n" | ||||
|  |         "   vTexCoord = aTexCoord;\n" | ||||
|  |         "}"; | ||||
|  | 
 | ||||
|  |     QString fragmentShader = | ||||
|  |         "uniform sampler2D texture;\n" | ||||
|  |         "varying vec2 vTexCoord;\n" | ||||
|  |         "void main()\n" | ||||
|  |         "{\n" | ||||
|  |         "   gl_FragColor = texture2D(texture, vTexCoord);\n" | ||||
|  |         "}"; | ||||
|  | 
 | ||||
|  |     unsigned int chVAO, chVBO; | ||||
|  |     bool prepareShader(QString vertexShader, QString fragmentShader); | ||||
|  |     bool prepareTexture(const QImage& image); | ||||
|  |     bool prepareCoords(QOpenGLBuffer vertexBuf, QOpenGLBuffer indexBuf); | ||||
|  | 
 | ||||
|  |     void loadChars(); | ||||
|  |     void processText(); | ||||
|  |     void RenderText(std::string text, float x, float y, float scale, glm::vec3 color); | ||||
|  |     bool prepareCoords2(QOpenGLBuffer vertexBuf, QOpenGLBuffer indexBuf); | ||||
|  |     void flipImage(); | ||||
|  |     QString getImage(QImage img); | ||||
|  | }; | ||||
|  | 
 | ||||
|  | #endif //OPENGLHANDLER_H
 | ||||
| @ -0,0 +1,38 @@ | |||||
|  | QT += quick | ||||
|  | 
 | ||||
|  | CONFIG += c++11 | ||||
|  | 
 | ||||
|  | # The following define makes your compiler emit warnings if you use | ||||
|  | # any Qt feature that has been marked deprecated (the exact warnings | ||||
|  | # depend on your compiler). Refer to the documentation for the | ||||
|  | # deprecated API to know how to port your code away from it. | ||||
|  | DEFINES += QT_DEPRECATED_WARNINGS | ||||
|  | 
 | ||||
|  | # You can also make your code fail to compile if it uses deprecated APIs. | ||||
|  | # In order to do so, uncomment the following line. | ||||
|  | # You can also select to disable deprecated APIs only up to a certain version of Qt. | ||||
|  | #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0 | ||||
|  | 
 | ||||
|  | SOURCES += \ | ||||
|  |         OpenGLHandler.cpp \ | ||||
|  |         main.cpp | ||||
|  | 
 | ||||
|  | RESOURCES += qml.qrc | ||||
|  | 
 | ||||
|  | # Additional import path used to resolve QML modules in Qt Creator's code model | ||||
|  | QML_IMPORT_PATH = | ||||
|  | 
 | ||||
|  | # Additional import path used to resolve QML modules just for Qt Quick Designer | ||||
|  | QML_DESIGNER_IMPORT_PATH = | ||||
|  | 
 | ||||
|  | # Default rules for deployment. | ||||
|  | qnx: target.path = /tmp/$${TARGET}/bin | ||||
|  | else: unix:!android: target.path = /opt/$${TARGET}/bin | ||||
|  | !isEmpty(target.path): INSTALLS += target | ||||
|  | 
 | ||||
|  | HEADERS += \ | ||||
|  |     OpenGLHandler.h | ||||
|  | 
 | ||||
|  | unix|win32: LIBS += -lfreetype | ||||
|  | 
 | ||||
|  | unix|win32: LIBS += -lglfw | ||||
| @ -0,0 +1,335 @@ | |||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||
|  | <!DOCTYPE QtCreatorProject> | ||||
|  | <!-- Written by QtCreator 4.10.1, 2021-05-18T14:05:05. --> | ||||
|  | <qtcreator> | ||||
|  |  <data> | ||||
|  |   <variable>EnvironmentId</variable> | ||||
|  |   <value type="QByteArray">{b555296d-4153-4375-9ee0-d02c6b22be92}</value> | ||||
|  |  </data> | ||||
|  |  <data> | ||||
|  |   <variable>ProjectExplorer.Project.ActiveTarget</variable> | ||||
|  |   <value type="int">0</value> | ||||
|  |  </data> | ||||
|  |  <data> | ||||
|  |   <variable>ProjectExplorer.Project.EditorSettings</variable> | ||||
|  |   <valuemap type="QVariantMap"> | ||||
|  |    <value type="bool" key="EditorConfiguration.AutoIndent">true</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> | ||||
|  |    <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> | ||||
|  |     <value type="QString" key="language">Cpp</value> | ||||
|  |     <valuemap type="QVariantMap" key="value"> | ||||
|  |      <value type="QByteArray" key="CurrentPreferences">CppGlobal</value> | ||||
|  |     </valuemap> | ||||
|  |    </valuemap> | ||||
|  |    <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1"> | ||||
|  |     <value type="QString" key="language">QmlJS</value> | ||||
|  |     <valuemap type="QVariantMap" key="value"> | ||||
|  |      <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> | ||||
|  |     </valuemap> | ||||
|  |    </valuemap> | ||||
|  |    <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value> | ||||
|  |    <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> | ||||
|  |    <value type="int" key="EditorConfiguration.IndentSize">4</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> | ||||
|  |    <value type="int" key="EditorConfiguration.MarginColumn">80</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.MouseHiding">true</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.MouseNavigation">true</value> | ||||
|  |    <value type="int" key="EditorConfiguration.PaddingMode">1</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.ShowMargin">false</value> | ||||
|  |    <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> | ||||
|  |    <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> | ||||
|  |    <value type="int" key="EditorConfiguration.TabSize">8</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.UseGlobal">true</value> | ||||
|  |    <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.cleanIndentation">true</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> | ||||
|  |    <value type="bool" key="EditorConfiguration.inEntireDocument">false</value> | ||||
|  |   </valuemap> | ||||
|  |  </data> | ||||
|  |  <data> | ||||
|  |   <variable>ProjectExplorer.Project.PluginSettings</variable> | ||||
|  |   <valuemap type="QVariantMap"> | ||||
|  |    <valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/> | ||||
|  |    <value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value> | ||||
|  |   </valuemap> | ||||
|  |  </data> | ||||
|  |  <data> | ||||
|  |   <variable>ProjectExplorer.Project.Target.0</variable> | ||||
|  |   <valuemap type="QVariantMap"> | ||||
|  |    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.13.2 GCC 64bit</value> | ||||
|  |    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.13.2 GCC 64bit</value> | ||||
|  |    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5132.gcc_64_kit</value> | ||||
|  |    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> | ||||
|  |    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> | ||||
|  |    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> | ||||
|  |    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> | ||||
|  |     <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/mmt/Desktop/Projects/build-OpenGLOffscreen-Desktop_Qt_5_13_2_GCC_64bit-Debug</value> | ||||
|  |     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value> | ||||
|  |       <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value> | ||||
|  |      </valuemap> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> | ||||
|  |       <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> | ||||
|  |      </valuemap> | ||||
|  |      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> | ||||
|  |     </valuemap> | ||||
|  |     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> | ||||
|  |       <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> | ||||
|  |      </valuemap> | ||||
|  |      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> | ||||
|  |     </valuemap> | ||||
|  |     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> | ||||
|  |     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> | ||||
|  |     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> | ||||
|  |     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value> | ||||
|  |     <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> | ||||
|  |    </valuemap> | ||||
|  |    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> | ||||
|  |     <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/mmt/Desktop/Projects/build-OpenGLOffscreen-Desktop_Qt_5_13_2_GCC_64bit-Release</value> | ||||
|  |     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value> | ||||
|  |       <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value> | ||||
|  |      </valuemap> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> | ||||
|  |       <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> | ||||
|  |      </valuemap> | ||||
|  |      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> | ||||
|  |     </valuemap> | ||||
|  |     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> | ||||
|  |       <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> | ||||
|  |      </valuemap> | ||||
|  |      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> | ||||
|  |     </valuemap> | ||||
|  |     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> | ||||
|  |     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> | ||||
|  |     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> | ||||
|  |     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> | ||||
|  |     <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> | ||||
|  |    </valuemap> | ||||
|  |    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> | ||||
|  |     <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/mmt/Desktop/Projects/build-OpenGLOffscreen-Desktop_Qt_5_13_2_GCC_64bit-Profile</value> | ||||
|  |     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value> | ||||
|  |       <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value> | ||||
|  |       <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value> | ||||
|  |      </valuemap> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> | ||||
|  |       <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> | ||||
|  |      </valuemap> | ||||
|  |      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> | ||||
|  |     </valuemap> | ||||
|  |     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> | ||||
|  |      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> | ||||
|  |       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> | ||||
|  |       <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> | ||||
|  |       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> | ||||
|  |       <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> | ||||
|  |      </valuemap> | ||||
|  |      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> | ||||
|  |     </valuemap> | ||||
|  |     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> | ||||
|  |     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> | ||||
|  |     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> | ||||
|  |     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> | ||||
|  |     <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> | ||||
|  |    </valuemap> | ||||
|  |    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value> | ||||
|  |    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> | ||||
|  |     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> | ||||
|  |      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> | ||||
|  |     </valuemap> | ||||
|  |     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> | ||||
|  |    </valuemap> | ||||
|  |    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> | ||||
|  |    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/> | ||||
|  |    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> | ||||
|  |     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value> | ||||
|  |     <valuelist type="QVariantList" key="Analyzer.Perf.Events"> | ||||
|  |      <value type="QString">cpu-cycles</value> | ||||
|  |     </valuelist> | ||||
|  |     <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/> | ||||
|  |     <value type="int" key="Analyzer.Perf.Frequency">250</value> | ||||
|  |     <value type="QString" key="Analyzer.Perf.SampleMode">-F</value> | ||||
|  |     <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value> | ||||
|  |     <value type="int" key="Analyzer.Perf.StackSize">4096</value> | ||||
|  |     <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value> | ||||
|  |     <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value> | ||||
|  |     <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value> | ||||
|  |     <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value> | ||||
|  |     <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> | ||||
|  |     <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value> | ||||
|  |     <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value> | ||||
|  |     <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value> | ||||
|  |     <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value> | ||||
|  |     <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value> | ||||
|  |     <value type="int" key="Analyzer.Valgrind.NumCallers">25</value> | ||||
|  |     <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/> | ||||
|  |     <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value> | ||||
|  |     <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value> | ||||
|  |     <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value> | ||||
|  |     <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds"> | ||||
|  |      <value type="int">0</value> | ||||
|  |      <value type="int">1</value> | ||||
|  |      <value type="int">2</value> | ||||
|  |      <value type="int">3</value> | ||||
|  |      <value type="int">4</value> | ||||
|  |      <value type="int">5</value> | ||||
|  |      <value type="int">6</value> | ||||
|  |      <value type="int">7</value> | ||||
|  |      <value type="int">8</value> | ||||
|  |      <value type="int">9</value> | ||||
|  |      <value type="int">10</value> | ||||
|  |      <value type="int">11</value> | ||||
|  |      <value type="int">12</value> | ||||
|  |      <value type="int">13</value> | ||||
|  |      <value type="int">14</value> | ||||
|  |     </valuelist> | ||||
|  |     <value type="int" key="PE.EnvironmentAspect.Base">2</value> | ||||
|  |     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">OpenGLOffscreen</value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> | ||||
|  |     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/mmt/Desktop/Projects/OpenGLOffscreen/OpenGLOffscreen.pro</value> | ||||
|  |     <value type="QString" key="RunConfiguration.Arguments"></value> | ||||
|  |     <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value> | ||||
|  |     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value> | ||||
|  |     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> | ||||
|  |     <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> | ||||
|  |     <value type="bool" key="RunConfiguration.UseMultiProcess">false</value> | ||||
|  |     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> | ||||
|  |     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> | ||||
|  |     <value type="QString" key="RunConfiguration.WorkingDirectory"></value> | ||||
|  |     <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/mmt/Desktop/Projects/build-OpenGLOffscreen-Desktop_Qt_5_13_2_GCC_64bit-Debug</value> | ||||
|  |    </valuemap> | ||||
|  |    <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> | ||||
|  |   </valuemap> | ||||
|  |  </data> | ||||
|  |  <data> | ||||
|  |   <variable>ProjectExplorer.Project.TargetCount</variable> | ||||
|  |   <value type="int">1</value> | ||||
|  |  </data> | ||||
|  |  <data> | ||||
|  |   <variable>ProjectExplorer.Project.Updater.FileVersion</variable> | ||||
|  |   <value type="int">22</value> | ||||
|  |  </data> | ||||
|  |  <data> | ||||
|  |   <variable>Version</variable> | ||||
|  |   <value type="int">22</value> | ||||
|  |  </data> | ||||
|  | </qtcreator> | ||||
| @ -0,0 +1,27 @@ | |||||
|  | #include <QGuiApplication> | ||||
|  | #include <QQmlApplicationEngine> | ||||
|  | 
 | ||||
|  | #include "OpenGLHandler.h" | ||||
|  | 
 | ||||
|  | int main(int argc, char* argv[]) | ||||
|  | { | ||||
|  |     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); | ||||
|  | 
 | ||||
|  |     QGuiApplication app(argc, argv); | ||||
|  | 
 | ||||
|  |     QQmlApplicationEngine engine; | ||||
|  |     const QUrl url(QStringLiteral("qrc:/main.qml")); | ||||
|  |     QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, | ||||
|  |                      &app, [url](QObject* obj, const QUrl& objUrl) { | ||||
|  |         if(!obj && url == objUrl) | ||||
|  |         { | ||||
|  |             QCoreApplication::exit(-1); | ||||
|  |         } | ||||
|  |     }, Qt::QueuedConnection); | ||||
|  |     engine.load(url); | ||||
|  | 
 | ||||
|  |     OpenGLHandler op; | ||||
|  |     op.run(); | ||||
|  | 
 | ||||
|  |     return app.exec(); | ||||
|  | } | ||||
| @ -0,0 +1,9 @@ | |||||
|  | import QtQuick 2.13 | ||||
|  | import QtQuick.Window 2.13 | ||||
|  | 
 | ||||
|  | Window { | ||||
|  |     visible: true | ||||
|  |     width: 640 | ||||
|  |     height: 480 | ||||
|  |     title: qsTr("Hello World") | ||||
|  | } | ||||
| @ -0,0 +1,5 @@ | |||||
|  | <RCC> | ||||
|  |     <qresource prefix="/"> | ||||
|  |         <file>main.qml</file> | ||||
|  |     </qresource> | ||||
|  | </RCC> | ||||
| After Width: | Height: | Size: 122 KiB | 
					Loading…
					
					
				
		Reference in new issue