11#include <QResizeEvent>
14#include <config-hdr.h>
22 vertices[0] = QVector3D(rc.left(), rc.bottom(), 0.f);
23 vertices[1] = QVector3D(rc.left(), rc.top(), 0.f);
24 vertices[2] = QVector3D(rc.right(), rc.bottom(), 0.f);
25 vertices[3] = QVector3D(rc.left(), rc.top(), 0.f);
26 vertices[4] = QVector3D(rc.right(), rc.top(), 0.f);
27 vertices[5] = QVector3D(rc.right(), rc.bottom(), 0.f);
32 texCoords[0] = QVector2D(rc.left(), rc.bottom());
33 texCoords[1] = QVector2D(rc.left(), rc.top());
34 texCoords[2] = QVector2D(rc.right(), rc.bottom());
35 texCoords[3] = QVector2D(rc.left(), rc.top());
36 texCoords[4] = QVector2D(rc.right(), rc.top());
37 texCoords[5] = QVector2D(rc.right(), rc.bottom());
48 : QOpenGLWidget(parent),
49 m_texture(QOpenGLTexture::Target2D)
53 setTextureFormat(GL_RGBA16F);
56 setTextureColorSpace(colorSpace);
59 setUpdateBehavior(QOpenGLWidget::NoPartialUpdate);
70 initializeOpenGLFunctions();
73 m_shader.reset(
new QOpenGLShaderProgram);
75 QFile vertexShaderFile(QString(
":/") +
"kis_gl_image_widget.vert");
76 vertexShaderFile.open(QIODevice::ReadOnly);
77 QString vertSource = vertexShaderFile.readAll();
79 QFile fragShaderFile(QString(
":/") +
"kis_gl_image_widget.frag");
80 fragShaderFile.open(QIODevice::ReadOnly);
81 QString fragSource = fragShaderFile.readAll();
83 if (context()->isOpenGLES()) {
84 const char *versionHelper =
"#define USE_OPENGLES\n";
85 vertSource.prepend(versionHelper);
86 fragSource.prepend(versionHelper);
88 const char *versionDefinition =
"#version 100\n";
89 vertSource.prepend(versionDefinition);
90 fragSource.prepend(versionDefinition);
97 vertSource.prepend(versionDefinition);
98 fragSource.prepend(versionDefinition);
101 if (!
m_shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vertSource)) {
102 qDebug() <<
"Could not add vertex code";
106 if (!
m_shader->addShaderFromSourceCode(QOpenGLShader::Fragment, fragSource)) {
107 qDebug() <<
"Could not add fragment code";
112 qDebug() <<
"Could not link";
117 qDebug() <<
"Could not bind";
131 rectToTexCoords(textureVertices.data(), QRect(0.0, 0.0, 1.0, 1.0));
167 rectToVertices(vertices.data(),
rect);
182 glClearColor(0.3, 0.2, 0.8, 1.0f);
183 glClear(GL_COLOR_BUFFER_BIT);
198 m_texture.setFormat(QOpenGLTexture::RGBA16F);
200 m_texture.allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::Float16);
201 m_texture.setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
202 m_texture.setMagnificationFilter(QOpenGLTexture::Linear);
203 m_texture.setWrapMode(QOpenGLTexture::ClampToEdge);
215 QMatrix4x4 projectionMatrix;
216 projectionMatrix.setToIdentity();
217 projectionMatrix.ortho(0, width(), height(), 0, -1, 1);
218 QMatrix4x4 viewProjectionMatrix;
221 QTransform transform;
222 viewProjectionMatrix = projectionMatrix * QMatrix4x4(transform);
224 m_shader->setUniformValue(
"viewProjectionMatrix", viewProjectionMatrix);
227 m_shader->enableAttributeArray(
"vertexPosition");
229 m_shader->setAttributeBuffer(
"vertexPosition", GL_FLOAT, 0, 3);
231 m_shader->enableAttributeArray(
"texturePosition");
233 m_shader->setAttributeBuffer(
"texturePosition", GL_FLOAT, 0, 2);
235 glActiveTexture(GL_TEXTURE0);
239 glDrawArrays(GL_TRIANGLES, 0, 6);
263 QOpenGLWidget::paintEvent(event);
269 QOpenGLWidget::resizeEvent(event);
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
const half * constData() const
static bool supportsLoD()
void rectToTexCoords(QVector2D *texCoords, const QRectF &rc)
void rectToVertices(QVector3D *vertices, const QRectF &rc)