|
@@ -5,6 +5,8 @@
|
|
#include <QOpenGLShaderProgram>
|
|
#include <QOpenGLShaderProgram>
|
|
#include <QOpenGLContext>
|
|
#include <QOpenGLContext>
|
|
#include <QOpenGLFunctions>
|
|
#include <QOpenGLFunctions>
|
|
|
|
+#include <QOpenGLExtraFunctions>
|
|
|
|
+#include <QOpenGLFunctions_3_0>
|
|
|
|
|
|
#include <vector>
|
|
#include <vector>
|
|
|
|
|
|
@@ -22,7 +24,7 @@ ETVImage::ETVImage(EscapeTimeVisualWidget& owner,
|
|
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
- gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
|
|
|
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
gl.glBindTexture(GL_TEXTURE_2D, 0);
|
|
gl.glBindTexture(GL_TEXTURE_2D, 0);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -38,6 +40,14 @@ void ETVImage::draw(float x, float y, float w, float h,
|
|
float tx, float ty, float tw, float th)
|
|
float tx, float ty, float tw, float th)
|
|
{
|
|
{
|
|
auto& gl = *owner.context()->functions();
|
|
auto& gl = *owner.context()->functions();
|
|
|
|
+ auto& gle = *owner.context()->extraFunctions();
|
|
|
|
+
|
|
|
|
+ GLfloat const fbVertices[] = {
|
|
|
|
+ 0, 0, 0.0f,
|
|
|
|
+ 0, 256, 0.0f,
|
|
|
|
+ 256, 0, 0.0f,
|
|
|
|
+ 256, 256, 0.0f,
|
|
|
|
+ };
|
|
|
|
|
|
GLfloat const vertices[] = {
|
|
GLfloat const vertices[] = {
|
|
x, y, 0.0f,
|
|
x, y, 0.0f,
|
|
@@ -53,6 +63,14 @@ void ETVImage::draw(float x, float y, float w, float h,
|
|
tx + tw, ty + th,
|
|
tx + tw, ty + th,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ GLfloat const fullTexCoords[] = {
|
|
|
|
+ 0, 0,
|
|
|
|
+ 0, 1,
|
|
|
|
+ 1, 0,
|
|
|
|
+ 1, 1,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+
|
|
QColor color{ 255, 255, 255 };
|
|
QColor color{ 255, 255, 255 };
|
|
auto& program = owner.program;
|
|
auto& program = owner.program;
|
|
int vertexLoc = program->attributeLocation("vertex");
|
|
int vertexLoc = program->attributeLocation("vertex");
|
|
@@ -60,14 +78,23 @@ void ETVImage::draw(float x, float y, float w, float h,
|
|
int colorLocation = program->uniformLocation("color");
|
|
int colorLocation = program->uniformLocation("color");
|
|
int texLoc = program->uniformLocation("tex");
|
|
int texLoc = program->uniformLocation("tex");
|
|
int gradLoc = program->uniformLocation("gradient");
|
|
int gradLoc = program->uniformLocation("gradient");
|
|
- program->setAttributeArray(vertexLoc, vertices, 3);
|
|
|
|
|
|
+ program->setAttributeArray(vertexLoc, fbVertices, 3);
|
|
program->setAttributeArray(texCoordsLoc, texCoords, 2);
|
|
program->setAttributeArray(texCoordsLoc, texCoords, 2);
|
|
program->enableAttributeArray(vertexLoc);
|
|
program->enableAttributeArray(vertexLoc);
|
|
program->enableAttributeArray(texCoordsLoc);
|
|
program->enableAttributeArray(texCoordsLoc);
|
|
program->setUniformValue(colorLocation, color);
|
|
program->setUniformValue(colorLocation, color);
|
|
|
|
|
|
-
|
|
|
|
gl.glEnable(GL_TEXTURE_2D);
|
|
gl.glEnable(GL_TEXTURE_2D);
|
|
|
|
+ owner.program->bind();
|
|
|
|
+
|
|
|
|
+ //GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 };
|
|
|
|
+ //gle.glDrawBuffers(1, drawBuffers);
|
|
|
|
+ if(gl.glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
|
|
|
+ printf("error intitializing framebuffer\n");
|
|
|
|
+ }
|
|
|
|
+ gl.glBindFramebuffer(GL_FRAMEBUFFER, owner.tileFramebuffer);
|
|
|
|
+ gl.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, owner.tileTexture, 0);
|
|
|
|
+ //gl.glViewport(0, 0, 256, 256);
|
|
|
|
|
|
gl.glUniform1i(texLoc, 0);
|
|
gl.glUniform1i(texLoc, 0);
|
|
gl.glUniform1i(gradLoc, 2);
|
|
gl.glUniform1i(gradLoc, 2);
|
|
@@ -80,6 +107,24 @@ void ETVImage::draw(float x, float y, float w, float h,
|
|
gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
|
gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
|
program->disableAttributeArray(vertexLoc);
|
|
program->disableAttributeArray(vertexLoc);
|
|
program->disableAttributeArray(texCoordsLoc);
|
|
program->disableAttributeArray(texCoordsLoc);
|
|
|
|
+
|
|
|
|
+ owner.renderTextures->bind();
|
|
|
|
+ gl.glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
|
|
+ //gl.glViewport(0, 0, owner.getResolutionX(), owner.getResolutionY());
|
|
|
|
+ int rtVertexLoc = owner.renderTextures->attributeLocation("vertex");
|
|
|
|
+ int rtTexCoordsLoc = owner.renderTextures->attributeLocation("texCoord");
|
|
|
|
+ int rtTexLoc = owner.renderTextures->attributeLocation("tex");
|
|
|
|
+
|
|
|
|
+ gl.glActiveTexture(GL_TEXTURE0);
|
|
|
|
+ gl.glUniform1i(rtTexLoc, 0);
|
|
|
|
+ owner.renderTextures->setAttributeArray(rtVertexLoc, vertices, 3);
|
|
|
|
+ owner.renderTextures->setAttributeArray(rtTexCoordsLoc, fullTexCoords, 2);
|
|
|
|
+ owner.renderTextures->enableAttributeArray(rtVertexLoc);
|
|
|
|
+ owner.renderTextures->enableAttributeArray(rtTexCoordsLoc);
|
|
|
|
+ gl.glBindTexture(GL_TEXTURE_2D, owner.tileTexture);
|
|
|
|
+ gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
|
|
|
+ owner.renderTextures->disableAttributeArray(rtVertexLoc);
|
|
|
|
+ owner.renderTextures->disableAttributeArray(rtTexCoordsLoc);
|
|
gl.glActiveTexture(GL_TEXTURE0);
|
|
gl.glActiveTexture(GL_TEXTURE0);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -117,6 +162,29 @@ void EscapeTimeVisualWidget::initializeGL(void)
|
|
|
|
|
|
//glShadeModel(GL_SMOOTH);
|
|
//glShadeModel(GL_SMOOTH);
|
|
|
|
|
|
|
|
+ renderTextures = new QOpenGLShaderProgram{ this->context() };
|
|
|
|
+ renderTextures->addShaderFromSourceCode(QOpenGLShader::Vertex,
|
|
|
|
+ "attribute highp vec4 vertex;\n"
|
|
|
|
+ "attribute highp vec2 texCoord;\n"
|
|
|
|
+ "uniform highp mat4 matrix;\n"
|
|
|
|
+ "varying highp vec2 texc;\n"
|
|
|
|
+ "void main(void)\n"
|
|
|
|
+ "{\n"
|
|
|
|
+ " gl_Position = matrix * vertex;\n"
|
|
|
|
+ " texc = texCoord;\n"
|
|
|
|
+ "}");
|
|
|
|
+ renderTextures->addShaderFromSourceCode(QOpenGLShader::Fragment,
|
|
|
|
+ "#version 110\n"
|
|
|
|
+ "uniform sampler2D tex;\n"
|
|
|
|
+ "varying highp vec2 texc;\n"
|
|
|
|
+ "void main(void)\n"
|
|
|
|
+ "{\n"
|
|
|
|
+ " gl_FragColor = texture2D(tex, texc);\n"
|
|
|
|
+ "}");
|
|
|
|
+
|
|
|
|
+ renderTextures->link();
|
|
|
|
+
|
|
|
|
+
|
|
program = new QOpenGLShaderProgram{ this->context() };
|
|
program = new QOpenGLShaderProgram{ this->context() };
|
|
bool vert = program->addShaderFromSourceCode(QOpenGLShader::Vertex,
|
|
bool vert = program->addShaderFromSourceCode(QOpenGLShader::Vertex,
|
|
"attribute highp vec4 vertex;\n"
|
|
"attribute highp vec4 vertex;\n"
|
|
@@ -131,7 +199,7 @@ void EscapeTimeVisualWidget::initializeGL(void)
|
|
|
|
|
|
// TODO rewrite this monster
|
|
// TODO rewrite this monster
|
|
bool frag = program->addShaderFromSourceCode(QOpenGLShader::Fragment,
|
|
bool frag = program->addShaderFromSourceCode(QOpenGLShader::Fragment,
|
|
- "#version 400\n"
|
|
|
|
|
|
+ "#version 110\n"
|
|
"uniform sampler2D gradient;\n"
|
|
"uniform sampler2D gradient;\n"
|
|
"uniform sampler2D tex;\n"
|
|
"uniform sampler2D tex;\n"
|
|
"uniform mediump vec4 color;\n"
|
|
"uniform mediump vec4 color;\n"
|
|
@@ -140,8 +208,8 @@ void EscapeTimeVisualWidget::initializeGL(void)
|
|
"void main(void)\n"
|
|
"void main(void)\n"
|
|
"{\n"
|
|
"{\n"
|
|
" float v = texture2D(tex, texc).r;\n"
|
|
" float v = texture2D(tex, texc).r;\n"
|
|
- " vec2 size = textureSize(tex, 0);\n"
|
|
|
|
- //" size = vec2(256.0, 256.0);\n"
|
|
|
|
|
|
+ /*" vec2 size = textureSize(tex, 0);\n"
|
|
|
|
+ " size = vec2(256.0, 256.0);\n"
|
|
" vec2 accPoint = texc * size;\n"
|
|
" vec2 accPoint = texc * size;\n"
|
|
" vec2 ip = floor(accPoint);\n"
|
|
" vec2 ip = floor(accPoint);\n"
|
|
" vec2 fp = fract(accPoint);\n"
|
|
" vec2 fp = fract(accPoint);\n"
|
|
@@ -150,9 +218,9 @@ void EscapeTimeVisualWidget::initializeGL(void)
|
|
" vec4 col2 = texture2D(gradient, vec2(inter.y*0.005, 0.0));\n"
|
|
" vec4 col2 = texture2D(gradient, vec2(inter.y*0.005, 0.0));\n"
|
|
" vec4 col3 = texture2D(gradient, vec2(inter.z*0.005, 0.0));\n"
|
|
" vec4 col3 = texture2D(gradient, vec2(inter.z*0.005, 0.0));\n"
|
|
" vec4 col4 = texture2D(gradient, vec2(inter.w*0.005, 0.0));\n"
|
|
" vec4 col4 = texture2D(gradient, vec2(inter.w*0.005, 0.0));\n"
|
|
- " vec4 col = mix(mix(col4, col3, fp.x), mix(col1, col2, fp.x), fp.y);\n"
|
|
|
|
|
|
+ " vec4 col = mix(mix(col4, col3, fp.x), mix(col1, col2, fp.x), fp.y);\n"*/
|
|
" gl_FragColor = texture2D(gradient, vec2(v*0.005, 0.0));\n"
|
|
" gl_FragColor = texture2D(gradient, vec2(v*0.005, 0.0));\n"
|
|
- " gl_FragColor = col;\n"
|
|
|
|
|
|
+ //" gl_FragColor = col;\n"
|
|
// " gl_FragColor = gl_FragColor * texture2D(tex, texc);\n"
|
|
// " gl_FragColor = gl_FragColor * texture2D(tex, texc);\n"
|
|
// " float v = texture2D(tex, texc).r;\n"
|
|
// " float v = texture2D(tex, texc).r;\n"
|
|
// " gl_FragColor = vec4(v, 1.0 - v, v*v, 1);\n"
|
|
// " gl_FragColor = vec4(v, 1.0 - v, v*v, 1);\n"
|
|
@@ -161,6 +229,7 @@ void EscapeTimeVisualWidget::initializeGL(void)
|
|
|
|
|
|
//program.link();
|
|
//program.link();
|
|
bool bound = program->bind();
|
|
bool bound = program->bind();
|
|
|
|
+ bound = renderTextures->bind();
|
|
|
|
|
|
int vertexLoc = program->attributeLocation("vertex");
|
|
int vertexLoc = program->attributeLocation("vertex");
|
|
int texCoordsLoc = program->attributeLocation("texCoord");
|
|
int texCoordsLoc = program->attributeLocation("texCoord");
|
|
@@ -169,6 +238,22 @@ void EscapeTimeVisualWidget::initializeGL(void)
|
|
int gradLoc = program->uniformLocation("gradient");
|
|
int gradLoc = program->uniformLocation("gradient");
|
|
int gradientScaler = program->uniformLocation("gradientScaler");
|
|
int gradientScaler = program->uniformLocation("gradientScaler");
|
|
|
|
|
|
|
|
+ auto& gle = *this->context()->extraFunctions();
|
|
|
|
+
|
|
|
|
+ gl.glGenTextures(1, &tileTexture);
|
|
|
|
+ gl.glBindTexture(GL_TEXTURE_2D, tileTexture);
|
|
|
|
+ gl.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
|
|
|
|
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
|
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
|
|
+
|
|
|
|
+ gl.glGenFramebuffers(1, &tileFramebuffer);
|
|
|
|
+ gl.glBindFramebuffer(GL_FRAMEBUFFER, tileFramebuffer);
|
|
|
|
+ gl.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tileTexture, 0);
|
|
|
|
+ GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 };
|
|
|
|
+ gle.glDrawBuffers(1, drawBuffers);
|
|
|
|
+ if(gl.glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
|
|
|
+ printf("error intitializing framebuffer\n");
|
|
|
|
+ }
|
|
|
|
|
|
unsigned char pix[] = { 255, 0, 0, 0, 255, 0, 0, 0, 255 };
|
|
unsigned char pix[] = { 255, 0, 0, 0, 255, 0, 0, 0, 255 };
|
|
|
|
|
|
@@ -186,6 +271,7 @@ void EscapeTimeVisualWidget::initializeGL(void)
|
|
|
|
|
|
gradientTextureId = id;
|
|
gradientTextureId = id;
|
|
|
|
|
|
|
|
+ gl.glDisable(GL_DEPTH_TEST);
|
|
//gl3.glBindSampler(0, id);
|
|
//gl3.glBindSampler(0, id);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -207,7 +293,9 @@ void EscapeTimeVisualWidget::resizeGL(int w, int h)
|
|
QMatrix4x4 pmvMatrix;
|
|
QMatrix4x4 pmvMatrix;
|
|
pmvMatrix.ortho(QRectF{ 0, 0, newW, newH });
|
|
pmvMatrix.ortho(QRectF{ 0, 0, newW, newH });
|
|
int matrixLocation = program->uniformLocation("matrix");
|
|
int matrixLocation = program->uniformLocation("matrix");
|
|
|
|
+ int rtMatrixLocation = renderTextures->uniformLocation("matrix");
|
|
program->setUniformValue(matrixLocation, pmvMatrix);
|
|
program->setUniformValue(matrixLocation, pmvMatrix);
|
|
|
|
+ renderTextures->setUniformValue(rtMatrixLocation, pmvMatrix);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -215,6 +303,7 @@ void EscapeTimeVisualWidget::paintGL(void)
|
|
{
|
|
{
|
|
if (gradientNeedsUpdate)
|
|
if (gradientNeedsUpdate)
|
|
updateGradient();
|
|
updateGradient();
|
|
|
|
+
|
|
/*ETVImage etvi{ *this };
|
|
/*ETVImage etvi{ *this };
|
|
|
|
|
|
auto& gl = *this->context()->functions();
|
|
auto& gl = *this->context()->functions();
|