summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnsis Brammanis <brammanis@gmail.com>2017-06-27 14:00:33 -0400
committerAnsis Brammanis <brammanis@gmail.com>2017-06-27 14:00:33 -0400
commit1d9d40b4992923ddd9d5258d300a1136d3dc2f1e (patch)
tree0e6715660e6fd469b4b8d8b78f429142a4272ce7
parentd2df457879cc6b39e244ba1858623becec8ddd7d (diff)
downloadqtlocation-mapboxgl-1d9d40b4992923ddd9d5258d300a1136d3dc2f1e.tar.gz
make line labels kindof work
-rw-r--r--src/mbgl/gl/context.hpp1
-rw-r--r--src/mbgl/layout/symbol_layout.cpp15
-rw-r--r--src/mbgl/layout/symbol_layout.hpp4
-rw-r--r--src/mbgl/layout/symbol_projection.cpp13
-rw-r--r--src/mbgl/renderer/buckets/symbol_bucket.hpp2
5 files changed, 21 insertions, 14 deletions
diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp
index 9bde094281..43fe99dac5 100644
--- a/src/mbgl/gl/context.hpp
+++ b/src/mbgl/gl/context.hpp
@@ -74,6 +74,7 @@ public:
template <class Vertex, class DrawMode>
void updateVertexBuffer(VertexVector<Vertex, DrawMode>&& v, VertexBuffer<Vertex, DrawMode>& buffer) {
+ assert(v.vertexSize() == buffer.vertexCount);
updateVertexBuffer(v.data(), v.byteSize(), buffer.buffer);
}
diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp
index 6b79ec513a..51a030de57 100644
--- a/src/mbgl/layout/symbol_layout.cpp
+++ b/src/mbgl/layout/symbol_layout.cpp
@@ -501,12 +501,13 @@ std::unique_ptr<SymbolBucket> SymbolLayout::place(CollisionTile& collisionTile)
collisionTile.insertFeature(symbolInstance.textCollisionFeature, glyphScale, layout.get<TextIgnorePlacement>());
if (glyphScale < collisionTile.maxScale) {
const Range<float> sizeData = bucket->textSizeBinder->getVertexSizeData(feature);
+ PlacedSymbol placedSymbol(symbolInstance.anchor.point, symbolInstance.anchor.segment, sizeData.min, sizeData.max,
+ 0, 0, placementZoom, false, symbolInstance.line);
for (const auto& symbol : symbolInstance.glyphQuads) {
addSymbol(
bucket->text, sizeData, symbol, placementZoom,
- keepUpright, textPlacement, collisionTile.config.angle, symbolInstance.writingModes, symbolInstance.anchor);
+ keepUpright, textPlacement, collisionTile.config.angle, symbolInstance.writingModes, symbolInstance.anchor, placedSymbol);
}
- PlacedSymbol placedSymbol(symbolInstance.anchor.point, symbolInstance.index, sizeData.min, sizeData.max, 0, 0, placementZoom, false, symbolInstance.line);
bucket->text.placedSymbols.emplace_back(std::move(placedSymbol));
}
}
@@ -516,10 +517,11 @@ std::unique_ptr<SymbolBucket> SymbolLayout::place(CollisionTile& collisionTile)
collisionTile.insertFeature(symbolInstance.iconCollisionFeature, iconScale, layout.get<IconIgnorePlacement>());
if (iconScale < collisionTile.maxScale && symbolInstance.iconQuad) {
const Range<float> sizeData = bucket->iconSizeBinder->getVertexSizeData(feature);
+ PlacedSymbol placedSymbol(symbolInstance.anchor.point, symbolInstance.anchor.segment, sizeData.min, sizeData.max,
+ 0, 0, placementZoom, false, symbolInstance.line);
addSymbol(
bucket->icon, sizeData, *symbolInstance.iconQuad, placementZoom,
- keepUpright, iconPlacement, collisionTile.config.angle, symbolInstance.writingModes, symbolInstance.anchor);
- PlacedSymbol placedSymbol(symbolInstance.anchor.point, symbolInstance.index, sizeData.min, sizeData.max, 0, 0, placementZoom, false, symbolInstance.line);
+ keepUpright, iconPlacement, collisionTile.config.angle, symbolInstance.writingModes, symbolInstance.anchor, placedSymbol);
bucket->icon.placedSymbols.emplace_back(std::move(placedSymbol));
}
}
@@ -546,7 +548,8 @@ void SymbolLayout::addSymbol(Buffer& buffer,
const style::SymbolPlacementType placement,
const float placementAngle,
const WritingModeType writingModes,
- const Anchor& labelAnchor) {
+ const Anchor& labelAnchor,
+ PlacedSymbol& placedSymbol) {
constexpr const uint16_t vertexLength = 4;
const auto &tl = symbol.tl;
@@ -594,6 +597,8 @@ void SymbolLayout::addSymbol(Buffer& buffer,
segment.vertexLength += vertexLength;
segment.indexLength += 6;
+
+ placedSymbol.glyphOffsets.push_back(symbol.glyphOffset.x);
}
void SymbolLayout::addToDebugBuffers(CollisionTile& collisionTile, SymbolBucket& bucket) {
diff --git a/src/mbgl/layout/symbol_layout.hpp b/src/mbgl/layout/symbol_layout.hpp
index 37835bad14..661ea2a24d 100644
--- a/src/mbgl/layout/symbol_layout.hpp
+++ b/src/mbgl/layout/symbol_layout.hpp
@@ -20,6 +20,7 @@ class CollisionTile;
class SymbolBucket;
class Anchor;
class RenderLayer;
+class PlacedSymbol;
namespace style {
class Filter;
@@ -72,7 +73,8 @@ private:
const style::SymbolPlacementType,
const float placementAngle,
WritingModeType writingModes,
- const Anchor& labelAnchor);
+ const Anchor& labelAnchor,
+ PlacedSymbol& placedSymbol);
const std::string sourceLayerName;
const std::string bucketName;
diff --git a/src/mbgl/layout/symbol_projection.cpp b/src/mbgl/layout/symbol_projection.cpp
index 41dd525646..2e3828fff9 100644
--- a/src/mbgl/layout/symbol_projection.cpp
+++ b/src/mbgl/layout/symbol_projection.cpp
@@ -62,6 +62,7 @@ namespace mbgl {
}
bool isVisible(const vec4& anchorPos, const float placementZoom, const std::array<double, 2>& clippingBuffer, const FrameHistory& frameHistory) {
+ if (true) return true;
const float x = anchorPos[0] / anchorPos[3];
const float y = anchorPos[1] / anchorPos[3];
const bool inPaddedViewport = (
@@ -115,8 +116,8 @@ namespace mbgl {
int32_t currentIndex = dir > 0 ? anchorSegment : anchorSegment + 1;
- Point<float>& current = anchorPoint;
- Point<float>& prev = anchorPoint;
+ Point<float> current = anchorPoint;
+ Point<float> prev = anchorPoint;
float distanceToPrev = 0.0;
float currentSegmentDistance = 0.0;
const float absOffsetX = std::abs(combinedOffsetX);
@@ -199,11 +200,9 @@ namespace mbgl {
bool flip = false;
if (values.keepUpright) {
- if (false) {
- const Point<float> a = project(convertPoint<float>(placedSymbol.line.at(placedSymbol.segment)), posMatrix);
- const Point<float> b = project(convertPoint<float>(placedSymbol.line.at(placedSymbol.segment + 1)), posMatrix);
- flip = placedSymbol.vertical ? b.y > a.y : b.x < a.x;
- }
+ const Point<float> a = project(convertPoint<float>(placedSymbol.line.at(placedSymbol.segment)), posMatrix);
+ const Point<float> b = project(convertPoint<float>(placedSymbol.line.at(placedSymbol.segment + 1)), posMatrix);
+ flip = placedSymbol.vertical ? b.y > a.y : b.x < a.x;
}
const float cameraToAnchorDistance = anchorPos[3];
diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp
index e0bf830088..5f109bbddf 100644
--- a/src/mbgl/renderer/buckets/symbol_bucket.hpp
+++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp
@@ -29,8 +29,8 @@ public:
float lineOffsetY;
float placementZoom;
bool vertical;
- std::vector<float> glyphOffsets;
GeometryCoordinates line;
+ std::vector<float> glyphOffsets;
};
class SymbolBucket : public Bucket {