From edf2a532af23cba7a22c1de1494d0f811f57c105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Tue, 28 Jan 2014 11:47:21 +0100 Subject: [PATCH] add LineBuffer and change DebugFontBuffer naming --- include/llmr/geometry/debug_font_buffer.hpp | 6 +- include/llmr/geometry/line_buffer.hpp | 65 +++++++++++++++++++++ include/llmr/geometry/linevertexbuffer.hpp | 26 --------- include/llmr/map/tile.hpp | 6 +- src/CMakeLists.txt | 4 +- src/geometry/debug_font_buffer.cpp | 17 +++--- src/geometry/line_buffer.cpp | 45 ++++++++++++++ src/geometry/linevertexbuffer.cpp | 43 -------------- src/map/tile.cpp | 6 +- src/renderer/painter.cpp | 6 +- 10 files changed, 132 insertions(+), 92 deletions(-) create mode 100644 include/llmr/geometry/line_buffer.hpp delete mode 100644 include/llmr/geometry/linevertexbuffer.hpp create mode 100644 src/geometry/line_buffer.cpp delete mode 100644 src/geometry/linevertexbuffer.cpp diff --git a/include/llmr/geometry/debug_font_buffer.hpp b/include/llmr/geometry/debug_font_buffer.hpp index 529428287..fe03297fb 100644 --- a/include/llmr/geometry/debug_font_buffer.hpp +++ b/include/llmr/geometry/debug_font_buffer.hpp @@ -5,10 +5,10 @@ namespace llmr { -class debug_font_buffer { +class DebugFontBuffer { public: - debug_font_buffer(); - ~debug_font_buffer(); + DebugFontBuffer(); + ~DebugFontBuffer(); void addText(const char *text, double left, double baseline, double scale = 1); void clear(); diff --git a/include/llmr/geometry/line_buffer.hpp b/include/llmr/geometry/line_buffer.hpp new file mode 100644 index 000000000..3073ef22f --- /dev/null +++ b/include/llmr/geometry/line_buffer.hpp @@ -0,0 +1,65 @@ +#ifndef LLMR_GEOMETRY_LINE_BUFFER +#define LLMR_GEOMETRY_LINE_BUFFER + +#include + +#include + +namespace llmr { + +class LineBuffer { +public: + ~LineBuffer(); + + /* + * Scale the extrusion vector so that the normal length is this value. + * Contains the "texture" normals (-1..1). This is distinct from the extrude + * normals for line joins, because the x-value remains 0 for the texture + * normal array, while the extrude normal actually moves the vertex to create + * the acute/bevelled line join. + */ + const int8_t extrudeScale = 63; + + /* + * Add a vertex to this buffer + * + * @param {number} x vertex position + * @param {number} y vertex position + * @param {number} ex extrude normal + * @param {number} ey extrude normal + * @param {number} tx texture normal + * @param {number} ty texture normal + */ + void add(int16_t x, int16_t y, float ex, float ey, int8_t tx, int8_t ty, int32_t linesofar = 0); + + /* + * Add a degenerate triangle to the buffer + * + * > So we need a way to get from the end of one triangle strip + * to the beginning of the next strip without actually filling triangles + * on the way. We can do this with "degenerate" triangles: We simply + * repeat the last coordinate of the first triangle strip and the first + * coordinate of the next triangle strip. + */ + void addDegenerate(); + + /* + * Returns the number of elements in this buffer. This is not the number of + * bytes, but rather the number of coordinates with associated information. + */ + uint32_t length() const; + + /* + * Transfers this buffer to the GPU and binds the buffer to the GL context. + */ + void bind(); + +private: + bool dirty = true; + std::vector array; + uint32_t buffer = 0; +}; + +} + +#endif diff --git a/include/llmr/geometry/linevertexbuffer.hpp b/include/llmr/geometry/linevertexbuffer.hpp deleted file mode 100644 index 2396c6b4a..000000000 --- a/include/llmr/geometry/linevertexbuffer.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef LLMR_GEOMETRY_LINEVERTEXBUFFER -#define LLMR_GEOMETRY_LINEVERTEXBUFFER - -#include - -namespace llmr { - -class linevertexbuffer { -public: - linevertexbuffer(); - ~linevertexbuffer(); - - void addDegenerate(); - void addCoordinate(int16_t x, int16_t y); - - uint32_t length(); - void bind(); - -private: - std::vector array; - uint32_t buffer; -}; - -} - -#endif diff --git a/include/llmr/map/tile.hpp b/include/llmr/map/tile.hpp index 86c56fe49..c4cd39116 100644 --- a/include/llmr/map/tile.hpp +++ b/include/llmr/map/tile.hpp @@ -2,8 +2,8 @@ #define LLMR_MAP_TILE #include "../geometry/debug_font_buffer.hpp" -#include "../geometry/linevertexbuffer.hpp" #include "../geometry/fill_buffer.hpp" +#include "../geometry/line_buffer.hpp" #include "layer.hpp" @@ -72,9 +72,9 @@ public: state state; // Holds the actual geometries in this tile. - std::shared_ptr lineVertex; - std::shared_ptr debugFontVertex; + std::shared_ptr debugFontBuffer; std::shared_ptr fillBuffer; + std::shared_ptr lineBuffer; // Holds the buckets of this tile. // They contain the location offsets in the buffers stored above diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 14a3e8812..45b861ebb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,7 @@ SET(llmr_SOURCES geometry/debug_font_buffer.cpp - geometry/linevertexbuffer.cpp geometry/fill_buffer.cpp + geometry/line_buffer.cpp map/map.cpp map/tile.cpp map/transform.cpp @@ -24,8 +24,8 @@ SET(llmr_SOURCES SET(llmr_HEADERS ../include/llmr/geometry/debug_font_buffer.hpp - ../include/llmr/geometry/linevertexbuffer.hpp ../include/llmr/geometry/fill_buffer.hpp + ../include/llmr/geometry/line_buffer.hpp ../include/llmr/llmr.hpp ../include/llmr/map/map.hpp ../include/llmr/map/tile.hpp diff --git a/src/geometry/debug_font_buffer.cpp b/src/geometry/debug_font_buffer.cpp index a383ca573..b88a7e404 100644 --- a/src/geometry/debug_font_buffer.cpp +++ b/src/geometry/debug_font_buffer.cpp @@ -6,20 +6,20 @@ using namespace llmr; -debug_font_buffer::debug_font_buffer() +DebugFontBuffer::DebugFontBuffer() : buffer(0), dirty(true) { } -debug_font_buffer::~debug_font_buffer() { +DebugFontBuffer::~DebugFontBuffer() { if (buffer != 0) { glDeleteBuffers(1, &buffer); buffer = 0; } } -void debug_font_buffer::addText(const char *text, double left, double baseline, double scale) { +void DebugFontBuffer::addText(const char *text, double left, double baseline, double scale) { int32_t length = strlen(text); for (int32_t i = 0; i < length; i++) { if (text[i] < 32 || text[i] > 127) { @@ -52,24 +52,23 @@ void debug_font_buffer::addText(const char *text, double left, double baseline, dirty = true; } -void debug_font_buffer::clear() { +void DebugFontBuffer::clear() { array.clear(); dirty = true; } -uint32_t debug_font_buffer::length() { +uint32_t DebugFontBuffer::length() { // We store 2 coordinates per vertex return array.size() / 2; } -void debug_font_buffer::bind() { +void DebugFontBuffer::bind() { if (buffer == 0) { glGenBuffers(1, &buffer); - glBindBuffer(GL_ARRAY_BUFFER, buffer); - } else { - glBindBuffer(GL_ARRAY_BUFFER, buffer); } + glBindBuffer(GL_ARRAY_BUFFER, buffer); + if (dirty) { glBufferData(GL_ARRAY_BUFFER, array.size() * sizeof(uint16_t), array.data(), GL_STATIC_DRAW); dirty = false; diff --git a/src/geometry/line_buffer.cpp b/src/geometry/line_buffer.cpp new file mode 100644 index 000000000..0c9d815a3 --- /dev/null +++ b/src/geometry/line_buffer.cpp @@ -0,0 +1,45 @@ +#include +#include +// #include + +using namespace llmr; + +LineBuffer::~LineBuffer() { + if (buffer != 0) { + glDeleteBuffers(1, &buffer); + buffer = 0; + } +} + +uint32_t LineBuffer::length() const { + // We store 2 coordinates per vertex + 1 linesofar + 1 extrude coord pair == 4 (== 8 bytes) + return array.size() / 4; +} + +void LineBuffer::add(int16_t x, int16_t y, float ex, float ey, int8_t tx, int8_t ty, int32_t linesofar) { + array.push_back((x * 2) | tx); + array.push_back((y * 2) | ty); + array.push_back(linesofar); + array.push_back( + ((int16_t)round(extrudeScale * ex) << 8) | + ((int16_t)round(extrudeScale * ey) & 0xFF) + ); + if (!dirty) dirty = true; +}; + +void LineBuffer::addDegenerate() { + add(16383, 16383, 0, 0, 1, 1, 0); +} + +void LineBuffer::bind() { + if (buffer == 0) { + glGenBuffers(1, &buffer); + } + + glBindBuffer(GL_ARRAY_BUFFER, buffer); + + if (dirty) { + glBufferData(GL_ARRAY_BUFFER, array.size() * sizeof(int16_t), array.data(), GL_STATIC_DRAW); + dirty = false; + } +} diff --git a/src/geometry/linevertexbuffer.cpp b/src/geometry/linevertexbuffer.cpp deleted file mode 100644 index 3c8521bc3..000000000 --- a/src/geometry/linevertexbuffer.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include - -#include - -using namespace llmr; - -linevertexbuffer::linevertexbuffer() - : buffer(0) { -} - -linevertexbuffer::~linevertexbuffer() { - if (buffer != 0) { - glDeleteBuffers(1, &buffer); - buffer = 0; - } -} - -void linevertexbuffer::addDegenerate() { - array.push_back(32767); - array.push_back(0); -} - -void linevertexbuffer::addCoordinate(int16_t x, int16_t y) { - array.push_back(x); - array.push_back(y); -} - -uint32_t linevertexbuffer::length() { - // We store 2 coordinates per vertex - return array.size() / 2; -} - -void linevertexbuffer::bind() { - if (buffer == 0) { - glGenBuffers(1, &buffer); - // fprintf(stderr, "new buffer id: %d\n", buffer); - glBindBuffer(GL_ARRAY_BUFFER, buffer); - glBufferData(GL_ARRAY_BUFFER, array.size() * sizeof(uint16_t), array.data(), GL_STATIC_DRAW); - } else { - glBindBuffer(GL_ARRAY_BUFFER, buffer); - } -} diff --git a/src/map/tile.cpp b/src/map/tile.cpp index e8a0c1979..57823d993 100644 --- a/src/map/tile.cpp +++ b/src/map/tile.cpp @@ -44,9 +44,9 @@ std::forward_list Tile::children(const ID& id, int32_t z) { Tile::Tile(ID id, const Style& style) : id(id), state(initial), - lineVertex(std::make_shared()), - debugFontVertex(std::make_shared()), + debugFontBuffer(std::make_shared()), fillBuffer(std::make_shared()), + lineBuffer(std::make_shared()), data(0), bytes(0), style(style) { @@ -54,7 +54,7 @@ Tile::Tile(ID id, const Style& style) // Initialize tile debug coordinates char coord[32]; snprintf(coord, sizeof(coord), "%d/%d/%d", id.z, id.x, id.y); - debugFontVertex->addText(coord, 50, 200, 5); + debugFontBuffer->addText(coord, 50, 200, 5); } Tile::~Tile() { diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index 84e8f9594..853ae5558 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -344,14 +344,14 @@ void Painter::renderDebug(const Tile::Ptr& tile) { // draw debug info switchShader(lineShader); glUniformMatrix4fv(lineShader->u_matrix, 1, GL_FALSE, matrix); - tile->debugFontVertex->bind(); + tile->debugFontBuffer->bind(); glVertexAttribPointer(lineShader->a_pos, 2, GL_SHORT, GL_FALSE, 0, BUFFER_OFFSET(0)); glUniform4f(lineShader->u_color, 1.0f, 1.0f, 1.0f, 1.0f); glLineWidth(4.0f); - glDrawArrays(GL_LINES, 0, tile->debugFontVertex->length()); + glDrawArrays(GL_LINES, 0, tile->debugFontBuffer->length()); glUniform4f(lineShader->u_color, 0.0f, 0.0f, 0.0f, 1.0f); glLineWidth(2.0f); - glDrawArrays(GL_LINES, 0, tile->debugFontVertex->length()); + glDrawArrays(GL_LINES, 0, tile->debugFontBuffer->length()); // Revert blending mode to blend to the back. glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);