diff options
author | Chris Loer <chris.loer@gmail.com> | 2017-11-09 13:24:43 -0800 |
---|---|---|
committer | Chris Loer <chris.loer@mapbox.com> | 2017-11-17 10:05:15 -0800 |
commit | 18d735ccc20e1e7d4616b3d3b5b1a527a01d1b91 (patch) | |
tree | b40ebc487a62714174a60f6ebc459b867be23aee /src/mbgl/text/placement.hpp | |
parent | 601a1c8dcf73f1a419c1ed5c39fbd14c581abf50 (diff) | |
download | qtlocation-mapboxgl-18d735ccc20e1e7d4616b3d3b5b1a527a01d1b91.tar.gz |
[core] Add Placement class.
Responsible for running global collision detection/symbol placement algorithm and updating symbol opacity buffers accordingly.
Diffstat (limited to 'src/mbgl/text/placement.hpp')
-rw-r--r-- | src/mbgl/text/placement.hpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp new file mode 100644 index 0000000000..a50fc47125 --- /dev/null +++ b/src/mbgl/text/placement.hpp @@ -0,0 +1,82 @@ +#pragma once + +#include <string> +#include <unordered_map> +#include <mbgl/util/chrono.hpp> +#include <mbgl/text/collision_index.hpp> +#include <mbgl/layout/symbol_projection.hpp> +#include <unordered_set> + +namespace mbgl { + + class RenderSymbolLayer; + class SymbolBucket; + + class OpacityState { + public: + OpacityState(bool placed); + OpacityState(const OpacityState& prevOpacityState, float increment, bool placed); + bool isHidden() const; + float opacity; + bool placed; + }; + + class JointOpacityState { + public: + JointOpacityState(bool placedIcon, bool placedText); + JointOpacityState(const JointOpacityState& prevOpacityState, float increment, bool placedIcon, bool placedText); + bool isHidden() const; + OpacityState icon; + OpacityState text; + }; + + class PlacementPair { + public: + PlacementPair(bool text_, bool icon_) : text(text_), icon(icon_) {} + bool text; + bool icon; + }; + + class Placement { + public: + Placement(const TransformState&, MapMode mapMode); + void placeLayer(RenderSymbolLayer&, const mat4&, bool showCollisionBoxes); + bool commit(const Placement& prevPlacement, TimePoint); + void updateLayerOpacities(RenderSymbolLayer&); + JointOpacityState getOpacity(uint32_t crossTileSymbolID) const; + float symbolFadeChange(TimePoint now) const; + bool hasTransitions(TimePoint now) const; + + const CollisionIndex& getCollisionIndex() const; + + bool stillRecent(TimePoint now) const; + void setRecent(TimePoint now); + void setStale(); + private: + + void placeLayerBucket( + SymbolBucket&, + const mat4& posMatrix, + const mat4& textLabelPlaneMatrix, + const mat4& iconLabelPlaneMatrix, + const float scale, + const float pixelRatio, + const bool showCollisionBoxes, + std::unordered_set<uint32_t>& seenCrossTileIDs); + + void updateBucketOpacities(SymbolBucket&, std::unordered_set<uint32_t>&); + + CollisionIndex collisionIndex; + + TransformState state; + MapMode mapMode; + TimePoint commitTime; + + std::unordered_map<uint32_t,PlacementPair> placements; + std::unordered_map<uint32_t,JointOpacityState> opacities; + + TimePoint recentUntil; + bool stale = false; + }; + +} // namespace mbgl |