From 073d1fc9e886e88925176df193eb5eff1dac7675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Tue, 26 Aug 2014 19:33:25 +0200 Subject: [PATCH 01/13] bump cocoa --- ios/mapbox-gl-cocoa | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/mapbox-gl-cocoa b/ios/mapbox-gl-cocoa index e1c709a8d..8a315662b 160000 --- a/ios/mapbox-gl-cocoa +++ b/ios/mapbox-gl-cocoa @@ -1 +1 @@ -Subproject commit e1c709a8de0b69aa6bfbcd9ea4faf981b6e799b2 +Subproject commit 8a315662b365566cb37b3c9f13da6d6730d0abdb From 42d0740ef08be4847d7c9c514fa1bb29dd14fd02 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 26 Aug 2014 14:43:29 -0700 Subject: [PATCH 02/13] VertexArrayObject and ElementGroup should be noncopyable --- include/mbgl/geometry/elements_buffer.hpp | 3 +- include/mbgl/geometry/vao.hpp | 5 ++- include/mbgl/renderer/fill_bucket.hpp | 5 ++- include/mbgl/renderer/line_bucket.hpp | 6 +-- include/mbgl/renderer/symbol_bucket.hpp | 4 +- src/renderer/fill_bucket.cpp | 46 +++++++++++----------- src/renderer/line_bucket.cpp | 47 ++++++++++++----------- src/renderer/symbol_bucket.cpp | 27 ++++++------- 8 files changed, 74 insertions(+), 69 deletions(-) diff --git a/include/mbgl/geometry/elements_buffer.hpp b/include/mbgl/geometry/elements_buffer.hpp index 1282beb23..44b5c71dd 100644 --- a/include/mbgl/geometry/elements_buffer.hpp +++ b/include/mbgl/geometry/elements_buffer.hpp @@ -3,13 +3,14 @@ #include #include +#include #include namespace mbgl { template -struct ElementGroup { +struct ElementGroup : public util::noncopyable { std::array array; uint32_t vertex_length; uint32_t elements_length; diff --git a/include/mbgl/geometry/vao.hpp b/include/mbgl/geometry/vao.hpp index 87408ddba..3d32ed28a 100644 --- a/include/mbgl/geometry/vao.hpp +++ b/include/mbgl/geometry/vao.hpp @@ -3,13 +3,14 @@ #include #include +#include #include namespace mbgl { #if GL_ARB_vertex_array_object -class VertexArrayObject { +class VertexArrayObject : public util::noncopyable { public: template inline void bind(Shader& shader, VertexBuffer &vertexBuffer, char *offset) { @@ -56,7 +57,7 @@ private: #else -class VertexArrayObject { +class VertexArrayObject : public util::noncopyable { public: template void bind(Shader& shader, Buffers& buffers, char *offset) { diff --git a/include/mbgl/renderer/fill_bucket.hpp b/include/mbgl/renderer/fill_bucket.hpp index e8d6bf99e..0cd756318 100644 --- a/include/mbgl/renderer/fill_bucket.hpp +++ b/include/mbgl/renderer/fill_bucket.hpp @@ -34,8 +34,9 @@ class FillBucket : public Bucket { static void *realloc(void *data, void *ptr, unsigned int size); static void free(void *userData, void *ptr); - typedef ElementGroup<2> triangle_group_type; - typedef ElementGroup<1> line_group_type; + typedef std::unique_ptr> triangle_group_type; + typedef std::unique_ptr> line_group_type; + public: FillBucket(FillVertexBuffer& vertexBuffer, TriangleElementsBuffer& triangleElementsBuffer, diff --git a/include/mbgl/renderer/line_bucket.hpp b/include/mbgl/renderer/line_bucket.hpp index a33dde34e..55fe8c486 100644 --- a/include/mbgl/renderer/line_bucket.hpp +++ b/include/mbgl/renderer/line_bucket.hpp @@ -20,8 +20,9 @@ class LinejoinShader; struct pbf; class LineBucket : public Bucket { - typedef ElementGroup<1> triangle_group_type; - typedef ElementGroup<1> point_group_type; + typedef std::unique_ptr> triangle_group_type; + typedef std::unique_ptr> point_group_type; + public: LineBucket(LineVertexBuffer& vertexBuffer, TriangleElementsBuffer& triangleElementsBuffer, @@ -43,7 +44,6 @@ public: const StyleBucketLine &properties; private: - LineVertexBuffer& vertexBuffer; TriangleElementsBuffer& triangleElementsBuffer; PointElementsBuffer& pointElementsBuffer; diff --git a/include/mbgl/renderer/symbol_bucket.hpp b/include/mbgl/renderer/symbol_bucket.hpp index fb1678fc8..fccb2924d 100644 --- a/include/mbgl/renderer/symbol_bucket.hpp +++ b/include/mbgl/renderer/symbol_bucket.hpp @@ -50,8 +50,8 @@ typedef std::vector Symbols; class SymbolBucket : public Bucket { - typedef ElementGroup<1> TextElementGroup; - typedef ElementGroup<1> IconElementGroup; + typedef std::unique_ptr> TextElementGroup; + typedef std::unique_ptr> IconElementGroup; public: SymbolBucket(const StyleBucketSymbol &properties, Collision &collision); diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index 875cc279b..37be90113 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -8,7 +8,7 @@ #include #include - +#include #include @@ -111,13 +111,13 @@ void FillBucket::tessellate() { throw geometry_too_long_exception(); } - if (!lineGroups.size() || (lineGroups.back().vertex_length + total_vertex_count > 65535)) { + if (!lineGroups.size() || (lineGroups.back()->vertex_length + total_vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - lineGroups.emplace_back(); + lineGroups.emplace_back(std::make_unique>()); } line_group_type& lineGroup = lineGroups.back(); - uint32_t lineIndex = lineGroup.vertex_length; + uint32_t lineIndex = lineGroup->vertex_length; for (const std::vector& polygon : polygons) { const size_t group_count = polygon.size(); @@ -140,7 +140,7 @@ void FillBucket::tessellate() { tessAddContour(tesselator, vertexSize, line.data(), stride, (int)line.size() / vertexSize); } - lineGroup.elements_length += total_vertex_count; + lineGroup->elements_length += total_vertex_count; if (tessTesselate(tesselator, TESS_WINDING_POSITIVE, TESS_POLYGONS, vertices_per_group, vertexSize, 0)) { const TESSreal *vertices = tessGetVertices(tesselator); @@ -157,15 +157,15 @@ void FillBucket::tessellate() { } } - if (!triangleGroups.size() || (triangleGroups.back().vertex_length + total_vertex_count > 65535)) { + if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + total_vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - triangleGroups.emplace_back(); + triangleGroups.emplace_back(std::make_unique>()); } // We're generating triangle fans, so we always start with the first // coordinate in this polygon. triangle_group_type& triangleGroup = triangleGroups.back(); - uint32_t triangleIndex = triangleGroup.vertex_length; + uint32_t triangleIndex = triangleGroup->vertex_length; for (int i = 0; i < triangle_count; ++i) { const TESSindex *element_group = &elements[i * vertices_per_group]; @@ -190,8 +190,8 @@ void FillBucket::tessellate() { } } - triangleGroup.vertex_length += total_vertex_count; - triangleGroup.elements_length += triangle_count; + triangleGroup->vertex_length += total_vertex_count; + triangleGroup->elements_length += triangle_count; } else { #if defined(DEBUG) fprintf(stderr, "tessellation failed\n"); @@ -201,7 +201,7 @@ void FillBucket::tessellate() { // We're adding the total vertex count *after* we added additional vertices // in the tessellation step. They won't be part of the actual lines, but // we need to skip over them anyway if we draw the next group. - lineGroup.vertex_length += total_vertex_count; + lineGroup->vertex_length += total_vertex_count; } void FillBucket::render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { @@ -216,10 +216,10 @@ void FillBucket::drawElements(PlainShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * triangleElementsBuffer.itemSize; + group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * triangleElementsBuffer.itemSize; } } @@ -227,10 +227,10 @@ void FillBucket::drawElements(PatternShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - group.array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * triangleElementsBuffer.itemSize; + group->array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * triangleElementsBuffer.itemSize; } } @@ -238,9 +238,9 @@ void FillBucket::drawVertices(OutlineShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(line_elements_start * lineElementsBuffer.itemSize); for (line_group_type& group : lineGroups) { - group.array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index); - glDrawElements(GL_LINES, group.elements_length * 2, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * lineElementsBuffer.itemSize; + group->array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index); + glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * lineElementsBuffer.itemSize; } } diff --git a/src/renderer/line_bucket.cpp b/src/renderer/line_bucket.cpp index e089d7f61..d2ebca951 100644 --- a/src/renderer/line_bucket.cpp +++ b/src/renderer/line_bucket.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #define BUFFER_OFFSET(i) ((char *)nullptr + (i)) @@ -306,38 +307,38 @@ void LineBucket::addGeometry(const std::vector& vertices) { // Store the triangle/line groups. { - if (!triangleGroups.size() || (triangleGroups.back().vertex_length + vertex_count > 65535)) { + if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - triangleGroups.emplace_back(); + triangleGroups.emplace_back(std::make_unique>()); } triangle_group_type& group = triangleGroups.back(); for (const TriangleElement& triangle : triangle_store) { triangleElementsBuffer.add( - group.vertex_length + triangle.a, - group.vertex_length + triangle.b, - group.vertex_length + triangle.c + group->vertex_length + triangle.a, + group->vertex_length + triangle.b, + group->vertex_length + triangle.c ); } - group.vertex_length += vertex_count; - group.elements_length += triangle_store.size(); + group->vertex_length += vertex_count; + group->elements_length += triangle_store.size(); } // Store the line join/cap groups. { - if (!pointGroups.size() || (pointGroups.back().vertex_length + vertex_count > 65535)) { + if (!pointGroups.size() || (pointGroups.back()->vertex_length + vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - pointGroups.emplace_back(); + pointGroups.emplace_back(std::make_unique>()); } point_group_type& group = pointGroups.back(); for (PointElement point : point_store) { - pointElementsBuffer.add(group.vertex_length + point); + pointElementsBuffer.add(group->vertex_length + point); } - group.vertex_length += vertex_count; - group.elements_length += point_store.size(); + group->vertex_length += vertex_count; + group->elements_length += point_store.size(); } } @@ -352,7 +353,7 @@ bool LineBucket::hasData() const { bool LineBucket::hasPoints() const { if (!pointGroups.empty()) { for (const point_group_type& group : pointGroups) { - if (group.elements_length) { + if (group->elements_length) { return true; } } @@ -364,13 +365,13 @@ void LineBucket::drawLines(LineShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - if (!group.elements_length) { + if (!group->elements_length) { continue; } - group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * triangleElementsBuffer.itemSize; + group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * triangleElementsBuffer.itemSize; } } @@ -378,12 +379,12 @@ void LineBucket::drawPoints(LinejoinShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(point_elements_start * pointElementsBuffer.itemSize); for (point_group_type& group : pointGroups) { - if (!group.elements_length) { + if (!group->elements_length) { continue; } - group.array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index); - glDrawElements(GL_POINTS, group.elements_length, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * pointElementsBuffer.itemSize; + group->array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index); + glDrawElements(GL_POINTS, group->elements_length, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * pointElementsBuffer.itemSize; } } diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp index fd8931509..6ddf18ee7 100644 --- a/src/renderer/symbol_bucket.cpp +++ b/src/renderer/symbol_bucket.cpp @@ -16,6 +16,7 @@ #include #include #include +#include namespace mbgl { @@ -344,15 +345,15 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float const int glyph_vertex_length = 4; if (!buffer.groups.size() || - (buffer.groups.back().vertex_length + glyph_vertex_length > 65535)) { + (buffer.groups.back()->vertex_length + glyph_vertex_length > 65535)) { // Move to a new group because the old one can't hold the geometry. - buffer.groups.emplace_back(); + buffer.groups.emplace_back(std::make_unique>()); } // We're generating triangle fans, so we always start with the first // coordinate in this polygon. TextElementGroup &triangleGroup = buffer.groups.back(); - uint32_t triangleIndex = triangleGroup.vertex_length; + uint32_t triangleIndex = triangleGroup->vertex_length; // coordinates (2 triangles) buffer.vertices.add(glyphAnchor.x, glyphAnchor.y, tl.x, tl.y, tex.x, tex.y, angle, minZoom, @@ -368,8 +369,8 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float buffer.triangles.add(triangleIndex + 0, triangleIndex + 1, triangleIndex + 2); buffer.triangles.add(triangleIndex + 1, triangleIndex + 2, triangleIndex + 3); - triangleGroup.vertex_length += glyph_vertex_length; - triangleGroup.elements_length += 2; + triangleGroup->vertex_length += glyph_vertex_length; + triangleGroup->elements_length += 2; } } @@ -377,10 +378,10 @@ void SymbolBucket::drawGlyphs(TextShader &shader) { char *vertex_index = BUFFER_OFFSET(0); char *elements_index = BUFFER_OFFSET(0); for (TextElementGroup &group : text.groups) { - group.array[0].bind(shader, text.vertices, text.triangles, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * text.vertices.itemSize; - elements_index += group.elements_length * text.triangles.itemSize; + group->array[0].bind(shader, text.vertices, text.triangles, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * text.vertices.itemSize; + elements_index += group->elements_length * text.triangles.itemSize; } } @@ -388,10 +389,10 @@ void SymbolBucket::drawIcons(IconShader &shader) { char *vertex_index = BUFFER_OFFSET(0); char *elements_index = BUFFER_OFFSET(0); for (IconElementGroup &group : icon.groups) { - group.array[0].bind(shader, icon.vertices, icon.triangles, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * icon.vertices.itemSize; - elements_index += group.elements_length * icon.triangles.itemSize; + group->array[0].bind(shader, icon.vertices, icon.triangles, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * icon.vertices.itemSize; + elements_index += group->elements_length * icon.triangles.itemSize; } } } From 489b6642322065111c41bccbcda8ee92ef1f2a44 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 26 Aug 2014 15:14:58 -0700 Subject: [PATCH 03/13] Remove unused --- include/mbgl/renderer/painter.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index eb5f42789..fcbafc52d 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -184,12 +184,9 @@ public: }; VertexArrayObject coveringPlainArray; - VertexArrayObject coveringPatternArray; VertexArrayObject coveringRasterArray; VertexArrayObject coveringGaussianArray; - VertexArrayObject matteArray; - // Set up the tile boundary lines we're using to draw the tile outlines. StaticVertexBuffer tileBorderBuffer = { { 0, 0 }, From 454ac1866b959df60f0da82e54fe30b543871d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 11:23:58 +0200 Subject: [PATCH 04/13] don't fail if test comparisons return mismatches --- scripts/travis_script.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/travis_script.sh b/scripts/travis_script.sh index f8325e41c..ee56080ff 100755 --- a/scripts/travis_script.sh +++ b/scripts/travis_script.sh @@ -10,7 +10,11 @@ if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then make linux -j4 BUILDTYPE=${BUILDTYPE} make test -j4 BUILDTYPE=${BUILDTYPE} ./scripts/run_tests.sh - (cd ./node_modules/mapbox-gl-test-suite/ && (./bin/compare_images.js || true; [[ $TRAVIS_PULL_REQUEST = "false" ]] && ./bin/deploy_results.sh)) + (cd ./node_modules/mapbox-gl-test-suite/ && (./bin/compare_images.js || true)) + + if [ "${TRAVIS_PULL_REQUEST}" == "false" ] ; then + ./bin/deploy_results.sh + fi elif [[ ${TRAVIS_OS_NAME} == "osx" ]]; then # From 67629d7f869e603517bd7c97c2fb8ff21dd57bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 11:42:09 +0200 Subject: [PATCH 05/13] use correct path for deploy script --- scripts/travis_script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_script.sh b/scripts/travis_script.sh index ee56080ff..2fc6029b4 100755 --- a/scripts/travis_script.sh +++ b/scripts/travis_script.sh @@ -13,7 +13,7 @@ if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then (cd ./node_modules/mapbox-gl-test-suite/ && (./bin/compare_images.js || true)) if [ "${TRAVIS_PULL_REQUEST}" == "false" ] ; then - ./bin/deploy_results.sh + (cd ./node_modules/mapbox-gl-test-suite/ && ./bin/deploy_results.sh) fi elif [[ ${TRAVIS_OS_NAME} == "osx" ]]; then From c3cb4582250fc9f6bc125cfa11729a502b7d7a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 12:08:21 +0200 Subject: [PATCH 06/13] make ElementGroup and VertexArrayObject movable to avoid using unique_ptrs --- include/mbgl/geometry/elements_buffer.hpp | 5 +++ include/mbgl/geometry/vao.hpp | 10 +++++ include/mbgl/renderer/fill_bucket.hpp | 4 +- include/mbgl/renderer/line_bucket.hpp | 4 +- include/mbgl/renderer/symbol_bucket.hpp | 4 +- src/renderer/fill_bucket.cpp | 44 +++++++++++----------- src/renderer/line_bucket.cpp | 46 +++++++++++------------ src/renderer/symbol_bucket.cpp | 26 ++++++------- 8 files changed, 79 insertions(+), 64 deletions(-) diff --git a/include/mbgl/geometry/elements_buffer.hpp b/include/mbgl/geometry/elements_buffer.hpp index 44b5c71dd..56080e29f 100644 --- a/include/mbgl/geometry/elements_buffer.hpp +++ b/include/mbgl/geometry/elements_buffer.hpp @@ -20,6 +20,11 @@ struct ElementGroup : public util::noncopyable { : vertex_length(vertex_length), elements_length(elements_length) { } + + ElementGroup(ElementGroup &&rhs) noexcept + : array(std::move(rhs.array)), + vertex_length(rhs.vertex_length), + elements_length(rhs.elements_length) {}; }; class TriangleElementsBuffer : public Buffer< diff --git a/include/mbgl/geometry/vao.hpp b/include/mbgl/geometry/vao.hpp index 3d32ed28a..bb1f571ff 100644 --- a/include/mbgl/geometry/vao.hpp +++ b/include/mbgl/geometry/vao.hpp @@ -12,6 +12,16 @@ namespace mbgl { #if GL_ARB_vertex_array_object class VertexArrayObject : public util::noncopyable { public: + inline VertexArrayObject() {}; + + inline VertexArrayObject(VertexArrayObject &&rhs) noexcept + : vao(rhs.vao), + bound_shader(rhs.bound_shader), + bound_shader_name(rhs.bound_shader_name), + bound_vertex_buffer(rhs.bound_vertex_buffer), + bound_elements_buffer(rhs.bound_elements_buffer), + bound_offset(rhs.bound_offset) {}; + template inline void bind(Shader& shader, VertexBuffer &vertexBuffer, char *offset) { bindVertexArrayObject(); diff --git a/include/mbgl/renderer/fill_bucket.hpp b/include/mbgl/renderer/fill_bucket.hpp index 0cd756318..15868e409 100644 --- a/include/mbgl/renderer/fill_bucket.hpp +++ b/include/mbgl/renderer/fill_bucket.hpp @@ -34,8 +34,8 @@ class FillBucket : public Bucket { static void *realloc(void *data, void *ptr, unsigned int size); static void free(void *userData, void *ptr); - typedef std::unique_ptr> triangle_group_type; - typedef std::unique_ptr> line_group_type; + typedef ElementGroup<2> triangle_group_type; + typedef ElementGroup<1> line_group_type; public: FillBucket(FillVertexBuffer& vertexBuffer, diff --git a/include/mbgl/renderer/line_bucket.hpp b/include/mbgl/renderer/line_bucket.hpp index 55fe8c486..c7e375a0a 100644 --- a/include/mbgl/renderer/line_bucket.hpp +++ b/include/mbgl/renderer/line_bucket.hpp @@ -20,8 +20,8 @@ class LinejoinShader; struct pbf; class LineBucket : public Bucket { - typedef std::unique_ptr> triangle_group_type; - typedef std::unique_ptr> point_group_type; + typedef ElementGroup<1> triangle_group_type; + typedef ElementGroup<1> point_group_type; public: LineBucket(LineVertexBuffer& vertexBuffer, diff --git a/include/mbgl/renderer/symbol_bucket.hpp b/include/mbgl/renderer/symbol_bucket.hpp index fccb2924d..fb1678fc8 100644 --- a/include/mbgl/renderer/symbol_bucket.hpp +++ b/include/mbgl/renderer/symbol_bucket.hpp @@ -50,8 +50,8 @@ typedef std::vector Symbols; class SymbolBucket : public Bucket { - typedef std::unique_ptr> TextElementGroup; - typedef std::unique_ptr> IconElementGroup; + typedef ElementGroup<1> TextElementGroup; + typedef ElementGroup<1> IconElementGroup; public: SymbolBucket(const StyleBucketSymbol &properties, Collision &collision); diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index 37be90113..e057e9faa 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -111,13 +111,13 @@ void FillBucket::tessellate() { throw geometry_too_long_exception(); } - if (!lineGroups.size() || (lineGroups.back()->vertex_length + total_vertex_count > 65535)) { + if (!lineGroups.size() || (lineGroups.back().vertex_length + total_vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - lineGroups.emplace_back(std::make_unique>()); + lineGroups.emplace_back(); } line_group_type& lineGroup = lineGroups.back(); - uint32_t lineIndex = lineGroup->vertex_length; + uint32_t lineIndex = lineGroup.vertex_length; for (const std::vector& polygon : polygons) { const size_t group_count = polygon.size(); @@ -140,7 +140,7 @@ void FillBucket::tessellate() { tessAddContour(tesselator, vertexSize, line.data(), stride, (int)line.size() / vertexSize); } - lineGroup->elements_length += total_vertex_count; + lineGroup.elements_length += total_vertex_count; if (tessTesselate(tesselator, TESS_WINDING_POSITIVE, TESS_POLYGONS, vertices_per_group, vertexSize, 0)) { const TESSreal *vertices = tessGetVertices(tesselator); @@ -157,15 +157,15 @@ void FillBucket::tessellate() { } } - if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + total_vertex_count > 65535)) { + if (!triangleGroups.size() || (triangleGroups.back().vertex_length + total_vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - triangleGroups.emplace_back(std::make_unique>()); + triangleGroups.emplace_back(); } // We're generating triangle fans, so we always start with the first // coordinate in this polygon. triangle_group_type& triangleGroup = triangleGroups.back(); - uint32_t triangleIndex = triangleGroup->vertex_length; + uint32_t triangleIndex = triangleGroup.vertex_length; for (int i = 0; i < triangle_count; ++i) { const TESSindex *element_group = &elements[i * vertices_per_group]; @@ -190,8 +190,8 @@ void FillBucket::tessellate() { } } - triangleGroup->vertex_length += total_vertex_count; - triangleGroup->elements_length += triangle_count; + triangleGroup.vertex_length += total_vertex_count; + triangleGroup.elements_length += triangle_count; } else { #if defined(DEBUG) fprintf(stderr, "tessellation failed\n"); @@ -201,7 +201,7 @@ void FillBucket::tessellate() { // We're adding the total vertex count *after* we added additional vertices // in the tessellation step. They won't be part of the actual lines, but // we need to skip over them anyway if we draw the next group. - lineGroup->vertex_length += total_vertex_count; + lineGroup.vertex_length += total_vertex_count; } void FillBucket::render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { @@ -216,10 +216,10 @@ void FillBucket::drawElements(PlainShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group->vertex_length * vertexBuffer.itemSize; - elements_index += group->elements_length * triangleElementsBuffer.itemSize; + group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group.vertex_length * vertexBuffer.itemSize; + elements_index += group.elements_length * triangleElementsBuffer.itemSize; } } @@ -227,10 +227,10 @@ void FillBucket::drawElements(PatternShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - group->array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group->vertex_length * vertexBuffer.itemSize; - elements_index += group->elements_length * triangleElementsBuffer.itemSize; + group.array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group.vertex_length * vertexBuffer.itemSize; + elements_index += group.elements_length * triangleElementsBuffer.itemSize; } } @@ -238,9 +238,9 @@ void FillBucket::drawVertices(OutlineShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(line_elements_start * lineElementsBuffer.itemSize); for (line_group_type& group : lineGroups) { - group->array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index); - glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group->vertex_length * vertexBuffer.itemSize; - elements_index += group->elements_length * lineElementsBuffer.itemSize; + group.array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index); + glDrawElements(GL_LINES, group.elements_length * 2, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group.vertex_length * vertexBuffer.itemSize; + elements_index += group.elements_length * lineElementsBuffer.itemSize; } } diff --git a/src/renderer/line_bucket.cpp b/src/renderer/line_bucket.cpp index d2ebca951..1b8586c15 100644 --- a/src/renderer/line_bucket.cpp +++ b/src/renderer/line_bucket.cpp @@ -307,38 +307,38 @@ void LineBucket::addGeometry(const std::vector& vertices) { // Store the triangle/line groups. { - if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + vertex_count > 65535)) { + if (!triangleGroups.size() || (triangleGroups.back().vertex_length + vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - triangleGroups.emplace_back(std::make_unique>()); + triangleGroups.emplace_back(); } triangle_group_type& group = triangleGroups.back(); for (const TriangleElement& triangle : triangle_store) { triangleElementsBuffer.add( - group->vertex_length + triangle.a, - group->vertex_length + triangle.b, - group->vertex_length + triangle.c + group.vertex_length + triangle.a, + group.vertex_length + triangle.b, + group.vertex_length + triangle.c ); } - group->vertex_length += vertex_count; - group->elements_length += triangle_store.size(); + group.vertex_length += vertex_count; + group.elements_length += triangle_store.size(); } // Store the line join/cap groups. { - if (!pointGroups.size() || (pointGroups.back()->vertex_length + vertex_count > 65535)) { + if (!pointGroups.size() || (pointGroups.back().vertex_length + vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - pointGroups.emplace_back(std::make_unique>()); + pointGroups.emplace_back(); } point_group_type& group = pointGroups.back(); for (PointElement point : point_store) { - pointElementsBuffer.add(group->vertex_length + point); + pointElementsBuffer.add(group.vertex_length + point); } - group->vertex_length += vertex_count; - group->elements_length += point_store.size(); + group.vertex_length += vertex_count; + group.elements_length += point_store.size(); } } @@ -353,7 +353,7 @@ bool LineBucket::hasData() const { bool LineBucket::hasPoints() const { if (!pointGroups.empty()) { for (const point_group_type& group : pointGroups) { - if (group->elements_length) { + if (group.elements_length) { return true; } } @@ -365,13 +365,13 @@ void LineBucket::drawLines(LineShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - if (!group->elements_length) { + if (!group.elements_length) { continue; } - group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group->vertex_length * vertexBuffer.itemSize; - elements_index += group->elements_length * triangleElementsBuffer.itemSize; + group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group.vertex_length * vertexBuffer.itemSize; + elements_index += group.elements_length * triangleElementsBuffer.itemSize; } } @@ -379,12 +379,12 @@ void LineBucket::drawPoints(LinejoinShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(point_elements_start * pointElementsBuffer.itemSize); for (point_group_type& group : pointGroups) { - if (!group->elements_length) { + if (!group.elements_length) { continue; } - group->array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index); - glDrawElements(GL_POINTS, group->elements_length, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group->vertex_length * vertexBuffer.itemSize; - elements_index += group->elements_length * pointElementsBuffer.itemSize; + group.array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index); + glDrawElements(GL_POINTS, group.elements_length, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group.vertex_length * vertexBuffer.itemSize; + elements_index += group.elements_length * pointElementsBuffer.itemSize; } } diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp index 6ddf18ee7..db059a43d 100644 --- a/src/renderer/symbol_bucket.cpp +++ b/src/renderer/symbol_bucket.cpp @@ -345,15 +345,15 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float const int glyph_vertex_length = 4; if (!buffer.groups.size() || - (buffer.groups.back()->vertex_length + glyph_vertex_length > 65535)) { + (buffer.groups.back().vertex_length + glyph_vertex_length > 65535)) { // Move to a new group because the old one can't hold the geometry. - buffer.groups.emplace_back(std::make_unique>()); + buffer.groups.emplace_back(); } // We're generating triangle fans, so we always start with the first // coordinate in this polygon. TextElementGroup &triangleGroup = buffer.groups.back(); - uint32_t triangleIndex = triangleGroup->vertex_length; + uint32_t triangleIndex = triangleGroup.vertex_length; // coordinates (2 triangles) buffer.vertices.add(glyphAnchor.x, glyphAnchor.y, tl.x, tl.y, tex.x, tex.y, angle, minZoom, @@ -369,8 +369,8 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float buffer.triangles.add(triangleIndex + 0, triangleIndex + 1, triangleIndex + 2); buffer.triangles.add(triangleIndex + 1, triangleIndex + 2, triangleIndex + 3); - triangleGroup->vertex_length += glyph_vertex_length; - triangleGroup->elements_length += 2; + triangleGroup.vertex_length += glyph_vertex_length; + triangleGroup.elements_length += 2; } } @@ -378,10 +378,10 @@ void SymbolBucket::drawGlyphs(TextShader &shader) { char *vertex_index = BUFFER_OFFSET(0); char *elements_index = BUFFER_OFFSET(0); for (TextElementGroup &group : text.groups) { - group->array[0].bind(shader, text.vertices, text.triangles, vertex_index); - glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group->vertex_length * text.vertices.itemSize; - elements_index += group->elements_length * text.triangles.itemSize; + group.array[0].bind(shader, text.vertices, text.triangles, vertex_index); + glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group.vertex_length * text.vertices.itemSize; + elements_index += group.elements_length * text.triangles.itemSize; } } @@ -389,10 +389,10 @@ void SymbolBucket::drawIcons(IconShader &shader) { char *vertex_index = BUFFER_OFFSET(0); char *elements_index = BUFFER_OFFSET(0); for (IconElementGroup &group : icon.groups) { - group->array[0].bind(shader, icon.vertices, icon.triangles, vertex_index); - glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group->vertex_length * icon.vertices.itemSize; - elements_index += group->elements_length * icon.triangles.itemSize; + group.array[0].bind(shader, icon.vertices, icon.triangles, vertex_index); + glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group.vertex_length * icon.vertices.itemSize; + elements_index += group.elements_length * icon.triangles.itemSize; } } } From c8d76867db12149fbbe9c4652268c9c1cf0c7891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 12:10:49 +0200 Subject: [PATCH 07/13] remove unused includes --- src/renderer/fill_bucket.cpp | 2 +- src/renderer/line_bucket.cpp | 1 - src/renderer/symbol_bucket.cpp | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index e057e9faa..875cc279b 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -8,7 +8,7 @@ #include #include -#include + #include diff --git a/src/renderer/line_bucket.cpp b/src/renderer/line_bucket.cpp index 1b8586c15..e089d7f61 100644 --- a/src/renderer/line_bucket.cpp +++ b/src/renderer/line_bucket.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #define BUFFER_OFFSET(i) ((char *)nullptr + (i)) diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp index db059a43d..fd8931509 100644 --- a/src/renderer/symbol_bucket.cpp +++ b/src/renderer/symbol_bucket.cpp @@ -16,7 +16,6 @@ #include #include #include -#include namespace mbgl { From a55be0217bdc2b4e15500f9a5cd4aba207d33fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 12:22:28 +0200 Subject: [PATCH 08/13] test with the current release type's settings to avoid double compiles --- Makefile | 6 +++--- common.gypi | 10 ---------- include/mbgl/platform/event.hpp | 5 ----- scripts/run_tests.sh | 2 +- 4 files changed, 4 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index fe44e914d..c8d11b407 100644 --- a/Makefile +++ b/Makefile @@ -25,11 +25,11 @@ build/test/Makefile: src common config.gypi test/test.gyp deps/run_gyp test/test.gyp --depth=. -Goutput_dir=.. --generator-output=./build/test -f make test: build/test/Makefile - $(MAKE) -C build/test BUILDTYPE=Testing V=$(V) test + $(MAKE) -C build/test BUILDTYPE=$(BUILDTYPE) V=$(V) test test_%: build/test/Makefile - $(MAKE) -C build/test BUILDTYPE=Testing V=$(V) $* - (cd build/Testing && exec ./test_$*) + $(MAKE) -C build/test BUILDTYPE=$(BUILDTYPE) V=$(V) $* + (cd build/$(BUILDTYPE) && exec ./test_$*) # build Mac OS X project for Xcode xtest: config.gypi clear_xcode_cache node diff --git a/common.gypi b/common.gypi index 513d8688f..5d02a71c1 100644 --- a/common.gypi +++ b/common.gypi @@ -34,16 +34,6 @@ 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES' } }, - 'Testing': { - 'cflags_cc': [ '-O3' ], - 'defines': [ 'NDEBUG', 'TESTING' ], - 'xcode_settings': { - 'GCC_OPTIMIZATION_LEVEL': '3', - 'GCC_GENERATE_DEBUGGING_SYMBOLS': 'NO', - 'DEAD_CODE_STRIPPING': 'YES', - 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES' - } - } } } } diff --git a/include/mbgl/platform/event.hpp b/include/mbgl/platform/event.hpp index 01a23aa25..1676f40d2 100644 --- a/include/mbgl/platform/event.hpp +++ b/include/mbgl/platform/event.hpp @@ -10,7 +10,6 @@ namespace mbgl { enum class EventSeverity : uint8_t { Debug, Info, - Test, Warning, Error, }; @@ -18,7 +17,6 @@ enum class EventSeverity : uint8_t { MBGL_DEFINE_ENUM_CLASS(EventSeverityClass, EventSeverity, { { EventSeverity::Debug, "DEBUG" }, { EventSeverity::Info, "INFO" }, - { EventSeverity::Test, "TEST" }, { EventSeverity::Warning, "WARNING" }, { EventSeverity::Error, "ERROR" }, { EventSeverity(-1), "UNKNOWN" }, @@ -61,9 +59,6 @@ constexpr EventSeverity disabledEventSeverities[] = { #if !DEBUG EventSeverity::Debug, #endif -#if !TESTING - EventSeverity::Test, -#endif }; diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index 716594824..dd9ee3f26 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -3,7 +3,7 @@ set -e set -o pipefail -cd build/Testing +cd build/${BUILDTYPE:-Release} for TEST in ./test_* ; do ${TEST} From 953e5524a99325ffb049f466b85ce13a62dc327a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 14:28:56 +0200 Subject: [PATCH 09/13] fix basepath for headless stylesheets --- include/mbgl/util/url.hpp | 1 + src/renderer/painter_symbol.cpp | 65 ++++++++++++++----------------- src/util/url.cpp | 21 ++++++++++ test/fixtures/fixture_request.cpp | 14 +++---- test/headless.cpp | 17 ++------ 5 files changed, 61 insertions(+), 57 deletions(-) diff --git a/include/mbgl/util/url.hpp b/include/mbgl/util/url.hpp index 14d9dd316..a7e5291ec 100644 --- a/include/mbgl/util/url.hpp +++ b/include/mbgl/util/url.hpp @@ -7,6 +7,7 @@ namespace mbgl { namespace util { std::string percentEncode(const std::string&); +std::string percentDecode(const std::string&); } } diff --git a/src/renderer/painter_symbol.cpp b/src/renderer/painter_symbol.cpp index 66961b318..c2d62bec7 100644 --- a/src/renderer/painter_symbol.cpp +++ b/src/renderer/painter_symbol.cpp @@ -56,45 +56,38 @@ void Painter::renderSymbol(SymbolBucket &bucket, std::shared_ptr lay const timestamp currentTime = util::now(); std::deque &history = frameHistory.history; + if (history.size() >= 2) { + // Remove frames until only one is outside the duration, or until there are only three + while (history.size() > 3 && history[1].t + duration < currentTime) { + history.pop_front(); + } - // Remove frames until only one is outside the duration, or until there are only three - while (history.size() > 3 && history[1].t + duration < currentTime) { - history.pop_front(); + if (history[1].t + duration < currentTime) { + history[0].z = history[1].z; + } + + // Find the range of zoom levels we want to fade between + float startingZ = history.front().z; + const FrameSnapshot lastFrame = history.back(); + float endingZ = lastFrame.z; + float lowZ = std::fmin(startingZ, endingZ); + float highZ = std::fmax(startingZ, endingZ); + + // Calculate the speed of zooming, and how far it would zoom in terms of zoom levels in one + // duration + float zoomDiff = endingZ - history[1].z, timeDiff = lastFrame.t - history[1].t; + float fadedist = zoomDiff / (timeDiff / duration); + + // At end of a zoom when the zoom stops changing continue pretending to zoom at that speed + // bump is how much farther it would have been if it had continued zooming at the same rate + float bump = (currentTime - lastFrame.t) / duration * fadedist; + + textShader->setFadeDist(fadedist * 10); + textShader->setMinFadeZoom(std::floor(lowZ * 10)); + textShader->setMaxFadeZoom(std::floor(highZ * 10)); + textShader->setFadeZoom((map.getState().getNormalizedZoom() + bump) * 10); } - if (history[1].t + duration < currentTime) { - history[0].z = history[1].z; - } - - assert("there should never be less than three frames in the history" && - (history.size() >= 3)); - - // Find the range of zoom levels we want to fade between - float startingZ = history.front().z; - const FrameSnapshot lastFrame = history.back(); - float endingZ = lastFrame.z; - float lowZ = std::fmin(startingZ, endingZ); - float highZ = std::fmax(startingZ, endingZ); - - // Calculate the speed of zooming, and how far it would zoom in terms of zoom levels in one - // duration - float zoomDiff = endingZ - history[1].z, timeDiff = lastFrame.t - history[1].t; - float fadedist = zoomDiff / (timeDiff / duration); - -#if defined(DEBUG) -// if (std::isnan(fadedist)) -// fprintf(stderr, "fadedist should never be NaN\n"); -#endif - - // At end of a zoom when the zoom stops changing continue pretending to zoom at that speed - // bump is how much farther it would have been if it had continued zooming at the same rate - float bump = (currentTime - lastFrame.t) / duration * fadedist; - - textShader->setFadeDist(fadedist * 10); - textShader->setMinFadeZoom(std::floor(lowZ * 10)); - textShader->setMaxFadeZoom(std::floor(highZ * 10)); - textShader->setFadeZoom((map.getState().getNormalizedZoom() + bump) * 10); - // This defines the gamma around the SDF cutoff value. const float sdfGamma = 1.0f / 10.0f; diff --git a/src/util/url.cpp b/src/util/url.cpp index b1a721d86..4f5113e8b 100644 --- a/src/util/url.cpp +++ b/src/util/url.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace mbgl { namespace util { @@ -25,5 +26,25 @@ std::string percentEncode(const std::string& input) { return encoded.str(); } +std::string percentDecode(const std::string& input) { + std::string decoded; + + auto it = input.begin(); + const auto end = input.end(); + char hex[3] = "00"; + + while (it != end) { + auto cur = std::find(it, end, '%'); + decoded.append(it, cur); + it = cur; + if (cur != end) { + it += input.copy(hex, 2, cur - input.begin() + 1) + 1; + decoded += static_cast(std::strtoul(hex, nullptr, 16)); + } + } + + return decoded; +} + } } diff --git a/test/fixtures/fixture_request.cpp b/test/fixtures/fixture_request.cpp index 1a7ed2ccc..7e351ecfa 100644 --- a/test/fixtures/fixture_request.cpp +++ b/test/fixtures/fixture_request.cpp @@ -1,12 +1,15 @@ #include #include #include +#include #include const std::string base_directory = []{ std::string fn = __FILE__; fn.erase(fn.find_last_of("/")); - return fn; + fn.erase(fn.find_last_of("/")); + fn.erase(fn.find_last_of("/")); + return fn + "/node_modules/mapbox-gl-test-suite/"; }(); @@ -23,14 +26,11 @@ platform::request_http(const std::string &url, l = uv_default_loop(); } - std::string clean_url = base_directory + "/" + url; - auto pos = clean_url.find("://"); - if (pos != std::string::npos) { - clean_url.replace(pos, 3, "/"); + std::string clean_url = util::percentDecode(url); + if (clean_url.find("local://") == 0) { + clean_url = base_directory + clean_url.substr(8); } - std::replace(clean_url.begin(), clean_url.end(), '+', ' '); - std::shared_ptr req = std::make_shared(url, callback, loop); int err; diff --git a/test/headless.cpp b/test/headless.cpp index a2f58e98d..2453f1bb3 100644 --- a/test/headless.cpp +++ b/test/headless.cpp @@ -18,17 +18,12 @@ const std::string base_directory = []{ std::string fn = __FILE__; fn.erase(fn.find_last_of("/")); - return fn + "/../node_modules/mapbox-gl-test-suite/"; + fn.erase(fn.find_last_of("/")); + return fn + "/node_modules/mapbox-gl-test-suite/"; }(); class HeadlessTest : public ::testing::TestWithParam {}; -void ResolveLocalURL(rapidjson::Value& value, rapidjson::Document& doc) { - std::string str { value.GetString(), value.GetStringLength() }; - str.replace(0, 8, base_directory); // local:// - value.SetString(str.c_str(), str.length(), doc.GetAllocator()); -} - TEST_P(HeadlessTest, render) { using namespace mbgl; @@ -43,12 +38,6 @@ TEST_P(HeadlessTest, render) { ASSERT_EQ(false, styleDoc.HasParseError()); ASSERT_EQ(true, styleDoc.IsObject()); - if (styleDoc.HasMember("sprite")) { - ResolveLocalURL(styleDoc["sprite"], styleDoc); - } - - ResolveLocalURL(styleDoc["sources"]["mapbox"]["tiles"][rapidjson::SizeType(0)], styleDoc); - rapidjson::StringBuffer buffer; rapidjson::Writer writer(buffer); styleDoc.Accept(writer); @@ -91,7 +80,7 @@ TEST_P(HeadlessTest, render) { } } - map.setStyleJSON(style); + map.setStyleJSON(style, base_directory); map.setAppliedClasses(classes); view.resize(width, height); From e40ca0ac612c22bbf8d4b4f8ca2df45750795e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 14:29:10 +0200 Subject: [PATCH 10/13] never allow negative segment indices --- src/text/placement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text/placement.cpp b/src/text/placement.cpp index 26cc9f70f..0c95e3a80 100644 --- a/src/text/placement.cpp +++ b/src/text/placement.cpp @@ -80,7 +80,7 @@ void getSegmentGlyphs(std::back_insert_iterator glyphs, Anchor & // skip duplicate nodes while (newAnchor == end) { segment += direction; - if ((int)line.size() <= segment) { + if ((int)line.size() <= segment || segment < 0) { anchor.scale = scale; return; } From 9d74dbad96380fb90bfcebf41d4ac516330f5dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 14:36:14 +0200 Subject: [PATCH 11/13] only deploy when aws keys are present --- scripts/travis_script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_script.sh b/scripts/travis_script.sh index 2fc6029b4..f1cad6b9d 100755 --- a/scripts/travis_script.sh +++ b/scripts/travis_script.sh @@ -12,7 +12,7 @@ if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then ./scripts/run_tests.sh (cd ./node_modules/mapbox-gl-test-suite/ && (./bin/compare_images.js || true)) - if [ "${TRAVIS_PULL_REQUEST}" == "false" ] ; then + if [ ! -z "${AWS_ACCESS_KEY_ID}" ] && [ ! -z "${AWS_SECRET_ACCESS_KEY}" ] ; then (cd ./node_modules/mapbox-gl-test-suite/ && ./bin/deploy_results.sh) fi From 2d61722178873dacb5709456507104585e6c4ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 14:37:30 +0200 Subject: [PATCH 12/13] deploy dependency builds only with aws keys --- setup-libraries.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup-libraries.sh b/setup-libraries.sh index 5b7bf117e..dc0ced33e 100755 --- a/setup-libraries.sh +++ b/setup-libraries.sh @@ -113,7 +113,7 @@ source MacOSX.sh ./scripts/make_universal.sh -if [[ $TRAVIS_PULL_REQUEST = "false" ]]; then +if [ ! -z "${AWS_ACCESS_KEY_ID}" ] && [ ! -z "${AWS_SECRET_ACCESS_KEY}" ] ; then tar -zcf out/build-cpp11-libcpp-universal_${MP_HASH}_${DIR_HASH}.tar.gz out/build-cpp11-libcpp-universal aws s3 cp --acl public-read out/build-cpp11-libcpp-universal_${MP_HASH}_${DIR_HASH}.tar.gz s3://mapbox-gl-testing/dependencies/ fi @@ -144,7 +144,7 @@ source Linux.sh if [ ! -f out/build-cpp11-libstdcpp-gcc-x86_64-linux/lib/libcurl.a ] ; then ./scripts/build_curl.sh ; fi if [ ! -f out/build-cpp11-libstdcpp-gcc-x86_64-linux/lib/libboost_regex.a ] ; then ./scripts/build_boost.sh --with-regex ; fi -if [[ $TRAVIS_PULL_REQUEST = "false" ]]; then +if [ ! -z "${AWS_ACCESS_KEY_ID}" ] && [ ! -z "${AWS_SECRET_ACCESS_KEY}" ] ; then if ! tar --compare -zf out/build-cpp11-libstdcpp-gcc-x86_64-linux.tar.gz ; then tar -zcf out/build-cpp11-libstdcpp-gcc-x86_64-linux.tar.gz out/build-cpp11-libstdcpp-gcc-x86_64-linux aws s3 cp --acl public-read out/build-cpp11-libstdcpp-gcc-x86_64-linux.tar.gz s3://mapbox-gl-testing/dependencies/ From 98c092ec0a562a095b7e100897a9ee5407e485ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 27 Aug 2014 14:43:03 +0200 Subject: [PATCH 13/13] add missing header --- src/util/url.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/url.cpp b/src/util/url.cpp index 4f5113e8b..e9b967210 100644 --- a/src/util/url.cpp +++ b/src/util/url.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace mbgl { namespace util {