diff --git a/include/llmr/renderer/point_bucket.hpp b/include/llmr/renderer/point_bucket.hpp index 4f9a3d353..9c8de8f88 100644 --- a/include/llmr/renderer/point_bucket.hpp +++ b/include/llmr/renderer/point_bucket.hpp @@ -23,16 +23,13 @@ struct Coordinate; struct pbf; class PointBucket : public Bucket { - typedef ElementGroup group_type; public: PointBucket(const std::shared_ptr& vertexBuffer, - const std::shared_ptr& elementsBuffer, const BucketDescription& bucket_desc); virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id); void addGeometry(pbf& data); - void addGeometry(Coordinate& point); bool hasPoints() const; @@ -43,12 +40,10 @@ public: private: std::shared_ptr vertexBuffer; - std::shared_ptr elementsBuffer; + VertexArrayObject array; const uint32_t vertex_start; - const uint32_t elements_start; - - std::vector groups; + uint32_t vertex_end = 0; }; } diff --git a/src/map/tile.cpp b/src/map/tile.cpp index 0d7258b24..938024d47 100644 --- a/src/map/tile.cpp +++ b/src/map/tile.cpp @@ -207,7 +207,7 @@ std::shared_ptr Tile::createLineBucket(const VectorTileLayer& layer, con } std::shared_ptr Tile::createPointBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { - std::shared_ptr bucket = std::make_shared(pointVertexBuffer, pointElementsBuffer, bucket_desc); + std::shared_ptr bucket = std::make_shared(pointVertexBuffer, bucket_desc); FilteredVectorTileLayer filtered_layer(layer, bucket_desc); for (pbf feature : filtered_layer) { diff --git a/src/renderer/point_bucket.cpp b/src/renderer/point_bucket.cpp index fcdcf96e9..1f786a0cb 100644 --- a/src/renderer/point_bucket.cpp +++ b/src/renderer/point_bucket.cpp @@ -16,43 +16,25 @@ struct geometry_too_long_exception : std::exception {}; using namespace llmr; PointBucket::PointBucket(const std::shared_ptr& vertexBuffer, - const std::shared_ptr& elementsBuffer, const BucketDescription& bucket_desc) : geometry(bucket_desc.geometry), vertexBuffer(vertexBuffer), - elementsBuffer(elementsBuffer), - vertex_start(vertexBuffer->index()), - elements_start(elementsBuffer->index()) -{ + vertex_start(vertexBuffer->index()) { } void PointBucket::addGeometry(pbf& geom) { - Coordinate point; - + Geometry::command cmd; Geometry geometry(geom); int32_t x, y; - geometry.next(x, y); - point.x = x; - point.y = y; - addGeometry(point); -} - -typedef uint16_t PointElement; - -void PointBucket::addGeometry(Coordinate& point) { - vertexBuffer->add(point.x, point.y); - - { - if (!groups.size() || (groups.back().vertex_length + 1 > 65535)) { - groups.emplace_back(); + while ((cmd = geometry.next(x, y)) != Geometry::end) { + if (cmd == Geometry::move_to) { + vertexBuffer->add(x, y); + } else { + fprintf(stderr, "other command than move_to in point geometry\n"); } - - group_type& group = groups.back(); - elementsBuffer->add(group.vertex_length + point); - - group.vertex_length++; - group.elements_length++; } + + vertex_end = vertexBuffer->index(); } void PointBucket::render(Painter& painter, const std::string& layer_name, const Tile::ID& id) { @@ -60,16 +42,11 @@ void PointBucket::render(Painter& painter, const std::string& layer_name, const } bool PointBucket::hasPoints() const { - return !groups.empty(); + return vertex_end > 0; } void PointBucket::drawPoints(PointShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer->itemSize); - char *elements_index = BUFFER_OFFSET(elements_start * elementsBuffer->itemSize); - for (group_type& group : groups) { - group.array.bind(shader, *vertexBuffer, *elementsBuffer, vertex_index); - glDrawElements(GL_POINTS, group.elements_length, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer->itemSize; - elements_index += group.elements_length * elementsBuffer->itemSize; - } + array.bind(shader, *vertexBuffer, vertex_index); + glDrawArrays(GL_POINTS, 0, vertex_end - vertex_start); }