From 510aaef07fd4a26d39726e02998da2abc5d14649 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Fri, 8 Aug 2014 15:26:42 -0700 Subject: [PATCH] render single tile in source.cpp --- include/mbgl/map/map.hpp | 3 +- include/mbgl/map/source.hpp | 1 + src/map/map.cpp | 70 +++------------------------------ src/map/source.cpp | 7 ++++ src/renderer/painter_raster.cpp | 14 ++++--- 5 files changed, 23 insertions(+), 72 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index f7397497e..59f54bdb1 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -48,8 +48,7 @@ public: void renderLayers(std::shared_ptr group); enum RenderPass { Opaque, Translucent }; - void renderLayer(std::shared_ptr layer_desc, RenderPass pass); - void renderLayer(std::shared_ptr layer_desc, RenderPass pass, Tile::ID id); + void renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id = nullptr); // Forces a map update: always triggers a rerender. void update(); diff --git a/include/mbgl/map/source.hpp b/include/mbgl/map/source.hpp index c3f2d4fe8..d708305fe 100644 --- a/include/mbgl/map/source.hpp +++ b/include/mbgl/map/source.hpp @@ -32,6 +32,7 @@ public: void drawClippingMasks(Painter &painter); size_t getTileCount() const; void render(Painter &painter, std::shared_ptr layer_desc); + void render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id); void finishRender(Painter &painter); std::forward_list getIDs() const; diff --git a/src/map/map.cpp b/src/map/map.cpp index 3db6e1171..a289e46a2 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -633,7 +633,7 @@ void Map::renderLayers(std::shared_ptr group) { } } -void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass) { +void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id) { if (layer_desc->layers && layer_desc->type != StyleLayerType::Raster) { // This is a layer group. We render them during our translucent render pass. if (pass == Translucent) { @@ -716,68 +716,10 @@ void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass) { std::cout << std::string(indent * 4, ' ') << "- " << layer_desc->id << " (" << layer_desc->type << ")" << std::endl; } - style_source.source->render(painter, layer_desc); + if (!id) { + style_source.source->render(painter, layer_desc); + } else { + style_source.source->render(painter, layer_desc, *id); + } } } - -//void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass, Tile::ID &id) { -// if (!layer_desc->bucket) { -// fprintf(stderr, "[WARNING] layer '%s' is missing bucket\n", layer_desc->id.c_str()); -// return; -// } -// -// if (!layer_desc->bucket->style_source) { -// fprintf(stderr, "[WARNING] can't find source for layer '%s'\n", layer_desc->id.c_str()); -// return; -// } -// -// StyleSource &style_source = *layer_desc->bucket->style_source; -// -// // Skip this layer if there is no data. -// if (!style_source.source) { -// return; -// } -// -// // Skip this layer if it's outside the range of min/maxzoom. -// // This may occur when there /is/ a bucket created for this layer, but the min/max-zoom -// // is set to a fractional value, or value that is larger than the source maxzoom. -// const double zoom = state.getZoom(); -// if (layer_desc->bucket->min_zoom > zoom || -// layer_desc->bucket->max_zoom <= zoom) { -// return; -// } -// -// // Abort early if we can already deduce from the bucket type that -// // we're not going to render anything anyway during this pass. -// switch (layer_desc->type) { -// case StyleLayerType::Fill: -// if (!layer_desc->getProperties().isVisible()) return; -// break; -// case StyleLayerType::Line: -// if (pass == Opaque) return; -// if (!layer_desc->getProperties().isVisible()) return; -// break; -// case StyleLayerType::Icon: -// if (pass == Opaque) return; -// if (!layer_desc->getProperties().isVisible()) return; -// break; -// case StyleLayerType::Text: -// if (pass == Opaque) return; -// if (!layer_desc->getProperties().isVisible()) return; -// break; -// case StyleLayerType::Raster: -// if (pass == Opaque) return; -// if (!layer_desc->getProperties().isVisible()) return; -// break; -// default: -// break; -// } -// -// if (debug::renderTree) { -// std::cout << std::string(indent * 4, ' ') << "- " << layer_desc->id << " (" -// << layer_desc->type << ")" << std::endl; -// } -//// style_source.source->render(painter, layer_desc); -// painter.renderTileLayer(id, layer_desc); -//} - diff --git a/src/map/source.cpp b/src/map/source.cpp index f9e34d926..c4cd3a51d 100644 --- a/src/map/source.cpp +++ b/src/map/source.cpp @@ -87,6 +87,13 @@ void Source::render(Painter &painter, std::shared_ptr layer_desc) { } } } + +void Source::render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id) { + auto it = tiles.find(id); + if (it != tiles.end() && it->second->data && it->second->data->state == TileData::State::parsed) { + painter.renderTileLayer(*it->second, layer_desc); + } +} void Source::finishRender(Painter &painter) { for (std::pair> &pair : tiles) { diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 1462af76b..8d8f263ba 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -32,7 +32,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay const mat4 oldMatrix = vtxMatrix; - const mat4 preMatrix = [&]{ + const mat4 vtxMatrix = [&]{ mat4 vtxMatrix; matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); @@ -42,22 +42,24 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay // *id.matrix = vtxMatrix; - map.state.matrixFor(matrix, id); - matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); - matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); // glUniformMatrix4fv(matrix, 1, GL_FALSE, preMatrix.data()); // call updateTiles to get parsed data for sublayers map.updateTiles(); + +// map.state.matrixFor(matrix, id); +// matrix::ortho(matrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); +// matrix::translate(matrix, matrix, 0, -4096, 0); + int i = 0; for (auto it = layer_desc->layers->layers.begin(), end = layer_desc->layers->layers.end(); it != end; ++it, --i) { setOpaque(); - map.renderLayer(*it, Map::RenderPass::Opaque); + map.renderLayer(*it, Map::RenderPass::Opaque, &id); setTranslucent(); - map.renderLayer(*it, Map::RenderPass::Translucent); + map.renderLayer(*it, Map::RenderPass::Translucent, &id); } // TODO make a separate renderLayer overload that takes a prerendered + tileID