Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drape/debug_rect_renderer.cpp53
-rw-r--r--drape/debug_rect_renderer.hpp7
-rw-r--r--drape/overlay_tree.cpp39
-rw-r--r--drape/overlay_tree.hpp20
-rw-r--r--drape/shaders/debug_rect_fragment_shader.fsh4
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp5
6 files changed, 124 insertions, 4 deletions
diff --git a/drape/debug_rect_renderer.cpp b/drape/debug_rect_renderer.cpp
index e4043ccb48..05e258709a 100644
--- a/drape/debug_rect_renderer.cpp
+++ b/drape/debug_rect_renderer.cpp
@@ -106,12 +106,65 @@ void DebugRectRenderer::DrawRect(ScreenBase const & screen, m2::RectF const & re
GLFunctions::glBufferData(gl_const::GLArrayBuffer, vertices.size() * sizeof(vertices[0]),
vertices.data(), gl_const::GLStaticDraw);
+ int8_t const location = m_program->GetUniformLocation("u_color");
+ if (location >= 0)
+ GLFunctions::glUniformValuef(location, 1.0, 0.0, 0.0, 1.0);
+
GLFunctions::glDrawArrays(gl_const::GLLineStrip, 0, vertices.size());
GLFunctions::glEnable(gl_const::GLDepthTest);
GLFunctions::glBindBuffer(0, gl_const::GLArrayBuffer);
GLFunctions::glBindVertexArray(0);
+
+ m_program->Unbind();
}
+#ifdef COLLECT_DISPLACEMENT_INFO
+
+void DebugRectRenderer::DrawArrow(ScreenBase const & screen, OverlayTree::DisplacementData const & data) const
+{
+ if (!m_isEnabled)
+ return;
+
+ if (data.m_arrowStart.EqualDxDy(data.m_arrowEnd, 1e-5))
+ return;
+
+ ASSERT(m_program != nullptr, ());
+ m_program->Bind();
+
+ GLFunctions::glBindBuffer(m_vertexBuffer, gl_const::GLArrayBuffer);
+ GLFunctions::glBindVertexArray(m_VAO);
+
+ GLFunctions::glDisable(gl_const::GLDepthTest);
+
+ array<m2::PointF, 5> vertices;
+ m2::PointF dir = (data.m_arrowEnd - data.m_arrowStart).Normalize();
+ m2::PointF side = m2::PointF(-dir.y, dir.x);
+ vertices[0] = PixelPointToScreenSpace(screen, data.m_arrowStart);
+ vertices[1] = PixelPointToScreenSpace(screen, data.m_arrowEnd);
+ vertices[2] = PixelPointToScreenSpace(screen, data.m_arrowEnd - dir * 20 + side * 10);
+ vertices[3] = vertices[1];
+ vertices[4] = PixelPointToScreenSpace(screen, data.m_arrowEnd - dir * 20 - side * 10);
+
+ GLFunctions::glBufferData(gl_const::GLArrayBuffer, vertices.size() * sizeof(vertices[0]),
+ vertices.data(), gl_const::GLStaticDraw);
+
+ int8_t const location = m_program->GetUniformLocation("u_color");
+ if (location >= 0)
+ GLFunctions::glUniformValuef(location, data.m_arrowColor.GetRedF(), data.m_arrowColor.GetGreenF(),
+ data.m_arrowColor.GetBlueF(), data.m_arrowColor.GetAlfaF());
+
+ GLFunctions::glDrawArrays(gl_const::GLLineStrip, 0, vertices.size());
+
+ GLFunctions::glEnable(gl_const::GLDepthTest);
+
+ GLFunctions::glBindBuffer(0, gl_const::GLArrayBuffer);
+ GLFunctions::glBindVertexArray(0);
+
+ m_program->Unbind();
+}
+
+#endif
+
} // namespace dp
diff --git a/drape/debug_rect_renderer.hpp b/drape/debug_rect_renderer.hpp
index 0d769da17e..6c73461d90 100644
--- a/drape/debug_rect_renderer.hpp
+++ b/drape/debug_rect_renderer.hpp
@@ -1,12 +1,13 @@
#pragma once
#include "drape/gpu_program_manager.hpp"
+#include "drape/overlay_tree.hpp"
#include "drape/pointers.hpp"
#include "geometry/rect2d.hpp"
#include "geometry/screenbase.hpp"
-//#define RENDER_DEBUG_RECTS
+#define RENDER_DEBUG_RECTS
namespace dp
{
@@ -23,6 +24,10 @@ public:
void DrawRect(ScreenBase const & screen, m2::RectF const & rect) const;
+#ifdef COLLECT_DISPLACEMENT_INFO
+ void DrawArrow(ScreenBase const & screen, OverlayTree::DisplacementData const & data) const;
+#endif
+
private:
DebugRectRenderer();
~DebugRectRenderer();
diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp
index 6358f62987..b2e16445fc 100644
--- a/drape/overlay_tree.cpp
+++ b/drape/overlay_tree.cpp
@@ -90,6 +90,10 @@ void OverlayTree::StartOverlayPlacing(ScreenBase const & screen)
ASSERT(IsNeedUpdate(), ());
Clear();
m_traits.m_modelView = screen;
+
+#ifdef COLLECT_DISPLACEMENT_INFO
+ m_displacementInfo.clear();
+#endif
}
void OverlayTree::Add(ref_ptr<OverlayHandle> handle)
@@ -165,7 +169,21 @@ void OverlayTree::InsertHandle(ref_ptr<OverlayHandle> handle,
{
// Handle is displaced and bound to its parent, parent will be displaced too.
if (boundToParent)
+ {
Erase(parentOverlay);
+
+ #ifdef COLLECT_DISPLACEMENT_INFO
+ m_displacementInfo.emplace_back(DisplacementData(handle->GetPixelRect(modelView).Center(),
+ parentOverlay.m_handle->GetPixelRect(modelView).Center(),
+ dp::Color(0, 255, 0, 255)));
+ #endif
+ }
+
+ #ifdef COLLECT_DISPLACEMENT_INFO
+ m_displacementInfo.emplace_back(DisplacementData(info.m_handle->GetPixelRect(modelView).Center(),
+ handle->GetPixelRect(modelView).Center(),
+ dp::Color(0, 0, 255, 255)));
+ #endif
return;
}
}
@@ -175,8 +193,16 @@ void OverlayTree::InsertHandle(ref_ptr<OverlayHandle> handle,
for (auto const & info : elements)
AddHandleToDelete(info);
- for (auto const & handle : m_handlesToDelete)
- Erase(handle);
+ for (auto const & handleToDelete : m_handlesToDelete)
+ {
+ Erase(handleToDelete);
+
+#ifdef COLLECT_DISPLACEMENT_INFO
+ m_displacementInfo.emplace_back(DisplacementData(handle->GetPixelRect(modelView).Center(),
+ handleToDelete.m_handle->GetPixelRect(modelView).Center(),
+ dp::Color(0, 0, 255, 255)));
+#endif
+ }
m_handlesToDelete.clear();
@@ -295,4 +321,13 @@ void OverlayTree::SetFollowingMode(bool mode)
m_followingMode = mode;
}
+#ifdef COLLECT_DISPLACEMENT_INFO
+
+OverlayTree::TDisplacementInfo const & OverlayTree::GetDisplacementInfo() const
+{
+ return m_displacementInfo;
+}
+
+#endif
+
} // namespace dp
diff --git a/drape/overlay_tree.hpp b/drape/overlay_tree.hpp
index f84d4827c0..c1094b18ad 100644
--- a/drape/overlay_tree.hpp
+++ b/drape/overlay_tree.hpp
@@ -13,6 +13,8 @@
namespace dp
{
+//#define COLLECT_DISPLACEMENT_INFO
+
namespace detail
{
@@ -64,6 +66,20 @@ public:
void SetFollowingMode(bool mode);
+#ifdef COLLECT_DISPLACEMENT_INFO
+ struct DisplacementData
+ {
+ m2::PointF m_arrowStart;
+ m2::PointF m_arrowEnd;
+ dp::Color m_arrowColor;
+ DisplacementData(m2::PointF const & arrowStart, m2::PointF const & arrowEnd, dp::Color const & arrowColor)
+ : m_arrowStart(arrowStart), m_arrowEnd(arrowEnd), m_arrowColor(arrowColor)
+ {}
+ };
+ using TDisplacementInfo = vector<DisplacementData>;
+ TDisplacementInfo const & GetDisplacementInfo() const;
+#endif
+
private:
ScreenBase const & GetModelView() const { return m_traits.m_modelView; }
void InsertHandle(ref_ptr<OverlayHandle> handle,
@@ -76,6 +92,10 @@ private:
array<vector<ref_ptr<OverlayHandle>>, dp::OverlayRanksCount> m_handles;
vector<detail::OverlayInfo> m_handlesToDelete;
bool m_followingMode;
+
+#ifdef COLLECT_DISPLACEMENT_INFO
+ TDisplacementInfo m_displacementInfo;
+#endif
};
} // namespace dp
diff --git a/drape/shaders/debug_rect_fragment_shader.fsh b/drape/shaders/debug_rect_fragment_shader.fsh
index 688fe5fdba..fcba1d4c33 100644
--- a/drape/shaders/debug_rect_fragment_shader.fsh
+++ b/drape/shaders/debug_rect_fragment_shader.fsh
@@ -1,4 +1,6 @@
+uniform vec4 u_color;
+
void main(void)
{
- gl_FragColor = vec4(1, 0, 0, 1);
+ gl_FragColor = u_color;
}
diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp
index b6eba50f70..07da4cb99e 100755
--- a/drape_frontend/frontend_renderer.cpp
+++ b/drape_frontend/frontend_renderer.cpp
@@ -890,6 +890,11 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView)
GLFunctions::glEnable(gl_const::GLDepthTest);
+#if defined(RENDER_DEBUG_RECTS) && defined(COLLECT_DISPLACEMENT_INFO)
+ for (auto const & arrow : m_overlayTree->GetDisplacementInfo())
+ dp::DebugRectRenderer::Instance().DrawArrow(modelView, arrow);
+#endif
+
#ifdef DRAW_INFO
AfterDrawFrame();
#endif