summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnsis Brammanis <brammanis@gmail.com>2017-06-20 14:20:39 -0400
committerAnsis Brammanis <brammanis@gmail.com>2017-06-20 14:20:39 -0400
commit383b7792a5f5bc5e2e882f6f7f78418cd6f9c7ae (patch)
treeb87a866087b1468d39f7656bf9a18ec848edbd01
parentd3ea1633ed16a852d9a959c99e8a2eb9ad73981c (diff)
downloadqtlocation-mapboxgl-383b7792a5f5bc5e2e882f6f7f78418cd6f9c7ae.tar.gz
frame history and buffer updating
-rw-r--r--src/mbgl/gl/context.cpp5
-rw-r--r--src/mbgl/gl/context.hpp6
-rw-r--r--src/mbgl/layout/symbol_projection.cpp10
-rw-r--r--src/mbgl/layout/symbol_projection.hpp3
-rw-r--r--src/mbgl/renderer/frame_history.cpp4
-rw-r--r--src/mbgl/renderer/frame_history.hpp1
-rw-r--r--src/mbgl/renderer/painters/painter_symbol.cpp3
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;