Renderer.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "client/rendering/Renderer.h"
  2. #include "rendering/Attributes.h"
  3. #include "utils/Buffer.h"
  4. #include "utils/Logger.h"
  5. Renderer::Renderer()
  6. : buffer(16), text(nullptr), index(0), maxIndex(0), x(0.0f), y(0.0f),
  7. vertices(0) {
  8. Error error = font.load("resources/font8x8.png", 0);
  9. if(error.has()) {
  10. LOG_WARNING(error.message);
  11. }
  12. vertexBuffer.init(Attributes().addFloat(2).addFloat(2).addColor4());
  13. vertexBuffer.setStreamData(1024 * 1024);
  14. }
  15. void Renderer::setupStringRead(const char* s, int limit) {
  16. text = s;
  17. index = 0;
  18. maxIndex = limit;
  19. }
  20. void Renderer::setupString(const Vector2& pos, const char* s, int limit) {
  21. buffer.clear();
  22. setupStringRead(s, limit);
  23. x = pos[0];
  24. y = pos[1];
  25. vertices = 0;
  26. color = {0xFF, 0xFF, 0xFF, 0x00};
  27. }
  28. bool Renderer::hasStringData() const {
  29. return (index < maxIndex || maxIndex < 0) && text[index] != '\0';
  30. }
  31. char32_t Renderer::readUnicode() {
  32. char32_t c = text[index];
  33. index++;
  34. if(c > 128 && hasStringData()) {
  35. c = (text[index] & 0x3F) | ((c & 0x1F) << 6);
  36. index++;
  37. }
  38. return c;
  39. }
  40. bool Renderer::readColor(char32_t c) {
  41. if(c != '&') {
  42. return false;
  43. }
  44. for(int i = 0; i < 3; i++) {
  45. if(!hasStringData()) {
  46. return true;
  47. }
  48. color[i] = ((text[index] - '0') * 255) / 9;
  49. index++;
  50. }
  51. return true;
  52. }
  53. void Renderer::addChar(char32_t c) {
  54. float minX = (c & 0xF) * (1.0f / 16.0f) + (1.0f / 128.0f);
  55. float minY = (c >> 4) * (1.0f / 16.0f);
  56. float maxX = minX + (1.0f / 16.0f) - (2.0f / 128.0f);
  57. float maxY = minY + (1.0f / 16.0f);
  58. buffer.add(x).add(y).add(minX).add(minY).add(color);
  59. buffer.add(x).add(y + 8.0f).add(minX).add(maxY).add(color);
  60. buffer.add(x + 6.0f).add(y).add(maxX).add(minY).add(color);
  61. buffer.add(x + 6.0f).add(y + 8.0f).add(maxX).add(maxY).add(color);
  62. x += 6;
  63. vertices += 4;
  64. }
  65. void Renderer::renderString(const Vector2& pos, const char* text, int limit) {
  66. setupString(pos, text, limit);
  67. while(hasStringData()) {
  68. char32_t c = readUnicode();
  69. if(readColor(c)) {
  70. continue;
  71. }
  72. addChar(c);
  73. }
  74. font.bindTo(0);
  75. update();
  76. vertexBuffer.drawStrip(vertices);
  77. }
  78. Vector2 Renderer::getStringSize(const char* text, int limit) {
  79. setupStringRead(text, limit);
  80. Vector2 size(0.0f, 8.0f);
  81. while(hasStringData()) {
  82. char32_t c = readUnicode();
  83. if(readColor(c)) {
  84. continue;
  85. }
  86. size[0] += 6.0f;
  87. }
  88. return size;
  89. }
  90. void Renderer::renderRectangle(const Vector2& pos, const Vector2& size,
  91. Color4 c) {
  92. buffer.clear();
  93. buffer.add(pos[0]).add(pos[1]).add(0.0f).add(0.0f).add(c);
  94. buffer.add(pos[0]).add(pos[1] + size[1]).add(0.0f).add(0.0f).add(c);
  95. buffer.add(pos[0] + size[0]).add(pos[1]).add(0.0f).add(0.0f).add(c);
  96. buffer.add(pos[0] + size[0])
  97. .add(pos[1] + size[1])
  98. .add(0.0f)
  99. .add(0.0f)
  100. .add(c);
  101. update();
  102. vertexBuffer.drawStrip(4);
  103. }
  104. void Renderer::update() {
  105. vertexBuffer.updateData(
  106. 0, std::min(buffer.getLength(), vertexBuffer.getSize()), buffer);
  107. }
  108. int Renderer::charsInSpace(float width) {
  109. return std::abs(width / 6.0f);
  110. }