diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-01-28 14:09:07 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-01-28 14:09:07 +0100 |
commit | f19d5c95dbc2784c53e47e869bef3bbde15c4c71 (patch) | |
tree | 00516757bc0c3abfd9ac2e42426579e78cbf86ce /src | |
parent | 31fca20c16e70b77b0a2cfaba19c5e8e9e1eb438 (diff) | |
download | qtlocation-mapboxgl-f19d5c95dbc2784c53e47e869bef3bbde15c4c71.tar.gz |
rename stroke=>line, add line painter classes
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/map/tile.cpp | 41 | ||||
-rw-r--r-- | src/renderer/line_bucket.cpp | 28 | ||||
-rw-r--r-- | src/renderer/painter.cpp | 4 | ||||
-rw-r--r-- | src/style/style.cpp | 16 |
5 files changed, 62 insertions, 28 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 81d3657334..cc1a52b77e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,6 +12,7 @@ SET(llmr_SOURCES renderer/shader-outline.cpp renderer/shader.cpp renderer/fill_bucket.cpp + renderer/line_bucket.cpp resources/style.cpp shader/shaders.cpp style/style.cpp diff --git a/src/map/tile.cpp b/src/map/tile.cpp index 4bfd0b527a..71b01d15b8 100644 --- a/src/map/tile.cpp +++ b/src/map/tile.cpp @@ -9,6 +9,7 @@ #include <llmr/util/string.hpp> #include <llmr/geometry/geometry.hpp> #include <llmr/renderer/fill_bucket.hpp> +#include <llmr/renderer/line_bucket.hpp> #include <llmr/style/style.hpp> #include <cmath> @@ -149,6 +150,8 @@ std::shared_ptr<Bucket> Tile::createBucket(const BucketDescription& bucket_desc) const VectorTileLayer& layer = layer_it->second; if (bucket_desc.type == BucketType::Fill) { return createFillBucket(layer, bucket_desc); + } else if (bucket_desc.type == BucketType::Line) { + return createLineBucket(layer, bucket_desc); } else { // TODO: create other bucket types. } @@ -159,13 +162,6 @@ std::shared_ptr<Bucket> Tile::createBucket(const BucketDescription& bucket_desc) return NULL; } -enum geom_type { - Unknown = 0, - Point = 1, - LineString = 2, - Polygon = 3 -}; - std::shared_ptr<Bucket> Tile::createFillBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { std::shared_ptr<FillBucket> bucket = std::make_shared<FillBucket>(fillBuffer); @@ -173,22 +169,27 @@ std::shared_ptr<Bucket> Tile::createFillBucket(const VectorTileLayer& layer, con for (pbf feature : filtered_layer) { while (feature.next(4)) { // geometry pbf geometry_pbf = feature.message(); - bucket->addGeometry(geometry_pbf); + if (geometry_pbf) { + bucket->addGeometry(geometry_pbf); + } } } return bucket; } -// void Tile::addLineGeometry(pbf& geom) { -// Geometry geometry(geom); - -// Geometry::command cmd; -// int32_t x, y; -// while ((cmd = geometry.next(x, y)) != Geometry::end) { -// if (cmd == Geometry::move_to) { -// lineVertex.addDegenerate(); -// } -// lineVertex.addCoordinate(x, y); -// } -// } +std::shared_ptr<Bucket> Tile::createLineBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { + std::shared_ptr<LineBucket> bucket = std::make_shared<LineBucket>(lineBuffer); + + FilteredVectorTileLayer filtered_layer(layer, bucket_desc); + for (pbf feature : filtered_layer) { + while (feature.next(4)) { // geometry + pbf geometry_pbf = feature.message(); + if (geometry_pbf) { + bucket->addGeometry(geometry_pbf); + } + } + } + + return bucket; +} diff --git a/src/renderer/line_bucket.cpp b/src/renderer/line_bucket.cpp new file mode 100644 index 0000000000..b4efa2f0b1 --- /dev/null +++ b/src/renderer/line_bucket.cpp @@ -0,0 +1,28 @@ +#include <llmr/renderer/line_bucket.hpp> +#include <llmr/geometry/line_buffer.hpp> +#include <llmr/geometry/geometry.hpp> + +#include <llmr/renderer/painter.hpp> +#include <llmr/style/style.hpp> + +#include <llmr/platform/gl.hpp> + +#define BUFFER_OFFSET(i) ((char *)NULL + (i)) + +#include <cassert> + +struct geometry_too_long_exception : std::exception {}; + +using namespace llmr; + +LineBucket::LineBucket(const std::shared_ptr<LineBuffer>& buffer) + : buffer(buffer) { +} + +void LineBucket::addGeometry(pbf& geom) { + +} + +void LineBucket::render(Painter& painter, const std::string& layer_name) { + painter.renderLine(*this, layer_name); +} diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index 853ae5558d..3323ddcbb9 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -328,6 +328,10 @@ void Painter::renderFill(FillBucket& bucket, const std::string& layer_name) { glStencilFunc(GL_EQUAL, 0x80, 0x80); } +void Painter::renderLine(LineBucket& bucket, const std::string& layer_name) { + const LineProperties& properties = style.computed.lines[layer_name]; +} + void Painter::renderDebug(const Tile::Ptr& tile) { // Blend to the front, not the back. glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); diff --git a/src/style/style.cpp b/src/style/style.cpp index dc60d93a88..6e468962b1 100644 --- a/src/style/style.cpp +++ b/src/style/style.cpp @@ -10,7 +10,7 @@ Style::Style() { void Style::reset() { computed.fills.clear(); - computed.strokes.clear(); + computed.lines.clear(); } void Style::load(const uint8_t *const data, uint32_t bytes) { @@ -91,7 +91,7 @@ std::pair<std::string, ClassDescription> Style::parseClass(pbf data) { } else if (data.tag == 2) { // fill_style klass.fill.insert(parseFillClass(data.message())); } else if (data.tag == 3) { // stroke_style - klass.stroke.insert(parseStrokeClass(data.message())); + klass.line.insert(parseLineClass(data.message())); } else { data.skip(); } @@ -131,8 +131,8 @@ std::pair<std::string, FillClass> Style::parseFillClass(pbf data) { } -std::pair<std::string, StrokeClass> Style::parseStrokeClass(pbf data) { - StrokeClass stroke; +std::pair<std::string, LineClass> Style::parseLineClass(pbf data) { + LineClass stroke; std::string name; while (data.next()) { @@ -216,11 +216,11 @@ void Style::cascade(float z) { } // Cascade line classes - for (const auto& stroke_pair : sheetClass.stroke) { - const std::string& layer_name = stroke_pair.first; - const llmr::StrokeClass& layer = stroke_pair.second; + for (const auto& line_pair : sheetClass.line) { + const std::string& layer_name = line_pair.first; + const llmr::LineClass& layer = line_pair.second; - llmr::StrokeProperties& stroke = computed.strokes[layer_name]; + llmr::LineProperties& stroke = computed.lines[layer_name]; stroke.hidden = layer.hidden(z); stroke.width = layer.width(z); stroke.offset = layer.offset(z); |