summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-07-05 12:26:50 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-07-07 14:18:00 -0700
commitc8e87128b1e9f1e49c486fa01533644cf14c78e8 (patch)
treedc3970708d789f9a352c7cf6850302064b746150 /src
parent2e10c0a8660af9cdf6ff897aaa39e15fe62c6582 (diff)
downloadqtlocation-mapboxgl-c8e87128b1e9f1e49c486fa01533644cf14c78e8.tar.gz
[core] Make extrudeScale calculations more similar to JS
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/renderer/painter.cpp8
-rw-r--r--src/mbgl/renderer/painter.hpp2
-rw-r--r--src/mbgl/renderer/painter_circle.cpp5
-rw-r--r--src/mbgl/renderer/painter_symbol.cpp33
4 files changed, 28 insertions, 20 deletions
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index ba68b5a24d..d6f14708aa 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -114,10 +114,10 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a
// Update the default matrices to the current viewport dimensions.
state.getProjMatrix(projMatrix);
- // The extrusion scale.
- const float flippedY = state.getViewportMode() == ViewportMode::FlippedY;
- extrudeScale = {{ 2.0f / state.getWidth() * state.getAltitude(),
- (flippedY ? 2.0f : -2.0f) / state.getHeight() * state.getAltitude() }};
+ pixelsToGLUnits = {{ 2.0f / state.getWidth(), -2.0f / state.getHeight() }};
+ if (state.getViewportMode() == ViewportMode::FlippedY) {
+ pixelsToGLUnits[1] *= -1;
+ }
// The native matrix is a 1:1 matrix that paints the coordinates at the
// same screen position as the vertex specifies.
diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp
index 03885ed49e..5e8831b239 100644
--- a/src/mbgl/renderer/painter.hpp
+++ b/src/mbgl/renderer/painter.hpp
@@ -159,7 +159,7 @@ private:
mat4 projMatrix;
mat4 nativeMatrix;
- std::array<float, 2> extrudeScale;
+ std::array<float, 2> pixelsToGLUnits;
// used to composite images and flips the geometry upside down
const mat4 flipMatrix = []{
diff --git a/src/mbgl/renderer/painter_circle.cpp b/src/mbgl/renderer/painter_circle.cpp
index e36019463a..5bc31f7f81 100644
--- a/src/mbgl/renderer/painter_circle.cpp
+++ b/src/mbgl/renderer/painter_circle.cpp
@@ -32,7 +32,10 @@ void Painter::renderCircle(CircleBucket& bucket,
config.program = circleShader.getID();
circleShader.u_matrix = vtxMatrix;
- circleShader.u_extrude_scale = extrudeScale;
+ circleShader->u_extrude_scale = {{
+ pixelsToGLUnits[0] * state.getAltitude(),
+ pixelsToGLUnits[1] * state.getAltitude()
+ }};
circleShader.u_devicepixelratio = frame.pixelRatio;
circleShader.u_color = properties.circleColor;
circleShader.u_radius = properties.circleRadius;
diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp
index 4559b02778..8b4138819c 100644
--- a/src/mbgl/renderer/painter_symbol.cpp
+++ b/src/mbgl/renderer/painter_symbol.cpp
@@ -44,23 +44,26 @@ void Painter::renderSDF(SymbolBucket &bucket,
float fontSize = paintSize;
float fontScale = fontSize / sdfFontSize;
- float scale = fontScale;
- std::array<float, 2> exScale = extrudeScale;
bool rotateWithMap = rotationAlignment == AlignmentType::Map;
bool pitchWithMap = pitchAlignment == AlignmentType::Map;
- float gammaScale = 1.0f;
+
+ std::array<float, 2> extrudeScale;
+ float gammaScale;
if (pitchWithMap) {
- scale *= tileID.pixelsToTileUnits(1, state.getZoom());
- exScale.fill(scale);
- gammaScale /= std::cos(state.getPitch());
+ gammaScale = 1.0 / std::cos(state.getPitch());
+ extrudeScale.fill(tileID.pixelsToTileUnits(1, state.getZoom()) * fontScale);
} else {
- exScale = {{ exScale[0] * scale, exScale[1] * scale }};
+ gammaScale = 1.0;
+ extrudeScale = {{
+ pixelsToGLUnits[0] * fontScale * state.getAltitude(),
+ pixelsToGLUnits[1] * fontScale * state.getAltitude()
+ }};
}
config.program = sdfShader.getID();
sdfShader.u_matrix = vtxMatrix;
- sdfShader.u_extrude_scale = exScale;
+ sdfShader.u_extrude_scale = extrudeScale;
sdfShader.u_texsize = texsize;
sdfShader.u_rotate_with_map = rotateWithMap;
sdfShader.u_pitch_with_map = pitchWithMap;
@@ -189,14 +192,16 @@ void Painter::renderSymbol(SymbolBucket& bucket,
mat4 vtxMatrix =
translatedMatrix(matrix, paint.iconTranslate, tileID, paint.iconTranslateAnchor);
- float scale = fontScale;
- std::array<float, 2> exScale = extrudeScale;
+ std::array<float, 2> extrudeScale;
+
const bool alignedWithMap = layout.iconRotationAlignment == AlignmentType::Map;
if (alignedWithMap) {
- scale *= tileID.pixelsToTileUnits(1, state.getZoom());
- exScale.fill(scale);
+ extrudeScale.fill(tileID.pixelsToTileUnits(1, state.getZoom()) * fontScale);
} else {
- exScale = {{ exScale[0] * scale, exScale[1] * scale }};
+ extrudeScale = {{
+ pixelsToGLUnits[0] * fontScale * state.getAltitude(),
+ pixelsToGLUnits[1] * fontScale * state.getAltitude()
+ }};
}
const bool overdraw = isOverdraw();
@@ -204,7 +209,7 @@ void Painter::renderSymbol(SymbolBucket& bucket,
config.program = iconShader.getID();
iconShader.u_matrix = vtxMatrix;
- iconShader.u_extrude_scale = exScale;
+ iconShader.u_extrude_scale = extrudeScale;
iconShader.u_texsize = {{ float(activeSpriteAtlas->getWidth()) / 4.0f, float(activeSpriteAtlas->getHeight()) / 4.0f }};
iconShader.u_rotate_with_map = alignedWithMap;
iconShader.u_texture = 0;