From 1be68b2b557b6cd145fc1372f63f7fd8460534df Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Tue, 28 Jul 2015 18:41:49 +0300 Subject: [PATCH] Moved line shape building to Read MWM task --- drape/stipple_pen_resource.cpp | 6 +- drape/stipple_pen_resource.hpp | 4 +- drape/texture_of_colors.cpp | 6 +- drape/texture_of_colors.hpp | 6 +- drape_frontend/apply_feature_functors.cpp | 8 +- drape_frontend/apply_feature_functors.hpp | 11 ++- drape_frontend/backend_renderer.cpp | 2 +- drape_frontend/engine_context.cpp | 6 +- drape_frontend/engine_context.hpp | 7 +- drape_frontend/line_shape.cpp | 107 ++++++++++++---------- drape_frontend/line_shape.hpp | 29 +++++- drape_frontend/read_manager.cpp | 16 ++-- drape_frontend/read_manager.hpp | 7 +- drape_frontend/read_mwm_task.cpp | 7 +- drape_frontend/read_mwm_task.hpp | 9 +- drape_frontend/rule_drawer.cpp | 9 +- drape_frontend/rule_drawer.hpp | 9 +- drape_frontend/tile_info.cpp | 9 +- drape_frontend/tile_info.hpp | 8 +- drape_frontend/user_mark_shapes.cpp | 2 +- drape_head/testing_engine.cpp | 14 +-- 21 files changed, 186 insertions(+), 96 deletions(-) diff --git a/drape/stipple_pen_resource.cpp b/drape/stipple_pen_resource.cpp index 119f3d68cd..e571c4ac11 100644 --- a/drape/stipple_pen_resource.cpp +++ b/drape/stipple_pen_resource.cpp @@ -140,6 +140,8 @@ void StipplePenRasterizator::Rasterize(void * buffer) ref_ptr StipplePenIndex::MapResource(StipplePenKey const & key, bool & newResource) { + lock_guard g(m_mappingLock); + newResource = false; StipplePenHandle handle(key); TResourceMapping::iterator it = m_resourceMapping.find(handle); @@ -151,7 +153,7 @@ ref_ptr StipplePenIndex::MapResource(StipplePenKey const StipplePenRasterizator resource(key); m2::RectU pixelRect = m_packer.PackResource(resource.GetSize()); { - threads::MutexGuard g(m_lock); + lock_guard g(m_lock); m_pendingNodes.push_back(make_pair(pixelRect, resource)); } @@ -170,7 +172,7 @@ void StipplePenIndex::UploadResources(ref_ptr texture) TPendingNodes pendingNodes; { - threads::MutexGuard g(m_lock); + lock_guard g(m_lock); m_pendingNodes.swap(pendingNodes); } diff --git a/drape/stipple_pen_resource.hpp b/drape/stipple_pen_resource.hpp index edc456cc6e..57fa1d93b8 100644 --- a/drape/stipple_pen_resource.hpp +++ b/drape/stipple_pen_resource.hpp @@ -11,6 +11,7 @@ #include "geometry/rect2d.hpp" #include "std/map.hpp" +#include "std/mutex.hpp" namespace dp { @@ -112,7 +113,8 @@ private: TPendingNodes m_pendingNodes; StipplePenPacker m_packer; - threads::Mutex m_lock; + mutex m_lock; + mutex m_mappingLock; }; string DebugPrint(StipplePenHandle const & key); diff --git a/drape/texture_of_colors.cpp b/drape/texture_of_colors.cpp index 776fbb073b..09395b7340 100644 --- a/drape/texture_of_colors.cpp +++ b/drape/texture_of_colors.cpp @@ -22,6 +22,8 @@ ColorPalette::ColorPalette(m2::PointU const & canvasSize) ref_ptr ColorPalette::MapResource(ColorKey const & key, bool & newResource) { + lock_guard g(m_mappingLock); + TPalette::iterator itm = m_palette.find(key.m_color); newResource = itm == m_palette.end(); if (newResource) @@ -31,7 +33,7 @@ ref_ptr ColorPalette::MapResource(ColorKey const & key, b pendingColor.m_rect = m2::RectU(m_cursor.x, m_cursor.y, m_cursor.x + RESOURCE_SIZE, m_cursor.y + RESOURCE_SIZE); { - threads::MutexGuard g(m_lock); + lock_guard g(m_lock); m_pendingNodes.push_back(pendingColor); } @@ -64,7 +66,7 @@ void ColorPalette::UploadResources(ref_ptr texture) buffer_vector pendingNodes; { - threads::MutexGuard g(m_lock); + lock_guard g(m_lock); m_pendingNodes.swap(pendingNodes); } diff --git a/drape/texture_of_colors.hpp b/drape/texture_of_colors.hpp index f7733978d8..34400b718f 100644 --- a/drape/texture_of_colors.hpp +++ b/drape/texture_of_colors.hpp @@ -5,7 +5,8 @@ #include "drape/dynamic_texture.hpp" #include "base/buffer_vector.hpp" -#include "base/mutex.hpp" + +#include "std/mutex.hpp" namespace dp { @@ -55,7 +56,8 @@ private: m2::PointU m_textureSize; m2::PointU m_cursor; bool m_isDebug = false; - threads::Mutex m_lock; + mutex m_lock; + mutex m_mappingLock; }; class ColorTexture : public DynamicTexture diff --git a/drape_frontend/apply_feature_functors.cpp b/drape_frontend/apply_feature_functors.cpp index 2c8557af15..20a798989c 100644 --- a/drape_frontend/apply_feature_functors.cpp +++ b/drape_frontend/apply_feature_functors.cpp @@ -15,6 +15,7 @@ #include "drape/color.hpp" #include "drape/stipple_pen_resource.hpp" +#include "drape/texture_manager.hpp" #include "drape/utils/projection.hpp" #include "base/logging.hpp" @@ -338,13 +339,14 @@ void ApplyAreaFeature::ProcessRule(Stylist::TRuleWrapper const & rule) // ============================================= // ApplyLineFeature::ApplyLineFeature(TInsertShapeFn const & insertShape, FeatureID const & id, - CaptionDescription const & captions, - double currentScaleGtoP, bool simplify, size_t pointsCount) + CaptionDescription const & captions, double currentScaleGtoP, + bool simplify, size_t pointsCount, ref_ptr texMng) : TBase(insertShape, id, captions) , m_currentScaleGtoP(currentScaleGtoP) , m_sqrScale(math::sqr(m_currentScaleGtoP)) , m_simplify(simplify) , m_initialPointsCount(pointsCount) + , m_texMng(texMng) #ifdef CALC_FILTERED_POINTS , m_readedCount(0) #endif @@ -436,7 +438,7 @@ void ApplyLineFeature::ProcessRule(Stylist::TRuleWrapper const & rule) Extract(pLineRule, params); params.m_depth = depth; params.m_baseGtoPScale = m_currentScaleGtoP; - m_insertShape(make_unique_dp(m_spline, params)); + m_insertShape(make_unique_dp(m_spline, params, m_texMng)); } } } diff --git a/drape_frontend/apply_feature_functors.hpp b/drape_frontend/apply_feature_functors.hpp index 13fcb8a693..bb7a078f41 100644 --- a/drape_frontend/apply_feature_functors.hpp +++ b/drape_frontend/apply_feature_functors.hpp @@ -16,6 +16,11 @@ class CaptionDefProto; //#define CALC_FILTERED_POINTS +namespace dp +{ + class TextureManager; +} + namespace df { @@ -84,8 +89,8 @@ class ApplyLineFeature : public BaseApplyFeature typedef BaseApplyFeature TBase; public: ApplyLineFeature(TInsertShapeFn const & insertShape, FeatureID const & id, - CaptionDescription const & captions, - double currentScaleGtoP, bool simplify, size_t pointsCount); + CaptionDescription const & captions, double currentScaleGtoP, + bool simplify, size_t pointsCount, ref_ptr texMng); void operator() (m2::PointD const & point); bool HasGeometry() const; @@ -100,6 +105,8 @@ private: bool m_simplify; size_t m_initialPointsCount; + ref_ptr m_texMng; + #ifdef CALC_FILTERED_POINTS int m_readedCount; #endif diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index c10092b79b..ca3d9afad0 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -83,7 +83,7 @@ void BackendRenderer::AcceptMessage(ref_ptr message) ref_ptr msg = message; ScreenBase const & screen = msg->GetScreen(); TTilesCollection const & tiles = msg->GetTiles(); - m_readManager->UpdateCoverage(screen, tiles); + m_readManager->UpdateCoverage(screen, tiles, m_texMng); gui::CountryStatusHelper & helper = gui::DrapeGui::Instance().GetCountryStatusHelper(); if (!tiles.empty() && (*tiles.begin()).m_zoomLevel > scales::GetUpperWorldScale()) diff --git a/drape_frontend/engine_context.cpp b/drape_frontend/engine_context.cpp index 7d5fc8cd62..0526b7b9bf 100644 --- a/drape_frontend/engine_context.cpp +++ b/drape_frontend/engine_context.cpp @@ -3,6 +3,8 @@ //#define DRAW_TILE_NET #include "drape_frontend/message_subclasses.hpp" +#include "drape/texture_manager.hpp" + #ifdef DRAW_TILE_NET #include "drape_frontend/line_shape.hpp" #include "drape_frontend/text_shape.hpp" @@ -29,7 +31,7 @@ void EngineContext::Flush(list> && shapes) PostMessage(make_unique_dp(m_tileKey, move(shapes))); } -void EngineContext::EndReadTile() +void EngineContext::EndReadTile(ref_ptr texMng) { #ifdef DRAW_TILE_NET m2::RectD r = m_tileKey.GetGlobalRect(); @@ -49,7 +51,7 @@ void EngineContext::EndReadTile() p.m_width = 5; p.m_join = dp::RoundJoin; - InsertShape(make_unique_dp(spline, p)); + InsertShape(make_unique_dp(spline, p, texMng)); df::TextViewParams tp; tp.m_anchor = dp::Center; diff --git a/drape_frontend/engine_context.hpp b/drape_frontend/engine_context.hpp index b16b0a7dba..5b1bb2bc21 100644 --- a/drape_frontend/engine_context.hpp +++ b/drape_frontend/engine_context.hpp @@ -6,6 +6,11 @@ #include "drape/pointers.hpp" +namespace dp +{ + class TextureManager; +} + namespace df { @@ -20,7 +25,7 @@ public: void BeginReadTile(); void Flush(list> && shapes); - void EndReadTile(); + void EndReadTile(ref_ptr texMng); private: void PostMessage(drape_ptr && message); diff --git a/drape_frontend/line_shape.cpp b/drape_frontend/line_shape.cpp index 13b557001a..834e186154 100644 --- a/drape_frontend/line_shape.cpp +++ b/drape_frontend/line_shape.cpp @@ -7,7 +7,6 @@ #include "drape/glsl_func.hpp" #include "drape/shader_def.hpp" #include "drape/attribute_provider.hpp" -#include "drape/glstate.hpp" #include "drape/batcher.hpp" #include "drape/texture_manager.hpp" @@ -60,14 +59,20 @@ private: }; template -class BaseLineBuilder +class BaseLineBuilder : public LineBuilder { public: - BaseLineBuilder(dp::TextureManager::ColorRegion const & color, float pxHalfWidth) + BaseLineBuilder(dp::TextureManager::ColorRegion const & color, float pxHalfWidth, + size_t geometrySize, size_t joinsSize) : m_color(color) , m_colorCoord(glsl::ToVec2(m_color.GetTexRect().Center())) , m_pxHalfWidth(pxHalfWidth) { + if (geometrySize != 0) + m_geometry.reserve(geometrySize); + + if (joinsSize != 0) + m_joinGeom.reserve(joinsSize); } void GetTexturingInfo(float const globalLength, int & steps, float & maskSize) @@ -77,27 +82,27 @@ public: UNUSED_VALUE(maskSize); } - dp::BindingInfo const & GetBindingInfo() + dp::BindingInfo const & GetBindingInfo() override { return TVertex::GetBindingInfo(); } - ref_ptr GetLineData() + ref_ptr GetLineData() override { return make_ref(m_geometry.data()); } - size_t GetLineSize() + size_t GetLineSize() override { return m_geometry.size(); } - ref_ptr GetJoinData() + ref_ptr GetJoinData() override { return make_ref(m_joinGeom.data()); } - size_t GetJoinSize() + size_t GetJoinSize() override { return m_joinGeom.size(); } @@ -109,7 +114,7 @@ public: protected: using V = TVertex; - using TGeometryBuffer = buffer_vector; + using TGeometryBuffer = vector; TGeometryBuffer m_geometry; TGeometryBuffer m_joinGeom; @@ -125,12 +130,12 @@ class SolidLineBuilder : public BaseLineBuilder using TNormal = gpu::LineVertex::TNormal; public: - SolidLineBuilder(dp::TextureManager::ColorRegion const & color, float const pxHalfWidth) - : TBase(color, pxHalfWidth) + SolidLineBuilder(dp::TextureManager::ColorRegion const & color, float const pxHalfWidth, size_t pointsInSpline) + : TBase(color, pxHalfWidth, pointsInSpline * 2, (pointsInSpline - 2) * 8) { } - dp::GLState GetState() + dp::GLState GetState() override { dp::GLState state(gpu::LINE_PROGRAM, dp::GLState::GeometryLayer); state.SetColorTexture(m_color.GetTexture()); @@ -171,8 +176,9 @@ class DashedLineBuilder : public BaseLineBuilder public: DashedLineBuilder(dp::TextureManager::ColorRegion const & color, dp::TextureManager::StippleRegion const & stipple, - float glbHalfWidth, float pxHalfWidth, float baseGtoP) - : TBase(color, pxHalfWidth) + float glbHalfWidth, float pxHalfWidth, float baseGtoP, + size_t pointsInSpline) + : TBase(color, pxHalfWidth, pointsInSpline * 8, (pointsInSpline - 2) * 8) , m_texCoordGen(stipple, baseGtoP) , m_glbHalfWidth(glbHalfWidth) , m_baseGtoPScale(baseGtoP) @@ -186,7 +192,7 @@ public: maskSize = globalLength / steps; } - dp::GLState GetState() + dp::GLState GetState() override { dp::GLState state(gpu::DASHED_LINE_PROGRAM, dp::GLState::GeometryLayer); state.SetColorTexture(m_color.GetTexture()); @@ -226,15 +232,40 @@ private: } // namespace LineShape::LineShape(m2::SharedSpline const & spline, - LineViewParams const & params) + LineViewParams const & params, + ref_ptr textures) : m_params(params) , m_spline(spline) { ASSERT_GREATER(m_spline->GetPath().size(), 1, ()); + + dp::TextureManager::ColorRegion colorRegion; + textures->GetColorRegion(m_params.m_color, colorRegion); + float const pxHalfWidth = m_params.m_width / 2.0f; + + if (m_params.m_pattern.empty()) + { + auto builder = make_unique(colorRegion, pxHalfWidth, m_spline->GetPath().size()); + Construct(*builder); + m_lineBuilder = move(builder); + } + else + { + dp::TextureManager::StippleRegion maskRegion; + textures->GetStippleRegion(m_params.m_pattern, maskRegion); + + float const glbHalfWidth = pxHalfWidth / m_params.m_baseGtoPScale; + + auto builder = make_unique(colorRegion, maskRegion, glbHalfWidth, + pxHalfWidth, m_params.m_baseGtoPScale, + m_spline->GetPath().size()); + Construct(*builder); + m_lineBuilder = move(builder); + } } template -void LineShape::Draw(TBuilder & builder, ref_ptr batcher) const +void LineShape::Construct(TBuilder & builder) const { vector const & path = m_spline->GetPath(); ASSERT(path.size() > 1, ()); @@ -333,42 +364,24 @@ void LineShape::Draw(TBuilder & builder, ref_ptr batcher) const builder.SubmitJoin(glsl::vec3(segment.m_points[EndPoint], m_params.m_depth), normals); } - - dp::GLState state = builder.GetState(); - - dp::AttributeProvider provider(1, builder.GetLineSize()); - provider.InitStream(0, builder.GetBindingInfo(), builder.GetLineData()); - batcher->InsertListOfStrip(state, make_ref(&provider), dp::Batcher::VertexPerQuad); - - size_t joinSize = builder.GetJoinSize(); - if (joinSize > 0) - { - dp::AttributeProvider joinsProvider(1, joinSize); - joinsProvider.InitStream(0, builder.GetBindingInfo(), builder.GetJoinData()); - batcher->InsertTriangleList(state, make_ref(&joinsProvider)); - } } void LineShape::Draw(ref_ptr batcher, ref_ptr textures) const { - dp::TextureManager::ColorRegion colorRegion; - textures->GetColorRegion(m_params.m_color, colorRegion); - float const pxHalfWidth = m_params.m_width / 2.0f; + ASSERT(m_lineBuilder != nullptr, ()); - if (m_params.m_pattern.empty()) + dp::GLState state = m_lineBuilder->GetState(); + + dp::AttributeProvider provider(1, m_lineBuilder->GetLineSize()); + provider.InitStream(0, m_lineBuilder->GetBindingInfo(), m_lineBuilder->GetLineData()); + batcher->InsertListOfStrip(state, make_ref(&provider), dp::Batcher::VertexPerQuad); + + size_t joinSize = m_lineBuilder->GetJoinSize(); + if (joinSize > 0) { - SolidLineBuilder builder(colorRegion, pxHalfWidth); - Draw(builder, batcher); - } - else - { - dp::TextureManager::StippleRegion maskRegion; - textures->GetStippleRegion(m_params.m_pattern, maskRegion); - - float const glbHalfWidth = pxHalfWidth / m_params.m_baseGtoPScale; - - DashedLineBuilder builder(colorRegion, maskRegion, glbHalfWidth, pxHalfWidth, m_params.m_baseGtoPScale); - Draw(builder, batcher); + dp::AttributeProvider joinsProvider(1, joinSize); + joinsProvider.InitStream(0, m_lineBuilder->GetBindingInfo(), m_lineBuilder->GetJoinData()); + batcher->InsertTriangleList(state, make_ref(&joinsProvider)); } } diff --git a/drape_frontend/line_shape.hpp b/drape_frontend/line_shape.hpp index 2e9070c65c..102c7434bb 100644 --- a/drape_frontend/line_shape.hpp +++ b/drape_frontend/line_shape.hpp @@ -3,26 +3,47 @@ #include "drape_frontend/map_shape.hpp" #include "drape_frontend/shape_view_params.hpp" +#include "drape/binding_info.hpp" +#include "drape/glstate.hpp" + #include "geometry/spline.hpp" +#include "std/unique_ptr.hpp" + namespace df { +class LineBuilder +{ +public: + virtual ~LineBuilder() {} + + virtual dp::BindingInfo const & GetBindingInfo() = 0; + virtual dp::GLState GetState() = 0; + + virtual ref_ptr GetLineData() = 0; + virtual size_t GetLineSize() = 0; + + virtual ref_ptr GetJoinData() = 0; + virtual size_t GetJoinSize() = 0; +}; + class LineShape : public MapShape { public: LineShape(m2::SharedSpline const & spline, - LineViewParams const & params); + LineViewParams const & params, + ref_ptr textures); - virtual void Draw(ref_ptr batcher, ref_ptr textures) const; + void Draw(ref_ptr batcher, ref_ptr textures) const override; private: template - void Draw(TBuilder & builder, ref_ptr batcher) const; + void Construct(TBuilder & builder) const; -private: LineViewParams m_params; m2::SharedSpline m_spline; + unique_ptr m_lineBuilder; }; } // namespace df diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index 199e83f638..0bc4125c95 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -69,7 +69,7 @@ void ReadManager::OnTaskFinished(threads::IRoutine * task) myPool.Return(t); } -void ReadManager::UpdateCoverage(ScreenBase const & screen, TTilesCollection const & tiles) +void ReadManager::UpdateCoverage(ScreenBase const & screen, TTilesCollection const & tiles, ref_ptr texMng) { if (screen == m_currentViewport && !m_forceUpdate) return; @@ -81,7 +81,7 @@ void ReadManager::UpdateCoverage(ScreenBase const & screen, TTilesCollection con for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::CancelTileInfo, this, _1)); m_tileInfos.clear(); - for_each(tiles.begin(), tiles.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1)); + for_each(tiles.begin(), tiles.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1, texMng)); } else { @@ -106,8 +106,8 @@ void ReadManager::UpdateCoverage(ScreenBase const & screen, TTilesCollection con IncreaseCounter(static_cast(inputRects.size() + (m_tileInfos.size() - outdatedTiles.size()))); for_each(outdatedTiles.begin(), outdatedTiles.end(), bind(&ReadManager::ClearTileInfo, this, _1)); - for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::PushTaskFront, this, _1)); - for_each(inputRects.begin(), inputRects.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1)); + for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::PushTaskFront, this, _1, texMng)); + for_each(inputRects.begin(), inputRects.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1, texMng)); } m_currentViewport = screen; } @@ -151,19 +151,19 @@ bool ReadManager::MustDropAllTiles(ScreenBase const & screen) const return (oldScale != newScale) || !m_currentViewport.GlobalRect().IsIntersect(screen.GlobalRect()); } -void ReadManager::PushTaskBackForTileKey(TileKey const & tileKey) +void ReadManager::PushTaskBackForTileKey(TileKey const & tileKey, ref_ptr texMng) { shared_ptr tileInfo(new TileInfo(make_unique_dp(tileKey, m_commutator))); m_tileInfos.insert(tileInfo); ReadMWMTask * task = myPool.Get(); - task->Init(tileInfo); + task->Init(tileInfo, texMng); m_pool->PushBack(task); } -void ReadManager::PushTaskFront(shared_ptr const & tileToReread) +void ReadManager::PushTaskFront(shared_ptr const & tileToReread, ref_ptr texMng) { ReadMWMTask * task = myPool.Get(); - task->Init(tileToReread); + task->Init(tileToReread, texMng); m_pool->PushFront(task); } diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp index 52f5b74be9..53b750fe0f 100755 --- a/drape_frontend/read_manager.hpp +++ b/drape_frontend/read_manager.hpp @@ -10,6 +10,7 @@ #include "drape/object_pool.hpp" #include "drape/pointers.hpp" +#include "drape/texture_manager.hpp" #include "base/thread_pool.hpp" @@ -29,7 +30,7 @@ class ReadManager public: ReadManager(ref_ptr commutator, MapDataProvider & model); - void UpdateCoverage(ScreenBase const & screen, TTilesCollection const & tiles); + void UpdateCoverage(ScreenBase const & screen, TTilesCollection const & tiles, ref_ptr texMng); void Invalidate(TTilesCollection const & keyStorage); void Stop(); @@ -39,8 +40,8 @@ private: void OnTaskFinished(threads::IRoutine * task); bool MustDropAllTiles(ScreenBase const & screen) const; - void PushTaskBackForTileKey(TileKey const & tileKey); - void PushTaskFront(shared_ptr const & tileToReread); + void PushTaskBackForTileKey(TileKey const & tileKey, ref_ptr texMng); + void PushTaskFront(shared_ptr const & tileToReread, ref_ptr texMng); private: MemoryFeatureIndex m_memIndex; diff --git a/drape_frontend/read_mwm_task.cpp b/drape_frontend/read_mwm_task.cpp index d84accba03..e40abfb98d 100644 --- a/drape_frontend/read_mwm_task.cpp +++ b/drape_frontend/read_mwm_task.cpp @@ -1,5 +1,7 @@ #include "drape_frontend/read_mwm_task.hpp" +#include "drape/texture_manager.hpp" + namespace df { ReadMWMTask::ReadMWMTask(MemoryFeatureIndex & memIndex, MapDataProvider & model) @@ -11,9 +13,10 @@ ReadMWMTask::ReadMWMTask(MemoryFeatureIndex & memIndex, MapDataProvider & model) #endif } -void ReadMWMTask::Init(shared_ptr const & tileInfo) +void ReadMWMTask::Init(shared_ptr const & tileInfo, ref_ptr texMng) { m_tileInfo = tileInfo; + m_texMng = texMng; #ifdef DEBUG m_checker = true; #endif @@ -36,7 +39,7 @@ void ReadMWMTask::Do() ASSERT(m_tileInfo != nullptr, ()); try { - m_tileInfo->ReadFeatures(m_model, m_memIndex); + m_tileInfo->ReadFeatures(m_model, m_memIndex, m_texMng); } catch (TileInfo::ReadCanceledException &) { diff --git a/drape_frontend/read_mwm_task.hpp b/drape_frontend/read_mwm_task.hpp index 8659bee1fb..b1b0c89139 100644 --- a/drape_frontend/read_mwm_task.hpp +++ b/drape_frontend/read_mwm_task.hpp @@ -10,6 +10,11 @@ #include "std/shared_ptr.hpp" +namespace dp +{ + class TextureManager; +} + namespace df { @@ -21,12 +26,14 @@ public: virtual void Do(); - void Init(shared_ptr const & tileInfo); + void Init(shared_ptr const & tileInfo, ref_ptr texMng); void Reset(); TileKey GetTileKey() const; private: shared_ptr m_tileInfo; + ref_ptr m_texMng; + MemoryFeatureIndex & m_memIndex; MapDataProvider & m_model; diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp index efd1584912..ba06408e05 100644 --- a/drape_frontend/rule_drawer.cpp +++ b/drape_frontend/rule_drawer.cpp @@ -4,6 +4,8 @@ #include "drape_frontend/apply_feature_functors.hpp" #include "drape_frontend/visual_params.hpp" +#include "drape/texture_manager.hpp" + #include "indexer/feature.hpp" #include "indexer/feature_algo.hpp" @@ -16,9 +18,11 @@ namespace df int const SIMPLIFY_BOTTOM = 10; int const SIMPLIFY_TOP = 12; -RuleDrawer::RuleDrawer(TDrawerCallback const & fn, ref_ptr context) +RuleDrawer::RuleDrawer(TDrawerCallback const & fn, ref_ptr context, + ref_ptr texMng) : m_callback(fn) , m_context(context) + , m_texMng(texMng) { m_globalRect = m_context->GetTileKey().GetGlobalRect(); @@ -70,7 +74,8 @@ void RuleDrawer::operator()(FeatureType const & f) else if (s.LineStyleExists()) { ApplyLineFeature apply(insertShape, f.GetID(), s.GetCaptionDescription(), m_currentScaleGtoP, - zoomLevel >= SIMPLIFY_BOTTOM && zoomLevel <= SIMPLIFY_TOP, f.GetPointsCount()); + zoomLevel >= SIMPLIFY_BOTTOM && zoomLevel <= SIMPLIFY_TOP, f.GetPointsCount(), + m_texMng); f.ForEachPointRef(apply, zoomLevel); if (apply.HasGeometry()) diff --git a/drape_frontend/rule_drawer.hpp b/drape_frontend/rule_drawer.hpp index 3b0bb499be..44181d541c 100644 --- a/drape_frontend/rule_drawer.hpp +++ b/drape_frontend/rule_drawer.hpp @@ -13,6 +13,11 @@ class FeatureType; +namespace dp +{ + class TextureManager; +} + namespace df { @@ -25,7 +30,8 @@ class RuleDrawer public: using TDrawerCallback = function; RuleDrawer(TDrawerCallback const & fn, - ref_ptr context); + ref_ptr context, + ref_ptr texMng); void operator() (FeatureType const & f); @@ -38,6 +44,7 @@ private: set m_coastlines; list> m_mapShapes; + ref_ptr m_texMng; }; } // namespace dfo diff --git a/drape_frontend/tile_info.cpp b/drape_frontend/tile_info.cpp index 9f4f44dc13..f9e05e9be2 100644 --- a/drape_frontend/tile_info.cpp +++ b/drape_frontend/tile_info.cpp @@ -4,6 +4,8 @@ #include "drape_frontend/stylist.hpp" #include "drape_frontend/tile_info.hpp" +#include "drape/texture_manager.hpp" + #include "indexer/scales.hpp" #include "base/scope_guard.hpp" @@ -38,12 +40,13 @@ void TileInfo::ReadFeatureIndex(MapDataProvider const & model) } void TileInfo::ReadFeatures(MapDataProvider const & model, - MemoryFeatureIndex & memIndex) + MemoryFeatureIndex & memIndex, + ref_ptr texMng) { m_context->BeginReadTile(); // Reading can be interrupted by exception throwing - MY_SCOPE_GUARD(ReleaseReadTile, bind(&EngineContext::EndReadTile, m_context.get())); + MY_SCOPE_GUARD(ReleaseReadTile, bind(&EngineContext::EndReadTile, m_context.get(), texMng)); ReadFeatureIndex(model); @@ -54,7 +57,7 @@ void TileInfo::ReadFeatures(MapDataProvider const & model, if (!featuresToRead.empty()) { - RuleDrawer drawer(bind(&TileInfo::InitStylist, this, _1 ,_2), make_ref(m_context)); + RuleDrawer drawer(bind(&TileInfo::InitStylist, this, _1 ,_2), make_ref(m_context), texMng); model.ReadFeatures(bind(ref(drawer), _1), featuresToRead); } } diff --git a/drape_frontend/tile_info.hpp b/drape_frontend/tile_info.hpp index ee3c8b5ac5..9e865f35f6 100644 --- a/drape_frontend/tile_info.hpp +++ b/drape_frontend/tile_info.hpp @@ -14,6 +14,11 @@ class FeatureType; +namespace dp +{ + class TextureManager; +} + namespace df { @@ -28,7 +33,8 @@ public: TileInfo(drape_ptr && context); void ReadFeatures(MapDataProvider const & model, - MemoryFeatureIndex & memIndex); + MemoryFeatureIndex & memIndex, + ref_ptr texMng); void Cancel(MemoryFeatureIndex & memIndex); m2::RectD GetGlobalRect() const; diff --git a/drape_frontend/user_mark_shapes.cpp b/drape_frontend/user_mark_shapes.cpp index 91e5680152..4f1c37683f 100644 --- a/drape_frontend/user_mark_shapes.cpp +++ b/drape_frontend/user_mark_shapes.cpp @@ -183,7 +183,7 @@ void CacheUserLines(UserMarksProvider const * provider, params.m_depth = line->GetLayerDepth(layerIndex); params.m_width = line->GetWidth(layerIndex); - LineShape(spline, params).Draw(batcher, textures); + LineShape(spline, params, textures).Draw(batcher, textures); } } } diff --git a/drape_head/testing_engine.cpp b/drape_head/testing_engine.cpp index dcb0fa00f4..b4c2b22706 100644 --- a/drape_head/testing_engine.cpp +++ b/drape_head/testing_engine.cpp @@ -193,7 +193,7 @@ public: } }; -class MapShapeFactory +/*class MapShapeFactory { typedef function TCreateFn; typedef map TCreatorsMap; @@ -324,7 +324,7 @@ private: private: TCreatorsMap m_creators; -}; +};*/ TestingEngine::TestingEngine(Viewport const & viewport, double vs) : m_viewport(viewport) @@ -463,7 +463,7 @@ void TestingEngine::DrawImpl() lvp.m_color = dp::Color::Red(); lvp.m_width = 16.0f; lvp.m_join = dp::BevelJoin; - LineShape(spline, lvp).Draw(make_ref(m_batcher), make_ref(m_textures)); + LineShape(spline, lvp, make_ref(m_textures)).Draw(make_ref(m_batcher), make_ref(m_textures)); { PathSymbolViewParams p; @@ -494,7 +494,7 @@ void TestingEngine::DrawImpl() lvp.m_join = dp::RoundJoin; lvp.m_cap = dp::RoundCap; lvp.m_color = dp::Color::Black(); - LineShape(spl1, lvp).Draw(make_ref(m_batcher), make_ref(m_textures)); + LineShape(spl1, lvp, make_ref(m_textures)).Draw(make_ref(m_batcher), make_ref(m_textures)); } { @@ -518,7 +518,7 @@ void TestingEngine::DrawImpl() lvpl.m_pattern.clear(); lvpl.m_depth = -10.0f; lvpl.m_width = 2.0f; - LineShape(spl, lvpl).Draw(make_ref(m_batcher), make_ref(m_textures)); + LineShape(spl, lvpl, make_ref(m_textures)).Draw(make_ref(m_batcher), make_ref(m_textures)); DummyMutableLabel tt(m2::PointF(120.0f, 30.0f), "200 km"); tt.Draw(make_ref(m_batcher), make_ref(m_textures)); @@ -537,7 +537,7 @@ void TestingEngine::DrawImpl() lvpl.m_pattern.clear(); lvpl.m_depth = -10.0f; lvpl.m_width = 2.0f; - LineShape(spl, lvpl).Draw(make_ref(m_batcher), make_ref(m_textures)); + LineShape(spl, lvpl, make_ref(m_textures)).Draw(make_ref(m_batcher), make_ref(m_textures)); } dp::FontDecl font(dp::Color::Black(), 14); @@ -577,7 +577,7 @@ void TestingEngine::DrawRects() }; m2::SharedSpline spline(path); - LineShape(spline, lvp).Draw(make_ref(m_batcher), make_ref(m_textures)); + LineShape(spline, lvp, make_ref(m_textures)).Draw(make_ref(m_batcher), make_ref(m_textures)); }; for (m2::RectD const & r : m_boundRects)