diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-10-22 15:18:30 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-10-22 15:18:30 +0200 |
commit | 087d04292a844fbfdb8d65457b1d44456e51c631 (patch) | |
tree | d8849a40764a09a53cd0920e8f5bdd87c65d9001 | |
parent | 905c4294be495d15591885a2438ca0b8abc8decf (diff) | |
parent | 253bbd1c5b5c5ae4a7bdbf731f58efa08d8cf855 (diff) | |
download | qtlocation-mapboxgl-087d04292a844fbfdb8d65457b1d44456e51c631.tar.gz |
Merge branch 'master' of github.com:mapbox/mapbox-gl-native
-rw-r--r-- | Makefile | 17 | ||||
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | include/mbgl/map/transform_state.hpp | 8 | ||||
-rw-r--r-- | include/mbgl/platform/event.hpp | 9 | ||||
-rw-r--r-- | include/mbgl/platform/log.hpp | 6 | ||||
-rw-r--r-- | include/mbgl/style/property_key.hpp | 3 | ||||
-rw-r--r-- | include/mbgl/style/style_properties.hpp | 1 | ||||
-rw-r--r-- | include/mbgl/util/mat3.hpp | 2 | ||||
-rw-r--r-- | src/map/transform_state.cpp | 30 | ||||
-rw-r--r-- | src/renderer/painter.cpp | 67 | ||||
-rw-r--r-- | src/style/style_layer.cpp | 1 | ||||
-rw-r--r-- | src/style/style_parser.cpp | 1 | ||||
-rw-r--r-- | src/util/mat3.cpp | 46 | ||||
-rw-r--r-- | test/fixtures/fixture_request.cpp | 2 |
14 files changed, 158 insertions, 37 deletions
@@ -11,13 +11,10 @@ config-ios.gypi: MASON_PLATFORM=ios ./configure config-ios.gypi # Builds the regular library -mbgl: config.gypi mapboxgl.gyp node +mbgl: config.gypi mapboxgl.gyp deps/run_gyp mapboxgl.gyp -Iconfig.gypi --depth=. -Goutput_dir=.. --generator-output=./build/mbgl -f make $(MAKE) -C build/mbgl BUILDTYPE=$(BUILDTYPE) V=$(V) mapboxgl -node: - @if [ ! `which node` ]; then echo 'error: depends on node.js. please make sure node is on your PATH'; exit 1; fi; - ##### Test cases ############################################################### build/test/Makefile: src common config.gypi test/test.gyp @@ -31,7 +28,7 @@ test_%: build/test/Makefile (cd build/$(BUILDTYPE) && exec ./test_$*) # build Mac OS X project for Xcode -xtest: config.gypi clear_xcode_cache node +xtest: config.gypi clear_xcode_cache deps/run_gyp test/test.gyp -Iconfig.gypi --depth=. -Goutput_dir=.. --generator-output=./build -f xcode open ./build/test/test.xcodeproj @@ -39,7 +36,7 @@ xtest: config.gypi clear_xcode_cache node # Builds the linux app with make. -linux: config.gypi linux/mapboxgl-app.gyp node +linux: config.gypi linux/mapboxgl-app.gyp deps/run_gyp linux/mapboxgl-app.gyp -Iconfig.gypi --depth=. -Goutput_dir=.. --generator-output=./build/linux -f make $(MAKE) -C build/linux BUILDTYPE=$(BUILDTYPE) V=$(V) linuxapp @@ -50,7 +47,7 @@ run-linux: linux # Builds the OS X app with make. -osx: config.gypi macosx/mapboxgl-app.gyp node +osx: config.gypi macosx/mapboxgl-app.gyp deps/run_gyp macosx/mapboxgl-app.gyp -Iconfig.gypi --depth=. -Goutput_dir=.. --generator-output=./build/macosx -f make $(MAKE) -C build/macosx BUILDTYPE=$(BUILDTYPE) V=$(V) osxapp @@ -72,21 +69,21 @@ clear_xcode_cache: fi # build Mac OS X project for Xcode -xproj-cli: config.gypi macosx/mapboxgl-app.gyp clear_xcode_cache node +xproj-cli: config.gypi macosx/mapboxgl-app.gyp clear_xcode_cache deps/run_gyp macosx/mapboxgl-app.gyp -Iconfig.gypi --depth=. --generator-output=./build -f xcode xproj: xproj-cli open ./build/macosx/mapboxgl-app.xcodeproj # build iOS project for Xcode -iproj-cli: config-ios.gypi ios/mapbox-gl-cocoa/app/mapboxgl-app.gyp clear_xcode_cache node +iproj-cli: config-ios.gypi ios/mapbox-gl-cocoa/app/mapboxgl-app.gyp clear_xcode_cache deps/run_gyp ios/mapbox-gl-cocoa/app/mapboxgl-app.gyp -Iconfig-ios.gypi --depth=. --generator-output=./build -f xcode iproj: iproj-cli open ./build/ios/mapbox-gl-cocoa/app/mapboxgl-app.xcodeproj # build Linux project for Xcode (Runs on Mac OS X too, but without platform-specific code) -lproj: config.gypi linux/mapboxgl-app.gyp clear_xcode_cache node +lproj: config.gypi linux/mapboxgl-app.gyp clear_xcode_cache deps/run_gyp linux/mapboxgl-app.gyp -Iconfig.gypi --depth=. --generator-output=./build -f xcode open ./build/linux/mapboxgl-app.xcodeproj @@ -1,4 +1,4 @@ -[![Travis](https://api.travis-ci.org/mapbox/mapbox-gl-native.svg)](https://travis-ci.org/mapbox/mapbox-gl-native/builds) +[![Travis](https://api.travis-ci.org/mapbox/mapbox-gl-native.svg?branch=master)](https://travis-ci.org/mapbox/mapbox-gl-native/builds) An OpenGL renderer for [Mapbox Vector Tiles](https://www.mapbox.com/blog/vector-tiles), implemented in C++11, currently targeting iOS, OS X, and Ubuntu Linux. diff --git a/include/mbgl/map/transform_state.hpp b/include/mbgl/map/transform_state.hpp index 5b3b7d3755..ed49dc3e99 100644 --- a/include/mbgl/map/transform_state.hpp +++ b/include/mbgl/map/transform_state.hpp @@ -29,10 +29,16 @@ public: const std::array<uint16_t, 2> getFramebufferDimensions() const; float getPixelRatio() const; + float worldSize() const; + float lngX(float lon) const; + float latY(float lat) const; + std::array<float, 2> locationCoordinate(float lon, float lat) const; + // Zoom float getNormalizedZoom() const; - int32_t getIntegerZoom() const; double getZoom() const; + int32_t getIntegerZoom() const; + double getZoomFraction() const; double getScale() const; // Rotation diff --git a/include/mbgl/platform/event.hpp b/include/mbgl/platform/event.hpp index 0405cddfad..2aa4aa0c95 100644 --- a/include/mbgl/platform/event.hpp +++ b/include/mbgl/platform/event.hpp @@ -57,14 +57,13 @@ struct EventPermutation { } }; -#if !DEBUG constexpr EventSeverity disabledEventSeverities[] = { - EventSeverity::Debug, -}; +#if DEBUG + EventSeverity(-1) // Avoid zero size array #else -constexpr EventSeverity *disabledEventSeverities = nullptr; + EventSeverity::Debug #endif - +}; constexpr Event disabledEvents[] = { Event(-1) // Avoid zero size array diff --git a/include/mbgl/platform/log.hpp b/include/mbgl/platform/log.hpp index bcb6d79224..406b3eea37 100644 --- a/include/mbgl/platform/log.hpp +++ b/include/mbgl/platform/log.hpp @@ -19,9 +19,9 @@ public: class Log { private: - template <typename T> - constexpr static bool includes(const T e, T const *l, const size_t i = 0) { - return l == nullptr ? false : i >= sizeof l ? false : *(l + i) == e ? true : includes(e, l, i + 1); + template <typename T, size_t N> + constexpr static bool includes(const T e, const T (&l)[N], const size_t i = 0) { + return i < N && (l[i] == e || includes(e, l, i + 1)); } public: diff --git a/include/mbgl/style/property_key.hpp b/include/mbgl/style/property_key.hpp index 28aa800607..cbf9ad2ac5 100644 --- a/include/mbgl/style/property_key.hpp +++ b/include/mbgl/style/property_key.hpp @@ -61,7 +61,8 @@ enum class PropertyKey { RasterFade, BackgroundOpacity, - BackgroundColor + BackgroundColor, + BackgroundImage }; } diff --git a/include/mbgl/style/style_properties.hpp b/include/mbgl/style/style_properties.hpp index 20200a0dd7..0a5e993411 100644 --- a/include/mbgl/style/style_properties.hpp +++ b/include/mbgl/style/style_properties.hpp @@ -94,6 +94,7 @@ struct BackgroundProperties { inline BackgroundProperties() {} float opacity = 1.0f; Color color = {{ 0, 0, 0, 1 }}; + std::string image; }; typedef mapbox::util::variant< diff --git a/include/mbgl/util/mat3.hpp b/include/mbgl/util/mat3.hpp index d44b1435d3..fa40751764 100644 --- a/include/mbgl/util/mat3.hpp +++ b/include/mbgl/util/mat3.hpp @@ -32,6 +32,8 @@ typedef std::array<float, 9> mat3; namespace matrix { void identity(mat3& out); +void translate(mat3& out, const mat3& a, float x, float y); +void rotate(mat3& out, const mat3& a, float rad); void scale(mat3& out, const mat3& a, float x, float y); } diff --git a/src/map/transform_state.cpp b/src/map/transform_state.cpp index d103897375..4b1bc4161e 100644 --- a/src/map/transform_state.cpp +++ b/src/map/transform_state.cpp @@ -83,11 +83,31 @@ const std::array<uint16_t, 2> TransformState::getFramebufferDimensions() const { return framebuffer; } - float TransformState::getPixelRatio() const { return pixelRatio; } +float TransformState::worldSize() const { + return scale * util::tileSize; +} + +float TransformState::lngX(float lon) const { + return (180 + lon) * worldSize() / 360; +} + +float TransformState::latY(float lat) const { + float y = 180 / M_PI * std::log(std::tan(M_PI / 4 + lat * M_PI / 360)); + return (180 - y) * worldSize() / 360; +} + +std::array<float, 2> TransformState::locationCoordinate(float lon, float lat) const { + float k = std::pow(2, getIntegerZoom()) / worldSize(); + return {{ + lngX(lon) * k, + latY(lat) * k + }}; +} + #pragma mark - Zoom @@ -95,12 +115,16 @@ float TransformState::getNormalizedZoom() const { return std::log(scale * util::tileSize / 512.0f) / M_LN2; } +double TransformState::getZoom() const { + return std::log(scale) / M_LN2; +} + int32_t TransformState::getIntegerZoom() const { return std::floor(getZoom()); } -double TransformState::getZoom() const { - return std::log(scale) / M_LN2; +double TransformState::getZoomFraction() const { + return getZoom() - getIntegerZoom(); } double TransformState::getScale() const { diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index 8988112585..e82b1b5f63 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -7,6 +7,9 @@ #include <mbgl/util/time.hpp> #include <mbgl/util/clip_ids.hpp> #include <mbgl/util/constants.hpp> +#include <mbgl/util/mat3.hpp> +#include <mbgl/geometry/sprite_atlas.hpp> + #if defined(DEBUG) #include <mbgl/util/timer.hpp> #endif @@ -208,24 +211,66 @@ void Painter::renderTileLayer(const Tile& tile, util::ptr<StyleLayer> layer_desc void Painter::renderBackground(util::ptr<StyleLayer> layer_desc) { const BackgroundProperties& properties = layer_desc->getProperties<BackgroundProperties>(); + const std::shared_ptr<Sprite> sprite = map.getSprite(); + + if (properties.image.size() && sprite) { + if ((properties.opacity >= 1.0f) != (pass == RenderPass::Opaque)) + return; + + SpriteAtlas &spriteAtlas = *map.getSpriteAtlas(); + SpriteAtlasPosition imagePos = spriteAtlas.getPosition(properties.image, *sprite, true); + float zoomFraction = map.getState().getZoomFraction(); + + useProgram(patternShader->program); + patternShader->u_matrix = identityMatrix; + patternShader->u_pattern_tl = imagePos.tl; + patternShader->u_pattern_br = imagePos.br; + patternShader->u_mix = zoomFraction; + patternShader->u_opacity = properties.opacity; + + std::array<float, 2> size = imagePos.size; + double lon, lat; + map.getLonLat(lon, lat); + std::array<float, 2> center = map.getState().locationCoordinate(lon, lat); + float scale = 1 / std::pow(2, zoomFraction); + + mat3 matrix; + matrix::identity(matrix); + matrix::scale(matrix, matrix, + 1.0f / size[0], + 1.0f / size[1]); + matrix::translate(matrix, matrix, + std::fmod(center[0] * 512, size[0]), + std::fmod(center[1] * 512, size[1])); + matrix::rotate(matrix, matrix, -map.getState().getAngle()); + matrix::scale(matrix, matrix, + scale * map.getState().getWidth() / 2, + -scale * map.getState().getHeight() / 2); + patternShader->u_patternmatrix = matrix; + + backgroundBuffer.bind(); + patternShader->bind(0); + spriteAtlas.bind(true); + } else { + Color color = properties.color; + color[0] *= properties.opacity; + color[1] *= properties.opacity; + color[2] *= properties.opacity; + color[3] *= properties.opacity; - Color color = properties.color; - color[0] *= properties.opacity; - color[1] *= properties.opacity; - color[2] *= properties.opacity; - color[3] *= properties.opacity; + if ((color[3] >= 1.0f) != (pass == RenderPass::Opaque)) + return; - if ((color[3] >= 1.0f) == (pass == RenderPass::Opaque)) { useProgram(plainShader->program); plainShader->u_matrix = identityMatrix; plainShader->u_color = color; backgroundArray.bind(*plainShader, backgroundBuffer, BUFFER_OFFSET(0)); - - glDisable(GL_STENCIL_TEST); - depthRange(strata + strata_epsilon, 1.0f); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glEnable(GL_STENCIL_TEST); } + + glDisable(GL_STENCIL_TEST); + depthRange(strata + strata_epsilon, 1.0f); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glEnable(GL_STENCIL_TEST); } mat4 Painter::translatedMatrix(const mat4& matrix, const std::array<float, 2> &translation, const Tile::ID &id, TranslateAnchorType anchor) { diff --git a/src/style/style_layer.cpp b/src/style/style_layer.cpp index b1b878cc8d..8f79bc9047 100644 --- a/src/style/style_layer.cpp +++ b/src/style/style_layer.cpp @@ -235,6 +235,7 @@ void StyleLayer::applyStyleProperties<BackgroundProperties>(const float z, const BackgroundProperties &background = properties.get<BackgroundProperties>(); applyTransitionedStyleProperty(PropertyKey::BackgroundOpacity, background.opacity, z, now); applyTransitionedStyleProperty(PropertyKey::BackgroundColor, background.color, z, now); + applyStyleProperty(PropertyKey::BackgroundImage, background.image, z, now); } void StyleLayer::updateProperties(float z, const timestamp now) { diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 2a64ab38f8..a00fe61359 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -640,6 +640,7 @@ void StyleParser::parseStyle(JSVal value, ClassProperties &klass) { parseOptionalProperty<Function<float>>("background-opacity", Key::BackgroundOpacity, klass, value); parseOptionalProperty<Function<Color>>("background-color", Key::BackgroundColor, klass, value); + parseOptionalProperty<std::string>("background-image", Key::BackgroundImage, klass, value); } void StyleParser::parseReference(JSVal value, util::ptr<StyleLayer> &layer) { diff --git a/src/util/mat3.cpp b/src/util/mat3.cpp index 38858d2385..263768ee41 100644 --- a/src/util/mat3.cpp +++ b/src/util/mat3.cpp @@ -38,7 +38,51 @@ void matrix::identity(mat3& out) { out[8] = 1.0f; } -void matrix::scale(mat3& out, const mat3& a, const float x, const float y) { +void matrix::translate(mat3& out, const mat3& a, float x, float y) { + float a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8]; + + out[0] = a00; + out[1] = a01; + out[2] = a02; + + out[3] = a10; + out[4] = a11; + out[5] = a12; + + out[6] = x * a00 + y * a10 + a20; + out[7] = x * a01 + y * a11 + a21; + out[8] = x * a02 + y * a12 + a22; +} + +void matrix::rotate(mat3& out, const mat3& a, float rad) { + float s = std::sin(rad), + c = std::cos(rad), + a00 = a[0], + a01 = a[1], + a02 = a[2], + a10 = a[3], + a11 = a[4], + a12 = a[5], + a20 = a[6], + a21 = a[7], + a22 = a[8]; + + out[0] = c * a00 + s * a10; + out[1] = c * a01 + s * a11; + out[2] = c * a02 + s * a12; + + out[3] = c * a10 - s * a00; + out[4] = c * a11 - s * a01; + out[5] = c * a12 - s * a02; + + out[6] = a20; + out[7] = a21; + out[8] = a22; +}; + +void matrix::scale(mat3& out, const mat3& a, float x, float y) { out[0] = x * a[0]; out[1] = x * a[1]; out[2] = x * a[2]; diff --git a/test/fixtures/fixture_request.cpp b/test/fixtures/fixture_request.cpp index 3dd8a356a8..f3b41681a6 100644 --- a/test/fixtures/fixture_request.cpp +++ b/test/fixtures/fixture_request.cpp @@ -55,7 +55,7 @@ void HTTPRequestBaton::start(const util::ptr<HTTPRequestBaton> &baton) { uv_async_send(baton->async); } -void HTTPRequestBaton::stop(const util::ptr<HTTPRequestBaton> &) { +void HTTPRequestBaton::stop(const util::ptr<HTTPRequestBaton> &/*baton*/) { fprintf(stderr, "HTTP request cannot be canceled because it is answered immediately"); abort(); } |