diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-02-11 15:51:54 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-02-11 15:51:54 +0100 |
commit | bec0ad10c4b460941d08cca597bf352c96820d34 (patch) | |
tree | 39fd506db5deeeedc8aebc51b124e6a68ddd7de4 /include/llmr/geometry | |
parent | eb9a6b7068b9910301bfc7a3b83e114c7545c893 (diff) | |
download | qtlocation-mapboxgl-bec0ad10c4b460941d08cca597bf352c96820d34.tar.gz |
drawing lines with triangles
Diffstat (limited to 'include/llmr/geometry')
-rw-r--r-- | include/llmr/geometry/buffer.hpp | 6 | ||||
-rw-r--r-- | include/llmr/geometry/elements_buffer.hpp | 30 | ||||
-rw-r--r-- | include/llmr/geometry/fill_buffer.hpp | 12 | ||||
-rw-r--r-- | include/llmr/geometry/line_buffer.hpp | 17 | ||||
-rw-r--r-- | include/llmr/geometry/vao.hpp | 43 |
5 files changed, 74 insertions, 34 deletions
diff --git a/include/llmr/geometry/buffer.hpp b/include/llmr/geometry/buffer.hpp index 1177bb196e..1b9e5c6307 100644 --- a/include/llmr/geometry/buffer.hpp +++ b/include/llmr/geometry/buffer.hpp @@ -8,7 +8,7 @@ namespace llmr { template < - size_t itemSize, + size_t item_size, int bufferType = GL_ARRAY_BUFFER, size_t defaultLength = 8192 > @@ -44,6 +44,7 @@ public: } } + protected: // increase the buffer size by at least /required/ bytes. void *addElement() { @@ -57,6 +58,9 @@ protected: return static_cast<char *>(array) + (pos - itemSize); } +public: + const size_t itemSize = item_size; + private: // CPU buffer void *array = nullptr; diff --git a/include/llmr/geometry/elements_buffer.hpp b/include/llmr/geometry/elements_buffer.hpp new file mode 100644 index 0000000000..82d97f8b6d --- /dev/null +++ b/include/llmr/geometry/elements_buffer.hpp @@ -0,0 +1,30 @@ +#ifndef LLMR_GEOMETRY_TRIANGLE_ELEMENTS_BUFFER +#define LLMR_GEOMETRY_TRIANGLE_ELEMENTS_BUFFER + +#include "buffer.hpp" + +namespace llmr { + +class TriangleElementsBuffer : public Buffer< + 6, // bytes per triangle (3 * unsigned short == 6 bytes) + GL_ELEMENT_ARRAY_BUFFER +> { +public: + typedef uint16_t element_type; + + void add(element_type a, element_type b, element_type c); +}; + +class PointElementsBuffer : public Buffer< + 2, // bytes per point (1 unsigned short) + GL_ELEMENT_ARRAY_BUFFER +> { +public: + typedef uint16_t element_type; + + void add(element_type a); +}; + +} + +#endif diff --git a/include/llmr/geometry/fill_buffer.hpp b/include/llmr/geometry/fill_buffer.hpp index f413715042..90265b8b97 100644 --- a/include/llmr/geometry/fill_buffer.hpp +++ b/include/llmr/geometry/fill_buffer.hpp @@ -7,7 +7,6 @@ namespace llmr { - class FillVertexBuffer : public Buffer< 4 // bytes per coordinates (2 * unsigned short == 4 bytes) > { @@ -18,17 +17,6 @@ public: void add(vertex_type x, vertex_type y); }; - -class FillElementsBuffer : public Buffer< - 6, // bytes per triangle (3 * unsigned short == 6 bytes) - GL_ELEMENT_ARRAY_BUFFER -> { -public: - typedef uint16_t element_type; - - void add(element_type a, element_type b, element_type c); -}; - } #endif diff --git a/include/llmr/geometry/line_buffer.hpp b/include/llmr/geometry/line_buffer.hpp index ccbdce1191..a18ea810ae 100644 --- a/include/llmr/geometry/line_buffer.hpp +++ b/include/llmr/geometry/line_buffer.hpp @@ -5,8 +5,7 @@ namespace llmr { - -class LineBuffer : public Buffer< +class LineVertexBuffer : public Buffer< 8 // 2 coordinates per vertex + 1 linesofar + 1 extrude coord pair == 4 (== 8 bytes) > { public: @@ -31,20 +30,10 @@ public: * @param {number} tx texture normal * @param {number} ty texture normal */ - void add(vertex_type x, vertex_type 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(); + size_t add(vertex_type x, vertex_type y, float ex, float ey, int8_t tx, int8_t ty, int32_t linesofar = 0); }; + } #endif diff --git a/include/llmr/geometry/vao.hpp b/include/llmr/geometry/vao.hpp index 49401e01d2..a2a5a8a0d0 100644 --- a/include/llmr/geometry/vao.hpp +++ b/include/llmr/geometry/vao.hpp @@ -10,19 +10,47 @@ namespace llmr { template <typename Shader> class VertexArrayObject { public: - template <typename Buffer> - void bind(Shader& shader, Buffer& buffer, char *offset) { + template <typename VertexBuffer> + void bind(Shader& shader, VertexBuffer& vertex_buffer, char *offset) { if (!vao) { glGenVertexArrays(1, &vao); glBindVertexArray(vao); - buffer.bind(); + vertex_buffer.bind(); shader.bind(offset); - buffer_ptr = &buffer; + vertex_buffer_ptr = &vertex_buffer; + elements_buffer_ptr = nullptr; offset_ptr = offset; - } else if (buffer_ptr != &buffer) { - throw std::runtime_error("trying to bind VAO to another buffer"); + } else if (vertex_buffer_ptr != &vertex_buffer) { + throw std::runtime_error("trying to bind VAO to another vertex buffer"); + } else if (elements_buffer_ptr != nullptr) { + throw std::runtime_error("trying to bind VAO to another elements buffer"); + } else if (offset_ptr != offset) { + throw std::runtime_error("trying to bind VAO to another offset"); + } else { + // We have been given the correct information. + glBindVertexArray(vao); + } + } + + template <typename VertexBuffer, typename ElementsBuffer> + void bind(Shader& shader, VertexBuffer& vertex_buffer, ElementsBuffer& elements_buffer, char *offset) { + if (!vao) { + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + + vertex_buffer.bind(); + elements_buffer.bind(); + shader.bind(offset); + + vertex_buffer_ptr = &vertex_buffer; + elements_buffer_ptr = &elements_buffer; + offset_ptr = offset; + } else if (vertex_buffer_ptr != &vertex_buffer) { + throw std::runtime_error("trying to bind VAO to another vertex buffer"); + } else if (elements_buffer_ptr != &elements_buffer) { + throw std::runtime_error("trying to bind VAO to another elements buffer"); } else if (offset_ptr != offset) { throw std::runtime_error("trying to bind VAO to another offset"); } else { @@ -42,7 +70,8 @@ private: // For debug reasons, we're storing the bind information so that we can // detect errors and report - void *buffer_ptr = nullptr; + void *vertex_buffer_ptr = nullptr; + void *elements_buffer_ptr = nullptr; char *offset_ptr = 0; }; |