diff --git a/include/llmr/map/raster_tile_data.hpp b/include/llmr/map/raster_tile_data.hpp index 33243334b..fd72cca9b 100644 --- a/include/llmr/map/raster_tile_data.hpp +++ b/include/llmr/map/raster_tile_data.hpp @@ -17,6 +17,7 @@ public: virtual void parse(); virtual void render(Painter &painter, const LayerDescription& layer_desc); + virtual bool hasData(const LayerDescription& layer_desc) const; protected: RasterBucket bucket; diff --git a/include/llmr/map/tile_data.hpp b/include/llmr/map/tile_data.hpp index dde48e9c4..65a2892c7 100644 --- a/include/llmr/map/tile_data.hpp +++ b/include/llmr/map/tile_data.hpp @@ -48,6 +48,7 @@ public: // Override this in the child class. virtual void parse() = 0; virtual void render(Painter &painter, const LayerDescription& layer_desc) = 0; + virtual bool hasData(const LayerDescription& layer_desc) const = 0; public: diff --git a/include/llmr/map/vector_tile_data.hpp b/include/llmr/map/vector_tile_data.hpp index 6deae7bd7..b9a428dde 100644 --- a/include/llmr/map/vector_tile_data.hpp +++ b/include/llmr/map/vector_tile_data.hpp @@ -27,6 +27,7 @@ public: virtual void parse(); virtual void render(Painter &painter, const LayerDescription& layer_desc); + virtual bool hasData(const LayerDescription& layer_desc) const; protected: // Holds the actual geometries in this tile. diff --git a/include/llmr/renderer/bucket.hpp b/include/llmr/renderer/bucket.hpp index 9326aaed1..283a2c94b 100644 --- a/include/llmr/renderer/bucket.hpp +++ b/include/llmr/renderer/bucket.hpp @@ -12,6 +12,7 @@ class Painter; class Bucket : private util::noncopyable { public: virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id) = 0; + virtual bool hasData() const = 0; virtual ~Bucket() {} }; diff --git a/include/llmr/renderer/debug_bucket.hpp b/include/llmr/renderer/debug_bucket.hpp index f1a7d151f..0b9df57fa 100644 --- a/include/llmr/renderer/debug_bucket.hpp +++ b/include/llmr/renderer/debug_bucket.hpp @@ -22,6 +22,7 @@ public: DebugBucket(DebugFontBuffer& fontBuffer); virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id); + virtual bool hasData() const; void drawLines(PlainShader& shader); void drawPoints(PlainShader& shader); diff --git a/include/llmr/renderer/fill_bucket.hpp b/include/llmr/renderer/fill_bucket.hpp index 7d2b81287..2d1f61d6a 100644 --- a/include/llmr/renderer/fill_bucket.hpp +++ b/include/llmr/renderer/fill_bucket.hpp @@ -45,9 +45,9 @@ public: ~FillBucket(); virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id); + virtual bool hasData() const; void addGeometry(pbf& data); - bool empty() const; void tessellate(); void drawElements(PlainShader& shader); diff --git a/include/llmr/renderer/line_bucket.hpp b/include/llmr/renderer/line_bucket.hpp index eb55bba5a..e28c85b7a 100644 --- a/include/llmr/renderer/line_bucket.hpp +++ b/include/llmr/renderer/line_bucket.hpp @@ -28,11 +28,11 @@ public: const BucketDescription& bucket_desc); virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id); + virtual bool hasData() const; void addGeometry(pbf& data); void addGeometry(const std::vector& line); - bool empty() const; bool hasPoints() const; void drawLines(LineShader& shader); diff --git a/include/llmr/renderer/point_bucket.hpp b/include/llmr/renderer/point_bucket.hpp index 6bbaaac8a..2aacbe865 100644 --- a/include/llmr/renderer/point_bucket.hpp +++ b/include/llmr/renderer/point_bucket.hpp @@ -28,11 +28,10 @@ public: const BucketDescription& bucket_desc); virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id); + virtual bool hasData() const; void addGeometry(pbf& data); - bool hasPoints() const; - void drawPoints(PointShader& shader); void drawPoints(DotShader& shader); diff --git a/include/llmr/renderer/raster_bucket.hpp b/include/llmr/renderer/raster_bucket.hpp index bac87cc72..17e36de77 100644 --- a/include/llmr/renderer/raster_bucket.hpp +++ b/include/llmr/renderer/raster_bucket.hpp @@ -16,6 +16,7 @@ public: RasterBucket(Texturepool &texturepool); virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id); + virtual bool hasData() const; bool setImage(const std::string &data); diff --git a/include/llmr/renderer/text_bucket.hpp b/include/llmr/renderer/text_bucket.hpp index babec7ea4..2b73aa74d 100644 --- a/include/llmr/renderer/text_bucket.hpp +++ b/include/llmr/renderer/text_bucket.hpp @@ -29,8 +29,8 @@ public: TriangleElementsBuffer &triangleElementsBuffer, const BucketDescription &bucket_desc, Placement &placement); - virtual void render(Painter &painter, const std::string &layer_name, - const Tile::ID &id); + virtual void render(Painter &painter, const std::string &layer_name, const Tile::ID &id); + virtual bool hasData() const; void addGlyphs(const PlacedGlyphs &glyphs, float placementZoom, PlacementRange placementRange, float zoom); @@ -39,8 +39,6 @@ public: const IndexedFaces &faces, const std::map &shapings); - bool empty() const; - void drawGlyphs(TextShader &shader); public: diff --git a/src/map/raster_tile_data.cpp b/src/map/raster_tile_data.cpp index bf3999637..5c522ef2a 100644 --- a/src/map/raster_tile_data.cpp +++ b/src/map/raster_tile_data.cpp @@ -28,3 +28,7 @@ void RasterTileData::parse() { void RasterTileData::render(Painter &painter, const LayerDescription& layer_desc) { bucket.render(painter, layer_desc.name, id); } + +bool RasterTileData::hasData(const LayerDescription& layer_desc) const { + return bucket.hasData(); +} diff --git a/src/map/vector_tile_data.cpp b/src/map/vector_tile_data.cpp index 6b06b74b4..84fc4ffc4 100644 --- a/src/map/vector_tile_data.cpp +++ b/src/map/vector_tile_data.cpp @@ -41,3 +41,15 @@ void VectorTileData::render(Painter &painter, const LayerDescription& layer_desc databucket_it->second->render(painter, layer_desc.name, id); } } + +bool VectorTileData::hasData(const LayerDescription& layer_desc) const { + if (state != State::parsed) return false; + + auto databucket_it = buckets.find(layer_desc.bucket_name); + if (databucket_it != buckets.end()) { + assert(databucket_it->second); + return databucket_it->second->hasData(); + } else { + return false; + } +} diff --git a/src/renderer/debug_bucket.cpp b/src/renderer/debug_bucket.cpp index 2cdec50d3..284d8a371 100644 --- a/src/renderer/debug_bucket.cpp +++ b/src/renderer/debug_bucket.cpp @@ -18,6 +18,10 @@ void DebugBucket::render(Painter& painter, const std::string& /*layer_name*/, co painter.renderDebugText(*this); } +bool DebugBucket::hasData() const { + return fontBuffer.index() > 0; +} + void DebugBucket::drawLines(PlainShader& shader) { array.bind(shader, fontBuffer, BUFFER_OFFSET(0)); glDrawArrays(GL_LINES, 0, (GLsizei)(fontBuffer.index())); diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index 4e553d23d..e4783c5c3 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -206,8 +206,8 @@ void FillBucket::render(Painter& painter, const std::string& layer_name, const T painter.renderFill(*this, layer_name, id); } -bool FillBucket::empty() const { - return triangleGroups.empty() && lineGroups.empty(); +bool FillBucket::hasData() const { + return !triangleGroups.empty() || !lineGroups.empty(); } void FillBucket::drawElements(PlainShader& shader) { diff --git a/src/renderer/line_bucket.cpp b/src/renderer/line_bucket.cpp index 01d7c52a2..f968c56cb 100644 --- a/src/renderer/line_bucket.cpp +++ b/src/renderer/line_bucket.cpp @@ -348,8 +348,8 @@ void LineBucket::render(Painter& painter, const std::string& layer_name, const T painter.renderLine(*this, layer_name, id); } -bool LineBucket::empty() const { - return triangleGroups.empty(); +bool LineBucket::hasData() const { + return !triangleGroups.empty() || !pointGroups.empty(); } bool LineBucket::hasPoints() const { diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index f7b205a31..9f1372674 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -210,17 +210,13 @@ void Painter::prepareTile(const Tile& tile) { } void Painter::renderTileLayer(const Tile& tile, const LayerDescription &layer_desc) { - gl::group group(util::sprintf<32>("render %d/%d/%d", tile.id.z, tile.id.y, tile.id.z)); - assert(tile.data); - if (tile.data->state == TileData::State::parsed) { + if (tile.data->hasData(layer_desc)) { + gl::group group(util::sprintf<32>("render %d/%d/%d", tile.id.z, tile.id.y, tile.id.z)); prepareTile(tile); tile.data->render(*this, layer_desc); - } else { - fprintf(stderr, "tile not parsed yet\n"); + frameHistory.record(map.getAnimationTime(), map.getState().getNormalizedZoom()); } - - frameHistory.record(map.getAnimationTime(), map.getState().getNormalizedZoom()); } void Painter::renderTileDebug(const Tile& tile) { @@ -272,7 +268,7 @@ void Painter::renderRaster(RasterBucket& bucket, const std::string& layer_name, void Painter::renderFill(FillBucket& bucket, const std::string& layer_name, const Tile::ID& id) { // Abort early. - if (bucket.empty()) return; + if (!bucket.hasData()) return; auto fill_properties = map.getStyle().computed.fills; auto fill_properties_it = fill_properties.find(layer_name); @@ -410,7 +406,7 @@ void Painter::renderFill(FillBucket& bucket, const std::string& layer_name, cons void Painter::renderLine(LineBucket& bucket, const std::string& layer_name, const Tile::ID& /*id*/) { // Abort early. if (pass == Opaque) return; - if (bucket.empty()) return; + if (!bucket.hasData()) return; auto line_properties = map.getStyle().computed.lines; auto line_properties_it = line_properties.find(layer_name); @@ -496,7 +492,7 @@ void Painter::renderLine(LineBucket& bucket, const std::string& layer_name, cons void Painter::renderPoint(PointBucket& bucket, const std::string& layer_name, const Tile::ID& /*id&*/) { // Abort early. - if (!bucket.hasPoints()) return; + if (!bucket.hasData()) return; if (pass == Opaque) return; auto point_properties = map.getStyle().computed.points; @@ -571,7 +567,7 @@ void Painter::renderPoint(PointBucket& bucket, const std::string& layer_name, co void Painter::renderText(TextBucket& bucket, const std::string& layer_name, const Tile::ID& /*id*/) { // Abort early. if (pass == Opaque) return; - if (bucket.empty()) return; + if (!bucket.hasData()) return; auto text_properties = map.getStyle().computed.texts; auto text_properties_it = text_properties.find(layer_name); diff --git a/src/renderer/point_bucket.cpp b/src/renderer/point_bucket.cpp index d662595c2..fa8482944 100644 --- a/src/renderer/point_bucket.cpp +++ b/src/renderer/point_bucket.cpp @@ -41,7 +41,7 @@ void PointBucket::render(Painter& painter, const std::string& layer_name, const painter.renderPoint(*this, layer_name, id); } -bool PointBucket::hasPoints() const { +bool PointBucket::hasData() const { return vertex_end > 0; } diff --git a/src/renderer/raster_bucket.cpp b/src/renderer/raster_bucket.cpp index ca173680a..c0260023d 100644 --- a/src/renderer/raster_bucket.cpp +++ b/src/renderer/raster_bucket.cpp @@ -21,3 +21,7 @@ void RasterBucket::drawRaster(RasterShader& shader, VertexBuffer &vertices, Vert array.bind(shader, vertices, BUFFER_OFFSET(0)); glDrawArrays(GL_TRIANGLES, 0, (GLsizei)vertices.index()); } + +bool RasterBucket::hasData() const { + return raster.isLoaded(); +} diff --git a/src/renderer/text_bucket.cpp b/src/renderer/text_bucket.cpp index 5b75ca99f..939a8363e 100644 --- a/src/renderer/text_bucket.cpp +++ b/src/renderer/text_bucket.cpp @@ -146,7 +146,9 @@ void TextBucket::render(Painter &painter, const std::string &layer_name, painter.renderText(*this, layer_name, id); } -bool TextBucket::empty() const { return triangleGroups.empty(); } +bool TextBucket::hasData() const { + return !triangleGroups.empty(); +} void TextBucket::drawGlyphs(TextShader &shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);