From df925fe0e5429085f0f443f4be1326c0616f6acc Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Mon, 4 Aug 2014 17:24:22 -0700 Subject: [PATCH 01/22] nonworking prerendering attempts --- include/mbgl/map/map.hpp | 4 +- include/mbgl/renderer/painter.hpp | 3 + include/mbgl/style/rasterize_properties.hpp | 8 +- include/mbgl/style/style_bucket.hpp | 3 + src/map/map.cpp | 20 ++++- src/map/tile_parser.cpp | 7 +- src/map/vector_tile_data.cpp | 3 + src/renderer/painter.cpp | 2 +- src/renderer/painter_fill.cpp | 53 +------------ src/renderer/painter_prerender.cpp | 3 +- src/renderer/painter_raster.cpp | 87 ++++++++++++++++++++- src/style/style_parser.cpp | 40 +++++----- 12 files changed, 149 insertions(+), 84 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index be01b456c..c54b40d75 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -45,6 +45,8 @@ public: // Triggers a lazy rerender: only performs a render when the map is not clean. void rerender(); + void renderLayers(std::shared_ptr group); + // Forces a map update: always triggers a rerender. void update(); @@ -139,6 +141,7 @@ private: void updateTiles(); void updateRenderState(); + void updateRenderState(const mat4 vtxMatrix); size_t countLayers(const std::vector& layers); @@ -150,7 +153,6 @@ private: // Unconditionally performs a render with the current map state. void render(); - void renderLayers(std::shared_ptr group); void renderLayer(std::shared_ptr layer_desc, RenderPass pass); private: diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index b4023de16..82b71b6cb 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -84,12 +84,15 @@ public: void renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void renderSymbol(SymbolBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); + void renderRaster(GLuint texture, const RasterizeProperties &properties); // do I want to save that? void preparePrerender(PrerenderedTexture &texture); void finishPrerender(PrerenderedTexture &texture); template void renderPrerenderedTexture(PrerenderedTexture &texture, const Properties &properties); + + void createPrerendered(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const RasterizeProperties& properties); void resize(); diff --git a/include/mbgl/style/rasterize_properties.hpp b/include/mbgl/style/rasterize_properties.hpp index aea90dfbd..e1e56d6ec 100644 --- a/include/mbgl/style/rasterize_properties.hpp +++ b/include/mbgl/style/rasterize_properties.hpp @@ -15,14 +15,14 @@ public: class RasterizeProperties { public: - Function enabled = ConstantFunction(false); +// Function enabled = ConstantFunction(false); // going to need to delete this? or keep ? Function buffer = ConstantFunction(1.0f / 32.0f); Function size = ConstantFunction(256); Function blur = ConstantFunction(0); - inline bool isEnabled(const int8_t z) const { - return util::apply_visitor(FunctionEvaluator(z), enabled); - } +// inline bool isEnabled(const int8_t z) const { +// return util::apply_visitor(FunctionEvaluator(z), enabled); +// } inline RasterizedProperties get(const int8_t z) const { RasterizedProperties properties; diff --git a/include/mbgl/style/style_bucket.hpp b/include/mbgl/style/style_bucket.hpp index 530e0c125..25786720b 100644 --- a/include/mbgl/style/style_bucket.hpp +++ b/include/mbgl/style/style_bucket.hpp @@ -82,6 +82,9 @@ public: class StyleBucketRaster { public: + uint16_t raster_size = 256; + float blur = 0.0f; + float buffer = 0.03125f; }; typedef util::variant ids; + + for (const std::shared_ptr &source : getActiveSources()) { + ids.splice_after(ids.before_begin(), source->source->getIDs()); + source->source->updateMatrices(vtxMatrix, state); + } + + const std::map clipIDs = computeClipIDs(ids); + + for (const std::shared_ptr &source : getActiveSources()) { + source->source->updateClipIDs(clipIDs); + } +} + void Map::prepare() { view.make_active(); @@ -634,8 +649,8 @@ void Map::renderLayers(std::shared_ptr group) { } void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass) { - if (layer_desc->layers) { - // This is a layer group. We render them during our translucent render 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(); if (properties.isVisible()) { @@ -716,7 +731,6 @@ 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); } } diff --git a/src/map/tile_parser.cpp b/src/map/tile_parser.cpp index 97b071a16..e32a6068f 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -66,10 +66,11 @@ void TileParser::parseStyleLayers(std::shared_ptr group) { if (layer_desc->isBackground()) { // background is a special, fake bucket continue; - } else if (layer_desc->layers) { + } else if (layer_desc->layers && layer_desc->type != StyleLayerType::Raster) { // This is a layer group. parseStyleLayers(layer_desc->layers); - } else if (layer_desc->bucket) { + } + if (layer_desc->bucket) { // This is a singular layer. Check if this bucket already exists. If not, // parse this bucket. auto bucket_it = tile.buckets.find(layer_desc->bucket->name); @@ -157,4 +158,4 @@ std::unique_ptr TileParser::createSymbolBucket(const VectorTileLayer& la std::unique_ptr bucket = std::make_unique(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/map/vector_tile_data.cpp b/src/map/vector_tile_data.cpp index 2bf339b65..f4a841b3f 100644 --- a/src/map/vector_tile_data.cpp +++ b/src/map/vector_tile_data.cpp @@ -58,6 +58,9 @@ void VectorTileData::render(Painter &painter, std::shared_ptr layer_ if (databucket_it != buckets.end()) { assert(databucket_it->second); databucket_it->second->render(painter, layer_desc, id); + } else if (layer_desc->type == StyleLayerType::Raster && layer_desc->layers) { +// HELP + } } } diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index e6977171a..6cdaf760a 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -173,7 +173,7 @@ void Painter::prepareTile(const Tile& tile) { void Painter::renderTileLayer(const Tile& tile, std::shared_ptr layer_desc) { assert(tile.data); - if (tile.data->hasData(layer_desc)) { + if (tile.data->hasData(layer_desc) || layer_desc->type == StyleLayerType::Raster) { gl::group group(util::sprintf<32>("render %d/%d/%d\n", tile.id.z, tile.id.y, tile.id.z)); prepareTile(tile); tile.data->render(*this, layer_desc); diff --git a/src/renderer/painter_fill.cpp b/src/renderer/painter_fill.cpp index 29d77e05d..d0bfcad83 100644 --- a/src/renderer/painter_fill.cpp +++ b/src/renderer/painter_fill.cpp @@ -149,56 +149,7 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c void Painter::renderFill(FillBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id) { // Abort early. if (!bucket.hasData()) return; - const FillProperties &properties = layer_desc->getProperties(); - - 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(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); - } + 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 5d61b9553..ad6b56b3c 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -27,7 +27,7 @@ void Painter::finishPrerender(PrerenderedTexture &/*texture*/) { template void Painter::renderPrerenderedTexture(PrerenderedTexture &texture, const Properties &properties) { const int buffer = texture.properties.buffer * 4096.0f; - + // draw the texture on a quad useProgram(rasterShader->program); rasterShader->setMatrix(matrix); @@ -45,3 +45,4 @@ void Painter::renderPrerenderedTexture(PrerenderedTexture &texture, const Proper } template void Painter::renderPrerenderedTexture(PrerenderedTexture &, const FillProperties &); +template void Painter::renderPrerenderedTexture(PrerenderedTexture &, const RasterProperties &); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index ef2eab2a6..ea0688ced 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -1,14 +1,92 @@ #include #include #include +#include #include using namespace mbgl; -void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr /*layer_desc*/, const Tile::ID& /*id*/) { +void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id) { if (pass == Translucent) return; + + const RasterProperties &properties = layer_desc->getProperties(); + + if (layer_desc->rasterize) { + auto rasterize = std::make_unique(); + + if (pass == Translucent) { + // 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 + const RasterizedProperties rasterize = layer_desc->rasterize->get(id.z); + if (!bucket.prerendered) { + + bucket.prerendered = std::make_unique(rasterize); + bucket.prerendered->bindFramebuffer(); + + preparePrerender(*bucket.prerendered); + + const RasterProperties modifiedProperties = [&]{ + RasterProperties modifiedProperties = properties; + // modifiedProperties.opacity = 1; // figure out why this was here + 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); + + + + // resize(); + + // changeMatrix(); + + // map.updateRenderState(); + + // drawClippingMasks(getActiveSources()); + + // Actually render the layers + map.renderLayers(layer_desc->layers); + + // Finalize the rendering, e.g. by calling debug render calls per tile. + // This guarantees that we have at least one function per tile called. + // When only rendering layers via the stylesheet, it's possible that we don't + // ever visit a tile during rendering. + // for (const std::shared_ptr &source : getActiveSources()) { + // source->source->finishRender(painter); + // } + // + // // Schedule another rerender when we definitely need a next frame. + // if (transform.needsTransition() || style->hasTransitions()) { + // update(); + // } + + glFlush(); - // const RasterProperties &properties = layer_desc->getProperties(); + if (rasterize.blur > 0) { + bucket.prerendered->blur(*this, rasterize.blur); + } + + // RESET STATE + bucket.prerendered->unbindFramebuffer(); + finishPrerender(*bucket.prerendered); + } + + renderPrerenderedTexture(*bucket.prerendered, properties); + + } + + } depthMask(false); @@ -22,4 +100,9 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr /*l bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); depthMask(true); + +} +void Painter::renderRaster(GLuint texture, const RasterizeProperties &properties){ +// TODO do I need this? +// map.renderLayers(layer_desc->layers); } diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index f72b47d1f..3ca874296 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -344,7 +344,7 @@ bool StyleParser::parseOptionalProperty(const char *property_name, PropertyKey k template bool StyleParser::parseOptionalProperty(const char *property_name, T &target, JSVal value) { if (!value.HasMember(property_name)) { - return false; + return false; } else { return setProperty(replaceConstant(value[property_name]), property_name, target); } @@ -494,14 +494,16 @@ std::shared_ptr StyleParser::createLayer(JSVal value) { // Parse Rasterization options, as they can't be inherited anyway. std::unique_ptr rasterize; - if (value.HasMember("rasterize")) { - rasterize = parseRasterize(replaceConstant(value["rasterize"])); - } std::shared_ptr layer = std::make_shared( layer_id, std::move(styles), std::move(rasterize)); if (value.HasMember("layers")) { + if (value.HasMember("type")) { + JSVal type = value["type"]; + if (std::string { type.GetString(), type.GetStringLength() } == "raster") { + } + } layer->layers = createLayers(value["layers"]); } @@ -525,7 +527,8 @@ void StyleParser::parseLayer(std::pair> &pair JSVal value = pair.first; std::shared_ptr &layer = pair.second; - if (layer->bucket || layer->layers) { + if (layer->bucket) { +// if (layer->bucket || layer->layers) { // Skip parsing this again. We already have a valid layer definition. return; } @@ -637,6 +640,7 @@ void StyleParser::parseStyle(JSVal value, ClassProperties &klass) { parseOptionalProperty>("composite-opacity", Key::CompositeOpacity, klass, value); parseOptionalProperty("transition-composite-opacity", Key::CompositeOpacity, klass, value); +// TODO edit these: parseOptionalProperty>("raster-opacity", Key::RasterOpacity, klass, value); parseOptionalProperty("transition-raster-opacity", Key::RasterOpacity, klass, value); parseOptionalProperty>("raster-spin", Key::RasterSpin, klass, value); @@ -655,19 +659,6 @@ void StyleParser::parseStyle(JSVal value, ClassProperties &klass) { parseOptionalProperty>("background-color", Key::BackgroundColor, klass, value); } -std::unique_ptr StyleParser::parseRasterize(JSVal value) { - auto rasterize = std::make_unique(); - - if (value.IsObject()) { - parseOptionalProperty("enabled", rasterize->enabled, value); - parseOptionalProperty("buffer", rasterize->buffer, value); - parseOptionalProperty("size", rasterize->size, value); - parseOptionalProperty("blur", rasterize->blur, value); - } - - return rasterize; -} - void StyleParser::parseReference(JSVal value, std::shared_ptr &layer) { if (!value.IsString()) { fprintf(stderr, "[WARNING] layer ref of '%s' must be a string\n", layer->id.c_str()); @@ -926,6 +917,19 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr &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(); + + auto rasterize = std::make_unique(); + parseRenderProperty(value, render.raster_size, "raster-size"); + parseRenderProperty(value, render.blur, "raster-blur"); + parseRenderProperty(value, render.buffer, "raster-buffer"); + +// return rasterize; + + } break; + default: // There are no render properties for these layer types. break; From 9e1156d660cfe220db25c4f21de2aec2ed175487 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Tue, 5 Aug 2014 18:13:02 -0700 Subject: [PATCH 02/22] take 2, still not working --- include/mbgl/map/tile_parser.hpp | 2 + include/mbgl/renderer/prerendered_texture.hpp | 5 +- include/mbgl/style/rasterize_properties.hpp | 2 +- include/mbgl/style/style_bucket.hpp | 1 + include/mbgl/style/style_layer.hpp | 5 +- src/map/map.cpp | 68 ++++++++++++++----- src/map/tile_parser.cpp | 14 +++- src/renderer/painter_fill.cpp | 52 +++++++++++++- src/renderer/painter_prerender.cpp | 5 +- src/renderer/prerendered_texture.cpp | 3 +- src/renderer/raster_bucket.cpp | 6 ++ src/style/style_layer.cpp | 5 +- src/style/style_parser.cpp | 31 +++++---- 13 files changed, 152 insertions(+), 47 deletions(-) diff --git a/include/mbgl/map/tile_parser.hpp b/include/mbgl/map/tile_parser.hpp index 9aa0f4dc6..313431c86 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 createBucket(std::shared_ptr bucket_desc); std::unique_ptr createFillBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketFill &fill); + std::unique_ptr createRasterBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketRaster &raster); std::unique_ptr createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line); std::unique_ptr 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 9c72e14b8..310375b5e 100644 --- a/include/mbgl/renderer/prerendered_texture.hpp +++ b/include/mbgl/renderer/prerendered_texture.hpp @@ -4,6 +4,7 @@ #include #include #include +//#include 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 e1e56d6ec..e156ede77 100644 --- a/include/mbgl/style/rasterize_properties.hpp +++ b/include/mbgl/style/rasterize_properties.hpp @@ -15,7 +15,7 @@ public: class RasterizeProperties { public: -// Function enabled = ConstantFunction(false); // going to need to delete this? or keep ? + Function enabled = ConstantFunction(false); // maybe delete? Function buffer = ConstantFunction(1.0f / 32.0f); Function size = ConstantFunction(256); Function blur = ConstantFunction(0); diff --git a/include/mbgl/style/style_bucket.hpp b/include/mbgl/style/style_bucket.hpp index 25786720b..5cb1b6931 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 14d60ed9b..bcda9950a 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 &&styles, - std::unique_ptr &&rasterize); + StyleLayer(const std::string &id, std::map &&styles); template const T &getProperties() { if (properties.is()) { @@ -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 rasterize; +// const std::unique_ptr rasterize; // Child layer array (if this layer has child layers). std::shared_ptr layers; diff --git a/src/map/map.cpp b/src/map/map.cpp index c5df1f96d..a6e245376 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -649,29 +649,63 @@ void Map::renderLayers(std::shared_ptr group) { } void Map::renderLayer(std::shared_ptr 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(); - if (properties.isVisible()) { - gl::group group(std::string("group: ") + layer_desc->id); + if (layer_desc->layers) { + if (layer_desc->type == StyleLayerType::Raster) { + const RasterProperties &properties = layer_desc->getProperties(); + +// const RasterizedProperties rasterize = layer_desc->getProperties(); +// +// auto prerendered = std::make_unique(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(); + 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 (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 e32a6068f..ae129b3e7 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -82,6 +82,7 @@ void TileParser::parseStyleLayers(std::shared_ptr 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 TileParser::createBucket(std::shared_ptr 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()) { return createFillBucket(layer, bucket_desc->filter, bucket_desc->render.get()); } else if (bucket_desc->render.is()) { @@ -113,6 +114,9 @@ std::unique_ptr TileParser::createBucket(std::shared_ptr 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()) { + // Assume this is a prerendered raster layer -- TODO more thorough checking here?? + return createRasterBucket(layer, bucket_desc->filter, bucket_desc->render.get()); } else { // The layer specified in the bucket does not exist. Do nothing. if (debug::tileParseWarnings) { @@ -148,6 +152,12 @@ std::unique_ptr TileParser::createFillBucket(const VectorTileLayer& laye return obsolete() ? nullptr : std::move(bucket); } +std::unique_ptr TileParser::createRasterBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketRaster &raster) { + std::unique_ptr bucket = std::make_unique(raster); +// addBucketFeatures(bucket, layer, filter); + return obsolete() ? nullptr : std::move(bucket); +} + std::unique_ptr TileParser::createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line) { std::unique_ptr bucket = std::make_unique(tile.lineVertexBuffer, tile.triangleElementsBuffer, tile.pointElementsBuffer, line); addBucketGeometries(bucket, layer, filter); @@ -158,4 +168,4 @@ std::unique_ptr TileParser::createSymbolBucket(const VectorTileLayer& la std::unique_ptr bucket = std::make_unique(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 d0bfcad83..750aaa465 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 layer_d // Abort early. if (!bucket.hasData()) return; const FillProperties &properties = layer_desc->getProperties(); - 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(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 ad6b56b3c..94ccc7fc4 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 6b08a38a4..78bf2407f 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 0d5bf2122..83289b370 100644 --- a/src/renderer/raster_bucket.cpp +++ b/src/renderer/raster_bucket.cpp @@ -7,6 +7,12 @@ RasterBucket::RasterBucket(const std::shared_ptr &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 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 1672ad4a8..8ec04d669 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 &&styles, - std::unique_ptr &&rasterize) - : id(id), styles(std::move(styles)), rasterize(std::move(rasterize)) {} +StyleLayer::StyleLayer(const std::string &id, std::map &&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 3ca874296..60f2195f6 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -493,10 +493,14 @@ std::shared_ptr StyleParser::createLayer(JSVal value) { parseStyles(value, styles); // Parse Rasterization options, as they can't be inherited anyway. - std::unique_ptr rasterize; +// std::unique_ptr rasterize; +// if (value.HasMember("rasterize")) { +// rasterize = parseRasterize(replaceConstant(value["rasterize"])); +// } std::shared_ptr layer = std::make_shared( - 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> &pair JSVal value = pair.first; std::shared_ptr &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> &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 &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(); - auto rasterize = std::make_unique(); +// auto rasterize = std::make_unique(); 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; From 560cc112e1e281ae57743fbabfa629203b09ffb1 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Wed, 6 Aug 2014 17:40:48 -0700 Subject: [PATCH 03/22] rm rasterize_properties, should be close to working...doesn't work --- include/mbgl/map/raster_tile_data.hpp | 1 + include/mbgl/map/tile_parser.hpp | 5 +- include/mbgl/renderer/bucket.hpp | 2 - include/mbgl/renderer/painter.hpp | 13 ++- include/mbgl/renderer/prerendered_texture.hpp | 7 +- include/mbgl/renderer/raster_bucket.hpp | 11 +- include/mbgl/style/rasterize_properties.hpp | 38 ------- include/mbgl/style/style_bucket.hpp | 2 +- include/mbgl/style/style_layer.hpp | 6 -- include/mbgl/style/style_parser.hpp | 2 - src/map/map.cpp | 68 +++--------- src/map/raster_tile_data.cpp | 2 +- src/map/tile_parser.cpp | 9 +- src/map/vector_tile_data.cpp | 3 - src/renderer/painter_fill.cpp | 52 +-------- src/renderer/painter_prerender.cpp | 20 ++-- src/renderer/painter_raster.cpp | 102 +++++------------- src/renderer/prerendered_texture.cpp | 6 +- src/renderer/raster_bucket.cpp | 12 +-- src/style/style_parser.cpp | 12 +-- 20 files changed, 94 insertions(+), 279 deletions(-) delete mode 100644 include/mbgl/style/rasterize_properties.hpp diff --git a/include/mbgl/map/raster_tile_data.hpp b/include/mbgl/map/raster_tile_data.hpp index bf8691454..76b7eee2c 100644 --- a/include/mbgl/map/raster_tile_data.hpp +++ b/include/mbgl/map/raster_tile_data.hpp @@ -26,6 +26,7 @@ public: virtual bool hasData(std::shared_ptr layer_desc) const; protected: + StyleBucketRaster properties; RasterBucket bucket; }; diff --git a/include/mbgl/map/tile_parser.hpp b/include/mbgl/map/tile_parser.hpp index 313431c86..1b0a8bfe6 100644 --- a/include/mbgl/map/tile_parser.hpp +++ b/include/mbgl/map/tile_parser.hpp @@ -14,6 +14,7 @@ namespace mbgl { class Bucket; +class Texturepool; class FontStack; class GlyphAtlas; class GlyphStore; @@ -36,6 +37,7 @@ public: const std::shared_ptr &glyphStore, const std::shared_ptr &spriteAtlas, const std::shared_ptr &sprite); + const std::shared_ptr &texturepool); public: void parse(); @@ -46,7 +48,7 @@ private: std::unique_ptr createBucket(std::shared_ptr bucket_desc); std::unique_ptr createFillBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketFill &fill); - std::unique_ptr createRasterBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketRaster &raster); + std::unique_ptr createRasterBucket(const std::shared_ptr &texturepool, const StyleBucketRaster &raster); std::unique_ptr createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line); std::unique_ptr createSymbolBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketSymbol &symbol); @@ -62,6 +64,7 @@ private: std::shared_ptr glyphStore; std::shared_ptr spriteAtlas; std::shared_ptr sprite; + std::shared_ptr texturePool; Collision collision; }; diff --git a/include/mbgl/renderer/bucket.hpp b/include/mbgl/renderer/bucket.hpp index 18f58ee46..a8bd437bb 100644 --- a/include/mbgl/renderer/bucket.hpp +++ b/include/mbgl/renderer/bucket.hpp @@ -5,7 +5,6 @@ #include #include #include -#include namespace mbgl { @@ -18,7 +17,6 @@ public: virtual bool hasData() const = 0; virtual ~Bucket() {} - std::unique_ptr prerendered; }; } diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index 82b71b6cb..fa981c3c2 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -40,7 +40,8 @@ class FillBucket; class LineBucket; class SymbolBucket; class RasterBucket; - +class PrerenderedTexture; + struct FillProperties; struct CompositeProperties; @@ -84,15 +85,13 @@ public: void renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void renderSymbol(SymbolBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); - void renderRaster(GLuint texture, const RasterizeProperties &properties); // do I want to save that? - void preparePrerender(PrerenderedTexture &texture); - void finishPrerender(PrerenderedTexture &texture); + void preparePrerender(RasterBucket &bucket); + void finishPrerender(RasterBucket &bucket); - template - void renderPrerenderedTexture(PrerenderedTexture &texture, const Properties &properties); + void renderPrerenderedTexture(RasterBucket &bucket); - void createPrerendered(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const RasterizeProperties& properties); + void createPrerendered(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void resize(); diff --git a/include/mbgl/renderer/prerendered_texture.hpp b/include/mbgl/renderer/prerendered_texture.hpp index 310375b5e..4a5b736d4 100644 --- a/include/mbgl/renderer/prerendered_texture.hpp +++ b/include/mbgl/renderer/prerendered_texture.hpp @@ -3,16 +3,15 @@ #include #include -#include -//#include namespace mbgl { +class StyleBucketRaster; class Painter; class PrerenderedTexture : private util::noncopyable { public: - PrerenderedTexture(const RasterBucket &properties); + PrerenderedTexture(const StyleBucketRaster &properties); ~PrerenderedTexture(); void bindTexture(); @@ -24,7 +23,7 @@ public: void blur(Painter& painter, uint16_t passes); public: - const RasterBucket properties; + const StyleBucketRaster &properties; private: GLint previous_fbo = 0; diff --git a/include/mbgl/renderer/raster_bucket.hpp b/include/mbgl/renderer/raster_bucket.hpp index c11119312..631fb3471 100644 --- a/include/mbgl/renderer/raster_bucket.hpp +++ b/include/mbgl/renderer/raster_bucket.hpp @@ -3,6 +3,10 @@ #include #include +#include +#include + + namespace mbgl { @@ -12,12 +16,15 @@ class VertexArrayObject; class RasterBucket : public Bucket { public: - RasterBucket(const std::shared_ptr &texturepool); - + RasterBucket(const std::shared_ptr &texturepool, const StyleBucketRaster& properties); + virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id); virtual bool hasData() const; bool setImage(const std::string &data); + + const StyleBucketRaster &properties; + PrerenderedTexture texture; void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array); diff --git a/include/mbgl/style/rasterize_properties.hpp b/include/mbgl/style/rasterize_properties.hpp deleted file mode 100644 index e156ede77..000000000 --- a/include/mbgl/style/rasterize_properties.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef MBGL_STYLE_RASTERIZE_PROPERTIES -#define MBGL_STYLE_RASTERIZE_PROPERTIES - -#include - -namespace mbgl { - -// The calculated properties for a layer in a tile. -class RasterizedProperties { -public: - float buffer = 1.0f / 32.0f; - uint16_t size = 256; - uint8_t blur = 0; -}; - -class RasterizeProperties { -public: - Function enabled = ConstantFunction(false); // maybe delete? - Function buffer = ConstantFunction(1.0f / 32.0f); - Function size = ConstantFunction(256); - Function blur = ConstantFunction(0); - -// inline bool isEnabled(const int8_t z) const { -// return util::apply_visitor(FunctionEvaluator(z), enabled); -// } - - inline RasterizedProperties get(const int8_t z) const { - RasterizedProperties properties; - properties.buffer = util::apply_visitor(FunctionEvaluator(z), buffer); - properties.size = util::apply_visitor(FunctionEvaluator(z), size); - properties.blur = util::apply_visitor(FunctionEvaluator(z), blur); - return properties; - } -}; - -} - -#endif diff --git a/include/mbgl/style/style_bucket.hpp b/include/mbgl/style/style_bucket.hpp index 5cb1b6931..11b87d849 100644 --- a/include/mbgl/style/style_bucket.hpp +++ b/include/mbgl/style/style_bucket.hpp @@ -83,7 +83,7 @@ public: class StyleBucketRaster { public: bool prerendered = false; - uint16_t raster_size = 256; + uint16_t 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 bcda9950a..f8cfff7f6 100644 --- a/include/mbgl/style/style_layer.hpp +++ b/include/mbgl/style/style_layer.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -79,11 +78,6 @@ public: // layer's type. StyleProperties properties; - // 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 rasterize; - // Child layer array (if this layer has child layers). std::shared_ptr layers; }; diff --git a/include/mbgl/style/style_parser.hpp b/include/mbgl/style/style_parser.hpp index 8b8dc74f2..e4e1b7f63 100644 --- a/include/mbgl/style/style_parser.hpp +++ b/include/mbgl/style/style_parser.hpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -52,7 +51,6 @@ private: void parseLayer(std::pair> &pair); void parseStyles(JSVal value, std::map &styles); void parseStyle(JSVal, ClassProperties &properties); - std::unique_ptr parseRasterize(JSVal value); void parseReference(JSVal value, std::shared_ptr &layer); void parseBucket(JSVal value, std::shared_ptr &layer); void parseRender(JSVal value, std::shared_ptr &layer); diff --git a/src/map/map.cpp b/src/map/map.cpp index a6e245376..3a143bc5b 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -649,63 +649,29 @@ void Map::renderLayers(std::shared_ptr group) { } void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass) { - if (layer_desc->layers) { - if (layer_desc->type == StyleLayerType::Raster) { - const RasterProperties &properties = layer_desc->getProperties(); - -// const RasterizedProperties rasterize = layer_desc->getProperties(); -// -// auto prerendered = std::make_unique(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(); - if (properties.isVisible()) { - gl::group group(std::string("group: ") + layer_desc->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) { + const CompositeProperties &properties = layer_desc->getProperties(); + 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 (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/raster_tile_data.cpp b/src/map/raster_tile_data.cpp index a3c6d21a6..a401fdc4d 100644 --- a/src/map/raster_tile_data.cpp +++ b/src/map/raster_tile_data.cpp @@ -7,7 +7,7 @@ using namespace mbgl; RasterTileData::RasterTileData(Tile::ID id, Map &map, const SourceInfo &source) : TileData(id, map, source), - bucket(map.getTexturepool()) { + bucket(map.getTexturepool(), properties) { } RasterTileData::~RasterTileData() { diff --git a/src/map/tile_parser.cpp b/src/map/tile_parser.cpp index ae129b3e7..8b8c0ec2d 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ TileParser::TileParser(const std::string &data, VectorTileData &tile, spriteAtlas(spriteAtlas), sprite(sprite), collision(tile.id.z, 4096, tile.source.tile_size, tile.depth) { +// placement(tile.id.z, tile.id.z >= tile.source.max_zoom ? tile.source.max_zoom - tile.id.z : 1) { // TODO : i'm guessing remove this in the rebase? } void TileParser::parse() { @@ -116,7 +118,7 @@ std::unique_ptr TileParser::createBucket(std::shared_ptr bu } } else if (bucket_desc->render.is()) { // Assume this is a prerendered raster layer -- TODO more thorough checking here?? - return createRasterBucket(layer, bucket_desc->filter, bucket_desc->render.get()); + return createRasterBucket(texturePool, bucket_desc->render.get()); } else { // The layer specified in the bucket does not exist. Do nothing. if (debug::tileParseWarnings) { @@ -152,9 +154,8 @@ std::unique_ptr TileParser::createFillBucket(const VectorTileLayer& laye return obsolete() ? nullptr : std::move(bucket); } -std::unique_ptr TileParser::createRasterBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketRaster &raster) { - std::unique_ptr bucket = std::make_unique(raster); -// addBucketFeatures(bucket, layer, filter); +std::unique_ptr TileParser::createRasterBucket(const std::shared_ptr &texturepool, const StyleBucketRaster &raster) { + std::unique_ptr bucket = std::make_unique(texturepool, raster); return obsolete() ? nullptr : std::move(bucket); } diff --git a/src/map/vector_tile_data.cpp b/src/map/vector_tile_data.cpp index f4a841b3f..2bf339b65 100644 --- a/src/map/vector_tile_data.cpp +++ b/src/map/vector_tile_data.cpp @@ -58,9 +58,6 @@ void VectorTileData::render(Painter &painter, std::shared_ptr layer_ if (databucket_it != buckets.end()) { assert(databucket_it->second); databucket_it->second->render(painter, layer_desc, id); - } else if (layer_desc->type == StyleLayerType::Raster && layer_desc->layers) { -// HELP - } } } diff --git a/src/renderer/painter_fill.cpp b/src/renderer/painter_fill.cpp index 750aaa465..d0bfcad83 100644 --- a/src/renderer/painter_fill.cpp +++ b/src/renderer/painter_fill.cpp @@ -150,54 +150,6 @@ void Painter::renderFill(FillBucket& bucket, std::shared_ptr layer_d // Abort early. if (!bucket.hasData()) return; const FillProperties &properties = layer_desc->getProperties(); - -// 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(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); -// } + 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 94ccc7fc4..1e1137855 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -1,9 +1,11 @@ #include #include +#include +#include using namespace mbgl; -void Painter::preparePrerender(PrerenderedTexture &texture) { +void Painter::preparePrerender(RasterBucket &bucket) { glDisable(GL_DEPTH_TEST); glDisable(GL_STENCIL_TEST); @@ -14,19 +16,18 @@ void Painter::preparePrerender(PrerenderedTexture &texture) { #endif glClear(GL_COLOR_BUFFER_BIT); - glViewport(0, 0, texture.properties.size, texture.properties.size); + glViewport(0, 0, bucket.properties.size, bucket.properties.size); } -void Painter::finishPrerender(PrerenderedTexture &/*texture*/) { +void Painter::finishPrerender(RasterBucket &bucket) { glEnable(GL_DEPTH_TEST); glEnable(GL_STENCIL_TEST); glViewport(0, 0, gl_viewport[0], gl_viewport[1]); } -template -void Painter::renderPrerenderedTexture(PrerenderedTexture &texture, const Properties &properties) { - const int buffer = texture.properties.buffer * 4096.0f; +void Painter::renderPrerenderedTexture(RasterBucket &bucket) { + const int buffer = bucket.properties.buffer * 4096.0f; // draw the texture on a quad useProgram(rasterShader->program); @@ -39,11 +40,8 @@ void Painter::renderPrerenderedTexture(PrerenderedTexture &texture, const Proper rasterShader->setImage(0); rasterShader->setBuffer(buffer); rasterShader->setOpacity(1); -// rasterShader->setOpacity(properties.opacity); // TODO find a place to pass opacity and change this back - texture.bindTexture(); +// rasterShader->setOpacity(bucket.properties.opacity); // TODO find a place to pass opacity and change this back + bucket.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 RasterizedProperties &); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index ea0688ced..a1dc969b8 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -11,81 +11,37 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay const RasterProperties &properties = layer_desc->getProperties(); - if (layer_desc->rasterize) { - auto rasterize = std::make_unique(); + if (layer_desc->layers) { + + bucket.texture.bindFramebuffer(); - if (pass == Translucent) { - // 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 - const RasterizedProperties rasterize = layer_desc->rasterize->get(id.z); - if (!bucket.prerendered) { - - bucket.prerendered = std::make_unique(rasterize); - bucket.prerendered->bindFramebuffer(); - - preparePrerender(*bucket.prerendered); - - const RasterProperties modifiedProperties = [&]{ - RasterProperties modifiedProperties = properties; - // modifiedProperties.opacity = 1; // figure out why this was here - 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); - - - - // resize(); - - // changeMatrix(); - - // map.updateRenderState(); - - // drawClippingMasks(getActiveSources()); - - // Actually render the layers - map.renderLayers(layer_desc->layers); - - // Finalize the rendering, e.g. by calling debug render calls per tile. - // This guarantees that we have at least one function per tile called. - // When only rendering layers via the stylesheet, it's possible that we don't - // ever visit a tile during rendering. - // for (const std::shared_ptr &source : getActiveSources()) { - // source->source->finishRender(painter); - // } - // - // // Schedule another rerender when we definitely need a next frame. - // if (transform.needsTransition() || style->hasTransitions()) { - // update(); - // } - - glFlush(); + preparePrerender(bucket); - if (rasterize.blur > 0) { - bucket.prerendered->blur(*this, rasterize.blur); - } - - // RESET STATE - bucket.prerendered->unbindFramebuffer(); - finishPrerender(*bucket.prerendered); - } - - renderPrerenderedTexture(*bucket.prerendered, properties); + const RasterProperties modifiedProperties = [&]{ + RasterProperties modifiedProperties = properties; + modifiedProperties.opacity = 1; // figure out why this was here + return modifiedProperties; + }(); + const int buffer = bucket.properties.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; + }(); + + map.renderLayers(layer_desc->layers); + + if (bucket.properties.blur > 0) { + bucket.texture.blur(*this, bucket.properties.blur); } + bucket.texture.unbindFramebuffer(); + finishPrerender(bucket); + renderPrerenderedTexture(bucket); + } depthMask(false); @@ -94,7 +50,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay rasterShader->setMatrix(matrix); rasterShader->setBuffer(0); rasterShader->setOpacity(1); - // rasterShader->setOpacity(properties.opacity * tile_data->raster->opacity); +// rasterShader->setOpacity(properties.opacity * tile_data->raster->opacity); // TODO fix glDepthRange(strata + strata_epsilon, 1.0f); bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); @@ -102,7 +58,3 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay depthMask(true); } -void Painter::renderRaster(GLuint texture, const RasterizeProperties &properties){ -// TODO do I need this? -// map.renderLayers(layer_desc->layers); -} diff --git a/src/renderer/prerendered_texture.cpp b/src/renderer/prerendered_texture.cpp index 78bf2407f..59a854a0c 100644 --- a/src/renderer/prerendered_texture.cpp +++ b/src/renderer/prerendered_texture.cpp @@ -1,10 +1,11 @@ #include #include +#include using namespace mbgl; -PrerenderedTexture::PrerenderedTexture(const RasterizedProperties &properties) +PrerenderedTexture::PrerenderedTexture(const StyleBucketRaster &properties) : properties(properties) { } @@ -40,8 +41,7 @@ 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, 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 + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, properties.size, properties.size, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); } diff --git a/src/renderer/raster_bucket.cpp b/src/renderer/raster_bucket.cpp index 83289b370..dc9b13687 100644 --- a/src/renderer/raster_bucket.cpp +++ b/src/renderer/raster_bucket.cpp @@ -3,16 +3,12 @@ using namespace mbgl; -RasterBucket::RasterBucket(const std::shared_ptr &texturepool) - : raster(texturepool) { +RasterBucket::RasterBucket(const std::shared_ptr &texturepool, const StyleBucketRaster& properties) +: properties(properties), + texture(properties), + 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 layer_desc, const Tile::ID &id) { painter.renderRaster(*this, layer_desc, id); } diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 60f2195f6..17c8fdf25 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -492,15 +492,8 @@ std::shared_ptr StyleParser::createLayer(JSVal value) { std::map styles; parseStyles(value, styles); - // Parse Rasterization options, as they can't be inherited anyway. -// std::unique_ptr rasterize; -// if (value.HasMember("rasterize")) { -// rasterize = parseRasterize(replaceConstant(value["rasterize"])); -// } - std::shared_ptr layer = std::make_shared( layer_id, std::move(styles)); -// layer_id, std::move(styles), std::move(rasterize)); if (value.HasMember("layers")) { if (value.HasMember("type")) { @@ -643,7 +636,7 @@ void StyleParser::parseStyle(JSVal value, ClassProperties &klass) { parseOptionalProperty>("composite-opacity", Key::CompositeOpacity, klass, value); parseOptionalProperty("transition-composite-opacity", Key::CompositeOpacity, klass, value); -// TODO edit these: +// TODO edit these?: parseOptionalProperty>("raster-opacity", Key::RasterOpacity, klass, value); parseOptionalProperty("transition-raster-opacity", Key::RasterOpacity, klass, value); parseOptionalProperty>("raster-spin", Key::RasterSpin, klass, value); @@ -924,8 +917,7 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr &layer) { case StyleLayerType::Raster: { StyleBucketRaster &render = bucket.render.get(); -// auto rasterize = std::make_unique(); - parseRenderProperty(value, render.raster_size, "raster-size"); + parseRenderProperty(value, render.size, "raster-size"); parseRenderProperty(value, render.blur, "raster-blur"); parseRenderProperty(value, render.buffer, "raster-buffer"); if (layer->layers) { From ec7f7de5c4ed6006c9936cf2eaf72a88707b6cbb Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Thu, 7 Aug 2014 12:49:04 -0700 Subject: [PATCH 04/22] still not working --- include/mbgl/map/map.hpp | 1 - include/mbgl/renderer/prerendered_texture.hpp | 1 + include/mbgl/renderer/raster_bucket.hpp | 5 ++++- include/mbgl/util/raster.hpp | 4 ++++ src/map/map.cpp | 15 ------------- src/renderer/painter_raster.cpp | 9 ++++++-- src/renderer/prerendered_texture.cpp | 14 ++++++++++++ src/renderer/raster_bucket.cpp | 7 ++++++ src/util/raster.cpp | 22 +++++++++++++++++++ 9 files changed, 59 insertions(+), 19 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index c54b40d75..9147d6f5b 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -141,7 +141,6 @@ private: void updateTiles(); void updateRenderState(); - void updateRenderState(const mat4 vtxMatrix); size_t countLayers(const std::vector& layers); diff --git a/include/mbgl/renderer/prerendered_texture.hpp b/include/mbgl/renderer/prerendered_texture.hpp index 4a5b736d4..e4dc61041 100644 --- a/include/mbgl/renderer/prerendered_texture.hpp +++ b/include/mbgl/renderer/prerendered_texture.hpp @@ -29,6 +29,7 @@ private: GLint previous_fbo = 0; GLuint fbo = 0; GLuint texture = 0; + GLuint fbo_depth_stencil = 0; }; } diff --git a/include/mbgl/renderer/raster_bucket.hpp b/include/mbgl/renderer/raster_bucket.hpp index 631fb3471..4eccb22bd 100644 --- a/include/mbgl/renderer/raster_bucket.hpp +++ b/include/mbgl/renderer/raster_bucket.hpp @@ -28,8 +28,11 @@ public: void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array); -private: + void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array, GLuint texture); + Raster raster; + +private: }; } diff --git a/include/mbgl/util/raster.hpp b/include/mbgl/util/raster.hpp index 04c85169e..9124f59ba 100644 --- a/include/mbgl/util/raster.hpp +++ b/include/mbgl/util/raster.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,9 @@ public: // bind current texture void bind(bool linear = false); + // bind prerendered texture + void bind(const GLuint texture); + // loaded status bool isLoaded() const; diff --git a/src/map/map.cpp b/src/map/map.cpp index 3a143bc5b..5f72378fe 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -522,21 +522,6 @@ void Map::updateRenderState() { } } -void Map::updateRenderState(const mat4 vtxMatrix) { - std::forward_list ids; - - for (const std::shared_ptr &source : getActiveSources()) { - ids.splice_after(ids.before_begin(), source->source->getIDs()); - source->source->updateMatrices(vtxMatrix, state); - } - - const std::map clipIDs = computeClipIDs(ids); - - for (const std::shared_ptr &source : getActiveSources()) { - source->source->updateClipIDs(clipIDs); - } -} - void Map::prepare() { view.make_active(); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index a1dc969b8..186e860e0 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -31,7 +31,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); return vtxMatrix; }(); - + map.renderLayers(layer_desc->layers); if (bucket.properties.blur > 0) { @@ -53,7 +53,12 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay // rasterShader->setOpacity(properties.opacity * tile_data->raster->opacity); // TODO fix glDepthRange(strata + strata_epsilon, 1.0f); - bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); + + if (!bucket.hasData()) { + bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray, bucket.texture.getTexture()); + } else { + bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); + } depthMask(true); diff --git a/src/renderer/prerendered_texture.cpp b/src/renderer/prerendered_texture.cpp index 59a854a0c..6a21b133a 100644 --- a/src/renderer/prerendered_texture.cpp +++ b/src/renderer/prerendered_texture.cpp @@ -44,11 +44,25 @@ void PrerenderedTexture::bindFramebuffer() { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, properties.size, properties.size, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); } + + if (fbo_depth_stencil == 0) { + // Create depth/stencil buffer + glGenRenderbuffers(1, &fbo_depth_stencil); + glBindRenderbuffer(GL_RENDERBUFFER, fbo_depth_stencil); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, properties.size, properties.size); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + } if (fbo == 0) { glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); +#ifdef GL_ES_VERSION_2_0 + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth_stencil); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo_depth_stencil); +#else + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo_depth_stencil); +#endif GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { diff --git a/src/renderer/raster_bucket.cpp b/src/renderer/raster_bucket.cpp index dc9b13687..80f5039ac 100644 --- a/src/renderer/raster_bucket.cpp +++ b/src/renderer/raster_bucket.cpp @@ -24,6 +24,13 @@ void RasterBucket::drawRaster(RasterShader& shader, VertexBuffer &vertices, Vert glDrawArrays(GL_TRIANGLES, 0, (GLsizei)vertices.index()); } +void RasterBucket::drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array, GLuint texture) { + raster.bind(texture); + shader.setImage(0); + 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/util/raster.cpp b/src/util/raster.cpp index 4a040f9cb..1a993c599 100644 --- a/src/util/raster.cpp +++ b/src/util/raster.cpp @@ -68,6 +68,28 @@ void Raster::bind(bool linear) { } } +// overload ::bind for prerendered raster textures +void Raster::bind(const GLuint texture) { + if (img && !textured) { + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, img->getData()); + img.reset(); + textured = true; + } else if (textured) { + glBindTexture(GL_TEXTURE_2D, texture); + } + + GLuint filter = GL_LINEAR; + if (filter != this->filter) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); + this->filter = filter; + } + +} + void Raster::beginFadeInTransition() { timestamp start = util::now(); fade_transition = std::make_shared>(opacity, 1.0, opacity, start, 250_milliseconds); From 54ed547f90329a4c123f875dc91be3dfc968fd4e Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Thu, 7 Aug 2014 17:43:21 -0700 Subject: [PATCH 05/22] need to figure out how to use modified matrix in drawing prerendered textures --- include/mbgl/map/map.hpp | 2 +- src/map/map.cpp | 2 +- src/map/tile_parser.cpp | 2 +- src/renderer/painter_prerender.cpp | 3 +- src/renderer/painter_raster.cpp | 58 +++++++++++++++++------------- 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 9147d6f5b..a7c692c77 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -125,6 +125,7 @@ public: inline std::shared_ptr getLoop() { return loop; } inline timestamp getAnimationTime() const { return animationTime; } inline timestamp getTime() const { return animationTime; } + void updateTiles(); private: // uv async callbacks @@ -139,7 +140,6 @@ private: void updateSources(); void updateSources(const std::shared_ptr &group); - void updateTiles(); void updateRenderState(); size_t countLayers(const std::vector& layers); diff --git a/src/map/map.cpp b/src/map/map.cpp index 5f72378fe..54d77bd36 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -705,7 +705,7 @@ void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass) { if (!layer_desc->getProperties().isVisible()) return; break; case StyleLayerType::Raster: - if (pass == Translucent) return; + if (pass == Opaque) return; if (!layer_desc->getProperties().isVisible()) return; break; default: diff --git a/src/map/tile_parser.cpp b/src/map/tile_parser.cpp index 8b8c0ec2d..35ad66d69 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -68,7 +68,7 @@ void TileParser::parseStyleLayers(std::shared_ptr group) { if (layer_desc->isBackground()) { // background is a special, fake bucket continue; - } else if (layer_desc->layers && layer_desc->type != StyleLayerType::Raster) { + } else if (layer_desc->layers) { // This is a layer group. parseStyleLayers(layer_desc->layers); } diff --git a/src/renderer/painter_prerender.cpp b/src/renderer/painter_prerender.cpp index 1e1137855..124a6c1fb 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -14,6 +14,7 @@ void Painter::preparePrerender(RasterBucket &bucket) { const GLenum discards[] = {GL_COLOR_ATTACHMENT0}; glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards); #endif + glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, bucket.properties.size, bucket.properties.size); @@ -28,7 +29,7 @@ void Painter::finishPrerender(RasterBucket &bucket) { void Painter::renderPrerenderedTexture(RasterBucket &bucket) { const int buffer = bucket.properties.buffer * 4096.0f; - + // draw the texture on a quad useProgram(rasterShader->program); rasterShader->setMatrix(matrix); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 186e860e0..dcf88f4e5 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -7,39 +7,47 @@ using namespace mbgl; void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id) { - if (pass == Translucent) return; + if (pass != Translucent) return; const RasterProperties &properties = layer_desc->getProperties(); if (layer_desc->layers) { - - bucket.texture.bindFramebuffer(); - preparePrerender(bucket); + if (!bucket.texture.getTexture()) { - const RasterProperties modifiedProperties = [&]{ - RasterProperties modifiedProperties = properties; - modifiedProperties.opacity = 1; // figure out why this was here - return modifiedProperties; - }(); + bucket.texture.bindFramebuffer(); + + preparePrerender(bucket); - const int buffer = bucket.properties.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; - }(); - - map.renderLayers(layer_desc->layers); + const RasterProperties modifiedProperties = [&]{ + RasterProperties modifiedProperties = properties; + modifiedProperties.opacity = 1; // figure out why this was here + return modifiedProperties; + }(); + + const int buffer = bucket.properties.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; +// }(); + +// TODO set painter->matrix = vtxMatrix; ? + + map.updateTiles(); + map.renderLayers(layer_desc->layers); + + if (bucket.properties.blur > 0) { + bucket.texture.blur(*this, bucket.properties.blur); + } + + bucket.texture.unbindFramebuffer(); + finishPrerender(bucket); - if (bucket.properties.blur > 0) { - bucket.texture.blur(*this, bucket.properties.blur); } - - bucket.texture.unbindFramebuffer(); - finishPrerender(bucket); + renderPrerenderedTexture(bucket); } @@ -55,7 +63,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay glDepthRange(strata + strata_epsilon, 1.0f); if (!bucket.hasData()) { - bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray, bucket.texture.getTexture()); +// bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray, bucket.texture.getTexture()); } else { bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); } From fb5c3a888d7ecac412c2a74112ce98ec0242e145 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Thu, 7 Aug 2014 18:38:56 -0700 Subject: [PATCH 06/22] textures binding to map, just the wrong textures -- but so much closer --- include/mbgl/map/map.hpp | 5 ++-- src/renderer/painter_raster.cpp | 41 ++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index a7c692c77..669f2868c 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -46,6 +46,9 @@ public: void rerender(); void renderLayers(std::shared_ptr group); + enum RenderPass { Opaque, Translucent }; + + void renderLayer(std::shared_ptr layer_desc, RenderPass pass); // Forces a map update: always triggers a rerender. void update(); @@ -148,11 +151,9 @@ private: // the stylesheet. void prepare(); - enum RenderPass { Opaque, Translucent }; // Unconditionally performs a render with the current map state. void render(); - void renderLayer(std::shared_ptr layer_desc, RenderPass pass); private: bool async = false; diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index dcf88f4e5..e752cce87 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -1,9 +1,12 @@ #include #include #include +#include #include #include +#include + using namespace mbgl; void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id) { @@ -19,25 +22,35 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay preparePrerender(bucket); - const RasterProperties modifiedProperties = [&]{ - RasterProperties modifiedProperties = properties; - modifiedProperties.opacity = 1; // figure out why this was here - return modifiedProperties; - }(); +// const RasterProperties modifiedProperties = [&]{ +// RasterProperties modifiedProperties = properties; +// modifiedProperties.opacity = 1; // figure out why this was here +// return modifiedProperties; +// }(); const int buffer = bucket.properties.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; -// }(); + const mat4 oldMatrix = matrix; -// TODO set painter->matrix = vtxMatrix; ? + const mat4 preMatrix = [&]{ + mat4 vtxMatrix; + matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); + matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); + return vtxMatrix; + }(); + matrix = preMatrix; + + // call updateTiles to get parsed data for sublayers map.updateTiles(); - map.renderLayers(layer_desc->layers); + + 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); + setTranslucent(); + map.renderLayer(*it, Map::RenderPass::Translucent); + } if (bucket.properties.blur > 0) { bucket.texture.blur(*this, bucket.properties.blur); @@ -46,6 +59,8 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay bucket.texture.unbindFramebuffer(); finishPrerender(bucket); + matrix = oldMatrix; + } renderPrerenderedTexture(bucket); From 2be006fb0027970398d387d1d759adaa9b10e426 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Thu, 7 Aug 2014 18:40:31 -0700 Subject: [PATCH 07/22] unnecessary include --- src/renderer/painter_raster.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index e752cce87..fd81a490f 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -5,8 +5,6 @@ #include #include -#include - using namespace mbgl; void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id) { From 4083b534d7e6df767614791dad275f2b20de87d5 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Fri, 8 Aug 2014 13:07:20 -0700 Subject: [PATCH 08/22] committing so as to be revertable when i accidentally destroy the painter fns --- include/mbgl/map/map.hpp | 3 +- src/map/map.cpp | 62 +++++++++++++++++++++++++++++++++ src/renderer/painter_raster.cpp | 18 ++++++++-- 3 files changed, 79 insertions(+), 4 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 669f2868c..f7397497e 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -49,6 +49,7 @@ public: 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); // Forces a map update: always triggers a rerender. void update(); @@ -178,10 +179,10 @@ private: public: View &view; + TransformState state; private: Transform transform; - TransformState state; std::shared_ptr fileSource; diff --git a/src/map/map.cpp b/src/map/map.cpp index 54d77bd36..3db6e1171 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -719,3 +719,65 @@ void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass) { style_source.source->render(painter, layer_desc); } } + +//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/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index fd81a490f..1462af76b 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -1,9 +1,11 @@ #include +#include #include #include #include #include #include +#include using namespace mbgl; @@ -28,7 +30,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay const int buffer = bucket.properties.buffer * 4096.0f; - const mat4 oldMatrix = matrix; + const mat4 oldMatrix = vtxMatrix; const mat4 preMatrix = [&]{ mat4 vtxMatrix; @@ -37,7 +39,15 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay return vtxMatrix; }(); - matrix = preMatrix; +// *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(); @@ -49,6 +59,8 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay setTranslucent(); map.renderLayer(*it, Map::RenderPass::Translucent); } + +// TODO make a separate renderLayer overload that takes a prerendered + tileID if (bucket.properties.blur > 0) { bucket.texture.blur(*this, bucket.properties.blur); @@ -57,7 +69,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay bucket.texture.unbindFramebuffer(); finishPrerender(bucket); - matrix = oldMatrix; +// Tile(id).matrix = oldMatrix; } From 1bd704ced7408b4ac886092c2c71a01232860293 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Fri, 8 Aug 2014 14:04:58 -0700 Subject: [PATCH 09/22] rebase fix --- include/mbgl/map/tile_parser.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/include/mbgl/map/tile_parser.hpp b/include/mbgl/map/tile_parser.hpp index 1b0a8bfe6..f011d47a3 100644 --- a/include/mbgl/map/tile_parser.hpp +++ b/include/mbgl/map/tile_parser.hpp @@ -37,7 +37,6 @@ public: const std::shared_ptr &glyphStore, const std::shared_ptr &spriteAtlas, const std::shared_ptr &sprite); - const std::shared_ptr &texturepool); public: void parse(); From 510aaef07fd4a26d39726e02998da2abc5d14649 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Fri, 8 Aug 2014 15:26:42 -0700 Subject: [PATCH 10/22] 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 From 1ad2f26b9d753940e26d0ac3be96392feb73ae9e Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Fri, 8 Aug 2014 15:50:35 -0700 Subject: [PATCH 11/22] VICTORY --- include/mbgl/map/map.hpp | 2 +- include/mbgl/map/raster_tile_data.hpp | 2 +- include/mbgl/map/source.hpp | 2 +- include/mbgl/map/tile_data.hpp | 2 +- include/mbgl/map/vector_tile_data.hpp | 2 +- include/mbgl/renderer/bucket.hpp | 2 +- include/mbgl/renderer/debug_bucket.hpp | 2 +- include/mbgl/renderer/fill_bucket.hpp | 2 +- include/mbgl/renderer/line_bucket.hpp | 2 +- include/mbgl/renderer/painter.hpp | 22 +++++++++++----------- include/mbgl/renderer/raster_bucket.hpp | 2 +- include/mbgl/renderer/symbol_bucket.hpp | 2 +- src/map/map.cpp | 4 ++-- src/map/raster_tile_data.cpp | 4 ++-- src/map/source.cpp | 6 +++--- src/map/vector_tile_data.cpp | 4 ++-- src/renderer/debug_bucket.cpp | 4 ++-- src/renderer/fill_bucket.cpp | 4 ++-- src/renderer/line_bucket.cpp | 4 ++-- src/renderer/painter.cpp | 8 ++++---- src/renderer/painter_debug.cpp | 8 ++++---- src/renderer/painter_fill.cpp | 4 ++-- src/renderer/painter_line.cpp | 4 ++-- src/renderer/painter_prerender.cpp | 2 +- src/renderer/painter_raster.cpp | 10 +++++----- src/renderer/painter_symbol.cpp | 2 +- src/renderer/raster_bucket.cpp | 4 ++-- src/renderer/symbol_bucket.cpp | 4 ++-- 28 files changed, 60 insertions(+), 60 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 59f54bdb1..afb3d1f76 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -48,7 +48,7 @@ public: void renderLayers(std::shared_ptr group); enum RenderPass { Opaque, Translucent }; - void renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id = nullptr); + void renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id = nullptr, const mat4* matrix = nullptr); // Forces a map update: always triggers a rerender. void update(); diff --git a/include/mbgl/map/raster_tile_data.hpp b/include/mbgl/map/raster_tile_data.hpp index 76b7eee2c..98aa3baaf 100644 --- a/include/mbgl/map/raster_tile_data.hpp +++ b/include/mbgl/map/raster_tile_data.hpp @@ -22,7 +22,7 @@ public: ~RasterTileData(); virtual void parse(); - virtual void render(Painter &painter, std::shared_ptr layer_desc); + virtual void render(Painter &painter, std::shared_ptr layer_desc, const mat4 &matrix); virtual bool hasData(std::shared_ptr layer_desc) const; protected: diff --git a/include/mbgl/map/source.hpp b/include/mbgl/map/source.hpp index d708305fe..4ffd09719 100644 --- a/include/mbgl/map/source.hpp +++ b/include/mbgl/map/source.hpp @@ -32,7 +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 render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id, const mat4 &matrix); void finishRender(Painter &painter); std::forward_list getIDs() const; diff --git a/include/mbgl/map/tile_data.hpp b/include/mbgl/map/tile_data.hpp index c349ea2ba..5991613a2 100644 --- a/include/mbgl/map/tile_data.hpp +++ b/include/mbgl/map/tile_data.hpp @@ -53,7 +53,7 @@ public: virtual void beforeParse(); virtual void parse() = 0; virtual void afterParse(); - virtual void render(Painter &painter, std::shared_ptr layer_desc) = 0; + virtual void render(Painter &painter, std::shared_ptr layer_desc, const mat4 &matrix) = 0; virtual bool hasData(std::shared_ptr layer_desc) const = 0; diff --git a/include/mbgl/map/vector_tile_data.hpp b/include/mbgl/map/vector_tile_data.hpp index edad22899..deb628e48 100644 --- a/include/mbgl/map/vector_tile_data.hpp +++ b/include/mbgl/map/vector_tile_data.hpp @@ -32,7 +32,7 @@ public: virtual void beforeParse(); virtual void parse(); virtual void afterParse(); - virtual void render(Painter &painter, std::shared_ptr layer_desc); + virtual void render(Painter &painter, std::shared_ptr layer_desc, const mat4 &matrix); virtual bool hasData(std::shared_ptr layer_desc) const; protected: diff --git a/include/mbgl/renderer/bucket.hpp b/include/mbgl/renderer/bucket.hpp index a8bd437bb..1391f6e3e 100644 --- a/include/mbgl/renderer/bucket.hpp +++ b/include/mbgl/renderer/bucket.hpp @@ -13,7 +13,7 @@ class StyleLayer; class Bucket : private util::noncopyable { public: - virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id) = 0; + virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) = 0; virtual bool hasData() const = 0; virtual ~Bucket() {} diff --git a/include/mbgl/renderer/debug_bucket.hpp b/include/mbgl/renderer/debug_bucket.hpp index ac4f18cc2..660b7fcba 100644 --- a/include/mbgl/renderer/debug_bucket.hpp +++ b/include/mbgl/renderer/debug_bucket.hpp @@ -20,7 +20,7 @@ class DebugBucket : public Bucket { public: DebugBucket(DebugFontBuffer& fontBuffer); - virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id); + virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; void drawLines(PlainShader& shader); diff --git a/include/mbgl/renderer/fill_bucket.hpp b/include/mbgl/renderer/fill_bucket.hpp index 9193b0914..e9340cce6 100644 --- a/include/mbgl/renderer/fill_bucket.hpp +++ b/include/mbgl/renderer/fill_bucket.hpp @@ -44,7 +44,7 @@ public: const StyleBucketFill& properties); ~FillBucket(); - virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id); + virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; void addGeometry(pbf& data); diff --git a/include/mbgl/renderer/line_bucket.hpp b/include/mbgl/renderer/line_bucket.hpp index d42b10bfb..f65ca3560 100644 --- a/include/mbgl/renderer/line_bucket.hpp +++ b/include/mbgl/renderer/line_bucket.hpp @@ -28,7 +28,7 @@ public: PointElementsBuffer& pointElementsBuffer, const StyleBucketLine& properties); - virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id); + virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; void addGeometry(pbf& data); diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index fa981c3c2..d4810cf69 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -70,26 +70,26 @@ public: void changeMatrix(); // Renders a particular layer from a tile. - void renderTileLayer(const Tile& tile, std::shared_ptr layer_desc); + void renderTileLayer(const Tile& tile, std::shared_ptr layer_desc, const mat4 &matrix); // Renders debug information for a tile. void renderTileDebug(const Tile& tile); // Renders the red debug frame around a tile, visualizing its perimeter. - void renderDebugFrame(); + void renderDebugFrame(const mat4 &matrix); - void renderDebugText(DebugBucket& bucket); + void renderDebugText(DebugBucket& bucket, const mat4 &matrix); void renderDebugText(const std::vector &strings); - void renderFill(FillBucket& bucket, const FillProperties& properties, const Tile::ID& id, const mat4 &mat); - void renderFill(FillBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); - void renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); - void renderSymbol(SymbolBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); - void renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); + void renderFill(FillBucket& bucket, const FillProperties& properties, const Tile::ID& id, const mat4 &matrix); + void renderFill(FillBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); + void renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); + void renderSymbol(SymbolBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); + void renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); void preparePrerender(RasterBucket &bucket); void finishPrerender(RasterBucket &bucket); - void renderPrerenderedTexture(RasterBucket &bucket); + void renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix); void createPrerendered(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); @@ -119,7 +119,7 @@ public: bool needsAnimation() const; private: void setupShaders(); - const mat4 &translatedMatrix(const std::array &translation, const Tile::ID &id, TranslateAnchorType anchor = TranslateAnchorType::Map); + const mat4 &translatedMatrix(const mat4& matrix, const std::array &translation, const Tile::ID &id, TranslateAnchorType anchor = TranslateAnchorType::Map); void prepareTile(const Tile& tile); @@ -129,7 +129,7 @@ public: void depthMask(bool value); public: - mat4 matrix; +// mat4 matrix; mat4 vtxMatrix; mat4 projMatrix; mat4 nativeMatrix; diff --git a/include/mbgl/renderer/raster_bucket.hpp b/include/mbgl/renderer/raster_bucket.hpp index 4eccb22bd..41f4d4e4c 100644 --- a/include/mbgl/renderer/raster_bucket.hpp +++ b/include/mbgl/renderer/raster_bucket.hpp @@ -18,7 +18,7 @@ class RasterBucket : public Bucket { public: RasterBucket(const std::shared_ptr &texturepool, const StyleBucketRaster& properties); - virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id); + virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; bool setImage(const std::string &data); diff --git a/include/mbgl/renderer/symbol_bucket.hpp b/include/mbgl/renderer/symbol_bucket.hpp index c003230ca..e89027423 100644 --- a/include/mbgl/renderer/symbol_bucket.hpp +++ b/include/mbgl/renderer/symbol_bucket.hpp @@ -53,7 +53,7 @@ class SymbolBucket : public Bucket { public: SymbolBucket(const StyleBucketSymbol &properties, Collision &collision); - virtual void render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id); + virtual void render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id, const mat4 &matrix); virtual bool hasData() const; virtual bool hasTextData() const; virtual bool hasIconData() const; diff --git a/src/map/map.cpp b/src/map/map.cpp index a289e46a2..6bbbfcc1e 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, const Tile::ID* id) { +void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id, const mat4* matrix) { 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) { @@ -719,7 +719,7 @@ void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass, c if (!id) { style_source.source->render(painter, layer_desc); } else { - style_source.source->render(painter, layer_desc, *id); + style_source.source->render(painter, layer_desc, *id, *matrix); } } } diff --git a/src/map/raster_tile_data.cpp b/src/map/raster_tile_data.cpp index a401fdc4d..182a61439 100644 --- a/src/map/raster_tile_data.cpp +++ b/src/map/raster_tile_data.cpp @@ -25,8 +25,8 @@ void RasterTileData::parse() { } } -void RasterTileData::render(Painter &painter, std::shared_ptr layer_desc) { - bucket.render(painter, layer_desc, id); +void RasterTileData::render(Painter &painter, std::shared_ptr layer_desc, const mat4 &matrix) { + bucket.render(painter, layer_desc, id, matrix); } bool RasterTileData::hasData(std::shared_ptr /*layer_desc*/) const { diff --git a/src/map/source.cpp b/src/map/source.cpp index c4cd3a51d..bbe25969c 100644 --- a/src/map/source.cpp +++ b/src/map/source.cpp @@ -83,15 +83,15 @@ void Source::render(Painter &painter, std::shared_ptr layer_desc) { for (const std::pair> &pair : tiles) { Tile &tile = *pair.second; if (tile.data && tile.data->state == TileData::State::parsed) { - painter.renderTileLayer(tile, layer_desc); + painter.renderTileLayer(tile, layer_desc, tile.matrix); } } } -void Source::render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id) { +void Source::render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id, const mat4 &matrix) { 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); + painter.renderTileLayer(*it->second, layer_desc, matrix); } } diff --git a/src/map/vector_tile_data.cpp b/src/map/vector_tile_data.cpp index 2bf339b65..f1c67d8e1 100644 --- a/src/map/vector_tile_data.cpp +++ b/src/map/vector_tile_data.cpp @@ -52,12 +52,12 @@ void VectorTileData::afterParse() { parser.reset(); } -void VectorTileData::render(Painter &painter, std::shared_ptr layer_desc) { +void VectorTileData::render(Painter &painter, std::shared_ptr layer_desc, const mat4 &matrix) { if (state == State::parsed && layer_desc->bucket) { auto databucket_it = buckets.find(layer_desc->bucket->name); if (databucket_it != buckets.end()) { assert(databucket_it->second); - databucket_it->second->render(painter, layer_desc, id); + databucket_it->second->render(painter, layer_desc, id, matrix); } } } diff --git a/src/renderer/debug_bucket.cpp b/src/renderer/debug_bucket.cpp index e51dd75b1..a3ac329f4 100644 --- a/src/renderer/debug_bucket.cpp +++ b/src/renderer/debug_bucket.cpp @@ -14,8 +14,8 @@ DebugBucket::DebugBucket(DebugFontBuffer& fontBuffer) : fontBuffer(fontBuffer) { } -void DebugBucket::render(Painter& painter, std::shared_ptr /*layer_desc*/, const Tile::ID& /*id*/) { - painter.renderDebugText(*this); +void DebugBucket::render(Painter& painter, std::shared_ptr /*layer_desc*/, const Tile::ID& /*id*/, const mat4 &matrix) { + painter.renderDebugText(*this, matrix); } bool DebugBucket::hasData() const { diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index 17aa2bccf..4b4000ce9 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -204,8 +204,8 @@ void FillBucket::tessellate() { lineGroup.vertex_length += total_vertex_count; } -void FillBucket::render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id) { - painter.renderFill(*this, layer_desc, id); +void FillBucket::render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { + painter.renderFill(*this, layer_desc, id, matrix); } bool FillBucket::hasData() const { diff --git a/src/renderer/line_bucket.cpp b/src/renderer/line_bucket.cpp index 2e04820e4..949d71e13 100644 --- a/src/renderer/line_bucket.cpp +++ b/src/renderer/line_bucket.cpp @@ -341,8 +341,8 @@ void LineBucket::addGeometry(const std::vector& vertices) { } } -void LineBucket::render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id) { - painter.renderLine(*this, layer_desc, id); +void LineBucket::render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { + painter.renderLine(*this, layer_desc, id, matrix); } bool LineBucket::hasData() const { diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index 6cdaf760a..dc75b0abc 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -164,25 +164,25 @@ void Painter::setStrata(float value) { } void Painter::prepareTile(const Tile& tile) { - matrix = tile.matrix; +// matrix = tile.matrix; GLint id = (GLint)tile.clip.mask.to_ulong(); GLuint mask = clipMask[tile.clip.length]; glStencilFunc(GL_EQUAL, id, mask); } -void Painter::renderTileLayer(const Tile& tile, std::shared_ptr layer_desc) { +void Painter::renderTileLayer(const Tile& tile, std::shared_ptr layer_desc, const mat4 &matrix) { assert(tile.data); if (tile.data->hasData(layer_desc) || layer_desc->type == StyleLayerType::Raster) { gl::group group(util::sprintf<32>("render %d/%d/%d\n", tile.id.z, tile.id.y, tile.id.z)); prepareTile(tile); - tile.data->render(*this, layer_desc); + tile.data->render(*this, layer_desc, matrix); frameHistory.record(map.getAnimationTime(), map.getState().getNormalizedZoom()); } } -const mat4 &Painter::translatedMatrix(const std::array &translation, const Tile::ID &id, TranslateAnchorType anchor) { +const mat4 &Painter::translatedMatrix(const mat4& matrix, const std::array &translation, const Tile::ID &id, TranslateAnchorType anchor) { if (translation[0] == 0 && translation[1] == 0) { return matrix; } else { diff --git a/src/renderer/painter_debug.cpp b/src/renderer/painter_debug.cpp index d79493e61..eae655f1f 100644 --- a/src/renderer/painter_debug.cpp +++ b/src/renderer/painter_debug.cpp @@ -10,12 +10,12 @@ void Painter::renderTileDebug(const Tile& tile) { assert(tile.data); if (debug) { prepareTile(tile); - renderDebugText(tile.data->debugBucket); - renderDebugFrame(); + renderDebugText(tile.data->debugBucket, tile.matrix); + renderDebugFrame(tile.matrix); } } -void Painter::renderDebugText(DebugBucket& bucket) { +void Painter::renderDebugText(DebugBucket& bucket, const mat4 &matrix) { gl::group group("debug text"); glDisable(GL_DEPTH_TEST); @@ -42,7 +42,7 @@ void Painter::renderDebugText(DebugBucket& bucket) { glEnable(GL_DEPTH_TEST); } -void Painter::renderDebugFrame() { +void Painter::renderDebugFrame(const mat4 &matrix) { gl::group group("debug frame"); // Disable depth test and don't count this towards the depth buffer, diff --git a/src/renderer/painter_fill.cpp b/src/renderer/painter_fill.cpp index d0bfcad83..171763933 100644 --- a/src/renderer/painter_fill.cpp +++ b/src/renderer/painter_fill.cpp @@ -146,10 +146,10 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c } } -void Painter::renderFill(FillBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id) { +void Painter::renderFill(FillBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { // Abort early. if (!bucket.hasData()) return; const FillProperties &properties = layer_desc->getProperties(); - const mat4 &vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); + const mat4 &vtxMatrix = translatedMatrix(matrix, properties.translate, id, properties.translateAnchor); renderFill(bucket, properties, id, vtxMatrix); } diff --git a/src/renderer/painter_line.cpp b/src/renderer/painter_line.cpp index dc09f5895..20c6491fc 100644 --- a/src/renderer/painter_line.cpp +++ b/src/renderer/painter_line.cpp @@ -5,7 +5,7 @@ using namespace mbgl; -void Painter::renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id) { +void Painter::renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { // Abort early. if (pass == Opaque) return; if (!bucket.hasData()) return; @@ -31,7 +31,7 @@ void Painter::renderLine(LineBucket& bucket, std::shared_ptr layer_d float dash_length = properties.dash_array[0]; float dash_gap = properties.dash_array[1]; - const mat4 &vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); + const mat4 &vtxMatrix = translatedMatrix(matrix, properties.translate, id, properties.translateAnchor); glDepthRange(strata, 1.0f); diff --git a/src/renderer/painter_prerender.cpp b/src/renderer/painter_prerender.cpp index 124a6c1fb..42033271b 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -27,7 +27,7 @@ void Painter::finishPrerender(RasterBucket &bucket) { glViewport(0, 0, gl_viewport[0], gl_viewport[1]); } -void Painter::renderPrerenderedTexture(RasterBucket &bucket) { +void Painter::renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix) { const int buffer = bucket.properties.buffer * 4096.0f; // draw the texture on a quad diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 8d8f263ba..723d4b5e4 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -9,7 +9,7 @@ using namespace mbgl; -void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id) { +void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { if (pass != Translucent) return; const RasterProperties &properties = layer_desc->getProperties(); @@ -32,7 +32,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay const mat4 oldMatrix = vtxMatrix; - const mat4 vtxMatrix = [&]{ + const mat4 preMatrix = [&]{ mat4 vtxMatrix; matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); @@ -57,9 +57,9 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay 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, &id); + map.renderLayer(*it, Map::RenderPass::Opaque, &id, &preMatrix); setTranslucent(); - map.renderLayer(*it, Map::RenderPass::Translucent, &id); + map.renderLayer(*it, Map::RenderPass::Translucent, &id, &preMatrix); } // TODO make a separate renderLayer overload that takes a prerendered + tileID @@ -75,7 +75,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay } - renderPrerenderedTexture(bucket); + renderPrerenderedTexture(bucket, matrix); } diff --git a/src/renderer/painter_symbol.cpp b/src/renderer/painter_symbol.cpp index a2238a354..497051f77 100644 --- a/src/renderer/painter_symbol.cpp +++ b/src/renderer/painter_symbol.cpp @@ -10,7 +10,7 @@ namespace mbgl { void Painter::renderSymbol(SymbolBucket &bucket, std::shared_ptr layer_desc, - const Tile::ID &/*id*/) { + const Tile::ID &/*id*/, const mat4 &matrix) { // Abort early. if (pass == Opaque) { return; diff --git a/src/renderer/raster_bucket.cpp b/src/renderer/raster_bucket.cpp index 80f5039ac..ddfff119e 100644 --- a/src/renderer/raster_bucket.cpp +++ b/src/renderer/raster_bucket.cpp @@ -9,8 +9,8 @@ RasterBucket::RasterBucket(const std::shared_ptr &texturepool, cons raster(texturepool) { } -void RasterBucket::render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id) { - painter.renderRaster(*this, layer_desc, id); +void RasterBucket::render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id, const mat4 &matrix) { + painter.renderRaster(*this, layer_desc, id, matrix); } bool RasterBucket::setImage(const std::string &data) { diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp index 4072cf0c6..459c235da 100644 --- a/src/renderer/symbol_bucket.cpp +++ b/src/renderer/symbol_bucket.cpp @@ -23,8 +23,8 @@ SymbolBucket::SymbolBucket(const StyleBucketSymbol &properties, Collision &colli : properties(properties), collision(collision) {} void SymbolBucket::render(Painter &painter, std::shared_ptr layer_desc, - const Tile::ID &id) { - painter.renderSymbol(*this, layer_desc, id); + const Tile::ID &id, const mat4 &matrix) { + painter.renderSymbol(*this, layer_desc, id, matrix); } bool SymbolBucket::hasData() const { return hasTextData() || hasIconData(); } From 41165452bcf16e90f6e4265123021e56cfb021f6 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Mon, 11 Aug 2014 12:02:46 -0700 Subject: [PATCH 12/22] some cleaning up, raster spin->hue-rotate rename --- include/mbgl/renderer/painter.hpp | 4 +- include/mbgl/style/property_key.hpp | 2 +- include/mbgl/style/style_properties.hpp | 2 +- src/map/tile_parser.cpp | 5 +-- src/renderer/painter_prerender.cpp | 12 +----- src/renderer/painter_raster.cpp | 52 +++++++------------------ src/style/property_fallback.cpp | 2 +- src/style/style_layer.cpp | 2 +- src/style/style_parser.cpp | 4 +- 9 files changed, 26 insertions(+), 59 deletions(-) diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index d4810cf69..80948c49b 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -43,6 +43,7 @@ class RasterBucket; class PrerenderedTexture; struct FillProperties; +struct RasterProperties; struct CompositeProperties; class LayerDescription; @@ -87,9 +88,8 @@ public: void renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); void preparePrerender(RasterBucket &bucket); - void finishPrerender(RasterBucket &bucket); - void renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix); + void renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, const RasterProperties& properties); void createPrerendered(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); diff --git a/include/mbgl/style/property_key.hpp b/include/mbgl/style/property_key.hpp index 68dc70959..7d2498176 100644 --- a/include/mbgl/style/property_key.hpp +++ b/include/mbgl/style/property_key.hpp @@ -54,7 +54,7 @@ enum class PropertyKey { CompositeOpacity, RasterOpacity, - RasterSpin, + RasterHueRotate, RasterBrightnessLow, RasterBrightnessHigh, RasterSaturation, diff --git a/include/mbgl/style/style_properties.hpp b/include/mbgl/style/style_properties.hpp index 35ea97781..f12ab430e 100644 --- a/include/mbgl/style/style_properties.hpp +++ b/include/mbgl/style/style_properties.hpp @@ -89,7 +89,7 @@ struct CompositeProperties { struct RasterProperties { inline RasterProperties() {} float opacity = 1.0f; - float spin = 0.0f; + float hue_rotate = 0.0f; std::array brightness = {{ 0, 1 }}; float saturation = 0.0f; float contrast = 0.0f; diff --git a/src/map/tile_parser.cpp b/src/map/tile_parser.cpp index 35ad66d69..7c3b720f6 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -45,7 +45,6 @@ TileParser::TileParser(const std::string &data, VectorTileData &tile, spriteAtlas(spriteAtlas), sprite(sprite), collision(tile.id.z, 4096, tile.source.tile_size, tile.depth) { -// placement(tile.id.z, tile.id.z >= tile.source.max_zoom ? tile.source.max_zoom - tile.id.z : 1) { // TODO : i'm guessing remove this in the rebase? } void TileParser::parse() { @@ -84,7 +83,6 @@ void TileParser::parseStyleLayers(std::shared_ptr 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()); @@ -116,8 +114,7 @@ std::unique_ptr TileParser::createBucket(std::shared_ptr 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()) { - // Assume this is a prerendered raster layer -- TODO more thorough checking here?? + } else if (bucket_desc->render.is() && bucket_desc->render.get().prerendered == true) { return createRasterBucket(texturePool, bucket_desc->render.get()); } else { // The layer specified in the bucket does not exist. Do nothing. diff --git a/src/renderer/painter_prerender.cpp b/src/renderer/painter_prerender.cpp index 42033271b..429f3cc80 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -20,14 +20,7 @@ void Painter::preparePrerender(RasterBucket &bucket) { glViewport(0, 0, bucket.properties.size, bucket.properties.size); } -void Painter::finishPrerender(RasterBucket &bucket) { - glEnable(GL_DEPTH_TEST); - glEnable(GL_STENCIL_TEST); - - glViewport(0, 0, gl_viewport[0], gl_viewport[1]); -} - -void Painter::renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix) { +void Painter::renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, const RasterProperties& properties) { const int buffer = bucket.properties.buffer * 4096.0f; // draw the texture on a quad @@ -40,8 +33,7 @@ void Painter::renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix) glActiveTexture(GL_TEXTURE0); rasterShader->setImage(0); rasterShader->setBuffer(buffer); - rasterShader->setOpacity(1); -// rasterShader->setOpacity(bucket.properties.opacity); // TODO find a place to pass opacity and change this back + rasterShader->setOpacity(properties.opacity); bucket.texture.bindTexture(); coveringRasterArray.bind(*rasterShader, tileStencilBuffer, BUFFER_OFFSET(0)); glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index()); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 723d4b5e4..b5f09a3e1 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -22,16 +22,8 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay preparePrerender(bucket); -// const RasterProperties modifiedProperties = [&]{ -// RasterProperties modifiedProperties = properties; -// modifiedProperties.opacity = 1; // figure out why this was here -// return modifiedProperties; -// }(); - const int buffer = bucket.properties.buffer * 4096.0f; - const mat4 oldMatrix = vtxMatrix; - const mat4 preMatrix = [&]{ mat4 vtxMatrix; matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); @@ -39,20 +31,8 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay return vtxMatrix; }(); -// *id.matrix = vtxMatrix; - - - - -// 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) { @@ -62,39 +42,37 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay map.renderLayer(*it, Map::RenderPass::Translucent, &id, &preMatrix); } -// TODO make a separate renderLayer overload that takes a prerendered + tileID - if (bucket.properties.blur > 0) { bucket.texture.blur(*this, bucket.properties.blur); } bucket.texture.unbindFramebuffer(); - finishPrerender(bucket); -// Tile(id).matrix = oldMatrix; + glEnable(GL_DEPTH_TEST); + glEnable(GL_STENCIL_TEST); + + glViewport(0, 0, gl_viewport[0], gl_viewport[1]); } - renderPrerenderedTexture(bucket, matrix); + renderPrerenderedTexture(bucket, matrix, properties); } - depthMask(false); + // Only draw non-prerendered raster here + if (bucket.hasData()) { + depthMask(false); - useProgram(rasterShader->program); - rasterShader->setMatrix(matrix); - rasterShader->setBuffer(0); - rasterShader->setOpacity(1); -// rasterShader->setOpacity(properties.opacity * tile_data->raster->opacity); // TODO fix + useProgram(rasterShader->program); + rasterShader->setMatrix(matrix); + rasterShader->setBuffer(0); + rasterShader->setOpacity(properties.opacity); - glDepthRange(strata + strata_epsilon, 1.0f); + glDepthRange(strata + strata_epsilon, 1.0f); - if (!bucket.hasData()) { -// bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray, bucket.texture.getTexture()); - } else { bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); - } - depthMask(true); + depthMask(true); + } } diff --git a/src/style/property_fallback.cpp b/src/style/property_fallback.cpp index 4401c8105..4028980cb 100644 --- a/src/style/property_fallback.cpp +++ b/src/style/property_fallback.cpp @@ -47,7 +47,7 @@ const std::map PropertyFallbackValue::properties = { { PropertyKey::CompositeOpacity, defaultStyleProperties().opacity }, { PropertyKey::RasterOpacity, defaultStyleProperties().opacity }, - { PropertyKey::RasterSpin, defaultStyleProperties().spin }, + { PropertyKey::RasterHueRotate, defaultStyleProperties().hue_rotate }, { PropertyKey::RasterBrightnessLow, defaultStyleProperties().brightness[0] }, { PropertyKey::RasterBrightnessHigh, defaultStyleProperties().brightness[1] }, { PropertyKey::RasterSaturation, defaultStyleProperties().saturation }, diff --git a/src/style/style_layer.cpp b/src/style/style_layer.cpp index 8ec04d669..520c18378 100644 --- a/src/style/style_layer.cpp +++ b/src/style/style_layer.cpp @@ -228,7 +228,7 @@ void StyleLayer::applyStyleProperties(const float z, const tim properties.set(); RasterProperties &raster = properties.get(); applyStyleProperty(PropertyKey::RasterOpacity, raster.opacity, z, now); - applyStyleProperty(PropertyKey::RasterSpin, raster.spin, z, now); + applyStyleProperty(PropertyKey::RasterHueRotate, raster.hue_rotate, z, now); applyStyleProperty(PropertyKey::RasterBrightnessLow, raster.brightness[0], z, now); applyStyleProperty(PropertyKey::RasterBrightnessHigh, raster.brightness[1], z, now); applyStyleProperty(PropertyKey::RasterSaturation, raster.saturation, z, now); diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 17c8fdf25..33a1573c0 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -639,8 +639,8 @@ void StyleParser::parseStyle(JSVal value, ClassProperties &klass) { // TODO edit these?: parseOptionalProperty>("raster-opacity", Key::RasterOpacity, klass, value); parseOptionalProperty("transition-raster-opacity", Key::RasterOpacity, klass, value); - parseOptionalProperty>("raster-spin", Key::RasterSpin, klass, value); - parseOptionalProperty("transition-raster-spin", Key::RasterSpin, klass, value); + parseOptionalProperty>("raster-hue-rotate", Key::RasterHueRotate, klass, value); + parseOptionalProperty("transition-raster-hue-rotate", Key::RasterHueRotate, klass, value); parseOptionalProperty>("raster-brightness-low", Key::RasterBrightnessLow, klass, value); parseOptionalProperty("transition-raster-brightness-low", Key::RasterBrightnessLow, klass, value); parseOptionalProperty>("raster-brightness-high", Key::RasterBrightnessHigh, klass, value); From 0263a9ffb7afc4f48e84b3fe3e0263cf32f739f5 Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Mon, 11 Aug 2014 15:42:09 -0700 Subject: [PATCH 13/22] minor access changes etc --- include/mbgl/map/map.hpp | 4 ++-- include/mbgl/renderer/painter.hpp | 1 - src/map/tile_parser.cpp | 2 +- src/renderer/painter.cpp | 2 -- src/style/style_parser.cpp | 5 ----- 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index afb3d1f76..8250b4275 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -45,7 +45,6 @@ public: // Triggers a lazy rerender: only performs a render when the map is not clean. void rerender(); - void renderLayers(std::shared_ptr group); enum RenderPass { Opaque, Translucent }; void renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id = nullptr, const mat4* matrix = nullptr); @@ -154,6 +153,7 @@ private: // Unconditionally performs a render with the current map state. void render(); + void renderLayers(std::shared_ptr group); private: bool async = false; @@ -178,10 +178,10 @@ private: public: View &view; - TransformState state; private: Transform transform; + TransformState state; std::shared_ptr fileSource; diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index 80948c49b..710e6134b 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -129,7 +129,6 @@ public: void depthMask(bool value); public: -// mat4 matrix; mat4 vtxMatrix; mat4 projMatrix; mat4 nativeMatrix; diff --git a/src/map/tile_parser.cpp b/src/map/tile_parser.cpp index 7c3b720f6..6069ad82c 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -101,8 +101,8 @@ std::unique_ptr TileParser::createBucket(std::shared_ptr 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()) { return createFillBucket(layer, bucket_desc->filter, bucket_desc->render.get()); } else if (bucket_desc->render.is()) { diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index dc75b0abc..e2da2d0e5 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -164,8 +164,6 @@ void Painter::setStrata(float value) { } void Painter::prepareTile(const Tile& tile) { -// matrix = tile.matrix; - GLint id = (GLint)tile.clip.mask.to_ulong(); GLuint mask = clipMask[tile.clip.length]; glStencilFunc(GL_EQUAL, id, mask); diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 33a1573c0..dd4db5d73 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -496,11 +496,6 @@ std::shared_ptr StyleParser::createLayer(JSVal value) { layer_id, std::move(styles)); if (value.HasMember("layers")) { - if (value.HasMember("type")) { - JSVal type = value["type"]; - if (std::string { type.GetString(), type.GetStringLength() } == "raster") { - } - } layer->layers = createLayers(value["layers"]); } From 18b1469e9ebd02465101fbea719c9c967d334072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Tue, 12 Aug 2014 15:24:02 +0200 Subject: [PATCH 14/22] use unified RenderPass type --- include/mbgl/map/map.hpp | 2 -- include/mbgl/renderer/painter.hpp | 4 +++- src/map/map.cpp | 12 ++++++------ src/renderer/painter.cpp | 8 ++++---- src/renderer/painter_fill.cpp | 6 +++--- src/renderer/painter_line.cpp | 2 +- src/renderer/painter_raster.cpp | 6 +++--- src/renderer/painter_symbol.cpp | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index b837f7928..14f8f4091 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -45,8 +45,6 @@ public: // Triggers a lazy rerender: only performs a render when the map is not clean. void rerender(); - enum RenderPass { Opaque, Translucent }; - void renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id = nullptr, const mat4* matrix = nullptr); // Forces a map update: always triggers a rerender. diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index 710e6134b..385e8bdd0 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -29,6 +29,8 @@ namespace mbgl { +enum class RenderPass : bool { Opaque, Translucent }; + class Transform; class Style; class Tile; @@ -154,7 +156,7 @@ private: bool gl_depthMask = true; std::array gl_viewport = {{ 0, 0 }}; float strata = 0; - enum { Opaque, Translucent } pass = Opaque; + RenderPass pass = RenderPass::Opaque; const float strata_epsilon = 1.0f / (1 << 16); public: diff --git a/src/map/map.cpp b/src/map/map.cpp index 3a46be466..60ddaa597 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -611,7 +611,7 @@ void Map::renderLayers(std::shared_ptr group) { for (auto it = group->layers.rbegin(), end = group->layers.rend(); it != end; ++it, ++i) { painter.setOpaque(); painter.setStrata(i * strata_thickness); - renderLayer(*it, Opaque); + renderLayer(*it, RenderPass::Opaque); } if (debug::renderTree) { std::cout << std::string(--indent * 4, ' ') << "}" << std::endl; @@ -627,7 +627,7 @@ void Map::renderLayers(std::shared_ptr group) { for (auto it = group->layers.begin(), end = group->layers.end(); it != end; ++it, --i) { painter.setTranslucent(); painter.setStrata(i * strata_thickness); - renderLayer(*it, Translucent); + renderLayer(*it, RenderPass::Translucent); } if (debug::renderTree) { std::cout << std::string(--indent * 4, ' ') << "}" << std::endl; @@ -637,7 +637,7 @@ void Map::renderLayers(std::shared_ptr group) { void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id, const mat4* matrix) { 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) { + if (pass == RenderPass::Translucent) { const CompositeProperties &properties = layer_desc->getProperties(); if (properties.isVisible()) { gl::group group(std::string("group: ") + layer_desc->id); @@ -698,15 +698,15 @@ void Map::renderLayer(std::shared_ptr layer_desc, RenderPass pass, c if (!layer_desc->getProperties().isVisible()) return; break; case StyleLayerType::Line: - if (pass == Opaque) return; + if (pass == RenderPass::Opaque) return; if (!layer_desc->getProperties().isVisible()) return; break; case StyleLayerType::Symbol: - if (pass == Opaque) return; + if (pass == RenderPass::Opaque) return; if (!layer_desc->getProperties().isVisible()) return; break; case StyleLayerType::Raster: - if (pass == Opaque) return; + if (pass == RenderPass::Opaque) return; if (!layer_desc->getProperties().isVisible()) return; break; default: diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index e2da2d0e5..956543d26 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -144,16 +144,16 @@ void Painter::clear() { } void Painter::setOpaque() { - if (pass != Opaque) { - pass = Opaque; + if (pass != RenderPass::Opaque) { + pass = RenderPass::Opaque; glDisable(GL_BLEND); depthMask(true); } } void Painter::setTranslucent() { - if (pass != Translucent) { - pass = Translucent; + if (pass != RenderPass::Translucent) { + pass = RenderPass::Translucent; glEnable(GL_BLEND); depthMask(false); } diff --git a/src/renderer/painter_fill.cpp b/src/renderer/painter_fill.cpp index 171763933..8306dd0a2 100644 --- a/src/renderer/painter_fill.cpp +++ b/src/renderer/painter_fill.cpp @@ -38,7 +38,7 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c // Because we're drawing top-to-bottom, and we update the stencil mask // below, we have to draw the outline first (!) - if (outline && pass == Translucent) { + if (outline && pass == RenderPass::Translucent) { useProgram(outlineShader->program); outlineShader->setMatrix(vtxMatrix); lineWidth(2.0f); // This is always fixed and does not depend on the pixelRatio! @@ -70,7 +70,7 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c // glStencilOp(GL_KEEP, GL_KEEP, GL_INCR_WRAP); } - if ((fill_color[3] >= 1.0f) == (pass == Opaque)) { + if ((fill_color[3] >= 1.0f) == (pass == RenderPass::Opaque)) { Sprite &sprite = *map.getSprite(); if (properties.image.size() && sprite) { SpriteAtlas &spriteAtlas = *map.getSpriteAtlas(); @@ -128,7 +128,7 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c // Because we're drawing top-to-bottom, and we update the stencil mask // below, we have to draw the outline first (!) - if (fringeline && pass == Translucent) { + if (fringeline && pass == RenderPass::Translucent) { useProgram(outlineShader->program); outlineShader->setMatrix(vtxMatrix); lineWidth(2.0f); // This is always fixed and does not depend on the pixelRatio! diff --git a/src/renderer/painter_line.cpp b/src/renderer/painter_line.cpp index 20c6491fc..375b99297 100644 --- a/src/renderer/painter_line.cpp +++ b/src/renderer/painter_line.cpp @@ -7,7 +7,7 @@ using namespace mbgl; void Painter::renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { // Abort early. - if (pass == Opaque) return; + if (pass == RenderPass::Opaque) return; if (!bucket.hasData()) return; const LineProperties &properties = layer_desc->getProperties(); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index b5f09a3e1..3f2de8591 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -10,7 +10,7 @@ using namespace mbgl; void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { - if (pass != Translucent) return; + if (pass != RenderPass::Translucent) return; const RasterProperties &properties = layer_desc->getProperties(); @@ -37,9 +37,9 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay 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, &id, &preMatrix); + map.renderLayer(*it, RenderPass::Opaque, &id, &preMatrix); setTranslucent(); - map.renderLayer(*it, Map::RenderPass::Translucent, &id, &preMatrix); + map.renderLayer(*it, RenderPass::Translucent, &id, &preMatrix); } if (bucket.properties.blur > 0) { diff --git a/src/renderer/painter_symbol.cpp b/src/renderer/painter_symbol.cpp index 497051f77..720f84d24 100644 --- a/src/renderer/painter_symbol.cpp +++ b/src/renderer/painter_symbol.cpp @@ -12,7 +12,7 @@ namespace mbgl { void Painter::renderSymbol(SymbolBucket &bucket, std::shared_ptr layer_desc, const Tile::ID &/*id*/, const mat4 &matrix) { // Abort early. - if (pass == Opaque) { + if (pass == RenderPass::Opaque) { return; } From 22e179aa37c3aece1350274e69ac86a5cd345a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Tue, 12 Aug 2014 16:30:27 +0200 Subject: [PATCH 15/22] remove trailing whitespace [skip ci] --- include/mbgl/geometry/geometry.hpp | 2 +- include/mbgl/map/map.hpp | 2 +- include/mbgl/renderer/painter.hpp | 4 ++-- include/mbgl/renderer/raster_bucket.hpp | 6 +++--- include/mbgl/util/raster.hpp | 2 +- src/map/source.cpp | 2 +- src/map/vector_tile.cpp | 2 +- src/map/vector_tile_data.cpp | 2 +- src/renderer/painter_prerender.cpp | 2 +- src/renderer/painter_raster.cpp | 24 ++++++++++++------------ src/renderer/prerendered_texture.cpp | 2 +- src/style/style_parser.cpp | 8 ++++---- src/util/raster.cpp | 4 ++-- src/util/texturepool.cpp | 2 +- 14 files changed, 32 insertions(+), 32 deletions(-) diff --git a/include/mbgl/geometry/geometry.hpp b/include/mbgl/geometry/geometry.hpp index 47981ce83..961569204 100644 --- a/include/mbgl/geometry/geometry.hpp +++ b/include/mbgl/geometry/geometry.hpp @@ -12,7 +12,7 @@ class Geometry : private util::noncopyable { public: inline explicit Geometry(pbf& data); - + enum command : uint8_t { end = 0, move_to = 1, diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 14f8f4091..fba38879e 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -46,7 +46,7 @@ public: void rerender(); void renderLayer(std::shared_ptr layer_desc, RenderPass pass, const Tile::ID* id = nullptr, const mat4* matrix = nullptr); - + // Forces a map update: always triggers a rerender. void update(); diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index 385e8bdd0..db85d8703 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -43,7 +43,7 @@ class LineBucket; class SymbolBucket; class RasterBucket; class PrerenderedTexture; - + struct FillProperties; struct RasterProperties; struct CompositeProperties; @@ -92,7 +92,7 @@ public: void preparePrerender(RasterBucket &bucket); void renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, const RasterProperties& properties); - + void createPrerendered(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void resize(); diff --git a/include/mbgl/renderer/raster_bucket.hpp b/include/mbgl/renderer/raster_bucket.hpp index 41f4d4e4c..a68475565 100644 --- a/include/mbgl/renderer/raster_bucket.hpp +++ b/include/mbgl/renderer/raster_bucket.hpp @@ -17,19 +17,19 @@ class VertexArrayObject; class RasterBucket : public Bucket { public: RasterBucket(const std::shared_ptr &texturepool, const StyleBucketRaster& properties); - + virtual void render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; bool setImage(const std::string &data); - + const StyleBucketRaster &properties; PrerenderedTexture texture; void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array); void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array, GLuint texture); - + Raster raster; private: diff --git a/include/mbgl/util/raster.hpp b/include/mbgl/util/raster.hpp index 9124f59ba..e526ffa5a 100644 --- a/include/mbgl/util/raster.hpp +++ b/include/mbgl/util/raster.hpp @@ -28,7 +28,7 @@ public: // bind prerendered texture void bind(const GLuint texture); - + // loaded status bool isLoaded() const; diff --git a/src/map/source.cpp b/src/map/source.cpp index bbe25969c..523a7f3bc 100644 --- a/src/map/source.cpp +++ b/src/map/source.cpp @@ -87,7 +87,7 @@ void Source::render(Painter &painter, std::shared_ptr layer_desc) { } } } - + void Source::render(Painter &painter, std::shared_ptr layer_desc, const Tile::ID &id, const mat4 &matrix) { auto it = tiles.find(id); if (it != tiles.end() && it->second->data && it->second->data->state == TileData::State::parsed) { diff --git a/src/map/vector_tile.cpp b/src/map/vector_tile.cpp index 8644c3e04..4ec25d6cf 100644 --- a/src/map/vector_tile.cpp +++ b/src/map/vector_tile.cpp @@ -128,7 +128,7 @@ FilteredVectorTileLayer::iterator::iterator(const FilteredVectorTileLayer& paren // return true; // } // -// +// // // // if (filterExpression.is>()) { diff --git a/src/map/vector_tile_data.cpp b/src/map/vector_tile_data.cpp index f1c67d8e1..1f74cab1d 100644 --- a/src/map/vector_tile_data.cpp +++ b/src/map/vector_tile_data.cpp @@ -21,7 +21,7 @@ VectorTileData::~VectorTileData() { } void VectorTileData::beforeParse() { - + parser = std::make_unique(data, *this, map.getStyle(), map.getGlyphAtlas(), map.getGlyphStore(), map.getSpriteAtlas(), map.getSprite()); } diff --git a/src/renderer/painter_prerender.cpp b/src/renderer/painter_prerender.cpp index 429f3cc80..f17014b62 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -22,7 +22,7 @@ void Painter::preparePrerender(RasterBucket &bucket) { void Painter::renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, const RasterProperties& properties) { const int buffer = bucket.properties.buffer * 4096.0f; - + // draw the texture on a quad useProgram(rasterShader->program); rasterShader->setMatrix(matrix); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 3f2de8591..7dcc9b24d 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -11,29 +11,29 @@ using namespace mbgl; void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { if (pass != RenderPass::Translucent) return; - + const RasterProperties &properties = layer_desc->getProperties(); - + if (layer_desc->layers) { - + if (!bucket.texture.getTexture()) { bucket.texture.bindFramebuffer(); - + preparePrerender(bucket); const int buffer = bucket.properties.buffer * 4096.0f; - + const mat4 preMatrix = [&]{ mat4 vtxMatrix; matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1); matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); return vtxMatrix; }(); - + // call updateTiles to get parsed data for sublayers map.updateTiles(); - + int i = 0; for (auto it = layer_desc->layers->layers.begin(), end = layer_desc->layers->layers.end(); it != end; ++it, --i) { setOpaque(); @@ -41,7 +41,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay setTranslucent(); map.renderLayer(*it, RenderPass::Translucent, &id, &preMatrix); } - + if (bucket.properties.blur > 0) { bucket.texture.blur(*this, bucket.properties.blur); } @@ -50,11 +50,11 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay glEnable(GL_DEPTH_TEST); glEnable(GL_STENCIL_TEST); - + glViewport(0, 0, gl_viewport[0], gl_viewport[1]); - + } - + renderPrerenderedTexture(bucket, matrix, properties); } @@ -69,7 +69,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay rasterShader->setOpacity(properties.opacity); glDepthRange(strata + strata_epsilon, 1.0f); - + bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); depthMask(true); diff --git a/src/renderer/prerendered_texture.cpp b/src/renderer/prerendered_texture.cpp index 6a21b133a..52f7edc50 100644 --- a/src/renderer/prerendered_texture.cpp +++ b/src/renderer/prerendered_texture.cpp @@ -44,7 +44,7 @@ void PrerenderedTexture::bindFramebuffer() { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, properties.size, properties.size, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); } - + if (fbo_depth_stencil == 0) { // Create depth/stencil buffer glGenRenderbuffers(1, &fbo_depth_stencil); diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 1aa3b54bb..67d3f81a0 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -532,7 +532,7 @@ void StyleParser::parseLayer(std::pair> &pair // 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()) { Log::Warning(Event::ParseStyle, "layer reference of '%s' is circular", layer->id.c_str()); @@ -907,10 +907,10 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr &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(); - + parseRenderProperty(value, render.size, "raster-size"); parseRenderProperty(value, render.blur, "raster-blur"); parseRenderProperty(value, render.buffer, "raster-buffer"); @@ -918,7 +918,7 @@ void StyleParser::parseRender(JSVal value, std::shared_ptr &layer) { render.prerendered = true; } } break; - + default: // There are no render properties for these layer types. break; diff --git a/src/util/raster.cpp b/src/util/raster.cpp index 03266e5b5..9a71573d0 100644 --- a/src/util/raster.cpp +++ b/src/util/raster.cpp @@ -80,14 +80,14 @@ void Raster::bind(const GLuint texture) { } else if (textured) { glBindTexture(GL_TEXTURE_2D, texture); } - + GLuint filter = GL_LINEAR; if (filter != this->filter) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); this->filter = filter; } - + } void Raster::beginFadeInTransition() { diff --git a/src/util/texturepool.cpp b/src/util/texturepool.cpp index 67685eeee..04511348e 100644 --- a/src/util/texturepool.cpp +++ b/src/util/texturepool.cpp @@ -25,7 +25,7 @@ GLuint Texturepool::getTextureID() { return id; } - + void Texturepool::removeTextureID(GLuint texture_id) { bool needs_clear = false; From 28d8c13c2c1852062857070c17bc211d26902ba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Tue, 12 Aug 2014 16:30:47 +0200 Subject: [PATCH 16/22] add outdoors style [skip ci] --- styles/outdoors/style.json | 2220 ++++++++++++++++++++++++++++++++++++ 1 file changed, 2220 insertions(+) create mode 100644 styles/outdoors/style.json diff --git a/styles/outdoors/style.json b/styles/outdoors/style.json new file mode 100644 index 000000000..9abf91786 --- /dev/null +++ b/styles/outdoors/style.json @@ -0,0 +1,2220 @@ +{ + "version": 4, + "sprite": "https://www.mapbox.com/mapbox-gl-styles/sprites/outdoors", + "glyphs": "https://mapbox.s3.amazonaws.com/gl-glyphs-256/{fontstack}/{range}.pbf", + "constants": { + "@land": "rgb(244,239,225)", + "@water": "#cdd", + "@water_dark": "#185869", + "@crop": "#eeeed4", + "@grass": "#e6e6cc", + "@scrub": "#dfe5c8", + "@wood": "#cee2bd", + "@snow": "#f4f8ff", + "@rock": "#ddd", + "@sand": "#ffd", + "@cemetery": "#edf4ed", + "@pitch": "#fff", + "@park": "#d4e4bc", + "@piste": "blue", + "@school": "#e8dfe0", + "@hospital": "#f8eee0", + "@builtup": "#f6faff", + "@case": "#fff", + "@motorway": "#cda0a0", + "@main": "#ddc0b9", + "@street": "#fff", + "@text": "#666", + "@text_stroke": "rgba(255,255,255,0.8)", + "@country_text": "#222", + "@marine_text": "#a0bdc0", + "@water_text": "#185869", + "@land_night": "#017293", + "@water_night": "#103", + "@water_dark_night": "#003366", + "@crop_night": "#178d96", + "@grass_night": "#23948a", + "@scrub_night": "#31a186", + "@wood_night": "#45b581", + "@park_night": "#51bd8b", + "@snow_night": "#5ad9fe", + "@rock_night": "#999", + "@sand_night": "#437162", + "@cemetery_night": "#218c96", + "@pitch_night": "rgba(255,255,255,0.2)", + "@school_night": "#01536a", + "@hospital_night": "#015e7a", + "@builtup_night": "#014b60", + "@admin_night": "#ffb680", + "@text_night": "#fff", + "@text_water_night": "#2a5b8a", + "@text_stroke_night": "#103", + "@text2_stroke_night": "rgba(1,69,89,0.8)", + "@case_night": "#015e7a", + "@street_case_night": "#015b76", + "@motorway_night": "#bbdde7", + "@main_night": "#64b2c9", + "@street_night": "#0186ac", + "@contour_night": "#ffff80", + "@river_canal_width": { + "stops": [[10, 0.5], [11, 1], [13, 2], [15, 3]] + }, + "@stream_width": { + "stops": [[12, 0.25], [13, 0.5], [15, 1.5], [17, 2]] + }, + "@motorway_width": { + "stops": [[4, 0], [5, 0.5], [7, 0.8], [9, 1], [10, 1.2], [11, 2], [12, 3], [13, 4], [14, 6], [15, 9], [16, 12], [17, 14]] + }, + "@motorway_casing_width": { + "stops": [[6.5, 0.6], [7, 0.8], [9, 2.8], [10, 3], [11, 4], [12, 5], [13, 6.5], [14, 9], [15, 12], [16, 15], [17, 17]] + }, + "@motorway_link_width": { + "stops": [[11, 1.2], [13, 2], [15, 3], [17, 4]] + }, + "@motorway_link_casing_width": { + "stops": [[11, 2.8], [13, 3.5], [15, 5], [17, 6]] + }, + "@main_width": { + "stops": [[4, 1], [11, 1], [12, 1.5], [13, 2], [14, 3], [15, 6], [16, 10], [17, 12]] + }, + "@main_casing_width": { + "stops": [[8, 2.9], [11, 2.9], [12, 3.5], [13, 4], [14, 5.5], [15, 9], [16, 12], [17, 14]] + }, + "@street_width": { + "stops": [[13.5, 0], [14, 1.5], [15, 3], [16, 8]] + }, + "@street_casing_width": { + "stops": [[12, 0.4], [13, 1], [14, 2.5], [15, 4], [16, 10]] + }, + "@street_casing_opacity": { + "stops": [[13, 0], [13.5, 1]] + }, + "@service_casing_width": { + "stops": [[13, 0.5], [14, 3], [15, 3.5], [16, 4], [17, 5], [18, 6]] + }, + "@runway_width": { + "stops": [[9, 1], [10, 2], [11, 3], [12, 5], [13, 7], [14, 11], [15, 15], [16, 19], [17, 23]] + }, + "@taxiway_width": { + "stops": [[9, 0.2], [11, 0.2], [12, 1], [13, 1.5], [14, 2], [15, 3], [16, 4], [17, 5]] + }, + "@aerialway_width": { + "stops": [[12.5, 0.8], [13, 1.4], [14, 1.6], [15, 2], [16, 2.4], [17, 3]] + }, + "@aerialway_casing_width": { + "stops": [[12.5, 2], [13, 2.5], [14, 3], [15, 3.5], [16, 4], [21, 5]] + }, + "@path_width": { + "stops": [[13, 1.2], [14, 1.5], [15, 1.8]] + }, + "@admin_l2_width": { + "stops": [[1, 0.5], [2, 0.7], [3, 0.7], [4, 0.8], [5, 1], [7, 2], [9, 3]] + }, + "@admin_l3_width": { + "stops": [[5, 0.6], [7, 1], [11, 2]] + }, + "@road_label_1_size": { + "stops": [[12, 11], [13, 12], [14, 13], [15, 14], [16, 16], [17, 18]] + }, + "@road_label_2_size": { + "stops": [[12, 11], [13, 12], [15, 14], [17, 16]] + }, + "@road_label_3_size": { + "stops": [[14, 10], [15, 12], [17, 14]] + }, + "@fence_width": { + "stops": [[16, 0.6], [18, 1]] + }, + "@hedge_width": { + "stops": [[15, 0.6], [16, 1.2], [18, 1.6]] + }, + "@barrier_line_land_width": { + "stops": [[13, 0.4], [14, 0.75], [15, 1.5], [16, 3], [17, 6], [18, 12], [19, 24], [20, 48]] + }, + "@country_label_size": { + "stops": [[0, 14], [11, 24]] + }, + "@poi_label_1-2_size": { + "stops": [[14, 10], [15, 11], [16, 12]] + }, + "@poi_label_3_size": { + "stops": [[15, 10], [16, 11]] + }, + "@hillshade_prerender": { + "stops": [[10, 0], [11, 1]] + }, + "@hillshade_prerender_size": { + "stops": [[10, 1056], [11, 512], [12, 256]] + } + }, + "sources": { + "mapbox": { + "type": "vector", + "url": "mapbox://mapbox.mapbox-terrain-v1,mapbox.mapbox-streets-v6-dev", + "maxZoom": 15 + } + }, + "layers": [{ + "id": "background", + "style": { + "background-color": "@land" + }, + "style.night": { + "background-color": "@land_night" + }, + "type": "background" + }, { + "id": "landcover_snow", + "source": "mapbox", + "source-layer": "landcover", + "filter": { "class": "snow" }, + "style": { + "fill-color": "@snow" + }, + "style.night": { + "fill-color": "@snow_night" + }, + "type": "fill" + }, { + "id": "landcover_crop", + "source": "mapbox", + "source-layer": "landcover", + "filter": { "class": "crop" }, + "style": { + "fill-color": "@crop" + }, + "style.night": { + "fill-color": "@crop_night" + }, + "type": "fill" + }, { + "id": "landcover_grass", + "source": "mapbox", + "source-layer": "landcover", + "filter": { "class": "grass" }, + "style": { + "fill-color": "@grass", + "fill-opacity": { + "stops": [[12, 1], [13, 0.8], [16, 0.2]] + } + }, + "style.night": { + "fill-color": "@grass_night", + "fill-opacity": { + "stops": [[12, 1], [13, 0.8], [16, 0.2]] + } + }, + "type": "fill" + }, { + "id": "landcover_scrub", + "source": "mapbox", + "source-layer": "landcover", + "filter": { "class": "scrub" }, + "style": { + "fill-color": "@scrub", + "fill-opacity": { + "stops": [[12, 1], [13, 0.8], [16, 0.2]] + } + }, + "style.night": { + "fill-color": "@scrub_night", + "fill-opacity": { + "stops": [[12, 1], [13, 0.8], [16, 0.2]] + } + }, + "type": "fill" + }, { + "id": "landcover_wood", + "source": "mapbox", + "source-layer": "landcover", + "filter": { "class": "wood" }, + "style": { + "fill-color": "@wood", + "fill-opacity": { + "stops": [[12, 1], [13, 0.8], [16, 0.2]] + } + }, + "style.night": { + "fill-color": "@wood_night", + "fill-opacity": { + "stops": [[12, 1], [13, 0.8], [16, 0.2]] + } + }, + "type": "fill" + }, { + "id": "landuse_wood", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "wood" }, + "style": { + "fill-color": "@wood" + }, + "style.night": { + "fill-color": "@wood_night", + "fill-opacity": 0.8 + }, + "type": "fill" + }, { + "id": "landuse_school", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "school" }, + "style": { + "fill-color": "@school" + }, + "style.night": { + "fill-color": "@school_night" + }, + "type": "fill" + }, { + "id": "landuse_sand", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "sand" }, + "style": { + "fill-color": "@sand" + }, + "style.night": { + "fill-color": "@sand_night", + "fill-opacity": 0.8 + }, + "type": "fill" + }, { + "id": "landuse_pitch", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "pitch" }, + "style": { + "fill-color": "rgba(255,255,255,0.5)", + "fill-outline-color": "@pitch" + }, + "style.night": { + "fill-color": "@pitch_night", + "fill-outline-color": "@pitch" + }, + "type": "fill" + }, { + "id": "landuse_park", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "park" }, + "style": { + "fill-color": "@park" + }, + "style.night": { + "fill-color": "@park_night" + }, + "type": "fill" + }, { + "id": "landuse_industrial", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "industrial" }, + "style": { + "fill-color": "rgba(246,250,255,0.5)" + }, + "style.night": { + "fill-color": "@builtup_night" + }, + "type": "fill" + }, { + "id": "landuse_scrub", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "scrub" }, + "style": { + "fill-color": "@scrub" + }, + "style.night": { + "fill-color": "@scrub_night", + "fill-opacity": 0.8 + }, + "type": "fill" + }, { + "id": "landuse_grass", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "grass" }, + "style": { + "fill-color": "@grass" + }, + "style.night": { + "fill-color": "@grass_night", + "fill-opacity": 0.8 + }, + "type": "fill" + }, { + "id": "landuse_crop", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "crop" }, + "style": { + "fill-color": "@crop" + }, + "style.night": { + "fill-color": "@crop_night", + "fill-opacity": 0.8 + }, + "type": "fill" + }, { + "id": "landuse_rock", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "rock" }, + "style": { + "fill-color": "@rock" + }, + "style.night": { + "fill-color": "@rock_night", + "fill-opacity": 0.8 + }, + "type": "fill" + }, { + "id": "landuse_snow", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "snow" }, + "style": { + "fill-color": "@snow" + }, + "style.night": { + "fill-color": "@snow_night", + "fill-opacity": 0.8 + }, + "type": "fill" + }, { + "id": "landuse_hospital", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "hospital" }, + "style": { + "fill-color": "@hospital" + }, + "style.night": { + "fill-color": "@hospital_night" + }, + "type": "fill" + }, { + "id": "landuse_cemetery", + "source": "mapbox", + "source-layer": "landuse", + "filter": { "class": "cemetery" }, + "style": { + "fill-color": "@cemetery" + }, + "style.night": { + "fill-color": "@cemetery_night" + }, + "type": "fill" + }, { + "id": "overlay_breakwater_pier", + "source": "mapbox", + "source-layer": "landuse_overlay", + "filter": { "class": ["breakwater", "pier"] }, + "style": { + "fill-color": "@land" + }, + "style.night": { + "fill-color": "@land_night" + }, + "type": "fill" + }, { + "id": "waterway_river_canal", + "source": "mapbox", + "source-layer": "waterway", + "filter": { "type": ["river", "canal"] }, + "render": { + "line-cap": "round" + }, + "style": { + "line-color": "#87abaf", + "line-width": "@river_canal_width" + }, + "style.night": { + "line-color": "rgb(10,20,71)", + "line-width": "@river_canal_width" + }, + "type": "line" + }, { + "id": "waterway_stream", + "source": "mapbox", + "source-layer": "waterway", + "filter": { "type": "stream" }, + "render": { + "line-cap": "round" + }, + "style": { + "line-color": "#87abaf", + "line-width": "@stream_width" + }, + "style.night": { + "line-color": "rgb(10,20,71)", + "line-width": "@stream_width" + }, + "type": "line" + }, { + "id": "hillshade_rasters", + "type": "raster", + "source": "mapbox", + "render": { + "raster-size": 512, + "raster-blur": 1 + }, + "style": { + "raster-opacity": 1 + }, + "layers": [ + { + "id": "hillshade_full_highlight", + "source": "mapbox", + "source-layer": "hillshade", + "filter": { "class": "full_highlight" }, + "style": { + "fill-color": "#fffff3", + "fill-antialias": false, + "fill-opacity": { + "stops": [[14, 0.3], [15, 0.3], [16, 0.2], [17, 0.2], [18, 0.1]] + } + }, + "style.night": { + "fill-color": "#fdfdad", + "fill-antialias": false, + "fill-opacity": { + "stops": [[13, 0.4], [14, 0.3], [16, 0.2], [17, 0.1], [18, 0.05]] + } + }, + "type": "fill" + }, { + "id": "hillshade_medium_highlight", + "source": "mapbox", + "source-layer": "hillshade", + "filter": { "class": "medium_highlight" }, + "style": { + "fill-color": "#ffd", + "fill-antialias": false, + "fill-opacity": { + "stops": [[14, 0.3], [15, 0.3], [16, 0.2], [17, 0.2], [18, 0.1]] + } + }, + "style.night": { + "fill-color": "#ffe1b7", + "fill-antialias": false, + "fill-opacity": { + "stops": [[14, 0.3], [16, 0.2], [17, 0.15], [18, 0.05]] + } + }, + "type": "fill" + }, { + "id": "hillshade_medium_shadow", + "source": "mapbox", + "source-layer": "hillshade", + "filter": { "class": "medium_shadow" }, + "style": { + "fill-color": "#206", + "fill-antialias": false, + "fill-opacity": { + "stops": [[14, 0.08], [15, 0.075], [16, 0.05], [17, 0.05], [18, 0.025]] + } + }, + "style.night": { + "fill-color": "#206", + "fill-antialias": false, + "fill-opacity": { + "stops": [[15, 0.3], [16, 0.2], [17, 0.1], [18, 0.05]] + } + }, + "type": "fill" + }, { + "id": "hillshade_full_shadow", + "source": "mapbox", + "source-layer": "hillshade", + "filter": { "class": "full_shadow" }, + "style": { + "fill-color": "#103", + "fill-antialias": false, + "fill-opacity": { + "stops": [[14, 0.08], [15, 0.075], [16, 0.05], [17, 0.05], [18, 0.025]] + } + }, + "style.night": { + "fill-color": "#103", + "fill-antialias": false, + "fill-opacity": { + "stops": [[15, 0.3], [16, 0.2], [17, 0.1], [18, 0.05]] + } + }, + "type": "fill" + } + ] + }, { + "id": "overlay_wetland", + "source": "mapbox", + "source-layer": "landuse_overlay", + "filter": { "class": ["wetland", "wetland_noveg"] }, + "style": { + "fill-color": "rgba(210,225,225,0.2)", + "fill-image": "wetland_noveg_64" + }, + "style.night": { + "fill-color": "rgba(210,225,225,0.2)", + "fill-image": "wetland_noveg_64" + }, + "type": "fill" + }, { + "id": "building_shadow", + "source": "mapbox", + "source-layer": "building", + "style": { + "fill-color": "#d5d1c6", + "fill-translate": [1, 1], + "fill-opacity": { + "stops": [[15.5, 0], [16, 1]] + }, + "fill-outline-color": "#d5d1c6" + }, + "style.night": { + "fill-color": "#026688", + "fill-translate": [1, 1], + "fill-opacity": { + "stops": [[15.5, 0], [16, 1]] + }, + "fill-outline-color": "#026688" + }, + "type": "fill" + }, { + "id": "building", + "ref": "building_shadow", + "style": { + "fill-color": "#ebe7db" + }, + "style.night": { + "fill-color": "#027797" + } + }, { + "id": "building_wall", + "ref": "building_shadow", + "style": { + "fill-color": "#ebe7db", + "fill-opacity": { + "stops": [[15.5, 0], [16, 0.7]] + }, + "fill-outline-color": "#d5d1c6" + }, + "style.night": { + "fill-color": "#027797", + "fill-opacity": { + "stops": [[15.5, 0], [16, 0.7]] + }, + "fill-outline-color": "#026688" + } + }, { + "id": "contour_line_loud", + "source": "mapbox", + "source-layer": "contour", + "filter": { "index": 5 }, + "render": { + "line-join": "round" + }, + "style": { + "line-color": "#008", + "line-width": 0.9, + "line-opacity": { + "stops": [[11, 0.05], [12, 0.11]] + } + }, + "style.night": { + "line-color": "@contour_night", + "line-width": 0.9, + "line-opacity": { + "stops": [[11, 0.1], [12, 0.2]] + } + }, + "type": "line" + }, { + "id": "contour_line_regular", + "source": "mapbox", + "source-layer": "contour", + "render": { + "line-join": "round" + }, + "style": { + "line-color": "#008", + "line-width": 0.5, + "line-opacity": { + "stops": [[11, 0.05], [12, 0.11]] + } + }, + "style.night": { + "line-color": "@contour_night", + "line-width": 0.5, + "line-opacity": { + "stops": [[11, 0.1], [12, 0.4]] + } + }, + "type": "line" + }, { + "id": "barrier_line_gate", + "source": "mapbox", + "source-layer": "barrier_line", + "filter": { "class": "gate" }, + "style": { + "line-width": 2.5, + "line-color": "#aab" + }, + "style.night": { + "line-width": 2.5, + "line-color": "#59596f" + }, + "type": "line" + }, { + "id": "barrier_line_fence", + "source": "mapbox", + "source-layer": "barrier_line", + "filter": { "class": "fence" }, + "style": { + "line-color": "#aeada3", + "line-width": "@fence_width" + }, + "style.night": { + "line-color": "#014b61", + "line-width": "@fence_width" + }, + "type": "line" + }, { + "id": "barrier_line_hedge", + "source": "mapbox", + "source-layer": "barrier_line", + "filter": { "class": "hedge" }, + "style": { + "line-color": "#8de99b", + "line-width": "@hedge_width" + }, + "style.night": { + "line-color": "#2e7a57", + "line-width": "@hedge_width" + }, + "type": "line" + }, { + "id": "barrier_line_land", + "source": "mapbox", + "source-layer": "barrier_line", + "filter": { "class": "land" }, + "style": { + "line-color": "@land", + "line-width": "@barrier_line_land_width" + }, + "style.night": { + "line-color": "@land_night", + "line-width": "@barrier_line_land_width" + }, + "type": "line" + }, { + "id": "barrier_line_land_fill", + "source": "mapbox", + "source-layer": "barrier_line", + "filter": { "class": "land" }, + "style": { + "fill-color": "@land" + }, + "style.night": { + "fill-color": "@land_night" + }, + "type": "fill" + }, { + "id": "barrier_line_cliff", + "source": "mapbox", + "source-layer": "barrier_line", + "filter": { "class": "cliff" }, + "style": { + "line-color": "#987", + "line-width": 4 + }, + "style.night": { + "line-color": "#63574b", + "line-width": 4 + }, + "type": "line" + }, { + "id": "water", + "source": "mapbox", + "source-layer": "water", + "style": { + "fill-color": "@water", + "fill-outline-color": "#a2bdc0" + }, + "style.night": { + "fill-color": "@water_night", + "fill-outline-color": "@water_dark_night" + }, + "type": "fill" + }, { + "id": "aeroway_fill", + "source": "mapbox", + "source-layer": "aeroway", + "style": { + "fill-color": "#ddd" + }, + "style.night": { + "fill-color": "#367" + }, + "type": "fill" + }, { + "id": "aeroway_runway", + "source": "mapbox", + "source-layer": "aeroway", + "filter": { "type": "runway" }, + "style": { + "line-color": "#ddd", + "line-width": "@runway_width" + }, + "style.night": { + "line-color": "#367", + "line-width": "@runway_width" + }, + "type": "line" + }, { + "id": "aeroway_taxiway", + "source": "mapbox", + "source-layer": "aeroway", + "filter": { "type": "taxiway" }, + "style": { + "line-color": "#ddd", + "line-width": "@taxiway_width" + }, + "style.night": { + "line-color": "#367", + "line-width": "@taxiway_width" + }, + "type": "line" + }, { + "id": "tunnel_motorway_link_casing", + "source": "mapbox", + "source-layer": "tunnel", + "filter": { "class": "motorway_link" }, + "style": { + "line-color": "@case", + "line-dasharray": [6, 6], + "line-width": "@motorway_link_casing_width" + }, + "style.night": { + "line-color": "@case_night", + "line-dasharray": [6, 6], + "line-width": "@motorway_link_casing_width" + }, + "type": "line" + }, { + "id": "tunnel_service_casing", + "source": "mapbox", + "source-layer": "tunnel", + "filter": { "class": "service" }, + "style": { + "line-color": "#000", + "line-opacity": 0.04, + "line-dasharray": [6, 6], + "line-width": "@service_casing_width" + }, + "style.night": { + "line-color": "#000", + "line-opacity": 0.04, + "line-dasharray": [6, 6], + "line-width": "@service_casing_width" + }, + "type": "line" + }, { + "id": "tunnel_main_casing", + "source": "mapbox", + "source-layer": "tunnel", + "filter": { "class": "main" }, + "style": { + "line-color": "@case", + "line-dasharray": [6, 6], + "line-width": "@main_casing_width", + "line-opacity": { + "stops": [[8, 0], [9, 1]] + } + }, + "style.night": { + "line-color": "@case_night", + "line-dasharray": [6, 6], + "line-width": "@main_casing_width", + "line-opacity": { + "stops": [[8, 0], [9, 1]] + } + }, + "type": "line" + }, { + "id": "tunnel_street_casing", + "source": "mapbox", + "source-layer": "tunnel", + "filter": { "class": ["street", "street_limited"] }, + "style": { + "line-color": "#d9d5c6", + "line-width": "@street_casing_width", + "line-opacity": "@street_casing_opacity" + }, + "style.night": { + "line-color": "@street_case_night", + "line-width": "@street_casing_width", + "line-opacity": "@street_casing_opacity" + }, + "type": "line" + }, { + "id": "tunnel_motorway_link", + "ref": "tunnel_motorway_link_casing", + "style": { + "line-color": "#e6cec7", + "line-width": "@motorway_link_width" + }, + "style.night": { + "line-color": "#78b0c1", + "line-width": "@motorway_link_width" + } + }, { + "id": "tunnel_service", + "ref": "tunnel_service_casing", + "style": { + "line-color": "#e6cec7", + "line-width": 2 + }, + "style.night": { + "line-color": "#017ca0", + "line-width": 2 + } + }, { + "id": "tunnel_street", + "ref": "tunnel_street_casing", + "style": { + "line-color": "#d9d5c6", + "line-width": "@street_width" + }, + "style.night": { + "line-color": "@street_night", + "line-width": "@street_width" + } + }, { + "id": "tunnel_main", + "ref": "tunnel_main_casing", + "style": { + "line-color": "#e6cec7", + "line-width": "@main_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + }, + "style.night": { + "line-color": "#78b0c1", + "line-width": "@main_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + } + }, { + "id": "tunnel_motorway_casing", + "source": "mapbox", + "source-layer": "tunnel", + "filter": { "class": "motorway" }, + "style": { + "line-color": "@case", + "line-dasharray": [6, 6], + "line-width": "@motorway_casing_width", + "line-opacity": { + "stops": [[8.5, 0], [9, 1]] + } + }, + "style.night": { + "line-color": "@case_night", + "line-dasharray": [6, 6], + "line-width": "@motorway_casing_width", + "line-opacity": { + "stops": [[8.5, 0], [9, 1]] + } + }, + "type": "line" + }, { + "id": "tunnel_motorway", + "ref": "tunnel_motorway_casing", + "style": { + "line-color": "#e6cec7", + "line-width": "@motorway_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + }, + "style.night": { + "line-color": "#78b0c1", + "line-width": "@motorway_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + } + }, { + "id": "road_path_case", + "source": "mapbox", + "source-layer": "road", + "filter": { "class": "path" }, + "style": { + "line-color": "#ffd", + "line-opacity": 0.4, + "line-width": { + "stops": [[14, 3], [15, 4]] + } + }, + "style.night": { + "line-color": "@land_night", + "line-opacity": 0.2 + }, + "type": "line" + }, { + "id": "road_path_footway", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "type": "footway" }, + "style": { + "line-color": "#bba", + "line-dasharray": [10, 4], + "line-width": "@path_width" + }, + "style.night": { + "line-color": "#fff", + "line-dasharray": [10, 4], + "line-width": "@path_width" + }, + "type": "line" + }, { + "id": "road_path_path", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "type": "path" }, + "style": { + "line-color": "#987", + "line-dasharray": [10, 4], + "line-opacity": 0.8, + "line-width": { + "stops": [[13, 0.8], [14, 0.9], [15, 1.2]] + } + }, + "style.night": { + "line-color": "#fff", + "line-dasharray": [10, 4], + "line-opacity": 0.8, + "line-width": { + "stops": [[13, 0.8], [14, 0.9], [15, 1.2]] + } + }, + "type": "line" + }, { + "id": "road_path_cycleway", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "type": "cycleway" }, + "style": { + "line-color": "#488", + "line-dasharray": [10, 4], + "line-width": "@path_width" + }, + "style.night": { + "line-color": "#94e6ff", + "line-dasharray": [10, 4], + "line-width": "@path_width" + }, + "type": "line" + }, { + "id": "road_path_mtb", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "type": "mtb" }, + "style": { + "line-color": "#488", + "line-dasharray": [12, 4], + "line-width": "@path_width" + }, + "style.night": { + "line-color": "#94e6ff", + "line-dasharray": [12, 4], + "line-width": "@path_width" + }, + "type": "line" + }, { + "id": "road_path_piste", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "type": "piste" }, + "style": { + "line-color": "#87b", + "line-dasharray": [8, 4], + "line-width": "@path_width" + }, + "style.night": { + "line-color": "#715dae", + "line-dasharray": [8, 4], + "line-width": "@path_width" + }, + "type": "line" + }, { + "id": "road_path_steps", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "type": "steps" }, + "style": { + "line-color": "#bba", + "line-dasharray": [10, 4], + "line-width": 4 + }, + "style.night": { + "line-color": "#016684", + "line-dasharray": [10, 4], + "line-opacity": 0.3, + "line-width": 6 + }, + "type": "line" + }, { + "id": "road_major_rail", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "class": "major_rail" }, + "style": { + "line-color": "#c8c4c0", + "line-width": 0.8 + }, + "style.night": { + "line-color": "#c8c4c0", + "line-width": 0.8 + }, + "type": "line" + }, { + "id": "road_major_rail_hatching", + "ref": "road_major_rail", + "style": { + "line-color": "#c8c4c0", + "line-dasharray": [2, 31], + "line-width": 5 + }, + "style.night": { + "line-color": "#c8c4c0", + "line-dasharray": [2, 31], + "line-width": 5 + } + }, { + "id": "road_motorway_link_casing", + "source": "mapbox", + "source-layer": "road", + "filter": { "class": "motorway_link" }, + "render": { + "line-join": "round", + "line-cap": "round" + }, + "style": { + "line-color": "@case", + "line-width": "@motorway_link_casing_width" + }, + "style.night": { + "line-color": "@case_night", + "line-width": "@motorway_link_casing_width" + }, + "type": "line" + }, { + "id": "road_service_casing", + "source": "mapbox", + "source-layer": "road", + "filter": { "class": "service" }, + "render": { + "line-join": "round", + "line-cap": "round" + }, + "style": { + "line-color": "#000", + "line-opacity": 0.04, + "line-width": "@service_casing_width" + }, + "style.night": { + "line-color": "#000", + "line-opacity": 0.04, + "line-width": "@service_casing_width" + }, + "type": "line" + }, { + "id": "road_main_casing", + "source": "mapbox", + "source-layer": "road", + "filter": { "class": "main" }, + "render": { + "line-join": "round", + "line-cap": "round" + }, + "style": { + "line-color": "@case", + "line-width": "@main_casing_width", + "line-opacity": { + "stops": [[8, 0], [9, 1]] + } + }, + "style.night": { + "line-color": "@case_night", + "line-width": "@main_casing_width", + "line-opacity": { + "stops": [[8, 0], [9, 1]] + } + }, + "type": "line" + }, { + "id": "road_street_casing", + "source": "mapbox", + "source-layer": "road", + "filter": { "class": ["street", "street_limited"] }, + "render": { + "line-join": "round", + "line-cap": "round" + }, + "style": { + "line-color": "#d9d5c6", + "line-width": "@street_casing_width", + "line-opacity": "@street_casing_opacity" + }, + "style.night": { + "line-color": "@street_case_night", + "line-width": "@street_casing_width", + "line-opacity": "@street_casing_opacity" + }, + "type": "line" + }, { + "id": "road_motorway_link", + "ref": "road_motorway_link_casing", + "style": { + "line-color": "@motorway", + "line-width": "@motorway_link_width" + }, + "style.night": { + "line-color": "@motorway_night", + "line-width": "@motorway_link_width" + } + }, { + "id": "road_service", + "ref": "road_service_casing", + "style": { + "line-color": "@street", + "line-width": 2 + }, + "style.night": { + "line-color": "@street_night", + "line-width": 2 + } + }, { + "id": "road_street", + "ref": "road_street_casing", + "style": { + "line-color": "@street", + "line-width": "@street_width" + }, + "style.night": { + "line-color": "@street_night", + "line-width": "@street_width" + } + }, { + "id": "road_main", + "ref": "road_main_casing", + "style": { + "line-color": "@main", + "line-width": "@main_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + }, + "style.night": { + "line-color": "@main_night", + "line-width": "@main_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + } + }, { + "id": "road_motorway_casing", + "source": "mapbox", + "source-layer": "road", + "filter": { "class": "motorway" }, + "render": { + "line-join": "round", + "line-cap": "round" + }, + "style": { + "line-color": "@case", + "line-width": "@motorway_casing_width", + "line-opacity": { + "stops": [[8.5, 0], [9, 1]] + } + }, + "style.night": { + "line-color": "@case_night", + "line-width": "@motorway_casing_width", + "line-opacity": { + "stops": [[8.5, 0], [9, 1]] + } + }, + "type": "line" + }, { + "id": "road_motorway", + "ref": "road_motorway_casing", + "style": { + "line-color": "@motorway", + "line-width": "@motorway_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + }, + "style.night": { + "line-color": "@motorway_night", + "line-width": "@motorway_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + } + }, { + "id": "bridge_motorway_link_casing", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "class": "motorway_link" }, + "style": { + "line-color": "@case", + "line-width": "@motorway_link_casing_width" + }, + "style.night": { + "line-color": "@case_night", + "line-width": "@motorway_link_casing_width" + }, + "type": "line" + }, { + "id": "bridge_service_casing", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "class": "service" }, + "style": { + "line-color": "#000", + "line-opacity": 0.04, + "line-width": "@service_casing_width" + }, + "style.night": { + "line-color": "#000", + "line-opacity": 0.04, + "line-width": "@service_casing_width" + }, + "type": "line" + }, { + "id": "bridge_main_casing", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "class": "main" }, + "style": { + "line-color": "@case", + "line-width": "@main_casing_width", + "line-opacity": { + "stops": [[8, 0], [9, 1]] + } + }, + "style.night": { + "line-color": "@case_night", + "line-width": "@main_casing_width", + "line-opacity": { + "stops": [[8, 0], [9, 1]] + } + }, + "type": "line" + }, { + "id": "bridge_street_casing", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "class": ["street", "street_limited"] }, + "style": { + "line-color": "#d9d5c6", + "line-width": "@street_casing_width", + "line-opacity": "@street_casing_opacity" + }, + "style.night": { + "line-color": "@street_case_night", + "line-width": "@street_casing_width", + "line-opacity": "@street_casing_opacity" + }, + "type": "line" + }, { + "id": "bridge_motorway_link", + "ref": "bridge_motorway_link_casing", + "style": { + "line-color": "@motorway", + "line-width": "@motorway_link_width" + }, + "style.night": { + "line-color": "@motorway_night", + "line-width": "@motorway_link_width" + } + }, { + "id": "bridge_service", + "ref": "bridge_service_casing", + "style": { + "line-color": "@street", + "line-width": 2 + }, + "style.night": { + "line-color": "@street_night", + "line-width": 2 + } + }, { + "id": "bridge_street", + "ref": "bridge_street_casing", + "style": { + "line-color": "@street", + "line-width": "@street_width" + }, + "style.night": { + "line-color": "@street_night", + "line-width": "@street_width" + } + }, { + "id": "bridge_main", + "ref": "bridge_main_casing", + "style": { + "line-color": "@main", + "line-width": "@main_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + }, + "style.night": { + "line-color": "@main_night", + "line-width": "@main_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + } + }, { + "id": "bridge_motorway_casing", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "class": "motorway" }, + "style": { + "line-color": "@case", + "line-width": "@motorway_casing_width", + "line-opacity": { + "stops": [[8.5, 0], [9, 1]] + } + }, + "style.night": { + "line-color": "@case_night", + "line-width": "@motorway_casing_width", + "line-opacity": { + "stops": [[8.5, 0], [9, 1]] + } + }, + "type": "line" + }, { + "id": "bridge_motorway", + "ref": "bridge_motorway_casing", + "style": { + "line-color": "@motorway", + "line-width": "@motorway_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + }, + "style.night": { + "line-color": "@motorway_night", + "line-width": "@motorway_width", + "line-opacity": { + "stops": [[5.5, 0], [6, 1]] + } + } + }, { + "id": "bridge_aerialway_casing", + "source": "mapbox", + "source-layer": "bridge", + "filter": { "class": "aerialway" }, + "style": { + "line-color": "white", + "line-opacity": 0.5, + "line-width": "@aerialway_casing_width" + }, + "style.night": { + "line-color": "white", + "line-opacity": 0.5, + "line-width": "@aerialway_casing_width" + }, + "type": "line" + }, { + "id": "bridge_aerialway", + "ref": "bridge_aerialway_casing", + "style": { + "line-color": "#876", + "line-opacity": 0.5, + "line-width": "@aerialway_width" + }, + "style.night": { + "line-color": "#876", + "line-opacity": 0.5, + "line-width": "@aerialway_width" + } + }, { + "id": "admin_l3", + "source": "mapbox", + "source-layer": "admin", + "filter": { "admin_level": [3, 4, 5] }, + "render": { + "line-join": "round" + }, + "style": { + "line-color": "#88a", + "line-dasharray": [60, 20], + "line-opacity": { + "stops": [[3, 0], [5, 1]] + }, + "line-width": "@admin_l3_width" + }, + "style.night": { + "line-color": "@admin_night", + "line-dasharray": [60, 20], + "line-opacity": { + "stops": [[3, 0], [5, 1]] + }, + "line-width": "@admin_l3_width" + }, + "type": "line" + }, { + "id": "admin_l2", + "source": "mapbox", + "source-layer": "admin", + "filter": { "admin_level": 2 }, + "render": { + "line-join": "round", + "line-cap": "round" + }, + "style": { + "line-color": "#88a", + "line-width": "@admin_l2_width" + }, + "style.night": { + "line-color": "@admin_night", + "line-width": "@admin_l2_width" + }, + "type": "line" + }, { + "id": "admin_maritime_cover", + "source": "mapbox", + "source-layer": "admin", + "filter": { "maritime": 1 }, + "render": { + "line-join": "round", + "line-cap": "round" + }, + "style": { + "line-color": "@water", + "line-width": 5 + }, + "style.night": { + "line-color": "@water_night", + "line-width": 5 + }, + "type": "line" + }, { + "id": "admin_maritime", + "ref": "admin_maritime_cover", + "style": { + "line-color": "#c0d6d6", + "line-width": { + "stops": [[5, 1], [7, 2], [11, 3]] + } + }, + "style.night": { + "line-color": "#0a1347", + "line-width": { + "stops": [[5, 1], [7, 2], [11, 3]] + } + } + }, { + "id": "country_label_line", + "source": "mapbox", + "source-layer": "country_label_line", + "render": { + "text-max-width": 5 + }, + "style": { + "line-color": "@country_text", + "line-width": 0.5, + "line-opacity": 0.5 + }, + "style.night": { + "line-color": "@text_night", + "line-width": 0.5, + "line-opacity": 0.5 + }, + "type": "line" + }, { + "id": "country_label", + "source": "mapbox", + "source-layer": "country_label", + "filter": { "$type": "Point" }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold, Arial Unicode MS Bold", + "text-max-size": 24, + "text-max-width": 5 + }, + "style": { + "text-color": "@country_text", + "text-halo-color": "rgba(255,255,255,0.5)", + "text-halo-width": { + "stops": [[0, 1.17], [11, 2]] + }, + "text-size": "@country_label_size" + }, + "style.night": { + "text-color": "@text_night", + "text-halo-color": "@text2_stroke_night", + "text-halo-width": { + "stops": [[0, 1.63], [11, 2.8]] + }, + "text-size": "@country_label_size" + }, + "type": "symbol" + }, { + "id": "marine_label_line_1", + "source": "mapbox", + "source-layer": "marine_label", + "filter": { "$type": "LineString", "labelrank": 1 }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 30, + "text-max-angle": 28.65, + "text-letter-spacing": 0.4, + "symbol-placement": "line" + }, + "style": { + "text-color": "@marine_text", + "text-size": { + "stops": [[2, 20], [3, 25], [4, 30], [21, 30]] + }, + "text-halo-color": "@water" + }, + "style.night": { + "text-color": "@water_dark_night", + "text-size": { + "stops": [[2, 20], [3, 25], [4, 30], [21, 30]] + }, + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "marine_label_line_2", + "source": "mapbox", + "source-layer": "marine_label", + "filter": { "$type": "LineString", "labelrank": 2 }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 24, + "text-max-angle": 28.65, + "symbol-placement": "line" + }, + "style": { + "text-color": "@marine_text", + "text-size": { + "stops": [[2, 13], [3, 14], [4, 20], [5, 24], [21, 24]] + }, + "text-halo-color": "@water" + }, + "style.night": { + "text-color": "@water_dark_night", + "text-size": { + "stops": [[2, 13], [3, 14], [4, 20], [5, 24], [21, 24]] + }, + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "marine_label_line_3", + "source": "mapbox", + "source-layer": "marine_label", + "filter": { "$type": "LineString", "labelrank": 3 }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 18, + "text-max-angle": 28.65, + "symbol-placement": "line" + }, + "style": { + "text-color": "@marine_text", + "text-size": { + "stops": [[2, 12], [3, 13], [4, 15], [5, 18], [21, 18]] + }, + "text-halo-color": "@water" + }, + "style.night": { + "text-color": "@water_dark_night", + "text-size": { + "stops": [[2, 12], [3, 13], [4, 15], [5, 18], [21, 18]] + }, + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "marine_label_line_other", + "source": "mapbox", + "source-layer": "marine_label", + "filter": { "$type": "LineString", "labelrank": [4, 5, 6] }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 16, + "text-max-angle": 28.65, + "symbol-placement": "line" + }, + "style": { + "text-color": "@marine_text", + "text-size": { + "stops": [[3, 12], [4, 14], [5, 16], [21, 16]] + }, + "text-halo-color": "@water" + }, + "style.night": { + "text-color": "@water_dark_night", + "text-size": { + "stops": [[3, 12], [4, 14], [5, 16], [21, 16]] + }, + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "marine_label_point_1", + "source": "mapbox", + "source-layer": "marine_label", + "filter": { "$type": "Point", "labelrank": 1 }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 30, + "text-max-width": 8, + "text-letter-spacing": 0.4, + "text-line-height": 2 + }, + "style": { + "text-color": "@marine_text", + "text-size": { + "stops": [[2, 20], [3, 25], [4, 30], [21, 30]] + }, + "text-halo-color": "@water" + }, + "style.night": { + "text-color": "@water_dark_night", + "text-size": { + "stops": [[2, 20], [3, 25], [4, 30], [21, 30]] + }, + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "marine_label_point_2", + "source": "mapbox", + "source-layer": "marine_label", + "filter": { "$type": "Point", "labelrank": 2 }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 24, + "text-max-width": 8, + "text-letter-spacing": 0.2, + "text-line-height": 1.5 + }, + "style": { + "text-color": "@marine_text", + "text-size": { + "stops": [[2, 13], [3, 14], [4, 20], [5, 24], [21, 24]] + }, + "text-halo-color": "@water" + }, + "style.night": { + "text-color": "@water_dark_night", + "text-size": { + "stops": [[2, 13], [3, 14], [4, 20], [5, 24], [21, 24]] + }, + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "marine_label_point_3", + "source": "mapbox", + "source-layer": "marine_label", + "filter": { "$type": "Point", "labelrank": 3 }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 18, + "text-max-width": 8, + "text-letter-spacing": 0.1, + "text-line-height": 1.3 + }, + "style": { + "text-color": "@marine_text", + "text-size": { + "stops": [[2, 12], [3, 13], [4, 15], [5, 18], [21, 18]] + }, + "text-halo-color": "@water" + }, + "style.night": { + "text-color": "@water_dark_night", + "text-size": { + "stops": [[2, 12], [3, 13], [4, 15], [5, 18], [21, 18]] + }, + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "marine_label_point_other", + "source": "mapbox", + "source-layer": "marine_label", + "filter": { "$type": "Point", "labelrank": [4, 5, 6] }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 16, + "text-max-width": 8, + "text-letter-spacing": 0.1, + "text-line-height": 1.2 + }, + "style": { + "text-color": "@marine_text", + "text-size": { + "stops": [[3, 12], [4, 14], [5, 16], [21, 16]] + }, + "text-halo-color": "@water" + }, + "style.night": { + "text-color": "@water_dark_night", + "text-size": { + "stops": [[3, 12], [4, 14], [5, 16], [21, 16]] + }, + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "state_label", + "source": "mapbox", + "source-layer": "state_label", + "filter": { "$type": "Point" }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Regular, Arial Unicode MS Regular", + "text-max-size": 16, + "text-max-width": 8 + }, + "style": { + "text-color": "#333", + "text-halo-width": { + "stops": [[2.99, 0], [3, 1.17], [8.99, 1.87], [9, 0]] + }, + "text-halo-color": "rgba(244,239,225,0.8)", + "text-size": { + "stops": [[2.99, 0], [3, 10], [8.99, 16], [9, 0]] + } + }, + "style.night": { + "text-color": "#fff", + "text-halo-width": { + "stops": [[2.99, 0], [3, 1.17], [8.99, 1.87], [9, 0]] + }, + "text-halo-color": "@land_night", + "text-size": { + "stops": [[2.99, 0], [3, 10], [8.99, 16], [9, 0]] + } + }, + "type": "symbol" + }, { + "id": "place_label_city", + "source": "mapbox", + "source-layer": "place_label", + "filter": { "type": "city", "$type": "Point" }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold, Arial Unicode MS Bold", + "text-max-size": 20, + "text-max-width": 8 + }, + "style": { + "text-color": "#444", + "text-halo-width": { + "stops": [[2.99, 0], [3, 1.17], [6, 1.63], [13.99, 2.33], [14, 0]] + }, + "text-halo-color": "@text_stroke", + "text-size": { + "stops": [[2.99, 0], [3, 10], [6, 14], [13.99, 20], [14, 0]] + } + }, + "style.night": { + "text-color": "#fff", + "text-halo-width": { + "stops": [[2.99, 0], [3, 1.17], [6, 1.63], [13.99, 2.33], [14, 0]] + }, + "text-halo-color": "@text2_stroke_night", + "text-size": { + "stops": [[2.99, 0], [3, 10], [6, 14], [13.99, 20], [14, 0]] + } + }, + "type": "symbol" + }, { + "id": "place_label_town", + "source": "mapbox", + "source-layer": "place_label", + "filter": { "type": "town", "$type": "Point" }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold, Arial Unicode MS Bold", + "text-max-size": 24, + "text-max-width": 8 + }, + "style": { + "text-color": "#716656", + "text-halo-width": { + "stops": [[8, 1.5], [11, 1.95], [13, 2.55], [15, 3.3]] + }, + "text-halo-color": "@text_stroke", + "text-size": { + "stops": [[8, 10], [11, 13], [13, 17], [15, 22]] + } + }, + "style.night": { + "text-color": "@text_night", + "text-halo-width": { + "stops": [[8, 1.5], [11, 1.95], [13, 2.55], [15, 3.3]] + }, + "text-halo-color": "@text2_stroke_night", + "text-size": { + "stops": [[8, 10], [11, 13], [13, 17], [15, 22]] + } + }, + "type": "symbol" + }, { + "id": "place_label_village", + "source": "mapbox", + "source-layer": "place_label", + "filter": { "type": "village", "$type": "Point" }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold, Arial Unicode MS Bold", + "text-max-size": 22, + "text-max-width": 8 + }, + "style": { + "text-color": "#635644", + "text-halo-width": { + "stops": [[8, 1.2], [11, 1.5], [13, 2.1], [15, 2.4], [16, 3]] + }, + "text-halo-color": "@text_stroke", + "text-size": { + "stops": [[8, 8], [11, 10], [13, 14], [15, 16], [16, 20]] + } + }, + "style.night": { + "text-color": "@text_night", + "text-halo-width": { + "stops": [[8, 1.2], [11, 1.5], [13, 2.1], [15, 2.4], [16, 3]] + }, + "text-halo-color": "@text2_stroke_night", + "text-size": { + "stops": [[8, 8], [11, 10], [13, 14], [15, 16], [16, 20]] + } + }, + "type": "symbol" + }, { + "id": "place_label_other", + "source": "mapbox", + "source-layer": "place_label", + "filter": { "type": ["hamlet", "suburb", "neighbourhood"], "$type": "Point" }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold, Arial Unicode MS Bold", + "text-max-size": 18, + "text-max-width": 6 + }, + "style": { + "text-color": "#7d6c55", + "text-halo-color": "@text_stroke", + "text-size": { + "stops": [[12, 11], [13, 12], [15, 14], [17, 18]] + } + }, + "style.night": { + "text-color": "@text_night", + "text-halo-color": "@text2_stroke_night", + "text-halo-width": { + "stops": [[12, 1.65], [13, 1.8], [15, 2.1], [17, 2.7]] + }, + "text-size": { + "stops": [[12, 11], [13, 12], [15, 14], [17, 18]] + } + }, + "type": "symbol" + }, { + "id": "road_label_1", + "source": "mapbox", + "source-layer": "road_label", + "filter": { "class": ["motorway", "main"], "$type": "LineString" }, + "render": { + "text-field": "{name_en}", + "text-padding": 2, + "text-font": "Open Sans Regular, Arial Unicode MS Regular", + "text-max-size": 18, + "text-max-angle": 28.65, + "symbol-placement": "line" + }, + "style": { + "text-color": "#585042", + "text-halo-color": "@land", + "text-halo-width": { + "stops": [[12, 0.55], [13, 0.6], [14, 0.65], [15, 0.7], [16, 0.8], [17, 0.9]] + }, + "text-size": "@road_label_1_size" + }, + "style.night": { + "text-color": "@text_night", + "text-halo-color": "@text2_stroke_night", + "text-halo-width": { + "stops": [[12, 0.92], [13, 1], [14, 1.08], [15, 1.17], [16, 1.33], [17, 1.5]] + }, + "text-size": "@road_label_1_size" + }, + "type": "symbol" + }, { + "id": "road_label_2", + "source": "mapbox", + "source-layer": "road_label", + "filter": { "class": ["street", "street_limited"], "$type": "LineString" }, + "render": { + "text-field": "{name_en}", + "text-padding": 2, + "text-font": "Open Sans Regular, Arial Unicode MS Regular", + "text-max-size": 16, + "text-max-angle": 28.65, + "symbol-placement": "line" + }, + "style": { + "text-color": "#585042", + "text-halo-color": "@land", + "text-halo-width": { + "stops": [[12, 0.55], [13, 0.6], [15, 0.7], [17, 0.8]] + }, + "text-size": "@road_label_2_size" + }, + "style.night": { + "text-color": "@text_night", + "text-halo-color": "@text2_stroke_night", + "text-halo-width": { + "stops": [[12, 0.92], [13, 1], [15, 1.17], [17, 1.33]] + }, + "text-size": "@road_label_2_size" + }, + "type": "symbol" + }, { + "id": "road_label_3", + "source": "mapbox", + "source-layer": "road_label", + "filter": { "class": ["service", "driveway", "path"], "$type": "LineString" }, + "render": { + "text-field": "{name_en}", + "text-padding": 2, + "text-font": "Open Sans Regular, Arial Unicode MS Regular", + "text-max-size": 14, + "text-max-angle": 28.65, + "symbol-placement": "line" + }, + "style": { + "text-color": "#585042", + "text-halo-color": "@land", + "text-halo-width": { + "stops": [[14, 0.5], [15, 0.6], [17, 0.7]] + }, + "text-size": "@road_label_3_size" + }, + "style.night": { + "text-color": "@text_night", + "text-halo-color": "@text2_stroke_night", + "text-halo-width": { + "stops": [[14, 0.83], [15, 1], [17, 1.17]] + }, + "text-size": "@road_label_3_size" + }, + "type": "symbol" + }, { + "id": "contour_label", + "source": "mapbox", + "source-layer": "contour", + "filter": { "index": [5, 10], "$type": "LineString" }, + "render": { + "text-field": "{ele} m", + "text-font": "Open Sans Regular, Arial Unicode MS Regular", + "text-max-size": 10, + "text-max-angle": 28.65, + "symbol-placement": "line" + }, + "style": { + "text-color": "@text", + "text-halo-color": "@land", + "text-halo-width": 1.5, + "text-size": 10 + }, + "style.night": { + "text-color": "@contour_night", + "text-halo-color": "@land_night", + "text-halo-width": 1.5, + "text-size": 10 + }, + "type": "symbol" + }, { + "id": "water_label", + "source": "mapbox", + "source-layer": "water_label", + "filter": { "$type": "Point" }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 12, + "text-max-width": 8 + }, + "style": { + "text-color": "@water_dark", + "text-halo-color": "rgba(255,255,255,0.75)" + }, + "style.night": { + "text-color": "@text_water_night", + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "waterway_label", + "source": "mapbox", + "source-layer": "waterway_label", + "filter": { "$type": "LineString" }, + "render": { + "text-field": "{name_en}", + "text-font": "Open Sans Semibold Italic, Arial Unicode MS Bold", + "text-max-size": 12, + "text-max-angle": 28.65, + "symbol-placement": "line" + }, + "style": { + "text-color": "@water_dark", + "text-halo-width": 1.4, + "text-halo-color": "@text_stroke" + }, + "style.night": { + "text-color": "@text_water_night", + "text-halo-color": "@water_night" + }, + "type": "symbol" + }, { + "id": "poi_label_1-2", + "source": "mapbox", + "source-layer": "poi_label", + "filter": { "scalerank": [1, 2], "$type": "Point" }, + "render": { + "icon-image": "{maki}-12", + "text-field": "{name_en}", + "text-padding": 2, + "text-font": "Open Sans Semibold, Arial Unicode MS Bold", + "text-max-size": 12, + "text-max-width": 10, + "text-offset": [0, 0.6], + "text-vertical-align": "top" + }, + "style": { + "text-color": "#444", + "text-size": "@poi_label_1-2_size", + "text-halo-color": "@land", + "text-halo-width": { + "stops": [[14, 1.5], [15, 1.65], [16, 1.8]] + } + }, + "style.night": { + "text-color": "#fff", + "text-size": "@poi_label_1-2_size", + "text-halo-color": "@text2_stroke_night", + "text-halo-width": { + "stops": [[14, 1.5], [15, 1.65], [16, 1.8]] + } + }, + "type": "symbol" + }, { + "id": "poi_label_3", + "source": "mapbox", + "source-layer": "poi_label", + "filter": { "scalerank": 3, "$type": "Point" }, + "render": { + "icon-image": "{maki}-12", + "text-field": "{name_en}", + "text-padding": 2, + "text-font": "Open Sans Semibold, Arial Unicode MS Bold", + "text-max-size": 11, + "text-max-width": 10, + "text-offset": [0, 0.6], + "text-vertical-align": "top" + }, + "style": { + "icon-opacity": { + "stops": [[15.5, 0], [15.75, 1]] + }, + "text-color": "#444", + "text-size": "@poi_label_3_size", + "text-halo-color": "@land", + "text-halo-width": { + "stops": [[15, 1.5], [16, 1.65]] + }, + "text-opacity": { + "stops": [[15.5, 0], [15.75, 1]] + } + }, + "style.night": { + "text-color": "#fff", + "text-size": "@poi_label_3_size", + "text-halo-color": "@text2_stroke_night", + "text-halo-width": { + "stops": [[15, 1.5], [16, 1.65]] + }, + "text-opacity": { + "stops": [[15.5, 0], [15.75, 1]] + } + }, + "type": "symbol" + }, { + "id": "poi_label_4", + "source": "mapbox", + "source-layer": "poi_label", + "filter": { "scalerank": 4, "$type": "Point" }, + "render": { + "icon-image": "{maki}-12", + "text-field": "{name_en}", + "text-padding": 2, + "text-font": "Open Sans Semibold, Arial Unicode MS Bold", + "text-max-size": 10, + "text-max-width": 10, + "text-offset": [0, 0.6], + "text-vertical-align": "top" + }, + "style": { + "icon-opacity": { + "stops": [[17.5, 0], [17.75, 1]] + }, + "text-color": "#444", + "text-size": 10, + "text-opacity": { + "stops": [[17.5, 0], [17.75, 1]] + }, + "text-halo-color": "@land", + "text-halo-width": 1.5 + }, + "style.night": { + "text-color": "#fff", + "text-size": 10, + "text-opacity": { + "stops": [[17.5, 0], [17.75, 1]] + }, + "text-halo-color": "@text2_stroke_night", + "text-halo-width": 1.5 + }, + "type": "symbol" + }] +} \ No newline at end of file From 0d2724dec4284d8e75182d549c68f6a8cdd483df Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Tue, 12 Aug 2014 18:27:35 -0700 Subject: [PATCH 17/22] Raster styling all functional except brightness -- need to rework parsing --- include/mbgl/renderer/painter.hpp | 1 + include/mbgl/shader/raster_shader.hpp | 20 ++++++++++++ src/renderer/painter_prerender.cpp | 4 +++ src/renderer/painter_raster.cpp | 20 ++++++++++++ src/shader/raster.fragment.glsl | 30 ++++++++++++++++- src/shader/raster_shader.cpp | 47 +++++++++++++++++++++++++++ 6 files changed, 121 insertions(+), 1 deletion(-) diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index db85d8703..26e1bd395 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -88,6 +88,7 @@ public: void renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); void renderSymbol(SymbolBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); void renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix); + std::array spinWeights(float spin_value); void preparePrerender(RasterBucket &bucket); diff --git a/include/mbgl/shader/raster_shader.hpp b/include/mbgl/shader/raster_shader.hpp index ec69fa723..e27f2b4f2 100644 --- a/include/mbgl/shader/raster_shader.hpp +++ b/include/mbgl/shader/raster_shader.hpp @@ -14,6 +14,10 @@ public: void setImage(int32_t image); void setOpacity(float opacity); void setBuffer(float buffer); + void setBrightness(float brightness_low, float brightness_high); + void setSaturation(float saturation_factor); + void setContrast(float contrast_factor); + void setSpin(std::array spin_weights); private: int32_t a_pos = -1; @@ -26,6 +30,22 @@ private: float buffer = 0; int32_t u_buffer = -1; + + float brightness_low = 0; + int32_t u_brightness_low = -1; + + float brightness_high = 1; + int32_t u_brightness_high = -1; + + float saturation_factor = 0; + int32_t u_saturation_factor = -1; + + float contrast_factor = 1; + int32_t u_contrast_factor = -1; + + std::array spin_weights = {{}}; + int32_t u_spin_weights = -1; + }; } diff --git a/src/renderer/painter_prerender.cpp b/src/renderer/painter_prerender.cpp index f17014b62..1a5433692 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -34,6 +34,10 @@ void Painter::renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, rasterShader->setImage(0); rasterShader->setBuffer(buffer); rasterShader->setOpacity(properties.opacity); + rasterShader->setBrightness(properties.brightness[0], properties.brightness[1]); + rasterShader->setSaturation(properties.saturation); + rasterShader->setContrast(properties.contrast); + rasterShader->setSpin(spinWeights(properties.hue_rotate)); bucket.texture.bindTexture(); coveringRasterArray.bind(*rasterShader, tileStencilBuffer, BUFFER_OFFSET(0)); glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index()); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 7dcc9b24d..82e604e28 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -7,6 +7,8 @@ #include #include +#include + using namespace mbgl; void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { @@ -63,10 +65,16 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay if (bucket.hasData()) { depthMask(false); +// const Tile::ID parent_id = id.parent(id.z); + useProgram(rasterShader->program); rasterShader->setMatrix(matrix); rasterShader->setBuffer(0); rasterShader->setOpacity(properties.opacity); + rasterShader->setBrightness(properties.brightness[0], properties.brightness[1]); + rasterShader->setSaturation(properties.saturation); + rasterShader->setContrast(properties.contrast); + rasterShader->setSpin(spinWeights(properties.hue_rotate)); glDepthRange(strata + strata_epsilon, 1.0f); @@ -76,3 +84,15 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay } } + +std::array Painter::spinWeights(float spin) { + spin *= M_PI / 180; + float s = sin(spin); + float c = cos(spin); + std::array spin_weights = {{ + (2 * c + 1) / 3, + (-sqrtf(3.0) * s - c + 1) / 3, + (sqrtf(3.0) * s - c + 1) / 3 + }}; + return spin_weights; +} \ No newline at end of file diff --git a/src/shader/raster.fragment.glsl b/src/shader/raster.fragment.glsl index feb0a58f0..d56a5b590 100644 --- a/src/shader/raster.fragment.glsl +++ b/src/shader/raster.fragment.glsl @@ -3,6 +3,34 @@ uniform float u_opacity; varying vec2 v_pos; +uniform float u_brightness_low; +uniform float u_brightness_high; + +uniform float u_saturation_factor; +uniform float u_contrast_factor; +uniform vec3 u_spin_weights; + void main() { - gl_FragColor = texture2D(u_image, v_pos) * u_opacity; + + vec4 color = texture2D(u_image, v_pos) * u_opacity; + vec3 rgb = color.rgb; + + // spin + rgb = vec3( + dot(rgb, u_spin_weights.xyz), + dot(rgb, u_spin_weights.zxy), + dot(rgb, u_spin_weights.yzx)); + + // saturation + float average = (color.r + color.g + color.b) / 3.0; + rgb += (average - rgb) * u_saturation_factor; + + // contrast + rgb = (rgb - 0.5) * u_contrast_factor + 0.5; + + // brightness + vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low); + vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high); + + gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb), color.a); } diff --git a/src/shader/raster_shader.cpp b/src/shader/raster_shader.cpp index 1a21a2edc..6531bad1a 100644 --- a/src/shader/raster_shader.cpp +++ b/src/shader/raster_shader.cpp @@ -24,6 +24,11 @@ RasterShader::RasterShader() u_image = glGetUniformLocation(program, "u_image"); u_opacity = glGetUniformLocation(program, "u_opacity"); u_buffer = glGetUniformLocation(program, "u_buffer"); + u_brightness_low = glGetUniformLocation(program, "u_brightness_low"); + u_brightness_high = glGetUniformLocation(program, "u_brightness_high"); + u_saturation_factor = glGetUniformLocation(program, "u_saturation_factor"); + u_contrast_factor = glGetUniformLocation(program, "u_contrast_factor"); + u_spin_weights = glGetUniformLocation(program, "u_spin_weights"); // fprintf(stderr, "RasterShader:\n"); // fprintf(stderr, " - u_matrix: %d\n", u_matrix); @@ -57,3 +62,45 @@ void RasterShader::setBuffer(float new_buffer) { buffer = new_buffer; } } + +void RasterShader::setBrightness(float new_brightness_low, float new_brightness_high) { + if (brightness_low != new_brightness_low) { + glUniform1f(u_brightness_low, new_brightness_low); + brightness_low = new_brightness_low; + } + if (brightness_high!= new_brightness_high) { + glUniform1f(u_brightness_high, new_brightness_high); + brightness_high = new_brightness_high; + } +} + +void RasterShader::setSaturation(float new_saturation_factor) { + if (saturation_factor != new_saturation_factor) { + if (new_saturation_factor > 0) { + new_saturation_factor = 1 - 1 / (1.001 - new_saturation_factor); + } else { + new_saturation_factor = -new_saturation_factor; + } + glUniform1f(u_saturation_factor, new_saturation_factor); + saturation_factor = new_saturation_factor; + } +} + +void RasterShader::setContrast(float new_contrast_factor) { + if (contrast_factor != new_contrast_factor) { + if (new_contrast_factor > 0) { + new_contrast_factor = 1 / (1 - new_contrast_factor); + } else { + new_contrast_factor = 1 + new_contrast_factor; + } + glUniform1f(u_contrast_factor, new_contrast_factor); + contrast_factor = new_contrast_factor; + } +} + +void RasterShader::setSpin(std::array new_spin_weights) { + if (spin_weights != new_spin_weights) { + glUniform3fv(u_spin_weights, 1, new_spin_weights.data()); + spin_weights = new_spin_weights; + } +} \ No newline at end of file From adb04662f99f59b3ad78e46a70eb11621f828ffd Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Tue, 12 Aug 2014 18:56:42 -0700 Subject: [PATCH 18/22] parsing brightness correctly --- include/mbgl/shader/raster_shader.hpp | 2 +- include/mbgl/style/property_key.hpp | 1 + src/style/style_parser.cpp | 7 ++----- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/include/mbgl/shader/raster_shader.hpp b/include/mbgl/shader/raster_shader.hpp index e27f2b4f2..11765413f 100644 --- a/include/mbgl/shader/raster_shader.hpp +++ b/include/mbgl/shader/raster_shader.hpp @@ -34,7 +34,7 @@ private: float brightness_low = 0; int32_t u_brightness_low = -1; - float brightness_high = 1; + float brightness_high = 0; int32_t u_brightness_high = -1; float saturation_factor = 0; diff --git a/include/mbgl/style/property_key.hpp b/include/mbgl/style/property_key.hpp index 7d2498176..aee5db038 100644 --- a/include/mbgl/style/property_key.hpp +++ b/include/mbgl/style/property_key.hpp @@ -55,6 +55,7 @@ enum class PropertyKey { RasterOpacity, RasterHueRotate, + RasterBrightness, // for transitions only RasterBrightnessLow, RasterBrightnessHigh, RasterSaturation, diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 67d3f81a0..43790e21b 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -631,15 +631,12 @@ void StyleParser::parseStyle(JSVal value, ClassProperties &klass) { parseOptionalProperty>("composite-opacity", Key::CompositeOpacity, klass, value); parseOptionalProperty("transition-composite-opacity", Key::CompositeOpacity, klass, value); -// TODO edit these?: parseOptionalProperty>("raster-opacity", Key::RasterOpacity, klass, value); parseOptionalProperty("transition-raster-opacity", Key::RasterOpacity, klass, value); parseOptionalProperty>("raster-hue-rotate", Key::RasterHueRotate, klass, value); parseOptionalProperty("transition-raster-hue-rotate", Key::RasterHueRotate, klass, value); - parseOptionalProperty>("raster-brightness-low", Key::RasterBrightnessLow, klass, value); - parseOptionalProperty("transition-raster-brightness-low", Key::RasterBrightnessLow, klass, value); - parseOptionalProperty>("raster-brightness-high", Key::RasterBrightnessHigh, klass, value); - parseOptionalProperty("transition-raster-brightness-high", Key::RasterBrightnessHigh, klass, value); + parseOptionalProperty>("raster-brightness", { Key::RasterBrightnessLow, Key::RasterBrightnessHigh }, klass, value); + parseOptionalProperty("transition-raster-brightness", Key::RasterBrightness, klass, value); parseOptionalProperty>("raster-saturation", Key::RasterSaturation, klass, value); parseOptionalProperty("transition-raster-saturation", Key::RasterSaturation, klass, value); parseOptionalProperty>("raster-contrast", Key::RasterContrast, klass, value); From 4de2aafd3048deeded5583bc5d42147646aa934d Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Tue, 12 Aug 2014 19:01:40 -0700 Subject: [PATCH 19/22] rm commented line [skip ci] --- src/renderer/painter_raster.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 82e604e28..86acf0153 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -65,8 +65,6 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay if (bucket.hasData()) { depthMask(false); -// const Tile::ID parent_id = id.parent(id.z); - useProgram(rasterShader->program); rasterShader->setMatrix(matrix); rasterShader->setBuffer(0); From b2aa60baac243a8c688c93353174fd2ae5b7d5bb Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Tue, 12 Aug 2014 22:56:16 -0700 Subject: [PATCH 20/22] std namespacing trig fns --- src/renderer/painter_raster.cpp | 10 ++++------ src/shader/raster_shader.cpp | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 86acf0153..3d26e724b 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -7,8 +7,6 @@ #include #include -#include - using namespace mbgl; void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { @@ -85,12 +83,12 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay std::array Painter::spinWeights(float spin) { spin *= M_PI / 180; - float s = sin(spin); - float c = cos(spin); + float s = std::sin(spin); + float c = std::cos(spin); std::array spin_weights = {{ (2 * c + 1) / 3, - (-sqrtf(3.0) * s - c + 1) / 3, - (sqrtf(3.0) * s - c + 1) / 3 + (-std::sqrtf(3.0) * s - c + 1) / 3, + (std::sqrtf(3.0) * s - c + 1) / 3 }}; return spin_weights; } \ No newline at end of file diff --git a/src/shader/raster_shader.cpp b/src/shader/raster_shader.cpp index 6531bad1a..51b328fa8 100644 --- a/src/shader/raster_shader.cpp +++ b/src/shader/raster_shader.cpp @@ -68,7 +68,7 @@ void RasterShader::setBrightness(float new_brightness_low, float new_brightness_ glUniform1f(u_brightness_low, new_brightness_low); brightness_low = new_brightness_low; } - if (brightness_high!= new_brightness_high) { + if (brightness_high != new_brightness_high) { glUniform1f(u_brightness_high, new_brightness_high); brightness_high = new_brightness_high; } From 3492a55f97ec96adcaee93b1ca0d3471f0c6e88e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 13 Aug 2014 10:44:35 +0200 Subject: [PATCH 21/22] remove unnecessary variable [skip ci] --- src/renderer/painter_raster.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 7dcc9b24d..b6d1a34b7 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -34,12 +34,11 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay // call updateTiles to get parsed data for sublayers map.updateTiles(); - int i = 0; - for (auto it = layer_desc->layers->layers.begin(), end = layer_desc->layers->layers.end(); it != end; ++it, --i) { + for (const std::shared_ptr &layer : layer_desc->layers->layers) { setOpaque(); - map.renderLayer(*it, RenderPass::Opaque, &id, &preMatrix); + map.renderLayer(layer, RenderPass::Opaque, &id, &preMatrix); setTranslucent(); - map.renderLayer(*it, RenderPass::Translucent, &id, &preMatrix); + map.renderLayer(layer, RenderPass::Translucent, &id, &preMatrix); } if (bucket.properties.blur > 0) { From 8a9a43af7f6c8036be37f215ff1229e58377181a Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Wed, 13 Aug 2014 09:52:54 -0700 Subject: [PATCH 22/22] fix std::sqrt --- src/renderer/painter_raster.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index 3d26e724b..efebfcf0e 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -87,8 +87,8 @@ std::array Painter::spinWeights(float spin) { float c = std::cos(spin); std::array spin_weights = {{ (2 * c + 1) / 3, - (-std::sqrtf(3.0) * s - c + 1) / 3, - (std::sqrtf(3.0) * s - c + 1) / 3 + (-std::sqrt(3.0f) * s - c + 1) / 3, + (std::sqrt(3.0f) * s - c + 1) / 3 }}; return spin_weights; } \ No newline at end of file