diff options
author | Ansis Brammanis <brammanis@gmail.com> | 2016-12-14 15:42:25 -0800 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-12-21 15:46:36 -0800 |
commit | 29099399a91a330c5fdde2e0acaf4c58687574d6 (patch) | |
tree | 93bd45643990b5329807de80aa3d807c1ce4c500 | |
parent | 38b5cb0c7766152f7e49cce8bd6c5d3e04dd0663 (diff) | |
download | qtlocation-mapboxgl-29099399a91a330c5fdde2e0acaf4c58687574d6.tar.gz |
[core] clearer pitched line antialiasing
ported from -js: ef5582dd3bc5c15a3112e875ed66494dab8e9d0b
Project the extrusion and compare it's projected pixel length with the
actual pixel length and adjust antialiasing accordingly.
The previous approach calculated the adjustment much more indirectly and
had no intuitive explanation.
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | src/mbgl/programs/line_program.cpp | 22 | ||||
-rw-r--r-- | src/mbgl/programs/line_program.hpp | 17 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_line.cpp | 5 |
4 files changed, 22 insertions, 24 deletions
diff --git a/package.json b/package.json index c449c3ee48..ff549ff844 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "ejs": "^2.4.1", "express": "^4.11.1", "lodash": "^4.16.4", - "mapbox-gl": "mapbox/mapbox-gl-js#eb6c6596c6a7a61363d30356674e0002153b1d19", + "mapbox-gl": "mapbox/mapbox-gl-js#ef5582dd3bc5c15a3112e875ed66494dab8e9d0b", "mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#49e8b407bdbbe6f7c92dbcb56d3d51f425fc2653", "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#da53a81453068f4c2b440f9077d6bd5e7e14ff3d", "mkdirp": "^0.5.1", diff --git a/src/mbgl/programs/line_program.cpp b/src/mbgl/programs/line_program.cpp index cd53337c10..f7054d3398 100644 --- a/src/mbgl/programs/line_program.cpp +++ b/src/mbgl/programs/line_program.cpp @@ -16,18 +16,9 @@ template <class Values, class...Args> Values makeValues(const LinePaintProperties::Evaluated& properties, const RenderTile& tile, const TransformState& state, + const std::array<float, 2>& pixelsToGLUnits, Args&&... args) { - mat2 antialiasingMatrix; - matrix::identity(antialiasingMatrix); - matrix::scale(antialiasingMatrix, antialiasingMatrix, 1.0, std::cos(state.getPitch())); - matrix::rotate(antialiasingMatrix, antialiasingMatrix, state.getAngle()); - - // calculate how much longer the real world distance is at the top of the screen - // than at the middle of the screen. - float topedgelength = std::sqrt(std::pow(state.getSize().height, 2.0f) / 4.0f * (1.0f + std::pow(state.getCameraToCenterDistance(), 2.0f))); - float x = state.getSize().height / 2.0f * std::tan(state.getPitch()); - return Values { uniforms::u_matrix::Value{ tile.translatedMatrix(properties.get<LineTranslate>(), @@ -39,9 +30,8 @@ Values makeValues(const LinePaintProperties::Evaluated& properties, uniforms::u_gapwidth::Value{ properties.get<LineGapWidth>() }, uniforms::u_blur::Value{ properties.get<LineBlur>() }, uniforms::u_offset::Value{ properties.get<LineOffset>() }, - uniforms::u_antialiasingmatrix::Value{ antialiasingMatrix }, uniforms::u_ratio::Value{ 1.0f / tile.id.pixelsToTileUnits(1.0, state.getZoom()) }, - uniforms::u_extra::Value{ (topedgelength + x) / topedgelength - 1.0f }, + uniforms::u_gl_units_to_pixels::Value{{{ 1.0f / pixelsToGLUnits[0], 1.0f / pixelsToGLUnits[1] }}}, std::forward<Args>(args)... }; } @@ -49,11 +39,13 @@ Values makeValues(const LinePaintProperties::Evaluated& properties, LineProgram::UniformValues LineProgram::uniformValues(const LinePaintProperties::Evaluated& properties, const RenderTile& tile, - const TransformState& state) { + const TransformState& state, + const std::array<float, 2>& pixelsToGLUnits) { return makeValues<LineProgram::UniformValues>( properties, tile, state, + pixelsToGLUnits, uniforms::u_color::Value{ properties.get<LineColor>() } ); } @@ -63,6 +55,7 @@ LineSDFProgram::uniformValues(const LinePaintProperties::Evaluated& properties, float pixelRatio, const RenderTile& tile, const TransformState& state, + const std::array<float, 2>& pixelsToGLUnits, const LinePatternPos& posA, const LinePatternPos& posB, float dashLineWidth, @@ -84,6 +77,7 @@ LineSDFProgram::uniformValues(const LinePaintProperties::Evaluated& properties, properties, tile, state, + pixelsToGLUnits, uniforms::u_color::Value{ properties.get<LineColor>() }, uniforms::u_patternscale_a::Value{ scaleA }, uniforms::u_patternscale_b::Value{ scaleB }, @@ -99,6 +93,7 @@ LinePatternProgram::UniformValues LinePatternProgram::uniformValues(const LinePaintProperties::Evaluated& properties, const RenderTile& tile, const TransformState& state, + const std::array<float, 2>& pixelsToGLUnits, const SpriteAtlasPosition& posA, const SpriteAtlasPosition& posB) { std::array<float, 2> sizeA {{ @@ -115,6 +110,7 @@ LinePatternProgram::uniformValues(const LinePaintProperties::Evaluated& properti properties, tile, state, + pixelsToGLUnits, uniforms::u_pattern_tl_a::Value{ posA.tl }, uniforms::u_pattern_br_a::Value{ posA.br }, uniforms::u_pattern_tl_b::Value{ posB.tl }, diff --git a/src/mbgl/programs/line_program.hpp b/src/mbgl/programs/line_program.hpp index 059806ffb2..9b97cc47a9 100644 --- a/src/mbgl/programs/line_program.hpp +++ b/src/mbgl/programs/line_program.hpp @@ -22,7 +22,6 @@ namespace uniforms { MBGL_DEFINE_UNIFORM_SCALAR(float, u_ratio); MBGL_DEFINE_UNIFORM_SCALAR(float, u_width); MBGL_DEFINE_UNIFORM_SCALAR(float, u_gapwidth); -MBGL_DEFINE_UNIFORM_SCALAR(float, u_extra); MBGL_DEFINE_UNIFORM_SCALAR(float, u_offset); MBGL_DEFINE_UNIFORM_SCALAR(float, u_tex_y_a); MBGL_DEFINE_UNIFORM_SCALAR(float, u_tex_y_b); @@ -30,7 +29,7 @@ MBGL_DEFINE_UNIFORM_SCALAR(float, u_sdfgamma); MBGL_DEFINE_UNIFORM_SCALAR(float, u_fade); MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_patternscale_a); MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_patternscale_b); -MBGL_DEFINE_UNIFORM_MATRIX(double, 2, u_antialiasingmatrix); +MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_gl_units_to_pixels); } // namespace uniforms struct LineAttributes : gl::Attributes< @@ -93,9 +92,8 @@ class LineProgram : public Program< uniforms::u_gapwidth, uniforms::u_blur, uniforms::u_offset, - uniforms::u_antialiasingmatrix, uniforms::u_ratio, - uniforms::u_extra, + uniforms::u_gl_units_to_pixels, uniforms::u_color>> { public: @@ -103,7 +101,8 @@ public: static UniformValues uniformValues(const style::LinePaintProperties::Evaluated&, const RenderTile&, - const TransformState&); + const TransformState&, + const std::array<float, 2>& pixelsToGLUnits); }; class LinePatternProgram : public Program< @@ -117,9 +116,8 @@ class LinePatternProgram : public Program< uniforms::u_gapwidth, uniforms::u_blur, uniforms::u_offset, - uniforms::u_antialiasingmatrix, uniforms::u_ratio, - uniforms::u_extra, + uniforms::u_gl_units_to_pixels, uniforms::u_pattern_tl_a, uniforms::u_pattern_br_a, uniforms::u_pattern_tl_b, @@ -135,6 +133,7 @@ public: static UniformValues uniformValues(const style::LinePaintProperties::Evaluated&, const RenderTile&, const TransformState&, + const std::array<float, 2>& pixelsToGLUnits, const SpriteAtlasPosition& posA, const SpriteAtlasPosition& posB); }; @@ -150,9 +149,8 @@ class LineSDFProgram : public Program< uniforms::u_gapwidth, uniforms::u_blur, uniforms::u_offset, - uniforms::u_antialiasingmatrix, uniforms::u_ratio, - uniforms::u_extra, + uniforms::u_gl_units_to_pixels, uniforms::u_color, uniforms::u_patternscale_a, uniforms::u_patternscale_b, @@ -169,6 +167,7 @@ public: float pixelRatio, const RenderTile&, const TransformState&, + const std::array<float, 2>& pixelsToGLUnits, const LinePatternPos& posA, const LinePatternPos& posB, float dashLineWidth, diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp index a66f53a856..012746d2f2 100644 --- a/src/mbgl/renderer/painter_line.cpp +++ b/src/mbgl/renderer/painter_line.cpp @@ -51,6 +51,7 @@ void Painter::renderLine(PaintParameters& parameters, frame.pixelRatio, tile, state, + pixelsToGLUnits, posA, posB, layer.impl->dashLineWidth, @@ -72,6 +73,7 @@ void Painter::renderLine(PaintParameters& parameters, properties, tile, state, + pixelsToGLUnits, *posA, *posB)); @@ -80,7 +82,8 @@ void Painter::renderLine(PaintParameters& parameters, LineProgram::uniformValues( properties, tile, - state)); + state, + pixelsToGLUnits)); } } |