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));
     renderer.update(Utils::interpolate(lastPos, pos, lag), lastRotation.lerp(lag, rotation));
     worldRenderer.render(lag, renderer);
     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;
     (void) lag;
     renderer.scale(2.0f).update();
     renderer.scale(2.0f).update();
     StringBuffer<100> s;
     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);
     Game(const Control& control, const Clock& fps, const Clock& tps, RenderSettings& renderSettings, const Size& size);
 
 
     void tick();
     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;
     bool isRunning() const;
 
 

+ 4 - 4
client/rendering/Engine.cpp

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

+ 4 - 4
client/rendering/Engine.h

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

+ 38 - 14
client/rendering/FontRenderer.cpp

@@ -1,17 +1,16 @@
 #include "client/rendering/FontRenderer.h"
 #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) {
 void FontRenderer::drawString(float x, float y, const char* text) {
-    vertexBuffer.bind();
-
     const int maxIndex = 256;
     const int maxIndex = 256;
-    buffer.reset(maxIndex * 4 * sizeof (float) * 7);
+
+    List<float, maxIndex * 4 * 7> buffer;
 
 
     int index = 0;
     int index = 0;
     float r = 1.0f;
     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 maxX = minX + (1.0f / 16.0f) - 2.0f / 128.0f;
         float maxY = minY + (1.0f / 16.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;
         x += 6;
         index++;
         index++;
     }
     }
-    
+
     tex.bind(0);
     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
 #ifndef FONTRENDERER_H
 #define 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"
 #include "gaming-core/rendering/FileTexture.h"
 
 
 class FontRenderer final {
 class FontRenderer final {
     VertexBuffer vertexBuffer;
     VertexBuffer vertexBuffer;
-    StreamBuffer buffer;
     FileTexture tex;
     FileTexture tex;
     
     
 public:
 public:

+ 4 - 8
client/rendering/Mesh.cpp

@@ -1,12 +1,10 @@
 #include <fstream>
 #include <fstream>
 
 
 #include "client/rendering/Mesh.h"
 #include "client/rendering/Mesh.h"
+#include "gaming-core/wrapper/Attributes.h"
 
 
 Mesh::Mesh() {
 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) {
 void Mesh::add(const Triangle& data) {
@@ -18,11 +16,9 @@ void Mesh::clear() {
 }
 }
 
 
 void Mesh::build() {
 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);
     vertexBuffer.draw(buffer.getLength() * 3);
 }
 }

+ 2 - 2
client/rendering/Mesh.h

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

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

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

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

@@ -10,7 +10,7 @@ class WorldRenderer {
 public:
 public:
     WorldRenderer(const World& world);
     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);
     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;
     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/GLEW.cpp',
     'gaming-core/wrapper/Shader.cpp',
     'gaming-core/wrapper/Shader.cpp',
     'gaming-core/wrapper/Texture.cpp',
     'gaming-core/wrapper/Texture.cpp',
+    'gaming-core/wrapper/VertexBuffer.cpp',
+    'gaming-core/wrapper/Attributes.cpp',
     'gaming-core/rendering/FileTexture.cpp',
     'gaming-core/rendering/FileTexture.cpp',
     'gaming-core/images/PNGReader.cpp',
     'gaming-core/images/PNGReader.cpp',
     'client/rendering/Framebuffers.cpp',
     'client/rendering/Framebuffers.cpp',
@@ -44,8 +46,6 @@ sourcesClient = ['client/Main.cpp',
     'client/rendering/NoiseTexture.cpp',
     'client/rendering/NoiseTexture.cpp',
     'client/input/Control.cpp',
     'client/input/Control.cpp',
     'client/rendering/RenderSettings.cpp',
     'client/rendering/RenderSettings.cpp',
-    'client/rendering/wrapper/VertexBuffer.cpp',
-    'client/rendering/wrapper/StreamBuffer.cpp',
     'client/rendering/Renderer.cpp',
     'client/rendering/Renderer.cpp',
     'client/rendering/renderer/WorldRenderer.cpp',
     'client/rendering/renderer/WorldRenderer.cpp',
     'client/rendering/Vertex.cpp',
     'client/rendering/Vertex.cpp',