diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2016-02-05 16:09:52 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2016-02-10 11:35:17 +0100 |
commit | 33b63f0ef6a0ea51b8f24ffe9b4a1f0b14e2dc1d (patch) | |
tree | ff99e9bc8ba5117aa9cf1e919801dfcf9883cccd /platform/default/glfw_view.cpp | |
parent | d9244cc973cacb454960838287c8c47482b20e34 (diff) | |
download | qtlocation-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.cpp | 52 |
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; |