summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2015-05-15 12:15:33 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2015-05-15 12:17:32 -0700
commit83a5aae6c55d72949c07adf555c52ca751857edc (patch)
tree0da9ad9dec0ab02ff790e31ac216e8f318bd6f23 /src
parent4798c502aa2a8c5e5c18193e1a221a8a371f36ab (diff)
downloadqtlocation-mapboxgl-83a5aae6c55d72949c07adf555c52ca751857edc.tar.gz
Render translucent background layers (fixes #1514)
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/renderer/painter.cpp112
-rw-r--r--src/mbgl/renderer/painter.hpp10
2 files changed, 50 insertions, 72 deletions
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index f306dec2d3..653bae0d68 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -159,20 +159,6 @@ void Painter::clear() {
MBGL_CHECK_ERROR(glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
}
-void Painter::setOpaque() {
- if (pass != RenderPass::Opaque) {
- pass = RenderPass::Opaque;
- config.blend = false;
- }
-}
-
-void Painter::setTranslucent() {
- if (pass != RenderPass::Translucent) {
- pass = RenderPass::Translucent;
- config.blend = true;
- }
-}
-
void Painter::setStrata(float value) {
strata = value;
}
@@ -241,66 +227,19 @@ void Painter::render(const Style& style, TransformState state_, TimePoint time)
if (debug::renderTree) { Log::Info(Event::Render, "{"); indent++; }
// TODO: Correctly compute the number of layers recursively beforehand.
- const float strata_thickness = 1.0f / (order.size() + 1);
-
- // Layer index
- int i = 0;
+ const float strataThickness = 1.0f / (order.size() + 1);
// - OPAQUE PASS -------------------------------------------------------------------------------
// Render everything top-to-bottom by using reverse iterators. Render opaque objects first.
- {
- const gl::debugging::group _("opaque");
-
- if (debug::renderTree) {
- Log::Info(Event::Render, "%*s%s", indent++ * 4, "", "OPAQUE {");
- }
- i = 0;
- setOpaque();
- for (auto it = order.rbegin(), end = order.rend(); it != end; ++it, ++i) {
- const auto& item = *it;
- if (item.bucket && item.tile) {
- if (item.hasRenderPass(RenderPass::Opaque)) {
- const gl::debugging::group group(item.layer.id + " - " + std::string(item.tile->id));
- setStrata(i * strata_thickness);
- prepareTile(*item.tile);
- item.bucket->render(*this, item.layer, item.tile->id, item.tile->matrix);
- }
- } else {
- const gl::debugging::group group("background");
- setStrata(i * strata_thickness);
- renderBackground(item.layer);
- }
- }
- if (debug::renderTree) {
- Log::Info(Event::Render, "%*s%s", --indent * 4, "", "}");
- }
- }
+ renderPass(RenderPass::Opaque,
+ order.rbegin(), order.rend(),
+ 0, 1, strataThickness);
// - TRANSLUCENT PASS --------------------------------------------------------------------------
// Make a second pass, rendering translucent objects. This time, we render bottom-to-top.
- {
- const gl::debugging::group _("translucent");
-
- if (debug::renderTree) {
- Log::Info(Event::Render, "%*s%s", indent++ * 4, "", "TRANSLUCENT {");
- }
- --i; // After the last iteration, this is incremented, so we have to decrement it again.
- setTranslucent();
- for (auto it = order.begin(), end = order.end(); it != end; ++it, --i) {
- const auto& item = *it;
- if (item.bucket && item.tile) {
- if (item.hasRenderPass(RenderPass::Translucent)) {
- const gl::debugging::group group(item.layer.id + " - " + std::string(item.tile->id));
- setStrata(i * strata_thickness);
- prepareTile(*item.tile);
- item.bucket->render(*this, item.layer, item.tile->id, item.tile->matrix);
- }
- }
- }
- if (debug::renderTree) {
- Log::Info(Event::Render, "%*s%s", --indent * 4, "", "}");
- }
- }
+ renderPass(RenderPass::Translucent,
+ order.begin(), order.end(),
+ order.size() - 1, -1, strataThickness);
if (debug::renderTree) { Log::Info(Event::Render, "}"); indent--; }
@@ -328,6 +267,43 @@ void Painter::render(const Style& style, TransformState state_, TimePoint time)
}
}
+template <class Iterator>
+void Painter::renderPass(RenderPass pass_,
+ Iterator it, Iterator end,
+ std::size_t i, int8_t increment,
+ const float strataThickness) {
+ pass = pass_;
+
+ const char * passName = pass == RenderPass::Opaque ? "opaque" : "translucent";
+ const gl::debugging::group _(passName);
+
+ if (debug::renderTree) {
+ Log::Info(Event::Render, "%*s%s {", indent++ * 4, "", passName);
+ }
+
+ config.blend = pass == RenderPass::Translucent;
+
+ for (; it != end; ++it, i += increment) {
+ const auto& item = *it;
+ if (item.bucket && item.tile) {
+ if (item.hasRenderPass(pass)) {
+ const gl::debugging::group group(item.layer.id + " - " + std::string(item.tile->id));
+ setStrata(i * strataThickness);
+ prepareTile(*item.tile);
+ item.bucket->render(*this, item.layer, item.tile->id, item.tile->matrix);
+ }
+ } else {
+ const gl::debugging::group group("background");
+ setStrata(i * strataThickness);
+ renderBackground(item.layer);
+ }
+ }
+
+ if (debug::renderTree) {
+ Log::Info(Event::Render, "%*s%s", --indent * 4, "", "}");
+ }
+}
+
std::vector<RenderItem> Painter::determineRenderOrder(const Style& style) {
std::vector<RenderItem> order;
diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp
index 54c23b393a..871612ef43 100644
--- a/src/mbgl/renderer/painter.hpp
+++ b/src/mbgl/renderer/painter.hpp
@@ -123,10 +123,6 @@ public:
// Changes whether debug information is drawn onto the map
void setDebug(bool enabled);
- // Opaque/Translucent pass setting
- void setOpaque();
- void setTranslucent();
-
// Configures the painter strata that is used for early z-culling of fragments.
void setStrata(float strata);
@@ -148,6 +144,12 @@ private:
std::vector<RenderItem> determineRenderOrder(const Style& style);
static RenderPass determineRenderPasses(const StyleLayer&);
+ template <class Iterator>
+ void renderPass(RenderPass,
+ Iterator it, Iterator end,
+ std::size_t i, int8_t iIncrement,
+ const float strataThickness);
+
void prepareTile(const Tile& tile);
template <typename BucketProperties, typename StyleProperties>