summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/layers/render_custom_layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/layers/render_custom_layer.cpp')
-rw-r--r--src/mbgl/renderer/layers/render_custom_layer.cpp88
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