forked from organicmaps/organicmaps
Remove overlays from tree.
This commit is contained in:
parent
6e4fd1f4c8
commit
9bff202aa1
3 changed files with 89 additions and 37 deletions
|
@ -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();
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue