diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2017-06-14 16:21:02 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2017-06-22 08:04:39 -0700 |
commit | be7e9bbb8d54c775127f53d793c117c4bf5e2764 (patch) | |
tree | 2621c4aa950956af9e48205bda13960ac2ce8584 /src/mbgl/renderer | |
parent | e4201e207c3a6b33da64fdc2f9a00ec08586dc09 (diff) | |
download | qtlocation-mapboxgl-be7e9bbb8d54c775127f53d793c117c4bf5e2764.tar.gz |
[core] Refactor CustomLayer internals
Move the responsibility for initialization/deinitialization/rendering to RenderCustomLayer. This eliminates special case code from Map and Style.
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r-- | src/mbgl/renderer/layers/render_custom_layer.cpp | 58 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_custom_layer.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 15 | ||||
-rw-r--r-- | src/mbgl/renderer/render_layer.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/render_style.cpp | 7 |
5 files changed, 64 insertions, 26 deletions
diff --git a/src/mbgl/renderer/layers/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp index add3d0d5ad..4d6084075d 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_layer.cpp @@ -1,15 +1,27 @@ #include <mbgl/renderer/layers/render_custom_layer.hpp> +#include <mbgl/renderer/painter.hpp> +#include <mbgl/renderer/paint_parameters.hpp> #include <mbgl/style/layers/custom_layer_impl.hpp> -#include <mbgl/renderer/bucket.hpp> +#include <mbgl/map/transform_state.hpp> +#include <mbgl/map/backend_scope.hpp> namespace mbgl { +using namespace style; + RenderCustomLayer::RenderCustomLayer(Immutable<style::CustomLayer::Impl> _impl) - : RenderLayer(style::LayerType::Custom, _impl) { + : RenderLayer(LayerType::Custom, _impl) { +} + +RenderCustomLayer::~RenderCustomLayer() { + assert(BackendScope::exists()); + if (initialized && impl().deinitializeFn) { + impl().deinitializeFn(impl().context); + } } -const style::CustomLayer::Impl& RenderCustomLayer::impl() const { - return static_cast<const style::CustomLayer::Impl&>(*baseImpl); +const CustomLayer::Impl& RenderCustomLayer::impl() const { + return static_cast<const CustomLayer::Impl&>(*baseImpl); } void RenderCustomLayer::evaluate(const PropertyEvaluationParameters&) { @@ -24,5 +36,41 @@ std::unique_ptr<Bucket> RenderCustomLayer::createBucket(const BucketParameters&, assert(false); return nullptr; } - + +void RenderCustomLayer::render(Painter& painter, PaintParameters& paintParameters, RenderSource*) { + if (!initialized) { + assert(impl().initializeFn); + impl().initializeFn(impl().context); + initialized = true; + } + + gl::Context& context = painter.context; + const TransformState& state = painter.state; + + // Reset GL state to a known state so the CustomLayer always has a clean slate. + context.vertexArrayObject = 0; + context.setDepthMode(painter.depthModeForSublayer(0, gl::DepthMode::ReadOnly)); + context.setStencilMode(gl::StencilMode::disabled()); + context.setColorMode(painter.colorModeForRenderPass()); + + CustomLayerRenderParameters parameters; + + parameters.width = state.getSize().width; + parameters.height = state.getSize().height; + parameters.latitude = state.getLatLng().latitude(); + parameters.longitude = state.getLatLng().longitude(); + parameters.zoom = state.getZoom(); + parameters.bearing = -state.getAngle() * util::RAD2DEG; + parameters.pitch = state.getPitch(); + parameters.fieldOfView = state.getFieldOfView(); + + assert(impl().renderFn); + impl().renderFn(impl().context, parameters); + + // Reset the view back to our original one, just in case the CustomLayer changed + // the viewport or Framebuffer. + paintParameters.view.bind(); + context.setDirtyState(); +} + } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_custom_layer.hpp b/src/mbgl/renderer/layers/render_custom_layer.hpp index 2f7c2d3239..dd52d315cf 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.hpp +++ b/src/mbgl/renderer/layers/render_custom_layer.hpp @@ -8,15 +8,19 @@ namespace mbgl { class RenderCustomLayer: public RenderLayer { public: RenderCustomLayer(Immutable<style::CustomLayer::Impl>); - ~RenderCustomLayer() final = default; + ~RenderCustomLayer() final; void transition(const TransitionParameters&) final {} void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const final; + void render(Painter&, PaintParameters&, RenderSource*) final; const style::CustomLayer::Impl& impl() const; + +private: + bool initialized = false; }; template <> diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 5a70243a54..47db8254e2 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -292,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; diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index 50ad4c771a..e06f479281 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -19,10 +19,6 @@ class PaintParameters; class RenderSource; class RenderTile; -namespace gl { -class Context; -} // namespace gl - class RenderLayer { protected: RenderLayer(style::LayerType, Immutable<style::Layer::Impl>); diff --git a/src/mbgl/renderer/render_style.cpp b/src/mbgl/renderer/render_style.cpp index 589a493621..f9c3f0ca9f 100644 --- a/src/mbgl/renderer/render_style.cpp +++ b/src/mbgl/renderer/render_style.cpp @@ -23,6 +23,7 @@ #include <mbgl/sprite/sprite_loader.hpp> #include <mbgl/text/glyph_manager.hpp> #include <mbgl/geometry/line_atlas.hpp> +#include <mbgl/map/backend_scope.hpp> #include <mbgl/map/query.hpp> #include <mbgl/tile/tile.hpp> #include <mbgl/util/math.hpp> @@ -48,7 +49,9 @@ RenderStyle::RenderStyle(Scheduler& scheduler_, FileSource& fileSource_) glyphManager->setObserver(this); } -RenderStyle::~RenderStyle() = default; +RenderStyle::~RenderStyle() { + assert(BackendScope::exists()); // Required for custom layers. +} void RenderStyle::setObserver(RenderStyleObserver* observer_) { observer = observer_; @@ -78,6 +81,8 @@ const RenderLight& RenderStyle::getRenderLight() const { } void RenderStyle::update(const UpdateParameters& parameters) { + assert(BackendScope::exists()); // Required for custom layers. + const bool zoomChanged = zoomHistory.update(parameters.transformState.getZoom(), parameters.timePoint); const TransitionParameters transitionParameters { |