From bad41e663f8ffc7ca31f29dbe12bb982bfed94e6 Mon Sep 17 00:00:00 2001 From: Young Hahn Date: Wed, 8 Jun 2016 17:33:37 -0400 Subject: [PATCH] First pass at port of https://github.com/mapbox/mapbox-gl-js/pull/2668 --- package.json | 2 +- src/mbgl/geometry/icon_buffer.cpp | 3 ++- src/mbgl/geometry/icon_buffer.hpp | 2 +- src/mbgl/geometry/text_buffer.cpp | 3 ++- src/mbgl/geometry/text_buffer.hpp | 2 +- src/mbgl/renderer/painter_symbol.cpp | 4 +++- src/mbgl/renderer/symbol_bucket.cpp | 13 ++++++++----- src/mbgl/shader/sdf_shader.hpp | 2 ++ src/mbgl/text/quads.cpp | 14 +++++++------- src/mbgl/text/quads.hpp | 7 ++++--- 10 files changed, 31 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 0b7f7e2d1b3..41986da00ad 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "csscolorparser": "^1.0.2", "ejs": "^2.4.1", "express": "^4.11.1", - "mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#8dfd9653e6659cb2837a4b98f3e8e1d559b29a09", + "mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#50390dd173a6aec50652873903adf5ef53e5db39", "mapbox-gl-style-spec": "^8.5.1", "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#f45fd7aba98650c7f3bf778c9cbbfd3b548a4ee8", "node-gyp": "^3.3.1", diff --git a/src/mbgl/geometry/icon_buffer.cpp b/src/mbgl/geometry/icon_buffer.cpp index 101132ddbc9..51a4aa69fdb 100644 --- a/src/mbgl/geometry/icon_buffer.cpp +++ b/src/mbgl/geometry/icon_buffer.cpp @@ -6,7 +6,7 @@ namespace mbgl { -size_t IconVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float minzoom, float maxzoom, float labelminzoom) { +size_t IconVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle) { const size_t idx = index(); void *data = addElement(); @@ -21,6 +21,7 @@ size_t IconVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, int16_t t ubytes[8] /* tex */ = tx / 4; ubytes[9] /* tex */ = ty / 4; ubytes[10] /* labelminzoom */ = labelminzoom * 10; + ubytes[11] /* labelangle */ = labelangle; // a_data2 ubytes[12] /* minzoom */ = minzoom * 10; // 1/10 zoom levels: z16 == 160. diff --git a/src/mbgl/geometry/icon_buffer.hpp b/src/mbgl/geometry/icon_buffer.hpp index 01166862657..3a1d57ccd72 100644 --- a/src/mbgl/geometry/icon_buffer.hpp +++ b/src/mbgl/geometry/icon_buffer.hpp @@ -10,7 +10,7 @@ namespace mbgl { 16 > { public: - size_t add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float minzoom, float maxzoom, float labelminzoom); + size_t add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle); }; diff --git a/src/mbgl/geometry/text_buffer.cpp b/src/mbgl/geometry/text_buffer.cpp index 1aa65146a43..382e87324d3 100644 --- a/src/mbgl/geometry/text_buffer.cpp +++ b/src/mbgl/geometry/text_buffer.cpp @@ -6,7 +6,7 @@ namespace mbgl { -size_t TextVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom) { +size_t TextVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle) { const size_t idx = index(); void *data = addElement(); @@ -21,6 +21,7 @@ size_t TextVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, uint16_t ubytes[8] /* tex */ = tx / 4; ubytes[9] /* tex */ = ty / 4; ubytes[10] /* labelminzoom */ = labelminzoom * 10; + ubytes[11] /* labelangle */ = labelangle; // a_data2 ubytes[12] /* minzoom */ = minzoom * 10; // 1/10 zoom levels: z16 == 160. diff --git a/src/mbgl/geometry/text_buffer.hpp b/src/mbgl/geometry/text_buffer.hpp index 8d7859fde29..c6b632c67ec 100644 --- a/src/mbgl/geometry/text_buffer.hpp +++ b/src/mbgl/geometry/text_buffer.hpp @@ -13,7 +13,7 @@ class TextVertexBuffer : public Buffer < public: typedef int16_t vertex_type; - size_t add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom); + size_t add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle); }; diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp index 3c453242ae7..88daef82778 100644 --- a/src/mbgl/renderer/painter_symbol.cpp +++ b/src/mbgl/renderer/painter_symbol.cpp @@ -48,7 +48,7 @@ void Painter::renderSDF(SymbolBucket &bucket, bool alignedWithMap = rotationAlignment == RotationAlignmentType::Map; float gammaScale = 1.0f; - if (alignedWithMap) { + if (false && alignedWithMap) { scale *= tileID.pixelsToTileUnits(1, state.getZoom()); exScale.fill(scale); gammaScale /= std::cos(state.getPitch()); @@ -62,6 +62,8 @@ void Painter::renderSDF(SymbolBucket &bucket, sdfShader.u_texsize = texsize; sdfShader.u_skewed = alignedWithMap; sdfShader.u_texture = 0; + sdfShader.u_pitch = state.getPitch() / 360 * 2 * M_PI; + sdfShader.u_aspect_ratio = (state.getWidth() * 1.0f) / (state.getHeight() * 1.0f); // adjust min/max zooms for variable font sies float zoomAdjust = std::log(fontSize / layoutSize) / std::log(2); diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index f4e55432c13..f3e49013a84 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -495,7 +495,7 @@ void SymbolBucket::addSymbols(Buffer &buffer, const SymbolQuads &symbols, float const auto &anchorPoint = symbol.anchorPoint; // drop upside down versions of glyphs - const float a = std::fmod(symbol.angle + placementAngle + M_PI, M_PI * 2); + const float a = std::fmod(symbol.anchorAngle + placementAngle + M_PI, M_PI * 2); if (keepUpright && alongLine && (a <= M_PI / 2 || a > M_PI * 3 / 2)) continue; @@ -521,15 +521,18 @@ void SymbolBucket::addSymbols(Buffer &buffer, const SymbolQuads &symbols, float auto &triangleGroup = *buffer.groups.back(); GLsizei triangleIndex = triangleGroup.vertex_length; + // Encode angle of glyph + uint8_t glyphAngle = std::round((symbol.glyphAngle / (M_PI * 2)) * 256); + // coordinates (2 triangles) buffer.vertices.add(anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, - maxZoom, placementZoom); + maxZoom, placementZoom, glyphAngle); buffer.vertices.add(anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, - minZoom, maxZoom, placementZoom); + minZoom, maxZoom, placementZoom, glyphAngle); buffer.vertices.add(anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, - minZoom, maxZoom, placementZoom); + minZoom, maxZoom, placementZoom, glyphAngle); buffer.vertices.add(anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, - minZoom, maxZoom, placementZoom); + minZoom, maxZoom, placementZoom, glyphAngle); // add the two triangles, referencing the four coordinates we just inserted. buffer.triangles.add(triangleIndex + 0, triangleIndex + 1, triangleIndex + 2); diff --git a/src/mbgl/shader/sdf_shader.hpp b/src/mbgl/shader/sdf_shader.hpp index f067c30aeb2..bc53cfd7270 100644 --- a/src/mbgl/shader/sdf_shader.hpp +++ b/src/mbgl/shader/sdf_shader.hpp @@ -17,6 +17,8 @@ class SDFShader : public Shader { Uniform u_buffer = {"u_buffer", *this}; Uniform u_gamma = {"u_gamma", *this}; Uniform u_zoom = {"u_zoom", *this}; + Uniform u_pitch = {"u_pitch", *this}; + Uniform u_aspect_ratio = {"u_aspect_ratio", *this}; Uniform u_skewed = {"u_skewed", *this}; Uniform u_texture = {"u_texture", *this}; Uniform u_fadetexture = {"u_fadetexture", *this}; diff --git a/src/mbgl/text/quads.cpp b/src/mbgl/text/quads.cpp index ce320791c34..6aea5b97e03 100644 --- a/src/mbgl/text/quads.cpp +++ b/src/mbgl/text/quads.cpp @@ -57,7 +57,7 @@ SymbolQuads getIconQuads(Anchor& anchor, const PositionedIcon& shapedIcon, } SymbolQuads quads; - quads.emplace_back(tl, tr, bl, br, image.pos, 0, anchor.point, globalMinScale, std::numeric_limits::infinity()); + quads.emplace_back(tl, tr, bl, br, image.pos, 0, 0, anchor.point, globalMinScale, std::numeric_limits::infinity()); return quads; } @@ -188,12 +188,11 @@ SymbolQuads getGlyphQuads(Anchor& anchor, const Shaping& shapedText, Point tr = otr; Point bl = obl; Point br = obr; - const float angle = instance.angle + textRotate; - if (angle) { + if (textRotate) { // Compute the transformation matrix. - float angle_sin = std::sin(angle); - float angle_cos = std::cos(angle); + float angle_sin = std::sin(textRotate); + float angle_cos = std::cos(textRotate); std::array matrix = {{angle_cos, -angle_sin, angle_sin, angle_cos}}; tl = util::matrixMultiply(matrix, tl); @@ -205,8 +204,9 @@ SymbolQuads getGlyphQuads(Anchor& anchor, const Shaping& shapedText, // Prevent label from extending past the end of the line const float glyphMinScale = std::max(instance.minScale, anchor.scale); - const float glyphAngle = std::fmod((anchor.angle + textRotate + instance.offset + 2 * M_PI), (2 * M_PI)); - quads.emplace_back(tl, tr, bl, br, rect, glyphAngle, instance.anchorPoint, glyphMinScale, instance.maxScale); + const float anchorAngle = std::fmod((anchor.angle + textRotate + instance.offset + 2 * M_PI), (2 * M_PI)); + const float glyphAngle = std::fmod((instance.angle + textRotate + instance.offset + 2 * M_PI), (2 * M_PI)); + quads.emplace_back(tl, tr, bl, br, rect, anchorAngle, glyphAngle, instance.anchorPoint, glyphMinScale, instance.maxScale); } diff --git a/src/mbgl/text/quads.hpp b/src/mbgl/text/quads.hpp index 0627647f4c0..e78fe308e24 100644 --- a/src/mbgl/text/quads.hpp +++ b/src/mbgl/text/quads.hpp @@ -17,21 +17,22 @@ class SymbolLayoutProperties; struct SymbolQuad { explicit SymbolQuad(const Point &tl_, const Point &tr_, const Point &bl_, const Point &br_, - const Rect &tex_, float angle_, const Point &anchorPoint_, + const Rect &tex_, float anchorAngle_, float glyphAngle_, const Point &anchorPoint_, float minScale_, float maxScale_) : tl(tl_), tr(tr_), bl(bl_), br(br_), tex(tex_), - angle(angle_), + anchorAngle(anchorAngle_), + glyphAngle(glyphAngle_), anchorPoint(anchorPoint_), minScale(minScale_), maxScale(maxScale_) {} Point tl, tr, bl, br; Rect tex; - float angle; + float anchorAngle, glyphAngle; Point anchorPoint; float minScale, maxScale; };