Renderer.cpp 3.3 KB

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