diff --git a/drape/shaders/trackpoint_vertex_shader.vsh b/drape/shaders/trackpoint_vertex_shader.vsh index cec27624cd..1997cea791 100644 --- a/drape/shaders/trackpoint_vertex_shader.vsh +++ b/drape/shaders/trackpoint_vertex_shader.vsh @@ -4,6 +4,7 @@ attribute vec4 a_color; uniform mat4 modelView; uniform mat4 projection; +uniform mat4 pivotTransform; #ifdef SAMSUNG_GOOGLE_NEXUS uniform sampler2D u_colorTex; @@ -16,11 +17,17 @@ varying vec4 v_color; void main(void) { vec3 radius = a_normal * a_position.z; + // Here we intentionally decrease precision of 'pos' calculation // to eliminate jittering effect in process of billboard reconstruction. lowp vec4 pos = vec4(a_position.xy, 0, 1) * modelView; highp vec4 shiftedPos = vec4(radius.xy, 0, 0) + pos; - gl_Position = shiftedPos * projection; + vec4 finalPos = shiftedPos * projection; + float w = finalPos.w; + finalPos.xyw = (pivotTransform * vec4(finalPos.xy, 0.0, w)).xyw; + finalPos.z *= finalPos.w / w; + gl_Position = finalPos; + v_radius = radius; v_color = a_color; diff --git a/drape_frontend/gps_track_shape.cpp b/drape_frontend/gps_track_shape.cpp index 96bccd7bf9..662d5ec2dd 100644 --- a/drape_frontend/gps_track_shape.cpp +++ b/drape_frontend/gps_track_shape.cpp @@ -62,7 +62,7 @@ dp::BindingInfo const & GetGpsTrackDynamicBindingInfo() } // namespace GpsTrackHandle::GpsTrackHandle(size_t pointsCount) - : OverlayHandle(FeatureID(), dp::Anchor::Center, 0) + : OverlayHandle(FeatureID(), dp::Anchor::Center, 0, false) , m_needUpdate(false) { m_buffer.resize(pointsCount * dp::Batcher::VertexPerQuad); @@ -101,15 +101,17 @@ bool GpsTrackHandle::IndexesRequired() const return false; } -m2::RectD GpsTrackHandle::GetPixelRect(ScreenBase const & screen) const +m2::RectD GpsTrackHandle::GetPixelRect(ScreenBase const & screen, bool perspective) const { UNUSED_VALUE(screen); + UNUSED_VALUE(perspective); return m2::RectD(); } -void GpsTrackHandle::GetPixelShape(ScreenBase const & screen, Rects & rects) const +void GpsTrackHandle::GetPixelShape(ScreenBase const & screen, Rects & rects, bool perspective) const { UNUSED_VALUE(screen); + UNUSED_VALUE(perspective); } void GpsTrackHandle::SetPoint(size_t index, m2::PointD const & position, diff --git a/drape_frontend/gps_track_shape.hpp b/drape_frontend/gps_track_shape.hpp index ace266a35f..8b22483bc2 100644 --- a/drape_frontend/gps_track_shape.hpp +++ b/drape_frontend/gps_track_shape.hpp @@ -52,8 +52,8 @@ public: void GetAttributeMutation(ref_ptr mutator, ScreenBase const & screen) const override; bool Update(ScreenBase const & screen) override; - m2::RectD GetPixelRect(ScreenBase const & screen) const override; - void GetPixelShape(ScreenBase const & screen, Rects & rects) const override; + m2::RectD GetPixelRect(ScreenBase const & screen, bool perspective) const override; + void GetPixelShape(ScreenBase const & screen, Rects & rects, bool perspective) const override; bool IndexesRequired() const override; void Clear();