From 76fc07c606fa62fefc1e2aa435a51a8b5fd384cd Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Sat, 18 Jun 2016 15:32:49 +0300 Subject: [PATCH 1/6] [core] Autogenerate Shader name --- scripts/build-shaders.py | 5 +++++ src/mbgl/geometry/vao.cpp | 2 +- src/mbgl/geometry/vao.hpp | 12 +++++------- src/mbgl/shader/circle_shader.cpp | 5 ++--- src/mbgl/shader/collision_box_shader.cpp | 5 ++--- src/mbgl/shader/icon_shader.cpp | 5 ++--- src/mbgl/shader/line_shader.cpp | 5 ++--- src/mbgl/shader/linepattern_shader.cpp | 5 ++--- src/mbgl/shader/linesdf_shader.cpp | 5 ++--- src/mbgl/shader/outline_shader.cpp | 5 ++--- src/mbgl/shader/outlinepattern_shader.cpp | 9 ++------- src/mbgl/shader/pattern_shader.cpp | 9 ++------- src/mbgl/shader/plain_shader.cpp | 5 ++--- src/mbgl/shader/raster_shader.cpp | 5 ++--- src/mbgl/shader/sdf_shader.cpp | 5 ++--- src/mbgl/shader/shader.cpp | 10 +++++----- src/mbgl/shader/shader.hpp | 5 ++--- 17 files changed, 42 insertions(+), 60 deletions(-) diff --git a/scripts/build-shaders.py b/scripts/build-shaders.py index 3b02cdc8862..d6791725542 100755 --- a/scripts/build-shaders.py +++ b/scripts/build-shaders.py @@ -50,6 +50,11 @@ def replace_uniform_pragmas(line): namespace shaders {{ namespace {name} {{ +#ifndef MBGL_SHADER_NAME_{NAME} +#define MBGL_SHADER_NAME_{NAME} +constexpr const char* name = "{name}"; +#endif // MBGL_SHADER_NAME_{NAME} + #ifdef GL_ES_VERSION_2_0 constexpr const char* {type} = R"MBGL_SHADER(precision highp float;\n{data})MBGL_SHADER"; #else diff --git a/src/mbgl/geometry/vao.cpp b/src/mbgl/geometry/vao.cpp index d797a11b412..30f5484896a 100644 --- a/src/mbgl/geometry/vao.cpp +++ b/src/mbgl/geometry/vao.cpp @@ -31,7 +31,7 @@ void VertexArrayObject::bindVertexArrayObject(gl::ObjectStore& store) { MBGL_CHECK_ERROR(gl::BindVertexArray(*vao)); } -void VertexArrayObject::verifyBinding(Shader &shader, GLuint vertexBuffer, GLuint elementsBuffer, +void VertexArrayObject::verifyBinding(Shader& shader, GLuint vertexBuffer, GLuint elementsBuffer, GLbyte *offset) { if (bound_shader != shader.getID()) { throw std::runtime_error(std::string("trying to rebind VAO to another shader from " + diff --git a/src/mbgl/geometry/vao.hpp b/src/mbgl/geometry/vao.hpp index 6821be182ab..aa0a72ec592 100644 --- a/src/mbgl/geometry/vao.hpp +++ b/src/mbgl/geometry/vao.hpp @@ -10,8 +10,6 @@ namespace mbgl { -class Shader; - class VertexArrayObject : public util::noncopyable { public: static void Unbind(); @@ -19,8 +17,8 @@ class VertexArrayObject : public util::noncopyable { VertexArrayObject(); ~VertexArrayObject(); - template - void bind(Shader& shader, VertexBuffer &vertexBuffer, GLbyte *offset, gl::ObjectStore& store) { + template + void bind(Shader& shader, VertexBuffer& vertexBuffer, GLbyte* offset, gl::ObjectStore& store) { bindVertexArrayObject(store); if (bound_shader == 0) { vertexBuffer.bind(store); @@ -33,8 +31,8 @@ class VertexArrayObject : public util::noncopyable { } } - template - void bind(Shader& shader, VertexBuffer &vertexBuffer, ElementsBuffer &elementsBuffer, GLbyte *offset, gl::ObjectStore& store) { + template + void bind(Shader& shader, VertexBuffer& vertexBuffer, ElementsBuffer& elementsBuffer, GLbyte* offset, gl::ObjectStore& store) { bindVertexArrayObject(store); if (bound_shader == 0) { vertexBuffer.bind(store); @@ -62,7 +60,7 @@ class VertexArrayObject : public util::noncopyable { // For debug reasons, we're storing the bind information so that we can // detect errors and report GLuint bound_shader = 0; - const char *bound_shader_name = ""; + const char* bound_shader_name = ""; GLuint bound_vertex_buffer = 0; GLuint bound_elements_buffer = 0; GLbyte *bound_offset = nullptr; diff --git a/src/mbgl/shader/circle_shader.cpp b/src/mbgl/shader/circle_shader.cpp index 2865769ee27..e1328bcbf19 100644 --- a/src/mbgl/shader/circle_shader.cpp +++ b/src/mbgl/shader/circle_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::circle; CircleShader::CircleShader(gl::ObjectStore& store) - : Shader("circle", shaders::circle::vertex, shaders::circle::fragment, store) { + : Shader(::name, ::vertex, ::fragment, store) { } void CircleShader::bind(GLbyte* offset) { diff --git a/src/mbgl/shader/collision_box_shader.cpp b/src/mbgl/shader/collision_box_shader.cpp index cf4ff81e965..7d6473ee293 100644 --- a/src/mbgl/shader/collision_box_shader.cpp +++ b/src/mbgl/shader/collision_box_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::collisionbox; CollisionBoxShader::CollisionBoxShader(gl::ObjectStore& store) - : Shader("collisionbox", shaders::collisionbox::vertex, shaders::collisionbox::fragment, store) + : Shader(::name, ::vertex, ::fragment, store) , a_extrude(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_extrude"))) , a_data(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_data"))) { } diff --git a/src/mbgl/shader/icon_shader.cpp b/src/mbgl/shader/icon_shader.cpp index 7fb0335dc85..f4568e6c3da 100644 --- a/src/mbgl/shader/icon_shader.cpp +++ b/src/mbgl/shader/icon_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::icon; IconShader::IconShader(gl::ObjectStore& store) - : Shader("icon", shaders::icon::vertex, shaders::icon::fragment, store) + : Shader(::name, ::vertex, ::fragment, store) , a_offset(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_offset"))) , a_data1(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_data1"))) , a_data2(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_data2"))) { diff --git a/src/mbgl/shader/line_shader.cpp b/src/mbgl/shader/line_shader.cpp index f21384082f0..729b34d557f 100644 --- a/src/mbgl/shader/line_shader.cpp +++ b/src/mbgl/shader/line_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::line; LineShader::LineShader(gl::ObjectStore& store) - : Shader("line", shaders::line::vertex, shaders::line::fragment, store) + : Shader(::name, ::vertex, ::fragment, store) , a_data(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_data"))) { } diff --git a/src/mbgl/shader/linepattern_shader.cpp b/src/mbgl/shader/linepattern_shader.cpp index a9923233af7..dc970a5661e 100644 --- a/src/mbgl/shader/linepattern_shader.cpp +++ b/src/mbgl/shader/linepattern_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::linepattern; LinepatternShader::LinepatternShader(gl::ObjectStore& store) - : Shader("linepattern", shaders::linepattern::vertex, shaders::linepattern::fragment, store) + : Shader(::name, ::vertex, ::fragment, store) , a_data(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_data"))) { } diff --git a/src/mbgl/shader/linesdf_shader.cpp b/src/mbgl/shader/linesdf_shader.cpp index b316d2562d2..29b67f4de51 100644 --- a/src/mbgl/shader/linesdf_shader.cpp +++ b/src/mbgl/shader/linesdf_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::linesdfpattern; LineSDFShader::LineSDFShader(gl::ObjectStore& store) - : Shader("linesdfpattern", shaders::linesdfpattern::vertex, shaders::linesdfpattern::fragment, store) + : Shader(::name, ::vertex, ::fragment, store) , a_data(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_data"))) { } diff --git a/src/mbgl/shader/outline_shader.cpp b/src/mbgl/shader/outline_shader.cpp index 58a647f3751..09aff361c32 100644 --- a/src/mbgl/shader/outline_shader.cpp +++ b/src/mbgl/shader/outline_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::outline; OutlineShader::OutlineShader(gl::ObjectStore& store) - : Shader("outline", shaders::outline::vertex, shaders::outline::fragment, store) { + : Shader(::name, ::vertex, ::fragment, store) { } void OutlineShader::bind(GLbyte* offset) { diff --git a/src/mbgl/shader/outlinepattern_shader.cpp b/src/mbgl/shader/outlinepattern_shader.cpp index 5ffa458a4ff..0af8558587f 100644 --- a/src/mbgl/shader/outlinepattern_shader.cpp +++ b/src/mbgl/shader/outlinepattern_shader.cpp @@ -3,16 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::outlinepattern; OutlinePatternShader::OutlinePatternShader(gl::ObjectStore& store) - : Shader( - "outlinepattern", - shaders::outlinepattern::vertex, shaders::outlinepattern::fragment, - store - ) { + : Shader(::name, ::vertex, ::fragment, store) { } void OutlinePatternShader::bind(GLbyte *offset) { diff --git a/src/mbgl/shader/pattern_shader.cpp b/src/mbgl/shader/pattern_shader.cpp index 64a72d14518..a7ddc681d46 100644 --- a/src/mbgl/shader/pattern_shader.cpp +++ b/src/mbgl/shader/pattern_shader.cpp @@ -3,16 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::pattern; PatternShader::PatternShader(gl::ObjectStore& store) - : Shader( - "pattern", - shaders::pattern::vertex, shaders::pattern::fragment, - store - ) { + : Shader(::name, ::vertex, ::fragment, store) { } void PatternShader::bind(GLbyte *offset) { diff --git a/src/mbgl/shader/plain_shader.cpp b/src/mbgl/shader/plain_shader.cpp index c030a2d7b31..257f49e1e22 100644 --- a/src/mbgl/shader/plain_shader.cpp +++ b/src/mbgl/shader/plain_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::fill; PlainShader::PlainShader(gl::ObjectStore& store) - : Shader("fill", shaders::fill::vertex, shaders::fill::fragment, store) { + : Shader(::name, ::vertex, ::fragment, store) { } void PlainShader::bind(GLbyte* offset) { diff --git a/src/mbgl/shader/raster_shader.cpp b/src/mbgl/shader/raster_shader.cpp index e5e290beddf..b310212731d 100644 --- a/src/mbgl/shader/raster_shader.cpp +++ b/src/mbgl/shader/raster_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::raster; RasterShader::RasterShader(gl::ObjectStore& store) - : Shader("raster", shaders::raster::vertex, shaders::raster::fragment, store) { + : Shader(::name, ::vertex, ::fragment, store) { } void RasterShader::bind(GLbyte* offset) { diff --git a/src/mbgl/shader/sdf_shader.cpp b/src/mbgl/shader/sdf_shader.cpp index 76ea1e3b4d5..1a08bef16e6 100644 --- a/src/mbgl/shader/sdf_shader.cpp +++ b/src/mbgl/shader/sdf_shader.cpp @@ -3,12 +3,11 @@ #include #include -#include - using namespace mbgl; +using namespace shaders::sdf; SDFShader::SDFShader(gl::ObjectStore& store) - : Shader("sdf", shaders::sdf::vertex, shaders::sdf::fragment, store) + : Shader(::name, ::vertex, ::fragment, store) , a_offset(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_offset"))) , a_data1(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_data1"))) , a_data2(MBGL_CHECK_ERROR(glGetAttribLocation(getID(), "a_data2"))) { diff --git a/src/mbgl/shader/shader.cpp b/src/mbgl/shader/shader.cpp index 23ea0437208..e2c7776e4d5 100644 --- a/src/mbgl/shader/shader.cpp +++ b/src/mbgl/shader/shader.cpp @@ -13,7 +13,7 @@ namespace mbgl { -Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSource, gl::ObjectStore& store) +Shader::Shader(const char* name_, const char* vertexSource, const char* fragmentSource, gl::ObjectStore& store) : name(name_) , program(store.createProgram()) , vertexShader(store.createShader(GL_VERTEX_SHADER)) @@ -21,13 +21,13 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo { util::stopwatch stopwatch("shader compilation", Event::Shader); - if (!compileShader(vertexShader, &vertSource)) { - Log::Error(Event::Shader, "Vertex shader %s failed to compile: %s", name, vertSource); + if (!compileShader(vertexShader, &vertexSource)) { + Log::Error(Event::Shader, "Vertex shader %s failed to compile: %s", name, vertexSource); throw util::ShaderException(std::string { "Vertex shader " } + name + " failed to compile"); } - if (!compileShader(fragmentShader, &fragSource)) { - Log::Error(Event::Shader, "Fragment shader %s failed to compile: %s", name, fragSource); + if (!compileShader(fragmentShader, &fragmentSource)) { + Log::Error(Event::Shader, "Fragment shader %s failed to compile: %s", name, fragmentSource); throw util::ShaderException(std::string { "Fragment shader " } + name + " failed to compile"); } diff --git a/src/mbgl/shader/shader.hpp b/src/mbgl/shader/shader.hpp index 1cb2a5601f3..3ba1e044c7f 100644 --- a/src/mbgl/shader/shader.hpp +++ b/src/mbgl/shader/shader.hpp @@ -8,10 +8,8 @@ namespace mbgl { class Shader : private util::noncopyable { public: - Shader(const GLchar *name, const GLchar *vertex, const GLchar *fragment, gl::ObjectStore&); - ~Shader(); - const GLchar *name; + const char* name; GLuint getID() const { return program.get(); @@ -20,6 +18,7 @@ class Shader : private util::noncopyable { virtual void bind(GLbyte *offset) = 0; protected: + Shader(const char* name_, const char* vertex, const char* fragment, gl::ObjectStore&); GLint a_pos = -1; private: From 9038d66af60bca616d0f34cda593409daa06271c Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Sat, 18 Jun 2016 12:03:19 +0300 Subject: [PATCH 2/6] [core] Added missing BlendFunc operator --- include/mbgl/gl/gl_values.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/mbgl/gl/gl_values.hpp b/include/mbgl/gl/gl_values.hpp index 03ae46a60e9..34932dd408a 100644 --- a/include/mbgl/gl/gl_values.hpp +++ b/include/mbgl/gl/gl_values.hpp @@ -210,6 +210,10 @@ struct BlendFunc { } }; +constexpr bool operator!=(const BlendFunc::Type& a, const BlendFunc::Type& b) { + return a.sfactor != b.sfactor || a.dfactor != b.dfactor; +} + struct Program { using Type = GLuint; static const Type Default; From 7e549b90202655ca0de9f503178f42012c534dbc Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Sat, 18 Jun 2016 12:03:47 +0300 Subject: [PATCH 3/6] [core] Added BlendColor GL config value --- include/mbgl/gl/gl_values.hpp | 13 +++++++++++++ src/mbgl/gl/gl_config.cpp | 1 + src/mbgl/gl/gl_config.hpp | 3 +++ 3 files changed, 17 insertions(+) diff --git a/include/mbgl/gl/gl_values.hpp b/include/mbgl/gl/gl_values.hpp index 34932dd408a..1e05984fbcd 100644 --- a/include/mbgl/gl/gl_values.hpp +++ b/include/mbgl/gl/gl_values.hpp @@ -214,6 +214,19 @@ constexpr bool operator!=(const BlendFunc::Type& a, const BlendFunc::Type& b) { return a.sfactor != b.sfactor || a.dfactor != b.dfactor; } +struct BlendColor { + using Type = Color; + static const Type Default; + inline static void Set(const Type& value) { + MBGL_CHECK_ERROR(glBlendColor(value.r, value.g, value.b, value.a)); + } + inline static Type Get() { + GLfloat floats[4]; + MBGL_CHECK_ERROR(glGetFloatv(GL_BLEND_COLOR, floats)); + return { floats[0], floats[1], floats[2], floats[3] }; + } +}; + struct Program { using Type = GLuint; static const Type Default; diff --git a/src/mbgl/gl/gl_config.cpp b/src/mbgl/gl/gl_config.cpp index c3c6601e432..97d2f26f6cc 100644 --- a/src/mbgl/gl/gl_config.cpp +++ b/src/mbgl/gl/gl_config.cpp @@ -13,6 +13,7 @@ const DepthTest::Type DepthTest::Default = GL_FALSE; const DepthFunc::Type DepthFunc::Default = GL_LEQUAL; const Blend::Type Blend::Default = GL_TRUE; const BlendFunc::Type BlendFunc::Default = { GL_ONE, GL_ONE_MINUS_SRC_ALPHA }; +const BlendColor::Type BlendColor::Default = { 0, 0, 0, 0 }; const ColorMask::Type ColorMask::Default = { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE }; const ClearDepth::Type ClearDepth::Default = 1; const ClearColor::Type ClearColor::Default = { 0, 0, 0, 0 }; diff --git a/src/mbgl/gl/gl_config.hpp b/src/mbgl/gl/gl_config.hpp index 66f44065308..09080ca3658 100644 --- a/src/mbgl/gl/gl_config.hpp +++ b/src/mbgl/gl/gl_config.hpp @@ -56,6 +56,7 @@ class Config { depthFunc.reset(); blend.reset(); blendFunc.reset(); + blendColor.reset(); colorMask.reset(); clearDepth.reset(); clearColor.reset(); @@ -80,6 +81,7 @@ class Config { depthFunc.setDirty(); blend.setDirty(); blendFunc.setDirty(); + blendColor.setDirty(); colorMask.setDirty(); clearDepth.setDirty(); clearColor.setDirty(); @@ -103,6 +105,7 @@ class Config { Value depthFunc; Value blend; Value blendFunc; + Value blendColor; Value colorMask; Value clearDepth; Value clearColor; From df5a39570819abc6e083bee8bc1fc9da8d92b68c Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Sat, 18 Jun 2016 19:11:30 +0300 Subject: [PATCH 4/6] [core] Refactor wireframe to match JS overdraw mode --- src/mbgl/map/map.cpp | 2 +- src/mbgl/renderer/painter.cpp | 13 +++-- src/mbgl/renderer/painter.hpp | 2 + src/mbgl/renderer/painter_background.cpp | 16 ++----- src/mbgl/renderer/painter_circle.cpp | 2 +- src/mbgl/renderer/painter_fill.cpp | 22 +++------ src/mbgl/renderer/painter_line.cpp | 17 ++----- src/mbgl/renderer/painter_raster.cpp | 2 +- src/mbgl/renderer/painter_symbol.cpp | 4 +- src/mbgl/shader/shader.cpp | 61 ++++++++++++++++-------- src/mbgl/shader/shader.hpp | 11 ++++- src/mbgl/style/style.cpp | 7 ++- src/mbgl/style/style.hpp | 2 +- 13 files changed, 91 insertions(+), 70 deletions(-) diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 11bc89a1a04..f4cca3b2b5c 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -794,7 +794,7 @@ void Map::cycleDebugOptions() { impl->debugOptions = MapDebugOptions::NoDebug; #endif // GL_ES_VERSION_2_0 else if (impl->debugOptions & MapDebugOptions::Collision) - impl->debugOptions = MapDebugOptions::Collision | MapDebugOptions::Wireframe; + impl->debugOptions = MapDebugOptions::Wireframe; else if (impl->debugOptions & MapDebugOptions::Timestamps) impl->debugOptions = impl->debugOptions | MapDebugOptions::Collision; else if (impl->debugOptions & MapDebugOptions::ParseStatus) diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index ca536f66718..fae5c74d7bb 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -92,7 +92,7 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a spriteAtlas = style.spriteAtlas.get(); lineAtlas = style.lineAtlas.get(); - RenderData renderData = style.getRenderData(); + RenderData renderData = style.getRenderData(frame.debugOptions); const std::vector& order = renderData.order; const std::set& sources = renderData.sources; const Color& background = renderData.backgroundColor; @@ -144,7 +144,12 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a config.depthTest = GL_FALSE; config.depthMask = GL_TRUE; config.colorMask = { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE }; - if (frame.debugOptions & MapDebugOptions::Wireframe) { + + if (isWireframe()) { + config.blend = GL_TRUE; + config.blendFunc = { GL_CONSTANT_COLOR, GL_ONE }; + const float overdraw = 1.0f / 8.0f; + config.blendColor = { overdraw, overdraw, overdraw, 0.0f }; config.clearColor = Color::black(); } else { config.clearColor = background; @@ -243,7 +248,9 @@ void Painter::renderPass(RenderPass pass_, if (!layer.baseImpl->hasRenderPass(pass)) continue; - if (pass == RenderPass::Translucent) { + if (isWireframe()) { + config.blend = GL_TRUE; + } else if (pass == RenderPass::Translucent) { config.blendFunc.reset(); config.blend = GL_TRUE; } else { diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 4c51543bde5..d2d722ef7f9 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -156,6 +156,8 @@ class Painter : private util::noncopyable { void setDepthSublayer(int n); + bool isWireframe() const { return frame.debugOptions & MapDebugOptions::Wireframe; } + mat4 projMatrix; mat4 nativeMatrix; diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp index 022d3dd7abf..f9a67ee59c4 100644 --- a/src/mbgl/renderer/painter_background.cpp +++ b/src/mbgl/renderer/painter_background.cpp @@ -21,9 +21,6 @@ void Painter::renderBackground(const BackgroundLayer& layer) { optional imagePosA; optional imagePosB; - bool wireframe = frame.debugOptions & MapDebugOptions::Wireframe; - isPatterned &= !wireframe; - if (isPatterned) { imagePosA = spriteAtlas->getPosition(properties.backgroundPattern.value.from, true); imagePosB = spriteAtlas->getPosition(properties.backgroundPattern.value.to, true); @@ -31,7 +28,7 @@ void Painter::renderBackground(const BackgroundLayer& layer) { if (!imagePosA || !imagePosB) return; - config.program = patternShader->getID(); + config.program = isWireframe() ? patternShader->getOverdrawID() : patternShader->getID(); patternShader->u_matrix = identityMatrix; patternShader->u_pattern_tl_a = imagePosA->tl; patternShader->u_pattern_br_a = imagePosA->br; @@ -44,15 +41,10 @@ void Painter::renderBackground(const BackgroundLayer& layer) { backgroundPatternArray.bind(*patternShader, tileStencilBuffer, BUFFER_OFFSET(0), store); } else { - if (wireframe) { - plainShader->u_color = Color::black(); - plainShader->u_opacity = 1.0f; - } else { - plainShader->u_color = properties.backgroundColor; - plainShader->u_opacity = properties.backgroundOpacity; - } + plainShader->u_color = properties.backgroundColor; + plainShader->u_opacity = properties.backgroundOpacity; - config.program = plainShader->getID(); + config.program = isWireframe() ? plainShader->getOverdrawID() : plainShader->getID(); backgroundArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET(0), store); } diff --git a/src/mbgl/renderer/painter_circle.cpp b/src/mbgl/renderer/painter_circle.cpp index 24cc9806e92..d92ca1ae9b2 100644 --- a/src/mbgl/renderer/painter_circle.cpp +++ b/src/mbgl/renderer/painter_circle.cpp @@ -27,7 +27,7 @@ void Painter::renderCircle(CircleBucket& bucket, mat4 vtxMatrix = translatedMatrix(matrix, properties.circleTranslate, tileID, properties.circleTranslateAnchor); - config.program = circleShader->getID(); + config.program = isWireframe() ? circleShader->getOverdrawID() : circleShader->getID(); circleShader->u_matrix = vtxMatrix; circleShader->u_extrude_scale = extrudeScale; diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp index 710fa444e20..62e808614e1 100644 --- a/src/mbgl/renderer/painter_fill.cpp +++ b/src/mbgl/renderer/painter_fill.cpp @@ -36,16 +36,6 @@ void Painter::renderFill(FillBucket& bucket, bool outline = properties.fillAntialias && !pattern && isOutlineColorDefined; bool fringeline = properties.fillAntialias && !pattern && !isOutlineColorDefined; - bool wireframe = frame.debugOptions & MapDebugOptions::Wireframe; - if (wireframe) { - fillColor = Color::white(); - strokeColor = Color::white(); - opacity = 1.0f; - pattern = false; - outline = true; - fringeline = true; - } - config.stencilOp.reset(); config.stencilTest = GL_TRUE; config.depthFunc.reset(); @@ -56,7 +46,7 @@ void Painter::renderFill(FillBucket& bucket, // Because we're drawing top-to-bottom, and we update the stencil mask // befrom, we have to draw the outline first (!) if (outline && pass == RenderPass::Translucent) { - config.program = outlineShader->getID(); + config.program = isWireframe() ? outlineShader->getOverdrawID() : outlineShader->getID(); outlineShader->u_matrix = vertexMatrix; outlineShader->u_outline_color = strokeColor; @@ -86,7 +76,7 @@ void Painter::renderFill(FillBucket& bucket, // Image fill. if (pass == RenderPass::Translucent && imagePosA && imagePosB) { - config.program = patternShader->getID(); + config.program = isWireframe() ? patternShader->getOverdrawID() : patternShader->getID(); patternShader->u_matrix = vertexMatrix; patternShader->u_pattern_tl_a = imagePosA->tl; patternShader->u_pattern_br_a = imagePosA->br; @@ -115,7 +105,7 @@ void Painter::renderFill(FillBucket& bucket, bucket.drawElements(*patternShader, store); if (properties.fillAntialias && !isOutlineColorDefined) { - config.program = outlinePatternShader->getID(); + config.program = isWireframe() ? outlinePatternShader->getOverdrawID() : outlinePatternShader->getID(); outlinePatternShader->u_matrix = vertexMatrix; // Draw the entire line @@ -143,14 +133,14 @@ void Painter::renderFill(FillBucket& bucket, bucket.drawVertices(*outlinePatternShader, store); } } - } else if (!wireframe) { + } else { // No image fill. if ((fillColor.a >= 1.0f && opacity >= 1.0f) == (pass == RenderPass::Opaque)) { // Only draw the fill when it's either opaque and we're drawing opaque // fragments or when it's translucent and we're drawing translucent // fragments // Draw filling rectangle. - config.program = plainShader->getID(); + config.program = isWireframe() ? plainShader->getOverdrawID() : plainShader->getID(); plainShader->u_matrix = vertexMatrix; plainShader->u_color = fillColor; plainShader->u_opacity = opacity; @@ -164,7 +154,7 @@ void Painter::renderFill(FillBucket& bucket, // Because we're drawing top-to-bottom, and we update the stencil mask // below, we have to draw the outline first (!) if (fringeline && pass == RenderPass::Translucent) { - config.program = outlineShader->getID(); + config.program = isWireframe() ? outlineShader->getOverdrawID() : outlineShader->getID(); outlineShader->u_matrix = vertexMatrix; outlineShader->u_outline_color = fillColor; diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp index bb759abc5f2..447e3f74004 100644 --- a/src/mbgl/renderer/painter_line.cpp +++ b/src/mbgl/renderer/painter_line.cpp @@ -33,17 +33,10 @@ void Painter::renderLine(LineBucket& bucket, // Retina devices need a smaller distance to avoid aliasing. float antialiasing = 1.0 / frame.pixelRatio; - bool wireframe = frame.debugOptions & MapDebugOptions::Wireframe; - float blur = properties.lineBlur + antialiasing; - Color color = Color::white(); - float opacity = 1.0f; - if (!wireframe) { - color = properties.lineColor; - opacity = properties.lineOpacity; - } - + const Color color = properties.lineColor; + const float opacity = properties.lineOpacity; const float ratio = 1.0 / tileID.pixelsToTileUnits(1.0, state.getZoom()); mat2 antialiasingMatrix; @@ -64,7 +57,7 @@ void Painter::renderLine(LineBucket& bucket, if (!properties.lineDasharray.value.from.empty()) { - config.program = linesdfShader->getID(); + config.program = isWireframe() ? linesdfShader->getOverdrawID() : linesdfShader->getID(); linesdfShader->u_matrix = vtxMatrix; linesdfShader->u_linewidth = properties.lineWidth / 2; @@ -109,7 +102,7 @@ void Painter::renderLine(LineBucket& bucket, if (!imagePosA || !imagePosB) return; - config.program = linepatternShader->getID(); + config.program = isWireframe() ? linepatternShader->getOverdrawID() : linepatternShader->getID(); linepatternShader->u_matrix = vtxMatrix; linepatternShader->u_linewidth = properties.lineWidth / 2; @@ -145,7 +138,7 @@ void Painter::renderLine(LineBucket& bucket, bucket.drawLinePatterns(*linepatternShader, store); } else { - config.program = lineShader->getID(); + config.program = isWireframe() ? lineShader->getOverdrawID() : lineShader->getID(); lineShader->u_matrix = vtxMatrix; lineShader->u_linewidth = properties.lineWidth / 2; diff --git a/src/mbgl/renderer/painter_raster.cpp b/src/mbgl/renderer/painter_raster.cpp index f3a0b720e79..6394d61dcce 100644 --- a/src/mbgl/renderer/painter_raster.cpp +++ b/src/mbgl/renderer/painter_raster.cpp @@ -18,7 +18,7 @@ void Painter::renderRaster(RasterBucket& bucket, const RasterPaintProperties& properties = layer.impl->paint; if (bucket.hasData()) { - config.program = rasterShader->getID(); + config.program = isWireframe() ? rasterShader->getOverdrawID() : rasterShader->getID(); rasterShader->u_matrix = matrix; rasterShader->u_buffer = 0; rasterShader->u_opacity = properties.rasterOpacity; diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp index b65ae34a123..374500986b9 100644 --- a/src/mbgl/renderer/painter_symbol.cpp +++ b/src/mbgl/renderer/painter_symbol.cpp @@ -58,7 +58,7 @@ void Painter::renderSDF(SymbolBucket &bucket, exScale = {{ exScale[0] * scale, exScale[1] * scale }}; } - config.program = sdfShader.getID(); + config.program = isWireframe() ? sdfShader.getOverdrawID() : sdfShader.getID(); sdfShader.u_matrix = vtxMatrix; sdfShader.u_extrude_scale = exScale; sdfShader.u_texsize = texsize; @@ -199,7 +199,7 @@ void Painter::renderSymbol(SymbolBucket& bucket, exScale = {{ exScale[0] * scale, exScale[1] * scale }}; } - config.program = iconShader->getID(); + config.program = isWireframe() ? iconShader->getOverdrawID() : iconShader->getID(); iconShader->u_matrix = vtxMatrix; iconShader->u_extrude_scale = exScale; iconShader->u_texsize = {{ float(activeSpriteAtlas->getWidth()) / 4.0f, float(activeSpriteAtlas->getHeight()) / 4.0f }}; diff --git a/src/mbgl/shader/shader.cpp b/src/mbgl/shader/shader.cpp index e2c7776e4d5..80c4c33efc5 100644 --- a/src/mbgl/shader/shader.cpp +++ b/src/mbgl/shader/shader.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -21,12 +22,12 @@ Shader::Shader(const char* name_, const char* vertexSource, const char* fragment { util::stopwatch stopwatch("shader compilation", Event::Shader); - if (!compileShader(vertexShader, &vertexSource)) { + if (!compileShader(vertexShader, vertexSource)) { Log::Error(Event::Shader, "Vertex shader %s failed to compile: %s", name, vertexSource); throw util::ShaderException(std::string { "Vertex shader " } + name + " failed to compile"); } - if (!compileShader(fragmentShader, &fragmentSource)) { + if (!compileShader(fragmentShader, fragmentSource)) { Log::Error(Event::Shader, "Fragment shader %s failed to compile: %s", name, fragmentSource); throw util::ShaderException(std::string { "Fragment shader " } + name + " failed to compile"); } @@ -35,32 +36,50 @@ Shader::Shader(const char* name_, const char* vertexSource, const char* fragment MBGL_CHECK_ERROR(glAttachShader(program.get(), vertexShader.get())); MBGL_CHECK_ERROR(glAttachShader(program.get(), fragmentShader.get())); - { - // Link program - GLint status; - MBGL_CHECK_ERROR(glLinkProgram(program.get())); + linkProgram(program); - MBGL_CHECK_ERROR(glGetProgramiv(program.get(), GL_LINK_STATUS, &status)); - if (status == 0) { - GLint logLength; - MBGL_CHECK_ERROR(glGetProgramiv(program.get(), GL_INFO_LOG_LENGTH, &logLength)); - const auto log = std::make_unique(logLength); - if (logLength > 0) { - MBGL_CHECK_ERROR(glGetProgramInfoLog(program.get(), logLength, &logLength, log.get())); - Log::Error(Event::Shader, "Program failed to link: %s", log.get()); - } - throw util::ShaderException(std::string { "Program " } + name + " failed to link: " + log.get()); + std::string overdrawSource(fragmentSource); + if (overdrawSource.find("#ifdef OVERDRAW_INSPECTOR") != std::string::npos) { + programOverdraw = store.createProgram(); + overdrawShader = store.createShader(GL_FRAGMENT_SHADER); + + overdrawSource.replace(overdrawSource.find_first_of('\n'), 1, "\n#define OVERDRAW_INSPECTOR\n"); + if (!compileShader(*overdrawShader, overdrawSource.c_str())) { + Log::Error(Event::Shader, "Overdraw shader %s failed to compile: %s", name, overdrawSource.c_str()); + throw util::ShaderException(std::string { "Overdraw shader " } + name + " failed to compile"); } + + MBGL_CHECK_ERROR(glAttachShader(*programOverdraw, vertexShader.get())); + MBGL_CHECK_ERROR(glAttachShader(*programOverdraw, *overdrawShader)); + linkProgram(*programOverdraw); } a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program.get(), "a_pos")); } -bool Shader::compileShader(gl::UniqueShader& shader, const GLchar *source[]) { +void Shader::linkProgram(gl::UniqueProgram& program_) { + // Link program + GLint status; + MBGL_CHECK_ERROR(glLinkProgram(program_.get())); + + MBGL_CHECK_ERROR(glGetProgramiv(program_.get(), GL_LINK_STATUS, &status)); + if (status == 0) { + GLint logLength; + MBGL_CHECK_ERROR(glGetProgramiv(program_.get(), GL_INFO_LOG_LENGTH, &logLength)); + const auto log = std::make_unique(logLength); + if (logLength > 0) { + MBGL_CHECK_ERROR(glGetProgramInfoLog(program_.get(), logLength, &logLength, log.get())); + Log::Error(Event::Shader, "Program failed to link: %s", log.get()); + } + throw util::ShaderException(std::string { "Program " } + name + " failed to link: " + log.get()); + } +} + +bool Shader::compileShader(gl::UniqueShader& shader, const GLchar *source) { GLint status = 0; - const GLsizei lengths = static_cast(std::strlen(*source)); - MBGL_CHECK_ERROR(glShaderSource(shader.get(), 1, source, &lengths)); + const GLsizei lengths = static_cast(std::strlen(source)); + MBGL_CHECK_ERROR(glShaderSource(shader.get(), 1, &source, &lengths)); MBGL_CHECK_ERROR(glCompileShader(shader.get())); @@ -90,6 +109,10 @@ Shader::~Shader() { MBGL_CHECK_ERROR(glDetachShader(program.get(), vertexShader.get())); MBGL_CHECK_ERROR(glDetachShader(program.get(), fragmentShader.get())); } + if (programOverdraw) { + MBGL_CHECK_ERROR(glDetachShader(*programOverdraw, vertexShader.get())); + MBGL_CHECK_ERROR(glDetachShader(*programOverdraw, *overdrawShader)); + } } } // namespace mbgl diff --git a/src/mbgl/shader/shader.hpp b/src/mbgl/shader/shader.hpp index 3ba1e044c7f..4289b83a772 100644 --- a/src/mbgl/shader/shader.hpp +++ b/src/mbgl/shader/shader.hpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace mbgl { @@ -15,6 +16,10 @@ class Shader : private util::noncopyable { return program.get(); } + GLuint getOverdrawID() const { + return programOverdraw ? *programOverdraw : 0; + } + virtual void bind(GLbyte *offset) = 0; protected: @@ -22,11 +27,15 @@ class Shader : private util::noncopyable { GLint a_pos = -1; private: - bool compileShader(gl::UniqueShader&, const GLchar *source[]); + bool compileShader(gl::UniqueShader&, const GLchar *source); + void linkProgram(gl::UniqueProgram&); gl::UniqueProgram program; gl::UniqueShader vertexShader; gl::UniqueShader fragmentShader; + + mbgl::optional programOverdraw; + mbgl::optional overdrawShader; }; } // namespace mbgl diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index cfeff6d4003..c3bc5d73a01 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -258,7 +258,7 @@ bool Style::isLoaded() const { return true; } -RenderData Style::getRenderData() const { +RenderData Style::getRenderData(MapDebugOptions debugOptions) const { RenderData result; for (const auto& source : sources) { @@ -272,6 +272,11 @@ RenderData Style::getRenderData() const { continue; if (const BackgroundLayer* background = layer->as()) { + if (debugOptions & MapDebugOptions::Wireframe) { + // We want to skip glClear optimization in wireframe mode. + result.order.emplace_back(*layer); + continue; + } const BackgroundPaintProperties& paint = background->impl->paint; if (layer.get() == layers[0].get() && paint.backgroundPattern.value.from.empty()) { // This is a solid background. We can use glClear(). diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index 1a41c4ce408..35369ffca3c 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -74,7 +74,7 @@ class Style : public GlyphStoreObserver, void setClasses(const std::vector&, const TransitionOptions& = {}); std::vector getClasses() const; - RenderData getRenderData() const; + RenderData getRenderData(MapDebugOptions) const; std::vector queryRenderedFeatures(const QueryParameters&) const; From 97dffeb03dba6ae949ca9ce2e054ceab3acb99b7 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Mon, 20 Jun 2016 13:18:16 +0300 Subject: [PATCH 5/6] [core] s/Wireframe/Overdraw/g --- include/mbgl/map/mode.hpp | 2 +- platform/ios/CHANGELOG.md | 2 +- platform/ios/app/MBXViewController.m | 8 ++++---- platform/ios/src/MGLMapView.h | 5 ++--- platform/ios/src/MGLMapView.mm | 8 ++++---- platform/macos/CHANGELOG.md | 1 + platform/macos/app/Base.lproj/MainMenu.xib | 4 ++-- platform/macos/app/MapDocument.m | 10 +++++----- platform/macos/src/MGLMapView.h | 5 ++--- platform/macos/src/MGLMapView.mm | 8 ++++---- src/mbgl/map/map.cpp | 6 +++--- src/mbgl/renderer/painter.cpp | 4 ++-- src/mbgl/renderer/painter.hpp | 2 +- src/mbgl/renderer/painter_background.cpp | 4 ++-- src/mbgl/renderer/painter_circle.cpp | 2 +- src/mbgl/renderer/painter_fill.cpp | 10 +++++----- src/mbgl/renderer/painter_line.cpp | 6 +++--- src/mbgl/renderer/painter_raster.cpp | 2 +- src/mbgl/renderer/painter_symbol.cpp | 4 ++-- src/mbgl/style/style.cpp | 4 ++-- 20 files changed, 48 insertions(+), 49 deletions(-) diff --git a/include/mbgl/map/mode.hpp b/include/mbgl/map/mode.hpp index 80ba4d7563c..c9b9f609535 100644 --- a/include/mbgl/map/mode.hpp +++ b/include/mbgl/map/mode.hpp @@ -43,7 +43,7 @@ enum class MapDebugOptions : EnumType { ParseStatus = 1 << 2, Timestamps = 1 << 3, Collision = 1 << 4, - Wireframe = 1 << 5, + Overdraw = 1 << 5, // FIXME: https://github.com/mapbox/mapbox-gl-native/issues/5117 #ifndef GL_ES_VERSION_2_0 StencilClip = 1 << 6, diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 63bd5b96408..b98819b10b4 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -33,7 +33,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CON - Removed unused SVG files from the SDK’s resource bundle. ([#4641](https://github.com/mapbox/mapbox-gl-native/pull/4641)) - Deprecated `-[MGLMapView emptyMemoryCache]`. ([#4725](https://github.com/mapbox/mapbox-gl-native/pull/4725)) - Added `MGLCoordinateInCoordinateBounds()`, a function that tests whether or not a coordinate is in a given bounds. ([#5053](https://github.com/mapbox/mapbox-gl-native/pull/5053)) -- Added a new option to `MGLMapDebugMaskOptions`, `MGLMapDebugWireframesMask`, that shows wireframes instead of the usual rendered output. ([#4359](https://github.com/mapbox/mapbox-gl-native/pull/4359)) +- Added a new option to `MGLMapDebugMaskOptions`, `MGLMapDebugOverdrawsMask`, that shows wireframes for overdraw inspection instead of the usual rendered output. ([#4359](https://github.com/mapbox/mapbox-gl-native/pull/4359)) ## 3.2.3 diff --git a/platform/ios/app/MBXViewController.m b/platform/ios/app/MBXViewController.m index 8317aee1d99..7bdc023c4df 100644 --- a/platform/ios/app/MBXViewController.m +++ b/platform/ios/app/MBXViewController.m @@ -181,9 +181,9 @@ - (IBAction)showSettings:(__unused id)sender ((debugMask & MGLMapDebugCollisionBoxesMask) ? @"Hide Collision Boxes" : @"Show Collision Boxes"), - ((debugMask & MGLMapDebugWireframesMask) - ? @"Hide Wireframes" - : @"Show Wireframes"), + ((debugMask & MGLMapDebugOverdrawsMask) + ? @"Hide Overdraws" + : @"Show Overdraws"), @"Add 100 Points", @"Add 1,000 Points", @"Add 10,000 Points", @@ -226,7 +226,7 @@ - (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSIn } else if (buttonIndex == actionSheet.firstOtherButtonIndex + 5) { - self.mapView.debugMask ^= MGLMapDebugWireframesMask; + self.mapView.debugMask ^= MGLMapDebugOverdrawsMask; } else if (buttonIndex == actionSheet.firstOtherButtonIndex + 6) { diff --git a/platform/ios/src/MGLMapView.h b/platform/ios/src/MGLMapView.h index 1319228c1ad..5fffc4323d0 100644 --- a/platform/ios/src/MGLMapView.h +++ b/platform/ios/src/MGLMapView.h @@ -43,9 +43,8 @@ typedef NS_OPTIONS(NSUInteger, MGLMapDebugMaskOptions) { /** Edges of glyphs and symbols are shown as faint, green lines to help diagnose collision and label placement issues. */ MGLMapDebugCollisionBoxesMask = 1 << 4, - /** Line widths, backgrounds, and fill colors are ignored to create a - wireframe effect. */ - MGLMapDebugWireframesMask = 1 << 5, + /** Overdraw inspector. */ + MGLMapDebugOverdrawsMask = 1 << 5, }; /** diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm index b9d44a9a05c..8a255a391b6 100644 --- a/platform/ios/src/MGLMapView.mm +++ b/platform/ios/src/MGLMapView.mm @@ -1829,9 +1829,9 @@ - (MGLMapDebugMaskOptions)debugMask { mask |= MGLMapDebugCollisionBoxesMask; } - if (options & mbgl::MapDebugOptions::Wireframe) + if (options & mbgl::MapDebugOptions::Overdraw) { - mask |= MGLMapDebugWireframesMask; + mask |= MGLMapDebugOverdrawsMask; } return mask; } @@ -1855,9 +1855,9 @@ - (void)setDebugMask:(MGLMapDebugMaskOptions)debugMask { options |= mbgl::MapDebugOptions::Collision; } - if (debugMask & MGLMapDebugWireframesMask) + if (debugMask & MGLMapDebugOverdrawsMask) { - options |= mbgl::MapDebugOptions::Wireframe; + options |= mbgl::MapDebugOptions::Overdraw; } _mbglMap->setDebug(options); } diff --git a/platform/macos/CHANGELOG.md b/platform/macos/CHANGELOG.md index bf7333bc54a..f41ca3ce9ea 100644 --- a/platform/macos/CHANGELOG.md +++ b/platform/macos/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog for Mapbox macOS SDK ## master +* Refactor wireframe mode to match GL JS overdraw implementation. ([#5403](https://github.com/mapbox/mapbox-gl-native/pull/5403)). ## 0.2.0 diff --git a/platform/macos/app/Base.lproj/MainMenu.xib b/platform/macos/app/Base.lproj/MainMenu.xib index 74cfb263882..ae10fe5d318 100644 --- a/platform/macos/app/Base.lproj/MainMenu.xib +++ b/platform/macos/app/Base.lproj/MainMenu.xib @@ -461,10 +461,10 @@ - + - + diff --git a/platform/macos/app/MapDocument.m b/platform/macos/app/MapDocument.m index a6c9e628292..8c3922e2d08 100644 --- a/platform/macos/app/MapDocument.m +++ b/platform/macos/app/MapDocument.m @@ -276,8 +276,8 @@ - (IBAction)toggleCollisionBoxes:(id)sender { self.mapView.debugMask ^= MGLMapDebugCollisionBoxesMask; } -- (IBAction)toggleWireframes:(id)sender { - self.mapView.debugMask ^= MGLMapDebugWireframesMask; +- (IBAction)toggleOverdraws:(id)sender { + self.mapView.debugMask ^= MGLMapDebugOverdrawsMask; } - (IBAction)showColorBuffer:(id)sender { @@ -604,9 +604,9 @@ - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { menuItem.title = isShown ? @"Hide Collision Boxes" : @"Show Collision Boxes"; return YES; } - if (menuItem.action == @selector(toggleWireframes:)) { - BOOL isShown = self.mapView.debugMask & MGLMapDebugWireframesMask; - menuItem.title = isShown ? @"Hide Wireframes" : @"Show Wireframes"; + if (menuItem.action == @selector(toggleOverdraws:)) { + BOOL isShown = self.mapView.debugMask & MGLMapDebugOverdrawsMask; + menuItem.title = isShown ? @"Hide Overdraws" : @"Show Overdraws"; return YES; } if (menuItem.action == @selector(showColorBuffer:)) { diff --git a/platform/macos/src/MGLMapView.h b/platform/macos/src/MGLMapView.h index 7b3efd293b4..51df9e728aa 100644 --- a/platform/macos/src/MGLMapView.h +++ b/platform/macos/src/MGLMapView.h @@ -21,9 +21,8 @@ typedef NS_OPTIONS(NSUInteger, MGLMapDebugMaskOptions) { diagnose collision and label placement issues. */ MGLMapDebugCollisionBoxesMask = 1 << 4, - /** Line widths, backgrounds, and fill colors are ignored to create a - wireframe effect. */ - MGLMapDebugWireframesMask = 1 << 5, + /** Overdraw inspector. */ + MGLMapDebugOverdrawsMask = 1 << 5, /** The stencil buffer is shown instead of the color buffer. */ MGLMapDebugStencilBufferMask = 1 << 6, diff --git a/platform/macos/src/MGLMapView.mm b/platform/macos/src/MGLMapView.mm index e330116d0af..a24d47db9a3 100644 --- a/platform/macos/src/MGLMapView.mm +++ b/platform/macos/src/MGLMapView.mm @@ -2398,8 +2398,8 @@ - (MGLMapDebugMaskOptions)debugMask { if (options & mbgl::MapDebugOptions::Collision) { mask |= MGLMapDebugCollisionBoxesMask; } - if (options & mbgl::MapDebugOptions::Wireframe) { - mask |= MGLMapDebugWireframesMask; + if (options & mbgl::MapDebugOptions::Overdraw) { + mask |= MGLMapDebugOverdrawsMask; } if (options & mbgl::MapDebugOptions::StencilClip) { mask |= MGLMapDebugStencilBufferMask; @@ -2421,8 +2421,8 @@ - (void)setDebugMask:(MGLMapDebugMaskOptions)debugMask { if (debugMask & MGLMapDebugCollisionBoxesMask) { options |= mbgl::MapDebugOptions::Collision; } - if (debugMask & MGLMapDebugWireframesMask) { - options |= mbgl::MapDebugOptions::Wireframe; + if (debugMask & MGLMapDebugOverdrawsMask) { + options |= mbgl::MapDebugOptions::Overdraw; } if (debugMask & MGLMapDebugStencilBufferMask) { options |= mbgl::MapDebugOptions::StencilClip; diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index f4cca3b2b5c..fa7bebf9a67 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -787,14 +787,14 @@ void Map::cycleDebugOptions() { #ifndef GL_ES_VERSION_2_0 if (impl->debugOptions & MapDebugOptions::StencilClip) impl->debugOptions = MapDebugOptions::NoDebug; - else if (impl->debugOptions & MapDebugOptions::Wireframe) + else if (impl->debugOptions & MapDebugOptions::Overdraw) impl->debugOptions = MapDebugOptions::StencilClip; #else - if (impl->debugOptions & MapDebugOptions::Wireframe) + if (impl->debugOptions & MapDebugOptions::Overdraw) impl->debugOptions = MapDebugOptions::NoDebug; #endif // GL_ES_VERSION_2_0 else if (impl->debugOptions & MapDebugOptions::Collision) - impl->debugOptions = MapDebugOptions::Wireframe; + impl->debugOptions = MapDebugOptions::Overdraw; else if (impl->debugOptions & MapDebugOptions::Timestamps) impl->debugOptions = impl->debugOptions | MapDebugOptions::Collision; else if (impl->debugOptions & MapDebugOptions::ParseStatus) diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index fae5c74d7bb..56276c26c51 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -145,7 +145,7 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a config.depthMask = GL_TRUE; config.colorMask = { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE }; - if (isWireframe()) { + if (isOverdraw()) { config.blend = GL_TRUE; config.blendFunc = { GL_CONSTANT_COLOR, GL_ONE }; const float overdraw = 1.0f / 8.0f; @@ -248,7 +248,7 @@ void Painter::renderPass(RenderPass pass_, if (!layer.baseImpl->hasRenderPass(pass)) continue; - if (isWireframe()) { + if (isOverdraw()) { config.blend = GL_TRUE; } else if (pass == RenderPass::Translucent) { config.blendFunc.reset(); diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index d2d722ef7f9..1f511467d07 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -156,7 +156,7 @@ class Painter : private util::noncopyable { void setDepthSublayer(int n); - bool isWireframe() const { return frame.debugOptions & MapDebugOptions::Wireframe; } + bool isOverdraw() const { return frame.debugOptions & MapDebugOptions::Overdraw; } mat4 projMatrix; mat4 nativeMatrix; diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp index f9a67ee59c4..7ced6a5c4fa 100644 --- a/src/mbgl/renderer/painter_background.cpp +++ b/src/mbgl/renderer/painter_background.cpp @@ -28,7 +28,7 @@ void Painter::renderBackground(const BackgroundLayer& layer) { if (!imagePosA || !imagePosB) return; - config.program = isWireframe() ? patternShader->getOverdrawID() : patternShader->getID(); + config.program = isOverdraw() ? patternShader->getOverdrawID() : patternShader->getID(); patternShader->u_matrix = identityMatrix; patternShader->u_pattern_tl_a = imagePosA->tl; patternShader->u_pattern_br_a = imagePosA->br; @@ -44,7 +44,7 @@ void Painter::renderBackground(const BackgroundLayer& layer) { plainShader->u_color = properties.backgroundColor; plainShader->u_opacity = properties.backgroundOpacity; - config.program = isWireframe() ? plainShader->getOverdrawID() : plainShader->getID(); + config.program = isOverdraw() ? plainShader->getOverdrawID() : plainShader->getID(); backgroundArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET(0), store); } diff --git a/src/mbgl/renderer/painter_circle.cpp b/src/mbgl/renderer/painter_circle.cpp index d92ca1ae9b2..e72f8a994f4 100644 --- a/src/mbgl/renderer/painter_circle.cpp +++ b/src/mbgl/renderer/painter_circle.cpp @@ -27,7 +27,7 @@ void Painter::renderCircle(CircleBucket& bucket, mat4 vtxMatrix = translatedMatrix(matrix, properties.circleTranslate, tileID, properties.circleTranslateAnchor); - config.program = isWireframe() ? circleShader->getOverdrawID() : circleShader->getID(); + config.program = isOverdraw() ? circleShader->getOverdrawID() : circleShader->getID(); circleShader->u_matrix = vtxMatrix; circleShader->u_extrude_scale = extrudeScale; diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp index 62e808614e1..44cdbe74119 100644 --- a/src/mbgl/renderer/painter_fill.cpp +++ b/src/mbgl/renderer/painter_fill.cpp @@ -46,7 +46,7 @@ void Painter::renderFill(FillBucket& bucket, // Because we're drawing top-to-bottom, and we update the stencil mask // befrom, we have to draw the outline first (!) if (outline && pass == RenderPass::Translucent) { - config.program = isWireframe() ? outlineShader->getOverdrawID() : outlineShader->getID(); + config.program = isOverdraw() ? outlineShader->getOverdrawID() : outlineShader->getID(); outlineShader->u_matrix = vertexMatrix; outlineShader->u_outline_color = strokeColor; @@ -76,7 +76,7 @@ void Painter::renderFill(FillBucket& bucket, // Image fill. if (pass == RenderPass::Translucent && imagePosA && imagePosB) { - config.program = isWireframe() ? patternShader->getOverdrawID() : patternShader->getID(); + config.program = isOverdraw() ? patternShader->getOverdrawID() : patternShader->getID(); patternShader->u_matrix = vertexMatrix; patternShader->u_pattern_tl_a = imagePosA->tl; patternShader->u_pattern_br_a = imagePosA->br; @@ -105,7 +105,7 @@ void Painter::renderFill(FillBucket& bucket, bucket.drawElements(*patternShader, store); if (properties.fillAntialias && !isOutlineColorDefined) { - config.program = isWireframe() ? outlinePatternShader->getOverdrawID() : outlinePatternShader->getID(); + config.program = isOverdraw() ? outlinePatternShader->getOverdrawID() : outlinePatternShader->getID(); outlinePatternShader->u_matrix = vertexMatrix; // Draw the entire line @@ -140,7 +140,7 @@ void Painter::renderFill(FillBucket& bucket, // fragments or when it's translucent and we're drawing translucent // fragments // Draw filling rectangle. - config.program = isWireframe() ? plainShader->getOverdrawID() : plainShader->getID(); + config.program = isOverdraw() ? plainShader->getOverdrawID() : plainShader->getID(); plainShader->u_matrix = vertexMatrix; plainShader->u_color = fillColor; plainShader->u_opacity = opacity; @@ -154,7 +154,7 @@ void Painter::renderFill(FillBucket& bucket, // Because we're drawing top-to-bottom, and we update the stencil mask // below, we have to draw the outline first (!) if (fringeline && pass == RenderPass::Translucent) { - config.program = isWireframe() ? outlineShader->getOverdrawID() : outlineShader->getID(); + config.program = isOverdraw() ? outlineShader->getOverdrawID() : outlineShader->getID(); outlineShader->u_matrix = vertexMatrix; outlineShader->u_outline_color = fillColor; diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp index 447e3f74004..206255095d8 100644 --- a/src/mbgl/renderer/painter_line.cpp +++ b/src/mbgl/renderer/painter_line.cpp @@ -57,7 +57,7 @@ void Painter::renderLine(LineBucket& bucket, if (!properties.lineDasharray.value.from.empty()) { - config.program = isWireframe() ? linesdfShader->getOverdrawID() : linesdfShader->getID(); + config.program = isOverdraw() ? linesdfShader->getOverdrawID() : linesdfShader->getID(); linesdfShader->u_matrix = vtxMatrix; linesdfShader->u_linewidth = properties.lineWidth / 2; @@ -102,7 +102,7 @@ void Painter::renderLine(LineBucket& bucket, if (!imagePosA || !imagePosB) return; - config.program = isWireframe() ? linepatternShader->getOverdrawID() : linepatternShader->getID(); + config.program = isOverdraw() ? linepatternShader->getOverdrawID() : linepatternShader->getID(); linepatternShader->u_matrix = vtxMatrix; linepatternShader->u_linewidth = properties.lineWidth / 2; @@ -138,7 +138,7 @@ void Painter::renderLine(LineBucket& bucket, bucket.drawLinePatterns(*linepatternShader, store); } else { - config.program = isWireframe() ? lineShader->getOverdrawID() : lineShader->getID(); + config.program = isOverdraw() ? lineShader->getOverdrawID() : lineShader->getID(); lineShader->u_matrix = vtxMatrix; lineShader->u_linewidth = properties.lineWidth / 2; diff --git a/src/mbgl/renderer/painter_raster.cpp b/src/mbgl/renderer/painter_raster.cpp index 6394d61dcce..783879892e5 100644 --- a/src/mbgl/renderer/painter_raster.cpp +++ b/src/mbgl/renderer/painter_raster.cpp @@ -18,7 +18,7 @@ void Painter::renderRaster(RasterBucket& bucket, const RasterPaintProperties& properties = layer.impl->paint; if (bucket.hasData()) { - config.program = isWireframe() ? rasterShader->getOverdrawID() : rasterShader->getID(); + config.program = isOverdraw() ? rasterShader->getOverdrawID() : rasterShader->getID(); rasterShader->u_matrix = matrix; rasterShader->u_buffer = 0; rasterShader->u_opacity = properties.rasterOpacity; diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp index 374500986b9..7eb4e6fce9f 100644 --- a/src/mbgl/renderer/painter_symbol.cpp +++ b/src/mbgl/renderer/painter_symbol.cpp @@ -58,7 +58,7 @@ void Painter::renderSDF(SymbolBucket &bucket, exScale = {{ exScale[0] * scale, exScale[1] * scale }}; } - config.program = isWireframe() ? sdfShader.getOverdrawID() : sdfShader.getID(); + config.program = isOverdraw() ? sdfShader.getOverdrawID() : sdfShader.getID(); sdfShader.u_matrix = vtxMatrix; sdfShader.u_extrude_scale = exScale; sdfShader.u_texsize = texsize; @@ -199,7 +199,7 @@ void Painter::renderSymbol(SymbolBucket& bucket, exScale = {{ exScale[0] * scale, exScale[1] * scale }}; } - config.program = isWireframe() ? iconShader->getOverdrawID() : iconShader->getID(); + config.program = isOverdraw() ? iconShader->getOverdrawID() : iconShader->getID(); iconShader->u_matrix = vtxMatrix; iconShader->u_extrude_scale = exScale; iconShader->u_texsize = {{ float(activeSpriteAtlas->getWidth()) / 4.0f, float(activeSpriteAtlas->getHeight()) / 4.0f }}; diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index c3bc5d73a01..cb48790c9ff 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -272,8 +272,8 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions) const { continue; if (const BackgroundLayer* background = layer->as()) { - if (debugOptions & MapDebugOptions::Wireframe) { - // We want to skip glClear optimization in wireframe mode. + if (debugOptions & MapDebugOptions::Overdraw) { + // We want to skip glClear optimization in overdraw mode. result.order.emplace_back(*layer); continue; } From 6c9e00be3ae6c864f9fc1aa910ad752a3704a08c Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Sat, 18 Jun 2016 22:18:08 +0300 Subject: [PATCH 6/6] [node] Read 'options.showOverdrawInspector' --- package.json | 2 +- platform/node/src/node_map.cpp | 5 +++++ platform/node/test/suite_implementation.js | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 08e666dec62..e1a8229fd18 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "express": "^4.11.1", "mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#59e998295d548f208ee3ec10cdd21ff2630e2079", "mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#194fc55b6a7dd54c1e2cf2dd9048fbb5e836716d", - "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#3a6baea2f364410e6d0873b71babfe0484870a72", + "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#85d2319dd5ad75da1f39b8cd9e08f1e51ede58cb", "node-gyp": "^3.3.1", "request": "^2.72.0", "tape": "^4.5.1" diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index e629bb21498..b4ea77000be 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -285,6 +285,11 @@ NodeMap::RenderOptions NodeMap::ParseOptions(v8::Local obj) { options.debugOptions = options.debugOptions | mbgl::MapDebugOptions::Collision; } } + if (Nan::Has(debug, Nan::New("overdraw").ToLocalChecked()).FromJust()) { + if (Nan::Get(debug, Nan::New("overdraw").ToLocalChecked()).ToLocalChecked()->BooleanValue()) { + options.debugOptions = mbgl::MapDebugOptions::Overdraw; + } + } } return options; diff --git a/platform/node/test/suite_implementation.js b/platform/node/test/suite_implementation.js index 4369c81ffce..05c2da0a6d4 100644 --- a/platform/node/test/suite_implementation.js +++ b/platform/node/test/suite_implementation.js @@ -36,7 +36,8 @@ module.exports = function (style, options, callback) { options.pitch = style.pitch; options.debug = { tileBorders: options.debug, - collision: options.collisionDebug + collision: options.collisionDebug, + overdraw: options.showOverdrawInspector, }; map.load(style);