diff options
Diffstat (limited to 'src/renderer/painter_symbol.cpp')
-rw-r--r-- | src/renderer/painter_symbol.cpp | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/src/renderer/painter_symbol.cpp b/src/renderer/painter_symbol.cpp index 415dead70e..79625f1681 100644 --- a/src/renderer/painter_symbol.cpp +++ b/src/renderer/painter_symbol.cpp @@ -25,10 +25,8 @@ void Painter::renderSDF(SymbolBucket &bucket, mat4 exMatrix; matrix::copy(exMatrix, projMatrix); - const float angleOffset = - bucketProperties.rotation_alignment == RotationAlignmentType::Map - ? map.getState().getAngle() - : 0; + bool aligned_with_map = (bucketProperties.rotation_alignment == RotationAlignmentType::Map); + const float angleOffset = aligned_with_map ? state.getAngle() : 0; if (angleOffset) { matrix::rotate_z(exMatrix, exMatrix, angleOffset); @@ -45,24 +43,24 @@ void Painter::renderSDF(SymbolBucket &bucket, sdfShader.u_texsize = texsize; // Convert the -pi..pi to an int8 range. - float angle = std::round(map.getState().getAngle() / M_PI * 128); + float angle = std::round(state.getAngle() / M_PI * 128); // adjust min/max zooms for variable font sies float zoomAdjust = std::log(fontSize / bucketProperties.max_size) / std::log(2); + sdfShader.u_flip = (aligned_with_map && bucketProperties.keep_upright) ? 1 : 0; sdfShader.u_angle = (int32_t)(angle + 256) % 256; - sdfShader.u_flip = (bucket.properties.placement == PlacementType::Line ? 1 : 0); - sdfShader.u_zoom = (map.getState().getNormalizedZoom() - zoomAdjust) * 10; // current zoom level + sdfShader.u_zoom = (state.getNormalizedZoom() - zoomAdjust) * 10; // current zoom level FadeProperties f = frameHistory.getFadeProperties(300_milliseconds); sdfShader.u_fadedist = f.fadedist * 10; sdfShader.u_minfadezoom = std::floor(f.minfadezoom * 10); sdfShader.u_maxfadezoom = std::floor(f.maxfadezoom * 10); - sdfShader.u_fadezoom = (map.getState().getNormalizedZoom() + f.bump) * 10; + sdfShader.u_fadezoom = (state.getNormalizedZoom() + f.bump) * 10; // The default gamma value has to be adjust for the current pixelratio so that we're not // drawing blurry font on retina screens. - const float gamma = 0.105 * sdfFontSize / fontSize / map.getState().getPixelRatio(); + const float gamma = 0.105 * sdfFontSize / fontSize / state.getPixelRatio(); const float sdfPx = 8.0f; const float blurOffset = 1.19f; @@ -122,35 +120,19 @@ void Painter::renderSymbol(SymbolBucket &bucket, util::ptr<StyleLayer> layer_des glDisable(GL_STENCIL_TEST); - if (bucket.hasTextData()) { - GlyphAtlas &glyphAtlas = *map.getGlyphAtlas(); - glyphAtlas.bind(); - - renderSDF(bucket, - id, - matrix, - bucket.properties.text, - properties.text, - 24.0f, - {{ float(glyphAtlas.width) / 4, float(glyphAtlas.height) / 4 }}, - *sdfGlyphShader, - &SymbolBucket::drawGlyphs); - } - if (bucket.hasIconData()) { bool sdf = bucket.sdfIcons; const float angleOffset = bucket.properties.icon.rotation_alignment == RotationAlignmentType::Map - ? map.getState().getAngle() + ? state.getAngle() : 0; // If layerStyle.size > bucket.info.fontSize then labels may collide const float fontSize = properties.icon.size != 0 ? properties.icon.size : bucket.properties.icon.max_size; const float fontScale = fontSize / 1.0f; - SpriteAtlas &spriteAtlas = *map.getSpriteAtlas(); - spriteAtlas.bind(map.getState().isChanging() || bucket.properties.placement == PlacementType::Line || angleOffset != 0 || fontScale != 1 || sdf); + spriteAtlas.bind(state.isChanging() || bucket.properties.placement == PlacementType::Line || angleOffset != 0 || fontScale != 1 || sdf); std::array<float, 2> texsize = {{ float(spriteAtlas.getWidth()), @@ -185,19 +167,22 @@ void Painter::renderSymbol(SymbolBucket &bucket, util::ptr<StyleLayer> layer_des iconShader->u_texsize = texsize; // Convert the -pi..pi to an int8 range. - const float angle = std::round(map.getState().getAngle() / M_PI * 128); + const float angle = std::round(state.getAngle() / M_PI * 128); // adjust min/max zooms for variable font sies float zoomAdjust = std::log(fontSize / bucket.properties.icon.max_size) / std::log(2); iconShader->u_angle = (int32_t)(angle + 256) % 256; - iconShader->u_flip = bucket.properties.placement == PlacementType::Line ? 1 : 0; - iconShader->u_zoom = (map.getState().getNormalizedZoom() - zoomAdjust) * 10; // current zoom level + + bool flip = (bucket.properties.icon.rotation_alignment == RotationAlignmentType::Map) + && bucket.properties.icon.keep_upright; + iconShader->u_flip = flip ? 1 : 0; + iconShader->u_zoom = (state.getNormalizedZoom() - zoomAdjust) * 10; // current zoom level iconShader->u_fadedist = 0 * 10; - iconShader->u_minfadezoom = map.getState().getNormalizedZoom() * 10; - iconShader->u_maxfadezoom = map.getState().getNormalizedZoom() * 10; - iconShader->u_fadezoom = map.getState().getNormalizedZoom() * 10; + iconShader->u_minfadezoom = state.getNormalizedZoom() * 10; + iconShader->u_maxfadezoom = state.getNormalizedZoom() * 10; + iconShader->u_fadezoom = state.getNormalizedZoom() * 10; iconShader->u_opacity = properties.icon.opacity; depthRange(strata, 1.0f); @@ -205,5 +190,19 @@ void Painter::renderSymbol(SymbolBucket &bucket, util::ptr<StyleLayer> layer_des } } + if (bucket.hasTextData()) { + glyphAtlas.bind(); + + renderSDF(bucket, + id, + matrix, + bucket.properties.text, + properties.text, + 24.0f, + {{ float(glyphAtlas.width) / 4, float(glyphAtlas.height) / 4 }}, + *sdfGlyphShader, + &SymbolBucket::drawGlyphs); + } + glEnable(GL_STENCIL_TEST); } |