diff options
author | Lauren Budorick <lauren@mapbox.com> | 2014-08-05 18:13:02 -0700 |
---|---|---|
committer | Lauren Budorick <lauren@mapbox.com> | 2014-08-11 12:13:22 -0700 |
commit | 9e1156d660cfe220db25c4f21de2aec2ed175487 (patch) | |
tree | e06bc8e9c04d7b8a6bbee1aba47b5f5bd904460a | |
parent | df925fe0e5429085f0f443f4be1326c0616f6acc (diff) | |
download | qtlocation-mapboxgl-9e1156d660cfe220db25c4f21de2aec2ed175487.tar.gz |
take 2, still not working
-rw-r--r-- | include/mbgl/map/tile_parser.hpp | 2 | ||||
-rw-r--r-- | include/mbgl/renderer/prerendered_texture.hpp | 5 | ||||
-rw-r--r-- | include/mbgl/style/rasterize_properties.hpp | 2 | ||||
-rw-r--r-- | include/mbgl/style/style_bucket.hpp | 1 | ||||
-rw-r--r-- | include/mbgl/style/style_layer.hpp | 5 | ||||
-rw-r--r-- | src/map/map.cpp | 70 | ||||
-rw-r--r-- | src/map/tile_parser.cpp | 14 | ||||
-rw-r--r-- | src/renderer/painter_fill.cpp | 52 | ||||
-rw-r--r-- | src/renderer/painter_prerender.cpp | 5 | ||||
-rw-r--r-- | src/renderer/prerendered_texture.cpp | 3 | ||||
-rw-r--r-- | src/renderer/raster_bucket.cpp | 6 | ||||
-rw-r--r-- | src/style/style_layer.cpp | 5 | ||||
-rw-r--r-- | src/style/style_parser.cpp | 31 |
13 files changed, 153 insertions, 48 deletions
diff --git a/include/mbgl/map/tile_parser.hpp b/include/mbgl/map/tile_parser.hpp index 9aa0f4dc66..313431c869 100644 --- a/include/mbgl/map/tile_parser.hpp +++ b/include/mbgl/map/tile_parser.hpp @@ -22,6 +22,7 @@ class Sprite; class Style; class StyleBucket; class StyleBucketFill; +class StyleBucketRaster; class StyleBucketLine; class StyleBucketSymbol; class StyleLayerGroup; @@ -45,6 +46,7 @@ private: std::unique_ptr<Bucket> createBucket(std::shared_ptr<StyleBucket> bucket_desc); std::unique_ptr<Bucket> createFillBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketFill &fill); + std::unique_ptr<Bucket> createRasterBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketRaster &raster); std::unique_ptr<Bucket> createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line); std::unique_ptr<Bucket> createSymbolBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketSymbol &symbol); diff --git a/include/mbgl/renderer/prerendered_texture.hpp b/include/mbgl/renderer/prerendered_texture.hpp index 9c72e14b88..310375b5ea 100644 --- a/include/mbgl/renderer/prerendered_texture.hpp +++ b/include/mbgl/renderer/prerendered_texture.hpp @@ -4,6 +4,7 @@ #include <mbgl/util/noncopyable.hpp> #include <mbgl/platform/gl.hpp> #include <mbgl/style/rasterize_properties.hpp> +//#include <mbgl/renderer/raster_bucket.hpp> namespace mbgl { @@ -11,7 +12,7 @@ class Painter; class PrerenderedTexture : private util::noncopyable { public: - PrerenderedTexture(const RasterizedProperties &properties); + PrerenderedTexture(const RasterBucket &properties); ~PrerenderedTexture(); void bindTexture(); @@ -23,7 +24,7 @@ public: void blur(Painter& painter, uint16_t passes); public: - const RasterizedProperties properties; + const RasterBucket properties; private: GLint previous_fbo = 0; diff --git a/include/mbgl/style/rasterize_properties.hpp b/include/mbgl/style/rasterize_properties.hpp index e1e56d6ec9..e156ede77b 100644 --- a/include/mbgl/style/rasterize_properties.hpp +++ b/include/mbgl/style/rasterize_properties.hpp @@ -15,7 +15,7 @@ public: class RasterizeProperties { public: -// Function<bool> enabled = ConstantFunction<bool>(false); // going to need to delete this? or keep ? + Function<bool> enabled = ConstantFunction<bool>(false); // maybe delete? Function<float> buffer = ConstantFunction<float>(1.0f / 32.0f); Function<float> size = ConstantFunction<float>(256); Function<float> blur = ConstantFunction<float>(0); diff --git a/include/mbgl/style/style_bucket.hpp b/include/mbgl/style/style_bucket.hpp index 25786720b1..5cb1b69312 100644 --- a/include/mbgl/style/style_bucket.hpp +++ b/include/mbgl/style/style_bucket.hpp @@ -82,6 +82,7 @@ public: class StyleBucketRaster { public: + bool prerendered = false; uint16_t raster_size = 256; float blur = 0.0f; float buffer = 0.03125f; diff --git a/include/mbgl/style/style_layer.hpp b/include/mbgl/style/style_layer.hpp index 14d60ed9b6..bcda9950a2 100644 --- a/include/mbgl/style/style_layer.hpp +++ b/include/mbgl/style/style_layer.hpp @@ -20,8 +20,7 @@ class StyleLayerGroup; class StyleLayer { public: - StyleLayer(const std::string &id, std::map<ClassID, ClassProperties> &&styles, - std::unique_ptr<const RasterizeProperties> &&rasterize); + StyleLayer(const std::string &id, std::map<ClassID, ClassProperties> &&styles); template <typename T> const T &getProperties() { if (properties.is<T>()) { @@ -83,7 +82,7 @@ public: // Rasterization properties are used for prerendering the tile to a bitmap, // which is then used as a raster image instead of rendering this layer // directly in every frame. - const std::unique_ptr<const RasterizeProperties> rasterize; +// const std::unique_ptr<const RasterizeProperties> rasterize; // Child layer array (if this layer has child layers). std::shared_ptr<StyleLayerGroup> layers; diff --git a/src/map/map.cpp b/src/map/map.cpp index c5df1f96df..a6e245376c 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -649,29 +649,63 @@ void Map::renderLayers(std::shared_ptr<StyleLayerGroup> group) { } void Map::renderLayer(std::shared_ptr<StyleLayer> layer_desc, RenderPass pass) { - 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) { - const CompositeProperties &properties = layer_desc->getProperties<CompositeProperties>(); - if (properties.isVisible()) { - gl::group group(std::string("group: ") + layer_desc->id); - - if (debug::renderTree) { - std::cout << std::string(indent++ * 4, ' ') << "+ " << layer_desc->id - << " (Composite) {" << std::endl; - } + if (layer_desc->layers) { + if (layer_desc->type == StyleLayerType::Raster) { + const RasterProperties &properties = layer_desc->getProperties<RasterProperties>(); + +// const RasterizedProperties rasterize = layer_desc->getProperties<RasterProperties>(); +// +// auto prerendered = std::make_unique<PrerenderedTexture>(rasterize); +// prerendered->bindFramebuffer(); +// +// painter.preparePrerender(*prerendered); +// +// const int buffer = rasterize.buffer * 4096.0f; +// const mat4 vtxMatrix = [&]{ +// mat4 vtxMatrix; +// matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); +// matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); +// return vtxMatrix; +// }(); +// +// painter.setOpaque(); +// renderLayers(layer_desc->layers); +// painter.setTranslucent(); +// renderLayers(layer_desc->layers); +// +// if (rasterize.blur > 0) { +// prerendered->blur(painter, rasterize.blur); +// } +// +// prerendered->unbindFramebuffer(); +// painter.finishPrerender(*prerendered); +// +// painter.renderPrerenderedTexture(*prerendered, rasterize); + + } else { + // This is a layer group. We render them during our translucent render pass. + if (pass == Translucent) { + const CompositeProperties &properties = layer_desc->getProperties<CompositeProperties>(); + if (properties.isVisible()) { + gl::group group(std::string("group: ") + layer_desc->id); + + if (debug::renderTree) { + std::cout << std::string(indent++ * 4, ' ') << "+ " << layer_desc->id + << " (Composite) {" << std::endl; + } - painter.pushFramebuffer(); + painter.pushFramebuffer(); - renderLayers(layer_desc->layers); + renderLayers(layer_desc->layers); - GLuint texture = painter.popFramebuffer(); + GLuint texture = painter.popFramebuffer(); - // Render the previous texture onto the screen. - painter.drawComposite(texture, properties); + // Render the previous texture onto the screen. + painter.drawComposite(texture, properties); - if (debug::renderTree) { - std::cout << std::string(--indent * 4, ' ') << "}" << std::endl; + if (debug::renderTree) { + std::cout << std::string(--indent * 4, ' ') << "}" << std::endl; + } } } } diff --git a/src/map/tile_parser.cpp b/src/map/tile_parser.cpp index e32a6068fc..ae129b3e72 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -82,6 +82,7 @@ void TileParser::parseStyleLayers(std::shared_ptr<StyleLayerGroup> group) { // contain any data that falls into this bucket. tile.buckets[layer_desc->bucket->name] = std::move(bucket); } + // TODO? here, no bucket is being created for prerender raster layers (though buckets are being created for its sublayers)... } } else { fprintf(stderr, "[WARNING] layer '%s' does not have child layers or buckets\n", layer_desc->id.c_str()); @@ -100,8 +101,8 @@ std::unique_ptr<Bucket> TileParser::createBucket(std::shared_ptr<StyleBucket> bu if (tile.id.z >= std::ceil(bucket_desc->max_zoom)) return nullptr; auto layer_it = vector_data.layers.find(bucket_desc->source_layer); + const VectorTileLayer &layer = layer_it->second; if (layer_it != vector_data.layers.end()) { - const VectorTileLayer &layer = layer_it->second; if (bucket_desc->render.is<StyleBucketFill>()) { return createFillBucket(layer, bucket_desc->filter, bucket_desc->render.get<StyleBucketFill>()); } else if (bucket_desc->render.is<StyleBucketLine>()) { @@ -113,6 +114,9 @@ std::unique_ptr<Bucket> TileParser::createBucket(std::shared_ptr<StyleBucket> bu } else { fprintf(stderr, "[WARNING] unknown bucket render type for layer '%s' (source layer '%s')\n", bucket_desc->name.c_str(), bucket_desc->source_layer.c_str()); } + } else if (bucket_desc->render.is<StyleBucketRaster>()) { + // Assume this is a prerendered raster layer -- TODO more thorough checking here?? + return createRasterBucket(layer, bucket_desc->filter, bucket_desc->render.get<StyleBucketRaster>()); } else { // The layer specified in the bucket does not exist. Do nothing. if (debug::tileParseWarnings) { @@ -148,6 +152,12 @@ std::unique_ptr<Bucket> TileParser::createFillBucket(const VectorTileLayer& laye return obsolete() ? nullptr : std::move(bucket); } +std::unique_ptr<Bucket> TileParser::createRasterBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketRaster &raster) { + std::unique_ptr<RasterBucket> bucket = std::make_unique<RasterBucket>(raster); +// addBucketFeatures(bucket, layer, filter); + return obsolete() ? nullptr : std::move(bucket); +} + std::unique_ptr<Bucket> TileParser::createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line) { std::unique_ptr<LineBucket> bucket = std::make_unique<LineBucket>(tile.lineVertexBuffer, tile.triangleElementsBuffer, tile.pointElementsBuffer, line); addBucketGeometries(bucket, layer, filter); @@ -158,4 +168,4 @@ std::unique_ptr<Bucket> TileParser::createSymbolBucket(const VectorTileLayer& la std::unique_ptr<SymbolBucket> bucket = std::make_unique<SymbolBucket>(symbol, collision); bucket->addFeatures(layer, filter, tile.id, *spriteAtlas, *sprite, *glyphAtlas, *glyphStore); return obsolete() ? nullptr : std::move(bucket); -}
\ No newline at end of file +} diff --git a/src/renderer/painter_fill.cpp b/src/renderer/painter_fill.cpp index d0bfcad83d..750aaa465d 100644 --- a/src/renderer/painter_fill.cpp +++ b/src/renderer/painter_fill.cpp @@ -150,6 +150,54 @@ void Painter::renderFill(FillBucket& bucket, std::shared_ptr<StyleLayer> layer_d // Abort early. if (!bucket.hasData()) return; const FillProperties &properties = layer_desc->getProperties<FillProperties>(); - const mat4 &vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); - renderFill(bucket, properties, id, vtxMatrix); + +// if (layer_desc->rasterize && layer_desc->rasterize->isEnabled(id.z)) { +// if (pass == Translucent) { +// const RasterizedProperties rasterize = layer_desc->rasterize->get(id.z); +// // Buffer value around the 0..4096 extent that will be drawn into the 256x256 pixel +// // texture. We later scale the texture so that the actual bounds will align with this +// // tile's bounds. The reason we do this is so that the +// if (!bucket.prerendered) { +// bucket.prerendered = std::make_unique<PrerenderedTexture>(rasterize); +// bucket.prerendered->bindFramebuffer(); +// +// preparePrerender(*bucket.prerendered); +// +// const FillProperties modifiedProperties = [&]{ +// FillProperties modifiedProperties = properties; +// modifiedProperties.opacity = 1; +// return modifiedProperties; +// }(); +// +// // When drawing the fill, we want to draw a buffer around too, so we +// // essentially downscale everyting, and then upscale it later when rendering. +// const int buffer = rasterize.buffer * 4096.0f; +// const mat4 vtxMatrix = [&]{ +// mat4 vtxMatrix; +// matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); +// matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); +// return vtxMatrix; +// }(); +// +// setOpaque(); +// renderFill(bucket, modifiedProperties, id, vtxMatrix); +// +// setTranslucent(); +// renderFill(bucket, modifiedProperties, id, vtxMatrix); +// +// if (rasterize.blur > 0) { +// bucket.prerendered->blur(*this, rasterize.blur); +// } +// +// // RESET STATE +// bucket.prerendered->unbindFramebuffer(); +// finishPrerender(*bucket.prerendered); +// } +// +// renderPrerenderedTexture(*bucket.prerendered, properties); +// } +// } else { + const mat4 &vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); + renderFill(bucket, properties, id, vtxMatrix); +// } } diff --git a/src/renderer/painter_prerender.cpp b/src/renderer/painter_prerender.cpp index ad6b56b3cc..94ccc7fc43 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -38,11 +38,12 @@ void Painter::renderPrerenderedTexture(PrerenderedTexture &texture, const Proper glActiveTexture(GL_TEXTURE0); rasterShader->setImage(0); rasterShader->setBuffer(buffer); - rasterShader->setOpacity(properties.opacity); + rasterShader->setOpacity(1); +// rasterShader->setOpacity(properties.opacity); // TODO find a place to pass opacity and change this back texture.bindTexture(); coveringRasterArray.bind(*rasterShader, tileStencilBuffer, BUFFER_OFFSET(0)); glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index()); } template void Painter::renderPrerenderedTexture(PrerenderedTexture &, const FillProperties &); -template void Painter::renderPrerenderedTexture(PrerenderedTexture &, const RasterProperties &); +template void Painter::renderPrerenderedTexture(PrerenderedTexture &, const RasterizedProperties &); diff --git a/src/renderer/prerendered_texture.cpp b/src/renderer/prerendered_texture.cpp index 6b08a38a4c..78bf2407fc 100644 --- a/src/renderer/prerendered_texture.cpp +++ b/src/renderer/prerendered_texture.cpp @@ -40,7 +40,8 @@ void PrerenderedTexture::bindFramebuffer() { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, properties.size, properties.size, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); +// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, properties.size, properties.size, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); // TODO change this back once i have non-zero size readings glBindTexture(GL_TEXTURE_2D, 0); } diff --git a/src/renderer/raster_bucket.cpp b/src/renderer/raster_bucket.cpp index 0d5bf21226..83289b370d 100644 --- a/src/renderer/raster_bucket.cpp +++ b/src/renderer/raster_bucket.cpp @@ -7,6 +7,12 @@ RasterBucket::RasterBucket(const std::shared_ptr<Texturepool> &texturepool) : raster(texturepool) { } +//RasterBucket::RasterBucket(const StyleBucketRaster &properties) +// : properties(properties) { +//} + +// TODO ^ Somehow overload with another constructor for prerender? + void RasterBucket::render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID &id) { painter.renderRaster(*this, layer_desc, id); } diff --git a/src/style/style_layer.cpp b/src/style/style_layer.cpp index 1672ad4a8b..8ec04d6695 100644 --- a/src/style/style_layer.cpp +++ b/src/style/style_layer.cpp @@ -5,9 +5,8 @@ namespace mbgl { -StyleLayer::StyleLayer(const std::string &id, std::map<ClassID, ClassProperties> &&styles, - std::unique_ptr<const RasterizeProperties> &&rasterize) - : id(id), styles(std::move(styles)), rasterize(std::move(rasterize)) {} +StyleLayer::StyleLayer(const std::string &id, std::map<ClassID, ClassProperties> &&styles) + : id(id), styles(std::move(styles)) {} bool StyleLayer::isBackground() const { return type == StyleLayerType::Background; diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 3ca8742965..60f2195f65 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -493,10 +493,14 @@ std::shared_ptr<StyleLayer> StyleParser::createLayer(JSVal value) { parseStyles(value, styles); // Parse Rasterization options, as they can't be inherited anyway. - std::unique_ptr<const RasterizeProperties> rasterize; +// std::unique_ptr<const RasterizeProperties> rasterize; +// if (value.HasMember("rasterize")) { +// rasterize = parseRasterize(replaceConstant(value["rasterize"])); +// } std::shared_ptr<StyleLayer> layer = std::make_shared<StyleLayer>( - layer_id, std::move(styles), std::move(rasterize)); + layer_id, std::move(styles)); +// layer_id, std::move(styles), std::move(rasterize)); if (value.HasMember("layers")) { if (value.HasMember("type")) { @@ -527,12 +531,6 @@ void StyleParser::parseLayer(std::pair<JSVal, std::shared_ptr<StyleLayer>> &pair JSVal value = pair.first; std::shared_ptr<StyleLayer> &layer = pair.second; - if (layer->bucket) { -// if (layer->bucket || layer->layers) { - // Skip parsing this again. We already have a valid layer definition. - return; - } - if (value.HasMember("type")) { JSVal type = value["type"]; if (!type.IsString()) { @@ -542,6 +540,11 @@ void StyleParser::parseLayer(std::pair<JSVal, std::shared_ptr<StyleLayer>> &pair } } + if (layer->bucket || (layer->layers && layer->type != StyleLayerType::Raster)) { + // Skip parsing this again. We already have a valid layer definition. + return; + } + // Make sure we have not previously attempted to parse this layer. if (std::find(stack.begin(), stack.end(), layer.get()) != stack.end()) { fprintf(stderr, "[WARNING] layer reference of '%s' is circular\n", layer->id.c_str()); @@ -917,19 +920,19 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr<StyleLayer> &layer) { parseRenderProperty(value, render.text.ignore_placement, "text-ignore-placement"); parseRenderProperty(value, render.text.optional, "text-optional"); } break; - + case StyleLayerType::Raster: { StyleBucketRaster &render = bucket.render.get<StyleBucketRaster>(); - auto rasterize = std::make_unique<RasterizedProperties>(); +// auto rasterize = std::make_unique<RasterizedProperties>(); parseRenderProperty(value, render.raster_size, "raster-size"); parseRenderProperty(value, render.blur, "raster-blur"); parseRenderProperty(value, render.buffer, "raster-buffer"); - -// return rasterize; - + if (layer->layers) { + render.prerendered = true; + } } break; - + default: // There are no render properties for these layer types. break; |