diff options
author | Ansis Brammanis <brammanis@gmail.com> | 2017-06-20 14:20:39 -0400 |
---|---|---|
committer | Ansis Brammanis <brammanis@gmail.com> | 2017-06-20 14:20:39 -0400 |
commit | 383b7792a5f5bc5e2e882f6f7f78418cd6f9c7ae (patch) | |
tree | b87a866087b1468d39f7656bf9a18ec848edbd01 | |
parent | d3ea1633ed16a852d9a959c99e8a2eb9ad73981c (diff) | |
download | qtlocation-mapboxgl-383b7792a5f5bc5e2e882f6f7f78418cd6f9c7ae.tar.gz |
frame history and buffer updating
-rw-r--r-- | src/mbgl/gl/context.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/gl/context.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/layout/symbol_projection.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/layout/symbol_projection.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/frame_history.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/frame_history.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/painters/painter_symbol.cpp | 3 |
7 files changed, 25 insertions, 7 deletions
diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index e1c4b84ea1..16bf5c0407 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -173,6 +173,11 @@ UniqueBuffer Context::createVertexBuffer(const void* data, std::size_t size, boo return result; } +void Context::updateVertexBuffer(const void* data, std::size_t size, UniqueBuffer& buffer) { + vertexBuffer = buffer; + MBGL_CHECK_ERROR(glBufferSubData(GL_ARRAY_BUFFER, 0, size, data)); +} + UniqueBuffer Context::createIndexBuffer(const void* data, std::size_t size) { BufferID id = 0; MBGL_CHECK_ERROR(glGenBuffers(1, &id)); diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 8ba775e5b7..9bde094281 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -72,6 +72,11 @@ public: }; } + template <class Vertex, class DrawMode> + void updateVertexBuffer(VertexVector<Vertex, DrawMode>&& v, VertexBuffer<Vertex, DrawMode>& buffer) { + updateVertexBuffer(v.data(), v.byteSize(), buffer.buffer); + } + template <class DrawMode> IndexBuffer<DrawMode> createIndexBuffer(IndexVector<DrawMode>&& v) { return IndexBuffer<DrawMode> { @@ -240,6 +245,7 @@ private: #endif // MBGL_USE_GLES2 UniqueBuffer createVertexBuffer(const void* data, std::size_t size, bool dynamicDraw); + void updateVertexBuffer(const void* data, std::size_t size, UniqueBuffer& buffer); UniqueBuffer createIndexBuffer(const void* data, std::size_t size); UniqueTexture createTexture(Size size, const void* data, TextureFormat, TextureUnit); void updateTexture(TextureID, Size size, const void* data, TextureFormat, TextureUnit); diff --git a/src/mbgl/layout/symbol_projection.cpp b/src/mbgl/layout/symbol_projection.cpp index 8a7bc3cd71..652e04151e 100644 --- a/src/mbgl/layout/symbol_projection.cpp +++ b/src/mbgl/layout/symbol_projection.cpp @@ -3,6 +3,7 @@ #include <mbgl/renderer/render_tile.hpp> #include <mbgl/renderer/buckets/symbol_bucket.hpp> #include <mbgl/renderer/layers/render_symbol_layer.hpp> +#include <mbgl/renderer/frame_history.hpp> #include <mbgl/util/optional.hpp> #include <mbgl/util/math.hpp> @@ -48,7 +49,7 @@ namespace mbgl { return { static_cast<float>(pos[0] / pos[3]), static_cast<float>(pos[1] / pos[3]) }; } - bool isVisible(const vec4& anchorPos, const float, const std::array<double, 2>& clippingBuffer) { + bool isVisible(const vec4& anchorPos, const float placementZoom, const std::array<double, 2>& clippingBuffer, const FrameHistory& frameHistory) { const float x = anchorPos[0] / anchorPos[3]; const float y = anchorPos[1] / anchorPos[3]; const bool inPaddedViewport = ( @@ -56,8 +57,7 @@ namespace mbgl { x <= clippingBuffer[0] && y >= -clippingBuffer[1] && y <= clippingBuffer[1]); - // TODO do framehistory check here as well - return inPaddedViewport; + return inPaddedViewport && frameHistory.isVisible(placementZoom); } void addDynamicAttributes(const Point<float>& anchorPoint, const float angle, const float placementZoom, @@ -161,7 +161,7 @@ namespace mbgl { void reprojectLineLabels(SymbolBucket& bucket, const mat4& posMatrix, const bool isText, const style::SymbolPropertyValues& values, //const RenderTile& tile, const TransformState& state) { - const RenderTile&, const TransformState& state) { + const RenderTile&, const TransformState& state, const FrameHistory& frameHistory) { // const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; // const partiallyEvaluatedSize = symbolSize.evaluateSizeForZoom(sizeData, painter.transform, layer, isText); @@ -183,7 +183,7 @@ namespace mbgl { matrix::transformMat4(anchorPos, anchorPos, posMatrix); // Don't bother calculating the correct point for invisible labels. - if (!isVisible(anchorPos, placedSymbol.placementZoom, clippingBuffer)) { + if (!isVisible(anchorPos, placedSymbol.placementZoom, clippingBuffer, frameHistory)) { hideGlyphs(placedSymbol.glyphOffsets.size(), dynamicVertexArray); continue; } diff --git a/src/mbgl/layout/symbol_projection.hpp b/src/mbgl/layout/symbol_projection.hpp index 21bd1c78a2..ce584d82cf 100644 --- a/src/mbgl/layout/symbol_projection.hpp +++ b/src/mbgl/layout/symbol_projection.hpp @@ -7,6 +7,7 @@ namespace mbgl { class TransformState; class SymbolBucket; class RenderTile; + class FrameHistory; namespace style { class SymbolPropertyValues; } @@ -15,6 +16,6 @@ namespace mbgl { mat4 getGlCoordMatrix(const mat4& posMatrix, const bool pitchWithMap, const bool rotateWithMap, const TransformState& state, const float pixelsToTileUnits); void reprojectLineLabels(SymbolBucket&, const mat4& posMatrix, const bool isText, const style::SymbolPropertyValues&, - const RenderTile&, const TransformState&); + const RenderTile&, const TransformState&, const FrameHistory& frameHistory); } // end namespace mbgl diff --git a/src/mbgl/renderer/frame_history.cpp b/src/mbgl/renderer/frame_history.cpp index 869222b4eb..de153b6963 100644 --- a/src/mbgl/renderer/frame_history.cpp +++ b/src/mbgl/renderer/frame_history.cpp @@ -74,4 +74,8 @@ void FrameHistory::bind(gl::Context& context, uint32_t unit) { context.bindTexture(*texture, unit); } +bool FrameHistory::isVisible(const float zoom) const { + return opacities.data[std::floor(zoom * 10)] != 0; +} + } // namespace mbgl diff --git a/src/mbgl/renderer/frame_history.hpp b/src/mbgl/renderer/frame_history.hpp index f2b11f5f41..75a8b60a71 100644 --- a/src/mbgl/renderer/frame_history.hpp +++ b/src/mbgl/renderer/frame_history.hpp @@ -22,6 +22,7 @@ public: bool needsAnimation(const Duration&) const; void bind(gl::Context&, uint32_t); void upload(gl::Context&, uint32_t); + bool isVisible(const float zoom) const; private: std::array<TimePoint, 256> changeTimes; diff --git a/src/mbgl/renderer/painters/painter_symbol.cpp b/src/mbgl/renderer/painters/painter_symbol.cpp index 04ca195ff6..c31f2c29ea 100644 --- a/src/mbgl/renderer/painters/painter_symbol.cpp +++ b/src/mbgl/renderer/painters/painter_symbol.cpp @@ -75,7 +75,8 @@ void Painter::renderSymbol(PaintParameters& parameters, bucket.layout.get<IconRotationAlignment>() == AlignmentType::Map; if (alongLine) { - reprojectLineLabels(bucket, tile.matrix, false, values, tile, state); + reprojectLineLabels(bucket, tile.matrix, false, values, tile, state, frameHistory); + context.updateVertexBuffer(std::move(bucket.icon.dynamicVertices), *bucket.icon.dynamicVertexBuffer); } const bool iconScaled = layout.get<IconSize>().constantOr(1.0) != 1.0 || bucket.iconsNeedLinear; |