diff options
Diffstat (limited to 'src/mbgl/renderer/painter.cpp')
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 84 |
1 files changed, 24 insertions, 60 deletions
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index da4903864b..47db8254e2 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -2,6 +2,7 @@ #include <mbgl/renderer/paint_parameters.hpp> #include <mbgl/renderer/render_tile.hpp> #include <mbgl/renderer/render_source.hpp> +#include <mbgl/renderer/render_style.hpp> #include <mbgl/style/source.hpp> #include <mbgl/style/source_impl.hpp> @@ -11,25 +12,21 @@ #include <mbgl/util/logging.hpp> #include <mbgl/gl/debugging.hpp> -#include <mbgl/style/style.hpp> #include <mbgl/style/layer_impl.hpp> +#include <mbgl/style/layers/custom_layer_impl.hpp> #include <mbgl/tile/tile.hpp> -#include <mbgl/renderer/render_background_layer.hpp> -#include <mbgl/renderer/render_custom_layer.hpp> +#include <mbgl/renderer/layers/render_background_layer.hpp> +#include <mbgl/renderer/layers/render_custom_layer.hpp> #include <mbgl/style/layers/custom_layer_impl.hpp> -#include <mbgl/renderer/render_fill_extrusion_layer.hpp> +#include <mbgl/renderer/layers/render_fill_extrusion_layer.hpp> -#include <mbgl/sprite/sprite_atlas.hpp> +#include <mbgl/renderer/image_manager.hpp> #include <mbgl/geometry/line_atlas.hpp> -#include <mbgl/text/glyph_atlas.hpp> #include <mbgl/programs/program_parameters.hpp> #include <mbgl/programs/programs.hpp> -#include <mbgl/algorithm/generate_clip_ids.hpp> -#include <mbgl/algorithm/generate_clip_ids_impl.hpp> - #include <mbgl/util/constants.hpp> #include <mbgl/util/mat3.hpp> #include <mbgl/util/string.hpp> @@ -118,14 +115,14 @@ Painter::Painter(gl::Context& context_, Painter::~Painter() = default; bool Painter::needsAnimation() const { - return frameHistory.needsAnimation(util::DEFAULT_FADE_DURATION); + return frameHistory.needsAnimation(util::DEFAULT_TRANSITION_DURATION); } void Painter::cleanup() { context.performCleanup(); } -void Painter::render(const Style& style, const FrameData& frame_, View& view, SpriteAtlas& annotationSpriteAtlas) { +void Painter::render(RenderStyle& style, const FrameData& frame_, View& view) { frame = frame_; if (frame.contextMode == GLContextMode::Shared) { context.setDirtyState(); @@ -140,11 +137,10 @@ void Painter::render(const Style& style, const FrameData& frame_, View& view, Sp view }; - glyphAtlas = style.glyphAtlas.get(); - spriteAtlas = style.spriteAtlas.get(); + imageManager = style.imageManager.get(); lineAtlas = style.lineAtlas.get(); - evaluatedLight = style.getRenderLight()->getEvaluated(); + evaluatedLight = style.getRenderLight().getEvaluated(); RenderData renderData = style.getRenderData(frame.debugOptions, state.getAngle()); const std::vector<RenderItem>& order = renderData.order; @@ -163,7 +159,7 @@ void Painter::render(const Style& style, const FrameData& frame_, View& view, Sp } frameHistory.record(frame.timePoint, state.getZoom(), - frame.mapMode == MapMode::Continuous ? util::DEFAULT_FADE_DURATION : Milliseconds(0)); + frame.mapMode == MapMode::Continuous ? util::DEFAULT_TRANSITION_DURATION : Milliseconds(0)); // - UPLOAD PASS ------------------------------------------------------------------------------- @@ -171,21 +167,9 @@ void Painter::render(const Style& style, const FrameData& frame_, View& view, Sp { MBGL_DEBUG_GROUP(context, "upload"); - spriteAtlas->upload(context, 0); - + imageManager->upload(context, 0); lineAtlas->upload(context, 0); - glyphAtlas->upload(context, 0); frameHistory.upload(context, 0); - annotationSpriteAtlas.upload(context, 0); - - for (const auto& item : order) { - for (const auto& tileRef : item.tiles) { - const auto& bucket = tileRef.get().tile.getBucket(item.layer); - if (bucket && bucket->needsUpload()) { - bucket->upload(context); - } - } - } } // - CLEAR ------------------------------------------------------------------------------------- @@ -207,14 +191,14 @@ void Painter::render(const Style& style, const FrameData& frame_, View& view, Sp MBGL_DEBUG_GROUP(context, "clip"); // Update all clipping IDs. - algorithm::ClipIDGenerator generator; + clipIDGenerator = algorithm::ClipIDGenerator(); for (const auto& source : sources) { - source->startRender(generator, projMatrix, nearClippedProjMatrix, state); + source->startRender(*this); } MBGL_DEBUG_GROUP(context, "clipping masks"); - for (const auto& stencil : generator.getStencils()) { + for (const auto& stencil : clipIDGenerator.getStencils()) { MBGL_DEBUG_GROUP(context, std::string{ "mask: " } + util::toString(stencil.first)); renderClippingMask(stencil.first, stencil.second); } @@ -308,21 +292,6 @@ void Painter::renderPass(PaintParameters& parameters, if (layer.is<RenderBackgroundLayer>()) { MBGL_DEBUG_GROUP(context, "background"); renderBackground(parameters, *layer.as<RenderBackgroundLayer>()); - } else if (layer.is<RenderCustomLayer>()) { - MBGL_DEBUG_GROUP(context, layer.baseImpl.id + " - custom"); - - // Reset GL state to a known state so the CustomLayer always has a clean slate. - context.vertexArrayObject = 0; - context.setDepthMode(depthModeForSublayer(0, gl::DepthMode::ReadOnly)); - context.setStencilMode(gl::StencilMode::disabled()); - context.setColorMode(colorModeForRenderPass()); - - layer.as<RenderCustomLayer>()->impl->render(state); - - // Reset the view back to our original one, just in case the CustomLayer changed - // the viewport or Framebuffer. - parameters.view.bind(); - context.setDirtyState(); } else if (layer.is<RenderFillExtrusionLayer>()) { const auto size = context.viewport.getCurrentValue().size; @@ -336,13 +305,7 @@ void Painter::renderPass(PaintParameters& parameters, context.setDepthMode(depthModeForSublayer(0, gl::DepthMode::ReadWrite)); context.clear(Color{ 0.0f, 0.0f, 0.0f, 0.0f }, 1.0f, {}); - for (auto& tileRef : item.tiles) { - auto& tile = tileRef.get(); - - MBGL_DEBUG_GROUP(context, layer.baseImpl.id + " - " + util::toString(tile.id)); - auto bucket = tile.tile.getBucket(layer); - bucket->render(*this, parameters, layer, tile); - } + renderItem(parameters, item); parameters.view.bind(); context.bindTexture(extrusionTexture->getTexture()); @@ -350,7 +313,7 @@ void Painter::renderPass(PaintParameters& parameters, mat4 viewportMat; matrix::ortho(viewportMat, 0, size.width, size.height, 0, 0, 1); - const PaintProperties<>::Evaluated properties{}; + const Properties<>::PossiblyEvaluated properties; parameters.programs.extrusionTexture.draw( context, gl::Triangles(), gl::DepthMode::disabled(), gl::StencilMode::disabled(), @@ -364,12 +327,7 @@ void Painter::renderPass(PaintParameters& parameters, ExtrusionTextureProgram::PaintPropertyBinders{ properties, 0 }, properties, state.getZoom()); } else { - for (auto& tileRef : item.tiles) { - auto& tile = tileRef.get(); - MBGL_DEBUG_GROUP(context, layer.baseImpl.id + " - " + util::toString(tile.id)); - auto bucket = tile.tile.getBucket(layer); - bucket->render(*this, parameters, layer, tile); - } + renderItem(parameters, item); } } @@ -378,6 +336,12 @@ void Painter::renderPass(PaintParameters& parameters, } } +void Painter::renderItem(PaintParameters& parameters, const RenderItem& item) { + RenderLayer& layer = item.layer; + MBGL_DEBUG_GROUP(context, layer.getID()); + layer.render(*this, parameters, item.source); +} + mat4 Painter::matrixForTile(const UnwrappedTileID& tileID) { mat4 matrix; state.matrixFor(matrix, tileID); |