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 if (!vertexShaderFile.open(QIODevice::ReadOnly)) {
77 qDebug() <<
"Could not open vertex code";
80 QString vertSource = vertexShaderFile.readAll();
82 QFile fragShaderFile(QString(
":/") +
"kis_gl_image_widget.frag");
83 if (!fragShaderFile.open(QIODevice::ReadOnly)) {
84 qDebug() <<
"Could not open fragment code";
87 QString fragSource = fragShaderFile.readAll();
89 if (context()->isOpenGLES()) {
90 const char *versionHelper =
"#define USE_OPENGLES\n";
91 vertSource.prepend(versionHelper);
92 fragSource.prepend(versionHelper);
94 const char *versionDefinition =
"#version 100\n";
95 vertSource.prepend(versionDefinition);
96 fragSource.prepend(versionDefinition);
103 vertSource.prepend(versionDefinition);
104 fragSource.prepend(versionDefinition);
107 if (!
m_shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vertSource)) {
108 qDebug() <<
"Could not add vertex code";
112 if (!
m_shader->addShaderFromSourceCode(QOpenGLShader::Fragment, fragSource)) {
113 qDebug() <<
"Could not add fragment code";
118 qDebug() <<
"Could not link";
123 qDebug() <<
"Could not bind";
137 rectToTexCoords(textureVertices.data(), QRect(0.0, 0.0, 1.0, 1.0));
173 rectToVertices(vertices.data(),
rect);
188 glClearColor(0.3, 0.2, 0.8, 1.0f);
189 glClear(GL_COLOR_BUFFER_BIT);
204 m_texture.setFormat(QOpenGLTexture::RGBA16F);
206 m_texture.allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::Float16);
207 m_texture.setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
208 m_texture.setMagnificationFilter(QOpenGLTexture::Linear);
209 m_texture.setWrapMode(QOpenGLTexture::ClampToEdge);
221 QMatrix4x4 projectionMatrix;
222 projectionMatrix.setToIdentity();
223 projectionMatrix.ortho(0, width(), height(), 0, -1, 1);
224 QMatrix4x4 viewProjectionMatrix;
227 QTransform transform;
228 viewProjectionMatrix = projectionMatrix * QMatrix4x4(transform);
230 m_shader->setUniformValue(
"viewProjectionMatrix", viewProjectionMatrix);
233 m_shader->enableAttributeArray(
"vertexPosition");
235 m_shader->setAttributeBuffer(
"vertexPosition", GL_FLOAT, 0, 3);
237 m_shader->enableAttributeArray(
"texturePosition");
239 m_shader->setAttributeBuffer(
"texturePosition", GL_FLOAT, 0, 2);
241 glActiveTexture(GL_TEXTURE0);
245 glDrawArrays(GL_TRIANGLES, 0, 6);
269 QOpenGLWidget::paintEvent(event);
275 QOpenGLWidget::resizeEvent(event);
const half * constData() const
static bool supportsLoD()
void rectToTexCoords(QVector2D *texCoords, const QRectF &rc)
void rectToVertices(QVector3D *vertices, const QRectF &rc)