From f8a096a4fa720e0573b1c22d471d34a976383248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Tue, 11 Mar 2014 12:55:04 +0100 Subject: [PATCH] use templated function to reduce code --- include/llmr/map/tile_data.hpp | 1 + src/map/tile_data.cpp | 46 +++++++++------------------------- src/renderer/fill_bucket.cpp | 2 ++ 3 files changed, 15 insertions(+), 34 deletions(-) diff --git a/include/llmr/map/tile_data.hpp b/include/llmr/map/tile_data.hpp index 98709ad32..e8cbb6793 100644 --- a/include/llmr/map/tile_data.hpp +++ b/include/llmr/map/tile_data.hpp @@ -62,6 +62,7 @@ public: bool parse(); void parseStyleLayers(const VectorTile& tile, const std::vector& layers); std::shared_ptr createBucket(const VectorTile& tile, const BucketDescription& bucket_desc); + template void addBucketFeatures(Bucket& bucket, const VectorTileLayer& layer, const BucketDescription& bucket_desc); std::shared_ptr createFillBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc); std::shared_ptr createLineBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc); std::shared_ptr createPointBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc); diff --git a/src/map/tile_data.cpp b/src/map/tile_data.cpp index d62b323db..16c1e461f 100644 --- a/src/map/tile_data.cpp +++ b/src/map/tile_data.cpp @@ -162,57 +162,35 @@ std::shared_ptr TileData::createBucket(const VectorTile& tile, const Buc return nullptr; } -std::shared_ptr TileData::createFillBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { - std::shared_ptr bucket = std::make_shared(fillVertexBuffer, triangleElementsBuffer, lineElementsBuffer, bucket_desc); - +template +void TileData::addBucketFeatures(Bucket& bucket, const VectorTileLayer& layer, const BucketDescription& bucket_desc) { FilteredVectorTileLayer filtered_layer(layer, bucket_desc); for (pbf feature : filtered_layer) { - if (state == State::obsolete) return nullptr; + if (state == State::obsolete) return; while (feature.next(4)) { // geometry pbf geometry_pbf = feature.message(); if (geometry_pbf) { bucket->addGeometry(geometry_pbf); - bucket->tessellate(); } } } +} - return bucket; +std::shared_ptr TileData::createFillBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { + std::shared_ptr bucket = std::make_shared(fillVertexBuffer, triangleElementsBuffer, lineElementsBuffer, bucket_desc); + addBucketFeatures(bucket, layer, bucket_desc); + return state == State::obsolete ? nullptr : bucket; } std::shared_ptr TileData::createLineBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { std::shared_ptr bucket = std::make_shared(lineVertexBuffer, triangleElementsBuffer, pointElementsBuffer, bucket_desc); - - FilteredVectorTileLayer filtered_layer(layer, bucket_desc); - for (pbf feature : filtered_layer) { - if (state == State::obsolete) return nullptr; - - while (feature.next(4)) { // geometry - pbf geometry_pbf = feature.message(); - if (geometry_pbf) { - bucket->addGeometry(geometry_pbf); - } - } - } - - return bucket; + addBucketFeatures(bucket, layer, bucket_desc); + return state == State::obsolete ? nullptr : bucket; } std::shared_ptr TileData::createPointBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { std::shared_ptr bucket = std::make_shared(pointVertexBuffer, bucket_desc); - - FilteredVectorTileLayer filtered_layer(layer, bucket_desc); - for (pbf feature : filtered_layer) { - if (state == State::obsolete) return nullptr; - - while (feature.next(4)) { // geometry - pbf geometry_pbf = feature.message(); - if (geometry_pbf) { - bucket->addGeometry(geometry_pbf); - } - } - } - - return bucket; + addBucketFeatures(bucket, layer, bucket_desc); + return state == State::obsolete ? nullptr : bucket; } diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index f1d699214..92d654d14 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -88,6 +88,8 @@ void FillBucket::addGeometry(pbf& geom) { line.clear(); hasVertices = true; } + + tessellate(); } void FillBucket::tessellate() {