Remove overlays from tree.

This commit is contained in:
Daria Volvenkova 2018-06-20 22:16:58 +03:00 committed by Roman Kuznetsov
parent 6e4fd1f4c8
commit 9bff202aa1
3 changed files with 89 additions and 37 deletions

View file

@ -466,7 +466,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
{
ref_ptr<FlushTransitSchemeMessage > msg = message;
auto renderData = msg->AcceptRenderData();
m_transitSchemeRenderer->AddRenderData(make_ref(m_gpuProgramManager), std::move(renderData));
m_transitSchemeRenderer->AddRenderData(make_ref(m_gpuProgramManager), make_ref(m_overlayTree),
std::move(renderData));
break;
}
@ -474,7 +475,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
{
ref_ptr<FlushTransitMarkersMessage > msg = message;
auto renderData = msg->AcceptRenderData();
m_transitSchemeRenderer->AddMarkersRenderData(make_ref(m_gpuProgramManager), std::move(renderData));
m_transitSchemeRenderer->AddMarkersRenderData(make_ref(m_gpuProgramManager), make_ref(m_overlayTree),
std::move(renderData));
break;
}
@ -482,7 +484,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
{
ref_ptr<FlushTransitTextMessage > msg = message;
auto renderData = msg->AcceptRenderData();
m_transitSchemeRenderer->AddTextRenderData(make_ref(m_gpuProgramManager), std::move(renderData));
m_transitSchemeRenderer->AddTextRenderData(make_ref(m_gpuProgramManager), make_ref(m_overlayTree),
std::move(renderData));
break;
}
@ -490,7 +493,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
{
ref_ptr<FlushTransitTextMessage > msg = message;
auto renderData = msg->AcceptRenderData();
m_transitSchemeRenderer->AddStubsRenderData(make_ref(m_gpuProgramManager), std::move(renderData));
m_transitSchemeRenderer->AddStubsRenderData(make_ref(m_gpuProgramManager), make_ref(m_overlayTree),
std::move(renderData));
break;
}
@ -777,14 +781,14 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
{
ref_ptr<EnableTransitSchemeMessage > msg = message;
if (!msg->IsEnabled())
m_transitSchemeRenderer->ClearGLDependentResources();
m_transitSchemeRenderer->ClearGLDependentResources(make_ref(m_overlayTree));
break;
}
case Message::ClearTransitSchemeData:
{
ref_ptr<ClearTransitSchemeDataMessage> msg = message;
m_transitSchemeRenderer->Clear(msg->GetMwmId());
m_transitSchemeRenderer->Clear(msg->GetMwmId(), make_ref(m_overlayTree));
break;
}
@ -1907,7 +1911,7 @@ void FrontendRenderer::OnContextDestroy()
m_trafficRenderer->ClearGLDependentResources();
m_drapeApiRenderer->Clear();
m_postprocessRenderer->ClearGLDependentResources();
m_transitSchemeRenderer->ClearGLDependentResources();
m_transitSchemeRenderer->ClearGLDependentResources(nullptr /* overlayTree */);
m_transitBackground.reset();

View file

@ -31,64 +31,88 @@ bool TransitSchemeRenderer::HasRenderData(int zoomLevel) const
return !m_renderData.empty() && zoomLevel >= kTransitSchemeMinZoomLevel;
}
void TransitSchemeRenderer::ClearGLDependentResources()
void TransitSchemeRenderer::ClearGLDependentResources(ref_ptr<dp::OverlayTree> tree)
{
if (tree)
{
RemoveOverlay(tree, m_textRenderData);
RemoveOverlay(tree, m_colorSymbolRenderData);
}
m_renderData.clear();
m_markersRenderData.clear();
m_textRenderData.clear();
m_colorSymbolRenderData.clear();
}
void TransitSchemeRenderer::Clear(MwmSet::MwmId const & mwmId)
void TransitSchemeRenderer::Clear(MwmSet::MwmId const & mwmId, ref_ptr<dp::OverlayTree> tree)
{
ClearRenderData(mwmId, m_renderData);
ClearRenderData(mwmId, m_markersRenderData);
ClearRenderData(mwmId, m_textRenderData);
ClearRenderData(mwmId, m_colorSymbolRenderData);
ClearRenderData(mwmId, nullptr /* tree */, m_renderData);
ClearRenderData(mwmId, nullptr /* tree */, m_markersRenderData);
ClearRenderData(mwmId, tree, m_textRenderData);
ClearRenderData(mwmId, tree, m_colorSymbolRenderData);
}
void TransitSchemeRenderer::ClearRenderData(MwmSet::MwmId const & mwmId, std::vector<TransitRenderData> & renderData)
void TransitSchemeRenderer::ClearRenderData(MwmSet::MwmId const & mwmId, ref_ptr<dp::OverlayTree> tree,
std::vector<TransitRenderData> & renderData)
{
auto removePredicate = [&mwmId](TransitRenderData const & data) { return data.m_mwmId == mwmId; };
ClearRenderData(removePredicate, tree, renderData);
}
renderData.erase(std::remove_if(renderData.begin(), renderData.end(), removePredicate),
void TransitSchemeRenderer::ClearRenderData(TRemovePredicate const & predicate, ref_ptr<dp::OverlayTree> tree,
std::vector<TransitRenderData> & renderData)
{
if (tree)
{
for (auto & data : renderData)
{
if (predicate(data))
{
for (auto const & bucket : data.m_buckets)
bucket->RemoveOverlayHandles(tree);
}
}
}
renderData.erase(std::remove_if(renderData.begin(), renderData.end(), predicate),
renderData.end());
}
void TransitSchemeRenderer::AddRenderData(ref_ptr<dp::GpuProgramManager> mng,
void TransitSchemeRenderer::AddRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
TransitRenderData && renderData)
{
PrepareRenderData(mng, m_renderData, renderData);
PrepareRenderData(mng, tree, m_renderData, renderData);
}
void TransitSchemeRenderer::AddMarkersRenderData(ref_ptr<dp::GpuProgramManager> mng,
void TransitSchemeRenderer::AddMarkersRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
TransitRenderData && renderData)
{
PrepareRenderData(mng, m_markersRenderData, renderData);
PrepareRenderData(mng, tree, m_markersRenderData, renderData);
}
void TransitSchemeRenderer::AddTextRenderData(ref_ptr<dp::GpuProgramManager> mng,
void TransitSchemeRenderer::AddTextRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
TransitRenderData && renderData)
{
PrepareRenderData(mng, m_textRenderData, renderData);
PrepareRenderData(mng, tree, m_textRenderData, renderData);
}
void TransitSchemeRenderer::AddStubsRenderData(ref_ptr<dp::GpuProgramManager> mng,
void TransitSchemeRenderer::AddStubsRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
TransitRenderData && renderData)
{
PrepareRenderData(mng, m_colorSymbolRenderData, renderData);
PrepareRenderData(mng, tree, m_colorSymbolRenderData, renderData);
}
void TransitSchemeRenderer::PrepareRenderData(ref_ptr<dp::GpuProgramManager> mng,
void TransitSchemeRenderer::PrepareRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
std::vector<TransitRenderData> & currentRenderData,
TransitRenderData & newRenderData)
{
// Remove obsolete render data.
currentRenderData.erase(remove_if(currentRenderData.begin(), currentRenderData.end(),
[this, &newRenderData](TransitRenderData const & rd)
{
return rd.m_mwmId == newRenderData.m_mwmId && rd.m_recacheId < m_lastRecacheId;
}), currentRenderData.end());
auto const removePredicate = [this, &newRenderData](TransitRenderData const & rd)
{
return rd.m_mwmId == newRenderData.m_mwmId && rd.m_recacheId < m_lastRecacheId;
};
ClearRenderData(removePredicate, tree, currentRenderData);
m_lastRecacheId = max(m_lastRecacheId, newRenderData.m_recacheId);
@ -142,6 +166,15 @@ void TransitSchemeRenderer::CollectOverlays(ref_ptr<dp::OverlayTree> tree, Scree
}
}
void TransitSchemeRenderer::RemoveOverlay(ref_ptr<dp::OverlayTree> tree, std::vector<TransitRenderData> & renderData)
{
for (auto & data : renderData)
{
for (auto const & bucket : data.m_buckets)
bucket->RemoveOverlayHandles(tree);
}
}
void TransitSchemeRenderer::RenderLines(ScreenBase const & screen, ref_ptr<dp::GpuProgramManager> mng,
dp::UniformValuesStorage const & commonUniforms, float pixelHalfWidth)
{

View file

@ -8,17 +8,24 @@
#include "geometry/screenbase.hpp"
#include <functional>
namespace df
{
class PostprocessRenderer;
class OverlayTree;
class TransitSchemeRenderer
{
public:
void AddRenderData(ref_ptr<dp::GpuProgramManager> mng, TransitRenderData && renderData);
void AddMarkersRenderData(ref_ptr<dp::GpuProgramManager> mng, TransitRenderData && renderData);
void AddTextRenderData(ref_ptr<dp::GpuProgramManager> mng, TransitRenderData && renderData);
void AddStubsRenderData(ref_ptr<dp::GpuProgramManager> mng, TransitRenderData && renderData);
void AddRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
TransitRenderData && renderData);
void AddMarkersRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
TransitRenderData && renderData);
void AddTextRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
TransitRenderData && renderData);
void AddStubsRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
TransitRenderData && renderData);
bool HasRenderData(int zoomLevel) const;
@ -29,15 +36,23 @@ public:
void CollectOverlays(ref_ptr<dp::OverlayTree> tree, ScreenBase const & modelView);
void ClearGLDependentResources();
void Clear(MwmSet::MwmId const & mwmId);
void ClearGLDependentResources(ref_ptr<dp::OverlayTree> tree);
void Clear(MwmSet::MwmId const & mwmId, ref_ptr<dp::OverlayTree> tree);
private:
void PrepareRenderData(ref_ptr<dp::GpuProgramManager> mng, std::vector<TransitRenderData> & currentRenderData,
void PrepareRenderData(ref_ptr<dp::GpuProgramManager> mng, ref_ptr<dp::OverlayTree> tree,
std::vector<TransitRenderData> & currentRenderData,
TransitRenderData & newRenderData);
void ClearRenderData(MwmSet::MwmId const & mwmId, std::vector<TransitRenderData> & renderData);
void ClearRenderData(MwmSet::MwmId const & mwmId, ref_ptr<dp::OverlayTree> tree,
std::vector<TransitRenderData> & renderData);
using TRemovePredicate = std::function<bool(TransitRenderData const &)>;
void ClearRenderData(TRemovePredicate const & predicate, ref_ptr<dp::OverlayTree> tree,
std::vector<TransitRenderData> & renderData);
void RemoveOverlay(ref_ptr<dp::OverlayTree> tree, std::vector<TransitRenderData> & renderData);
void CollectOverlays(ref_ptr<dp::OverlayTree> tree, ScreenBase const & modelView,
std::vector<TransitRenderData> & renderData);