From 54ed547f90329a4c123f875dc91be3dfc968fd4e Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Thu, 7 Aug 2014 17:43:21 -0700 Subject: [PATCH] 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); }