diff options
-rw-r--r-- | include/mbgl/map/mode.hpp | 11 | ||||
-rw-r--r-- | platform/default/glfw_view.cpp | 13 | ||||
-rw-r--r-- | platform/macos/app/Base.lproj/MainMenu.xib | 6 | ||||
-rw-r--r-- | platform/macos/app/MapDocument.m | 14 | ||||
-rw-r--r-- | platform/macos/src/MGLMapView.h | 5 | ||||
-rw-r--r-- | platform/macos/src/MGLMapView.mm | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_debug.cpp | 35 |
9 files changed, 96 insertions, 2 deletions
diff --git a/include/mbgl/map/mode.hpp b/include/mbgl/map/mode.hpp index c9b9f60953..2efc8b18e0 100644 --- a/include/mbgl/map/mode.hpp +++ b/include/mbgl/map/mode.hpp @@ -47,6 +47,7 @@ enum class MapDebugOptions : EnumType { // FIXME: https://github.com/mapbox/mapbox-gl-native/issues/5117 #ifndef GL_ES_VERSION_2_0 StencilClip = 1 << 6, + DepthBuffer = 1 << 7, #endif // GL_ES_VERSION_2_0 }; @@ -55,11 +56,19 @@ constexpr MapDebugOptions operator|(MapDebugOptions lhs, MapDebugOptions rhs) { } constexpr MapDebugOptions& operator|=(MapDebugOptions& lhs, MapDebugOptions rhs) { - return (lhs = lhs | rhs); + return (lhs = MapDebugOptions(mbgl::underlying_type(lhs) | mbgl::underlying_type(rhs))); } constexpr bool operator&(MapDebugOptions lhs, MapDebugOptions rhs) { return mbgl::underlying_type(lhs) & mbgl::underlying_type(rhs); } +constexpr MapDebugOptions& operator&=(MapDebugOptions& lhs, MapDebugOptions rhs) { + return (lhs = MapDebugOptions(mbgl::underlying_type(lhs) & mbgl::underlying_type(rhs))); +} + +constexpr MapDebugOptions operator~(MapDebugOptions value) { + return MapDebugOptions(~mbgl::underlying_type(value)); +} + } // namespace mbgl diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index 863f42ec76..b84bbfdf8a 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -97,6 +97,7 @@ GLFWView::GLFWView(bool fullscreen_, bool benchmark_) printf("- Press `Z` to cycle through north orientations\n"); printf("- Prezz `X` to cycle through the viewport modes\n"); printf("- Press `A` to cycle through Mapbox offices in the world + dateline monument\n"); + printf("- Press `B` to cycle through the color, stencil, and depth buffer\n"); printf("\n"); printf("- Press `1` through `6` to add increasing numbers of point annotations for testing\n"); printf("- Press `7` through `0` to add increasing numbers of shape annotations for testing\n"); @@ -155,6 +156,18 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, } } break; + case GLFW_KEY_B: { + auto debug = view->map->getDebug(); + if (debug & mbgl::MapDebugOptions::StencilClip) { + debug &= ~mbgl::MapDebugOptions::StencilClip; + debug |= mbgl::MapDebugOptions::DepthBuffer; + } else if (debug & mbgl::MapDebugOptions::DepthBuffer) { + debug &= ~mbgl::MapDebugOptions::DepthBuffer; + } else { + debug |= mbgl::MapDebugOptions::StencilClip; + } + view->map->setDebug(debug); + } break; case GLFW_KEY_N: if (!mods) view->map->resetNorth(); diff --git a/platform/macos/app/Base.lproj/MainMenu.xib b/platform/macos/app/Base.lproj/MainMenu.xib index fae2a7db7d..716872a32a 100644 --- a/platform/macos/app/Base.lproj/MainMenu.xib +++ b/platform/macos/app/Base.lproj/MainMenu.xib @@ -474,6 +474,12 @@ <action selector="showStencilBuffer:" target="-1" id="WkN-t9-Mpv"/> </connections> </menuItem> + <menuItem title="Depth Buffer" keyEquivalent="d" id="CDq-70-oPa"> + <modifierMask key="keyEquivalentModifierMask" control="YES" option="YES" command="YES"/> + <connections> + <action selector="showDepthBuffer:" target="-1" id="h7r-eM-ZEu"/> + </connections> + </menuItem> <menuItem isSeparatorItem="YES" id="dYw-bb-tr1"/> <menuItem title="Show Tooltips on Dropped Pins" id="uir-Rx-zmw"> <modifierMask key="keyEquivalentModifierMask"/> diff --git a/platform/macos/app/MapDocument.m b/platform/macos/app/MapDocument.m index 9e65539990..3bb8f5872e 100644 --- a/platform/macos/app/MapDocument.m +++ b/platform/macos/app/MapDocument.m @@ -283,12 +283,19 @@ NS_ARRAY_OF(id <MGLAnnotation>) *MBXFlattenedShapes(NS_ARRAY_OF(id <MGLAnnotatio - (IBAction)showColorBuffer:(id)sender { self.mapView.debugMask &= ~MGLMapDebugStencilBufferMask; + self.mapView.debugMask &= ~MGLMapDebugDepthBufferMask; } - (IBAction)showStencilBuffer:(id)sender { + self.mapView.debugMask &= ~MGLMapDebugDepthBufferMask; self.mapView.debugMask |= MGLMapDebugStencilBufferMask; } +- (IBAction)showDepthBuffer:(id)sender { + self.mapView.debugMask &= ~MGLMapDebugStencilBufferMask; + self.mapView.debugMask |= MGLMapDebugDepthBufferMask; +} + - (IBAction)toggleShowsToolTipsOnDroppedPins:(id)sender { _showsToolTipsOnDroppedPins = !_showsToolTipsOnDroppedPins; } @@ -642,7 +649,7 @@ NS_ARRAY_OF(id <MGLAnnotation>) *MBXFlattenedShapes(NS_ARRAY_OF(id <MGLAnnotatio return YES; } if (menuItem.action == @selector(showColorBuffer:)) { - BOOL enabled = self.mapView.debugMask & MGLMapDebugStencilBufferMask; + BOOL enabled = self.mapView.debugMask & (MGLMapDebugStencilBufferMask | MGLMapDebugDepthBufferMask); menuItem.state = enabled ? NSOffState : NSOnState; return YES; } @@ -651,6 +658,11 @@ NS_ARRAY_OF(id <MGLAnnotation>) *MBXFlattenedShapes(NS_ARRAY_OF(id <MGLAnnotatio menuItem.state = enabled ? NSOnState : NSOffState; return YES; } + if (menuItem.action == @selector(showDepthBuffer:)) { + BOOL enabled = self.mapView.debugMask & MGLMapDebugDepthBufferMask; + menuItem.state = enabled ? NSOnState : NSOffState; + return YES; + } if (menuItem.action == @selector(toggleShowsToolTipsOnDroppedPins:)) { BOOL isShown = _showsToolTipsOnDroppedPins; menuItem.title = isShown ? @"Hide Tooltips on Dropped Pins" : @"Show Tooltips on Dropped Pins"; diff --git a/platform/macos/src/MGLMapView.h b/platform/macos/src/MGLMapView.h index fb2572ec08..37c13802b1 100644 --- a/platform/macos/src/MGLMapView.h +++ b/platform/macos/src/MGLMapView.h @@ -32,6 +32,11 @@ typedef NS_OPTIONS(NSUInteger, MGLMapDebugMaskOptions) { @note This option does nothing in Release builds of the SDK. */ MGLMapDebugStencilBufferMask = 1 << 6, + + /** The depth buffer is shown instead of the color buffer. + @note This option does nothing in Release builds of the SDK. + */ + MGLMapDebugDepthBufferMask = 1 << 7, }; @class MGLAnnotationImage; diff --git a/platform/macos/src/MGLMapView.mm b/platform/macos/src/MGLMapView.mm index 74a5ed96d2..7b7ab0247b 100644 --- a/platform/macos/src/MGLMapView.mm +++ b/platform/macos/src/MGLMapView.mm @@ -2450,6 +2450,9 @@ public: if (options & mbgl::MapDebugOptions::StencilClip) { mask |= MGLMapDebugStencilBufferMask; } + if (options & mbgl::MapDebugOptions::DepthBuffer) { + mask |= MGLMapDebugDepthBufferMask; + } return mask; } @@ -2473,6 +2476,9 @@ public: if (debugMask & MGLMapDebugStencilBufferMask) { options |= mbgl::MapDebugOptions::StencilClip; } + if (debugMask & MGLMapDebugDepthBufferMask) { + options |= mbgl::MapDebugOptions::DepthBuffer; + } _mbglMap->setDebug(options); } diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 8500a946fd..163095d85b 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -198,6 +198,12 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a } } +#ifndef NDEBUG + if (frame.debugOptions & MapDebugOptions::DepthBuffer) { + renderDepthBuffer(); + } +#endif + // TODO: Find a better way to unbind VAOs after we're done with them without introducing // unnecessary bind(0)/bind(N) sequences. { diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 2b6c1efdea..119155e011 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -89,6 +89,8 @@ public: #ifndef NDEBUG // Renders tile clip boundaries, using stencil buffer to calculate fill color. void renderClipMasks(); + // Renders the depth buffer. + void renderDepthBuffer(); #endif void renderDebugText(Tile&, const mat4&); diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp index d6336b843c..7c24f67fb4 100644 --- a/src/mbgl/renderer/painter_debug.cpp +++ b/src/mbgl/renderer/painter_debug.cpp @@ -125,4 +125,39 @@ void Painter::renderClipMasks() { } #endif // NDEBUG +#ifndef NDEBUG +void Painter::renderDepthBuffer() { + config.stencilTest = GL_FALSE; + config.depthTest = GL_FALSE; + config.program = 0; + config.colorMask = { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE }; + +#ifndef GL_ES_VERSION_2_0 + config.pixelZoom = { 1, 1 }; + config.rasterPos = {{ -1, -1, 0, 0 }}; + + // Read the stencil buffer + const auto& fbSize = frame.framebufferSize; + auto pixels = std::make_unique<GLubyte[]>(fbSize[0] * fbSize[1]); + + const double base = 1.0 / (1.0 - depthRangeSize); + glPixelTransferf(GL_DEPTH_SCALE, base); + glPixelTransferf(GL_DEPTH_BIAS, 1.0 - base); + + MBGL_CHECK_ERROR(glReadPixels( + 0, // GLint x + 0, // GLint y + fbSize[0], // GLsizei width + fbSize[1], // GLsizei height + GL_DEPTH_COMPONENT, // GLenum format + GL_UNSIGNED_BYTE, // GLenum type + pixels.get() // GLvoid * data + )); + + MBGL_CHECK_ERROR(glWindowPos2i(0, 0)); + MBGL_CHECK_ERROR(glDrawPixels(fbSize[0], fbSize[1], GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels.get())); +#endif // GL_ES_VERSION_2_0 +} +#endif // NDEBUG + } // namespace mbgl |