summaryrefslogtreecommitdiff
path: root/platform/default/glfw_view.cpp
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2016-02-05 16:09:52 +0100
committerKonstantin Käfer <mail@kkaefer.com>2016-02-10 11:35:17 +0100
commit33b63f0ef6a0ea51b8f24ffe9b4a1f0b14e2dc1d (patch)
treeff99e9bc8ba5117aa9cf1e919801dfcf9883cccd /platform/default/glfw_view.cpp
parentd9244cc973cacb454960838287c8c47482b20e34 (diff)
downloadqtlocation-mapboxgl-33b63f0ef6a0ea51b8f24ffe9b4a1f0b14e2dc1d.tar.gz
[glfw] add "C" button to show stencil clip masks
Diffstat (limited to 'platform/default/glfw_view.cpp')
-rw-r--r--platform/default/glfw_view.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp
index 3173bfddee..a4e8d7059f 100644
--- a/platform/default/glfw_view.cpp
+++ b/platform/default/glfw_view.cpp
@@ -6,6 +6,7 @@
#include <mbgl/gl/gl_values.hpp>
#include <mbgl/gl/gl_helper.hpp>
#include <mbgl/platform/log.hpp>
+#include <mbgl/platform/platform.hpp>
#include <mbgl/util/string.hpp>
#include <mbgl/util/chrono.hpp>
@@ -136,6 +137,9 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action,
if (!mods)
view->map->resetPosition();
break;
+ case GLFW_KEY_C:
+ view->toggleClipMasks();
+ break;
case GLFW_KEY_S:
if (view->changeStyleCallback)
view->changeStyleCallback();
@@ -232,6 +236,11 @@ void GLFWView::nextOrientation() {
}
}
+void GLFWView::toggleClipMasks() {
+ showClipMasks = !showClipMasks;
+ map->update(mbgl::Update::Repaint);
+}
+
void GLFWView::addRandomCustomPointAnnotations(int count) {
std::vector<mbgl::PointAnnotation> points;
@@ -439,9 +448,52 @@ void GLFWView::beforeRender() {
}
void GLFWView::afterRender() {
+ if (showClipMasks) {
+ renderClipMasks();
+ }
+
glfwSwapBuffers(window);
}
+void GLFWView::renderClipMasks() {
+ // Read the stencil buffer
+ auto pixels = std::make_unique<uint8_t[]>(fbWidth * fbHeight);
+ glReadPixels(0, // GLint x
+ 0, // GLint y
+ fbWidth, // GLsizei width
+ fbHeight, // GLsizei height
+ GL_STENCIL_INDEX, // GLenum format
+ GL_UNSIGNED_BYTE, // GLenum type
+ pixels.get() // GLvoid * data
+ );
+
+ // Scale the Stencil buffer to cover the entire color space.
+ auto it = pixels.get();
+ auto end = it + fbWidth * fbHeight;
+ const auto factor = 255.0f / *std::max_element(it, end);
+ for (; it != end; ++it) {
+ *it *= factor;
+ }
+
+ using namespace mbgl::gl;
+ Preserve<PixelZoom> pixelZoom;
+ Preserve<RasterPos> rasterPos;
+ Preserve<StencilTest> stencilTest;
+ Preserve<DepthTest> depthTest;
+ Preserve<Program> program;
+ Preserve<ColorMask> colorMask;
+
+ MBGL_CHECK_ERROR(glPixelZoom(1.0f, 1.0f));
+ MBGL_CHECK_ERROR(glRasterPos2f(-1.0f, -1.0f));
+ MBGL_CHECK_ERROR(glDisable(GL_STENCIL_TEST));
+ MBGL_CHECK_ERROR(glDisable(GL_DEPTH_TEST));
+ MBGL_CHECK_ERROR(glUseProgram(0));
+ MBGL_CHECK_ERROR(glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE));
+ MBGL_CHECK_ERROR(glWindowPos2i(0, 0));
+
+ MBGL_CHECK_ERROR(glDrawPixels(fbWidth, fbHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels.get()));
+}
+
void GLFWView::report(float duration) {
frames++;
frameTime += duration;