summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/painter_prerender.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/painter_prerender.cpp')
-rw-r--r--src/mbgl/renderer/painter_prerender.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/mbgl/renderer/painter_prerender.cpp b/src/mbgl/renderer/painter_prerender.cpp
new file mode 100644
index 0000000000..f38470530b
--- /dev/null
+++ b/src/mbgl/renderer/painter_prerender.cpp
@@ -0,0 +1,45 @@
+#include <mbgl/renderer/painter.hpp>
+#include <mbgl/style/style_properties.hpp>
+#include <mbgl/renderer/prerendered_texture.hpp>
+#include <mbgl/renderer/raster_bucket.hpp>
+
+using namespace mbgl;
+
+void Painter::preparePrerender(RasterBucket &bucket) {
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_STENCIL_TEST);
+
+// Render the actual tile.
+#if GL_EXT_discard_framebuffer
+ const GLenum discards[] = {GL_COLOR_ATTACHMENT0};
+ glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards);
+#endif
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glViewport(0, 0, bucket.properties.size, bucket.properties.size);
+}
+
+void Painter::renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, const RasterProperties& properties) {
+ const int buffer = bucket.properties.buffer * 4096.0f;
+
+ // draw the texture on a quad
+ useProgram(rasterShader->program);
+ rasterShader->u_matrix = matrix;
+ rasterShader->u_opacity = 1;
+
+ depthRange(strata, 1.0f);
+
+ glActiveTexture(GL_TEXTURE0);
+ rasterShader->u_image = 0;
+ rasterShader->u_buffer = buffer;
+ rasterShader->u_opacity = properties.opacity;
+ rasterShader->u_brightness_low = properties.brightness[0];
+ rasterShader->u_brightness_high = properties.brightness[1];
+ rasterShader->u_saturation_factor = saturationFactor(properties.saturation);
+ rasterShader->u_contrast_factor = contrastFactor(properties.contrast);
+ rasterShader->u_spin_weights = spinWeights(properties.hue_rotate);
+ bucket.texture.bindTexture();
+ coveringRasterArray.bind(*rasterShader, tileStencilBuffer, BUFFER_OFFSET(0));
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index());
+}