void NightModeGraphicsEffect::draw(QPainter* painter) { int pixelRatio = painter->device()->devicePixelRatio(); QSize size(painter->device()->width() * pixelRatio, painter->device()->height() * pixelRatio); if (fbo && fbo->size() != size) { delete fbo; fbo = NULL; } if (!fbo) { QGLFramebufferObjectFormat format; format.setAttachment(QGLFramebufferObject::CombinedDepthStencil); format.setInternalTextureFormat(GL_RGBA); fbo = new NightModeGraphicsEffectFbo(size, format, pixelRatio); } QPainter fboPainter(fbo); drawSource(&fboPainter); painter->save(); painter->beginNativePainting(); program->bind(); const GLfloat pos[] = {-1, -1, +1, -1, -1, +1, +1, +1}; const GLfloat texCoord[] = {0, 0, 1, 0, 0, 1, 1, 1}; program->setUniformValue(vars.source, 0); program->setAttributeArray(vars.pos, pos, 2); program->setAttributeArray(vars.texCoord, texCoord, 2); program->enableAttributeArray(vars.pos); program->enableAttributeArray(vars.texCoord); glBindTexture(GL_TEXTURE_2D, fbo->texture()); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); program->release(); painter->endNativePainting(); painter->restore(); }
void CubeObj::drawgl(GLWidget &gl, QMatrix4x4 & cameramat ) { QMatrix4x4 mobj = cameramat; mobj *= getMatrix(); mobj.scale(scale); static QColor color ( 1.0f, 0, 0.5f, 1 ); QGLShaderProgram * sp = gl.program; if ( pro.actualobject == this ) { sp = gl.program2; } for ( int i=0; i <6; i++) { sp->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE); sp->enableAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE); sp->setAttributeArray (PROGRAM_VERTEX_ATTRIBUTE, vertices.constData()); sp->setAttributeArray (PROGRAM_TEXCOORD_ATTRIBUTE, texCoords.constData()); sp->bind(); sp->setUniformValue("matrix", mobj); sp->setUniformValue("color", QVector4D (1,0,0,0.2f)); gl.glBindTexture(GL_TEXTURE_2D, this->textureIDs[i] ); gl.glDrawArrays(GL_QUADS, i*4, 4 ); } if ( pro.getManger().edges ) { gl.glDisable(GL_CULL_FACE); sp = gl.solidcolorp; sp->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE); sp->enableAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE); sp->setAttributeArray (PROGRAM_VERTEX_ATTRIBUTE, vertices.constData()); sp->setAttributeArray (PROGRAM_TEXCOORD_ATTRIBUTE, texCoords.constData()); sp->bind(); sp->setUniformValue("matrix", mobj); sp->setUniformValue("color", QVector4D (0,1,0,0.8f)); if ( pro.actualobject == this ) { sp->setUniformValue("color", QVector4D (1,0.8f,1,0.8f)); } glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); gl.glLineWidth(2); gl.glDrawArrays(GL_QUADS, 0, 24 ); gl.glEnable(GL_CULL_FACE); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } }
void TriMesh::drawEdges(QGLShaderProgram& prog, const TransformState& transState) const { transState.translate(offset()).setUniforms(prog.programId()); prog.enableAttributeArray("position"); prog.setAttributeArray("position", GL_FLOAT, &m_verts[0], 3); if (m_colors.size() == m_verts.size()) { prog.enableAttributeArray("color"); prog.setAttributeArray("color", GL_FLOAT, &m_colors[0], 3); } else prog.setAttributeValue("color", GLfloat(1), GLfloat(1), GLfloat(1)); glDrawElements(GL_LINES, (GLsizei)m_edges.size(), GL_UNSIGNED_INT, &m_edges[0]); prog.disableAttributeArray("color"); prog.disableAttributeArray("position"); }