gl_primitives.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #include "ui/gl/gl_primitives.h"
  8. #include "ui/gl/gl_shader.h"
  9. #include "ui/style/style_core.h"
  10. #include <QtGui/QOpenGLFunctions>
  11. namespace Ui::GL {
  12. static_assert(std::is_same_v<float, GLfloat>);
  13. void FillRectTriangleVertices(float *coords, Rect rect) {
  14. coords[0] = coords[10] = rect.left();
  15. coords[1] = coords[11] = rect.top();
  16. coords[2] = rect.right();
  17. coords[3] = rect.top();
  18. coords[4] = coords[6] = rect.right();
  19. coords[5] = coords[7] = rect.bottom();
  20. coords[8] = rect.left();
  21. coords[9] = rect.bottom();
  22. }
  23. void FillTriangles(
  24. QOpenGLFunctions &f,
  25. gsl::span<const float> coords,
  26. not_null<QOpenGLBuffer*> buffer,
  27. not_null<QOpenGLShaderProgram*> program,
  28. const QColor &color,
  29. Fn<void()> additional) {
  30. Expects(coords.size() % 6 == 0);
  31. if (coords.empty()) {
  32. return;
  33. }
  34. buffer->bind();
  35. buffer->allocate(coords.data(), coords.size() * sizeof(GLfloat));
  36. program->setUniformValue("s_color", color);
  37. GLint position = program->attributeLocation("position");
  38. f.glVertexAttribPointer(
  39. position,
  40. 2,
  41. GL_FLOAT,
  42. GL_FALSE,
  43. 2 * sizeof(GLfloat),
  44. nullptr);
  45. f.glEnableVertexAttribArray(position);
  46. if (additional) {
  47. additional();
  48. }
  49. f.glDrawArrays(GL_TRIANGLES, 0, coords.size() / 2);
  50. f.glDisableVertexAttribArray(position);
  51. }
  52. void FillRectangle(
  53. QOpenGLFunctions &f,
  54. not_null<QOpenGLShaderProgram*> program,
  55. int skipVertices,
  56. const QColor &color) {
  57. const auto shift = [&](int elements) {
  58. return reinterpret_cast<const void*>(
  59. (skipVertices * 4 + elements) * sizeof(GLfloat));
  60. };
  61. program->setUniformValue("s_color", color);
  62. GLint position = program->attributeLocation("position");
  63. f.glVertexAttribPointer(
  64. position,
  65. 2,
  66. GL_FLOAT,
  67. GL_FALSE,
  68. 2 * sizeof(GLfloat),
  69. shift(0));
  70. f.glEnableVertexAttribArray(position);
  71. f.glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  72. f.glDisableVertexAttribArray(position);
  73. }
  74. void FillTexturedRectangle(
  75. QOpenGLFunctions &f,
  76. not_null<QOpenGLShaderProgram*> program,
  77. int skipVertices) {
  78. const auto shift = [&](int elements) {
  79. return reinterpret_cast<const void*>(
  80. (skipVertices * 4 + elements) * sizeof(GLfloat));
  81. };
  82. GLint position = program->attributeLocation("position");
  83. f.glVertexAttribPointer(
  84. position,
  85. 2,
  86. GL_FLOAT,
  87. GL_FALSE,
  88. 4 * sizeof(GLfloat),
  89. shift(0));
  90. f.glEnableVertexAttribArray(position);
  91. GLint texcoord = program->attributeLocation("v_texcoordIn");
  92. f.glVertexAttribPointer(
  93. texcoord,
  94. 2,
  95. GL_FLOAT,
  96. GL_FALSE,
  97. 4 * sizeof(GLfloat),
  98. shift(2));
  99. f.glEnableVertexAttribArray(texcoord);
  100. f.glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  101. f.glDisableVertexAttribArray(position);
  102. f.glDisableVertexAttribArray(texcoord);
  103. }
  104. } // namespace Ui::GL