forked from organicmaps/organicmaps
[drape] invalidate geometry by Rect
This commit is contained in:
parent
27987cb316
commit
b4e256b642
5 changed files with 69 additions and 26 deletions
|
@ -56,21 +56,26 @@ void BackendRenderer::AcceptMessage(RefPointer<Message> message)
|
|||
{
|
||||
case Message::UpdateReadManager:
|
||||
{
|
||||
UpdateReadManagerMessage * msg = static_cast<UpdateReadManagerMessage *>(message.GetRaw());
|
||||
UpdateReadManagerMessage * msg = df::CastMessage<UpdateReadManagerMessage>(message);
|
||||
ScreenBase const & screen = msg->GetScreen();
|
||||
set<TileKey> const & tiles = msg->GetTiles();
|
||||
m_readManager->UpdateCoverage(screen, tiles);
|
||||
}
|
||||
case Message::InvalidateReadManagerRect:
|
||||
{
|
||||
InvalidateReadManagerRectMessage * msg = df::CastMessage<InvalidateReadManagerRectMessage>(message);
|
||||
m_readManager->Invalidate(msg->GetTilesForInvalidate());
|
||||
}
|
||||
break;
|
||||
case Message::TileReadStarted:
|
||||
m_batchersPool->ReserveBatcher(static_cast<BaseTileMessage *>(message.GetRaw())->GetKey());
|
||||
m_batchersPool->ReserveBatcher(df::CastMessage<BaseTileMessage>(message)->GetKey());
|
||||
break;
|
||||
case Message::TileReadEnded:
|
||||
m_batchersPool->ReleaseBatcher(static_cast<BaseTileMessage *>(message.GetRaw())->GetKey());
|
||||
m_batchersPool->ReleaseBatcher(df::CastMessage<BaseTileMessage>(message)->GetKey());
|
||||
break;
|
||||
case Message::MapShapeReaded:
|
||||
{
|
||||
MapShapeReadedMessage * msg = static_cast<MapShapeReadedMessage *>(message.GetRaw());
|
||||
MapShapeReadedMessage * msg = df::CastMessage<MapShapeReadedMessage>(message);
|
||||
RefPointer<Batcher> batcher = m_batchersPool->GetTileBatcher(msg->GetKey());
|
||||
MasterPointer<MapShape> shape(msg->GetShape());
|
||||
shape->Draw(batcher, m_textures);
|
||||
|
|
|
@ -99,7 +99,7 @@ void FrontendRenderer::AcceptMessage(RefPointer<Message> message)
|
|||
{
|
||||
case Message::FlushTile:
|
||||
{
|
||||
FlushRenderBucketMessage * msg = static_cast<FlushRenderBucketMessage *>(message.GetRaw());
|
||||
FlushRenderBucketMessage * msg = df::CastMessage<FlushRenderBucketMessage>(message);
|
||||
const GLState & state = msg->GetState();
|
||||
const TileKey & key = msg->GetKey();
|
||||
MasterPointer<RenderBucket> bucket(msg->AcceptBuffer());
|
||||
|
@ -114,7 +114,7 @@ void FrontendRenderer::AcceptMessage(RefPointer<Message> message)
|
|||
|
||||
case Message::Resize:
|
||||
{
|
||||
ResizeMessage * rszMsg = static_cast<ResizeMessage *>(message.GetRaw());
|
||||
ResizeMessage * rszMsg = df::CastMessage<ResizeMessage>(message);
|
||||
m_viewport = rszMsg->GetViewport();
|
||||
m_view.OnSize(0, 0, m_viewport.GetWidth(), m_viewport.GetHeight());
|
||||
RefreshProjection();
|
||||
|
@ -128,7 +128,7 @@ void FrontendRenderer::AcceptMessage(RefPointer<Message> message)
|
|||
|
||||
case Message::UpdateModelView:
|
||||
{
|
||||
UpdateModelViewMessage * coverMessage = static_cast<UpdateModelViewMessage *>(message.GetRaw());
|
||||
UpdateModelViewMessage * coverMessage = df::CastMessage<UpdateModelViewMessage>(message);
|
||||
m_view = coverMessage->GetScreen();
|
||||
RefreshModelView();
|
||||
ResolveTileKeys();
|
||||
|
@ -138,6 +138,18 @@ void FrontendRenderer::AcceptMessage(RefPointer<Message> message)
|
|||
break;
|
||||
}
|
||||
|
||||
case Message::InvalidateRect:
|
||||
{
|
||||
InvalidateRectMessage * m = df::CastMessage<InvalidateRectMessage>(message);
|
||||
|
||||
set<TileKey> * keyStorage = new set<TileKey>();
|
||||
ResolveTileKeys(*keyStorage, m->GetRect());
|
||||
InvalidateRenderGroups(*keyStorage);
|
||||
|
||||
Message * msgToBackend = new InvalidateReadManagerRectMessage(MovePointer(keyStorage));
|
||||
m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, MovePointer(msgToBackend));
|
||||
}
|
||||
|
||||
default:
|
||||
ASSERT(false, ());
|
||||
}
|
||||
|
@ -224,10 +236,16 @@ void FrontendRenderer::RefreshModelView()
|
|||
|
||||
void FrontendRenderer::ResolveTileKeys()
|
||||
{
|
||||
set<TileKey> & tiles = GetTileKeyStorage();
|
||||
tiles.clear();
|
||||
ResolveTileKeys(GetTileKeyStorage(), df::GetTileScaleBase(m_view));
|
||||
}
|
||||
|
||||
int const tileScale = df::GetTileScaleBase(m_view);
|
||||
void FrontendRenderer::ResolveTileKeys(set<TileKey> & keyStorage, m2::RectD const & rect)
|
||||
{
|
||||
ResolveTileKeys(keyStorage, df::GetTileScaleBase(rect));
|
||||
}
|
||||
|
||||
void FrontendRenderer::ResolveTileKeys(set<TileKey> & keyStorage, int tileScale)
|
||||
{
|
||||
// equal for x and y
|
||||
double const range = MercatorBounds::maxX - MercatorBounds::minX;
|
||||
double const rectSize = range / (1 << tileScale);
|
||||
|
@ -239,10 +257,21 @@ void FrontendRenderer::ResolveTileKeys()
|
|||
int const minTileY = static_cast<int>(floor(clipRect.minY() / rectSize));
|
||||
int const maxTileY = static_cast<int>(ceil(clipRect.maxY() / rectSize));
|
||||
|
||||
keyStorage.clear();
|
||||
for (int tileY = minTileY; tileY < maxTileY; ++tileY)
|
||||
{
|
||||
for (int tileX = minTileX; tileX < maxTileX; ++tileX)
|
||||
tiles.insert(TileKey(tileX, tileY, tileScale));
|
||||
keyStorage.insert(TileKey(tileX, tileY, tileScale));
|
||||
}
|
||||
}
|
||||
|
||||
void FrontendRenderer::InvalidateRenderGroups(set<TileKey> & keyStorage)
|
||||
{
|
||||
for (size_t i = 0; i < m_renderGroups.size(); ++i)
|
||||
{
|
||||
RenderGroup * group = m_renderGroups[i];
|
||||
if (keyStorage.find(group->GetTileKey()) != keyStorage.end())
|
||||
group->DeleteLater();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -66,8 +66,12 @@ private:
|
|||
void RefreshModelView();
|
||||
|
||||
void ResolveTileKeys();
|
||||
void ResolveTileKeys(set<TileKey> & keyStorage, m2::RectD const & rect);
|
||||
void ResolveTileKeys(set<TileKey> & keyStorage, int tileScale);
|
||||
set<TileKey> & GetTileKeyStorage();
|
||||
|
||||
void InvalidateRenderGroups(set<TileKey> & keyStorage);
|
||||
|
||||
private:
|
||||
void StartThread();
|
||||
void StopThread();
|
||||
|
|
|
@ -29,11 +29,6 @@ struct LessCoverageCell
|
|||
}
|
||||
};
|
||||
|
||||
TileKey TileInfoPtrToTileKey(shared_ptr<TileInfo> const & p)
|
||||
{
|
||||
return p->GetTileKey();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
ReadManager::ReadManager(EngineContext & context, model::FeaturesFetcher & model)
|
||||
|
@ -75,17 +70,25 @@ void ReadManager::UpdateCoverage(ScreenBase const & screen, set<TileKey> const &
|
|||
back_inserter(inputRects), LessCoverageCell());
|
||||
|
||||
for_each(outdatedTiles.begin(), outdatedTiles.end(), bind(&ReadManager::ClearTileInfo, this, _1));
|
||||
|
||||
buffer_vector<TileKey, 16> outdatedTileKeys;
|
||||
transform(outdatedTiles.begin(), outdatedTiles.end(),
|
||||
back_inserter(outdatedTileKeys), &TileInfoPtrToTileKey);
|
||||
|
||||
for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::PushTaskFront, this, _1));
|
||||
for_each(inputRects.begin(), inputRects.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1));
|
||||
}
|
||||
m_currentViewport = screen;
|
||||
}
|
||||
|
||||
void ReadManager::Invalidate(set<TileKey> const & keyStorage)
|
||||
{
|
||||
tile_set_t::iterator it = m_tileInfos.begin();
|
||||
for (; it != m_tileInfos.end(); ++it)
|
||||
{
|
||||
if (keyStorage.find((*it)->GetTileKey()) != keyStorage.end())
|
||||
{
|
||||
CancelTileInfo(*it);
|
||||
PushTaskFront(*it);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ReadManager::Stop()
|
||||
{
|
||||
for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::CancelTileInfo, this, _1));
|
||||
|
@ -119,12 +122,12 @@ void ReadManager::PushTaskFront(tileinfo_ptr const & tileToReread)
|
|||
m_pool->PushFront(new ReadMWMTask(tileToReread, m_memIndex, m_model, m_context));
|
||||
}
|
||||
|
||||
void ReadManager::CancelTileInfo(tileinfo_ptr tileToCancel)
|
||||
void ReadManager::CancelTileInfo(tileinfo_ptr const & tileToCancel)
|
||||
{
|
||||
tileToCancel->Cancel(m_memIndex);
|
||||
}
|
||||
|
||||
void ReadManager::ClearTileInfo(tileinfo_ptr & tileToClear)
|
||||
void ReadManager::ClearTileInfo(tileinfo_ptr const & tileToClear)
|
||||
{
|
||||
CancelTileInfo(tileToClear);
|
||||
m_tileInfos.erase(tileToClear);
|
||||
|
|
|
@ -28,6 +28,7 @@ public:
|
|||
ReadManager(EngineContext & context, model::FeaturesFetcher & model);
|
||||
|
||||
void UpdateCoverage(ScreenBase const & screen, set<TileKey> const & tiles);
|
||||
void Invalidate(set<TileKey> const & keyStorage);
|
||||
void Stop();
|
||||
|
||||
static size_t ReadCount();
|
||||
|
@ -57,10 +58,11 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
set<tileinfo_ptr, LessByTileKey> m_tileInfos;
|
||||
typedef set<tileinfo_ptr, LessByTileKey> tile_set_t;
|
||||
tile_set_t m_tileInfos;
|
||||
|
||||
void CancelTileInfo(tileinfo_ptr tileToCancel);
|
||||
void ClearTileInfo(tileinfo_ptr & tileToClear);
|
||||
void CancelTileInfo(tileinfo_ptr const & tileToCancel);
|
||||
void ClearTileInfo(tileinfo_ptr const & tileToClear);
|
||||
};
|
||||
|
||||
} // namespace df
|
||||
|
|
Loading…
Add table
Reference in a new issue