diff options
author | Ansis Brammanis <ansis@mapbox.com> | 2017-10-25 15:07:07 -0400 |
---|---|---|
committer | Ansis Brammanis <ansis@mapbox.com> | 2017-10-25 15:24:12 -0400 |
commit | 9100c748c14b225dfb2620c156ede441049cc2a4 (patch) | |
tree | f13d3e385258c41be697d267cb0b4ba276f29a1e | |
parent | 6a62f902413e29b139fc218865d5f67e8a90ba72 (diff) | |
download | qtlocation-mapboxgl-9100c748c14b225dfb2620c156ede441049cc2a4.tar.gz |
implement fading within tiles [skip ci]
-rw-r--r-- | src/mbgl/programs/symbol_program.cpp | 11 | ||||
-rw-r--r-- | src/mbgl/programs/symbol_program.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/renderer/paint_parameters.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/paint_parameters.hpp | 5 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 14 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/text/placement.cpp | 5 |
8 files changed, 35 insertions, 21 deletions
diff --git a/src/mbgl/programs/symbol_program.cpp b/src/mbgl/programs/symbol_program.cpp index 7aded08809..84a7a53f1d 100644 --- a/src/mbgl/programs/symbol_program.cpp +++ b/src/mbgl/programs/symbol_program.cpp @@ -37,6 +37,7 @@ Values makeValues(const bool isText, const bool alongLine, const RenderTile& tile, const TransformState& state, + const float symbolFadeChange, Args&&... args) { std::array<float, 2> extrudeScale; @@ -82,7 +83,7 @@ Values makeValues(const bool isText, uniforms::u_extrude_scale::Value{ extrudeScale }, uniforms::u_texsize::Value{ texsize }, uniforms::u_texture::Value{ 0 }, - uniforms::u_fade_change::Value{ 1 }, + uniforms::u_fade_change::Value{ symbolFadeChange }, uniforms::u_is_text::Value{ isText }, uniforms::u_camera_to_center_distance::Value{ state.getCameraToCenterDistance() }, uniforms::u_pitch::Value{ state.getPitch() }, @@ -101,7 +102,8 @@ SymbolIconProgram::uniformValues(const bool isText, const std::array<float, 2>& pixelsToGLUnits, const bool alongLine, const RenderTile& tile, - const TransformState& state) + const TransformState& state, + const float symbolFadeChange) { return makeValues<SymbolIconProgram::UniformValues>( isText, @@ -110,7 +112,8 @@ SymbolIconProgram::uniformValues(const bool isText, pixelsToGLUnits, alongLine, tile, - state + state, + symbolFadeChange ); } @@ -123,6 +126,7 @@ typename SymbolSDFProgram<PaintProperties>::UniformValues SymbolSDFProgram<Paint const bool alongLine, const RenderTile& tile, const TransformState& state, + const float symbolFadeChange, const SymbolSDFPart part) { const float gammaScale = (values.pitchAlignment == AlignmentType::Map @@ -137,6 +141,7 @@ typename SymbolSDFProgram<PaintProperties>::UniformValues SymbolSDFProgram<Paint alongLine, tile, state, + symbolFadeChange, uniforms::u_gamma_scale::Value{ gammaScale }, uniforms::u_is_halo::Value{ part == SymbolSDFPart::Halo } ); diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp index 7616205791..5d386b7472 100644 --- a/src/mbgl/programs/symbol_program.hpp +++ b/src/mbgl/programs/symbol_program.hpp @@ -386,7 +386,8 @@ public: const std::array<float, 2>& pixelsToGLUnits, const bool alongLine, const RenderTile&, - const TransformState&); + const TransformState&, + const float symbolFadeChange); }; enum class SymbolSDFPart { @@ -454,6 +455,7 @@ public: const bool alongLine, const RenderTile&, const TransformState&, + const float SymbolFadeChange, const SymbolSDFPart); }; diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 92aed48409..94bcd1e483 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -149,7 +149,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { if (bucket.sdfIcons) { if (values.hasHalo) { draw(parameters.programs.symbolIconSDF, - SymbolSDFIconProgram::uniformValues(false, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, SymbolSDFPart::Halo), + SymbolSDFIconProgram::uniformValues(false, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, parameters.symbolFadeChange, SymbolSDFPart::Halo), bucket.icon, bucket.iconSizeBinder, values, @@ -159,7 +159,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { if (values.hasFill) { draw(parameters.programs.symbolIconSDF, - SymbolSDFIconProgram::uniformValues(false, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, SymbolSDFPart::Fill), + SymbolSDFIconProgram::uniformValues(false, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, parameters.symbolFadeChange, SymbolSDFPart::Fill), bucket.icon, bucket.iconSizeBinder, values, @@ -168,7 +168,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { } } else { draw(parameters.programs.symbolIcon, - SymbolIconProgram::uniformValues(false, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state), + SymbolIconProgram::uniformValues(false, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, parameters.symbolFadeChange), bucket.icon, bucket.iconSizeBinder, values, @@ -202,7 +202,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { if (values.hasHalo) { draw(parameters.programs.symbolGlyph, - SymbolSDFTextProgram::uniformValues(true, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, SymbolSDFPart::Halo), + SymbolSDFTextProgram::uniformValues(true, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, parameters.symbolFadeChange, SymbolSDFPart::Halo), bucket.text, bucket.textSizeBinder, values, @@ -212,7 +212,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { if (values.hasFill) { draw(parameters.programs.symbolGlyph, - SymbolSDFTextProgram::uniformValues(true, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, SymbolSDFPart::Fill), + SymbolSDFTextProgram::uniformValues(true, values, texsize, parameters.pixelsToGLUnits, alongLine, tile, parameters.state, parameters.symbolFadeChange, SymbolSDFPart::Fill), bucket.text, bucket.textSizeBinder, values, diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp index 58dd5597a5..25d0be7518 100644 --- a/src/mbgl/renderer/paint_parameters.cpp +++ b/src/mbgl/renderer/paint_parameters.cpp @@ -13,7 +13,8 @@ PaintParameters::PaintParameters(gl::Context& context_, const EvaluatedLight& evaluatedLight_, RenderStaticData& staticData_, ImageManager& imageManager_, - LineAtlas& lineAtlas_) + LineAtlas& lineAtlas_, + TimePoint placementCommitTime) : context(context_), backend(backend_), state(updateParameters.transformState), @@ -25,6 +26,7 @@ PaintParameters::PaintParameters(gl::Context& context_, debugOptions(updateParameters.debugOptions), contextMode(contextMode_), timePoint(updateParameters.timePoint), + symbolFadeChange(std::chrono::duration<float>(placementCommitTime - updateParameters.timePoint) / Duration(std::chrono::milliseconds(300))), // TODO don't hardcode pixelRatio(pixelRatio_), #ifndef NDEBUG programs((debugOptions & MapDebugOptions::Overdraw) ? staticData_.overdrawPrograms : staticData_.programs) diff --git a/src/mbgl/renderer/paint_parameters.hpp b/src/mbgl/renderer/paint_parameters.hpp index 37e07d5731..65ef542562 100644 --- a/src/mbgl/renderer/paint_parameters.hpp +++ b/src/mbgl/renderer/paint_parameters.hpp @@ -32,7 +32,8 @@ public: const EvaluatedLight&, RenderStaticData&, ImageManager&, - LineAtlas&); + LineAtlas&, + TimePoint placementCommitTime); gl::Context& context; RendererBackend& backend; @@ -50,6 +51,8 @@ public: GLContextMode contextMode; TimePoint timePoint; + float symbolFadeChange; + float pixelRatio; std::array<float, 2> pixelsToGLUnits; algorithm::ClipIDGenerator clipIDGenerator; diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index dd290ca84c..7fcb3c6a3b 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -27,7 +27,6 @@ #include <mbgl/util/math.hpp> #include <mbgl/util/string.hpp> #include <mbgl/util/logging.hpp> -#include <mbgl/text/placement.hpp> namespace mbgl { @@ -254,7 +253,8 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { renderLight.getEvaluated(), *staticData, *imageManager, - *lineAtlas + *lineAtlas, + updateParameters.timePoint // TODO set this only when committing placement }; bool loaded = updateParameters.styleLoaded && isLoaded(); @@ -363,16 +363,16 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { order.emplace_back(RenderItem { *layer, source }); } - Placement placement(parameters.state); + auto newPlacement = std::make_unique<Placement>(parameters.state); for (auto it = order.rbegin(); it != order.rend(); ++it) { if (it->layer.is<RenderSymbolLayer>()) { bool showCollisionBoxes = true; // TODO - placement.placeLayer(*it->layer.as<RenderSymbolLayer>(), showCollisionBoxes); + newPlacement->placeLayer(*it->layer.as<RenderSymbolLayer>(), showCollisionBoxes); } } - std::unique_ptr<Placement> prevPlacement; - placement.commit(std::move(prevPlacement), Clock::now()); + newPlacement->commit(std::move(placement), parameters.timePoint); + placement = std::move(newPlacement); // - UPLOAD PASS ------------------------------------------------------------------------------- // Uploads all required buffers and images before we do any actual rendering. @@ -392,7 +392,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { for (auto it = order.rbegin(); it != order.rend(); ++it) { if (it->layer.is<RenderSymbolLayer>()) { - placement.updateLayerOpacities(*it->layer.as<RenderSymbolLayer>(), parameters.context); + placement->updateLayerOpacities(*it->layer.as<RenderSymbolLayer>(), parameters.context); } } diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp index 90bf21317f..836f573abe 100644 --- a/src/mbgl/renderer/renderer_impl.hpp +++ b/src/mbgl/renderer/renderer_impl.hpp @@ -10,6 +10,7 @@ #include <mbgl/map/zoom_history.hpp> #include <mbgl/map/mode.hpp> #include <mbgl/text/glyph_manager_observer.hpp> +#include <mbgl/text/placement.hpp> #include <memory> #include <string> @@ -103,6 +104,8 @@ private: std::unordered_map<std::string, std::unique_ptr<RenderLayer>> renderLayers; RenderLight renderLight; + std::unique_ptr<Placement> placement; + bool contextLost = false; }; diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 0583902932..08add2b27e 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -11,7 +11,7 @@ namespace mbgl { OpacityState::OpacityState(float targetOpacity_) : opacity(0), targetOpacity(targetOpacity_) {} OpacityState::OpacityState(OpacityState& prevState, float increment, float targetOpacity) : - opacity(std::fmax(0, std::fmin(1, prevState.opacity + prevState.targetOpacity == 1.0 ? increment : -increment))), + opacity(std::fmax(0, std::fmin(1, prevState.opacity + (prevState.targetOpacity == 1.0 ? increment : -increment)))), targetOpacity(targetOpacity) {} bool OpacityState::isHidden() const { @@ -155,8 +155,7 @@ void Placement::commit(std::unique_ptr<Placement> prevPlacement, TimePoint now) } } else { - const Duration symbolFadeDuration(300); - float increment = (commitTime - prevPlacement->commitTime) / symbolFadeDuration; + float increment = std::chrono::duration<float>(commitTime - prevPlacement->commitTime) / Duration(std::chrono::milliseconds(300)); // add the opacities from the current placement, and copy their current values from the previous placement for (auto& placementPair : placements) { |