From 3446dc455ab242c85fb50187139597ac5c71e1a6 Mon Sep 17 00:00:00 2001 From: rachytski Date: Thu, 27 Sep 2012 18:43:51 +0300 Subject: [PATCH] using separate displayList for straight text elements and drawing them with glUseSharpGeometry enabled. --- map/screen_coverage.cpp | 51 +++++++++++++++++++++++++++++++----- map/screen_coverage.hpp | 5 +++- yg/overlay_element.cpp | 5 ++++ yg/overlay_element.hpp | 2 ++ yg/straight_text_element.cpp | 5 ++++ yg/straight_text_element.hpp | 2 ++ yg/symbol_element.cpp | 5 ++++ yg/symbol_element.hpp | 2 ++ 8 files changed, 70 insertions(+), 7 deletions(-) diff --git a/map/screen_coverage.cpp b/map/screen_coverage.cpp index b383484664..62cdf01596 100644 --- a/map/screen_coverage.cpp +++ b/map/screen_coverage.cpp @@ -155,17 +155,28 @@ void ScreenCoverage::Merge(Tiler::RectInfo const & ri) } } +void FilterElementsBySharpness(shared_ptr const & e, + vector > & v, + bool flag) +{ + if (e->hasSharpGeometry() == flag) + v.push_back(e); +} + bool ScreenCoverage::Cache(core::CommandsQueue::Environment const & env) { /// caching tiles blitting commands. - m_displayList.reset(); - m_displayList.reset(m_cacheScreen->createDisplayList()); + m_primaryDL.reset(); + m_primaryDL.reset(m_cacheScreen->createDisplayList()); + + m_sharpTextDL.reset(); + m_sharpTextDL.reset(m_cacheScreen->createDisplayList()); m_cacheScreen->setEnvironment(&env); m_cacheScreen->beginFrame(); - m_cacheScreen->setDisplayList(m_displayList.get()); + m_cacheScreen->setDisplayList(m_primaryDL.get()); vector infos; @@ -189,9 +200,28 @@ bool ScreenCoverage::Cache(core::CommandsQueue::Environment const & env) if (!infos.empty()) m_cacheScreen->blit(&infos[0], infos.size(), true); - m_overlay->draw(m_cacheScreen.get(), math::Identity()); + math::Matrix idM = math::Identity(); + + // selecting and rendering non-sharp elements. + + vector > nonSharpElements; + m_overlay->forEach(bind(&FilterElementsBySharpness, _1, ref(nonSharpElements), false)); + + for (unsigned i = 0; i < nonSharpElements.size(); ++i) + nonSharpElements[i]->draw(m_cacheScreen.get(), idM); + + // selecting and rendering sharp elements + + vector > sharpElements; + m_overlay->forEach(bind(&FilterElementsBySharpness, _1, ref(sharpElements), true)); + + m_cacheScreen->setDisplayList(m_sharpTextDL.get()); + + for (unsigned i = 0; i < sharpElements.size(); ++i) + sharpElements[i]->draw(m_cacheScreen.get(), idM); m_cacheScreen->setDisplayList(0); + m_cacheScreen->endFrame(); /// completing commands that was immediately executed @@ -382,8 +412,17 @@ ScreenCoverage::~ScreenCoverage() void ScreenCoverage::Draw(yg::gl::Screen * s, ScreenBase const & screen) { - if (m_displayList) - m_displayList->draw(m_screen.PtoGMatrix() * screen.GtoPMatrix()); + math::Matrix m = m_screen.PtoGMatrix() * screen.GtoPMatrix(); + + if (m_primaryDL) + m_primaryDL->draw(m); + + s->setPixelPrecision(true); + + if (m_sharpTextDL) + m_sharpTextDL->draw(m); + + s->setPixelPrecision(false); } shared_ptr const & ScreenCoverage::GetOverlay() const diff --git a/map/screen_coverage.hpp b/map/screen_coverage.hpp index 6076feafb5..6a9cf77628 100644 --- a/map/screen_coverage.hpp +++ b/map/screen_coverage.hpp @@ -70,7 +70,10 @@ private: /// Screen, which is used for caching of this ScreenCoverage into DisplayList shared_ptr m_cacheScreen; /// DisplayList which holds cached ScreenCoverage - shared_ptr m_displayList; + shared_ptr m_primaryDL; + /// DisplayList to cache all straight texts. + /// They are drawn with different shader. + shared_ptr m_sharpTextDL; /// Direct copying is prohibited. ScreenCoverage(ScreenCoverage const & src); diff --git a/yg/overlay_element.cpp b/yg/overlay_element.cpp index da6e437b4d..1e1d5b0ca6 100644 --- a/yg/overlay_element.cpp +++ b/yg/overlay_element.cpp @@ -200,4 +200,9 @@ namespace yg return res; } + + bool OverlayElement::hasSharpGeometry() const + { + return false; + } } diff --git a/yg/overlay_element.hpp b/yg/overlay_element.hpp index 93fbf47f68..9d5e8363fe 100644 --- a/yg/overlay_element.hpp +++ b/yg/overlay_element.hpp @@ -103,6 +103,8 @@ namespace yg virtual bool roughHitTest(m2::PointD const & pt) const; m2::RectD const & roughBoundRect() const; + + virtual bool hasSharpGeometry() const; }; } diff --git a/yg/straight_text_element.cpp b/yg/straight_text_element.cpp index 43e501baa5..429b1ccd45 100644 --- a/yg/straight_text_element.cpp +++ b/yg/straight_text_element.cpp @@ -302,4 +302,9 @@ namespace yg { return new StraightTextElement(*this, m); } + + bool StraightTextElement::hasSharpGeometry() const + { + return true; + } } diff --git a/yg/straight_text_element.hpp b/yg/straight_text_element.hpp index 09e96c993a..5679fd22dc 100644 --- a/yg/straight_text_element.hpp +++ b/yg/straight_text_element.hpp @@ -38,5 +38,7 @@ namespace yg void setPivot(m2::PointD const & pv); OverlayElement * clone(math::Matrix const & m) const; + + bool hasSharpGeometry() const; }; } diff --git a/yg/symbol_element.cpp b/yg/symbol_element.cpp index 98642b9453..be12209a08 100644 --- a/yg/symbol_element.cpp +++ b/yg/symbol_element.cpp @@ -109,4 +109,9 @@ namespace yg { return new SymbolElement(*this, m); } + + bool SymbolElement::hasSharpGeometry() const + { + return true; + } } diff --git a/yg/symbol_element.hpp b/yg/symbol_element.hpp index ae7fef7bd2..b3430fecea 100644 --- a/yg/symbol_element.hpp +++ b/yg/symbol_element.hpp @@ -40,5 +40,7 @@ namespace yg int visualRank() const; OverlayElement * clone(math::Matrix const & m) const; + + bool hasSharpGeometry() const; }; }