void MythRenderOpenGL1::DrawBitmapPriv(uint *textures, uint texture_count, const QRectF *src, const QRectF *dst, uint prog) { if (prog && !m_programs.contains(prog)) prog = 0; uint first = textures[0]; EnableShaderObject(prog); SetBlend(false); SetColor(255, 255, 255, 255); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); EnableTextures(first); uint active_tex = 0; for (uint i = 0; i < texture_count; i++) { if (m_textures.contains(textures[i])) { ActiveTexture(GL_TEXTURE0 + active_tex++); glBindTexture(m_textures[textures[i]].m_type, textures[i]); } } UpdateTextureVertices(first, src, dst); glVertexPointer(2, GL_FLOAT, 0, m_textures[first].m_vertex_data); glTexCoordPointer(2, GL_FLOAT, 0, m_textures[first].m_vertex_data + TEX_OFFSET); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); ActiveTexture(GL_TEXTURE0); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); }
void MythRenderOpenGL2::SetShaderParams(uint obj, void* vals, const char* uniform) { makeCurrent(); const float *v = (float*)vals; EnableShaderObject(obj); GLint loc = m_glGetUniformLocation(obj, uniform); m_glUniformMatrix4fv(loc, 1, GL_FALSE, v); doneCurrent(); }
void MythRenderOpenGL2::DrawBitmapPriv(uint *textures, uint texture_count, const QRectF *src, const QRectF *dst, uint prog) { if (prog && !m_shader_objects.contains(prog)) prog = 0; if (prog == 0) prog = m_shaders[kShaderDefault]; uint first = textures[0]; EnableShaderObject(prog); SetShaderParams(prog, &m_projection[0][0], "u_projection"); SetShaderParams(prog, &m_transforms.top().m[0][0], "u_transform"); SetBlend(false); EnableTextures(first); uint active_tex = 0; for (uint i = 0; i < texture_count; i++) { if (m_textures.contains(textures[i])) { ActiveTexture(GL_TEXTURE0 + active_tex++); glBindTexture(m_textures[textures[i]].m_type, textures[i]); } } m_glBindBuffer(GL_ARRAY_BUFFER, m_textures[first].m_vbo); UpdateTextureVertices(first, src, dst); m_glBufferData(GL_ARRAY_BUFFER, kVertexSize, NULL, GL_STREAM_DRAW); void* target = m_glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); if (target) memcpy(target, m_textures[first].m_vertex_data, kVertexSize); m_glUnmapBuffer(GL_ARRAY_BUFFER); m_glEnableVertexAttribArray(VERTEX_INDEX); m_glEnableVertexAttribArray(TEXTURE_INDEX); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); m_glVertexAttrib4f(COLOR_INDEX, 1.0, 1.0, 1.0, 1.0); m_glVertexAttribPointer(TEXTURE_INDEX, TEXTURE_SIZE, GL_FLOAT, GL_FALSE, TEXTURE_SIZE * sizeof(GLfloat), (const void *) kTextureOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_glDisableVertexAttribArray(TEXTURE_INDEX); m_glDisableVertexAttribArray(VERTEX_INDEX); m_glBindBuffer(GL_ARRAY_BUFFER, 0); }
void MythRenderOpenGL2::DrawRectPriv(const QRect &area, bool drawFill, const QColor &fillColor, bool drawLine, int lineWidth, const QColor &lineColor, int prog) { if (prog && !m_shader_objects.contains(prog)) prog = 0; if (prog == 0) prog = m_shaders[kShaderSimple]; EnableShaderObject(prog); SetShaderParams(prog, &m_projection[0][0], "u_projection"); SetBlend(true); DisableTextures(); m_glEnableVertexAttribArray(VERTEX_INDEX); if (drawFill) { m_glVertexAttrib4f(COLOR_INDEX, fillColor.red() / 255.0, fillColor.green() / 255.0, fillColor.blue() / 255.0, fillColor.alpha() / 255.0); GetCachedVBO(GL_TRIANGLE_STRIP, area); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_glBindBuffer(GL_ARRAY_BUFFER, 0); } if (drawLine) { glLineWidth(lineWidth); m_glVertexAttrib4f(COLOR_INDEX, lineColor.red() / 255.0, lineColor.green() / 255.0, lineColor.blue() / 255.0, lineColor.alpha() / 255.0); GetCachedVBO(GL_LINE_LOOP, area); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_LINE_LOOP, 0, 4); m_glBindBuffer(GL_ARRAY_BUFFER, 0); } m_glDisableVertexAttribArray(VERTEX_INDEX); }
void MythRenderOpenGL1::SetShaderParams(uint obj, void* vals, const char* uniform) { makeCurrent(); const float *v = (float*)vals; EnableShaderObject(obj); m_glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, v[0], v[1], v[2], v[3]); m_glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, v[4], v[5], v[6], v[7]); m_glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 2, v[8], v[9], v[10], v[11]); doneCurrent(); }
void MythRenderOpenGL1::SetShaderParams(uint obj, const QMatrix4x4 &m, const char* uniform) { GLMatrix4x4 v(m); makeCurrent(); EnableShaderObject(obj); m_glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, v[0], v[1], v[2], v[3]); m_glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, v[4], v[5], v[6], v[7]); m_glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 2, v[8], v[9], v[10], v[11]); doneCurrent(); }
void MythRenderOpenGL2::DrawBitmapPriv(uint tex, const QRect *src, const QRect *dst, uint prog, int alpha, int red, int green, int blue) { if (prog && !m_shader_objects.contains(prog)) prog = 0; if (prog == 0) prog = m_shaders[kShaderDefault]; EnableShaderObject(prog); SetShaderParams(prog, &m_projection[0][0], "u_projection"); SetShaderParams(prog, &m_transforms.top().m[0][0], "u_transform"); SetBlend(true); EnableTextures(tex); glBindTexture(m_textures[tex].m_type, tex); m_glBindBuffer(GL_ARRAY_BUFFER, m_textures[tex].m_vbo); UpdateTextureVertices(tex, src, dst); m_glBufferData(GL_ARRAY_BUFFER, kVertexSize, NULL, GL_STREAM_DRAW); void* target = m_glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); if (target) memcpy(target, m_textures[tex].m_vertex_data, kVertexSize); m_glUnmapBuffer(GL_ARRAY_BUFFER); m_glEnableVertexAttribArray(VERTEX_INDEX); m_glEnableVertexAttribArray(TEXTURE_INDEX); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); m_glVertexAttrib4f(COLOR_INDEX, red / 255.0, green / 255.0, blue / 255.0, alpha / 255.0); m_glVertexAttribPointer(TEXTURE_INDEX, TEXTURE_SIZE, GL_FLOAT, GL_FALSE, TEXTURE_SIZE * sizeof(GLfloat), (const void *) kTextureOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_glDisableVertexAttribArray(TEXTURE_INDEX); m_glDisableVertexAttribArray(VERTEX_INDEX); m_glBindBuffer(GL_ARRAY_BUFFER, 0); }
void MythRenderOpenGL1::DrawBitmapPriv(uint tex, const QRect *src, const QRect *dst, uint prog, int alpha, int red, int green, int blue) { if (prog && !m_programs.contains(prog)) prog = 0; EnableShaderObject(prog); SetBlend(true); SetColor(red, green, blue, alpha); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); EnableTextures(tex); glBindTexture(m_textures[tex].m_type, tex); UpdateTextureVertices(tex, src, dst); glVertexPointer(2, GL_FLOAT, 0, m_textures[tex].m_vertex_data); glTexCoordPointer(2, GL_FLOAT, 0, m_textures[tex].m_vertex_data + TEX_OFFSET); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); }
void MythRenderOpenGL1::DrawRectPriv(const QRect &area, const QBrush &fillBrush, const QPen &linePen, int alpha) { SetBlend(true); DisableTextures(); EnableShaderObject(0); glEnableClientState(GL_VERTEX_ARRAY); int lineWidth = linePen.width(); QRect r(area.left() + lineWidth, area.top() + lineWidth, area.width() - (lineWidth * 2), area.height() - (lineWidth * 2)); if (fillBrush.style() != Qt::NoBrush) { int a = 255 * (((float)alpha / 255.0f) * ((float)fillBrush.color().alpha() / 255.0f)); SetColor(fillBrush.color().red(), fillBrush.color().green(), fillBrush.color().blue(), a); GLfloat *vertices = GetCachedVertices(GL_TRIANGLE_STRIP, r); glVertexPointer(2, GL_FLOAT, 0, vertices); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } if (linePen.style() != Qt::NoPen) { int a = 255 * (((float)alpha / 255.0f) * ((float)linePen.color().alpha() / 255.0f)); SetColor(linePen.color().red(), linePen.color().green(), linePen.color().blue(), a); glLineWidth(linePen.width()); GLfloat *vertices = GetCachedVertices(GL_LINE_LOOP, r); glVertexPointer(2, GL_FLOAT, 0, vertices); glDrawArrays(GL_LINE_LOOP, 0, 4); } glDisableClientState(GL_VERTEX_ARRAY); }
void MythRenderOpenGL2::DrawRoundRectPriv(const QRect &area, int cornerRadius, const QBrush &fillBrush, const QPen &linePen, int alpha) { int lineWidth = linePen.width(); int halfline = lineWidth / 2; int rad = cornerRadius - halfline; if ((area.width() / 2) < rad) rad = area.width() / 2; if ((area.height() / 2) < rad) rad = area.height() / 2; int dia = rad * 2; QRect r(area.left() + halfline, area.top() + halfline, area.width() - (halfline * 2), area.height() - (halfline * 2)); QRect tl(r.left(), r.top(), rad, rad); QRect tr(r.left() + r.width() - rad, r.top(), rad, rad); QRect bl(r.left(), r.top() + r.height() - rad, rad, rad); QRect br(r.left() + r.width() - rad, r.top() + r.height() - rad, rad, rad); SetBlend(true); DisableTextures(); m_glEnableVertexAttribArray(VERTEX_INDEX); if (fillBrush.style() != Qt::NoBrush) { // Get the shaders int elip = m_shaders[kShaderCircle]; int fill = m_shaders[kShaderSimple]; // Set the fill color m_glVertexAttrib4f(COLOR_INDEX, fillBrush.color().red() / 255.0, fillBrush.color().green() / 255.0, fillBrush.color().blue() / 255.0, (fillBrush.color().alpha() / 255.0) * (alpha / 255.0)); // Set the radius m_parameters[0][2] = rad; m_parameters[0][3] = rad - 1.0; // Enable the Circle shader SetShaderParams(elip, &m_projection[0][0], "u_projection"); // Draw the top left segment m_parameters[0][0] = tl.left() + rad; m_parameters[0][1] = tl.top() + rad; SetShaderParams(elip, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, tl); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Draw the top right segment m_parameters[0][0] = tr.left(); m_parameters[0][1] = tr.top() + rad; SetShaderParams(elip, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, tr); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Draw the bottom left segment m_parameters[0][0] = bl.left() + rad; m_parameters[0][1] = bl.top(); SetShaderParams(elip, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, bl); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Draw the bottom right segment m_parameters[0][0] = br.left(); m_parameters[0][1] = br.top(); SetShaderParams(elip, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, br); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Fill the remaining areas QRect main(r.left() + rad, r.top(), r.width() - dia, r.height()); QRect left(r.left(), r.top() + rad, rad, r.height() - dia); QRect right(r.left() + r.width() - rad, r.top() + rad, rad, r.height() - dia); EnableShaderObject(fill); SetShaderParams(fill, &m_projection[0][0], "u_projection"); GetCachedVBO(GL_TRIANGLE_STRIP, main); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); GetCachedVBO(GL_TRIANGLE_STRIP, left); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); GetCachedVBO(GL_TRIANGLE_STRIP, right); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_glBindBuffer(GL_ARRAY_BUFFER, 0); } if (linePen.style() != Qt::NoPen) { // Get the shaders int edge = m_shaders[kShaderCircleEdge]; int vline = m_shaders[kShaderVertLine]; int hline = m_shaders[kShaderHorizLine]; // Set the line color m_glVertexAttrib4f(COLOR_INDEX, linePen.color().red() / 255.0, linePen.color().green() / 255.0, linePen.color().blue() / 255.0, (linePen.color().alpha() / 255.0) * (alpha / 255.0)); // Set the radius and width m_parameters[0][2] = rad - lineWidth / 2.0; m_parameters[0][3] = lineWidth / 2.0; // Enable the edge shader SetShaderParams(edge, &m_projection[0][0], "u_projection"); // Draw the top left edge segment m_parameters[0][0] = tl.left() + rad; m_parameters[0][1] = tl.top() + rad; SetShaderParams(edge, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, tl); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Draw the top right edge segment m_parameters[0][0] = tr.left(); m_parameters[0][1] = tr.top() + rad; SetShaderParams(edge, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, tr); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Draw the bottom left edge segment m_parameters[0][0] = bl.left() + rad; m_parameters[0][1] = bl.top(); SetShaderParams(edge, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, bl); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Draw the bottom right edge segment m_parameters[0][0] = br.left(); m_parameters[0][1] = br.top(); SetShaderParams(edge, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, br); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Vertical lines SetShaderParams(vline, &m_projection[0][0], "u_projection"); m_parameters[0][1] = lineWidth / 2.0; QRect vl(r.left(), r.top() + rad, lineWidth, r.height() - dia); // Draw the left line segment m_parameters[0][0] = vl.left() + lineWidth; SetShaderParams(vline, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, vl); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Draw the right line segment vl.translate(r.width() - lineWidth, 0); m_parameters[0][0] = vl.left(); SetShaderParams(vline, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, vl); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Horizontal lines SetShaderParams(hline, &m_projection[0][0], "u_projection"); QRect hl(r.left() + rad, r.top(), r.width() - dia, lineWidth); // Draw the top line segment m_parameters[0][0] = hl.top() + lineWidth; SetShaderParams(hline, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, hl); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Draw the bottom line segment hl.translate(0, r.height() - lineWidth); m_parameters[0][0] = hl.top(); SetShaderParams(hline, &m_parameters[0][0], "u_parameters"); GetCachedVBO(GL_TRIANGLE_STRIP, hl); m_glVertexAttribPointer(VERTEX_INDEX, VERTEX_SIZE, GL_FLOAT, GL_FALSE, VERTEX_SIZE * sizeof(GLfloat), (const void *) kVertexOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_glBindBuffer(GL_ARRAY_BUFFER, 0); } m_glDisableVertexAttribArray(VERTEX_INDEX); }