summaryrefslogtreecommitdiff
path: root/include/llmr/geometry
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-02-11 15:51:54 +0100
committerKonstantin Käfer <mail@kkaefer.com>2014-02-11 15:51:54 +0100
commitbec0ad10c4b460941d08cca597bf352c96820d34 (patch)
tree39fd506db5deeeedc8aebc51b124e6a68ddd7de4 /include/llmr/geometry
parenteb9a6b7068b9910301bfc7a3b83e114c7545c893 (diff)
downloadqtlocation-mapboxgl-bec0ad10c4b460941d08cca597bf352c96820d34.tar.gz
drawing lines with triangles
Diffstat (limited to 'include/llmr/geometry')
-rw-r--r--include/llmr/geometry/buffer.hpp6
-rw-r--r--include/llmr/geometry/elements_buffer.hpp30
-rw-r--r--include/llmr/geometry/fill_buffer.hpp12
-rw-r--r--include/llmr/geometry/line_buffer.hpp17
-rw-r--r--include/llmr/geometry/vao.hpp43
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;
};