Browse Source

vertex buffer moved to gaming core, vertex attributes are now set intelligent, stream buffer is removed and replaced by vertex buffer as there is no performance gain right now

Kajetan Johannes Hammerle 3 years ago
parent
commit
7b9003b6dd

+ 2 - 2
client/Game.cpp

@@ -49,12 +49,12 @@ void Game::tick() {
     }
 }
 
-void Game::renderWorld(float lag, Renderer& renderer) const {
+void Game::renderWorld(float lag, Renderer& renderer) {
     renderer.update(Utils::interpolate(lastPos, pos, lag), lastRotation.lerp(lag, rotation));
     worldRenderer.render(lag, renderer);
 }
 
-void Game::renderTextOverlay(float lag, Renderer& renderer, FontRenderer& fr) const {
+void Game::renderTextOverlay(float lag, Renderer& renderer, FontRenderer& fr) {
     (void) lag;
     renderer.scale(2.0f).update();
     StringBuffer<100> s;

+ 3 - 3
client/Game.h

@@ -16,9 +16,9 @@ public:
     Game(const Control& control, const Clock& fps, const Clock& tps, RenderSettings& renderSettings, const Size& size);
 
     void tick();
-    void renderWorld(float lag, Renderer& renderer) const;
-    void renderWorldLines(float lag, Renderer& renderer) const;
-    void renderTextOverlay(float lag, Renderer& renderer, FontRenderer& fr) const;
+    void renderWorld(float lag, Renderer& renderer);
+    void renderWorldLines(float lag, Renderer& renderer);
+    void renderTextOverlay(float lag, Renderer& renderer, FontRenderer& fr);
 
     bool isRunning() const;
 

+ 4 - 4
client/rendering/Engine.cpp

@@ -18,7 +18,7 @@ shaders(shaders), framebuffers(fb), size(size), renderSettings(renderSettings),
     rectangle.build();
 }
 
-void Engine::renderTick(float lag, const Game& game) {
+void Engine::renderTick(float lag, Game& game) {
     updateWorldProjection();
     updateWorldView();
 
@@ -33,7 +33,7 @@ void Engine::renderTick(float lag, const Game& game) {
     renderTextOverlay(lag, game);
 }
 
-void Engine::renderShadow(float lag, const Game& game) {
+void Engine::renderShadow(float lag, Game& game) {
     framebuffers.shadow.bind();
     GL::enableDepthTesting();
     shaders.shadow.use();
@@ -46,7 +46,7 @@ void Engine::renderShadow(float lag, const Game& game) {
     game.renderWorld(lag, renderer);
 }
 
-void Engine::renderWorld(float lag, const Game& game) {
+void Engine::renderWorld(float lag, Game& game) {
     framebuffers.world.bind();
     GL::enableDepthTesting();
     shaders.world.use();
@@ -105,7 +105,7 @@ void Engine::renderPostWorld() {
     rectangle.draw();
 }
 
-void Engine::renderTextOverlay(float lag, const Game& game) {
+void Engine::renderTextOverlay(float lag, Game& game) {
     GL::disableDepthTesting();
     shaders.text.use();
 

+ 4 - 4
client/rendering/Engine.h

@@ -13,14 +13,14 @@
 class Engine final {
 public:
     Engine(Shaders& shaders, Framebuffers& fb, const Size& size, RenderSettings& renderSettings);
-    void renderTick(float lag, const Game& game);
+    void renderTick(float lag, Game& game);
 
 private:
-    void renderShadow(float lag, const Game& game);
-    void renderWorld(float lag, const Game& game);
+    void renderShadow(float lag, Game& game);
+    void renderWorld(float lag, Game& game);
     void renderSSAO();
     void renderPostWorld();
-    void renderTextOverlay(float lag, const Game& game);
+    void renderTextOverlay(float lag, Game& game);
     void updateWorldProjection();
     void updateWorldView();
 

+ 38 - 14
client/rendering/FontRenderer.cpp

@@ -1,17 +1,16 @@
 #include "client/rendering/FontRenderer.h"
+#include "gaming-core/wrapper/Attributes.h"
+#include "gaming-core/utils/List.h"
 
-FontRenderer::FontRenderer() : buffer(8 * 1024 * 1024), tex("resources/font8x8.png") {
-    vertexBuffer.bind();
-    vertexBuffer.setFloatAttribute(0, 2, 0, 7);
-    vertexBuffer.setFloatAttribute(1, 2, 2, 7);
-    vertexBuffer.setFloatAttribute(2, 3, 4, 7);
+FontRenderer::FontRenderer() : tex("resources/font8x8.png") {
+    vertexBuffer.setAttributes(Attributes().addFloat(2).addFloat(2).addFloat(3));
+    vertexBuffer.setStreamData(256 * 4 * 7 * sizeof(float));
 }
 
 void FontRenderer::drawString(float x, float y, const char* text) {
-    vertexBuffer.bind();
-
     const int maxIndex = 256;
-    buffer.reset(maxIndex * 4 * sizeof (float) * 7);
+
+    List<float, maxIndex * 4 * 7> buffer;
 
     int index = 0;
     float r = 1.0f;
@@ -36,15 +35,40 @@ 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).add(y).add(minX).add(minY).add(r).add(g).add(b);
-        buffer.add(x).add(y + 8).add(minX).add(maxY).add(r).add(g).add(b);
-        buffer.add(x + 6).add(y).add(maxX).add(minY).add(r).add(g).add(b);
-        buffer.add(x + 6).add(y + 8).add(maxX).add(maxY).add(r).add(g).add(b);
+        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);
 
         x += 6;
         index++;
     }
-    
+
     tex.bind(0);
-    buffer.draw(7);
+    vertexBuffer.updateData(0, buffer.getLength() * sizeof(float), buffer.begin());
+    vertexBuffer.drawStrip(buffer.getLength() / 7);
 }

+ 1 - 3
client/rendering/FontRenderer.h

@@ -1,13 +1,11 @@
 #ifndef FONTRENDERER_H
 #define FONTRENDERER_H
 
-#include "client/rendering/wrapper/VertexBuffer.h"
-#include "client/rendering/wrapper/StreamBuffer.h"
+#include "gaming-core/wrapper/VertexBuffer.h"
 #include "gaming-core/rendering/FileTexture.h"
 
 class FontRenderer final {
     VertexBuffer vertexBuffer;
-    StreamBuffer buffer;
     FileTexture tex;
     
 public:

+ 4 - 8
client/rendering/Mesh.cpp

@@ -1,12 +1,10 @@
 #include <fstream>
 
 #include "client/rendering/Mesh.h"
+#include "gaming-core/wrapper/Attributes.h"
 
 Mesh::Mesh() {
-    vertexBuffer.bind();
-    vertexBuffer.setFloatAttribute(0, 3, 0, 8);
-    vertexBuffer.setFloatAttribute(1, 2, 3, 8);
-    vertexBuffer.setFloatAttribute(2, 3, 5, 8);
+    vertexBuffer.setAttributes(Attributes().addFloat(3).addFloat(2).addFloat(3));
 }
 
 void Mesh::add(const Triangle& data) {
@@ -18,11 +16,9 @@ void Mesh::clear() {
 }
 
 void Mesh::build() {
-    vertexBuffer.bindBuffer();
-    vertexBuffer.setData(sizeof (Triangle) * buffer.getLength(), &(buffer[0]));
+    vertexBuffer.setStaticData(sizeof (Triangle) * buffer.getLength(), buffer.begin());
 }
 
-void Mesh::draw() const {
-    vertexBuffer.bindArray();
+void Mesh::draw() {
     vertexBuffer.draw(buffer.getLength() * 3);
 }

+ 2 - 2
client/rendering/Mesh.h

@@ -1,7 +1,7 @@
 #ifndef MESH_H
 #define MESH_H
 
-#include "client/rendering/wrapper/VertexBuffer.h"
+#include "gaming-core/wrapper/VertexBuffer.h"
 #include "gaming-core/utils/List.h"
 #include "client/rendering/Triangle.h"
 
@@ -13,7 +13,7 @@ public:
 
     void clear();
     void build();
-    void draw() const;
+    void draw();
 
 private:
     VertexBuffer vertexBuffer;

+ 1 - 1
client/rendering/renderer/WorldRenderer.cpp

@@ -16,7 +16,7 @@ WorldRenderer::WorldRenderer(const World& world) : world(world), texture("resour
     mesh.build();
 }
 
-void WorldRenderer::render(float lag, Renderer& renderer) const {
+void WorldRenderer::render(float lag, Renderer& renderer) {
     (void) lag;
     (void) renderer;
     texture.bind(0);

+ 1 - 1
client/rendering/renderer/WorldRenderer.h

@@ -10,7 +10,7 @@ class WorldRenderer {
 public:
     WorldRenderer(const World& world);
 
-    void render(float lag, Renderer& renderer) const;
+    void render(float lag, Renderer& renderer);
     void addCube(float x, float y, float z, bool bottom, bool top, bool left, bool right, bool front, bool back);
     bool isAir(int x, int y, int z) const;
 

+ 0 - 28
client/rendering/wrapper/StreamBuffer.cpp

@@ -1,28 +0,0 @@
-#include <GL/glew.h>
-#include <cassert>
-
-#include "client/rendering/wrapper/StreamBuffer.h"
-
-StreamBuffer::StreamBuffer(int size) : bufferSize(size), offset(size), index(0), buffer(nullptr) {
-}
-
-void StreamBuffer::reset(int size) {
-    if(offset + size >= bufferSize) {
-        offset = 0;
-        glBufferData(GL_ARRAY_BUFFER, bufferSize, nullptr, GL_STREAM_DRAW);
-    }
-    buffer = static_cast<float*> (glMapBufferRange(GL_ARRAY_BUFFER, offset, size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT));
-    assert(buffer != nullptr);
-    index = 0;
-}
-
-StreamBuffer& StreamBuffer::add(float f) {
-    buffer[index++] = f;
-    return *this;
-}
-
-void StreamBuffer::draw(int floatPerVertex) {
-    glUnmapBuffer(GL_ARRAY_BUFFER);
-    glDrawArrays(GL_TRIANGLE_STRIP, offset / (sizeof (float) * floatPerVertex), index / floatPerVertex);
-    offset += index * sizeof(float);
-}

+ 0 - 23
client/rendering/wrapper/StreamBuffer.h

@@ -1,23 +0,0 @@
-#ifndef STREAMBUFFER_H
-#define STREAMBUFFER_H
-
-class StreamBuffer final {
-    int bufferSize;
-    int offset;
-
-    int index;
-    float* buffer;
-    
-public:
-    StreamBuffer(int size);
-    StreamBuffer(const StreamBuffer& other) = delete;
-    StreamBuffer(StreamBuffer&& other) = delete;
-    StreamBuffer& operator=(const StreamBuffer& other) = delete;
-    StreamBuffer& operator=(StreamBuffer&& other) = delete;
-
-    void reset(int size);
-    StreamBuffer& add(float f);
-    void draw(int floatPerVertex);
-};
-
-#endif

+ 0 - 41
client/rendering/wrapper/VertexBuffer.cpp

@@ -1,41 +0,0 @@
-#include "client/rendering/wrapper/VertexBuffer.h"
-
-VertexBuffer::VertexBuffer() : vertexArray(0), vertexBuffer(0) {
-    glGenVertexArrays(1, &vertexArray);
-    glGenBuffers(1, &vertexBuffer);
-}
-
-VertexBuffer::~VertexBuffer() {
-    glDeleteBuffers(1, &vertexBuffer);
-    glDeleteVertexArrays(1, &vertexArray);
-}
-
-void VertexBuffer::setFloatAttribute(int index, int length, int offset, int step) {
-    glVertexAttribPointer(index, length, GL_FLOAT, false, sizeof (float) * step, static_cast<float*> (0) + offset);
-    glEnableVertexAttribArray(index);
-}
-
-void VertexBuffer::setData(int size, const void* data) {
-    glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
-}
-
-void VertexBuffer::bindArray() const {
-    glBindVertexArray(vertexArray);
-}
-
-void VertexBuffer::bindBuffer() const {
-    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
-}
-
-void VertexBuffer::bind() const {
-    bindArray();
-    bindBuffer();
-}
-
-void VertexBuffer::draw(int vertices) const {
-    glDrawArrays(GL_TRIANGLES, 0, vertices);
-}
-
-void VertexBuffer::drawLines(int vertices) const {
-    glDrawArrays(GL_LINES, 0, vertices);
-}

+ 0 - 30
client/rendering/wrapper/VertexBuffer.h

@@ -1,30 +0,0 @@
-#ifndef VERTEXBUFFER_H
-#define VERTEXBUFFER_H
-
-#include <GL/glew.h>
-
-class VertexBuffer final {
-public:
-    VertexBuffer();
-    ~VertexBuffer();
-    VertexBuffer(const VertexBuffer& other) = delete;
-    VertexBuffer(VertexBuffer&& other) = delete;
-    VertexBuffer& operator=(const VertexBuffer& other) = delete;
-    VertexBuffer& operator=(VertexBuffer&& other) = delete;
-    
-    void setFloatAttribute(int index, int length, int offset, int step);
-    void setData(int size, const void* data);
-    
-    void bindArray() const;
-    void bindBuffer() const;
-    void bind() const;
-    
-    void draw(int vertices) const;
-    void drawLines(int vertices) const;
-
-private:
-    GLuint vertexArray;
-    GLuint vertexBuffer;
-};
-
-#endif

+ 1 - 1
gaming-core

@@ -1 +1 @@
-Subproject commit 647e4f95de28a6300ed0d50762ff19a22b7be5f5
+Subproject commit 9398efdd34f486e25c52053ec2c95472a063e26f

+ 2 - 2
meson.build

@@ -29,6 +29,8 @@ sourcesClient = ['client/Main.cpp',
     'gaming-core/wrapper/GLEW.cpp',
     'gaming-core/wrapper/Shader.cpp',
     'gaming-core/wrapper/Texture.cpp',
+    'gaming-core/wrapper/VertexBuffer.cpp',
+    'gaming-core/wrapper/Attributes.cpp',
     'gaming-core/rendering/FileTexture.cpp',
     'gaming-core/images/PNGReader.cpp',
     'client/rendering/Framebuffers.cpp',
@@ -44,8 +46,6 @@ sourcesClient = ['client/Main.cpp',
     'client/rendering/NoiseTexture.cpp',
     'client/input/Control.cpp',
     'client/rendering/RenderSettings.cpp',
-    'client/rendering/wrapper/VertexBuffer.cpp',
-    'client/rendering/wrapper/StreamBuffer.cpp',
     'client/rendering/Renderer.cpp',
     'client/rendering/renderer/WorldRenderer.cpp',
     'client/rendering/Vertex.cpp',