diff options
Diffstat (limited to 'src/mbgl/renderer/layers/render_custom_layer.cpp')
-rw-r--r-- | src/mbgl/renderer/layers/render_custom_layer.cpp | 88 |
1 files changed, 45 insertions, 43 deletions
diff --git a/src/mbgl/renderer/layers/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp index 75c21997b0..aaa3867fe5 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_layer.cpp @@ -34,6 +34,51 @@ RenderCustomLayer::~RenderCustomLayer() { } } +LayerRenderer RenderCustomLayer::createRenderer() { + if (host != impl(baseImpl).host) { + //If the context changed, deinitialize the previous one before initializing the new one. + if (host && !contextDestroyed) { + MBGL_CHECK_ERROR(host->deinitialize()); + } + host = impl(baseImpl).host; + MBGL_CHECK_ERROR(host->initialize()); + } + + return [host = this->host](PaintParameters& paintParameters, const LayerRenderItem&) { + // TODO: remove cast + auto& glContext = static_cast<gl::Context&>(paintParameters.context); + const TransformState& state = paintParameters.state; + + // Reset GL state to a known state so the CustomLayer always has a clean slate. + glContext.bindVertexArray = 0; + glContext.setDepthMode(paintParameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly)); + glContext.setStencilMode(gfx::StencilMode::disabled()); + glContext.setColorMode(paintParameters.colorModeForRenderPass()); + glContext.setCullFaceMode(gfx::CullFaceMode::disabled()); + + 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.getBearing() * util::RAD2DEG; + parameters.pitch = state.getPitch(); + parameters.fieldOfView = state.getFieldOfView(); + mat4 projMatrix; + state.getProjMatrix(projMatrix); + parameters.projectionMatrix = projMatrix; + + MBGL_CHECK_ERROR(host->render(parameters)); + + // Reset the view back to our original one, just in case the CustomLayer changed + // the viewport or Framebuffer. + paintParameters.backend.getDefaultRenderable().getResource<gl::RenderableResource>().bind(); + glContext.setDirtyState(); + }; +} + void RenderCustomLayer::evaluate(const PropertyEvaluationParameters&) { passes = RenderPass::Translucent; // It is fine to not update `evaluatedProperties`, as `baseImpl` should never be updated for this layer. @@ -53,47 +98,4 @@ void RenderCustomLayer::markContextDestroyed() { void RenderCustomLayer::prepare(const LayerPrepareParameters&) { } -void RenderCustomLayer::render(PaintParameters& paintParameters) { - if (host != impl(baseImpl).host) { - //If the context changed, deinitialize the previous one before initializing the new one. - if (host && !contextDestroyed) { - MBGL_CHECK_ERROR(host->deinitialize()); - } - host = impl(baseImpl).host; - MBGL_CHECK_ERROR(host->initialize()); - } - - // TODO: remove cast - auto& glContext = static_cast<gl::Context&>(paintParameters.context); - const TransformState& state = paintParameters.state; - - // Reset GL state to a known state so the CustomLayer always has a clean slate. - glContext.bindVertexArray = 0; - glContext.setDepthMode(paintParameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly)); - glContext.setStencilMode(gfx::StencilMode::disabled()); - glContext.setColorMode(paintParameters.colorModeForRenderPass()); - glContext.setCullFaceMode(gfx::CullFaceMode::disabled()); - - 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.getBearing() * util::RAD2DEG; - parameters.pitch = state.getPitch(); - parameters.fieldOfView = state.getFieldOfView(); - mat4 projMatrix; - state.getProjMatrix(projMatrix); - parameters.projectionMatrix = projMatrix; - - MBGL_CHECK_ERROR(host->render(parameters)); - - // Reset the view back to our original one, just in case the CustomLayer changed - // the viewport or Framebuffer. - paintParameters.backend.getDefaultRenderable().getResource<gl::RenderableResource>().bind(); - glContext.setDirtyState(); -} - } // namespace mbgl |