소스 검색

simplified font renderer

Kajetan Johannes Hammerle 3 년 전
부모
커밋
4265fd47ef
3개의 변경된 파일25개의 추가작업 그리고 46개의 파일을 삭제
  1. 1 1
      client/Game.cpp
  2. 20 44
      client/rendering/FontRenderer.cpp
  3. 4 1
      client/rendering/FontRenderer.h

+ 1 - 1
client/Game.cpp

@@ -60,7 +60,7 @@ void Game::renderTextOverlay(float lag, Renderer& renderer, FontRenderer& fr) {
     (void) lag;
     renderer.scale(2.0f).update();
     StringBuffer<100> s;
-    s.append("FPS: ").append(fps.getUpdatesPerSecond()).append(" TPS: ").append(tps.getUpdatesPerSecond());
+    s.append("FPS: &074").append(fps.getUpdatesPerSecond()).append(" &999TPS: &722").append(tps.getUpdatesPerSecond());
     fr.drawString(10, 10, s);
 }
 

+ 20 - 44
client/rendering/FontRenderer.cpp

@@ -1,31 +1,31 @@
 #include "client/rendering/FontRenderer.h"
 #include "gaming-core/wrapper/Attributes.h"
-#include "gaming-core/utils/List.h"
+#include "gaming-core/utils/Buffer.h"
 
 FontRenderer::FontRenderer() : tex("resources/font8x8.png") {
-    vertexBuffer.setAttributes(Attributes().addFloat(2).addFloat(2).addFloat(3));
-    vertexBuffer.setStreamData(256 * 4 * 7 * sizeof(float));
+    vertexBuffer.setAttributes(Attributes().addFloat(2).addFloat(2).addColor4());
+    vertexBuffer.setStreamData(MAX_CHARS * VERTEX_SIZE * 4);
 }
 
 void FontRenderer::drawString(float x, float y, const char* text) {
-    const int maxIndex = 256;
-
-    List<float, maxIndex * 4 * 7> buffer;
+    Buffer<MAX_CHARS * VERTEX_SIZE * 4> buffer;
 
     int index = 0;
-    float r = 1.0f;
-    float g = 1.0f;
-    float b = 1.0f;
+    Color4 color(0xFF, 0xFF, 0xFF, 0xFF);
 
-    while(text[index] != '\0' && index < maxIndex) {
-        char c = text[index];
+    while(text[index] != '\0' && index < MAX_CHARS) {
+        char32_t c = text[index];
+        if(c > 128 && index + 1 < MAX_CHARS && text[index + 1] != '\0') {
+            index++;
+            c = (text[index] & 0x3F) | ((c & 0x1F) << 6);
+        }
         if(c == '&') {
             if(text[index + 1] == '\0' || text[index + 2] == '\0' || text[index + 3] == '\0') {
                 break;
             }
-            r = (text[index + 1] - '0') * (1.0f / 9.0f);
-            g = (text[index + 2] - '0') * (1.0f / 9.0f);
-            b = (text[index + 3] - '0') * (1.0f / 9.0f);
+            color[0] = ((text[index + 1] - '0') * 255) / 9;
+            color[1] = ((text[index + 2] - '0') * 255) / 9;
+            color[2] = ((text[index + 3] - '0') * 255) / 9;
             index += 4;
             continue;
         }
@@ -35,40 +35,16 @@ void FontRenderer::drawString(float x, float y, const char* text) {
         float maxX = minX + (1.0f / 16.0f) - 2.0f / 128.0f;
         float maxY = minY + (1.0f / 16.0f);
 
-        buffer.add(x);
-        buffer.add(y);
-        buffer.add(minX);
-        buffer.add(minY);
-        buffer.add(r);
-        buffer.add(g);
-        buffer.add(b);
-        buffer.add(x);
-        buffer.add(y + 8);
-        buffer.add(minX);
-        buffer.add(maxY);
-        buffer.add(r);
-        buffer.add(g);
-        buffer.add(b);
-        buffer.add(x + 6);
-        buffer.add(y);
-        buffer.add(maxX);
-        buffer.add(minY);
-        buffer.add(r);
-        buffer.add(g);
-        buffer.add(b);
-        buffer.add(x + 6);
-        buffer.add(y + 8);
-        buffer.add(maxX);
-        buffer.add(maxY);
-        buffer.add(r);
-        buffer.add(g);
-        buffer.add(b);
+        buffer.add(x).add(y).add(minX).add(minY).add(color);
+        buffer.add(x).add(y + 8).add(minX).add(maxY).add(color);
+        buffer.add(x + 6).add(y).add(maxX).add(minY).add(color);
+        buffer.add(x + 6).add(y + 8).add(maxX).add(maxY).add(color);
 
         x += 6;
         index++;
     }
 
     tex.bindTo(0);
-    vertexBuffer.updateData(0, buffer.getLength() * sizeof(float), buffer.begin());
-    vertexBuffer.drawStrip(buffer.getLength() / 7);
+    vertexBuffer.updateData(0, buffer.getLength(), buffer);
+    vertexBuffer.drawStrip(buffer.getLength() / VERTEX_SIZE);
 }

+ 4 - 1
client/rendering/FontRenderer.h

@@ -5,9 +5,12 @@
 #include "gaming-core/rendering/FileTexture.h"
 
 class FontRenderer final {
+    static constexpr int MAX_CHARS = 256;
+    static constexpr int VERTEX_SIZE = 4 * sizeof (float) + sizeof (Color4);
+
     VertexBuffer vertexBuffer;
     FileTexture<4> tex;
-    
+
 public:
     FontRenderer();