Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- From 1451ce81d4aa5b8686500d2b0e3e0d881fb24a64 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:32:03 +0600
- Subject: [PATCH 01/24] =?UTF-8?q?[LMAP-1478]=20move=20=D0=BA=D0=BE=D0=BD?=
- =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=20=D0=B4=D0=BB?=
- =?UTF-8?q?=D1=8F=20CGraphicsPrimitive?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/tmRender/CGraphicsPrimitive.h | 24 ++++++++++++++++++++++++
- 1 file changed, 24 insertions(+)
- diff --git a/Projects/tmRender/CGraphicsPrimitive.h b/Projects/tmRender/CGraphicsPrimitive.h
- index d5078d5..4820cb7 100644
- --- a/Projects/tmRender/CGraphicsPrimitive.h
- +++ b/Projects/tmRender/CGraphicsPrimitive.h
- @@ -1,5 +1,7 @@
- #pragma once
- +#include <unicore/uni_assert.h>
- +
- #include <tmCore/CorTypes.h>
- #include "Fwd.h"
- @@ -384,6 +386,28 @@ public:
- }
- }
- + CGraphicsPrimitive(CGraphicsPrimitive && other)
- + : SType(other.SType)
- + , GType(other.GType)
- + , StartOrIndex(other.StartOrIndex)
- + , Count(other.Count)
- + , Flags(other.Flags)
- + {
- + switch (SType)
- + {
- + case EPST_RANGE:
- + break;
- + case EPST_IDX32:
- + other.StartOrIndex.Index32 = nullptr;
- + break;
- + case EPST_IDX16:
- + other.StartOrIndex.Index16 = nullptr;
- + break;
- + default:
- + UNI_ASSERT(false);
- + }
- + }
- +
- ~CGraphicsPrimitive()
- {
- deleteIndex();
- --
- 1.9.5.msysgit.1
- From 6b141f45d25bee489d4f2e5e2035becf55b95c94 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 13 Jul 2015 17:49:25 +0600
- Subject: [PATCH 02/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
- =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20make=5Fintrusive?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/tmCore/make_intrusive.h | 14 ++++++++++++++
- Projects/tmCore/tmCore.gyp | 1 +
- 2 files changed, 15 insertions(+)
- create mode 100644 Projects/tmCore/make_intrusive.h
- diff --git a/Projects/tmCore/make_intrusive.h b/Projects/tmCore/make_intrusive.h
- new file mode 100644
- index 0000000..2e023f0
- --- /dev/null
- +++ b/Projects/tmCore/make_intrusive.h
- @@ -0,0 +1,14 @@
- +#pragma once
- +
- +#include <boost/intrusive_ptr.hpp>
- +
- +namespace tme
- +{
- +
- +template <class T, class... Args>
- +inline boost::intrusive_ptr<T> make_intrusive(Args &&... args)
- +{
- + return boost::intrusive_ptr<T>(new T(std::forward<Args>(args)...));
- +}
- +
- +} // namespace tme
- diff --git a/Projects/tmCore/tmCore.gyp b/Projects/tmCore/tmCore.gyp
- index ab243e6..2f97b8e 100644
- --- a/Projects/tmCore/tmCore.gyp
- +++ b/Projects/tmCore/tmCore.gyp
- @@ -24,6 +24,7 @@
- 'ISystem.h',
- 'IThread.h',
- 'make_unique.h',
- + 'make_intrusive.h',
- 'make_vector_with_capacity.h',
- 'move_and_clear.h',
- 'clear_and_reserve.h',
- --
- 1.9.5.msysgit.1
- From c59164944078784aebde4bbfc1df8e4e4edc1718 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:34:40 +0600
- Subject: [PATCH 03/24] =?UTF-8?q?[LMAP-1478]=20setDataCopyVertexRenderNode?=
- =?UTF-8?q?=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF=D1=80=D0=B8?=
- =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82=20intrusive=5Fptr?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/tmRender/CLabelSceneNode.h | 2 +-
- Projects/tmRender/CPrimitiveSetSceneNode.h | 2 +-
- Projects/tmRender/CRasterSceneNode.h | 2 +-
- Projects/tmRender/IMorphAnimatedSceneNode.h | 2 +-
- Projects/tmRender/src/CLabelSceneNode.cpp | 2 +-
- Projects/tmRender/src/CRasterSceneNode.cpp | 4 +---
- 6 files changed, 6 insertions(+), 8 deletions(-)
- diff --git a/Projects/tmRender/CLabelSceneNode.h b/Projects/tmRender/CLabelSceneNode.h
- index 1ffaf8d..2feaaad 100644
- --- a/Projects/tmRender/CLabelSceneNode.h
- +++ b/Projects/tmRender/CLabelSceneNode.h
- @@ -69,7 +69,7 @@ public: // IMorphAnimatedSceneNode
- virtual void setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &vertices) override;
- virtual IVertexRenderNode * getDataCopyVertexRenderNode() override;
- - virtual void setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node_) override;
- + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node_) override;
- virtual SVertexStream * getDataCopyVertices() override;
- virtual const SVertexStream * getDataCopyConstVertices() const override;
- diff --git a/Projects/tmRender/CPrimitiveSetSceneNode.h b/Projects/tmRender/CPrimitiveSetSceneNode.h
- index e187670..c96f779 100644
- --- a/Projects/tmRender/CPrimitiveSetSceneNode.h
- +++ b/Projects/tmRender/CPrimitiveSetSceneNode.h
- @@ -109,7 +109,7 @@ public: // IMorphAnimatedSceneNode.
- virtual bool accessDataCopyPrimitives(IMorphSourcePrimitiveEnumerator &enumerator) override;
- virtual void setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &vertices) override;
- - virtual void setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node) override;
- + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node) override;
- virtual SVertexStream * getDataCopyVertices() override;
- virtual const SVertexStream * getDataCopyConstVertices() const override;
- virtual IVertexRenderNode * getDataCopyVertexRenderNode() override;
- diff --git a/Projects/tmRender/CRasterSceneNode.h b/Projects/tmRender/CRasterSceneNode.h
- index 77610ce..f8c357a 100644
- --- a/Projects/tmRender/CRasterSceneNode.h
- +++ b/Projects/tmRender/CRasterSceneNode.h
- @@ -62,7 +62,7 @@ public: // IMorphAnimatedSceneNode
- virtual void setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &vertices) override;
- virtual IVertexRenderNode * getDataCopyVertexRenderNode() override;
- - virtual void setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node_) override;
- + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node_) override;
- virtual SVertexStream * getDataCopyVertices() override;
- virtual const SVertexStream * getDataCopyConstVertices() const override;
- diff --git a/Projects/tmRender/IMorphAnimatedSceneNode.h b/Projects/tmRender/IMorphAnimatedSceneNode.h
- index 2966a7c..2738a94 100644
- --- a/Projects/tmRender/IMorphAnimatedSceneNode.h
- +++ b/Projects/tmRender/IMorphAnimatedSceneNode.h
- @@ -391,7 +391,7 @@ public:
- virtual IVertexRenderNode * getDataCopyVertexRenderNode() = 0;
- // Замена целиком уЕла с вершинным буфером
- - virtual void setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node) = 0;
- + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node) = 0;
- virtual void setDataCopyCulling(ERenderFaceCulling culling) = 0;
- virtual void setDataCopyDepthTest(ERenderDepthTestMode depthmode, ERenderDepthTestFunc depthfunc) = 0;
- diff --git a/Projects/tmRender/src/CLabelSceneNode.cpp b/Projects/tmRender/src/CLabelSceneNode.cpp
- index a8d01c2..5e7b9b4 100644
- --- a/Projects/tmRender/src/CLabelSceneNode.cpp
- +++ b/Projects/tmRender/src/CLabelSceneNode.cpp
- @@ -179,7 +179,7 @@ IVertexRenderNode * CLabelSceneNode::getDataCopyVertexRenderNode()
- return nullptr;
- }
- -void CLabelSceneNode::setDataCopyVertexRenderNode(IVertexRenderNode * const)
- +void CLabelSceneNode::setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> &)
- {
- UNI_ASSERT(false);
- }
- diff --git a/Projects/tmRender/src/CRasterSceneNode.cpp b/Projects/tmRender/src/CRasterSceneNode.cpp
- index 0ab5bdb..40ffb3a 100644
- --- a/Projects/tmRender/src/CRasterSceneNode.cpp
- +++ b/Projects/tmRender/src/CRasterSceneNode.cpp
- @@ -394,10 +394,8 @@ void CRasterSceneNode::setDataCopyVertices(const boost::intrusive_ptr<SVertexStr
- UNI_ASSERT(false);
- }
- -void CRasterSceneNode::setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node)
- +void CRasterSceneNode::setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> &)
- {
- - UNI_UNUSED(vertex_render_node);
- -
- UNI_ASSERT(false);
- TM_THROW_AND_LOG(std::runtime_error("CRasterSceneNode::setDataCopyVertexRenderNode not implemented."));
- }
- --
- 1.9.5.msysgit.1
- From 832b59b608ecfabbfa6b30edbd4d441e17e40f56 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:36:43 +0600
- Subject: [PATCH 04/24] =?UTF-8?q?[LMAP-1478]=20=D0=A0=D0=B5=D1=84=D0=B0?=
- =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20CPrimitiveSetScene?=
- =?UTF-8?q?Node.=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20=D1=80=D1=83?=
- =?UTF-8?q?=D1=87=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?=
- =?UTF-8?q?=20=D1=81=20RefCounted-=D1=82=D0=B8=D0=BF=D0=B0=D0=BC=D0=B8.=20?=
- =?UTF-8?q?=D0=A1=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20=D0=B2=D0=BC=D0=B5=D1=81?=
- =?UTF-8?q?=D1=82=D0=BE=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB?=
- =?UTF-8?q?=D0=B5=D0=B9,=20=D1=82=D0=B0=D0=BC=20=D0=B3=D0=B4=D0=B5=20?=
- =?UTF-8?q?=D1=8D=D1=82=D0=BE=20=D0=BD=D1=83=D0=B6=D0=BD=D0=BE.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/tmRender/CPrimitiveSetSceneNode.h | 8 +-
- Projects/tmRender/src/CPrimitiveSetSceneNode.cpp | 454 ++++++++---------------
- 2 files changed, 158 insertions(+), 304 deletions(-)
- diff --git a/Projects/tmRender/CPrimitiveSetSceneNode.h b/Projects/tmRender/CPrimitiveSetSceneNode.h
- index c96f779..6fe3bfa 100644
- --- a/Projects/tmRender/CPrimitiveSetSceneNode.h
- +++ b/Projects/tmRender/CPrimitiveSetSceneNode.h
- @@ -41,8 +41,8 @@ public:
- * \param callback интерфейс сообщения раЕделяемому буферу, о требовании или
- * отсутствии требования добавлять раЕделяемую ноду в дерево рендеринга
- */
- - void beginSet(SVertexStream * vertices, ISharedBufferCallback *callback);
- - void addPrimitive(const CGraphicsPrimitive & other);
- + void beginSet(const boost::intrusive_ptr<SVertexStream> & vertices, ISharedBufferCallback *callback);
- + void addPrimitive(const CGraphicsPrimitive & shared_primitive);
- void addPrimitive(
- EPrimitiveGraphicsType type,
- tm_size_type start,
- @@ -150,6 +150,7 @@ protected:
- private:
- void resetVerticesRange();
- + void addPrimitive(const boost::intrusive_ptr<CPrimitiveRenderNode> & shared_primitive);
- private: // геттеры примитивов
- static bool get_source_primitives(
- @@ -174,7 +175,8 @@ private:
- std::shared_ptr<SDataCopy> DataCopy;
- EAnimationMethod animation_method_;
- - std::vector<CPrimitiveRenderNode *> Primitives; // Набор примитивов над вышележащим вершинным буфером
- + // Набор примитивов над вышележащим вершинным буфером.
- + std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> Primitives;
- tm_size_type SourceStart; // Начало диапаЕона вершин, испольЕуемых примитивами этого объекта
- tm_size_type SourceEnd; // Конец диапаЕона вершин, испольЕуемых примитивами этого объекта
- // Вершинный буфер исходных вершин. Предполагается неиЕменным, испольЕуется для соЕдания локальной копии.
- diff --git a/Projects/tmRender/src/CPrimitiveSetSceneNode.cpp b/Projects/tmRender/src/CPrimitiveSetSceneNode.cpp
- index 2428e8d..9b884f3 100644
- --- a/Projects/tmRender/src/CPrimitiveSetSceneNode.cpp
- +++ b/Projects/tmRender/src/CPrimitiveSetSceneNode.cpp
- @@ -3,6 +3,7 @@
- #include "../CPrimitiveSetSceneNode.h"
- #include <tmCore/Config.h>
- +#include <tmCore/make_intrusive.h>
- #include <tmRender/VertexStream.inl>
- #include "../CVertexRenderNode.h"
- #include "../IMorphAnimator.h"
- @@ -16,10 +17,10 @@ namespace tmrender
- namespace
- {
- -class CVertexRenderNodeProxy : public IVertexRenderNode
- +class CVertexRenderNodeProxy final : public IVertexRenderNode
- {
- public:
- - CVertexRenderNodeProxy(const IVertexRenderNode *vertex_render_node)
- + explicit CVertexRenderNodeProxy(const boost::intrusive_ptr<const IVertexRenderNode> & vertex_render_node)
- : IVertexRenderNode(nullptr)
- , shared_buffer_(vertex_render_node)
- {
- @@ -61,80 +62,62 @@ public:
- }
- private:
- - boost::intrusive_ptr<const IVertexRenderNode> shared_buffer_;
- + const boost::intrusive_ptr<const IVertexRenderNode> shared_buffer_;
- };
- } // namespace
- -struct CPrimitiveSetSceneNode::SDataCopy
- +struct CPrimitiveSetSceneNode::SDataCopy final
- {
- - SDataCopy(CPrimitiveSetSceneNode *node);
- + explicit SDataCopy(CPrimitiveSetSceneNode & node);
- ~SDataCopy();
- - CPrimitiveSetSceneNode *node_; // source node
- + CPrimitiveSetSceneNode & node_;
- - IVertexRenderNode * render_node_; // текущая рабочая копия, содержащая морфированные вершины
- + // текущая рабочая копия, содержащая морфированные вершины.
- + boost::intrusive_ptr<IVertexRenderNode> render_node_;
- boost::intrusive_ptr<CVertexRenderNodeProxy> area_render_node_;
- boost::intrusive_ptr<CVertexRenderNodeProxy> line_render_node_;
- // морфированные примитивы. Если Еадается локальный вершинный буфер, то они
- // автоматом присоединяются к соотвествующей вертексной ноде, иначе вершинный
- // буфер остается внешним(исходным или морфированным) и присоединение происходит к нему
- - std::vector<CPrimitiveRenderNode *> primitives_;
- + std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> primitives_;
- // морфированные примитивы, эти примитивы служат для двухпроходного
- // рендеринга (площадные, линейные)
- - std::vector<CPrimitiveRenderNode *> area_primitives_;
- - std::vector<CPrimitiveRenderNode *> line_primitives_;
- + std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> area_primitives_;
- + std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> line_primitives_;
- // Флаг вЕведен, когда установлены примитивы для копии.
- - bool use_copy_primitives_;
- + bool use_copy_primitives_ = false;
- };
- //------------------------------------------------------------------------------------------------------------
- -CPrimitiveSetSceneNode::SDataCopy::SDataCopy(CPrimitiveSetSceneNode *node)
- +CPrimitiveSetSceneNode::SDataCopy::SDataCopy(CPrimitiveSetSceneNode & node)
- : node_(node)
- - , render_node_(0)
- - , primitives_()
- - , use_copy_primitives_(false)
- {
- }
- CPrimitiveSetSceneNode::SDataCopy::~SDataCopy()
- {
- - if (render_node_)
- + if (render_node_ && node_.Callback)
- {
- - render_node_->drop();
- - if (node_->Callback)
- - {
- - node_->Callback->requireSharedBuffer(node_);
- - }
- - }
- - for (CPrimitiveRenderNode *primitive : primitives_)
- - {
- - primitive->drop();
- - }
- - for (CPrimitiveRenderNode *primitive : area_primitives_)
- - {
- - primitive->drop();
- - }
- - for (CPrimitiveRenderNode *primitive : line_primitives_)
- - {
- - primitive->drop();
- + node_.Callback->requireSharedBuffer(&node_);
- }
- }
- bool CPrimitiveSetSceneNode::get_source_primitives(
- SPrimitiveData &primitive_data,
- - IMorphAnimatedSceneNode *primitive_set_scene,
- - int index)
- + IMorphAnimatedSceneNode * const primitive_set_scene,
- + const int index)
- {
- - CPrimitiveSetSceneNode *scene_node = static_cast<CPrimitiveSetSceneNode *>(primitive_set_scene);
- + UNI_ASSERT(primitive_set_scene);
- + auto & scene_node = checked_cast<CPrimitiveSetSceneNode &>(*primitive_set_scene);
- if (index < 0
- - || scene_node->Primitives.size() <= size_t(index))
- + || scene_node.Primitives.size() <= size_t(index))
- {
- return false;
- }
- - CPrimitiveRenderNode *requested_primitive = scene_node->Primitives[
- - static_cast<size_t>(index)];
- - primitive_data.Primitive = requested_primitive;
- + const auto & requested_primitive = scene_node.Primitives[static_cast<size_t>(index)];
- + primitive_data.Primitive = requested_primitive.get();
- primitive_data.ColorIndex = &requested_primitive->accessColorIndex();
- return true;
- @@ -142,19 +125,19 @@ bool CPrimitiveSetSceneNode::get_source_primitives(
- bool CPrimitiveSetSceneNode::get_source_const_primitives(
- SPrimitiveConstData &primitive_data,
- - const IMorphAnimatedSceneNode *primitive_set_scene,
- - int index)
- + const IMorphAnimatedSceneNode * const primitive_set_scene,
- + const int index)
- {
- - const CPrimitiveSetSceneNode *scene_node = static_cast<const CPrimitiveSetSceneNode *>(primitive_set_scene);
- + UNI_ASSERT(primitive_set_scene);
- + const auto & scene_node = checked_cast<const CPrimitiveSetSceneNode &>(*primitive_set_scene);
- if (index < 0
- - || scene_node->Primitives.size() <= size_t(index))
- + || scene_node.Primitives.size() <= size_t(index))
- {
- return false;
- }
- - CPrimitiveRenderNode *requested_primitive = scene_node->Primitives[
- - static_cast<size_t>(index)];
- - primitive_data.Primitive = requested_primitive;
- + const auto & requested_primitive = scene_node.Primitives[static_cast<size_t>(index)];
- + primitive_data.Primitive = requested_primitive.get();
- primitive_data.ColorIndex = requested_primitive->getColorIndex();
- return true;
- @@ -162,19 +145,19 @@ bool CPrimitiveSetSceneNode::get_source_const_primitives(
- bool CPrimitiveSetSceneNode::get_data_copy_primitives(
- SPrimitiveData &primitive_data,
- - IMorphAnimatedSceneNode *primitive_set_scene,
- - int index)
- + IMorphAnimatedSceneNode * const primitive_set_scene,
- + const int index)
- {
- - CPrimitiveSetSceneNode *scene_node = static_cast<CPrimitiveSetSceneNode *>(primitive_set_scene);
- + UNI_ASSERT(primitive_set_scene);
- + auto & scene_node = checked_cast<CPrimitiveSetSceneNode &>(*primitive_set_scene);
- if (index < 0
- - || scene_node->DataCopy->primitives_.size() <= size_t(index))
- + || scene_node.DataCopy->primitives_.size() <= size_t(index))
- {
- return false;
- }
- - CPrimitiveRenderNode *requested_primitive = scene_node->DataCopy->primitives_[
- - static_cast<size_t>(index)];
- - primitive_data.Primitive = requested_primitive;
- + const auto & requested_primitive = scene_node.DataCopy->primitives_[static_cast<size_t>(index)];
- + primitive_data.Primitive = requested_primitive.get();
- primitive_data.ColorIndex = &requested_primitive->accessColorIndex();
- return true;
- @@ -182,19 +165,19 @@ bool CPrimitiveSetSceneNode::get_data_copy_primitives(
- bool CPrimitiveSetSceneNode::get_data_copy_const_primitives(
- SPrimitiveConstData &primitive_data,
- - const IMorphAnimatedSceneNode *primitive_set_scene,
- - int index)
- + const IMorphAnimatedSceneNode * const primitive_set_scene,
- + const int index)
- {
- - const CPrimitiveSetSceneNode *scene_node = static_cast<const CPrimitiveSetSceneNode *>(primitive_set_scene);
- + UNI_ASSERT(primitive_set_scene);
- + const auto & scene_node = checked_cast<const CPrimitiveSetSceneNode &>(*primitive_set_scene);
- if (index < 0
- - || scene_node->DataCopy->primitives_.size() <= size_t(index))
- + || scene_node.DataCopy->primitives_.size() <= size_t(index))
- {
- return false;
- }
- - CPrimitiveRenderNode *requested_primitive = scene_node->DataCopy->primitives_[
- - static_cast<size_t>(index)];
- - primitive_data.Primitive = requested_primitive;
- + const auto & requested_primitive = scene_node.DataCopy->primitives_[static_cast<size_t>(index)];
- + primitive_data.Primitive = requested_primitive.get();
- primitive_data.ColorIndex = requested_primitive->getColorIndex();
- return true;
- @@ -213,13 +196,11 @@ CPrimitiveSetSceneNode::CPrimitiveSetSceneNode()
- CPrimitiveSetSceneNode::~CPrimitiveSetSceneNode()
- {
- - for (CPrimitiveRenderNode * primitive : Primitives)
- - {
- - primitive->drop();
- - }
- }
- -void CPrimitiveSetSceneNode::beginSet(SVertexStream * vertices, ISharedBufferCallback *callback)
- +void CPrimitiveSetSceneNode::beginSet(
- + const boost::intrusive_ptr<SVertexStream> & vertices,
- + ISharedBufferCallback * callback)
- {
- deleteDataCopy();
- @@ -228,10 +209,6 @@ void CPrimitiveSetSceneNode::beginSet(SVertexStream * vertices, ISharedBufferCal
- Callback->releaseSharedBuffer(this);
- }
- - for (CPrimitiveRenderNode * primitive : Primitives)
- - {
- - primitive->drop();
- - }
- Primitives.clear();
- SourceVertices = vertices;
- Callback = callback;
- @@ -242,13 +219,16 @@ void CPrimitiveSetSceneNode::beginSet(SVertexStream * vertices, ISharedBufferCal
- }
- }
- -void CPrimitiveSetSceneNode::addPrimitive(const CGraphicsPrimitive & other)
- +void CPrimitiveSetSceneNode::addPrimitive(const boost::intrusive_ptr<CPrimitiveRenderNode> & shared_primitive)
- {
- - CPrimitiveRenderNode *pnode = new CPrimitiveRenderNode(other);
- - pnode->grab();
- + UNI_ASSERT(shared_primitive);
- + shared_primitive->updateVerticesRange(SourceStart, SourceEnd);
- + Primitives.push_back(shared_primitive);
- +}
- - pnode->updateVerticesRange(SourceStart, SourceEnd);
- - Primitives.push_back(pnode);
- +void CPrimitiveSetSceneNode::addPrimitive(const CGraphicsPrimitive & other)
- +{
- + addPrimitive(new CPrimitiveRenderNode(other));
- }
- void CPrimitiveSetSceneNode::addPrimitive(
- @@ -257,11 +237,9 @@ void CPrimitiveSetSceneNode::addPrimitive(
- tm_size_type count,
- unsigned int flags)
- {
- - CPrimitiveRenderNode *pnode = new CPrimitiveRenderNode(type, start, count);
- - pnode->grab();
- + const auto pnode = make_intrusive<CPrimitiveRenderNode>(type, start, count);
- pnode->setFlags(flags);
- - pnode->updateVerticesRange(SourceStart, SourceEnd);
- - Primitives.push_back(pnode);
- + addPrimitive(pnode);
- }
- #ifdef USE_32BIT_INDICES
- @@ -272,11 +250,9 @@ void CPrimitiveSetSceneNode::addPrimitive(
- unsigned int flags,
- bool copy)
- {
- - CPrimitiveRenderNode *pnode = new CPrimitiveRenderNode(type, indices, count, copy);
- - pnode->grab();
- + const auto pnode = make_intrusive<CPrimitiveRenderNode>(type, indices, count, copy);
- pnode->setFlags(flags);
- - pnode->updateVerticesRange(SourceStart, SourceEnd);
- - Primitives.push_back(pnode);
- + addPrimitive(pnode);
- }
- #endif // USE_32BIT_INDICES
- @@ -287,11 +263,9 @@ void CPrimitiveSetSceneNode::addPrimitive(
- unsigned int flags,
- bool copy)
- {
- - CPrimitiveRenderNode *pnode = new CPrimitiveRenderNode(type, indices, count, copy);
- - pnode->grab();
- + const auto pnode = make_intrusive<CPrimitiveRenderNode>(type, indices, count, copy);
- pnode->setFlags(flags);
- - pnode->updateVerticesRange(SourceStart, SourceEnd);
- - Primitives.push_back(pnode);
- + addPrimitive(pnode);
- }
- void CPrimitiveSetSceneNode::endSet()
- @@ -306,9 +280,9 @@ void CPrimitiveSetSceneNode::endSet(const tmmath::rect2x& bound_rect)
- bool CPrimitiveSetSceneNode::getSourcePrimitives(IGraphicsPrimitiveEnumerator * enumerator) const
- {
- // перебираем исходные примитивы
- - for (CPrimitiveRenderNode * primitive : Primitives)
- + for (const auto & primitive : Primitives)
- {
- - if (!enumerator->onNextConstPrimitive(primitive))
- + if (!enumerator->onNextConstPrimitive(primitive.get()))
- {
- return false;
- }
- @@ -319,129 +293,62 @@ bool CPrimitiveSetSceneNode::getSourcePrimitives(IGraphicsPrimitiveEnumerator *
- void CPrimitiveSetSceneNode::overrideLineColorIndex(u32 color_index)
- {
- UNI_ASSERT(color_index <= static_cast<u32>(std::numeric_limits<int>::max()));
- - switch (animation_method_)
- - {
- - case EAM_MANUAL_COPY:
- - {
- - if (DataCopy)
- - {
- - std::vector<CPrimitiveRenderNode *> *primitives = 0;
- - if (DataCopy->use_copy_primitives_)
- - {
- - primitives = &(DataCopy->primitives_);
- - }
- - else
- - {
- - primitives = &Primitives;
- - }
- - for (CPrimitiveRenderNode * pnode : *primitives)
- - {
- - if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
- - {
- - pnode->accessColorIndex() = static_cast<int>(color_index);
- - }
- - }
- - }
- - }
- - break;
- + UNI_ASSERT(animation_method_ == EAM_MANUAL_COPY || animation_method_ == EAM_DIRECT);
- - case EAM_DIRECT:
- + if ((animation_method_ == EAM_MANUAL_COPY && DataCopy)
- + || animation_method_ == EAM_DIRECT)
- + {
- + const auto & primitives =
- + animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
- + ? DataCopy->primitives_
- + : Primitives;
- + for (const auto & pnode : primitives)
- {
- - for (CPrimitiveRenderNode * pnode : Primitives)
- + if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
- + || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
- + || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
- {
- - if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
- - {
- - pnode->accessColorIndex() = static_cast<int>(color_index);
- - }
- + pnode->accessColorIndex() = static_cast<int>(color_index);
- }
- }
- - break;
- -
- - case EAM_NONE:
- - UNI_ASSERT(false);
- }
- }
- void CPrimitiveSetSceneNode::overridePrimitiveVisibility(bool lines_visible, bool area_visible)
- {
- - switch (animation_method_)
- + UNI_ASSERT(animation_method_ == EAM_MANUAL_COPY || animation_method_ == EAM_DIRECT);
- +
- + if ((animation_method_ == EAM_MANUAL_COPY && DataCopy)
- + || animation_method_ == EAM_DIRECT)
- {
- - case EAM_MANUAL_COPY:
- + const auto & primitives =
- + animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
- + ? DataCopy->primitives_
- + : Primitives;
- + for (const auto & pnode : primitives)
- {
- - if (DataCopy)
- + bool visible = true;
- + if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
- + || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
- + || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
- {
- - std::vector<CPrimitiveRenderNode *> *primitives = 0;
- - if (DataCopy->use_copy_primitives_)
- - {
- - primitives = &(DataCopy->primitives_);
- - }
- - else
- - {
- - primitives = &Primitives;
- - }
- - for (CPrimitiveRenderNode * pnode : *primitives)
- - {
- - bool visible = true;
- - if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
- - {
- - visible = lines_visible;
- - }
- - else if ((pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_FAN)
- - || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_STRIP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_LIST))
- - {
- - visible = area_visible;
- - }
- - if (visible)
- - {
- - pnode->setFlags(pnode->getFlags() & static_cast<unsigned>(~tmrender::EPA_DIRECT_ANIMATION_INVISIBLE));
- - }
- - else
- - {
- - pnode->setFlags(pnode->getFlags() | tmrender::EPA_DIRECT_ANIMATION_INVISIBLE);
- - }
- - }
- + visible = lines_visible;
- }
- - }
- - break;
- -
- - case EAM_DIRECT:
- - {
- - for (CPrimitiveRenderNode * pnode : Primitives)
- + else if ((pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_FAN)
- + || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_STRIP)
- + || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_LIST))
- {
- - bool visible = true;
- - if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
- - {
- - visible = lines_visible;
- - }
- - else if ((pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_FAN)
- - || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_STRIP)
- - || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_LIST))
- - {
- - visible = area_visible;
- - }
- - if (visible)
- - {
- - pnode->setFlags(pnode->getFlags() & static_cast<unsigned>(~tmrender::EPA_DIRECT_ANIMATION_INVISIBLE));
- - }
- - else
- - {
- - pnode->setFlags(pnode->getFlags() | tmrender::EPA_DIRECT_ANIMATION_INVISIBLE);
- - }
- + visible = area_visible;
- + }
- + if (visible)
- + {
- + pnode->setFlags(pnode->getFlags() & static_cast<unsigned>(~tmrender::EPA_DIRECT_ANIMATION_INVISIBLE));
- + }
- + else
- + {
- + pnode->setFlags(pnode->getFlags() | tmrender::EPA_DIRECT_ANIMATION_INVISIBLE);
- }
- }
- - break;
- -
- - case EAM_NONE:
- - UNI_ASSERT(false);
- }
- }
- @@ -480,18 +387,12 @@ bool CPrimitiveSetSceneNode::getPrimitives(IScenePrimitiveEnumerator * enumerato
- {
- if (enumerator)
- {
- - const std::vector<CPrimitiveRenderNode *> *primitives = &Primitives;
- - if (animation_method_ == EAM_MANUAL_COPY)
- + const auto & primitives = animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
- + ? DataCopy->primitives_
- + : Primitives;
- + for (const auto & primitive : primitives)
- {
- - if (DataCopy && DataCopy->use_copy_primitives_)
- - {
- - primitives = &(DataCopy->primitives_);
- - }
- - }
- -
- - for (CPrimitiveRenderNode * primitive : *primitives)
- - {
- - if (!enumerator->onNextConstPrimitive(primitive))
- + if (!enumerator->onNextConstPrimitive(primitive.get()))
- {
- return false;
- }
- @@ -505,8 +406,8 @@ bool CPrimitiveSetSceneNode::testIntersection(IIdentifyProcessor& identify_proce
- {
- if (animator())
- {
- - const IMorphAnimator *morph_animator = checked_cast<const IMorphAnimator *>(animator());
- - return morph_animator->testIntersection(this, this, identify_processor);
- + const auto & morph_animator = checked_cast<const IMorphAnimator &>(*animator());
- + return morph_animator.testIntersection(this, this, identify_processor);
- }
- else
- {
- @@ -522,42 +423,30 @@ void CPrimitiveSetSceneNode::applySceneLinker(const ISceneLinkerPtr &linker) con
- return;
- }
- - CPrimitiveRenderNode *const*pdata = Primitives.empty() ? 0 : &Primitives[0];
- - CPrimitiveRenderNode *const*pend = pdata + Primitives.size();
- -
- - if (animation_method_ == EAM_MANUAL_COPY)
- + if (animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->render_node_)
- {
- - if (DataCopy)
- - {
- - if (DataCopy->render_node_)
- - {
- - linker->addVertices(DataCopy->render_node_->getVertices());
- - }
- - if (DataCopy->use_copy_primitives_)
- - {
- - pdata = DataCopy->primitives_.empty() ? 0 : &DataCopy->primitives_[0];
- - pend = pdata + DataCopy->primitives_.size();
- - }
- - }
- + linker->addVertices(DataCopy->render_node_->getVertices());
- }
- - while (pdata != pend)
- +
- + const auto & primitives = animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
- + ? DataCopy->primitives_
- + : Primitives;
- + for (const auto & primitive : primitives)
- {
- - if (0 == ((*pdata)->getFlags() & EPA_DIRECT_ANIMATION_INVISIBLE))
- + if (0 == (primitive->getFlags() & EPA_DIRECT_ANIMATION_INVISIBLE))
- {
- - linker->addPrimitive(**pdata);
- + linker->addPrimitive(*primitive);
- }
- - ++pdata;
- }
- UNI_ASSERT(getFirstChild() == NULL);
- }
- void CPrimitiveSetSceneNode::clearExternalResources()
- {
- - for (size_t i = 0; i < Primitives.size(); ++i)
- + for (const auto & primitive : Primitives)
- {
- - Primitives[i]->clearExternalResources();
- + primitive->clearExternalResources();
- }
- -
- UNI_ASSERT(!DataCopy);
- ISceneNode::clearExternalResources();
- @@ -576,8 +465,6 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
- bool two_stage_rendering = (context.AreaVertexRoot || context.LineVertexRoot);
- CPrimitiveRenderNodeList *primitives_root = context.PrimitiveRoot;
- - CPrimitiveRenderNode **pdata = Primitives.empty() ? 0 : &Primitives[0];
- - CPrimitiveRenderNode **pend = pdata + Primitives.size();
- // если двухпроходный рендеринг, то мы обяЕаны иметь DataCopy
- UNI_ASSERT(!two_stage_rendering
- @@ -596,7 +483,7 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
- DataCopy->area_primitives_.reserve(DataCopy->primitives_.size());
- DataCopy->line_primitives_.reserve(DataCopy->primitives_.size());
- - for (CPrimitiveRenderNode *primitive: DataCopy->primitives_)
- + for (const auto & primitive : DataCopy->primitives_)
- {
- std::vector<index16_t> area_primitive_indices;
- std::vector<index16_t> line_primitive_indices;
- @@ -610,11 +497,10 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
- if (!(EPA_POLYGONAL_LINE & primitive->getFlags()))
- {
- DataCopy->area_primitives_.push_back(primitive);
- - DataCopy->area_primitives_.back()->grab();
- continue;
- }
- - for (SPrimitiveTriangle curr_triangle: primitive->getTriangles())
- + for (const SPrimitiveTriangle & curr_triangle: primitive->getTriangles())
- {
- if (vertex_stream->atDistanceRaw(curr_triangle.Index0 + 2)[0])
- {
- @@ -642,7 +528,6 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
- area_primitive_indices.data(),
- static_cast<tm_size_type>(area_primitive_indices.size()),
- true));
- - DataCopy->area_primitives_.back()->grab();
- DataCopy->area_primitives_.back()->setFlags(primitive->getFlags());
- DataCopy->area_primitives_.back()->setColorIndex(primitive->getColorIndex());
- }
- @@ -654,7 +539,6 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
- line_primitive_indices.data(),
- static_cast<tm_size_type>(line_primitive_indices.size()),
- true));
- - DataCopy->line_primitives_.back()->grab();
- DataCopy->line_primitives_.back()->setFlags(primitive->getFlags());
- DataCopy->line_primitives_.back()->setColorIndex(primitive->getColorIndex());
- }
- @@ -666,12 +550,6 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
- {
- if (DataCopy)
- {
- - if (DataCopy->use_copy_primitives_)
- - {
- - pdata = DataCopy->primitives_.empty() ? 0 : &DataCopy->primitives_[0];
- - pend = pdata + DataCopy->primitives_.size();
- - }
- -
- if (DataCopy->render_node_ && two_stage_rendering)
- {
- UNI_ASSERT(DataCopy->render_node_->getVertices());
- @@ -707,39 +585,41 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
- return;
- }
- DataCopy->render_node_->clearChilds();
- - context.VertexRoot->addNode(DataCopy->render_node_);
- + context.VertexRoot->addNode(DataCopy->render_node_.get());
- - primitives_root = DataCopy->render_node_;
- + primitives_root = DataCopy->render_node_.get();
- }
- }
- }
- if (primitives_root && !two_stage_rendering)
- {
- - while (pdata != pend)
- + const auto & primitives = animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
- + ? DataCopy->primitives_
- + : Primitives;
- + for (const auto & primitive : primitives)
- {
- - if (0 == ((*pdata)->getFlags() & EPA_DIRECT_ANIMATION_INVISIBLE))
- + if (0 == (primitive->getFlags() & EPA_DIRECT_ANIMATION_INVISIBLE))
- {
- - primitives_root->addNode(*pdata);
- + primitives_root->addNode(primitive.get());
- }
- - ++pdata;
- }
- }
- else if (two_stage_rendering)
- {
- if (context.AreaVertexRoot)
- {
- - for (CPrimitiveRenderNode *render_node: DataCopy->area_primitives_)
- + for (const auto & render_node : DataCopy->area_primitives_)
- {
- - DataCopy->area_render_node_->addNode(render_node);
- + DataCopy->area_render_node_->addNode(render_node.get());
- }
- }
- if (context.LineVertexRoot)
- {
- - for (CPrimitiveRenderNode *render_node: DataCopy->line_primitives_)
- + for (const auto & render_node : DataCopy->line_primitives_)
- {
- - DataCopy->line_render_node_->addNode(render_node);
- + DataCopy->line_render_node_->addNode(render_node.get());
- }
- }
- }
- @@ -757,11 +637,12 @@ bool CPrimitiveSetSceneNode::createDataCopy(EAnimationMethod method)
- case EAM_MANUAL_COPY:
- animation_method_ = method;
- - DataCopy = std::make_shared<SDataCopy>(this);
- + DataCopy = std::make_shared<SDataCopy>(*this);
- return true;
- case EAM_NONE:
- - return false;
- + default:
- + UNI_ASSERT(false);
- }
- return false;
- }
- @@ -879,22 +760,17 @@ void CPrimitiveSetSceneNode::setDataCopyVertices(const boost::intrusive_ptr<SVer
- // СоЕдадим вертексную рендер-ноду.
- DataCopy->render_node_ = new tme::tmrender::CVertexRenderNode(vertices.get());
- - DataCopy->render_node_->grab();
- }
- notifyNodeChanged();
- }
- -void CPrimitiveSetSceneNode::setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node)
- +void CPrimitiveSetSceneNode::setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node)
- {
- UNI_ASSERT(animation_method_ == EAM_MANUAL_COPY);
- UNI_ASSERT(DataCopy);
- - if (DataCopy->render_node_)
- - {
- - DataCopy->render_node_->drop();
- - }
- - else if (Callback)
- + if (!DataCopy->render_node_ && Callback)
- {
- // Удаляем ссылку на старый вершинный буфер
- Callback->releaseSharedBuffer(this);
- @@ -902,7 +778,6 @@ void CPrimitiveSetSceneNode::setDataCopyVertexRenderNode(IVertexRenderNode * ver
- // Установим вертексную рендер-ноду.
- DataCopy->render_node_ = vertex_render_node;
- - DataCopy->render_node_->grab();
- notifyNodeChanged();
- }
- @@ -916,7 +791,7 @@ SVertexStream * CPrimitiveSetSceneNode::getDataCopyVertices()
- {
- return DataCopy->render_node_->getVertices();
- }
- - return 0;
- + return nullptr;
- }
- const SVertexStream * CPrimitiveSetSceneNode::getDataCopyConstVertices() const
- @@ -931,9 +806,9 @@ IVertexRenderNode * CPrimitiveSetSceneNode::getDataCopyVertexRenderNode()
- if (DataCopy->render_node_)
- {
- - return DataCopy->render_node_;
- + return DataCopy->render_node_.get();
- }
- - return 0;
- + return nullptr;
- }
- void CPrimitiveSetSceneNode::setDataCopyCulling(ERenderFaceCulling culling)
- @@ -968,9 +843,9 @@ void CPrimitiveSetSceneNode::appendSharedDataCopyVertices(const boost::intrusive
- bool CPrimitiveSetSceneNode::accessSourcePrimitives(IMorphSourcePrimitiveEnumerator &enumerator)
- {
- - for (CPrimitiveRenderNode * pnode : Primitives)
- + for (const auto & pnode : Primitives)
- {
- - if (!enumerator.onNextPrimitive(pnode, pnode->accessColorIndex()))
- + if (!enumerator.onNextPrimitive(pnode.get(), pnode->accessColorIndex()))
- {
- return false;
- }
- @@ -986,9 +861,9 @@ bool CPrimitiveSetSceneNode::accessDataCopyPrimitives(IMorphSourcePrimitiveEnume
- notifyNodeChanged();
- - for (CPrimitiveRenderNode * pnode : DataCopy->primitives_)
- + for (const auto & pnode : DataCopy->primitives_)
- {
- - if (!enumerator.onNextPrimitive(pnode, pnode->accessColorIndex()))
- + if (!enumerator.onNextPrimitive(pnode.get(), pnode->accessColorIndex()))
- {
- return false;
- }
- @@ -1002,27 +877,13 @@ void CPrimitiveSetSceneNode::setDataCopyPrimitives(IMorphPrimitiveProvider &enum
- UNI_ASSERT(animation_method_ == EAM_MANUAL_COPY);
- UNI_ASSERT(DataCopy);
- - CPrimitiveRenderNode * primitive_node = NULL;
- -
- if (DataCopy->render_node_)
- {
- DataCopy->render_node_->clearChilds();
- }
- - for (tmrender::CPrimitiveRenderNode *primitive : DataCopy->primitives_)
- - {
- - primitive->drop();
- - }
- DataCopy->primitives_.clear();
- - for (tmrender::CPrimitiveRenderNode *primitive : DataCopy->area_primitives_)
- - {
- - primitive->drop();
- - }
- DataCopy->area_primitives_.clear();
- DataCopy->area_render_node_.reset();
- - for (tmrender::CPrimitiveRenderNode *primitive : DataCopy->line_primitives_)
- - {
- - primitive->drop();
- - }
- DataCopy->line_primitives_.clear();
- DataCopy->line_render_node_.reset();
- DataCopy->use_copy_primitives_ = true;
- @@ -1034,6 +895,7 @@ void CPrimitiveSetSceneNode::setDataCopyPrimitives(IMorphPrimitiveProvider &enum
- DataCopy->primitives_.reserve(estimated_primitive_count);
- }
- + CPrimitiveRenderNode * primitive_node = nullptr;
- while (enumerator.setNextPrimitive(primitive_node))
- {
- if (!primitive_node)
- @@ -1047,9 +909,8 @@ void CPrimitiveSetSceneNode::setDataCopyPrimitives(IMorphPrimitiveProvider &enum
- }
- DataCopy->primitives_.push_back(primitive_node);
- - primitive_node->grab();
- - primitive_node = NULL;
- + primitive_node = nullptr;
- }
- notifyNodeChanged();
- @@ -1068,22 +929,13 @@ void CPrimitiveSetSceneNode::resetVerticesRange()
- void CPrimitiveSetSceneNode::enumerateEnumerateAllPrimitives(const PrimitivesEnumerator &enumerator)const
- {
- - if (animation_method_ == EAM_MANUAL_COPY)
- - {
- - if (DataCopy && DataCopy->use_copy_primitives_)
- - {
- - for (CPrimitiveRenderNode * primitive : DataCopy->primitives_)
- - {
- - enumerator(primitive);
- - }
- - return;
- - }
- - }
- -
- + const auto & primitives = animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
- + ? DataCopy->primitives_
- + : Primitives;
- // перебираем исходные примитивы
- - for (CPrimitiveRenderNode * primitive : Primitives)
- + for (const auto & primitive : primitives)
- {
- - enumerator(primitive);
- + enumerator(primitive.get());
- }
- }
- --
- 1.9.5.msysgit.1
- From befb46da746f210251ac338b3b80e62839212122 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:38:44 +0600
- Subject: [PATCH 05/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
- =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=83=D0=B7=D0=B5=D0=BB=20=D1=81?=
- =?UTF-8?q?=D1=86=D0=B5=D0=BD=D1=8B=20=D1=81=20=D1=80=D0=B0=D0=B7=D0=B4?=
- =?UTF-8?q?=D0=B5=D0=BB=D1=8F=D0=B5=D0=BC=D1=8B=D0=BC=D0=B8=20=D0=B4=D0=B0?=
- =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/tmRender/Fwd.h | 2 +
- Projects/tmRender/SharedVertexSceneNode.h | 87 ++++++++++
- Projects/tmRender/src/SharedVertexSceneNode.cpp | 221 ++++++++++++++++++++++++
- Projects/tmRender/tmRender.gyp | 2 +
- 4 files changed, 312 insertions(+)
- create mode 100644 Projects/tmRender/SharedVertexSceneNode.h
- create mode 100644 Projects/tmRender/src/SharedVertexSceneNode.cpp
- diff --git a/Projects/tmRender/Fwd.h b/Projects/tmRender/Fwd.h
- index 0824202..98d628f 100644
- --- a/Projects/tmRender/Fwd.h
- +++ b/Projects/tmRender/Fwd.h
- @@ -63,6 +63,8 @@ class ISceneConstruction;
- class ISceneNode;
- typedef boost::intrusive_ptr<ISceneNode> SceneNodePtr;
- +struct SharedVertexData;
- +
- class IAnimatedSceneNode;
- class ISkinAnimator;
- class ISkinAnimatedSceneNode;
- diff --git a/Projects/tmRender/SharedVertexSceneNode.h b/Projects/tmRender/SharedVertexSceneNode.h
- new file mode 100644
- index 0000000..36b9b31
- --- /dev/null
- +++ b/Projects/tmRender/SharedVertexSceneNode.h
- @@ -0,0 +1,87 @@
- +#pragma once
- +
- +#include <tmRender/LocalBoundRectSceneNode.h>
- +#include <tmRender/IMorphAnimatedSceneNode.h>
- +
- +namespace tme
- +{
- +namespace tmrender
- +{
- +
- +struct SharedVertexData final : public RefCountedSingleThread
- +{
- + boost::intrusive_ptr<SVertexStream> vertices;
- + std::vector<CGraphicsPrimitive> primitives;
- +
- + //! Некий void* с данными, полученными после морфирования вершин и примитивов.
- + boost::intrusive_ptr<RefCountedSingleThread> morph_result;
- +
- + SharedVertexData() = default;
- +
- + //! Копировать большое количество данных - дорого.
- + SharedVertexData(const SharedVertexData &) = delete;
- + SharedVertexData & operator =(const SharedVertexData &) = delete;
- +};
- +
- +class SharedVertexSceneNode final
- + : public LocalBoundRectSceneNode
- + , public IMorphAnimatedSceneNode
- +{
- +public:
- + explicit SharedVertexSceneNode(const boost::intrusive_ptr<SharedVertexData> & shared_data);
- +
- + bool morphResultCreated() const;
- + boost::intrusive_ptr<RefCountedSingleThread> getMorphResult() const;
- + void setMorphResult(const boost::intrusive_ptr<RefCountedSingleThread> & morph_result);
- +
- + void setRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & render_node);
- +
- + const SVertexStream & getSharedVertices() const;
- + const std::vector<CGraphicsPrimitive> & getSharedPrimitives() const;
- +
- +public: // ISceneNode
- + virtual ESceneNodeClass getNodeClass() const override;
- + virtual IAnimatedSceneNode * getAnimationInterface() override;
- + virtual void constructRenderTree(RenderContext & context) override;
- +
- +protected: // LocalBoundRectSceneNode
- + virtual tmmath::rect2x calculateCurrentNodeLocal2dBoundRect() const override;
- +
- +public: // IMorphAnimatedSceneNode
- + virtual ISceneNode * getSceneNodeInterface() override;
- +
- + virtual const SVertexStream * accessPrecalculatedDataCopyVertices() override;
- + virtual const PrimitiveCollection & accessPrecalculatedDataCopyPrimitives() const override;
- + virtual LoaderAnimationType getPrecalculatedDataCopyType() const override;
- + virtual const SVertexStream * accessSourceVertices() const override;
- + virtual IndexRange getUsedVertexRange() const override;
- + virtual bool accessSourcePrimitives(IMorphSourcePrimitiveEnumerator & enumerator) override;
- + virtual bool accessDataCopyPrimitives(IMorphSourcePrimitiveEnumerator & enumerator) override;
- + virtual void setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> & vertices) override;
- + virtual SVertexStream * getDataCopyVertices() override;
- + virtual const SVertexStream * getDataCopyConstVertices() const override;
- + virtual IVertexRenderNode * getDataCopyVertexRenderNode() override;
- + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node) override;
- + virtual void setDataCopyCulling(ERenderFaceCulling culling) override;
- + virtual void setDataCopyDepthTest(ERenderDepthTestMode depthmode, ERenderDepthTestFunc depthfunc) override;
- + virtual tmrender::index16_t getSharedIndexOffset() override;
- + virtual void appendSharedDataCopyVertices(const boost::intrusive_ptr<SVertexStream> & vertices) override;
- + virtual void verticesChanged() override;
- + virtual void boundRectChanged() override;
- + virtual void setDataCopyPrimitives(IMorphPrimitiveProvider & enumerator) override;
- + virtual std::vector<MorphingParameter> getParams() const override;
- +
- +protected: // IMorphAnimatedSceneNode
- + virtual CMorphPrimitiveContainer::const_iterator::TDataGetter getSourcePrimtiveGetter() override;
- + virtual CMorphPrimitiveConstContainer::const_iterator::TDataGetter getSourcePrimtiveConstGetter() const override;
- + virtual CMorphPrimitiveContainer::const_iterator::TDataGetter getDataCopyPrimtiveGetter() override;
- + virtual CMorphPrimitiveConstContainer::const_iterator::TDataGetter getDataCopyPrimtiveConstGetter() const override;
- +
- +private:
- + const boost::intrusive_ptr<SharedVertexData> shared_data_;
- + boost::intrusive_ptr<IVertexRenderNode> render_node_;
- + const tmmath::rect2x bounding_rect_;
- +};
- +
- +} // namespace tmrender
- +} // namespace tme
- diff --git a/Projects/tmRender/src/SharedVertexSceneNode.cpp b/Projects/tmRender/src/SharedVertexSceneNode.cpp
- new file mode 100644
- index 0000000..c889ef5
- --- /dev/null
- +++ b/Projects/tmRender/src/SharedVertexSceneNode.cpp
- @@ -0,0 +1,221 @@
- +#include "stdafx.h"
- +
- +#include <tmRender/SharedVertexSceneNode.h>
- +
- +#include <tmRender/VertexStream.inl>
- +
- +namespace tme
- +{
- +namespace tmrender
- +{
- +
- +namespace
- +{
- +
- +tmmath::rect2x calculate_bounding_rect(const SVertexStream & vertices)
- +{
- + tmmath::rect2x result;
- + result.startInternalPointAdd();
- + for (tm_size_type i = 0; i < vertices.Count; ++i)
- + {
- + result.addInternalPoint(vertices.at2d(i));
- + }
- + return result;
- +}
- +
- +} // namespace
- +
- +SharedVertexSceneNode::SharedVertexSceneNode(const boost::intrusive_ptr<SharedVertexData> & shared_data)
- + : shared_data_(shared_data)
- + , bounding_rect_(calculate_bounding_rect(*shared_data_->vertices))
- +{
- + UNI_ASSERT(shared_data_);
- + UNI_ASSERT(shared_data_->vertices);
- + UNI_ASSERT(!shared_data_->primitives.empty());
- +}
- +
- +bool SharedVertexSceneNode::morphResultCreated() const
- +{
- + return static_cast<bool>(shared_data_->morph_result);
- +}
- +
- +boost::intrusive_ptr<RefCountedSingleThread> SharedVertexSceneNode::getMorphResult() const
- +{
- + UNI_ASSERT(morphResultCreated());
- + return shared_data_->morph_result;
- +}
- +
- +void SharedVertexSceneNode::setMorphResult(const boost::intrusive_ptr<RefCountedSingleThread> & morph_result)
- +{
- + UNI_ASSERT(!morphResultCreated());
- + shared_data_->morph_result = morph_result;
- +}
- +
- +void SharedVertexSceneNode::setRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & render_node)
- +{
- + UNI_ASSERT(render_node);
- + UNI_ASSERT(!render_node_);
- + render_node_ = render_node;
- +}
- +
- +const SVertexStream & SharedVertexSceneNode::getSharedVertices() const
- +{
- + return *shared_data_->vertices;
- +}
- +
- +const std::vector<CGraphicsPrimitive> & SharedVertexSceneNode::getSharedPrimitives() const
- +{
- + return shared_data_->primitives;
- +}
- +
- +ESceneNodeClass SharedVertexSceneNode::getNodeClass() const
- +{
- + return static_cast<ESceneNodeClass>(ESNC_LOCAL_BOUND_RECT | ESNC_MORPHING);
- +}
- +
- +IAnimatedSceneNode * SharedVertexSceneNode::getAnimationInterface()
- +{
- + return this;
- +}
- +
- +void SharedVertexSceneNode::constructRenderTree(RenderContext & context)
- +{
- + if (!renderDisabled())
- + {
- + UNI_ASSERT(render_node_);
- + context.VertexRoot->addNode(render_node_.get());
- + }
- +}
- +
- +tmmath::rect2x SharedVertexSceneNode::calculateCurrentNodeLocal2dBoundRect() const
- +{
- + return bounding_rect_;
- +}
- +
- +ISceneNode * SharedVertexSceneNode::getSceneNodeInterface()
- +{
- + return this;
- +}
- +
- +const SVertexStream * SharedVertexSceneNode::accessPrecalculatedDataCopyVertices()
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +const PrimitiveCollection & SharedVertexSceneNode::accessPrecalculatedDataCopyPrimitives() const
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +LoaderAnimationType SharedVertexSceneNode::getPrecalculatedDataCopyType() const
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +const SVertexStream * SharedVertexSceneNode::accessSourceVertices() const
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +IndexRange SharedVertexSceneNode::getUsedVertexRange() const
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +bool SharedVertexSceneNode::accessSourcePrimitives(IMorphSourcePrimitiveEnumerator &)
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +bool SharedVertexSceneNode::accessDataCopyPrimitives(IMorphSourcePrimitiveEnumerator &)
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +void SharedVertexSceneNode::setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &)
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +SVertexStream * SharedVertexSceneNode::getDataCopyVertices()
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +const SVertexStream * SharedVertexSceneNode::getDataCopyConstVertices() const
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +IVertexRenderNode * SharedVertexSceneNode::getDataCopyVertexRenderNode()
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +void SharedVertexSceneNode::setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> &)
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +void SharedVertexSceneNode::setDataCopyCulling(ERenderFaceCulling)
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +void SharedVertexSceneNode::setDataCopyDepthTest(ERenderDepthTestMode, ERenderDepthTestFunc)
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +index16_t SharedVertexSceneNode::getSharedIndexOffset()
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +void SharedVertexSceneNode::appendSharedDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &)
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +void SharedVertexSceneNode::verticesChanged()
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +void SharedVertexSceneNode::boundRectChanged()
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +void SharedVertexSceneNode::setDataCopyPrimitives(IMorphPrimitiveProvider &)
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +std::vector<IMorphAnimatedSceneNode::MorphingParameter> SharedVertexSceneNode::getParams() const
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +CMorphPrimitiveContainer::const_iterator::TDataGetter SharedVertexSceneNode::getSourcePrimtiveGetter()
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +CMorphPrimitiveConstContainer::const_iterator::TDataGetter SharedVertexSceneNode::getSourcePrimtiveConstGetter() const
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +CMorphPrimitiveContainer::const_iterator::TDataGetter SharedVertexSceneNode::getDataCopyPrimtiveGetter()
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +CMorphPrimitiveConstContainer::const_iterator::TDataGetter SharedVertexSceneNode::getDataCopyPrimtiveConstGetter() const
- +{
- + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
- +}
- +
- +} // namespace tmrender
- +} // namespace tme
- diff --git a/Projects/tmRender/tmRender.gyp b/Projects/tmRender/tmRender.gyp
- index 6386931..2496209 100644
- --- a/Projects/tmRender/tmRender.gyp
- +++ b/Projects/tmRender/tmRender.gyp
- @@ -246,6 +246,7 @@
- 'SceneManagement/PluginDynamicSublayer.h',
- 'SceneManagement/Types.h',
- 'SDataCopy.h',
- + 'SharedVertexSceneNode.h',
- 'SharedStream.h',
- 'SInputGeometry.h',
- 'SkinAnimatorWrapper.h',
- @@ -624,6 +625,7 @@
- 'src/SceneManagement/SublayerSceneNode.h',
- 'src/stdafx.cpp',
- 'src/stdafx.h',
- + 'src/SharedVertexSceneNode.cpp',
- 'src/SurfaceUtilities.cpp',
- 'src/TransformContext.cpp',
- 'SurfaceStream.h',
- --
- 1.9.5.msysgit.1
- From 53c1ade4b86bae881affb7d6114a57ecc7a1d380 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:37:23 +0600
- Subject: [PATCH 06/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
- =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B4=D0=B8=D0=BD=D0=B0=D0=BC=D0=B8?=
- =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9=20=D0=BE=D0=B1=D1=8A=D0=B5?=
- =?UTF-8?q?=D0=BA=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B1?=
- =?UTF-8?q?=D0=BE=D0=BA?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Carto/Carto.gyp | 4 ++
- .../TrafficLineDynamicObjectFactory.h | 11 ++++
- .../DynamicObjects/TrafficLineDynamicObject.cpp | 76 ++++++++++++++++++++++
- .../DynamicObjects/TrafficLineDynamicObject.h | 37 +++++++++++
- .../TrafficLineDynamicObjectFactory.cpp | 14 ++++
- 5 files changed, 142 insertions(+)
- create mode 100644 Projects/Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h
- create mode 100644 Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp
- create mode 100644 Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.h
- create mode 100644 Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp
- diff --git a/Projects/Carto/Carto.gyp b/Projects/Carto/Carto.gyp
- index 251489c..f5d1c55 100644
- --- a/Projects/Carto/Carto.gyp
- +++ b/Projects/Carto/Carto.gyp
- @@ -28,6 +28,7 @@
- 'Carto/DynamicObjects/GradientColoredLineDynamicObject.h',
- 'Carto/DynamicObjects/MultipointDynamicObject.h',
- 'Carto/DynamicObjects/TextDynamicObject.h',
- + 'Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h',
- 'Carto/Geometry.h',
- 'Carto/ICarto.h',
- 'Carto/IDynamicLayer.h',
- @@ -177,12 +178,15 @@
- 'src/Carto/DynamicObjectPrivate.h',
- 'src/Carto/DynamicObjectProxy.cpp',
- 'src/Carto/DynamicObjectProxy.h',
- + 'src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp',
- 'src/Carto/DynamicObjects/CircleDynamicObject.cpp',
- 'src/Carto/DynamicObjects/DirectionalDynamicObject.cpp',
- 'src/Carto/DynamicObjects/EntranceArrowDynamicObject.cpp',
- 'src/Carto/DynamicObjects/GradientColoredLineDynamicObject.cpp',
- 'src/Carto/DynamicObjects/MultipointDynamicObject.cpp',
- 'src/Carto/DynamicObjects/TextDynamicObject.cpp',
- + 'src/Carto/DynamicObjects/TrafficLineDynamicObject.h',
- + 'src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp',
- 'src/Carto/DynamicObjectView.cpp',
- 'src/Carto/DynamicObjectView.h',
- 'src/Carto/EmptyLayerObjectEnumerator.h',
- diff --git a/Projects/Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h b/Projects/Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h
- new file mode 100644
- index 0000000..8751fee
- --- /dev/null
- +++ b/Projects/Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h
- @@ -0,0 +1,11 @@
- +#pragma once
- +
- +#include <Carto/Carto/Fwd.h>
- +#include <Carto/Carto/TMRenderForwarding.h>
- +
- +namespace Carto
- +{
- +
- +IDynamicObjectPtr create_traffic_line_dynamic_object(ObjectId id, const IGeometryConstPtr & geometry);
- +
- +} // namespace Carto
- diff --git a/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp
- new file mode 100644
- index 0000000..1e0bdad
- --- /dev/null
- +++ b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp
- @@ -0,0 +1,76 @@
- +#include "stable.h"
- +
- +#include "TrafficLineDynamicObject.h"
- +
- +#include <tmCore/checked_cast.h>
- +#include <tmCore/make_intrusive.h>
- +#include <tmRender/CVertexSceneNode.h>
- +#include <tmRender/CPrimitiveSetSceneNode.h>
- +#include <tmRender/SharedVertexSceneNode.h>
- +#include <tmRender/VertexStream.inl>
- +
- +#include <Carto/Carto/MultiPolylineGeometry.h>
- +
- +namespace Carto
- +{
- +
- +TrafficLineDynamicObject::TrafficLineDynamicObject(
- + const ObjectId in_id,
- + const IGeometryConstPtr & in_geometry)
- + : IDynamicObject(in_id)
- + , DynamicObjectPrivate(in_id, in_geometry, 0)
- +{
- + if (!tme::check_type<const MultiPolylineGeometry &>(*in_geometry))
- + {
- + // Оптимальная работа будет только с MultiPolylineGeometry.
- + UNILOG_WARNING << "TrafficLine geometry is not MultiPolylineGeometry";
- + }
- +}
- +
- +TrafficLineDynamicObject::~TrafficLineDynamicObject()
- +{
- +}
- +
- +IDynamicObjectPrivate & TrafficLineDynamicObject::private_interface()
- +{
- + return *this;
- +}
- +
- +ISceneNodePtr TrafficLineDynamicObject::node(
- + const IViewport & viewport,
- + const ProjectId project_id,
- + const SublayerIndex sublayer_index) const
- +{
- + if (!shared_data_)
- + {
- + shared_data_ = tme::make_intrusive<tme::tmrender::SharedVertexData>();
- +
- + //! На данный момент не умеем соЕдавать иЕ IGeometry сраЕу венршины и примитивы. СоЕдается ветка сцены с этими данными.
- + //! Поэтому вытаскиваем иЕ сцены данные, а уЕлы удаляем.
- + //! \todo переделать беЕ соЕдания ветки сцены.
- + const auto scene_node_with_data = DynamicObjectPrivate::node(viewport, project_id, sublayer_index);
- + UNI_ASSERT(scene_node_with_data);
- + auto & vertex_node =
- + tme::checked_cast<tme::tmrender::CVertexSceneNode &>(*scene_node_with_data);
- +
- + // Структура сцены должна быть такой:
- + UNI_ASSERT(vertex_node.getFirstChild());
- + UNI_ASSERT(!vertex_node.getNextSibling());
- + UNI_ASSERT(!vertex_node.getFirstChild()->getNextSibling());
- + UNI_ASSERT(!vertex_node.getFirstChild()->getFirstChild());
- +
- + auto & primitives_node =
- + tme::checked_cast<tme::tmrender::CPrimitiveSetSceneNode &>(*vertex_node.getFirstChild());
- +
- + shared_data_->vertices = const_cast<tme::tmrender::SVertexStream *>(vertex_node.getVertices());
- +
- + for (auto & primitive : primitives_node.accessSourcePrimitivesEx())
- + {
- + shared_data_->primitives.emplace_back(std::move(*primitive.Primitive));
- + }
- + }
- +
- + return tme::make_intrusive<tme::tmrender::SharedVertexSceneNode>(shared_data_);
- +}
- +
- +} // namespace Carto
- diff --git a/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.h b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.h
- new file mode 100644
- index 0000000..c5658c0
- --- /dev/null
- +++ b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.h
- @@ -0,0 +1,37 @@
- +#pragma once
- +
- +#include <tmRender/Fwd.h>
- +
- +#include <Carto/Carto/Fwd.h>
- +#include <Carto/Carto/IDynamicObject.h>
- +#include "../DynamicObjectPrivate.h"
- +
- +namespace Carto
- +{
- +
- +class TrafficLineDynamicObject final
- + : public IDynamicObject
- + , public DynamicObjectPrivate
- +{
- +public:
- + TrafficLineDynamicObject(
- + ObjectId in_id,
- + const IGeometryConstPtr & in_geometry);
- + virtual ~TrafficLineDynamicObject() override;
- +
- +public: // IDynamicObject
- + virtual IDynamicObjectPrivate & private_interface() override;
- +
- +public: // DynamicObjectPrivate
- + virtual ISceneNodePtr node(
- + const IViewport & viewport,
- + ProjectId project_id,
- + SublayerIndex sublayer_index) const override;
- +
- +private:
- + // Данные испольЕуемые всеми уЕлами сцены этого объекта.
- + // СоЕдаются при первом получении уЕла сцены.
- + mutable boost::intrusive_ptr<tme::tmrender::SharedVertexData> shared_data_;
- +};
- +
- +} // namespace Carto
- diff --git a/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp
- new file mode 100644
- index 0000000..6dd7b16
- --- /dev/null
- +++ b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp
- @@ -0,0 +1,14 @@
- +#include "stable.h"
- +
- +#include <Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h>
- +#include "TrafficLineDynamicObject.h"
- +
- +namespace Carto
- +{
- +
- +IDynamicObjectPtr create_traffic_line_dynamic_object(ObjectId id, const IGeometryConstPtr & geometry)
- +{
- + return std::make_shared<TrafficLineDynamicObject>(id, geometry);
- +}
- +
- +} // namespace Carto
- --
- 1.9.5.msysgit.1
- From 601c58482d14a1568e7b24fa6fa884ec82c76da6 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:39:32 +0600
- Subject: [PATCH 07/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
- =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=202=20=D1=84=D1=83=D0=BD=D0=BA?=
- =?UTF-8?q?=D1=86=D0=B8=D0=B8-=D0=BE=D0=B1=D0=B5=D1=80=D1=82=D0=BA=D0=B8?=
- =?UTF-8?q?=20=D0=B2=20=D1=8D=D0=BD=D1=83=D0=BC=D0=B5=D1=80=D0=B0=D1=82?=
- =?UTF-8?q?=D0=BE=D1=80=20=D0=BB=D0=B8=D0=BD=D0=B8=D0=B9=20=D1=81=20=D0=BA?=
- =?UTF-8?q?=D1=80=D1=83=D0=B6=D0=BE=D1=87=D0=BA=D0=B0=D0=BC=D0=B8.=20?=
- =?UTF-8?q?=D0=98=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8?=
- =?UTF-8?q?=D0=BD=D0=B3.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- .../Loading/Animators/LineWithCirclesEnumerator.h | 12 +++
- .../Animators/LineWithCirclesEnumerator.cpp | 112 +++++++++++++--------
- 2 files changed, 84 insertions(+), 40 deletions(-)
- diff --git a/Projects/tmRender/Loading/Animators/LineWithCirclesEnumerator.h b/Projects/tmRender/Loading/Animators/LineWithCirclesEnumerator.h
- index 1a9ffce..1da2de4 100644
- --- a/Projects/tmRender/Loading/Animators/LineWithCirclesEnumerator.h
- +++ b/Projects/tmRender/Loading/Animators/LineWithCirclesEnumerator.h
- @@ -31,7 +31,13 @@ public:
- const std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> & source_primitives);
- void process_primitives(
- const SVertexStream & source,
- + const std::vector<const CGraphicsPrimitive *> & source_primitives);
- + void process_primitives(
- + const SVertexStream & source,
- const std::vector<CGraphicsPrimitive *> & source_primitives);
- + void process_primitives(
- + const SVertexStream & source,
- + const std::vector<CGraphicsPrimitive> & source_primitives);
- void process_primitive(
- const SVertexStream & source,
- const CGraphicsPrimitive & source_primitive);
- @@ -46,6 +52,12 @@ public:
- private:
- void allocate_vertices(tm_size_type vertex_count, tm_size_type index_count);
- + template <class ContainerType, class PrimitiveGetter>
- + void process_primitives(
- + const SVertexStream & source,
- + const ContainerType & source_primitives,
- + const PrimitiveGetter & primitive_getter);
- +
- private:
- const LineWithCirclesType wide_line_type_;
- const LineEndingType ending_type_;
- diff --git a/Projects/tmRender/src/Loading/Animators/LineWithCirclesEnumerator.cpp b/Projects/tmRender/src/Loading/Animators/LineWithCirclesEnumerator.cpp
- index ac35e6b..74701c1 100644
- --- a/Projects/tmRender/src/Loading/Animators/LineWithCirclesEnumerator.cpp
- +++ b/Projects/tmRender/src/Loading/Animators/LineWithCirclesEnumerator.cpp
- @@ -67,34 +67,33 @@ tm_size_type calculate_circle_index_count(const LineEndingType ending_type, cons
- return circle_count * g_triangles_per_segment * g_indices_per_triangle;
- }
- +template <class ContainerType, class PrimitiveGetter>
- tm_size_type calculate_primitives_vertex_count(
- const LineEndingType ending_type,
- - const std::vector<CGraphicsPrimitive *> & source_primitives)
- + const ContainerType & source_primitives,
- + const PrimitiveGetter & primitive_getter)
- {
- - return std::accumulate(
- - source_primitives.cbegin(),
- - source_primitives.cend(),
- - tm_size_type{0},
- - [&ending_type] (const tm_size_type previous, CGraphicsPrimitive * const primitive) -> tm_size_type {
- - UNI_ASSERT(primitive);
- - return previous + calculate_primitive_vertex_count(ending_type, *primitive);
- - });
- + tm_size_type count = 0;
- + for (const auto & primitive : source_primitives)
- + {
- + count += calculate_primitive_vertex_count(ending_type, primitive_getter(primitive));
- + }
- + return count;
- }
- +template <class ContainerType, class PrimitiveGetter>
- tm_size_type calculate_primitives_index_count(
- const LineEndingType ending_type,
- - const std::vector<CGraphicsPrimitive *> & source_primitives)
- + const ContainerType & source_primitives,
- + const PrimitiveGetter & primitive_getter)
- {
- - return std::accumulate(
- - source_primitives.cbegin(),
- - source_primitives.cend(),
- - tm_size_type{0},
- - [&ending_type] (const tm_size_type previous, CGraphicsPrimitive * const primitive) -> tm_size_type {
- - UNI_ASSERT(primitive);
- - return previous
- - + calculate_line_index_count(*primitive)
- - + calculate_circle_index_count(ending_type, *primitive);
- - });
- + tm_size_type count = 0;
- + for (const auto & primitive : source_primitives)
- + {
- + count += calculate_line_index_count(primitive_getter(primitive))
- + + calculate_circle_index_count(ending_type, primitive_getter(primitive));
- + }
- + return count;
- }
- #include <tmCore/Pragmas/disable_warning_conditional_expression_is_constant.h>
- @@ -378,18 +377,19 @@ void LineWithCirclesEnumerator::allocate_vertices(const tm_size_type vertex_coun
- render_node_data_.output_indices.resize(index_count);
- }
- +template <class ContainerType, class PrimitiveGetter>
- void LineWithCirclesEnumerator::process_primitives(
- const SVertexStream & source,
- - const std::vector<CGraphicsPrimitive *> & source_primitives)
- + const ContainerType & source_primitives,
- + const PrimitiveGetter & primitive_getter)
- {
- allocate_vertices(
- - calculate_primitives_vertex_count(ending_type_, source_primitives),
- - calculate_primitives_index_count(ending_type_, source_primitives));
- + calculate_primitives_vertex_count(ending_type_, source_primitives, primitive_getter),
- + calculate_primitives_index_count(ending_type_, source_primitives, primitive_getter));
- for (const auto & primitive : source_primitives)
- {
- - UNI_ASSERT(primitive);
- - process_primitive(source, *primitive);
- + process_primitive(source, primitive_getter(primitive));
- }
- }
- @@ -428,30 +428,62 @@ void LineWithCirclesEnumerator::process_primitive(
- void LineWithCirclesEnumerator::process_primitives(
- const SVertexStream & source,
- - const CMorphPrimitiveContainer & source_primitives)
- + const std::vector<const CGraphicsPrimitive *> & source_primitives)
- {
- - auto primitives_container = make_vector_with_capacity<CGraphicsPrimitive *>(
- - range_checked_cast<size_t>(std::distance(source_primitives.begin(), source_primitives.end())));
- - for (const auto & primitive : source_primitives)
- - {
- - primitives_container.push_back(primitive.Primitive);
- - }
- + process_primitives(
- + source,
- + source_primitives,
- + [] (const CGraphicsPrimitive * const primitive) -> const CGraphicsPrimitive & {
- + return *primitive;
- + });
- +}
- - process_primitives(source, primitives_container);
- +void LineWithCirclesEnumerator::process_primitives(
- + const SVertexStream & source,
- + const CMorphPrimitiveContainer & source_primitives)
- +{
- + process_primitives(
- + source,
- + source_primitives,
- + [] (const SPrimitiveData & primitive) -> const CGraphicsPrimitive & {
- + return *primitive.Primitive;
- + });
- }
- void LineWithCirclesEnumerator::process_primitives(
- const SVertexStream & source,
- const std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> & source_primitives)
- {
- - auto primitives_container =
- - make_vector_with_capacity<CGraphicsPrimitive *>(source_primitives.size());
- - for (const auto & primitive : source_primitives)
- - {
- - primitives_container.push_back(primitive.get());
- - }
- + process_primitives(
- + source,
- + source_primitives,
- + [] (const boost::intrusive_ptr<CPrimitiveRenderNode> & primitive) -> const CGraphicsPrimitive & {
- + return *primitive;
- + });
- +}
- - process_primitives(source, primitives_container);
- +void LineWithCirclesEnumerator::process_primitives(
- + const SVertexStream & source,
- + const std::vector<CGraphicsPrimitive *> & source_primitives)
- +{
- + process_primitives(
- + source,
- + source_primitives,
- + [] (const CGraphicsPrimitive * const primitive) -> const CGraphicsPrimitive & {
- + return *primitive;
- + });
- +}
- +
- +void LineWithCirclesEnumerator::process_primitives(
- + const SVertexStream & source,
- + const std::vector<CGraphicsPrimitive> & source_primitives)
- +{
- + process_primitives(
- + source,
- + source_primitives,
- + [] (const CGraphicsPrimitive & primitive) -> const CGraphicsPrimitive & {
- + return primitive;
- + });
- }
- CHugeVertexRenderNodeData LineWithCirclesEnumerator::release_morph_result()
- --
- 1.9.5.msysgit.1
- From fe8817952035f27600de6822ca5afe08fe0eb4a8 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:42:24 +0600
- Subject: [PATCH 08/24] =?UTF-8?q?[LMAP-1478]=20CHugeVertexRenderNode=20?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE?=
- =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82=20=D1=81=20=D1=80=D0=B0=D0=B7=D0=B4?=
- =?UTF-8?q?=D0=B5=D0=BB=D1=8F=D0=B5=D0=BC=D1=8B=D0=BC=20=D0=B1=D1=83=D1=84?=
- =?UTF-8?q?=D0=B5=D1=80=D0=B0=D0=BC=D0=B8?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/tmRender/CHugeVertexRenderNode.h | 26 +++++++++--
- Projects/tmRender/CHugeVertexRenderNode.inl | 72 ++++++++++++++++++++---------
- 2 files changed, 72 insertions(+), 26 deletions(-)
- diff --git a/Projects/tmRender/CHugeVertexRenderNode.h b/Projects/tmRender/CHugeVertexRenderNode.h
- index c6f4a51..e4f70a7 100644
- --- a/Projects/tmRender/CHugeVertexRenderNode.h
- +++ b/Projects/tmRender/CHugeVertexRenderNode.h
- @@ -92,15 +92,22 @@ public:
- template<typename ...Args>
- explicit CHugeVertexRenderNode(
- CHugeVertexRenderNodeData &&data, Args&&... args);
- +
- + //! Конструктор от некого void* на морфированные данные и графические буферы.
- + template<typename ...Args>
- + explicit CHugeVertexRenderNode(const boost::intrusive_ptr<RefCountedSingleThread> & shared_data, Args&&... args);
- +
- virtual ~CHugeVertexRenderNode() override;
- public:
- CHugeVertexRenderNodeRenderer &get_renderer_ref();
- const CHugeVertexRenderNodeRenderer &get_renderer_ref() const;
- + //! ВоЕвращает некий void* на морфированные данные и графические буферы.
- + boost::intrusive_ptr<RefCountedSingleThread> getSharedHugeDataWithBuffers();
- +
- public: // IVertexRenderNode
- virtual void clearExternalResources() override;
- - virtual void hardwareDraw(IRender * render) const override;
- // отрисовка рендером.
- virtual void hardwareDrawCustomTree(
- @@ -121,10 +128,21 @@ private:
- const std::vector<CHugeVertexRenderNodeData::PrimitiveDesc> &primitive_descs) const;
- private:
- - mutable std::vector<RenderPrimitive> render_primitives;
- - mutable boost::intrusive_ptr<IRenderBufferObject> IndexBuffer;
- + struct SharedDataWithBuffers final : public RefCountedSingleThread
- + {
- + const CHugeVertexRenderNodeData data_;
- +
- + std::vector<RenderPrimitive> render_primitives;
- + boost::intrusive_ptr<IRenderBufferObject> IndexBuffer;
- +
- + explicit SharedDataWithBuffers(CHugeVertexRenderNodeData && data);
- +
- + SharedDataWithBuffers(const CHugeVertexRenderNodeData &) = delete;
- + };
- +
- +private:
- + const boost::intrusive_ptr<SharedDataWithBuffers> shared_data_with_buffers_;
- #endif
- - const CHugeVertexRenderNodeData render_node_data_;
- CHugeVertexRenderNodeRenderer renderer_;
- };
- diff --git a/Projects/tmRender/CHugeVertexRenderNode.inl b/Projects/tmRender/CHugeVertexRenderNode.inl
- index 3e8c555..ba15cd1 100644
- --- a/Projects/tmRender/CHugeVertexRenderNode.inl
- +++ b/Projects/tmRender/CHugeVertexRenderNode.inl
- @@ -1,9 +1,9 @@
- #pragma once
- -#include <tmRender/RenderCounters.inl>
- -
- #include "CHugeVertexRenderNode.h"
- +#include <tmCore/make_intrusive.h>
- +#include <tmRender/RenderCounters.inl>
- #include "VertexStream.inl"
- #include "IRenderObject.h"
- #include "IRender.h"
- @@ -14,17 +14,37 @@ namespace tmrender
- {
- template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
- +CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::SharedDataWithBuffers::SharedDataWithBuffers(
- + CHugeVertexRenderNodeData && data)
- + : data_(std::move(data))
- +{
- +}
- +
- +template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
- template<typename ...Args>
- CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::CHugeVertexRenderNode(
- CHugeVertexRenderNodeData &&data,
- Args&&... args)
- : IVertexRenderNode(data.output_stream)
- - , render_node_data_(std::move(data))
- + , shared_data_with_buffers_(make_intrusive<SharedDataWithBuffers>(std::move(data)))
- , renderer_(std::forward<Args>(args)...)
- {
- }
- template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
- +template<typename ...Args>
- +CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::CHugeVertexRenderNode(
- + const boost::intrusive_ptr<RefCountedSingleThread> & shared_data,
- + Args&&... args)
- + : IVertexRenderNode(checked_cast<SharedDataWithBuffers &>(*shared_data).data_.output_stream)
- + , shared_data_with_buffers_(checked_cast<SharedDataWithBuffers *>(shared_data.get()))
- + , renderer_(std::forward<Args>(args)...)
- +{
- + UNI_ASSERT(shared_data);
- + UNI_ASSERT(check_type<SharedDataWithBuffers &>(*shared_data));
- +}
- +
- +template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
- CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::~CHugeVertexRenderNode()
- {
- clearExternalResources();
- @@ -43,16 +63,20 @@ const CHugeVertexRenderNodeRenderer &CHugeVertexRenderNode<RenderPrimitive, CHug
- }
- template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
- -void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::clearExternalResources()
- +boost::intrusive_ptr<RefCountedSingleThread>
- + CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::getSharedHugeDataWithBuffers()
- {
- - render_primitives.clear();
- - IndexBuffer.reset();
- + UNI_ASSERT(shared_data_with_buffers_);
- + return shared_data_with_buffers_;
- }
- template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
- -void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::hardwareDraw(IRender * render) const
- +void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::clearExternalResources()
- {
- - hardwareDrawCustomTree(render, nullptr);
- + // Неоптимально, так как другие CHugeVertexRenderNode тоже могут испольЕовать раЕделяемые вершинные буферы.
- + // Но ничего не ломает, так как удаленные буферы переЕальются при следующей отрисовке.
- + shared_data_with_buffers_->render_primitives.clear();
- + shared_data_with_buffers_->IndexBuffer.reset();
- }
- template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
- @@ -62,20 +86,22 @@ void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::hard
- {
- #ifdef TM_USE_EXTERNAL_RENDER
- UNI_ASSERT(render);
- - if (!IndexBuffer)
- +
- + UNI_ASSERT(shared_data_with_buffers_);
- + if (!shared_data_with_buffers_->IndexBuffer)
- {
- - IndexBuffer = render->createElementArray16(
- - render_node_data_.output_indices.data(),
- - static_cast<tm_size_type>(render_node_data_.output_indices.size()),
- + shared_data_with_buffers_->IndexBuffer = render->createElementArray16(
- + shared_data_with_buffers_->data_.output_indices.data(),
- + static_cast<tm_size_type>(shared_data_with_buffers_->data_.output_indices.size()),
- ERBUH_STATIC);
- }
- - if (render_primitives.empty())
- + if (shared_data_with_buffers_->render_primitives.empty())
- {
- update_render_primitives(
- *render,
- - render_node_data_.output_stream.get(),
- - render_node_data_.output_primitives);
- + shared_data_with_buffers_->data_.output_stream.get(),
- + shared_data_with_buffers_->data_.output_primitives);
- }
- const bool is2d = !getVertices() || (getVertices()->Desc & EVD_VECTOR_3D) == 0;
- @@ -92,15 +118,16 @@ void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::hard
- renderer_.set_opengl_state(*render);
- - for (const auto &render_primitive : render_primitives)
- + for (const auto &render_primitive : shared_data_with_buffers_->render_primitives)
- {
- - renderer_.render_primitive(*render, IndexBuffer, render_primitive);
- + renderer_.render_primitive(*render, shared_data_with_buffers_->IndexBuffer, render_primitive);
- }
- g_render_counters.count_vbo();
- - g_render_counters.count_vertices(render_node_data_.output_stream->Count);
- + g_render_counters.count_vertices(shared_data_with_buffers_->data_.output_stream->Count);
- g_render_counters.count_primitives(
- - tme::range_checked_cast<performance::RenderCounters::CounterType>(render_primitives.size()));
- + tme::range_checked_cast<performance::RenderCounters::CounterType>(
- + shared_data_with_buffers_->render_primitives.size()));
- #else // TM_USE_EXTERNAL_RENDER
- throw std::logic_error("Not implemented w/o TM_USE_EXTERNAL_RENDER");
- @@ -110,7 +137,7 @@ void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::hard
- template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
- void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::verticesChanged()
- {
- - render_primitives.clear();
- + shared_data_with_buffers_->render_primitives.clear();
- }
- #ifndef TM_DISABLE_SOFTWARE_RENDERING
- @@ -133,12 +160,13 @@ void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::upda
- #ifdef TM_USE_EXTERNAL_RENDER
- VertexStreamAttribsDesc attribs_desc = render.createVertexAttribObject(vertex_stream, ERBUH_STATIC);
- - render_primitives.reserve(primitive_descs.size());
- + shared_data_with_buffers_->render_primitives.reserve(primitive_descs.size());
- const auto position_desc = getVertices()->getPositionDesc();
- for (const auto &primitive_desc : primitive_descs)
- {
- - render_primitives.push_back(renderer_.create_primitive(render, attribs_desc, position_desc, primitive_desc));
- + shared_data_with_buffers_->render_primitives.push_back(
- + renderer_.create_primitive(render, attribs_desc, position_desc, primitive_desc));
- }
- #endif // TM_USE_EXTERNAL_RENDER
- }
- --
- 1.9.5.msysgit.1
- From d57bf02a260dbc990b5c1b9225977fa75fa568fa Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:43:41 +0600
- Subject: [PATCH 09/24] =?UTF-8?q?[LMAP-1478]=20=D0=9F=D0=BE=D0=B4=D0=B4?=
- =?UTF-8?q?=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20SharedVertexSceneNode=20=D0=B2?=
- =?UTF-8?q?=20TrafficLineAnimator?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- .../tmSymbol/src/Animators/TrafficLineAnimator.cpp | 47 ++++++++++++++--------
- 1 file changed, 31 insertions(+), 16 deletions(-)
- diff --git a/Projects/tmSymbol/src/Animators/TrafficLineAnimator.cpp b/Projects/tmSymbol/src/Animators/TrafficLineAnimator.cpp
- index 9d0a264..c44d6d4 100644
- --- a/Projects/tmSymbol/src/Animators/TrafficLineAnimator.cpp
- +++ b/Projects/tmSymbol/src/Animators/TrafficLineAnimator.cpp
- @@ -3,6 +3,7 @@
- #include "TrafficLineAnimator.h"
- #include <tmCore/move_and_clear.h>
- +#include <tmCore/make_intrusive.h>
- #include <tmRender/VertexStream.inl>
- #include <tmRender/CHugeVertexRenderNode.h>
- #include <tmRender/Loading/Animators/LineWithCirclesEnumerator.h>
- @@ -13,6 +14,7 @@
- #include <tmRender/ProgramUtils.h>
- #include <tmRender/ISceneNode.h>
- #include <tmRender/CPrimitiveSetSceneNode.h>
- +#include <tmRender/SharedVertexSceneNode.h>
- #include <tmRender/CMaterialSceneNode.h>
- #include <tmRender/AnimationContext.h>
- #include <tmRender/LineGenerator.h>
- @@ -171,7 +173,7 @@ public:
- public:
- void process_primitives(
- const tmrender::SVertexStream & source,
- - const tmrender::CMorphPrimitiveContainer & source_primitives);
- + const std::vector<tmrender::CGraphicsPrimitive> & source_primitives);
- public:
- tmrender::CHugeVertexRenderNodeData release_morph_result();
- @@ -250,7 +252,8 @@ public:
- //! получаем объект анимации по уЕлу. свяЕка материал-морфер должна быть 1:1, материал является парентом для морфера
- TrafficAnimationInfoPtr GetAnimationInfo(tme::tmrender::IAnimatedSceneNode *in_node)
- {
- - if (dynamic_cast<tmrender::CPrimitiveSetSceneNode*>(in_node))
- + if (dynamic_cast<tmrender::CPrimitiveSetSceneNode*>(in_node)
- + || dynamic_cast<tmrender::SharedVertexSceneNode*>(in_node))
- {
- tmrender::CPrimitiveSetSceneNode * primitive_node = static_cast<tmrender::CPrimitiveSetSceneNode*>(in_node);
- UNI_ASSERT(dynamic_cast<tmrender::CMaterialSceneNode*>(primitive_node->getMaterialNode()));
- @@ -408,11 +411,11 @@ void TrafficLineAnimator::skin_attach(tmrender::ISkinAnimatedSceneNode * const n
- void TrafficLineAnimator::morph_attach(tmrender::IMorphAnimatedSceneNode * const node)
- {
- - node->createDataCopy(tme::tmrender::EAM_MANUAL_COPY);
- - node->enterDataCopy();
- -
- if (need_arrow_)
- {
- + node->createDataCopy(tme::tmrender::EAM_MANUAL_COPY);
- + node->enterDataCopy();
- +
- // переберем все примитивы, чтобы определить раЕмер реЕультирующего массива точек
- TrafficLinePrimitiveEnumerator modifier(node->accessSourceVertices(), attributes_, line_offset_result_cache_);
- @@ -422,24 +425,36 @@ void TrafficLineAnimator::morph_attach(tmrender::IMorphAnimatedSceneNode * const
- node->setDataCopyVertexRenderNode(
- new tmrender::HugeAALinesVertexRenderNode(
- tme::move_and_clear(output_data.render_node_data)));
- +
- + node->leaveDataCopy();
- }
- else
- {
- - TrafficLineWithoutArrowPrimitiveEnumerator modifier(attributes_->arrow_shift_, line_offset_result_cache_);
- - modifier.process_primitives(*node->accessSourceVertices(), node->accessSourcePrimitivesEx());
- + tmrender::SharedVertexSceneNode & scene_node = checked_cast<tmrender::SharedVertexSceneNode &>(*node);
- - auto morph_result = modifier.release_morph_result();
- + boost::intrusive_ptr<tmrender::LineWithCirclesVertexRenderNode> render_node;
- + if (!scene_node.morphResultCreated())
- + {
- + TrafficLineWithoutArrowPrimitiveEnumerator modifier(attributes_->arrow_shift_, line_offset_result_cache_);
- + modifier.process_primitives(scene_node.getSharedVertices(), scene_node.getSharedPrimitives());
- +
- + render_node = make_intrusive<tmrender::LineWithCirclesVertexRenderNode>(
- + modifier.release_morph_result(),
- + tmrender::LineWithCirclesType::NonStriped);
- - const auto render_node =
- - new tmrender::LineWithCirclesVertexRenderNode(
- - tme::move_and_clear(morph_result),
- + scene_node.setMorphResult(render_node->getSharedHugeDataWithBuffers());
- + }
- + else
- + {
- + render_node = make_intrusive<tmrender::LineWithCirclesVertexRenderNode>(
- + scene_node.getMorphResult(),
- tmrender::LineWithCirclesType::NonStriped);
- + }
- +
- render_node->get_renderer_ref().set_width(attributes_->width_);
- - node->setDataCopyVertexRenderNode(render_node);
- + scene_node.setRenderNode(render_node);
- }
- - node->leaveDataCopy();
- -
- tmrender::ISkinAnimatedSceneNode * const skin_node =
- checked_cast<tmrender::CMaterialSceneNode*>(node->getSceneNodeInterface()->getMaterialNode());
- @@ -908,14 +923,14 @@ TrafficLineWithoutArrowPrimitiveEnumerator::TrafficLineWithoutArrowPrimitiveEnum
- void TrafficLineWithoutArrowPrimitiveEnumerator::process_primitives(
- const tmrender::SVertexStream & source,
- - const tmrender::CMorphPrimitiveContainer & source_primitives)
- + const std::vector<tmrender::CGraphicsPrimitive> & source_primitives)
- {
- if (!shift_.isZero())
- {
- for (const auto & primitive : source_primitives)
- {
- move_line_with_rounding(
- - primitive.Primitive,
- + &primitive,
- &source,
- shift_,
- collapse_line_to_first_last_and_furthest_vertices,
- --
- 1.9.5.msysgit.1
- From affbbb60cad9a7858c37686fefffb2ae7b79f3ea Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:52:43 +0600
- Subject: [PATCH 10/24] =?UTF-8?q?[LMAP-1478]=20=D0=92=D1=81=D0=B5=20traffi?=
- =?UTF-8?q?c=5Fline=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF=D0=B5=D1=80?=
- =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=B2=20=D0=BC?=
- =?UTF-8?q?=D0=B5=D0=BD=D1=8E=20traffic=20line?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 54 +++++++++++------------
- 1 file changed, 27 insertions(+), 27 deletions(-)
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- index 92df4ee..e378a9d 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- @@ -5083,6 +5083,33 @@ QMenu * MainWindowImpl::createSymbolTestMenu(const QString & text)
- add_symbol_test(
- menu,
- + tr("Points without height (raster_marker)"),
- + [] (tme::tmrender::ISymbolCreationFactory & symbol_factory, const std::string & symbol_name) {
- + symbol_factory.create_point_symbol(symbol_name, "poi_2gis", 70, 0, false);
- + },
- + [] (const PlanePoint & center_point) {
- + return create_point_test_geometry(center_point, false);
- + });
- +
- + add_symbol_test(
- + menu,
- + tr("Points with height (raster_marker)"),
- + [] (tme::tmrender::ISymbolCreationFactory & symbol_factory, const std::string & symbol_name) {
- + symbol_factory.create_point_symbol(symbol_name, "poi_2gis", 70, 0, true);
- + },
- + [] (const PlanePoint & center_point) {
- + return create_point_test_geometry(center_point, true);
- + });
- +
- + return menu;
- +}
- +
- +QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- +{
- + QMenu * menu = new QMenu(text, parent_);
- +
- + add_symbol_test(
- + menu,
- tr("Traffic Line arrow (traffic_line arrow)"),
- &create_traffic_line_arrow_symbol,
- &create_traffic_line_test_geometry);
- @@ -5117,33 +5144,6 @@ QMenu * MainWindowImpl::createSymbolTestMenu(const QString & text)
- add_symbol_test(
- menu,
- - tr("Points without height (raster_marker)"),
- - [] (tme::tmrender::ISymbolCreationFactory & symbol_factory, const std::string & symbol_name) {
- - symbol_factory.create_point_symbol(symbol_name, "poi_2gis", 70, 0, false);
- - },
- - [] (const PlanePoint & center_point) {
- - return create_point_test_geometry(center_point, false);
- - });
- -
- - add_symbol_test(
- - menu,
- - tr("Points with height (raster_marker)"),
- - [] (tme::tmrender::ISymbolCreationFactory & symbol_factory, const std::string & symbol_name) {
- - symbol_factory.create_point_symbol(symbol_name, "poi_2gis", 70, 0, true);
- - },
- - [] (const PlanePoint & center_point) {
- - return create_point_test_geometry(center_point, true);
- - });
- -
- - return menu;
- -}
- -
- -QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- -{
- - QMenu * menu = new QMenu(text, parent_);
- -
- - add_symbol_test(
- - menu,
- tr("Multipolylines Traffic Line pbl (traffic_line pbl)"),
- std::bind(create_traffic_line_pbl_symbol, std::placeholders::_1, std::placeholders::_2, 200),
- &create_multi_polyline_test_geometry);
- --
- 1.9.5.msysgit.1
- From fe828c79f7901e551da86eed09340217761c382c Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 10:52:53 +0600
- Subject: [PATCH 11/24] [LMAP-#] Codestyle
- ---
- Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 10 +++++-----
- Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt | 2 +-
- 2 files changed, 6 insertions(+), 6 deletions(-)
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- index e378a9d..a1efcc3 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- @@ -977,7 +977,7 @@ PlanePointContainer create_complex_line_geometry_for_gradient_testing(const Plan
- };
- auto points = tme::make_vector_with_capacity<PlanePoint>(shifts.size());
- -
- +
- std::transform(shifts.begin(), shifts.end(), std::back_inserter(points),
- [¢er_point](const PlaneShift& shift)
- {
- @@ -990,7 +990,7 @@ PlanePointContainer create_complex_line_geometry_for_gradient_testing(const Plan
- std::vector<IGeometryConstPtr> create_colored_line_test_geometry(const PlanePoint & center_point)
- {
- auto points = create_complex_line_geometry_for_gradient_testing(center_point);
- - auto colors = create_complex_line_colors_for_gradient_testing();
- + auto colors = create_complex_line_colors_for_gradient_testing();
- /*
- @@ -3334,14 +3334,14 @@ void MainWindowImpl::onColoredLineHidingTestActionChecked(const bool checked)
- colored_gradient_line_ = object;
- custom_colored_line_layer_->add_object(colored_gradient_line_);
- carto_widget_->addDynamicLayer(custom_colored_line_layer_, project_id);
- -
- +
- colored_line_control_ = parent_->addToolBar("Line Part To Hide");
- -
- +
- const auto slider = new QSlider(Qt::Horizontal);
- slider->setMinimum(0);
- slider->setMaximum(static_cast<int>(g_gradient_line_hiding_test_granularity));
- colored_line_control_->addWidget(slider);
- -
- +
- connect(slider, SIGNAL(valueChanged(int)), this, SLOT(onColoredLinePartToHideChanged(int)));
- }
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- index 619564e..8a38c56 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- @@ -408,7 +408,7 @@ private:
- std::shared_ptr<PluginDynamicLayer> geocoding_by_click_layer_;
- std::shared_ptr<StyleDynamicLayer> screen_coord_test_layer_;
- std::shared_ptr<StyleDynamicLayer> raster_with_height_layer_;
- -
- +
- std::shared_ptr<StyleDynamicLayer> custom_colored_line_layer_;
- IDynamicObjectPtr colored_gradient_line_;
- QToolBar* colored_line_control_;
- --
- 1.9.5.msysgit.1
- From 6daed80aa03a24aec9a93117ef1c0eb5f8ddefd2 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 12:04:23 +0600
- Subject: [PATCH 12/24] =?UTF-8?q?[LMAP-1478]=20=D0=9F=D0=BE=D1=87=D0=B8?=
- =?UTF-8?q?=D0=BD=D0=BA=D0=B0=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D1=85=20?=
- =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20traffic=5Fline?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 53 +++++++++++++++++++----
- 1 file changed, 45 insertions(+), 8 deletions(-)
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- index a1efcc3..fa8ce17 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- @@ -199,6 +199,7 @@ void TestListener::on_buildings_placement_changed(
- last_visible_objects_.push_back(object_details.object_id);
- }
- }
- +
- std::vector<IDynamicObjectPtr> create_directional_model_object_from_file(
- const PlanePoint & center_point,
- const ProjectId,
- @@ -1158,6 +1159,18 @@ std::vector<IGeometryConstPtr> create_area_test_geometry(const PlanePoint & cent
- return geometries;
- }
- +std::vector<IDynamicObjectPtr> create_traffic_line_test_objects(const std::vector<IGeometryConstPtr> & geometries)
- +{
- + ObjectId object_id(1);
- + std::vector<IDynamicObjectPtr> objects;
- + for (const auto & geometry : geometries)
- + {
- + objects.push_back(std::make_shared<TrafficLineDynamicObject>(object_id, geometry));
- + ++object_id;
- + }
- + return objects;
- +}
- +
- template<typename output_type>
- output_type read_32(std::istream &input_stream)
- {
- @@ -5122,7 +5135,10 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- std::placeholders::_1,
- std::placeholders::_2,
- 800),
- - &create_line_test_geometry);
- + CreateObjectsGeometryFunction(),
- + [] (const PlanePoint & center, ProjectId) {
- + return create_traffic_line_test_objects(create_line_test_geometry(center));
- + });
- add_symbol_test(
- menu,
- @@ -5132,13 +5148,19 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- std::placeholders::_1,
- std::placeholders::_2,
- -800),
- - &create_line_test_geometry);
- + CreateObjectsGeometryFunction(),
- + [] (const PlanePoint & center, ProjectId) {
- + return create_traffic_line_test_objects(create_line_test_geometry(center));
- + });
- add_symbol_test(
- menu,
- tr("Traffic Line pbl without shift (traffic_line pbl)"),
- std::bind(create_traffic_line_pbl_symbol, std::placeholders::_1, std::placeholders::_2, 0),
- - &create_line_test_geometry);
- + CreateObjectsGeometryFunction(),
- + [] (const PlanePoint & center, ProjectId) {
- + return create_traffic_line_test_objects(create_line_test_geometry(center));
- + });
- menu->addSeparator();
- @@ -5146,13 +5168,19 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- menu,
- tr("Multipolylines Traffic Line pbl (traffic_line pbl)"),
- std::bind(create_traffic_line_pbl_symbol, std::placeholders::_1, std::placeholders::_2, 200),
- - &create_multi_polyline_test_geometry);
- + CreateObjectsGeometryFunction(),
- + [] (const PlanePoint & center, ProjectId) {
- + return create_traffic_line_test_objects(create_multi_polyline_test_geometry(center));
- + });
- add_symbol_test(
- menu,
- tr("Many polylines Traffic Line pbl (traffic_line pbl)"),
- std::bind(create_traffic_line_pbl_symbol, std::placeholders::_1, std::placeholders::_2, 200),
- - &create_many_polyline_test_geometry);
- + CreateObjectsGeometryFunction(),
- + [] (const PlanePoint & center, ProjectId) {
- + return create_traffic_line_test_objects(create_many_polyline_test_geometry(center));
- + });
- add_symbol_test(
- menu,
- @@ -5238,7 +5266,10 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- menu,
- tr("Road graph Traffic Line pbl (traffic_line pbl)"),
- &create_traffic_line_zoom_10_symbol,
- - import_traffic_data);
- + CreateObjectsGeometryFunction(),
- + [import_traffic_data] (const PlanePoint & center, ProjectId) {
- + return create_traffic_line_test_objects(import_traffic_data(center));
- + });
- add_symbol_test(
- menu,
- @@ -5253,7 +5284,10 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- menu,
- tr("Road graph v3 Traffic Line pbl (traffic_line pbl)"),
- &create_traffic_line_zoom_10_symbol,
- - import_traffic_v3_data);
- + CreateObjectsGeometryFunction(),
- + [import_traffic_v3_data] (const PlanePoint & center, ProjectId) {
- + return create_traffic_line_test_objects(import_traffic_v3_data(center));
- + });
- add_symbol_test(
- menu,
- @@ -5266,7 +5300,10 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- menu,
- tr("Road graph v3 Traffic Line pbl (traffic_line pbl)"),
- &create_traffic_line_zoom_10_symbol,
- - import_traffic_v3_data_many);
- + CreateObjectsGeometryFunction(),
- + [import_traffic_v3_data_many] (const PlanePoint & center, ProjectId) {
- + return create_traffic_line_test_objects(import_traffic_v3_data_many(center));
- + });
- add_symbol_test(
- menu,
- --
- 1.9.5.msysgit.1
- From fdab2a7ef2966469fe1a4e6a7aca56acad34625d Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
- =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
- Date: Mon, 29 Jun 2015 16:07:29 +0600
- Subject: [PATCH 13/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
- =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4?=
- =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BE=D0=BA=20=D1=81=20?=
- =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BB=D0=BE=D0=B6=D0=BA=D0=BE=D0=B9?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 98 ++++++++++++++++++++++-
- Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt | 2 +
- 2 files changed, 99 insertions(+), 1 deletion(-)
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- index fa8ce17..e65b703 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- @@ -49,6 +49,7 @@
- #include <Carto/Carto/Material.h>
- #include <Carto/Carto/MaterialGeometryObject.h>
- #include <Carto/Carto/MaterialGeometryObjectComponent.h>
- +#include <Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h>
- #include <Carto/Carto/DynamicObjects/DirectionalDynamicObject.h>
- #include <Carto/Carto/DynamicObjects/CircleDynamicObject.h>
- #include <Carto/Carto/DynamicObjects/GradientColoredLineDynamicObject.h>
- @@ -1159,13 +1160,45 @@ std::vector<IGeometryConstPtr> create_area_test_geometry(const PlanePoint & cent
- return geometries;
- }
- +std::vector<IGeometryConstPtr> create_helix_multipolyline_test_geometry(const PlanePoint & center_point)
- +{
- + const float pi = boost::math::constants::pi<float>();
- + const auto create_one_helix = [&pi] (const PlanePoint & center, const float direction) {
- + PlanePointContainer points;
- + const size_t points_in_helix = 1000;
- + for (float angle = 0.f, radius = 100.f; points.size() < points_in_helix; (angle += direction * pi / 36), (radius += 100.f))
- + {
- + const float x = std::cos(angle) * radius;
- + const float y = std::sin(angle) * radius;
- + points.emplace_back(center + PlaneShift(static_cast<MapUnit>(x), static_cast<MapUnit>(y)));
- + }
- + return points;
- + };
- +
- + std::vector<PlanePointContainer> geometries;
- +
- + const MapUnit radius = 110000;
- + const size_t helix_count = 10;
- + for (float angle = 0.f, direction = 1.f; geometries.size() < helix_count; (angle += (2.f * pi / helix_count)), (direction *= -1.f))
- + {
- + const float shift_x = std::cos(angle) * radius;
- + const float shift_y = std::sin(angle) * radius;
- + geometries.push_back(
- + create_one_helix(
- + center_point + PlaneShift(static_cast<MapUnit>(shift_x), static_cast<MapUnit>(shift_y)),
- + direction));
- + }
- +
- + return { create_multi_polyline_geometry(geometries) };
- +}
- +
- std::vector<IDynamicObjectPtr> create_traffic_line_test_objects(const std::vector<IGeometryConstPtr> & geometries)
- {
- ObjectId object_id(1);
- std::vector<IDynamicObjectPtr> objects;
- for (const auto & geometry : geometries)
- {
- - objects.push_back(std::make_shared<TrafficLineDynamicObject>(object_id, geometry));
- + objects.push_back(create_traffic_line_dynamic_object(object_id, geometry));
- ++object_id;
- }
- return objects;
- @@ -5311,9 +5344,72 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
- &create_traffic_line_zoom_15_symbol,
- import_traffic_v3_data_many);
- + menu->addSection(tr("--With border"));
- +
- + menu->addAction(
- + tr("Traffic line with border (shared dynamic object)"),
- + this,
- + SLOT(onAddSharedTrafficLineObjectActionChecked(bool)))->setCheckable(true);
- +
- return menu;
- }
- +void MainWindowImpl::onAddSharedTrafficLineObjectActionChecked(const bool checked)
- +{
- + if (checked)
- + {
- + const auto project_and_point = centerProjectAndPointForTest();
- + const ProjectId & project_id = project_and_point.first;
- + const PlanePoint & center_point = project_and_point.second;
- +
- + const std::string symbol_basename = "Shared traffic_line symbol #";
- +
- + const auto create_layer = [&] (const tmmath::CNonPremultipliedColor color, const tmmath::real32x width) {
- + const std::string symbol_name = symbol_basename + boost::lexical_cast<std::string>(width.toFloat());
- + carto_widget_->symbolCreationFactory(project_id).create_traffic_line_pbl_symbol(
- + symbol_name,
- + color,
- + color,
- + width,
- + 0,
- + 0,
- + 0,
- + 0,
- + 100);
- + return create_style_dynamic_layer(
- + project_id,
- + "Style layer for " + symbol_name,
- + symbol_name,
- + "",
- + "dynamic:screen:plugins");
- + };
- +
- + layers_for_shared_traffic_line_test_ = {
- + create_layer(tmmath::CNonPremultipliedColor(0, 0, 255), 500),
- + create_layer(tmmath::CNonPremultipliedColor(0, 255, 0), 300),
- + create_layer(tmmath::CNonPremultipliedColor(255, 0, 0), 100),
- + };
- +
- + const auto dynamic_object =
- + create_traffic_line_test_objects({ create_helix_multipolyline_test_geometry(center_point) }).front();
- +
- + for (const auto & layer : layers_for_shared_traffic_line_test_)
- + {
- + layer->add_object(dynamic_object);
- +
- + carto_widget_->addDynamicLayer(layer, project_id);
- + }
- + }
- + else
- + {
- + for (const auto & layer : layers_for_shared_traffic_line_test_)
- + {
- + carto_widget_->removeDynamicLayer(layer);
- + }
- + layers_for_shared_traffic_line_test_.clear();
- + }
- +}
- +
- void MainWindowImpl::createTilesMenu()
- {
- tiles_menu_ = new QMenu(tr("T&iles"), parent_);
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- index 8a38c56..c603dab 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- @@ -175,6 +175,7 @@ private slots:
- void onSelectOnHoverActionChecked(bool checked);
- void onTrafficLayerTestActionChecked(bool checked);
- + void onAddSharedTrafficLineObjectActionChecked(bool checked);
- void onStyleLayerTestActionChecked(bool checked);
- void onMaterialLayerTestActionChecked(bool checked);
- void onPluginLayerTestActionChecked(bool checked);
- @@ -419,6 +420,7 @@ private:
- std::shared_ptr<StyleDynamicLayer> directional_model_layer_;
- std::shared_ptr<StyleDynamicLayer> labeled_rasters_symbol_point_layer_;
- std::shared_ptr<StyleDynamicLayer> labeled_rasters_symbol_line_layer_;
- + std::vector<std::shared_ptr<StyleDynamicLayer>> layers_for_shared_traffic_line_test_;
- std::map<QAction *, TestSymbolData> symbol_test_data_;
- --
- 1.9.5.msysgit.1
- From 304ac1e62a584197d417910f6d80799f32b7eec1 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Thu, 2 Jul 2015 16:00:45 +0600
- Subject: [PATCH 14/24] =?UTF-8?q?[LMAP-#]=20=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8?=
- =?UTF-8?q?=D0=B5=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D1=8F?=
- =?UTF-8?q?:=20final,=20override,=20=3Ddefault=20=D0=B4=D0=B5=D1=81=D1=82?=
- =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80,=20=D0=BE=D1=84=D0=BE?=
- =?UTF-8?q?=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE?=
- =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D1=81=D1=82=D0=B2=20=D0=B8=D0=BC?=
- =?UTF-8?q?=D1=91=D0=BD.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Carto/Carto/IViewport.h | 2 +-
- Projects/tmRender/CView.h | 2 +-
- Projects/tmRender/CViewCollection.h | 2 +-
- Projects/tmRender/src/CViewCollection.cpp | 5 ++---
- Projects/tmSymbol/CSymbolContainer.h | 14 +++++---------
- 5 files changed, 10 insertions(+), 15 deletions(-)
- diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
- index c7d0a71..2cf8f69 100644
- --- a/Projects/Carto/Carto/IViewport.h
- +++ b/Projects/Carto/Carto/IViewport.h
- @@ -64,7 +64,7 @@ public:
- class IViewport : public IEventProcessor
- {
- public:
- - virtual ~IViewport() {}
- + virtual ~IViewport() = default;
- /*!
- * Уникальный идентификатор порта просмотра.
- diff --git a/Projects/tmRender/CView.h b/Projects/tmRender/CView.h
- index 3358e61..2df6418 100644
- --- a/Projects/tmRender/CView.h
- +++ b/Projects/tmRender/CView.h
- @@ -23,7 +23,7 @@ namespace tmrender
- //
- //**************************************************************************************************
- -class CView : private boost::noncopyable
- +class CView final : private boost::noncopyable
- {
- public:
- // соЕдание просмотра с внешним аппаратным рендером.
- diff --git a/Projects/tmRender/CViewCollection.h b/Projects/tmRender/CViewCollection.h
- index 9859a67..6e0d54c 100644
- --- a/Projects/tmRender/CViewCollection.h
- +++ b/Projects/tmRender/CViewCollection.h
- @@ -9,7 +9,7 @@ namespace tme
- namespace tmrender
- {
- -class CViewCollection
- +class CViewCollection final
- {
- public:
- // добавление компонента в коллекцию.
- diff --git a/Projects/tmRender/src/CViewCollection.cpp b/Projects/tmRender/src/CViewCollection.cpp
- index 72aaa9c..fdc3382 100644
- --- a/Projects/tmRender/src/CViewCollection.cpp
- +++ b/Projects/tmRender/src/CViewCollection.cpp
- @@ -2,7 +2,6 @@
- #include <tmRender/CViewCollection.h>
- #include <tmRender/ISceneNode.h>
- -
- namespace tme
- {
- namespace tmrender
- @@ -160,5 +159,5 @@ void CViewCollection::applyConstFunctionToScene(const SceneNodeConstFunction &fu
- }
- -}
- -}
- +} // namespace tmrender
- +} // namespace tme
- diff --git a/Projects/tmSymbol/CSymbolContainer.h b/Projects/tmSymbol/CSymbolContainer.h
- index 0e2c303..34d5cff 100644
- --- a/Projects/tmSymbol/CSymbolContainer.h
- +++ b/Projects/tmSymbol/CSymbolContainer.h
- @@ -3,8 +3,6 @@
- #include <memory>
- #include <UniFS/Fwd.h>
- -#include <tmCoordSystem/CoordSystem.h>
- -#include <tmRender/DrawConsts.h>
- #include <tmRender/ISymbolContainer.h>
- #include <tmSymbol/Fwd.h>
- @@ -18,8 +16,6 @@ class CSymbolContainer : public tmrender::ISymbolContainer
- {
- public:
- /*!
- - * Конструктор.
- - * \param coord_system система координат проекта.
- * \param loader ЕагруЕчик иЕображений.
- * \param folder интерфейс доступа до древовидной структуры файлов, где хранится описание условных Енаков.
- * \param file имя файла с описанием условных Енаков.
- @@ -28,17 +24,17 @@ public:
- tmrender::ISurfaceManager & loader,
- const UniFS::IDirPtr &folder,
- const std::string &file = std::string("3d.style"));
- - virtual ~CSymbolContainer();
- + virtual ~CSymbolContainer() override;
- public:
- void AddSymbol(const std::string & symbol_name, const tmrender::ISymbolPtr & symbol);
- std::string GetErrorString() const;
- public: // ISymbolContainer
- - virtual tmrender::ISymbolPtr Symbol(const std::string &symbol_name) const;
- - virtual tmrender::ISymbolPtr GetInvisibleSymbol() const;
- - virtual tmrender::CTextureFont * TextureFont(const std::string &font_name) const;
- - virtual tmrender::ISymbolCreationFactory & GetSymbolCreationFactory();
- + virtual tmrender::ISymbolPtr Symbol(const std::string &symbol_name) const override;
- + virtual tmrender::ISymbolPtr GetInvisibleSymbol() const override;
- + virtual tmrender::CTextureFont * TextureFont(const std::string &font_name) const override;
- + virtual tmrender::ISymbolCreationFactory & GetSymbolCreationFactory() override;
- private:
- struct SymbolContainerData;
- --
- 1.9.5.msysgit.1
- From 7c11e74f8e4735ba3519b22f27a49f772b49ec5a Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Thu, 2 Jul 2015 16:01:46 +0600
- Subject: [PATCH 15/24] =?UTF-8?q?[LMAP-1399]=20=D0=A1=D0=BE=D0=B7=D0=B4?=
- =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9?=
- =?UTF-8?q?=20=D0=B1=D0=B5=D0=B7=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82?=
- =?UTF-8?q?=D0=B0.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Carto/Carto/Fwd.h | 2 +-
- Projects/Carto/Carto/IViewport.h | 13 ++-
- Projects/Carto/Carto/Types.h | 6 +-
- Projects/Carto/Carto/Viewport.h | 6 +-
- Projects/Carto/src/Carto/Viewport.cpp | 174 +++++++++++++++++++---------------
- 5 files changed, 110 insertions(+), 91 deletions(-)
- diff --git a/Projects/Carto/Carto/Fwd.h b/Projects/Carto/Carto/Fwd.h
- index 24577b5..213deb9 100644
- --- a/Projects/Carto/Carto/Fwd.h
- +++ b/Projects/Carto/Carto/Fwd.h
- @@ -95,7 +95,7 @@ struct ProjectCoordinates;
- struct ProjectInfo;
- class ViewTrapezium;
- struct ScreenPointPosition;
- -struct ProjectViewData;
- +struct StylesData;
- //! Тип необяЕательного диапаЕона масштабов.
- typedef boost::optional<ScaleRange> OptionalScaleRange;
- diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
- index 2cf8f69..67d69ff 100644
- --- a/Projects/Carto/Carto/IViewport.h
- +++ b/Projects/Carto/Carto/IViewport.h
- @@ -98,9 +98,14 @@ public:
- * Добавление проекта для его отображения в порте просмотра, Identify и т.д.
- * При добавлении проектов с одинаковыми идентификаторами (ProjectId)
- * или с раЕличными списками фаЕ кидается исключение.
- - * \param project_view_data данные для добавления проекта в порт просмотра.
- + * \param project проект.
- + * \param view_settings настройки отображения для данного порта просмотра.
- + * \param project_view_data стили для проекта, предварительно Еагруженные функцией 'prepare_project_styles_data'.
- */
- - virtual void add_prepared_project(ProjectViewDataConstPtr project_view_data) = 0;
- + virtual void add_project(
- + const IProjectPtr& project,
- + const IViewSettingsPtr& view_settings,
- + const StylesData& project_view_data) = 0;
- /*!
- * Подготовка данных для добавления проекта в порт просмотра. Можно Еапускать в отдельном потоке.
- @@ -114,9 +119,7 @@ public:
- * \param style_folder директория с условными Енаками.
- * \param style_file_name Еагружаемый файл в директории с условными Енаками.
- */
- - virtual ProjectViewDataConstPtr prepare_project_view_data(
- - const IProjectPtr & project,
- - const IViewSettingsPtr &view_settings,
- + virtual StylesDataConstPtr prepare_project_styles_data(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_function) const = 0;
- diff --git a/Projects/Carto/Carto/Types.h b/Projects/Carto/Carto/Types.h
- index c407a99..e4468b4 100644
- --- a/Projects/Carto/Carto/Types.h
- +++ b/Projects/Carto/Carto/Types.h
- @@ -14,12 +14,12 @@
- namespace Carto
- {
- -struct ProjectViewDataCustomDeleter
- +struct StylesDataDeleter
- {
- - void operator()(const ProjectViewData *object) const;
- + void operator()(const StylesData *object) const;
- };
- -typedef std::unique_ptr<const ProjectViewData, ProjectViewDataCustomDeleter> ProjectViewDataConstPtr;
- +typedef std::unique_ptr<const StylesData, StylesDataDeleter> StylesDataConstPtr;
- //! Цвет.
- class Color
- diff --git a/Projects/Carto/Carto/Viewport.h b/Projects/Carto/Carto/Viewport.h
- index b9c4266..8f7a58e 100644
- --- a/Projects/Carto/Carto/Viewport.h
- +++ b/Projects/Carto/Carto/Viewport.h
- @@ -61,10 +61,8 @@ public: // IViewport
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_function) override;
- - virtual void add_prepared_project(ProjectViewDataConstPtr project_view_data) override;
- - virtual ProjectViewDataConstPtr prepare_project_view_data(
- - const IProjectPtr & project,
- - const IViewSettingsPtr &view_settings,
- + virtual void add_project(const IProjectPtr & project, const IViewSettingsPtr &view_settings, const StylesData& project_view_data) override;
- + virtual StylesDataConstPtr prepare_project_styles_data(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_function) const override;
- diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
- index 12c45d9..6117bfb 100644
- --- a/Projects/Carto/src/Carto/Viewport.cpp
- +++ b/Projects/Carto/src/Carto/Viewport.cpp
- @@ -50,18 +50,14 @@ namespace Carto
- {
- // Данные для отображения проекта
- -struct ProjectViewData final
- +struct StylesData final
- {
- ViewportId viewport_id_;
- - IProjectPtr project_;
- - IViewSettingsPtr view_settings_;
- ISymbolContainerPtr styles_;
- UniFS::IDirPtr styles_folder_;
- std::string styles_filename_;
- ISurfaceManagerPtr surface_manager_;
- - MapBox map_box_;
- -
- //! Флаг, который вЕводится для того, чтобы перевести состояние анимируемых объектов сцены
- //! сраЕу в финальное состояние, например при смене стилей.
- bool finish_animation_flag_ = false;
- @@ -69,7 +65,7 @@ struct ProjectViewData final
- DataValidationErrorsFunction data_validation_errors_function_;
- };
- -void ProjectViewDataCustomDeleter::operator()(const ProjectViewData * const object) const
- +void StylesDataDeleter::operator()(const StylesData * const object) const
- {
- delete object;
- }
- @@ -319,10 +315,11 @@ public:
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_function);
- - void add_prepared_project(ProjectViewDataConstPtr project_view_data);
- - ProjectViewDataConstPtr prepare_project_view_data(
- - const IProjectPtr & project,
- - const IViewSettingsPtr &view_settings,
- + void add_project(
- + const IProjectPtr& project,
- + const IViewSettingsPtr& view_settings,
- + const StylesData& project_view_data);
- + StylesDataConstPtr prepare_project_styles_data(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_function) const;
- @@ -474,6 +471,7 @@ private: // Types
- struct LayerIdTag;
- struct LayerNameTag;
- +
- typedef boost::multi_index_container<
- LayerViewData,
- boost::multi_index::indexed_by<
- @@ -490,12 +488,33 @@ private: // Types
- boost::multi_index::member<LayerViewData, const ProjectId, &LayerViewData::project_id>,
- boost::multi_index::member<LayerViewData, const std::string, &LayerViewData::layer_name> > > > >
- LayerViewContainer;
- +
- + struct ProjectWithView final
- + {
- + ProjectWithView(
- + const IProjectPtr& in_project,
- + const MapBox& in_project_bounding_box,
- + const IViewSettingsPtr& in_view_settings,
- + const StylesData& in_view)
- + : project(in_project)
- + , project_bounding_box(in_project_bounding_box)
- + , view_settings(in_view_settings)
- + , visual(in_view)
- + {
- + }
- +
- + IProjectPtr project;
- + MapBox project_bounding_box;
- + IViewSettingsPtr view_settings;
- + StylesData visual;
- + };
- +
- typedef LayerViewContainer::index<LayerIdTag>::type LayerIdIndex;
- typedef LayerViewContainer::index<LayerNameTag>::type LayerNameIndex;
- typedef boost::unordered_map<DrawingType, HeavyOperationSettings> DrawingTypeMap;
- - typedef boost::unordered_map<ProjectId, ProjectViewData> ProjectViewMap;
- + typedef boost::unordered_map<ProjectId, ProjectWithView> ProjectViewMap;
- typedef boost::unordered_set<IViewportDeletionListenerPtr> IViewportDeletionListenerContainer;
- private:
- @@ -767,7 +786,7 @@ Viewport::Impl::~Impl()
- for (const ProjectViewMap::value_type & project_view : project_views_)
- {
- - carto_->private_interface().remove_project(project_view.second.project_, parent_);
- + carto_->private_interface().remove_project(project_view.second.project, parent_);
- }
- project_views_.clear();
- @@ -797,45 +816,50 @@ void Viewport::Impl::add_project(
- {
- check_project_before_add(in_project, in_view_settings);
- - add_prepared_project(prepare_project_view_data(
- - in_project,
- - in_view_settings,
- + add_project(in_project, in_view_settings, *prepare_project_styles_data(
- style_folder,
- style_file_name,
- - data_validation_errors_function));
- + data_validation_errors_function).get());
- }
- -void Viewport::Impl::add_prepared_project(ProjectViewDataConstPtr in_project_view_data)
- +void Viewport::Impl::add_project(
- + const IProjectPtr& in_project,
- + const IViewSettingsPtr& in_view_settings,
- + const StylesData& in_project_view_data)
- {
- - const ProjectViewData &project_view_data = *in_project_view_data;
- + UNI_ASSERT(in_project_view_data.viewport_id_ == id());
- - UNI_ASSERT(project_view_data.viewport_id_ == id());
- -
- - check_project_before_add(project_view_data.project_, project_view_data.view_settings_);
- + check_project_before_add(in_project, in_view_settings);
- - project_views_.emplace(project_view_data.project_->id(), project_view_data);
- + project_views_.emplace(
- + in_project->id(),
- + ProjectWithView
- + {
- + in_project,
- + in_project->bounding_box(),
- + in_view_settings,
- + in_project_view_data
- + });
- std::string error_string
- - = tme::checked_cast<tme::CSymbolContainer*>(project_view_data.styles_.get())->GetErrorString();
- + = tme::checked_cast<tme::CSymbolContainer*>(in_project_view_data.styles_.get())->GetErrorString();
- // Регистрируем проект в Carto и ЕагруЕчике
- carto_->private_interface().add_project(
- - project_view_data.project_,
- + in_project,
- parent_,
- - project_view_data.view_settings_,
- - project_view_data.styles_,
- + in_view_settings,
- + in_project_view_data.styles_,
- models_visibility_type_,
- - project_view_data.data_validation_errors_function_ ? &error_string : nullptr);
- + in_project_view_data.data_validation_errors_function_ ? &error_string : nullptr);
- - if (project_view_data.data_validation_errors_function_ && !error_string.empty())
- + if (in_project_view_data.data_validation_errors_function_ && !error_string.empty())
- {
- - project_view_data.data_validation_errors_function_(error_string);
- + in_project_view_data.data_validation_errors_function_(error_string);
- }
- }
- -ProjectViewDataConstPtr Viewport::Impl::prepare_project_view_data(
- - const IProjectPtr &in_project,
- - const IViewSettingsPtr &in_view_settings,
- +StylesDataConstPtr Viewport::Impl::prepare_project_styles_data(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_function) const
- @@ -851,18 +875,15 @@ ProjectViewDataConstPtr Viewport::Impl::prepare_project_view_data(
- style_file_name);
- // Сохраняем информацию о проекте и его настройках отображения
- - const auto project_view_data = new ProjectViewData;
- + const auto project_view_data = new StylesData;
- project_view_data->viewport_id_ = id();
- - project_view_data->project_ = in_project;
- - project_view_data->view_settings_ = in_view_settings;
- project_view_data->styles_ = local_styles;
- project_view_data->styles_folder_ = style_folder;
- project_view_data->styles_filename_ = style_file_name;
- project_view_data->surface_manager_ = project_view_surface_manager;
- project_view_data->data_validation_errors_function_ = data_validation_errors_function;
- - project_view_data->map_box_ = in_project->bounding_box();
- - return ProjectViewDataConstPtr(project_view_data);
- + return StylesDataConstPtr(project_view_data);
- }
- void Viewport::Impl::remove_project(const IProjectPtr &in_project)
- @@ -891,18 +912,16 @@ DeviceType Viewport::Impl::device_type() const
- return device_type_;
- }
- -ISymbolContainerPtr Viewport::Impl::styles(ProjectId project_id) const
- +ISymbolContainerPtr Viewport::Impl::styles(const ProjectId project_id) const
- {
- ProjectViewMap::const_iterator project_iter = project_views_.find(project_id);
- if (project_iter != project_views_.end())
- {
- - UNI_ASSERT(project_iter->second.styles_);
- - return project_iter->second.styles_;
- - }
- - else
- - {
- - return ISymbolContainerPtr();
- + UNI_ASSERT(project_iter->second.visual.styles_);
- + return project_iter->second.visual.styles_;
- }
- +
- + return{};
- }
- void Viewport::Impl::add_layer_view(
- @@ -979,7 +998,7 @@ IProjectPtr Viewport::Impl::project(ProjectId in_id)
- ProjectViewMap::iterator project_view_iter = project_views_.find(in_id);
- UNI_ASSERT(project_view_iter != project_views_.end());
- - return project_view_iter->second.project_;
- + return project_view_iter->second.project;
- }
- IProjectPtrContainer Viewport::Impl::projects()
- @@ -987,7 +1006,7 @@ IProjectPtrContainer Viewport::Impl::projects()
- IProjectPtrContainer project_container;
- for (const ProjectViewMap::value_type & item : project_views_)
- {
- - project_container.push_back(item.second.project_);
- + project_container.push_back(item.second.project);
- }
- return project_container;
- @@ -998,7 +1017,7 @@ IProjectConstPtrContainer Viewport::Impl::const_projects() const
- IProjectConstPtrContainer project_container;
- for (const ProjectViewMap::value_type & item : project_views_)
- {
- - project_container.push_back(item.second.project_);
- + project_container.push_back(item.second.project);
- }
- return project_container;
- @@ -1051,13 +1070,13 @@ IProjectPtrContainer Viewport::Impl::visible_projects() const
- IProjectPtrContainer result;
- for (const ProjectViewMap::value_type & item : project_views_)
- {
- - if (item.second.project_->scale_limits().contains(scale))
- + if (item.second.project->scale_limits().contains(scale))
- {
- - const MapRect & project_rect = item.second.project_->bounding_box().rect();
- + const MapRect & project_rect = item.second.project->bounding_box().rect();
- IGeometryConstPtr project_geometry = create_polygon_geometry(project_rect);
- if (screen_geometry->is_intersects(*project_geometry))
- {
- - result.push_back(item.second.project_);
- + result.push_back(item.second.project);
- }
- }
- }
- @@ -1259,7 +1278,7 @@ MapBox Viewport::Impl::bounding_box_all_projects() const
- global_map_box.set_invalid();
- for (const ProjectViewMap::value_type & item : project_views_)
- {
- - global_map_box.expand(item.second.map_box_);
- + global_map_box.expand(item.second.project_bounding_box);
- }
- return global_map_box;
- }
- @@ -1274,7 +1293,7 @@ MapBox Viewport::Impl::bounding_box_visible_projects() const
- {
- ProjectViewMap::const_iterator it = project_views_.find(item->id());
- UNI_ASSERT(it != project_views_.end());
- - global_map_box.expand(it->second.map_box_);
- + global_map_box.expand(it->second.project_bounding_box);
- }
- return global_map_box;
- }
- @@ -1491,19 +1510,19 @@ void Viewport::Impl::set_view_settings(
- ProjectViewMap::iterator project_iter = project_views_.find(project_id);
- if (project_iter != project_views_.end())
- {
- - ProjectViewData & project_data = project_iter->second;
- - project_data.project_->private_interface().remove_viewport(parent_);
- + StylesData & project_data = project_iter->second.visual;
- + project_iter->second.project->private_interface().remove_viewport(parent_);
- std::string error_string;
- - project_data.view_settings_ = in_view_settings;
- + project_iter->second.view_settings = in_view_settings;
- carto_->private_interface().set_viewport_view(
- project_id,
- id(),
- - project_data.view_settings_,
- + in_view_settings,
- project_data.styles_,
- project_data.data_validation_errors_function_ ? &error_string : nullptr);
- - project_data.project_->private_interface().connect_viewport(parent_);
- + project_iter->second.project->private_interface().connect_viewport(parent_);
- project_data.finish_animation_flag_ = !play_switch_animation;
- need_redraw_function_();
- if (project_data.data_validation_errors_function_ && !error_string.empty())
- @@ -1531,7 +1550,7 @@ void Viewport::Impl::set_styles(
- ProjectViewMap::iterator project_iter = project_views_.find(project_id);
- if (project_iter != project_views_.end())
- {
- - ProjectViewData & project_view = project_iter->second;
- + StylesData & project_view = project_iter->second.visual;
- UNI_ASSERT(project_view.styles_);
- @@ -1578,8 +1597,8 @@ IViewSettingsPtr Viewport::Impl::view_settings(ProjectId project_id) const
- ProjectViewMap::const_iterator project_iter = project_views_.find(project_id);
- if (project_iter != project_views_.end())
- {
- - UNI_ASSERT(project_iter->second.view_settings_);
- - return project_iter->second.view_settings_;
- + UNI_ASSERT(project_iter->second.view_settings);
- + return project_iter->second.view_settings;
- }
- else
- {
- @@ -1618,10 +1637,10 @@ void Viewport::Impl::external_render_context_lost()
- for (ProjectViewMap::value_type &project_view_pair : project_views_)
- {
- // удалим ссылку на условные Енаки
- - project_view_pair.second.styles_.reset();
- + project_view_pair.second.visual.styles_.reset();
- // удалим иЕ кэша картинок некорректные картинки
- - project_view_pair.second.surface_manager_->purge_uploaded_surfaces();
- - carto_->private_interface().remove_project(project_view_pair.second.project_, parent_);
- + project_view_pair.second.visual.surface_manager_->purge_uploaded_surfaces();
- + carto_->private_interface().remove_project(project_view_pair.second.project, parent_);
- }
- // удалим последние ссылки на ресурсы отрисовки
- view_->getRenderTree().clearChilds();
- @@ -1645,7 +1664,7 @@ void Viewport::Impl::external_render_context_recreated()
- #endif // TM_USE_EXTERNAL_RENDER
- for (ProjectViewMap::value_type &project_view_pair : project_views_)
- {
- - ProjectViewData & project_view = project_view_pair.second;
- + StylesData & project_view = project_view_pair.second.visual;
- // соЕдадим условные Енаки
- std::string error_string;
- @@ -1662,9 +1681,9 @@ void Viewport::Impl::external_render_context_recreated()
- }
- carto_->private_interface().add_project(
- - project_view.project_,
- + project_view_pair.second.project,
- parent_,
- - project_view.view_settings_,
- + project_view_pair.second.view_settings,
- project_view.styles_,
- models_visibility_type_,
- nullptr);
- @@ -1712,7 +1731,7 @@ bool Viewport::Impl::check_plan_valid(const IndoorPlan & plan) const
- if (project_views_.end() != it)
- {
- const std::vector<PlanInternalID> plans
- - = it->second.project_->indoor_data().plans_for_object(plan.object_id);
- + = it->second.project->indoor_data().plans_for_object(plan.object_id);
- // Проверка, что в Едании есть такой этаж.
- UNI_ASSERT(plans.end() != boost::find(plans, plan.plan_id));
- return plans.end() != boost::find(plans, plan.plan_id);
- @@ -1898,11 +1917,11 @@ bool Viewport::Impl::animate_projects(tme::tmrender::AnimationContext & context)
- context.scene_animation_mode = tme::tmrender::SceneAnimationMode::Instant;
- break;
- }
- - if (item.second.finish_animation_flag_)
- + if (item.second.visual.finish_animation_flag_)
- {
- // Переводим аниматоры сраЕу в конечное состояние.
- context.scene_animation_mode = tme::tmrender::SceneAnimationMode::Instant;
- - item.second.finish_animation_flag_ = false;
- + item.second.visual.finish_animation_flag_ = false;
- }
- is_redraw_needed = city_view->animate(context) || is_redraw_needed;
- @@ -2130,7 +2149,7 @@ void Viewport::Impl::check_project_before_add(const IProjectPtr & in_project, co
- // Проверка того, что список фаЕ добавляемого проекта полностью и в том же порядке
- // входит в списк фаЕ уже добавленных проектов.
- if (!project_views_.empty()
- - && !check_valid_list_of_phases(project_views_.begin()->second.view_settings_, in_view_settings))
- + && !check_valid_list_of_phases(project_views_.begin()->second.view_settings, in_view_settings))
- {
- TM_THROW_AND_LOG(ListsOfPhasesDifferException("Lists of phases differ"));
- }
- @@ -2193,21 +2212,20 @@ void Viewport::add_project(
- data_validation_errors_function);
- }
- -void Viewport::add_prepared_project(ProjectViewDataConstPtr project_view_data)
- +void Viewport::add_project(
- + const IProjectPtr& project,
- + const IViewSettingsPtr& in_view_settings,
- + const StylesData& project_view_data)
- {
- - impl_->add_prepared_project(std::move(project_view_data));
- + impl_->add_project(project, in_view_settings, project_view_data);
- }
- -ProjectViewDataConstPtr Viewport::prepare_project_view_data(
- - const IProjectPtr & in_project,
- - const IViewSettingsPtr &in_view_settings,
- +StylesDataConstPtr Viewport::prepare_project_styles_data(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_function) const
- {
- - return impl_->prepare_project_view_data(
- - in_project,
- - in_view_settings,
- + return impl_->prepare_project_styles_data(
- style_folder,
- style_file_name,
- data_validation_errors_function);
- --
- 1.9.5.msysgit.1
- From c6b9f05f8b44a083b8af9fee08569c09a4308597 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Thu, 2 Jul 2015 16:01:55 +0600
- Subject: [PATCH 16/24] =?UTF-8?q?[LMAP-1399]=20=D0=A2=D0=B5=D1=81=D1=82=20?=
- =?UTF-8?q?=D0=B2=20CartoQtTestApp=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB?=
- =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?=
- =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20?=
- =?UTF-8?q?=D0=B8=20=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/CartoQtTestAppLib/CartoWidget.hqt | 4 +
- Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 100 ++++++++++++++++++++--
- Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 85 ++++++++++++++++++
- Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt | 9 ++
- 4 files changed, 191 insertions(+), 7 deletions(-)
- diff --git a/Projects/CartoQtTestAppLib/CartoWidget.hqt b/Projects/CartoQtTestAppLib/CartoWidget.hqt
- index 1ed5f00..f8cee4c 100644
- --- a/Projects/CartoQtTestAppLib/CartoWidget.hqt
- +++ b/Projects/CartoQtTestAppLib/CartoWidget.hqt
- @@ -136,6 +136,8 @@ public:
- public slots:
- void showError(const QString &error_message);
- + void loadGlobalStyles(const QString & file_name);
- + ProjectId openProjectWithGlobalSyle(const QString & file_name);
- ProjectId addProject(const QString & file_name);
- ProjectId addProject(
- const QString & map_path,
- @@ -365,6 +367,8 @@ private:
- boost::unordered_map<ProjectId, ProjectParameters> projects_;
- ActivityContainer viewport_activities_;
- + StylesDataConstPtr cached_styles_;
- +
- ICartoPtr carto_;
- std::shared_ptr<RenderTimeScaled> render_time_;
- diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- index 2ff6841..7617914 100644
- --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- @@ -88,6 +88,19 @@ const int g_depth_buffer_size = 24;
- ProjectId g_project_id_for_project_without_project_info(g_empty_project_id);
- +QString project_info_path(const QString& file_name)
- +{
- + QFileInfo file_info(file_name);
- + QString info_path = file_info.absolutePath() + "/" + file_info.completeBaseName() + ".xml";
- +
- + if (!QFile::exists(info_path))
- + {
- + return file_name;
- + }
- +
- + return info_path;
- +};
- +
- UniFS::IDirPtr getModelSource(
- const QString &path,
- const IStableIdConverterConstPtr & stable_id_converter,
- @@ -804,18 +817,91 @@ void CartoWidget::showError(const QString &error_message)
- msgBox.exec();
- }
- -ProjectId CartoWidget::addProject(const QString & file_name)
- +ProjectId CartoWidget::openProjectWithGlobalSyle(const QString & file_name)
- {
- - UNI_ASSERT(!file_name.isEmpty());
- + UNI_ASSERT(false == file_name.isEmpty());
- + UNI_ASSERT(nullptr != cached_styles_);
- - QFileInfo file_info(file_name);
- - QString proj_info_path = file_info.absolutePath() + "/" + file_info.completeBaseName() + ".xml";
- - if (!QFile::exists(proj_info_path))
- + ProjectParameters project_parameters;
- + project_parameters.map_path = file_name;
- + project_parameters.map_version_path = file_name;
- + project_parameters.project_info_path = project_info_path(file_name);
- + project_parameters.view_settings_path = file_name;
- + project_parameters.styles_path = file_name;
- + project_parameters.styles_folder = get_style_folder(file_name.toUtf8().constData());
- + project_parameters.style_file_name = g_style_default;
- + project_parameters.models_path = file_name;
- + project_parameters.stable_id_source_path = file_name;
- +
- + createProject(project_parameters);
- +
- + const auto project = project_parameters.project_ptr;
- +
- + if (nullptr == project)
- + {
- + return ProjectId { 0 };
- + }
- +
- + try
- + {
- + const ProjectId project_id = project->id();
- + UNI_ASSERT(projects_.find(project_id) == projects_.end());
- +
- + const auto view_settings_block = get_view_settings_block(file_name.toUtf8().constData());
- + UNI_ASSERT(view_settings_block);
- +
- + const IViewSettingsPtr view_settings = std::make_shared<ViewSettings>(project, view_settings_block);
- + UNI_ASSERT(view_settings);
- +
- + viewport().add_project(project, view_settings, *cached_styles_.get());
- +
- + projects_[project_id] = project_parameters;
- +
- + emit projectOpened(project_id);
- + if (project_parameters.stable_ids_converter)
- + {
- + emit stableIdSourceOpened(project_id);
- + }
- +
- + return project_id;
- + }
- + catch (const std::exception& e)
- {
- - proj_info_path = file_name;
- + const QString exception_message = e.what();
- + QMessageBox::critical(nullptr, QObject::tr("Error adding project"), exception_message);
- }
- - return addProject(file_name, file_name, proj_info_path, file_name, file_name, file_name, file_name);
- + return ProjectId { 0 };
- +}
- +
- +void CartoWidget::loadGlobalStyles(const QString & file_name)
- +{
- + UNI_ASSERT(false == file_name.isEmpty());
- +
- + if (nullptr == currentCartoWidget())
- + {
- + createWidget();
- + }
- +
- + const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
- + const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
- +
- + try
- + {
- + auto styles = viewport().prepare_project_styles_data(styles_folder, g_style_default, on_unknown_symbol);
- + cached_styles_ = std::move(styles);
- + }
- + catch (const std::exception& e)
- + {
- + const QString exception_message = e.what();
- + QMessageBox::critical(nullptr, QObject::tr("Error"), exception_message);
- + }
- +}
- +
- +ProjectId CartoWidget::addProject(const QString & file_name)
- +{
- + UNI_ASSERT(!file_name.isEmpty());
- + return addProject(file_name, file_name, project_info_path(file_name), file_name, file_name, file_name, file_name);
- }
- ProjectId CartoWidget::addProject(
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- index e65b703..f5a64df 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- @@ -1374,6 +1374,24 @@ std::vector<IDynamicObjectPtr> create_animated_raster_test_objects(const PlanePo
- return { std::make_shared<DirectionalDynamicObject>(ObjectId(1), center_point, 45.0f) };
- }
- +
- +QString open_2gis_container(QMainWindow* const window)
- +{
- + return QFileDialog::getOpenFileName(
- + window,
- + QObject::tr("Select 2GIS container"),
- + QDir::current().absolutePath(),
- + QObject::tr("2GIS data file (*.2gis)"));
- +}
- +
- +QString open_map3d_directory(QMainWindow* const window)
- +{
- + return QFileDialog::getExistingDirectory(
- + window,
- + QObject::tr("Open 2GIS map3d directory"),
- + QDir::current().absolutePath());
- +}
- +
- } // namespace
- MainWindowImpl::MainWindowImpl(QMainWindow *in_parent)
- @@ -2235,6 +2253,60 @@ void MainWindowImpl::onActiveAreaChanged(const ScreenMargin & active_area)
- center_point_position_));
- }
- +void MainWindowImpl::onLoadGlobalStyles2gisTriggered()
- +{
- + QString file_name = open_2gis_container(parent_);
- +
- + if (false == file_name.isEmpty())
- + {
- + carto_widget_->loadGlobalStyles(file_name);
- + open_project_with_global_styles_from_folder_menu_->setEnabled(true);
- + open_project_with_global_styles_from_2gis_menu_->setEnabled(true);
- + }
- +}
- +
- +void MainWindowImpl::onLoadGlobalStylesMap3dTriggered()
- +{
- + QString directory_name = open_map3d_directory(parent_);
- +
- + if (false == directory_name.isEmpty())
- + {
- + carto_widget_->loadGlobalStyles(directory_name);
- + open_project_with_global_styles_from_folder_menu_->setEnabled(true);
- + open_project_with_global_styles_from_2gis_menu_->setEnabled(true);
- + }
- +}
- +
- +void MainWindowImpl::onOpenGlobalStylesProject2gisTriggered()
- +{
- + QString file_name = open_2gis_container(parent_);
- +
- + if (false == file_name.isEmpty())
- + {
- + if (false == carto_widget_->projects().isEmpty())
- + {
- + carto_widget_->closeProjects();
- + }
- +
- + carto_widget_->openProjectWithGlobalSyle(file_name);
- + }
- +}
- +
- +void MainWindowImpl::onOpenGlobalStylesProjectMap3dTriggered()
- +{
- + QString directory_name = open_map3d_directory(parent_);
- +
- + if (false == directory_name.isEmpty())
- + {
- + if (false == carto_widget_->projects().isEmpty())
- + {
- + carto_widget_->closeProjects();
- + }
- +
- + carto_widget_->openProjectWithGlobalSyle(directory_name);
- + }
- +}
- +
- void MainWindowImpl::onOpenProjects2gisTriggered()
- {
- QStringList file_names = QFileDialog::getOpenFileNames(
- @@ -4206,6 +4278,19 @@ void MainWindowImpl::createFileMenu()
- add_project->addAction(tr("2&gis file"), this, SLOT(onAddProject2gisTriggered()), tr("Ctrl+O"));
- add_project->addAction(tr("&map3d directory"), this, SLOT(onAddProjectMap3dTriggered()));
- + QMenu * global_styles_menu = file->addMenu(tr("&Global styles"));
- + global_styles_menu->addAction(tr("Load global styles from 2gis file"), this, SLOT(onLoadGlobalStyles2gisTriggered()));
- + global_styles_menu->addAction(tr("Load global styles from map3d directory"), this, SLOT(onLoadGlobalStylesMap3dTriggered()));
- +
- + open_project_with_global_styles_from_2gis_menu_ =
- + global_styles_menu->addAction(tr("Load project from 2gis file"), this, SLOT(onOpenGlobalStylesProject2gisTriggered()));;
- +
- + open_project_with_global_styles_from_folder_menu_ =
- + global_styles_menu->addAction(tr("Load project from map3d directory"), this, SLOT(onOpenGlobalStylesProjectMap3dTriggered()));
- +
- + open_project_with_global_styles_from_folder_menu_->setEnabled(false);
- + open_project_with_global_styles_from_2gis_menu_->setEnabled(false);
- +
- close_project_menu_ = file->addMenu(tr("&Close project"));
- connect(close_project_menu_, SIGNAL(aboutToShow()), this, SLOT(onCloseProjectMenuShow()));
- close_project_menu_->addAction(tr("&All"), carto_widget_, SLOT(closeProjects()), tr("Ctrl+W"));
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- index c603dab..077c20c 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- @@ -134,6 +134,11 @@ private slots:
- void onLoadProjectsStateTriggered();
- void onSaveProjectsStateTriggered();
- + void onLoadGlobalStyles2gisTriggered();
- + void onLoadGlobalStylesMap3dTriggered();
- + void onOpenGlobalStylesProject2gisTriggered();
- + void onOpenGlobalStylesProjectMap3dTriggered();
- +
- void onCopyMapPositionTriggered();
- void onCopyGeoPositionTriggered();
- @@ -347,6 +352,10 @@ private:
- QMenu * open_models_dir_menu_;
- QMenu * close_models_menu_;
- QMenu * save_models_menu_;
- +
- + QAction * open_project_with_global_styles_from_2gis_menu_;
- + QAction * open_project_with_global_styles_from_folder_menu_;
- +
- QAction * load_viewport_state_action_;
- QAction * save_viewport_state_action_;
- QAction * load_projects_state_action_;
- --
- 1.9.5.msysgit.1
- From c67dc928e7129a20cd05cd8ce778944747ac81c4 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Thu, 2 Jul 2015 19:01:17 +0600
- Subject: [PATCH 17/24] =?UTF-8?q?[LMAP-1399]=20=D0=98=D1=81=D0=BF=D1=80?=
- =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B5=D0=B4?=
- =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B5=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20?=
- =?UTF-8?q?GCC:=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5?=
- =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5?=
- =?UTF-8?q?=20=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5=20=D0=BD=D0=B5=20=D1=81=D0=BA?=
- =?UTF-8?q?=D1=80=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=20=D1=87=D0=BB=D0=B5=D0=BD?=
- =?UTF-8?q?=D1=8B=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B0.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Carto/src/Carto/Viewport.cpp | 4 ++--
- Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 29 +++++++++++++-------------
- 2 files changed, 16 insertions(+), 17 deletions(-)
- diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
- index 6117bfb..8769fa2 100644
- --- a/Projects/Carto/src/Carto/Viewport.cpp
- +++ b/Projects/Carto/src/Carto/Viewport.cpp
- @@ -2213,11 +2213,11 @@ void Viewport::add_project(
- }
- void Viewport::add_project(
- - const IProjectPtr& project,
- + const IProjectPtr& in_project,
- const IViewSettingsPtr& in_view_settings,
- const StylesData& project_view_data)
- {
- - impl_->add_project(project, in_view_settings, project_view_data);
- + impl_->add_project(in_project, in_view_settings, project_view_data);
- }
- StylesDataConstPtr Viewport::prepare_project_styles_data(
- diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- index 7617914..503c94b 100644
- --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- @@ -99,7 +99,7 @@ QString project_info_path(const QString& file_name)
- }
- return info_path;
- -};
- +}
- UniFS::IDirPtr getModelSource(
- const QString &path,
- @@ -835,25 +835,25 @@ ProjectId CartoWidget::openProjectWithGlobalSyle(const QString & file_name)
- createProject(project_parameters);
- - const auto project = project_parameters.project_ptr;
- + const auto project_to_be_opened = project_parameters.project_ptr;
- - if (nullptr == project)
- + if (nullptr == project_to_be_opened)
- {
- return ProjectId { 0 };
- }
- try
- {
- - const ProjectId project_id = project->id();
- + const ProjectId project_id = project_to_be_opened->id();
- UNI_ASSERT(projects_.find(project_id) == projects_.end());
- const auto view_settings_block = get_view_settings_block(file_name.toUtf8().constData());
- UNI_ASSERT(view_settings_block);
- - const IViewSettingsPtr view_settings = std::make_shared<ViewSettings>(project, view_settings_block);
- + const auto view_settings = std::make_shared<ViewSettings>(project_to_be_opened, view_settings_block);
- UNI_ASSERT(view_settings);
- - viewport().add_project(project, view_settings, *cached_styles_.get());
- + viewport().add_project(project_to_be_opened, view_settings, *cached_styles_.get());
- projects_[project_id] = project_parameters;
- @@ -878,18 +878,17 @@ void CartoWidget::loadGlobalStyles(const QString & file_name)
- {
- UNI_ASSERT(false == file_name.isEmpty());
- - if (nullptr == currentCartoWidget())
- + try
- {
- - createWidget();
- - }
- + if (nullptr == currentCartoWidget())
- + {
- + createWidget();
- + }
- - const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
- - const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
- + const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
- + const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
- - try
- - {
- - auto styles = viewport().prepare_project_styles_data(styles_folder, g_style_default, on_unknown_symbol);
- - cached_styles_ = std::move(styles);
- + cached_styles_ = viewport().prepare_project_styles_data(styles_folder, g_style_default, on_unknown_symbol);
- }
- catch (const std::exception& e)
- {
- --
- 1.9.5.msysgit.1
- From 4eab0cbb510cf20189fa52745ea740c1b4982bc3 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Wed, 8 Jul 2015 18:30:19 +0600
- Subject: [PATCH 18/24] =?UTF-8?q?[LMAP-1399]=20=D0=9C=D0=B5=D1=82=D0=BE?=
- =?UTF-8?q?=D0=B4=20'clone'=20=D1=83=20CSurfaceManager=20=D1=82=D0=B5?=
- =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20thread=20safe=20(=D1=81=20=D1=82?=
- =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20=D0=B4=D0=BE?=
- =?UTF-8?q?=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?=
- =?UTF-8?q?=D0=B8=D0=B9=20=D0=BD=D0=B8=D0=B6=D0=B5=20=D0=BF=D0=BE=20call?=
- =?UTF-8?q?=20stack).?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/AndroidTestApp/jni/SDLCartoWindow.cpp | 8 ++-
- Projects/Benchmark/src/Benchmark.cpp | 8 ++-
- Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp | 8 ++-
- Projects/MakeBinaryModels/src/MakeBinaryModels.cpp | 8 ++-
- Projects/tmRender/CSurfaceManager.h | 27 ++++-----
- Projects/tmRender/ISurfaceManager.h | 3 -
- Projects/tmRender/src/CSurfaceManager.cpp | 69 ++++++----------------
- 7 files changed, 51 insertions(+), 80 deletions(-)
- diff --git a/Projects/AndroidTestApp/jni/SDLCartoWindow.cpp b/Projects/AndroidTestApp/jni/SDLCartoWindow.cpp
- index 8627435..5a2609a 100644
- --- a/Projects/AndroidTestApp/jni/SDLCartoWindow.cpp
- +++ b/Projects/AndroidTestApp/jni/SDLCartoWindow.cpp
- @@ -80,9 +80,11 @@ SDLCartoWindow::SDLCartoWindow(
- throw std::runtime_error("Couldn't create OpenGL context: " + std::string(SDL_GetError()));
- }
- - surface_manager_ = std::make_shared<tme::tmrender::CSurfaceManager>();
- - surface_manager_->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderTGA());
- - surface_manager_->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderPNG());
- + surface_manager_ = std::make_shared<tme::tmrender::CSurfaceManager>(
- + nullptr,
- + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
- viewport_.reset(new Viewport(
- carto_,
- diff --git a/Projects/Benchmark/src/Benchmark.cpp b/Projects/Benchmark/src/Benchmark.cpp
- index 54bca2f..9b716fd 100644
- --- a/Projects/Benchmark/src/Benchmark.cpp
- +++ b/Projects/Benchmark/src/Benchmark.cpp
- @@ -369,9 +369,11 @@ Result Benchmark::run(const Configuration &configuration)
- carto = std::make_shared<Carto::Carto>(system);
- }
- - Carto::ISurfaceManagerPtr surface_manager(new tme::tmrender::CSurfaceManager());
- - surface_manager->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderTGA());
- - surface_manager->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderPNG());
- + const auto surface_manager = std::make_shared<tme::tmrender::CSurfaceManager>(
- + nullptr,
- + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
- const UniFS::IOpenedFilePtr map_file = Carto::get_map_block(location.getMapPath());
- if (!map_file)
- diff --git a/Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp b/Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp
- index f51bee7..bcb824f 100644
- --- a/Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp
- +++ b/Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp
- @@ -57,9 +57,11 @@ CartoWidgetImpl::CartoWidgetImpl(
- #endif
- UNI_ASSERT(render || present_function);
- - surface_manager_ = std::make_shared<tme::tmrender::CSurfaceManager>();
- - surface_manager_->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderTGA());
- - surface_manager_->addSurfaceLoader(new QtSurfaceLoader());
- + surface_manager_ = std::make_shared<tme::tmrender::CSurfaceManager>(
- + nullptr,
- + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
- + tme::tmrender::CSurfaceManager::Loader(new QtSurfaceLoader())});
- viewport_.reset(new Viewport(
- carto_,
- diff --git a/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp b/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
- index 7ce7a3d..13cfa88 100644
- --- a/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
- +++ b/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
- @@ -185,9 +185,11 @@ int main(const int argc, char ** const argv)
- const std::string input_folder_utf8 = params["input"].as<std::string>();
- const std::string output_folder_utf8 = params["output"].as<std::string>();
- - std::shared_ptr<tme::tmrender::ISurfaceManager> surface_manager(new tme::tmrender::CSurfaceManager());
- - surface_manager->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderTGA());
- - surface_manager->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderPNG());
- + const auto surface_manager = std::make_shared<tme::tmrender::CSurfaceManager>(
- + nullptr,
- + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
- const auto input_folder_ptr = ::UniFS_StdFS::CreateDir(input_folder_utf8, "/");
- const auto output_folder_ptr = std::make_shared<FolderImpl>(UTF_Utils::UTF8ToWString(output_folder_utf8));
- diff --git a/Projects/tmRender/CSurfaceManager.h b/Projects/tmRender/CSurfaceManager.h
- index 3b7f643..9427c4b 100644
- --- a/Projects/tmRender/CSurfaceManager.h
- +++ b/Projects/tmRender/CSurfaceManager.h
- @@ -1,6 +1,8 @@
- #pragma once
- -#include <list>
- +#include <vector>
- +#include <initializer_list>
- +
- #include <tmRender/ISurfaceManager.h>
- namespace tme
- @@ -8,21 +10,19 @@ namespace tme
- namespace tmrender
- {
- -class CSurfaceManager : public ISurfaceManager
- +class CSurfaceManager final : public ISurfaceManager
- {
- public:
- - CSurfaceManager();
- - explicit CSurfaceManager(const UniFS::IDirPtr &fs);
- + using Loader = boost::intrusive_ptr<ISurfaceLoader>;
- +
- + CSurfaceManager(const UniFS::IDirPtr &fs, std::initializer_list<Loader> loaders);
- virtual ~CSurfaceManager();
- public:
- virtual const UniFS::IDirPtr & getFileSystem() override { return FileSystem; }
- - virtual void setFileSystem(const UniFS::IDirPtr &new_file_system) override;
- virtual std::unique_ptr<ISurfaceManager> clone(bool enable_cache) const override;
- virtual std::unique_ptr<ISurfaceManager> clone(const UniFS::IDirPtr &fs, bool enable_cache) const override;
- - virtual void addSurfaceLoader(ISurfaceLoader * loader) override;
- -
- virtual void purge_uploaded_surfaces() override;
- public:
- @@ -30,17 +30,16 @@ public:
- virtual ISurface * load(const UniFS::IFilePtr &file, ESurfaceFormat format) override;
- private:
- - explicit CSurfaceManager(const CSurfaceManager * other, bool enable_cache);
- - CSurfaceManager(const CSurfaceManager * other, const UniFS::IDirPtr &fs, bool enable_cache);
- -
- - ISurfaceLoader * find_surface_loader(const std::string & file_name) const;
- + typedef std::vector<Loader> TLoadersList;
- private:
- - typedef std::list<boost::intrusive_ptr<ISurfaceLoader> > TLoadersList;
- + CSurfaceManager(const CSurfaceManager& other, const UniFS::IDirPtr &fs, bool enable_cache);
- +
- + ISurfaceLoader * find_surface_loader(const std::string & file_name) const;
- private:
- - UniFS::IDirPtr FileSystem;
- - TLoadersList Loaders;
- + const UniFS::IDirPtr FileSystem;
- + const TLoadersList Loaders;
- boost::intrusive_ptr<ISurfaceCache> Cache;
- };
- diff --git a/Projects/tmRender/ISurfaceManager.h b/Projects/tmRender/ISurfaceManager.h
- index b1c8d3c..1b69489 100644
- --- a/Projects/tmRender/ISurfaceManager.h
- +++ b/Projects/tmRender/ISurfaceManager.h
- @@ -16,12 +16,9 @@ struct ISurfaceManager : private boost::noncopyable
- virtual ~ISurfaceManager() = default;
- virtual const ::UniFS::IDirPtr &getFileSystem() = 0;
- - virtual void setFileSystem(const ::UniFS::IDirPtr &new_file_system) = 0;
- virtual std::unique_ptr<ISurfaceManager> clone(bool enable_cache) const = 0;
- virtual std::unique_ptr<ISurfaceManager> clone(const ::UniFS::IDirPtr &fs, bool enable_cache) const = 0;
- - virtual void addSurfaceLoader(ISurfaceLoader * loader) = 0;
- -
- /*!
- * Служит для очистки тех картинок, которые были Еалиты в видео память.
- */
- diff --git a/Projects/tmRender/src/CSurfaceManager.cpp b/Projects/tmRender/src/CSurfaceManager.cpp
- index d6ba130..7673913 100644
- --- a/Projects/tmRender/src/CSurfaceManager.cpp
- +++ b/Projects/tmRender/src/CSurfaceManager.cpp
- @@ -2,79 +2,47 @@
- #include <tmRender/CSurfaceManager.h>
- -#include <Map_IO/FileNotFoundException.h>
- #include <tmRender/CSurfaceCache.h>
- -#include <tmRender/CSurfaceManager.h>
- #include <tmRender/ISurfaceLoader.h>
- +#include <Map_IO/FileNotFoundException.h>
- +
- namespace tme
- {
- namespace tmrender
- {
- -CSurfaceManager::CSurfaceManager()
- - : ISurfaceManager()
- -{
- -}
- -
- -CSurfaceManager::CSurfaceManager(const UniFS::IDirPtr &fs)
- - : ISurfaceManager()
- - , FileSystem(fs)
- -{
- - UNI_ASSERT(FileSystem);
- -}
- -
- CSurfaceManager::~CSurfaceManager()
- {
- }
- -CSurfaceManager::CSurfaceManager(const CSurfaceManager * other, bool enable_cache)
- - : ISurfaceManager()
- - , FileSystem(other->FileSystem)
- +CSurfaceManager::CSurfaceManager(
- + const UniFS::IDirPtr &fs,
- + std::initializer_list<Loader> loaders)
- + : FileSystem(fs)
- + , Loaders(loaders.begin(), loaders.end())
- {
- - for (TLoadersList::const_iterator it = other->Loaders.begin(); it != other->Loaders.end(); ++it)
- - {
- - Loaders.push_back(*it);
- - }
- - if (enable_cache)
- - {
- - Cache.reset(new CSurfaceCache());
- - }
- }
- -CSurfaceManager::CSurfaceManager(const CSurfaceManager * other, const UniFS::IDirPtr &fs, bool enable_cache)
- +CSurfaceManager::CSurfaceManager(const CSurfaceManager& other, const UniFS::IDirPtr &fs, const bool enable_cache)
- : ISurfaceManager()
- , FileSystem(fs)
- + , Loaders(other.Loaders)
- {
- - UNI_ASSERT(FileSystem);
- - for (TLoadersList::const_iterator it = other->Loaders.begin(); it != other->Loaders.end(); ++it)
- - {
- - Loaders.push_back(*it);
- - }
- if (enable_cache)
- {
- Cache.reset(new CSurfaceCache());
- }
- }
- -void CSurfaceManager::setFileSystem(const UniFS::IDirPtr &new_file_system)
- -{
- - FileSystem = new_file_system;
- -}
- -
- std::unique_ptr<ISurfaceManager> CSurfaceManager::clone(const bool enable_cache) const
- {
- - return std::unique_ptr<ISurfaceManager>(new CSurfaceManager(this, enable_cache));
- + return std::unique_ptr<ISurfaceManager>(new CSurfaceManager(*this, FileSystem, enable_cache));
- }
- std::unique_ptr<ISurfaceManager> CSurfaceManager::clone(const UniFS::IDirPtr & fs, const bool enable_cache) const
- {
- - return std::unique_ptr<ISurfaceManager>(new CSurfaceManager(this, fs, enable_cache));
- -}
- -
- -void CSurfaceManager::addSurfaceLoader(ISurfaceLoader * loader)
- -{
- - Loaders.push_back(boost::intrusive_ptr<ISurfaceLoader>(loader));
- + return std::unique_ptr<ISurfaceManager>(new CSurfaceManager(*this, fs, enable_cache));
- }
- void CSurfaceManager::purge_uploaded_surfaces()
- @@ -85,16 +53,17 @@ void CSurfaceManager::purge_uploaded_surfaces()
- }
- }
- -ISurface * CSurfaceManager::load(const std::string & fileName, ESurfaceFormat format)
- +ISurface * CSurfaceManager::load(const std::string & fileName, const ESurfaceFormat format)
- {
- - ISurface * surface = 0;
- + UNI_ASSERT(FileSystem);
- +
- + ISurface * surface = nullptr;
- if (Cache)
- {
- surface = Cache->find(fileName, format);
- }
- if (!surface)
- {
- - UNI_ASSERT(FileSystem);
- ISurfaceLoader * loader = find_surface_loader(fileName);
- if (loader)
- {
- @@ -105,7 +74,6 @@ ISurface * CSurfaceManager::load(const std::string & fileName, ESurfaceFormat fo
- }
- else
- {
- - UNILOG_ERROR << "Cannot open image file: " << fileName;
- throw ::Map::IO::FileNotFoundException(file->FullPath());
- }
- }
- @@ -118,9 +86,9 @@ ISurface * CSurfaceManager::load(const std::string & fileName, ESurfaceFormat fo
- return surface;
- }
- -ISurface * CSurfaceManager::load(const UniFS::IFilePtr &file, ESurfaceFormat format)
- +ISurface * CSurfaceManager::load(const UniFS::IFilePtr &file, const ESurfaceFormat format)
- {
- - ISurface * surface = 0;
- + ISurface * surface = nullptr;
- // Будем испольЕовать другое пространство имен в кэше
- const std::string cache_file_name = "::" + file->FullPath();
- if (Cache)
- @@ -138,7 +106,6 @@ ISurface * CSurfaceManager::load(const UniFS::IFilePtr &file, ESurfaceFormat for
- }
- else
- {
- - UNILOG_ERROR << "Cannot open image file: " << file->FullPath();
- throw ::Map::IO::FileNotFoundException(file->FullPath());
- }
- }
- @@ -160,7 +127,7 @@ ISurfaceLoader *CSurfaceManager::find_surface_loader(const std::string &file_nam
- return loader.get();
- }
- }
- - return 0;
- + return nullptr;
- }
- }} // namespace tme::tmrender
- --
- 1.9.5.msysgit.1
- From c0644b5b1decebbc443b4317d44d3a5fa91a92a1 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Thu, 9 Jul 2015 11:05:28 +0600
- Subject: [PATCH 19/24] =?UTF-8?q?[LMAP-1399]=20=D0=9F=D0=B5=D1=80=D0=B5?=
- =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=B3=D0=BB?=
- =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=81=D1=82?=
- =?UTF-8?q?=D0=B8=D0=BB=D0=B5=D0=B9=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BC?=
- =?UTF-8?q?=D0=B5=D0=BD=D0=B5=20OpenGL-=D0=BA=D0=BE=D0=BD=D1=82=D0=B5?=
- =?UTF-8?q?=D0=BA=D1=81=D1=82=D0=B0.=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?=
- =?UTF-8?q?=D0=BD=D1=8B=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20=D0=BC?=
- =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83?=
- =?UTF-8?q?=D0=B7=D0=BA=D0=B8=20=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9=20?=
- =?UTF-8?q?=D0=B2=20=D0=BF=D0=BE=D1=80=D1=82=20=D0=BF=D1=80=D0=BE=D1=81?=
- =?UTF-8?q?=D0=BC=D0=BE=D1=82=D1=80=D0=B0=20=D1=81=20=D1=83=D0=BA=D0=B0?=
- =?UTF-8?q?=D0=B7=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D1=84=D0=B0=D0=B9=D0=BB?=
- =?UTF-8?q?=D0=B0.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Carto/Carto.gyp | 2 +
- Projects/Carto/Carto/Fwd.h | 2 +-
- Projects/Carto/Carto/IViewport.h | 77 +--
- Projects/Carto/Carto/Types.h | 7 -
- Projects/Carto/Carto/Viewport.h | 34 +-
- Projects/Carto/src/Carto/StyleSetCache.cpp | 102 +++
- Projects/Carto/src/Carto/StyleSetCache.h | 65 ++
- Projects/Carto/src/Carto/Viewport.cpp | 749 +++++++++++-----------
- Projects/CartoQtTestAppLib/CartoWidget.hqt | 3 +-
- Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 126 +++-
- Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 13 +-
- Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt | 2 +
- 12 files changed, 725 insertions(+), 457 deletions(-)
- create mode 100644 Projects/Carto/src/Carto/StyleSetCache.cpp
- create mode 100644 Projects/Carto/src/Carto/StyleSetCache.h
- diff --git a/Projects/Carto/Carto.gyp b/Projects/Carto/Carto.gyp
- index f5d1c55..e67c465 100644
- --- a/Projects/Carto/Carto.gyp
- +++ b/Projects/Carto/Carto.gyp
- @@ -270,6 +270,8 @@
- 'src/Carto/StyleDynamicLayer.cpp',
- 'src/Carto/StyleDynamicLayerView.cpp',
- 'src/Carto/StyleDynamicLayerView.h',
- + 'src/Carto/StyleSetCache.cpp',
- + 'src/Carto/StyleSetCache.h',
- 'src/Carto/TypesImpl.h',
- 'src/Carto/Util.cpp',
- 'src/Carto/UtilsImpl.cpp',
- diff --git a/Projects/Carto/Carto/Fwd.h b/Projects/Carto/Carto/Fwd.h
- index 213deb9..225574c 100644
- --- a/Projects/Carto/Carto/Fwd.h
- +++ b/Projects/Carto/Carto/Fwd.h
- @@ -95,7 +95,7 @@ struct ProjectCoordinates;
- struct ProjectInfo;
- class ViewTrapezium;
- struct ScreenPointPosition;
- -struct StylesData;
- +struct Styles;
- //! Тип необяЕательного диапаЕона масштабов.
- typedef boost::optional<ScaleRange> OptionalScaleRange;
- diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
- index 67d69ff..f8051a1 100644
- --- a/Projects/Carto/Carto/IViewport.h
- +++ b/Projects/Carto/Carto/IViewport.h
- @@ -1,7 +1,5 @@
- #pragma once
- -#include <exception>
- -
- #include <UniFS/Fwd.h>
- #include <Carto/Carto/Types.h>
- #include <Carto/Tools/Fwd.h>
- @@ -78,54 +76,41 @@ public:
- * или с раЕличными списками фаЕ кидается исключение.
- * \param project проект.
- * \param view_settings настройки отображения для данного порта просмотра.
- - * \param data_validation_errors_function функция, выЕываемая при обнаружении ошибок экспорта, стилей,
- - * настроек отображения и всего такого.
- - * Данный функтор копируется внутрь объекта и выЕывается в местах, где это необходимо, например,
- - * при Еадании новой библиотеки стилей.
- - * Может выЕваться прямо иЕ конструктора. Можно укаЕать пустую функцию, тогда проверка
- - * не будет осуществляться.
- - * \param style_folder директория с условными Енаками.
- - * \param style_file_name Еагружаемый файл в директории с условными Енаками.
- + * \param styles стили, предварительно Еагруженные функцией 'prepare_styles'.
- */
- virtual void add_project(
- - const IProjectPtr & project,
- + const IProjectPtr &project,
- const IViewSettingsPtr &view_settings,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function) = 0;
- -
- - /*!
- - * Добавление проекта для его отображения в порте просмотра, Identify и т.д.
- - * При добавлении проектов с одинаковыми идентификаторами (ProjectId)
- - * или с раЕличными списками фаЕ кидается исключение.
- - * \param project проект.
- - * \param view_settings настройки отображения для данного порта просмотра.
- - * \param project_view_data стили для проекта, предварительно Еагруженные функцией 'prepare_project_styles_data'.
- - */
- - virtual void add_project(
- - const IProjectPtr& project,
- - const IViewSettingsPtr& view_settings,
- - const StylesData& project_view_data) = 0;
- + const std::shared_ptr<Styles> &styles) = 0;
- /*!
- - * Подготовка данных для добавления проекта в порт просмотра. Можно Еапускать в отдельном потоке.
- - * \param project проект.
- - * \param view_settings настройки отображения для данного порта просмотра.
- - * \param data_validation_errors_function функция, выЕываемая при обнаружении ошибок экспорта, стилей,
- - * настроек отображения и всего такого.
- - * Данный функтор хранится вместе с проектом и выЕывается в местах, где это необходимо, например,
- - * при добавлении в порт просмотра или Еадании новой библиотеки стилей.
- - * Можно укаЕать пустую функцию, тогда проверка не будет осуществляться.
- + * Подготовка данных для добавления проекта в порт просмотра. Можно Еапускать в отдельной нити.
- * \param style_folder директория с условными Енаками.
- * \param style_file_name Еагружаемый файл в директории с условными Енаками.
- + * \param data_validation_errors_callback функция, выЕываемая при обнаружении ошибок экспорта, стилей, настроек
- + * отображения и всего такого. Копируется внутрь и выЕывается в местах, где это необходимо, например, при
- + * Еадании новой библиотеки стилей. Может выЕваться прямо иЕ конструктора. Можно укаЕать пустую функцию,
- + * тогда проверка не будет осуществляться.
- */
- - virtual StylesDataConstPtr prepare_project_styles_data(
- + virtual std::shared_ptr<Styles> prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function) const = 0;
- + const DataValidationErrorsFunction &data_validation_errors_callback) const = 0;
- +
- + /*!
- + * Удалить все ссылки на стили иЕ внутренних структур данных. После выЕова этого метода стили не будут
- + * восстанавливаться при смене контекста рендера. Данная функция никак не портит содержимое по переданному
- + * укаЕателю и её действие можно отменить, к примеру, добавив проект с освобождёнными стилями. Для окончательной
- + * выгруЕки всех данных, выЕывающей стороне так же необходимо освободить свою копию укаЕателя.
- + *
- + * \param styles стили, предварительно Еагруженные функцией 'prepare_styles'.
- + */
- + virtual void free_styles(
- + const std::shared_ptr<Styles> &styles) = 0;
- //! Удаление проекта иЕ порта просмотра.
- - virtual void remove_project(const IProjectPtr & project) = 0;
- + //! \return стили удалённого проекта.
- + virtual std::shared_ptr<Styles> remove_project(const IProjectPtr &project) = 0;
- /*!
- * Получение карты, к которой привяЕана данная область просмотра.
- @@ -156,6 +141,13 @@ public:
- virtual IProjectConstPtrContainer visible_projects() const = 0;
- /*!
- + * Получение интерфейсов всех проектов, испольЕующих данные стили.
- + * \return множество проектов.
- + */
- + virtual IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) = 0;
- + virtual IProjectConstPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) const = 0;
- +
- + /*!
- * Получение класса для управления отображением слоя по имени.
- * \param project_id идентификатор проекта.
- * \param name имя слоя.
- @@ -441,14 +433,13 @@ public:
- /*!
- * Смена испольЕуемых условных Енаков.
- * \param project_id идентификатор проекта
- - * \param style_folder директория с условными Енаками.
- - * \param style_file_name Еагружаемый файл в директории с условными Енаками.
- + * \param стили, предварительно Еагруженные функцией 'prepare_styles'.
- * \param play_switch_animation флаг необходимости проигрывания анимации появления для уже Еагруженных объектов.
- + * \return предыдущие настройки отображения для данного проекта.
- */
- - virtual void set_styles(
- + virtual std::shared_ptr<Styles> set_styles(
- ProjectId project_id,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- + const std::shared_ptr<Styles> &styles,
- bool play_switch_animation = true) = 0;
- /*!
- diff --git a/Projects/Carto/Carto/Types.h b/Projects/Carto/Carto/Types.h
- index e4468b4..9a96817 100644
- --- a/Projects/Carto/Carto/Types.h
- +++ b/Projects/Carto/Carto/Types.h
- @@ -14,13 +14,6 @@
- namespace Carto
- {
- -struct StylesDataDeleter
- -{
- - void operator()(const StylesData *object) const;
- -};
- -
- -typedef std::unique_ptr<const StylesData, StylesDataDeleter> StylesDataConstPtr;
- -
- //! Цвет.
- class Color
- {
- diff --git a/Projects/Carto/Carto/Viewport.h b/Projects/Carto/Carto/Viewport.h
- index 8f7a58e..2109d1f 100644
- --- a/Projects/Carto/Carto/Viewport.h
- +++ b/Projects/Carto/Carto/Viewport.h
- @@ -55,18 +55,29 @@ public:
- public: // IViewport
- virtual ViewportId id() const override;
- +
- virtual void add_project(
- - const IProjectPtr & project,
- - const IViewSettingsPtr &view_settings,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function) override;
- - virtual void add_project(const IProjectPtr & project, const IViewSettingsPtr &view_settings, const StylesData& project_view_data) override;
- - virtual StylesDataConstPtr prepare_project_styles_data(
- + const IProjectPtr &project,
- + const IViewSettingsPtr &view_settings,
- + const std::shared_ptr<Styles> &styles) override;
- +
- + virtual std::shared_ptr<Styles> prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function) const override;
- - virtual void remove_project(const IProjectPtr & project) override;
- + const DataValidationErrorsFunction &data_validation_errors_callback) const override;
- +
- + virtual void free_styles(
- + const std::shared_ptr<Styles> &styles) override;
- +
- + virtual std::shared_ptr<Styles> set_styles(
- + ProjectId project_id,
- + const std::shared_ptr<Styles> &styles,
- + bool play_switch_animation) override;
- +
- + virtual IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) override;
- + virtual IProjectConstPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) const override;
- +
- + virtual std::shared_ptr<Styles> remove_project(const IProjectPtr & project) override;
- virtual ICartoPtr carto() const override;
- virtual IProjectPtr project(ProjectId id) override;
- virtual IProjectConstPtr project(ProjectId id) const override;
- @@ -123,11 +134,6 @@ public: // IViewport
- virtual void set_display_label_bound_box(bool display) override;
- virtual void set_label_placement(LabelPlacement placement) override;
- - virtual void set_styles(
- - ProjectId project_id,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - bool play_switch_animation = true) override;
- virtual void set_view_settings(
- ProjectId project_id,
- const IViewSettingsPtr &view_settings,
- diff --git a/Projects/Carto/src/Carto/StyleSetCache.cpp b/Projects/Carto/src/Carto/StyleSetCache.cpp
- new file mode 100644
- index 0000000..21b8778
- --- /dev/null
- +++ b/Projects/Carto/src/Carto/StyleSetCache.cpp
- @@ -0,0 +1,102 @@
- +#include "stable.h"
- +
- +#include <tmSymbol/CSymbolContainer.h>
- +
- +#include <tmRender/ISurfaceManager.h>
- +
- +#include "StyleSetCache.h"
- +
- +namespace Carto
- +{
- +
- +namespace
- +{
- +
- +std::shared_ptr<tme::CSymbolContainer> symbols_from_source(
- + const ISurfaceManagerPtr& surface_manager,
- + const StylesLoadingData& source)
- +{
- + UNI_ASSERT(nullptr != surface_manager);
- +
- + return std::make_shared<tme::CSymbolContainer>(
- + *surface_manager,
- + source.folder,
- + source.file_name);
- +}
- +
- +} // namespace
- +
- +StylesLoadingData::StylesLoadingData(
- + UniFS::IDirPtr in_source_folder,
- + std::string in_source_file_name,
- + DataValidationErrorsFunction in_data_validation_errors_callback)
- + : folder(std::move(in_source_folder))
- + , file_name(std::move(in_source_file_name))
- + , data_validation_errors_callback(std::move(in_data_validation_errors_callback))
- +{
- +}
- +
- +Styles::Styles(const StylesLoadingData& in_source)
- + : source(in_source)
- +{
- +}
- +
- +std::shared_ptr<Styles> StyleSetCache::prepare_styles(
- + const ViewportId host_viewport_id,
- + const ISurfaceManagerPtr& reference_surface_manager,
- + const StylesLoadingData& source)
- +{
- + UNI_ASSERT(nullptr != reference_surface_manager);
- +
- + const ISurfaceManagerPtr surface_manager(reference_surface_manager->clone(true));
- +
- + const auto styles_storage = symbols_from_source(surface_manager, source);
- +
- + const auto new_styles_set = std::make_shared<Styles>(source);
- +
- + new_styles_set->viewport_id = host_viewport_id;
- + new_styles_set->storage = styles_storage;
- + new_styles_set->surface_manager = surface_manager;
- +
- + return new_styles_set;
- +}
- +
- +void StyleSetCache::look_after(const std::shared_ptr<Styles>& target)
- +{
- + UNI_ASSERT(nullptr != target);
- + style_sets_.insert(target);
- +}
- +
- +void StyleSetCache::adandon(const std::shared_ptr<Styles>& target)
- +{
- + UNI_ASSERT(nullptr != target);
- +
- + style_sets_.erase(target);
- +}
- +
- +void StyleSetCache::external_render_context_lost()
- +{
- + for (const auto& styles_set : style_sets_)
- + {
- + styles_set->storage.reset();
- + styles_set->surface_manager->purge_uploaded_surfaces();
- + }
- +}
- +
- +void StyleSetCache::external_render_context_recreated()
- +{
- + for (const auto& styles_set : style_sets_)
- + {
- + const auto new_styles_storage = symbols_from_source(styles_set->surface_manager, styles_set->source);
- +
- + styles_set->storage = new_styles_storage;
- +
- + const auto error_message = new_styles_storage->GetErrorString();
- + if (nullptr != styles_set->source.data_validation_errors_callback && false == error_message.empty())
- + {
- + styles_set->source.data_validation_errors_callback(error_message);
- + }
- + }
- +}
- +
- +} // namespace Carto
- diff --git a/Projects/Carto/src/Carto/StyleSetCache.h b/Projects/Carto/src/Carto/StyleSetCache.h
- new file mode 100644
- index 0000000..8aa6fb0
- --- /dev/null
- +++ b/Projects/Carto/src/Carto/StyleSetCache.h
- @@ -0,0 +1,65 @@
- +#pragma once
- +
- +#include <Carto/Carto/Types.h>
- +#include <Carto/Carto/TMRenderForwarding.h>
- +
- +#include "Fwd.h"
- +
- +#include <set>
- +#include <memory>
- +
- +namespace Carto
- +{
- +
- +struct StylesLoadingData final
- +{
- + StylesLoadingData(
- + UniFS::IDirPtr source_folder,
- + std::string source_file_name,
- + DataValidationErrorsFunction data_validation_errors_callback);
- +
- + const UniFS::IDirPtr folder;
- + const std::string file_name;
- + const DataValidationErrorsFunction data_validation_errors_callback;
- +};
- +
- +struct Styles final
- +{
- + explicit Styles(const StylesLoadingData& source);
- + Styles(const Styles& other) = default;
- +
- + ViewportId viewport_id;
- +
- + ISurfaceManagerPtr surface_manager;
- + ISymbolContainerPtr storage;
- +
- + const StylesLoadingData source;
- +};
- +
- +class StyleSetCache final
- +{
- +public:
- +
- + StyleSetCache() = default;
- +
- + StyleSetCache(const StyleSetCache&) = delete;
- + StyleSetCache& operator=(const StyleSetCache&) = delete;
- +
- + static std::shared_ptr<Styles> prepare_styles(
- + ViewportId host_viewport_id,
- + const ISurfaceManagerPtr& surface_manager,
- + const StylesLoadingData& source);
- +
- + void look_after(const std::shared_ptr<Styles>& styles);
- + void adandon(const std::shared_ptr<Styles>& styles);
- +
- + void external_render_context_lost();
- + void external_render_context_recreated();
- +
- +private:
- +
- + std::set<const std::shared_ptr<Styles>> style_sets_;
- +
- +};
- +
- +} // namespace Carto
- diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
- index 8769fa2..ed1b87c 100644
- --- a/Projects/Carto/src/Carto/Viewport.cpp
- +++ b/Projects/Carto/src/Carto/Viewport.cpp
- @@ -6,6 +6,8 @@
- #include <tmCore/checked_cast.h>
- #include <tmCore/OrderedVector.inl>
- #include <tmCore/make_vector_with_capacity.h>
- +#include <tmCore/range_checked_cast.h>
- +
- #include <tmRender/Loading/IViewSettings.h>
- #include <tmRender/Loading/IPlanManager.h>
- #include <tmRender/CView.h>
- @@ -45,31 +47,11 @@
- #include "ViewportLayerProxy.h"
- #include "UtilsImpl.h"
- #include "IViewSettingsPrivate.h"
- +#include "StyleSetCache.h"
- namespace Carto
- {
- -// Данные для отображения проекта
- -struct StylesData final
- -{
- - ViewportId viewport_id_;
- - ISymbolContainerPtr styles_;
- - UniFS::IDirPtr styles_folder_;
- - std::string styles_filename_;
- - ISurfaceManagerPtr surface_manager_;
- -
- - //! Флаг, который вЕводится для того, чтобы перевести состояние анимируемых объектов сцены
- - //! сраЕу в финальное состояние, например при смене стилей.
- - bool finish_animation_flag_ = false;
- -
- - DataValidationErrorsFunction data_validation_errors_function_;
- -};
- -
- -void StylesDataDeleter::operator()(const StylesData * const object) const
- -{
- - delete object;
- -}
- -
- namespace
- {
- @@ -79,7 +61,7 @@ const float g_vertical_fov = 50.f;
- class IsPrefix
- {
- public:
- - explicit IsPrefix(const std::string * target)
- + explicit IsPrefix(const std::string * const target)
- : target_(target)
- {
- UNI_ASSERT(target_);
- @@ -108,6 +90,11 @@ private:
- const std::string * target_;
- };
- +std::string get_styles_loading_errors(const Styles& source)
- +{
- + return tme::checked_cast<const tme::CSymbolContainer*>(source.storage.get())->GetErrorString();
- +}
- +
- //! Проверка того, что списки фаЕ в checklist полностью и в том же порядке входят в списки фаЕ base_list.
- bool check_valid_list_of_phases(const IViewSettingsPtr & base_list, const IViewSettingsPtr & checklist)
- {
- @@ -122,7 +109,7 @@ bool check_valid_list_of_phases(const IViewSettingsPtr & base_list, const IViewS
- const tme::tmrender::DrawingPhaseContainer & base_phases,
- const tme::tmrender::DrawingPhaseContainer & check_phases) -> bool {
- - tme::tmrender::DrawingPhaseContainer::const_iterator base_phases_it = base_phases.begin();
- + auto base_phases_it = base_phases.begin();
- for (const std::string & check_phase : check_phases)
- {
- base_phases_it = std::find(base_phases_it, base_phases.end(), check_phase);
- @@ -145,7 +132,7 @@ bool check_valid_list_of_phases(const IViewSettingsPtr & base_list, const IViewS
- class IndoorController : public IIndoorController
- {
- public:
- - typedef boost::function<bool (const IndoorPlan &)> IndoorPlanValidator;
- + typedef std::function<bool (const IndoorPlan &)> IndoorPlanValidator;
- public:
- IndoorController(
- @@ -164,17 +151,17 @@ public: // IIndoorController
- virtual PlanVisibilityMode get_plan_mode() override;
- private:
- - ViewportId viewport_id_;
- + const ViewportId viewport_id_;
- tme::tmrender::IPlanManager &plan_manager_;
- - NeedRedrawFunction need_redraw_function_;
- + const NeedRedrawFunction need_redraw_function_;
- // Функтор для проверки, иЕвестен ли нам Еаданный план.
- - IndoorPlanValidator check_plan_valid_;
- + const IndoorPlanValidator check_plan_valid_;
- };
- // IndoorController
- IndoorController::IndoorController(
- - ViewportId viewport_id,
- + const ViewportId viewport_id,
- tme::tmrender::IPlanManager &manager,
- const NeedRedrawFunction & need_redraw_function,
- const IndoorPlanValidator & plan_validator)
- @@ -205,9 +192,9 @@ std::vector<IndoorPlan> IndoorController::get_visible_plans() const
- const tme::tmrender::OrderedPlansContainer internal_ids =
- plan_manager_.get_active_plans(viewport_id_);
- - std::vector<IndoorPlan> result = tme::make_vector_with_capacity<IndoorPlan>(internal_ids.size());
- + auto result = tme::make_vector_with_capacity<IndoorPlan>(internal_ids.size());
- - for (const tme::tmrender::PlanID &plan : internal_ids)
- + for (const auto &plan : internal_ids)
- {
- result.emplace_back(
- ObjectComplexId(
- @@ -247,7 +234,7 @@ void IndoorController::reset_visible_plan(const ObjectComplexId &object_id)
- }
- }
- -void IndoorController::set_plan_mode(PlanVisibilityMode new_mode)
- +void IndoorController::set_plan_mode(const PlanVisibilityMode new_mode)
- {
- const PlanVisibilityMode current_mode = plan_manager_.get_plan_mode(viewport_id_);
- if (current_mode != new_mode)
- @@ -309,21 +296,29 @@ public: // IViewportPrivate
- public:
- ViewportId id() const;
- +
- void add_project(
- - const IProjectPtr & project,
- + const IProjectPtr &project,
- const IViewSettingsPtr &view_settings,
- + const std::shared_ptr<Styles> &project_view_data);
- +
- + std::shared_ptr<Styles> prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function);
- - void add_project(
- - const IProjectPtr& project,
- - const IViewSettingsPtr& view_settings,
- - const StylesData& project_view_data);
- - StylesDataConstPtr prepare_project_styles_data(
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function) const;
- - void remove_project(const IProjectPtr & project);
- + const DataValidationErrorsFunction &data_validation_errors_callback) const;
- +
- + std::shared_ptr<Styles> set_styles(
- + ProjectId project_id,
- + const std::shared_ptr<Styles> &styles,
- + bool play_switch_animation);
- +
- + void free_styles(
- + const std::shared_ptr<Styles> &styles);
- +
- + IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles);
- + IProjectConstPtrContainer const_projects_with_styles(const std::shared_ptr<Styles> &styles) const;
- +
- + std::shared_ptr<Styles> remove_project(const IProjectPtr & project);
- ICartoPtr carto() const;
- IProjectPtr project(ProjectId id);
- IProjectPtrContainer projects();
- @@ -382,11 +377,7 @@ public:
- ProjectId project_id,
- const IViewSettingsPtr &view_settings,
- bool play_switch_animation);
- - void set_styles(
- - ProjectId project_id,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - bool play_switch_animation);
- +
- boost::optional<float> max_3d_scale(ProjectId project_id) const;
- IViewSettingsPtr view_settings(ProjectId project_id) const;
- IIndoorController & indoor_controller();
- @@ -438,7 +429,7 @@ public:
- void process_cancel();
- private: // Types
- - struct SelectionViewData
- + struct SelectionViewData final
- {
- ISelectionPtr selection;
- ISelectionViewPtr selection_view;
- @@ -446,7 +437,7 @@ private: // Types
- };
- typedef boost::unordered_map<const ISelection *, SelectionViewData> SelectionViewMap;
- - struct LayerViewData
- + struct LayerViewData final
- {
- LayerViewData(
- const ProjectId in_project_id,
- @@ -465,8 +456,7 @@ private: // Types
- const std::string layer_name;
- const ILayerViewPtr view;
- - private:
- - const LayerViewData & operator=(const LayerViewData &);
- + const LayerViewData & operator=(const LayerViewData &) = delete;
- };
- struct LayerIdTag;
- @@ -493,20 +483,27 @@ private: // Types
- {
- ProjectWithView(
- const IProjectPtr& in_project,
- - const MapBox& in_project_bounding_box,
- + const MapBox& in_bounding_box,
- const IViewSettingsPtr& in_view_settings,
- - const StylesData& in_view)
- + std::shared_ptr<Styles> in_styles)
- : project(in_project)
- - , project_bounding_box(in_project_bounding_box)
- + , bounding_box(in_bounding_box)
- , view_settings(in_view_settings)
- - , visual(in_view)
- + , styles(std::move(in_styles))
- {
- + in_styles.reset();
- }
- IProjectPtr project;
- - MapBox project_bounding_box;
- + MapBox bounding_box;
- IViewSettingsPtr view_settings;
- - StylesData visual;
- + std::shared_ptr<Styles> styles;
- +
- + /*
- + Флаг, который вЕводится для того, чтобы перевести состояние анимируемых объектов сцены сраЕу в финальное
- + состояние, например при смене стилей.
- + */
- + bool finish_animation = false;
- };
- typedef LayerViewContainer::index<LayerIdTag>::type LayerIdIndex;
- @@ -514,7 +511,7 @@ private: // Types
- typedef boost::unordered_map<DrawingType, HeavyOperationSettings> DrawingTypeMap;
- - typedef boost::unordered_map<ProjectId, ProjectWithView> ProjectViewMap;
- + typedef boost::unordered_map<ProjectId, ProjectWithView> ProjectMap;
- typedef boost::unordered_set<IViewportDeletionListenerPtr> IViewportDeletionListenerContainer;
- private:
- @@ -585,7 +582,7 @@ private:
- ViewportSize size_;
- - ProjectViewMap project_views_;
- + ProjectMap projects_;
- SelectionViewMap selection_views_;
- @@ -608,21 +605,23 @@ private:
- tme::tmrender::RenderStartup render_startup_;
- std::unique_ptr<IndoorController> indoor_controller_;
- +
- + StyleSetCache style_set_cache_;
- };
- Viewport::Impl::Impl(
- IViewport &parent,
- const ICartoPtr &in_carto,
- const std::shared_ptr<tme::tmrender::IRender> &render,
- - bool in_has_multisampling,
- - DeviceType in_device_type,
- - LoadingType in_loading_type,
- + const bool in_has_multisampling,
- + const DeviceType in_device_type,
- + const LoadingType in_loading_type,
- const ISurfaceManagerPtr &in_surface_manager,
- const NeedRedrawFunction &need_redraw_function,
- const PresentFunction &present_function,
- const std::vector<std::string> &force_visible_layers,
- const std::vector<std::string> &force_invisible_layers,
- - bool is_primary_viewport,
- + const bool is_primary_viewport,
- const DrawingTypeChangeNotification &drawing_type_changed_notification)
- : parent_(parent)
- , carto_(in_carto)
- @@ -766,7 +765,7 @@ Viewport::Impl::Impl(
- id(),
- carto_->private_interface().get_plan_manager(),
- need_redraw_function_,
- - boost::bind(&Impl::check_plan_valid, this, _1)));
- + std::bind(&Impl::check_plan_valid, this, std::placeholders::_1)));
- }
- Viewport::Impl::~Impl()
- @@ -784,11 +783,11 @@ Viewport::Impl::~Impl()
- selection_views_.clear();
- - for (const ProjectViewMap::value_type & project_view : project_views_)
- + for (const auto& item : projects_)
- {
- - carto_->private_interface().remove_project(project_view.second.project, parent_);
- + carto_->private_interface().remove_project(item.second.project, parent_);
- }
- - project_views_.clear();
- + projects_.clear();
- // Отображения слоев layer_views_ автоматически удаляются при удалении всех проектов иЕ порта просмотра.
- carto_->private_interface().remove_viewport(parent_);
- @@ -807,94 +806,124 @@ ViewportId Viewport::Impl::id() const
- return ViewportId(reinterpret_cast<boost::uintptr_t>(view_.get()));
- }
- -void Viewport::Impl::add_project(
- - const IProjectPtr &in_project,
- - const IViewSettingsPtr &in_view_settings,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function)
- +std::shared_ptr<Styles> Viewport::Impl::set_styles(
- + const ProjectId project_id,
- + const std::shared_ptr<Styles>& styles,
- + const bool play_switch_animation)
- {
- - check_project_before_add(in_project, in_view_settings);
- + UNI_ASSERT(nullptr != styles);
- - add_project(in_project, in_view_settings, *prepare_project_styles_data(
- - style_folder,
- - style_file_name,
- - data_validation_errors_function).get());
- + const auto target_project = projects_.find(project_id);
- +
- + if (target_project != projects_.end())
- + {
- + style_set_cache_.look_after(styles);
- +
- + const auto old_styles = target_project->second.styles;
- + target_project->second.styles = styles;
- + target_project->second.finish_animation = !play_switch_animation;
- +
- + carto_->private_interface().set_viewport_styles(
- + project_id,
- + id(),
- + styles->storage,
- + nullptr);
- +
- + process_dynamic_views(
- + [&styles](IDynamicLayerView* const dynamic_layer_view)
- + {
- + dynamic_layer_view->set_styles(styles->storage);
- + });
- +
- + need_redraw_function_();
- + return old_styles;
- + }
- +
- + UNILOG_WARNING << "trying to set styles on a absent project with id " << project_id;
- + return {};
- +}
- +
- +void Viewport::Impl::free_styles(const std::shared_ptr<Styles>& styles)
- +{
- + UNI_ASSERT(nullptr != styles);
- +
- +#ifdef UNI_ASSERT_ENABLED
- + for (const auto& item : projects_)
- + {
- + if (item.second.styles == styles)
- + {
- + UNILOG_WARNING << "freeing styles bound to a project";
- + break;
- + }
- + }
- +#endif // #ifdef UNI_ASSERT_ENABLED
- +
- + style_set_cache_.adandon(styles);
- }
- void Viewport::Impl::add_project(
- const IProjectPtr& in_project,
- const IViewSettingsPtr& in_view_settings,
- - const StylesData& in_project_view_data)
- + const std::shared_ptr<Styles>& in_styles)
- {
- - UNI_ASSERT(in_project_view_data.viewport_id_ == id());
- + UNI_ASSERT(in_styles->viewport_id == id());
- check_project_before_add(in_project, in_view_settings);
- - project_views_.emplace(
- + projects_.emplace(
- in_project->id(),
- ProjectWithView
- {
- in_project,
- in_project->bounding_box(),
- in_view_settings,
- - in_project_view_data
- + in_styles
- });
- - std::string error_string
- - = tme::checked_cast<tme::CSymbolContainer*>(in_project_view_data.styles_.get())->GetErrorString();
- + auto error_string = get_styles_loading_errors(*in_styles);
- +
- + const auto data_validation_errors_callback = in_styles->source.data_validation_errors_callback;
- // Регистрируем проект в Carto и ЕагруЕчике
- carto_->private_interface().add_project(
- in_project,
- parent_,
- in_view_settings,
- - in_project_view_data.styles_,
- + in_styles->storage,
- models_visibility_type_,
- - in_project_view_data.data_validation_errors_function_ ? &error_string : nullptr);
- + data_validation_errors_callback ? &error_string : nullptr);
- - if (in_project_view_data.data_validation_errors_function_ && !error_string.empty())
- + if (data_validation_errors_callback && !error_string.empty())
- {
- - in_project_view_data.data_validation_errors_function_(error_string);
- + data_validation_errors_callback(error_string);
- }
- +
- + style_set_cache_.look_after(in_styles);
- }
- -StylesDataConstPtr Viewport::Impl::prepare_project_styles_data(
- +std::shared_ptr<Styles> Viewport::Impl::prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function) const
- + const DataValidationErrorsFunction &data_validation_errors_callback) const
- {
- - // РспольЕуем РєСЌС€ картинок
- - ISurfaceManagerPtr project_view_surface_manager(surface_manager_->clone(true));
- -
- - // CSymbolContainer должен быть Еависимым от проекта, т.к. для аниматоров и
- - // условных Енаков требуется Енать scale проекта для правильного вычисления LMU
- - ISymbolContainerPtr local_styles = std::make_shared<tme::CSymbolContainer>(
- - *project_view_surface_manager,
- - style_folder,
- - style_file_name);
- -
- - // Сохраняем информацию о проекте и его настройках отображения
- - const auto project_view_data = new StylesData;
- - project_view_data->viewport_id_ = id();
- - project_view_data->styles_ = local_styles;
- - project_view_data->styles_folder_ = style_folder;
- - project_view_data->styles_filename_ = style_file_name;
- - project_view_data->surface_manager_ = project_view_surface_manager;
- - project_view_data->data_validation_errors_function_ = data_validation_errors_function;
- -
- - return StylesDataConstPtr(project_view_data);
- + return StyleSetCache::prepare_styles(
- + id(),
- + surface_manager_,
- + { style_folder, style_file_name, data_validation_errors_callback });
- }
- -void Viewport::Impl::remove_project(const IProjectPtr &in_project)
- +std::shared_ptr<Styles> Viewport::Impl::remove_project(const IProjectPtr &in_project)
- {
- carto_->private_interface().remove_project(in_project, parent_);
- - ProjectViewMap::iterator project_view_iter = project_views_.find(in_project->id());
- - UNI_ASSERT(project_view_iter != project_views_.end());
- - project_views_.erase(project_view_iter);
- + const auto project_view_iter = projects_.find(in_project->id());
- + const auto styles = project_view_iter->second.styles;
- + UNI_ASSERT(project_view_iter != projects_.end());
- + projects_.erase(project_view_iter);
- // GTODO: unregister screen coordinates ?
- +
- + return styles;
- }
- std::chrono::milliseconds Viewport::Impl::current_time() const
- @@ -914,14 +943,14 @@ DeviceType Viewport::Impl::device_type() const
- ISymbolContainerPtr Viewport::Impl::styles(const ProjectId project_id) const
- {
- - ProjectViewMap::const_iterator project_iter = project_views_.find(project_id);
- - if (project_iter != project_views_.end())
- + const auto project_iter = projects_.find(project_id);
- + if (project_iter != projects_.end())
- {
- - UNI_ASSERT(project_iter->second.visual.styles_);
- - return project_iter->second.visual.styles_;
- + UNI_ASSERT(project_iter->second.styles->storage);
- + return project_iter->second.styles->storage;
- }
- - return{};
- + return {};
- }
- void Viewport::Impl::add_layer_view(
- @@ -932,10 +961,10 @@ void Viewport::Impl::add_layer_view(
- UNI_ASSERT(layer_view);
- #ifdef UNI_ASSERT_ENABLED
- - LayerIdIndex &id_index = layer_views_.get<LayerIdTag>();
- + const LayerIdIndex &id_index = layer_views_.get<LayerIdTag>();
- UNI_ASSERT(id_index.find(boost::make_tuple(layer_id.project_id, layer_id.layer_id)) == id_index.end());
- - LayerNameIndex &name_index = layer_views_.get<LayerNameTag>();
- + const LayerNameIndex &name_index = layer_views_.get<LayerNameTag>();
- UNI_ASSERT(name_index.find(boost::make_tuple(layer_id.project_id, layer_name)) == name_index.end());
- #endif
- @@ -949,7 +978,7 @@ void Viewport::Impl::add_layer_view(
- layer_view->force_visibility(false);
- }
- - LayerViewData data(layer_id.project_id, layer_id.layer_id, layer_name, layer_view);
- + const LayerViewData data(layer_id.project_id, layer_id.layer_id, layer_name, layer_view);
- layer_views_.insert(data);
- }
- @@ -962,7 +991,7 @@ void Viewport::Impl::remove_layer_view(const LayerComplexId & layer_id)
- }
- LayerIdIndex &id_index = layer_views_.get<LayerIdTag>();
- - LayerIdIndex::iterator it = id_index.find(boost::make_tuple(layer_id.project_id, layer_id.layer_id));
- + const auto it = id_index.find(boost::make_tuple(layer_id.project_id, layer_id.layer_id));
- UNI_ASSERT(it != id_index.end());
- id_index.erase(it);
- @@ -978,7 +1007,7 @@ tme::tmrender::Map * Viewport::Impl::scene() const
- return map_;
- }
- -tme::tmrender::City * Viewport::Impl::city(ProjectId project_id) const
- +tme::tmrender::City * Viewport::Impl::city(const ProjectId project_id) const
- {
- return carto_->private_interface().city(project_id, id()).get();
- }
- @@ -993,18 +1022,19 @@ ICartoPtr Viewport::Impl::carto() const
- return carto_;
- }
- -IProjectPtr Viewport::Impl::project(ProjectId in_id)
- +IProjectPtr Viewport::Impl::project(const ProjectId in_id)
- {
- - ProjectViewMap::iterator project_view_iter = project_views_.find(in_id);
- - UNI_ASSERT(project_view_iter != project_views_.end());
- + const auto found = projects_.find(in_id);
- + UNI_ASSERT(found != projects_.end());
- - return project_view_iter->second.project;
- + return found->second.project;
- }
- IProjectPtrContainer Viewport::Impl::projects()
- {
- - IProjectPtrContainer project_container;
- - for (const ProjectViewMap::value_type & item : project_views_)
- + auto project_container = tme::make_vector_with_capacity<IProjectPtr>(projects_.size());
- +
- + for (const auto& item : projects_)
- {
- project_container.push_back(item.second.project);
- }
- @@ -1014,8 +1044,9 @@ IProjectPtrContainer Viewport::Impl::projects()
- IProjectConstPtrContainer Viewport::Impl::const_projects() const
- {
- - IProjectConstPtrContainer project_container;
- - for (const ProjectViewMap::value_type & item : project_views_)
- + auto project_container = tme::make_vector_with_capacity<IProjectConstPtr>(projects_.size());
- +
- + for (const auto& item : projects_)
- {
- project_container.push_back(item.second.project);
- }
- @@ -1023,25 +1054,55 @@ IProjectConstPtrContainer Viewport::Impl::const_projects() const
- return project_container;
- }
- +IProjectPtrContainer Viewport::Impl::projects_with_styles(const std::shared_ptr<Styles> &styles)
- +{
- + auto result = tme::make_vector_with_capacity<IProjectPtr>(projects_.size());
- +
- + for (const auto& item : projects_)
- + {
- + if (item.second.styles == styles)
- + {
- + result.push_back(item.second.project);
- + }
- + }
- +
- + return result;
- +}
- +
- +IProjectConstPtrContainer Viewport::Impl::const_projects_with_styles(const std::shared_ptr<Styles> &styles) const
- +{
- + auto result = tme::make_vector_with_capacity<IProjectConstPtr>(projects_.size());
- +
- + for (const auto& item : projects_)
- + {
- + if (item.second.styles == styles)
- + {
- + result.push_back(item.second.project);
- + }
- + }
- +
- + return result;
- +}
- +
- IProjectPtrContainer Viewport::Impl::visible_projects() const
- {
- - if (project_views_.empty())
- + if (projects_.empty())
- {
- return IProjectPtrContainer();
- }
- - boost::optional<PlanePoint> map_top_left = screen_coordinates_->screen_to_map_clipped(
- + const boost::optional<PlanePoint> map_top_left = screen_coordinates_->screen_to_map_clipped(
- ScreenPoint(0, 0));
- UNI_ASSERT(map_top_left);
- - boost::optional<PlanePoint> map_top_right = screen_coordinates_->screen_to_map_clipped(
- + const boost::optional<PlanePoint> map_top_right = screen_coordinates_->screen_to_map_clipped(
- ScreenPoint(static_cast<ScreenUnit>(size_.width), 0));
- UNI_ASSERT(map_top_right);
- - boost::optional<PlanePoint> map_bottom_right =
- + const boost::optional<PlanePoint> map_bottom_right =
- screen_coordinates_->screen_to_map_clipped(ScreenPoint(
- static_cast<ScreenUnit>(size_.width),
- static_cast<ScreenUnit>(size_.height)));
- UNI_ASSERT(map_bottom_right);
- - boost::optional<PlanePoint> map_bottom_left = screen_coordinates_->screen_to_map_clipped(
- + const boost::optional<PlanePoint> map_bottom_left = screen_coordinates_->screen_to_map_clipped(
- ScreenPoint(0, static_cast<ScreenUnit>(size_.height)));
- UNI_ASSERT(map_bottom_left);
- @@ -1064,11 +1125,13 @@ IProjectPtrContainer Viewport::Impl::visible_projects() const
- screen_points.erase(screen_points.end() - 1);
- }
- UNI_ASSERT(screen_points.size() >= 3);
- - IGeometryConstPtr screen_geometry = create_polygon_geometry(screen_points);
- + const IGeometryConstPtr screen_geometry = create_polygon_geometry(screen_points);
- const Scale & scale = navigator_->position().scale;
- - IProjectPtrContainer result;
- - for (const ProjectViewMap::value_type & item : project_views_)
- +
- + auto project_container = tme::make_vector_with_capacity<IProjectPtr>(projects_.size());
- +
- + for (const ProjectMap::value_type & item : projects_)
- {
- if (item.second.project->scale_limits().contains(scale))
- {
- @@ -1076,37 +1139,39 @@ IProjectPtrContainer Viewport::Impl::visible_projects() const
- IGeometryConstPtr project_geometry = create_polygon_geometry(project_rect);
- if (screen_geometry->is_intersects(*project_geometry))
- {
- - result.push_back(item.second.project);
- + project_container.push_back(item.second.project);
- }
- }
- }
- - return result;
- + return project_container;
- }
- IProjectConstPtrContainer Viewport::Impl::visible_const_projects() const
- {
- - IProjectConstPtrContainer result;
- - for (const IProjectPtr & item : visible_projects())
- + const auto visible = visible_projects();
- +
- + auto result = tme::make_vector_with_capacity<IProjectConstPtr>(visible.size());
- + for (const auto& item : visible)
- {
- result.push_back(item);
- }
- return result;
- }
- -IViewportLayerProxyPtr Viewport::Impl::layer(ProjectId project_id, const std::string &name) const
- +IViewportLayerProxyPtr Viewport::Impl::layer(const ProjectId project_id, const std::string &name) const
- {
- const LayerNameIndex &name_index = layer_views_.get<LayerNameTag>();
- - LayerNameIndex::iterator it = name_index.find(boost::make_tuple(project_id, name));
- + const auto found_layer = name_index.find(boost::make_tuple(project_id, name));
- - if (it != name_index.end())
- + if (found_layer != name_index.end())
- {
- - return std::make_shared<ViewportLayerProxy>(it->view);
- + return std::make_shared<ViewportLayerProxy>(found_layer->view);
- }
- - return IViewportLayerProxyPtr();
- + return {};
- }
- -IViewportLayerProxyPtr Viewport::Impl::layer(ProjectId project_id, LayerId layer_id) const
- +IViewportLayerProxyPtr Viewport::Impl::layer(const ProjectId project_id, const LayerId layer_id) const
- {
- const LayerIdIndex &id_index = layer_views_.get<LayerIdTag>();
- LayerIdIndex::iterator it = id_index.find(boost::make_tuple(project_id, layer_id));
- @@ -1116,7 +1181,7 @@ IViewportLayerProxyPtr Viewport::Impl::layer(ProjectId project_id, LayerId layer
- return std::make_shared<ViewportLayerProxy>(it->view);
- }
- - return IViewportLayerProxyPtr();
- + return {};
- }
- void Viewport::Impl::add_selection(
- @@ -1130,21 +1195,21 @@ void Viewport::Impl::add_selection(
- selection_view_data.selection_view = selection->private_interface().create_view(parent_, color);
- selection_view_data.color = color;
- - selection_views_.insert(std::make_pair(selection.get(), selection_view_data));
- + selection_views_.emplace(selection.get(), selection_view_data);
- }
- -void Viewport::Impl::remove_selection(const ISelection * selection)
- +void Viewport::Impl::remove_selection(const ISelection * const selection)
- {
- - SelectionViewMap::iterator it = selection_views_.find(selection);
- - UNI_ASSERT(it != selection_views_.end());
- + const auto found_selection = selection_views_.find(selection);
- + UNI_ASSERT(found_selection != selection_views_.end());
- - selection_views_.erase(it);
- + selection_views_.erase(found_selection);
- }
- std::vector<ISelectionPtr> Viewport::Impl::selections()
- {
- std::vector<ISelectionPtr> viewport_selections;
- - for (const SelectionViewMap::value_type & item : selection_views_)
- + for (const auto & item : selection_views_)
- {
- viewport_selections.push_back(item.second.selection);
- }
- @@ -1156,7 +1221,7 @@ ViewportProjectionType Viewport::Impl::projection() const
- return projection_;
- }
- -void Viewport::Impl::set_projection(ViewportProjectionType type)
- +void Viewport::Impl::set_projection(const ViewportProjectionType type)
- {
- if (projection_ != type)
- {
- @@ -1276,25 +1341,27 @@ MapBox Viewport::Impl::bounding_box_all_projects() const
- {
- MapBox global_map_box;
- global_map_box.set_invalid();
- - for (const ProjectViewMap::value_type & item : project_views_)
- + for (const auto& slave_project : projects_)
- {
- - global_map_box.expand(item.second.project_bounding_box);
- + global_map_box.expand(slave_project.second.bounding_box);
- }
- return global_map_box;
- }
- MapBox Viewport::Impl::bounding_box_visible_projects() const
- {
- - IProjectConstPtrContainer vis_projects = visible_const_projects();
- + const auto visible_projects_container = visible_const_projects();
- MapBox global_map_box;
- global_map_box.set_invalid();
- - for (const IProjectConstPtr & item : vis_projects)
- +
- + for (const auto& item : visible_projects_container)
- {
- - ProjectViewMap::const_iterator it = project_views_.find(item->id());
- - UNI_ASSERT(it != project_views_.end());
- - global_map_box.expand(it->second.project_bounding_box);
- + const auto visible_project = projects_.find(item->id());
- + UNI_ASSERT(visible_project != projects_.end());
- + global_map_box.expand(visible_project->second.bounding_box);
- }
- +
- return global_map_box;
- }
- @@ -1376,7 +1443,7 @@ AnimationType Viewport::Impl::animation_type() const
- return animation_type_;
- }
- -void Viewport::Impl::set_animation_type(AnimationType type)
- +void Viewport::Impl::set_animation_type(const AnimationType type)
- {
- if (type != animation_type_)
- {
- @@ -1394,7 +1461,7 @@ DrawingType Viewport::Impl::drawing_type() const
- return drawing_type_;
- }
- -void Viewport::Impl::set_drawing_type(DrawingType type)
- +void Viewport::Impl::set_drawing_type(const DrawingType type)
- {
- if (type != drawing_type_)
- {
- @@ -1405,17 +1472,17 @@ void Viewport::Impl::set_drawing_type(DrawingType type)
- }
- }
- -HeavyOperationSettings Viewport::Impl::drawing_flags(DrawingType type) const
- +HeavyOperationSettings Viewport::Impl::drawing_flags(const DrawingType type) const
- {
- - DrawingTypeMap::const_iterator it = flags_.find(type);
- + const auto it = flags_.find(type);
- UNI_ASSERT(it != flags_.end());
- return it->second;
- }
- void Viewport::Impl::set_drawing_flags(
- - DrawingType type,
- - HeavyOperationSettings flags)
- + const DrawingType type,
- + const HeavyOperationSettings flags)
- {
- UNI_ASSERT(flags_.find(type) != flags_.end());
- @@ -1434,7 +1501,7 @@ LoadingType Viewport::Impl::loading_type() const
- }
- }
- -void Viewport::Impl::set_loading_type(LoadingType type)
- +void Viewport::Impl::set_loading_type(const LoadingType type)
- {
- view_->setLoadingSynchronous(type == LoadingTypeSynchronous);
- }
- @@ -1444,7 +1511,7 @@ VisibilityType Viewport::Impl::models_visibility_type() const
- return models_visibility_type_;
- }
- -void Viewport::Impl::set_models_visibility_type(VisibilityType type)
- +void Viewport::Impl::set_models_visibility_type(const VisibilityType type)
- {
- if (models_visibility_type_ != type)
- {
- @@ -1461,7 +1528,7 @@ LabelingMode Viewport::Impl::labeling_mode() const
- return labeling_mode_;
- }
- -void Viewport::Impl::set_labeling_mode(LabelingMode mode)
- +void Viewport::Impl::set_labeling_mode(const LabelingMode mode)
- {
- switch (mode)
- {
- @@ -1496,38 +1563,41 @@ void Viewport::Impl::set_labeling_cache(const ILabelingCachePtr &labeling_cache)
- labeling_cache_ = labeling_cache;
- }
- -void Viewport::Impl::set_display_label_bound_box(bool display)
- +void Viewport::Impl::set_display_label_bound_box(const bool display)
- {
- map_->setDisplayLabelBoundBox(display);
- need_redraw();
- }
- void Viewport::Impl::set_view_settings(
- - ProjectId project_id,
- + const ProjectId project_id,
- const IViewSettingsPtr &in_view_settings,
- - bool play_switch_animation)
- + const bool play_switch_animation)
- {
- - ProjectViewMap::iterator project_iter = project_views_.find(project_id);
- - if (project_iter != project_views_.end())
- + const auto found_project = projects_.find(project_id);
- + if (found_project != projects_.end())
- {
- - StylesData & project_data = project_iter->second.visual;
- - project_iter->second.project->private_interface().remove_viewport(parent_);
- + const auto project_styles = found_project->second.styles;
- + found_project->second.project->private_interface().remove_viewport(parent_);
- std::string error_string;
- - project_iter->second.view_settings = in_view_settings;
- + found_project->second.view_settings = in_view_settings;
- +
- + const auto styles_loading_errors_callback = project_styles->source.data_validation_errors_callback;
- +
- carto_->private_interface().set_viewport_view(
- project_id,
- id(),
- in_view_settings,
- - project_data.styles_,
- - project_data.data_validation_errors_function_ ? &error_string : nullptr);
- + project_styles->storage,
- + styles_loading_errors_callback ? &error_string : nullptr);
- - project_iter->second.project->private_interface().connect_viewport(parent_);
- - project_data.finish_animation_flag_ = !play_switch_animation;
- + found_project->second.project->private_interface().connect_viewport(parent_);
- + found_project->second.finish_animation = !play_switch_animation;
- need_redraw_function_();
- - if (project_data.data_validation_errors_function_ && !error_string.empty())
- + if (styles_loading_errors_callback && !error_string.empty())
- {
- - project_data.data_validation_errors_function_(error_string);
- + styles_loading_errors_callback(error_string);
- }
- }
- else
- @@ -1541,69 +1611,22 @@ const tme::tmrender::ISurfaceManager & Viewport::Impl::surface_manager() const
- return *surface_manager_;
- }
- -void Viewport::Impl::set_styles(
- - ProjectId project_id,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - bool play_switch_animation)
- -{
- - ProjectViewMap::iterator project_iter = project_views_.find(project_id);
- - if (project_iter != project_views_.end())
- - {
- - StylesData & project_view = project_iter->second.visual;
- -
- - UNI_ASSERT(project_view.styles_);
- -
- - std::string error_string;
- - const auto new_styles
- - = std::make_shared<tme::CSymbolContainer>(
- - *project_view.surface_manager_,
- - style_folder,
- - style_file_name);
- - error_string += new_styles->GetErrorString();
- -
- - project_view.styles_ = new_styles;
- - project_view.styles_folder_ = style_folder;
- - project_view.styles_filename_ = style_file_name;
- -
- - carto_->private_interface().set_viewport_styles(
- - project_id,
- - id(),
- - project_view.styles_,
- - project_view.data_validation_errors_function_ ? &error_string : nullptr);
- - if (project_view.data_validation_errors_function_ && !error_string.empty())
- - {
- - project_view.data_validation_errors_function_(error_string);
- - }
- -
- - process_dynamic_views(
- - std::bind(&IDynamicLayerView::set_styles,
- - std::placeholders::_1,
- - std::cref(project_view.styles_)));
- -
- - project_view.finish_animation_flag_ = !play_switch_animation;
- - need_redraw_function_();
- - }
- -}
- -
- -boost::optional<float> Viewport::Impl::max_3d_scale(ProjectId project_id) const
- +boost::optional<float> Viewport::Impl::max_3d_scale(const ProjectId project_id) const
- {
- return view_settings(project_id)->private_interface().view_settings()->get_max_3d_scale(
- device_type_to_internal(device_type_));
- }
- -IViewSettingsPtr Viewport::Impl::view_settings(ProjectId project_id) const
- +IViewSettingsPtr Viewport::Impl::view_settings(const ProjectId project_id) const
- {
- - ProjectViewMap::const_iterator project_iter = project_views_.find(project_id);
- - if (project_iter != project_views_.end())
- + const auto host_project = projects_.find(project_id);
- + if (host_project != projects_.end())
- {
- - UNI_ASSERT(project_iter->second.view_settings);
- - return project_iter->second.view_settings;
- - }
- - else
- - {
- - return IViewSettingsPtr();
- + UNI_ASSERT(host_project->second.view_settings);
- + return host_project->second.view_settings;
- }
- +
- + return {};
- }
- IIndoorController & Viewport::Impl::indoor_controller()
- @@ -1633,15 +1656,14 @@ void Viewport::Impl::force_render_init()
- }
- void Viewport::Impl::external_render_context_lost()
- -{
- - for (ProjectViewMap::value_type &project_view_pair : project_views_)
- +{
- + style_set_cache_.external_render_context_lost();
- +
- + for (auto& item : projects_)
- {
- - // удалим ссылку на условные Енаки
- - project_view_pair.second.visual.styles_.reset();
- - // удалим иЕ кэша картинок некорректные картинки
- - project_view_pair.second.visual.surface_manager_->purge_uploaded_surfaces();
- - carto_->private_interface().remove_project(project_view_pair.second.project, parent_);
- + carto_->private_interface().remove_project(item.second.project, parent_);
- }
- +
- // удалим последние ссылки на ресурсы отрисовки
- view_->getRenderTree().clearChilds();
- @@ -1656,44 +1678,34 @@ void Viewport::Impl::external_render_context_lost()
- void Viewport::Impl::external_render_context_recreated()
- {
- +
- #ifdef TM_USE_EXTERNAL_RENDER
- if (render_)
- {
- render_->init(render_startup_);
- }
- #endif // TM_USE_EXTERNAL_RENDER
- - for (ProjectViewMap::value_type &project_view_pair : project_views_)
- - {
- - StylesData & project_view = project_view_pair.second.visual;
- -
- - // соЕдадим условные Енаки
- - std::string error_string;
- - const auto new_styles = std::make_shared<tme::CSymbolContainer>(
- - *project_view.surface_manager_,
- - project_view.styles_folder_,
- - project_view.styles_filename_);
- - error_string += new_styles->GetErrorString();
- -
- - project_view.styles_ = new_styles;
- - if (project_view.data_validation_errors_function_ && !error_string.empty())
- - {
- - project_view.data_validation_errors_function_(error_string);
- - }
- +
- + style_set_cache_.external_render_context_recreated();
- + for (const auto& item : projects_)
- + {
- carto_->private_interface().add_project(
- - project_view_pair.second.project,
- + item.second.project,
- parent_,
- - project_view_pair.second.view_settings,
- - project_view.styles_,
- + item.second.view_settings,
- + item.second.styles->storage,
- models_visibility_type_,
- nullptr);
- }
- // Сообщим всем, что нужно пересоЕдать сцену
- {
- + const auto width = tme::range_checked_cast<int>(size_.width);
- + const auto height = tme::range_checked_cast<int>(size_.height);
- +
- view_->beginChanging();
- - view_->changeFrameSize(
- - tmmath::vector2i(int(size_.width), int(size_.height)));
- + view_->changeFrameSize({ width, height});
- view_->endChanging();
- //! Местоположение и направление камеры.
- @@ -1707,7 +1719,7 @@ void Viewport::Impl::external_render_context_recreated()
- }
- // Сообщим приложению, что сцену надо перерисовать
- - if (!project_views_.empty())
- + if (!projects_.empty())
- {
- need_redraw_function_();
- }
- @@ -1725,10 +1737,12 @@ const IViewportPrivate & Viewport::Impl::private_interface() const
- bool Viewport::Impl::check_plan_valid(const IndoorPlan & plan) const
- {
- - const auto it = project_views_.find(plan.object_id.project_id);
- + const auto it = projects_.find(plan.object_id.project_id);
- +
- + // Здание должно иметь этажи.
- + UNI_ASSERT(projects_.end() != it);
- - UNI_ASSERT(project_views_.end() != it); //<- Здание не имеет этажей.
- - if (project_views_.end() != it)
- + if (projects_.end() != it)
- {
- const std::vector<PlanInternalID> plans
- = it->second.project->indoor_data().plans_for_object(plan.object_id);
- @@ -1901,7 +1915,7 @@ void Viewport::Impl::apply_drawing_type_internal()
- bool Viewport::Impl::animate_projects(tme::tmrender::AnimationContext & context)
- {
- bool is_redraw_needed = false;
- - for (ProjectViewMap::value_type & item : project_views_)
- + for (auto & item : projects_)
- {
- CityPtr city_view = carto_->private_interface().city(item.first, id());
- UNI_ASSERT(city_view);
- @@ -1917,11 +1931,11 @@ bool Viewport::Impl::animate_projects(tme::tmrender::AnimationContext & context)
- context.scene_animation_mode = tme::tmrender::SceneAnimationMode::Instant;
- break;
- }
- - if (item.second.visual.finish_animation_flag_)
- + if (item.second.finish_animation)
- {
- // Переводим аниматоры сраЕу в конечное состояние.
- context.scene_animation_mode = tme::tmrender::SceneAnimationMode::Instant;
- - item.second.visual.finish_animation_flag_ = false;
- + item.second.finish_animation = false;
- }
- is_redraw_needed = city_view->animate(context) || is_redraw_needed;
- @@ -1942,17 +1956,17 @@ bool Viewport::Impl::prepare_frame_rendering(tme::tmrender::AnimationContext & c
- void Viewport::Impl::process_whole_map_scene(
- const ProcessSceneFunction & process_scene_function,
- - bool labeling_only)
- + const bool labeling_only)
- {
- - bool change_loading_type = (!view_->isLoadingSynchronous());
- + const bool change_loading_type = (!view_->isLoadingSynchronous());
- // Запоминаем состояние области просмотра
- - bool current_is_rendering_enabled = view_->isRenderingEnabled();
- - IMapPositionClipperConstPtr clipper = navigator_->clipper();
- - ViewportSize current_size = size();
- - MapPosition current_position = navigator_->position();
- - ViewportProjectionType current_projection = projection();
- - AnimationType current_animation_type = animation_type();
- + const bool current_is_rendering_enabled = view_->isRenderingEnabled();
- + const IMapPositionClipperConstPtr clipper = navigator_->clipper();
- + const ViewportSize current_size = size();
- + const MapPosition current_position = navigator_->position();
- + const ViewportProjectionType current_projection = projection();
- + const AnimationType current_animation_type = animation_type();
- // Устанавливаем область просмотра, чтобы ЕагруЕилась вся карта
- begin_whole_map_scene_processing(
- @@ -2013,10 +2027,10 @@ void Viewport::Impl::process_dynamic_views(const std::function<void(IDynamicLaye
- }
- void Viewport::Impl::begin_whole_map_scene_processing(
- - bool change_loading_type,
- - Scale scale,
- - float angle,
- - bool labeling_only)
- + const bool change_loading_type,
- + const Scale scale,
- + const float angle,
- + const bool labeling_only)
- {
- view_->enableRendering(false);
- // Отключаем клиппирование, а то умрём на определении max_scale
- @@ -2029,7 +2043,7 @@ void Viewport::Impl::begin_whole_map_scene_processing(
- // При отображении нескольких проектов раЕмер порта просмотра получается очень большой
- // и содержимое раЕмещается неправильно. Поэтому эту функцию можно испольЕовать только с одним проектом.
- - UNI_ASSERT(project_views_.size() <= 1);
- + UNI_ASSERT(projects_.size() <= 1);
- // Делаем, чтобы область просмотра отображает всю карту
- const MapRect whole_map_rect = bounding_box_all_projects().rect();
- @@ -2064,14 +2078,14 @@ void Viewport::Impl::begin_whole_map_scene_processing(
- }
- void Viewport::Impl::end_whole_map_scene_processing(
- - bool change_loading_type,
- - bool current_is_rendering_enabled,
- - IMapPositionClipperConstPtr clipper,
- - ViewportSize current_size,
- - MapPosition current_position,
- - ViewportProjectionType current_projection,
- - AnimationType current_animation_type,
- - bool labeling_only)
- + const bool change_loading_type,
- + const bool current_is_rendering_enabled,
- + const IMapPositionClipperConstPtr clipper,
- + const ViewportSize current_size,
- + const MapPosition current_position,
- + const ViewportProjectionType current_projection,
- + const AnimationType current_animation_type,
- + const bool labeling_only)
- {
- // ВоЕвращаем Viewport в исходное состояние
- if (labeling_only)
- @@ -2099,7 +2113,7 @@ void Viewport::Impl::end_whole_map_scene_processing(
- void Viewport::Impl::refresh_active_labeling_info()
- {
- - Scale scale = navigator_->position().scale;
- + const Scale scale = navigator_->position().scale;
- if (labeling_cache_)
- {
- @@ -2136,20 +2150,20 @@ void Viewport::Impl::check_project_before_add(const IProjectPtr & in_project, co
- {
- // Проверка Еагруженности проекта беЕ ProjectInfo.
- // То есть мы можем ЕагруЕить только один проект, если он беЕ секции ProjectInfo.
- - if (project_views_.find(g_empty_project_id) != project_views_.end())
- + if (projects_.find(g_empty_project_id) != projects_.end())
- {
- TM_THROW_AND_LOG(ProjectWithoutProjectIndoLoadedException(
- "Project without project_info section has already been added in viewport"));
- }
- // Проверка добавления проекта с уже Еагруженным ProjectId
- - if (project_views_.find(in_project->id()) != project_views_.end())
- + if (projects_.find(in_project->id()) != projects_.end())
- {
- TM_THROW_AND_LOG(ProjectIdDuplicatedException("Project id duplicated"));
- }
- // Проверка того, что список фаЕ добавляемого проекта полностью и в том же порядке
- // входит в списк фаЕ уже добавленных проектов.
- - if (!project_views_.empty()
- - && !check_valid_list_of_phases(project_views_.begin()->second.view_settings, in_view_settings))
- + if (!projects_.empty()
- + && !check_valid_list_of_phases(projects_.begin()->second.view_settings, in_view_settings))
- {
- TM_THROW_AND_LOG(ListsOfPhasesDifferException("Lists of phases differ"));
- }
- @@ -2158,15 +2172,15 @@ void Viewport::Impl::check_project_before_add(const IProjectPtr & in_project, co
- Viewport::Viewport(
- const ICartoPtr &in_carto,
- const std::shared_ptr<tme::tmrender::IRender> &render,
- - bool in_has_multisampling,
- - DeviceType in_device_type,
- - LoadingType in_loading_type,
- + const bool in_has_multisampling,
- + const DeviceType in_device_type,
- + const LoadingType in_loading_type,
- const ISurfaceManagerPtr &surface_manager,
- const NeedRedrawFunction &need_redraw_function,
- const std::vector<std::string> &force_visible_layers,
- const std::vector<std::string> &force_invisible_layers,
- const PresentFunction &present_function,
- - bool is_primary_viewport,
- + const bool is_primary_viewport,
- const DrawingTypeChangeNotification &drawing_type_changed_notification)
- : impl_()
- {
- @@ -2198,42 +2212,27 @@ ViewportId Viewport::id() const
- }
- void Viewport::add_project(
- - const IProjectPtr &in_project,
- - const IViewSettingsPtr &in_view_settings,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function)
- -{
- - impl_->add_project(
- - in_project,
- - in_view_settings,
- - style_folder,
- - style_file_name,
- - data_validation_errors_function);
- -}
- -
- -void Viewport::add_project(
- - const IProjectPtr& in_project,
- - const IViewSettingsPtr& in_view_settings,
- - const StylesData& project_view_data)
- + const IProjectPtr &in_project,
- + const IViewSettingsPtr &in_view_settings,
- + const std::shared_ptr<Styles> &styles)
- {
- - impl_->add_project(in_project, in_view_settings, project_view_data);
- + impl_->add_project(in_project, in_view_settings, styles);
- }
- -StylesDataConstPtr Viewport::prepare_project_styles_data(
- +std::shared_ptr<Styles> Viewport::prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- - const DataValidationErrorsFunction &data_validation_errors_function) const
- + const DataValidationErrorsFunction &data_validation_errors_callback) const
- {
- - return impl_->prepare_project_styles_data(
- + return impl_->prepare_styles(
- style_folder,
- style_file_name,
- - data_validation_errors_function);
- + data_validation_errors_callback);
- }
- -void Viewport::remove_project(const IProjectPtr &in_project)
- +std::shared_ptr<Styles> Viewport::remove_project(const IProjectPtr &in_project)
- {
- - impl_->remove_project(in_project);
- + return impl_->remove_project(in_project);
- }
- ICartoPtr Viewport::carto() const
- @@ -2241,12 +2240,12 @@ ICartoPtr Viewport::carto() const
- return impl_->carto();
- }
- -IProjectPtr Viewport::project(ProjectId in_id)
- +IProjectPtr Viewport::project(const ProjectId in_id)
- {
- return impl_->project(in_id);
- }
- -IProjectConstPtr Viewport::project(ProjectId in_id) const
- +IProjectConstPtr Viewport::project(const ProjectId in_id) const
- {
- return impl_->project(in_id);
- }
- @@ -2271,12 +2270,22 @@ IProjectConstPtrContainer Viewport::visible_projects() const
- return impl_->visible_const_projects();
- }
- -IViewportLayerProxyPtr Viewport::layer(ProjectId project_id, const std::string &name) const
- +IProjectPtrContainer Viewport::projects_with_styles(const std::shared_ptr<Styles>& styles)
- +{
- + return impl_->projects_with_styles(styles);
- +}
- +
- +IProjectConstPtrContainer Viewport::projects_with_styles(const std::shared_ptr<Styles>& styles) const
- +{
- + return impl_->const_projects_with_styles(styles);
- +}
- +
- +IViewportLayerProxyPtr Viewport::layer(const ProjectId project_id, const std::string &name) const
- {
- return impl_->layer(project_id, name);
- }
- -IViewportLayerProxyPtr Viewport::layer(ProjectId project_id, LayerId layer_id) const
- +IViewportLayerProxyPtr Viewport::layer(const ProjectId project_id, const LayerId layer_id) const
- {
- return impl_->layer(project_id, layer_id);
- }
- @@ -2288,7 +2297,7 @@ void Viewport::add_selection(
- impl_->add_selection(selection, color);
- }
- -void Viewport::remove_selection(const ISelection * selection)
- +void Viewport::remove_selection(const ISelection * const selection)
- {
- impl_->remove_selection(selection);
- }
- @@ -2303,7 +2312,7 @@ ViewportProjectionType Viewport::projection() const
- return impl_->projection();
- }
- -void Viewport::set_projection(ViewportProjectionType type)
- +void Viewport::set_projection(const ViewportProjectionType type)
- {
- impl_->set_projection(type);
- }
- @@ -2313,7 +2322,7 @@ float Viewport::field_of_view() const
- return impl_->field_of_view();
- }
- -void Viewport::set_field_of_view(float in_field_of_view)
- +void Viewport::set_field_of_view(const float in_field_of_view)
- {
- impl_->set_field_of_view(in_field_of_view);
- }
- @@ -2426,7 +2435,7 @@ AnimationType Viewport::animation_type() const
- return impl_->animation_type();
- }
- -void Viewport::set_animation_type(AnimationType type)
- +void Viewport::set_animation_type(const AnimationType type)
- {
- impl_->set_animation_type(type);
- }
- @@ -2436,17 +2445,17 @@ DrawingType Viewport::drawing_type() const
- return impl_->drawing_type();
- }
- -void Viewport::set_drawing_type(DrawingType type)
- +void Viewport::set_drawing_type(const DrawingType type)
- {
- impl_->set_drawing_type(type);
- }
- -HeavyOperationSettings Viewport::drawing_flags(DrawingType type) const
- +HeavyOperationSettings Viewport::drawing_flags(const DrawingType type) const
- {
- return impl_->drawing_flags(type);
- }
- -void Viewport::set_drawing_flags(DrawingType type, HeavyOperationSettings flags)
- +void Viewport::set_drawing_flags(const DrawingType type, const HeavyOperationSettings flags)
- {
- impl_->set_drawing_flags(type, flags);
- }
- @@ -2456,7 +2465,7 @@ LoadingType Viewport::loading_type() const
- return impl_->loading_type();
- }
- -void Viewport::set_loading_type(LoadingType type)
- +void Viewport::set_loading_type(const LoadingType type)
- {
- impl_->set_loading_type(type);
- }
- @@ -2466,7 +2475,7 @@ VisibilityType Viewport::models_visibility_type() const
- return impl_->models_visibility_type();
- }
- -void Viewport::set_models_visibility_type(VisibilityType type)
- +void Viewport::set_models_visibility_type(const VisibilityType type)
- {
- impl_->set_models_visibility_type(type);
- }
- @@ -2476,7 +2485,7 @@ LabelingMode Viewport::labeling_mode() const
- return impl_->labeling_mode();
- }
- -void Viewport::set_labeling_mode(LabelingMode mode)
- +void Viewport::set_labeling_mode(const LabelingMode mode)
- {
- impl_->set_labeling_mode(mode);
- }
- @@ -2491,38 +2500,52 @@ void Viewport::set_label_placement(const LabelPlacement placement)
- impl_->view()->setLabelPlacement(placement);
- }
- -void Viewport::set_display_label_bound_box(bool display)
- +void Viewport::set_display_label_bound_box(const bool display)
- {
- impl_->set_display_label_bound_box(display);
- }
- void Viewport::set_view_settings(
- - ProjectId project_id,
- + const ProjectId project_id,
- const IViewSettingsPtr & in_view_settings,
- - bool play_switch_animation)
- + const bool play_switch_animation)
- {
- impl_->set_view_settings(project_id, in_view_settings, play_switch_animation);
- }
- -void Viewport::set_styles(
- - ProjectId project_id,
- - const UniFS::IDirPtr &style_folder,
- - const std::string &style_file_name,
- - bool play_switch_animation)
- +
- +void Viewport::free_styles(const std::shared_ptr<Styles>& styles)
- {
- - impl_->set_styles(
- - project_id,
- - style_folder,
- - style_file_name,
- - play_switch_animation);
- + if (nullptr == styles)
- + {
- + UNILOG_ERROR << "can't free null styles";
- + }
- + else
- + {
- + impl_->free_styles(styles);
- + }
- +}
- +
- +std::shared_ptr<Styles> Viewport::set_styles(
- + const ProjectId project_id,
- + const std::shared_ptr<Styles>& styles,
- + const bool play_switch_animation)
- +{
- + if (nullptr == styles)
- + {
- + UNILOG_ERROR << "can't apply null styles";
- + return{};
- + }
- +
- + return impl_->set_styles(project_id, styles, play_switch_animation);
- }
- -boost::optional<float> Viewport::max_3d_scale(ProjectId project_id) const
- +boost::optional<float> Viewport::max_3d_scale(const ProjectId project_id) const
- {
- return impl_->max_3d_scale(project_id);
- }
- -IViewSettingsPtr Viewport::view_settings(ProjectId project_id) const
- +IViewSettingsPtr Viewport::view_settings(const ProjectId project_id) const
- {
- return impl_->view_settings(project_id);
- }
- diff --git a/Projects/CartoQtTestAppLib/CartoWidget.hqt b/Projects/CartoQtTestAppLib/CartoWidget.hqt
- index f8cee4c..f7b3819 100644
- --- a/Projects/CartoQtTestAppLib/CartoWidget.hqt
- +++ b/Projects/CartoQtTestAppLib/CartoWidget.hqt
- @@ -149,6 +149,7 @@ public slots:
- const QString & stable_id_source_path);
- void closeProject(ProjectId project_id);
- void closeProjects(bool emit_signal = true);
- + void closeProjectsKeepViewport(const bool emit_signal = true);
- void setViewSettingsPath(ProjectId project_id, const QString & view_settings_path);
- void setViewSettingsPathForAll(const QString & view_settings_path);
- void setStylesPath(ProjectId project_id, const QString & styles_path);
- @@ -367,7 +368,7 @@ private:
- boost::unordered_map<ProjectId, ProjectParameters> projects_;
- ActivityContainer viewport_activities_;
- - StylesDataConstPtr cached_styles_;
- + std::shared_ptr<Styles> cached_styles_;
- ICartoPtr carto_;
- std::shared_ptr<RenderTimeScaled> render_time_;
- diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- index 503c94b..48c61c4 100644
- --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- @@ -134,7 +134,7 @@ UniFS::IDirPtr getModelSource(
- converted_data))
- {
- QMessageBox::critical(
- - 0,
- + nullptr,
- QObject::tr("Invalid model description"),
- QObject::tr("Format validation error."));
- return {};
- @@ -822,6 +822,11 @@ ProjectId CartoWidget::openProjectWithGlobalSyle(const QString & file_name)
- UNI_ASSERT(false == file_name.isEmpty());
- UNI_ASSERT(nullptr != cached_styles_);
- + if (nullptr == currentCartoWidget())
- + {
- + createWidget();
- + }
- +
- ProjectParameters project_parameters;
- project_parameters.map_path = file_name;
- project_parameters.map_version_path = file_name;
- @@ -853,7 +858,7 @@ ProjectId CartoWidget::openProjectWithGlobalSyle(const QString & file_name)
- const auto view_settings = std::make_shared<ViewSettings>(project_to_be_opened, view_settings_block);
- UNI_ASSERT(view_settings);
- - viewport().add_project(project_to_be_opened, view_settings, *cached_styles_.get());
- + viewport().add_project(project_to_be_opened, view_settings, cached_styles_);
- projects_[project_id] = project_parameters;
- @@ -888,7 +893,18 @@ void CartoWidget::loadGlobalStyles(const QString & file_name)
- const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
- const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
- - cached_styles_ = viewport().prepare_project_styles_data(styles_folder, g_style_default, on_unknown_symbol);
- + const auto old_styles = cached_styles_;
- +
- + cached_styles_ = viewport().prepare_styles(styles_folder, g_style_default, on_unknown_symbol);
- +
- + if (nullptr != old_styles)
- + {
- + for (const auto& project : viewport().projects_with_styles(old_styles))
- + {
- + viewport().set_styles(project->id(), cached_styles_);
- + }
- + viewport().free_styles(old_styles);
- + }
- }
- catch (const std::exception& e)
- {
- @@ -948,7 +964,7 @@ ProjectId CartoWidget::addProject(
- return addProjectByParams(project_param);
- }
- -void CartoWidget::closeProjects(const bool emit_signal)
- +void CartoWidget::closeProjectsKeepViewport(const bool emit_signal)
- {
- UNI_ASSERT(!projects_.empty());
- @@ -959,15 +975,42 @@ void CartoWidget::closeProjects(const bool emit_signal)
- UNI_ASSERT(viewport().projects().empty());
- projects_.clear();
- +
- + if (emit_signal)
- + {
- + emit allProjectsClosed();
- + }
- +}
- +
- +void CartoWidget::closeProjects(const bool emit_signal)
- +{
- + UNI_ASSERT(!projects_.empty());
- +
- + for (const auto & params : projects_)
- + {
- + const auto styles = viewport().remove_project(params.second.project_ptr);
- +
- + if (styles != cached_styles_)
- + {
- + viewport().free_styles(styles);
- + }
- + }
- + UNI_ASSERT(viewport().projects().empty());
- +
- deinitWidget();
- + projects_.clear();
- +
- + delete slave_viewport_;
- + slave_viewport_ = nullptr;
- +
- if (emit_signal)
- {
- emit allProjectsClosed();
- }
- }
- -void CartoWidget::closeProject(ProjectId project_id)
- +void CartoWidget::closeProject(const ProjectId project_id)
- {
- UNI_ASSERT(currentWidget());
- @@ -975,8 +1018,14 @@ void CartoWidget::closeProject(ProjectId project_id)
- if (currentCartoWidget())
- {
- - viewport().remove_project(project_ptr);
- + const auto styles = viewport().remove_project(project_ptr);
- +
- + if (viewport().projects_with_styles(styles).empty() && styles != cached_styles_)
- + {
- + viewport().free_styles(styles);
- + }
- }
- +
- deinitActivities(project_id);
- deinitDynamicLayers(project_id);
- projects_.erase(project_id);
- @@ -1004,7 +1053,17 @@ void CartoWidget::setStylesPath(ProjectId project_id, const QString & styles_pat
- params.styles_folder = new_styles_folder;
- if (currentCartoWidget())
- {
- - viewport().set_styles(project_id, params.styles_folder, params.style_file_name);
- + const auto styles = viewport().prepare_styles(
- + params.styles_folder,
- + params.style_file_name,
- + std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- +
- + const auto old_styles = viewport().set_styles(project_id, styles);
- +
- + if (viewport().projects_with_styles(old_styles).empty() && cached_styles_ != old_styles)
- + {
- + viewport().free_styles(old_styles);
- + }
- }
- emit stylesOpened(project_id);
- }
- @@ -1042,7 +1101,7 @@ void CartoWidget::setStableIdSourcePath(
- // По идее не опасная операция
- QString path_exception_message = path_exception.what();
- QMessageBox::critical(
- - 0,
- + nullptr,
- QObject::tr("Invalid file data"),
- QObject::tr("Can't open models:\n") + path_exception_message);
- }
- @@ -1308,7 +1367,17 @@ void CartoWidget::setStyle(ProjectId project_id, const QString & style_file_name
- if (currentCartoWidget())
- {
- - viewport().set_styles(project_id, params.styles_folder, params.style_file_name);
- + const auto styles = viewport().prepare_styles(
- + params.styles_folder,
- + params.style_file_name,
- + std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- +
- + const auto old_styles = viewport().set_styles(project_id, styles);
- +
- + if (viewport().projects_with_styles(old_styles).empty() && cached_styles_ != old_styles)
- + {
- + viewport().free_styles(old_styles);
- + }
- }
- }
- }
- @@ -1541,7 +1610,7 @@ QWidget *CartoWidget::spawnSwCartoWidget(const ViewportSettings &settings)
- carto_,
- settings.device_type,
- LoadingTypeAsynchronous,
- - 0,
- + nullptr,
- CartoWidgetDrawingSpeedFunction(),
- {}, {});
- @@ -1589,7 +1658,7 @@ QWidget *CartoWidget::spawnGlCartoWidget(const ViewportSettings &settings)
- carto_,
- settings.device_type,
- LoadingTypeAsynchronous,
- - 0,
- + nullptr,
- CartoWidgetDrawingSpeedFunction(),
- {},
- {},
- @@ -1622,12 +1691,15 @@ void CartoWidget::initSlaveCartoWidget(
- {
- try
- {
- + const auto styles = widget_viewport.prepare_styles(
- + params.second.styles_folder,
- + params.second.style_file_name,
- + std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- +
- widget_viewport.add_project(
- params.second.project_ptr,
- reference_viewport.view_settings(params.second.project_ptr->id()),
- - params.second.styles_folder,
- - params.second.style_file_name,
- - std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- + styles);
- }
- catch (...)
- {
- @@ -1779,7 +1851,7 @@ void CartoWidget::windowChanged(QWindow * const new_window)
- {
- if (current_window_)
- {
- - disconnect(current_window_, 0, this, 0);
- + disconnect(current_window_, nullptr, this, nullptr);
- }
- current_window_ = new_window;
- if (current_window_)
- @@ -1800,7 +1872,7 @@ void CartoWidget::screenChanged(QScreen *new_screen)
- {
- if (current_screen_)
- {
- - disconnect(current_screen_, 0, this, 0);
- + disconnect(current_screen_, nullptr, this, nullptr);
- }
- current_screen_ = new_screen;
- if (current_screen_)
- @@ -1944,23 +2016,27 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
- get_view_settings_block(project_param.view_settings_path.toUtf8().constData());
- UNI_ASSERT(view_settings_block);
- - const IViewSettingsPtr view_settings = std::make_shared<ViewSettings>(
- + const auto view_settings = std::make_shared<ViewSettings>(
- project_param.project_ptr,
- view_settings_block);
- UNI_ASSERT(view_settings);
- - viewport().add_project(
- - project_param.project_ptr,
- - view_settings,
- + const auto styles = viewport().prepare_styles(
- project_param.styles_folder,
- project_param.style_file_name,
- std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- + UNI_ASSERT(styles);
- +
- + viewport().add_project(
- + project_param.project_ptr,
- + view_settings,
- + styles);
- }
- catch (::Map::IO::FileNotFoundException &path_exception)
- {
- QString path_exception_message = path_exception.what();
- QMessageBox::critical(
- - 0,
- + nullptr,
- QObject::tr("Invalid file data"),
- QObject::tr("Can't open project:\n") + path_exception_message);
- return false;
- @@ -1968,7 +2044,7 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
- catch (const ProjectWithoutProjectIndoLoadedException &)
- {
- QMessageBox::critical(
- - 0,
- + nullptr,
- QObject::tr("Error adding project"),
- QObject::tr("Project without project_info section has already been added in viewport"));
- return false;
- @@ -1976,7 +2052,7 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
- catch (const ProjectIdDuplicatedException &)
- {
- QMessageBox::critical(
- - 0,
- + nullptr,
- QObject::tr("Error adding project"),
- QObject::tr("Can't add project with duplicated id (%1)").arg(project_param.project_ptr->id()));
- return false;
- @@ -1984,7 +2060,7 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
- catch (const ListsOfPhasesDifferException &)
- {
- QMessageBox::critical(
- - 0,
- + nullptr,
- QObject::tr("Error adding project"),
- QObject::tr("Can't add project with different list of phases"));
- return false;
- @@ -2039,7 +2115,7 @@ void CartoWidget::createProject(ProjectParameters & params)
- // По идее не опасная операция
- QString path_exception_message = path_exception.what();
- QMessageBox::critical(
- - 0,
- + nullptr,
- QObject::tr("Invalid file data"),
- QObject::tr("Can't open project:\n") + path_exception_message);
- params.project_ptr.reset();
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- index f5a64df..771963d 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
- @@ -2285,7 +2285,7 @@ void MainWindowImpl::onOpenGlobalStylesProject2gisTriggered()
- {
- if (false == carto_widget_->projects().isEmpty())
- {
- - carto_widget_->closeProjects();
- + carto_widget_->closeProjectsKeepViewport();
- }
- carto_widget_->openProjectWithGlobalSyle(file_name);
- @@ -2300,13 +2300,20 @@ void MainWindowImpl::onOpenGlobalStylesProjectMap3dTriggered()
- {
- if (false == carto_widget_->projects().isEmpty())
- {
- - carto_widget_->closeProjects();
- + carto_widget_->closeProjectsKeepViewport();
- }
- carto_widget_->openProjectWithGlobalSyle(directory_name);
- }
- }
- +void MainWindowImpl::onCloseProjectsTriggered()
- +{
- + carto_widget_->closeProjects();
- + open_project_with_global_styles_from_folder_menu_->setEnabled(false);
- + open_project_with_global_styles_from_2gis_menu_->setEnabled(false);
- +}
- +
- void MainWindowImpl::onOpenProjects2gisTriggered()
- {
- QStringList file_names = QFileDialog::getOpenFileNames(
- @@ -4293,7 +4300,7 @@ void MainWindowImpl::createFileMenu()
- close_project_menu_ = file->addMenu(tr("&Close project"));
- connect(close_project_menu_, SIGNAL(aboutToShow()), this, SLOT(onCloseProjectMenuShow()));
- - close_project_menu_->addAction(tr("&All"), carto_widget_, SLOT(closeProjects()), tr("Ctrl+W"));
- + close_project_menu_->addAction(tr("&All"), this, SLOT(onCloseProjectsTriggered()), tr("Ctrl+W"));
- close_project_menu_->addSeparator();
- file->addSeparator();
- diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- index 077c20c..23622e9 100644
- --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
- @@ -139,6 +139,8 @@ private slots:
- void onOpenGlobalStylesProject2gisTriggered();
- void onOpenGlobalStylesProjectMap3dTriggered();
- + void onCloseProjectsTriggered();
- +
- void onCopyMapPositionTriggered();
- void onCopyGeoPositionTriggered();
- --
- 1.9.5.msysgit.1
- From b2aca8874dba0986fc886722844d7fc5e12a34b6 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Fri, 10 Jul 2015 15:43:29 +0600
- Subject: [PATCH 20/24] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?=
- =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Benchmark/src/Benchmark.cpp | 16 ++++++++--
- Projects/MakeBinaryModels/src/MakeBinaryModels.cpp | 34 +++++++++++-----------
- Projects/tmCore/ScopeGuard.h | 6 ++++
- .../src/ColladaReaders/CColladaProvider.cpp | 13 +++++++--
- 4 files changed, 46 insertions(+), 23 deletions(-)
- diff --git a/Projects/Benchmark/src/Benchmark.cpp b/Projects/Benchmark/src/Benchmark.cpp
- index 9b716fd..0d72fcd 100644
- --- a/Projects/Benchmark/src/Benchmark.cpp
- +++ b/Projects/Benchmark/src/Benchmark.cpp
- @@ -4,6 +4,8 @@
- #include <tmCore/Config.h>
- #include <tmCore/Timer.h>
- +#include <tmCore/ScopeGuard.h>
- +
- #include <tmRender/CSurfaceManager.h>
- #include <tmRender/RenderCounters.inl>
- #include <tmGL/COpenGLRender.h>
- @@ -426,13 +428,21 @@ Result Benchmark::run(const Configuration &configuration)
- std::placeholders::_3)
- : Carto::PresentFunction());
- - viewport->add_project(
- - project,
- - view_settings,
- + const auto styles = viewport->prepare_styles(
- style_folder,
- "3d.style",
- Carto::DataValidationErrorsFunction());
- + const auto styles_deleter = tme::make_guard([&styles, &viewport]()
- + {
- + viewport->free_styles(styles);
- + });
- +
- + viewport->add_project(
- + project,
- + view_settings,
- + styles);
- +
- viewport->set_animation_type(Carto::AnimationTypeNone);
- if (models_visibility_type)
- {
- diff --git a/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp b/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
- index 13cfa88..51fdc4f 100644
- --- a/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
- +++ b/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
- @@ -174,6 +174,23 @@ int main(const int argc, char ** const argv)
- }
- po::notify(params);
- +
- + const std::string input_folder_utf8 = params["input"].as<std::string>();
- + const std::string output_folder_utf8 = params["output"].as<std::string>();
- +
- + const auto surface_manager = std::make_shared<tme::tmrender::CSurfaceManager>(
- + nullptr,
- + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
- + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
- +
- + const auto input_folder_ptr = ::UniFS_StdFS::CreateDir(input_folder_utf8, "/");
- + const auto output_folder_ptr = std::make_shared<FolderImpl>(UTF_Utils::UTF8ToWString(output_folder_utf8));
- + tme::tmrender::ModelManager model_manager(input_folder_ptr);
- + model_manager.setImageLoader(*surface_manager);
- +
- + tme::tmrender::CModelBinaryFormatWriter binary_writer;
- + binary_writer.convertColladaToBinary(model_manager, output_folder_ptr);
- }
- catch (const std::exception &error)
- {
- @@ -182,22 +199,5 @@ int main(const int argc, char ** const argv)
- return 1;
- }
- - const std::string input_folder_utf8 = params["input"].as<std::string>();
- - const std::string output_folder_utf8 = params["output"].as<std::string>();
- -
- - const auto surface_manager = std::make_shared<tme::tmrender::CSurfaceManager>(
- - nullptr,
- - std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
- - tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
- - tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
- -
- - const auto input_folder_ptr = ::UniFS_StdFS::CreateDir(input_folder_utf8, "/");
- - const auto output_folder_ptr = std::make_shared<FolderImpl>(UTF_Utils::UTF8ToWString(output_folder_utf8));
- - tme::tmrender::ModelManager model_manager(input_folder_ptr);
- - model_manager.setImageLoader(*surface_manager);
- -
- - tme::tmrender::CModelBinaryFormatWriter binary_writer;
- - binary_writer.convertColladaToBinary(model_manager, output_folder_ptr);
- -
- return 0;
- }
- diff --git a/Projects/tmCore/ScopeGuard.h b/Projects/tmCore/ScopeGuard.h
- index 762d946..6b59150 100644
- --- a/Projects/tmCore/ScopeGuard.h
- +++ b/Projects/tmCore/ScopeGuard.h
- @@ -37,4 +37,10 @@ private:
- T on_exit_;
- };
- +template<class P>
- +inline ScopeGuard<P> make_guard(P on_exit)
- +{
- + return ScopeGuard<P>(on_exit);
- +}
- +
- } // namespace tme
- diff --git a/Projects/tmRender/src/ColladaReaders/CColladaProvider.cpp b/Projects/tmRender/src/ColladaReaders/CColladaProvider.cpp
- index b4961f3..648a63f 100644
- --- a/Projects/tmRender/src/ColladaReaders/CColladaProvider.cpp
- +++ b/Projects/tmRender/src/ColladaReaders/CColladaProvider.cpp
- @@ -52,9 +52,16 @@ ParsedModelData CColladaProvider::loadFromFile(
- if (tinyxml2::XMLElement *collada_element = xml_reader.FirstChildElement(collada_.c_str()))
- {
- - collada::g_collada_tmp_polygon = new tm_size_type[COLLADA_TMP_POLYGON_CAPACITY];
- - parser->read(collada_element);
- - delete [] collada::g_collada_tmp_polygon;
- + try
- + {
- + collada::g_collada_tmp_polygon = new tm_size_type[COLLADA_TMP_POLYGON_CAPACITY];
- + parser->read(collada_element);
- + }
- + catch (...)
- + {
- + delete[] collada::g_collada_tmp_polygon;
- + throw;
- + }
- }
- return ParsedModelData(PModelScene(parser->buildModel(flags, color_type)), parser);
- --
- 1.9.5.msysgit.1
- From f80af740f467ab10471960e77769e203db8a19e3 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Mon, 13 Jul 2015 16:57:25 +0600
- Subject: [PATCH 21/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?=
- =?UTF-8?q?=D0=BE=20=D1=80=D1=83=D1=87=D0=BD=D0=BE=D0=B5=20=D0=BE=D1=81?=
- =?UTF-8?q?=D0=B2=D0=BE=D0=B1=D0=BE=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20?=
- =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Carto/Carto/Fwd.h | 2 +-
- Projects/Carto/Carto/IViewport.h | 30 +---
- Projects/Carto/Carto/Viewport.h | 24 ++-
- Projects/Carto/src/Carto/StyleSetCache.cpp | 103 +++++++++---
- Projects/Carto/src/Carto/StyleSetCache.h | 36 ++++-
- Projects/Carto/src/Carto/Viewport.cpp | 211 +++++++++----------------
- Projects/CartoQtTestAppLib/CartoWidget.hqt | 2 +-
- Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 39 +----
- 8 files changed, 214 insertions(+), 233 deletions(-)
- diff --git a/Projects/Carto/Carto/Fwd.h b/Projects/Carto/Carto/Fwd.h
- index 225574c..2bd9a0f 100644
- --- a/Projects/Carto/Carto/Fwd.h
- +++ b/Projects/Carto/Carto/Fwd.h
- @@ -95,7 +95,7 @@ struct ProjectCoordinates;
- struct ProjectInfo;
- class ViewTrapezium;
- struct ScreenPointPosition;
- -struct Styles;
- +class StylesProxy;
- //! Тип необяЕательного диапаЕона масштабов.
- typedef boost::optional<ScaleRange> OptionalScaleRange;
- diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
- index f8051a1..c8e6c21 100644
- --- a/Projects/Carto/Carto/IViewport.h
- +++ b/Projects/Carto/Carto/IViewport.h
- @@ -81,7 +81,7 @@ public:
- virtual void add_project(
- const IProjectPtr &project,
- const IViewSettingsPtr &view_settings,
- - const std::shared_ptr<Styles> &styles) = 0;
- + const std::shared_ptr<StylesProxy> &styles) = 0;
- /*!
- * Подготовка данных для добавления проекта в порт просмотра. Можно Еапускать в отдельной нити.
- @@ -92,25 +92,13 @@ public:
- * Еадании новой библиотеки стилей. Может выЕваться прямо иЕ конструктора. Можно укаЕать пустую функцию,
- * тогда проверка не будет осуществляться.
- */
- - virtual std::shared_ptr<Styles> prepare_styles(
- + virtual std::shared_ptr<StylesProxy> prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_callback) const = 0;
- - /*!
- - * Удалить все ссылки на стили иЕ внутренних структур данных. После выЕова этого метода стили не будут
- - * восстанавливаться при смене контекста рендера. Данная функция никак не портит содержимое по переданному
- - * укаЕателю и её действие можно отменить, к примеру, добавив проект с освобождёнными стилями. Для окончательной
- - * выгруЕки всех данных, выЕывающей стороне так же необходимо освободить свою копию укаЕателя.
- - *
- - * \param styles стили, предварительно Еагруженные функцией 'prepare_styles'.
- - */
- - virtual void free_styles(
- - const std::shared_ptr<Styles> &styles) = 0;
- -
- //! Удаление проекта иЕ порта просмотра.
- - //! \return стили удалённого проекта.
- - virtual std::shared_ptr<Styles> remove_project(const IProjectPtr &project) = 0;
- + virtual void remove_project(const IProjectPtr &project) = 0;
- /*!
- * Получение карты, к которой привяЕана данная область просмотра.
- @@ -141,13 +129,6 @@ public:
- virtual IProjectConstPtrContainer visible_projects() const = 0;
- /*!
- - * Получение интерфейсов всех проектов, испольЕующих данные стили.
- - * \return множество проектов.
- - */
- - virtual IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) = 0;
- - virtual IProjectConstPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) const = 0;
- -
- - /*!
- * Получение класса для управления отображением слоя по имени.
- * \param project_id идентификатор проекта.
- * \param name имя слоя.
- @@ -435,11 +416,10 @@ public:
- * \param project_id идентификатор проекта
- * \param стили, предварительно Еагруженные функцией 'prepare_styles'.
- * \param play_switch_animation флаг необходимости проигрывания анимации появления для уже Еагруженных объектов.
- - * \return предыдущие настройки отображения для данного проекта.
- */
- - virtual std::shared_ptr<Styles> set_styles(
- + virtual void set_styles(
- ProjectId project_id,
- - const std::shared_ptr<Styles> &styles,
- + const std::shared_ptr<StylesProxy> &styles,
- bool play_switch_animation = true) = 0;
- /*!
- diff --git a/Projects/Carto/Carto/Viewport.h b/Projects/Carto/Carto/Viewport.h
- index 2109d1f..eb8c4f4 100644
- --- a/Projects/Carto/Carto/Viewport.h
- +++ b/Projects/Carto/Carto/Viewport.h
- @@ -56,28 +56,24 @@ public:
- public: // IViewport
- virtual ViewportId id() const override;
- - virtual void add_project(
- - const IProjectPtr &project,
- - const IViewSettingsPtr &view_settings,
- - const std::shared_ptr<Styles> &styles) override;
- -
- - virtual std::shared_ptr<Styles> prepare_styles(
- + virtual std::shared_ptr<StylesProxy> prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_callback) const override;
- - virtual void free_styles(
- - const std::shared_ptr<Styles> &styles) override;
- -
- - virtual std::shared_ptr<Styles> set_styles(
- + virtual void add_project(
- + const IProjectPtr &project,
- + const IViewSettingsPtr &view_settings,
- + const std::shared_ptr<StylesProxy> &styles) override;
- +
- + virtual void set_styles(
- ProjectId project_id,
- - const std::shared_ptr<Styles> &styles,
- + const std::shared_ptr<StylesProxy> &styles,
- bool play_switch_animation) override;
- - virtual IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) override;
- - virtual IProjectConstPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) const override;
- + virtual void remove_project(
- + const IProjectPtr & project) override;
- - virtual std::shared_ptr<Styles> remove_project(const IProjectPtr & project) override;
- virtual ICartoPtr carto() const override;
- virtual IProjectPtr project(ProjectId id) override;
- virtual IProjectConstPtr project(ProjectId id) const override;
- diff --git a/Projects/Carto/src/Carto/StyleSetCache.cpp b/Projects/Carto/src/Carto/StyleSetCache.cpp
- index 21b8778..67cd483 100644
- --- a/Projects/Carto/src/Carto/StyleSetCache.cpp
- +++ b/Projects/Carto/src/Carto/StyleSetCache.cpp
- @@ -26,6 +26,32 @@ std::shared_ptr<tme::CSymbolContainer> symbols_from_source(
- } // namespace
- +StylesProxy::StylesProxy(const std::shared_ptr<const StyleSetCache>& host, std::unique_ptr<Styles>&& styles)
- + : host_(host)
- + , styles_(std::move(styles))
- +{
- +}
- +
- +StylesProxy::~StylesProxy()
- +{
- + const auto cache = host_.lock();
- +
- + if (nullptr == cache)
- + {
- + UNILOG_ERROR << "cache has been deleted earlier than styles";
- + }
- + else
- + {
- + cache->schedule_styles_deletion(std::move(styles_));
- + }
- +}
- +
- +
- +Styles& StylesProxy::get()
- +{
- + return *styles_.get();
- +}
- +
- StylesLoadingData::StylesLoadingData(
- UniFS::IDirPtr in_source_folder,
- std::string in_source_file_name,
- @@ -41,10 +67,11 @@ Styles::Styles(const StylesLoadingData& in_source)
- {
- }
- -std::shared_ptr<Styles> StyleSetCache::prepare_styles(
- +auto StyleSetCache::prepare_styles(
- + const std::shared_ptr<const StyleSetCache>& host,
- const ViewportId host_viewport_id,
- const ISurfaceManagerPtr& reference_surface_manager,
- - const StylesLoadingData& source)
- + const StylesLoadingData& source) -> std::shared_ptr<StylesProxy>
- {
- UNI_ASSERT(nullptr != reference_surface_manager);
- @@ -52,51 +79,91 @@ std::shared_ptr<Styles> StyleSetCache::prepare_styles(
- const auto styles_storage = symbols_from_source(surface_manager, source);
- - const auto new_styles_set = std::make_shared<Styles>(source);
- + auto new_styles_set = std::make_unique<Styles>(source);
- new_styles_set->viewport_id = host_viewport_id;
- new_styles_set->storage = styles_storage;
- new_styles_set->surface_manager = surface_manager;
- - return new_styles_set;
- + return std::make_shared<StylesProxy>(host, std::move(new_styles_set));
- }
- -void StyleSetCache::look_after(const std::shared_ptr<Styles>& target)
- +void StyleSetCache::bind(const ProjectId project, const std::shared_ptr<StylesProxy>& styles)
- {
- - UNI_ASSERT(nullptr != target);
- - style_sets_.insert(target);
- + const auto found = bound_styles_.find(styles);
- +
- + if (found == bound_styles_.end())
- + {
- + bound_styles_.emplace(styles, std::set<ProjectId>{}).first->second.insert(project);
- + }
- + else
- + {
- + found->second.insert(project);
- + }
- }
- -void StyleSetCache::adandon(const std::shared_ptr<Styles>& target)
- +void StyleSetCache::unbind(const ProjectId project, const std::shared_ptr<StylesProxy>& styles)
- {
- - UNI_ASSERT(nullptr != target);
- + const auto found = bound_styles_.find(styles);
- - style_sets_.erase(target);
- + if (found == bound_styles_.end())
- + {
- + UNILOG_WARNING << "projeect " << project << " has already been unbound";
- + }
- + else
- + {
- + auto& bound_projects = found->second;
- +
- + bound_projects.erase(project);
- +
- + if (bound_projects.empty())
- + {
- + bound_styles_.erase(found);
- + }
- + }
- }
- void StyleSetCache::external_render_context_lost()
- {
- - for (const auto& styles_set : style_sets_)
- + for (const auto& item : bound_styles_)
- {
- - styles_set->storage.reset();
- - styles_set->surface_manager->purge_uploaded_surfaces();
- + auto& styles = item.first->get();
- +
- + styles.storage.reset();
- + styles.surface_manager->purge_uploaded_surfaces();
- }
- }
- void StyleSetCache::external_render_context_recreated()
- {
- - for (const auto& styles_set : style_sets_)
- + for (const auto& item : bound_styles_)
- {
- - const auto new_styles_storage = symbols_from_source(styles_set->surface_manager, styles_set->source);
- + auto& styles = item.first->get();
- +
- + const auto new_styles_storage = symbols_from_source(styles.surface_manager, styles.source);
- - styles_set->storage = new_styles_storage;
- + styles.storage = new_styles_storage;
- const auto error_message = new_styles_storage->GetErrorString();
- - if (nullptr != styles_set->source.data_validation_errors_callback && false == error_message.empty())
- + const auto callback = styles.source.data_validation_errors_callback;
- +
- + if (nullptr != callback && false == error_message.empty())
- {
- - styles_set->source.data_validation_errors_callback(error_message);
- + callback(error_message);
- }
- }
- }
- +void StyleSetCache::delete_scheduled_styles()
- +{
- + std::lock_guard<std::mutex> guard(deletion_queue_mutex_);
- + to_be_deleted_.clear();
- +}
- +
- +void StyleSetCache::schedule_styles_deletion(std::unique_ptr<Styles>&& styles) const
- +{
- + std::lock_guard<std::mutex> guard(deletion_queue_mutex_);
- + to_be_deleted_.insert(std::move(styles));
- +}
- +
- } // namespace Carto
- diff --git a/Projects/Carto/src/Carto/StyleSetCache.h b/Projects/Carto/src/Carto/StyleSetCache.h
- index 8aa6fb0..72fd261 100644
- --- a/Projects/Carto/src/Carto/StyleSetCache.h
- +++ b/Projects/Carto/src/Carto/StyleSetCache.h
- @@ -7,6 +7,7 @@
- #include <set>
- #include <memory>
- +#include <mutex>
- namespace Carto
- {
- @@ -17,6 +18,7 @@ struct StylesLoadingData final
- UniFS::IDirPtr source_folder,
- std::string source_file_name,
- DataValidationErrorsFunction data_validation_errors_callback);
- + StylesLoadingData(const StylesLoadingData& other) = default;
- const UniFS::IDirPtr folder;
- const std::string file_name;
- @@ -36,6 +38,25 @@ struct Styles final
- const StylesLoadingData source;
- };
- +class StyleSetCache;
- +
- +class StylesProxy final
- +{
- +public:
- +
- + StylesProxy(const std::shared_ptr<const StyleSetCache>& host, std::unique_ptr<Styles>&& styles);
- +
- + ~StylesProxy();
- +
- + Styles& get();
- +
- +private:
- +
- + std::weak_ptr<const StyleSetCache> host_;
- + std::unique_ptr<Styles> styles_;
- +
- +};
- +
- class StyleSetCache final
- {
- public:
- @@ -45,20 +66,27 @@ public:
- StyleSetCache(const StyleSetCache&) = delete;
- StyleSetCache& operator=(const StyleSetCache&) = delete;
- - static std::shared_ptr<Styles> prepare_styles(
- + static std::shared_ptr<StylesProxy> prepare_styles(
- + const std::shared_ptr<const StyleSetCache>& host,
- ViewportId host_viewport_id,
- const ISurfaceManagerPtr& surface_manager,
- const StylesLoadingData& source);
- - void look_after(const std::shared_ptr<Styles>& styles);
- - void adandon(const std::shared_ptr<Styles>& styles);
- + void bind(ProjectId user, const std::shared_ptr<StylesProxy>& styles);
- + void unbind(ProjectId user, const std::shared_ptr<StylesProxy>& styles);
- +
- + void delete_scheduled_styles();
- + void schedule_styles_deletion(std::unique_ptr<Styles>&& styles) const;
- void external_render_context_lost();
- void external_render_context_recreated();
- private:
- - std::set<const std::shared_ptr<Styles>> style_sets_;
- + mutable std::mutex deletion_queue_mutex_;
- + mutable std::set<std::unique_ptr<Styles>> to_be_deleted_;
- +
- + boost::unordered_map<const std::shared_ptr<StylesProxy>, std::set<ProjectId>> bound_styles_;
- };
- diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
- index ed1b87c..890960c 100644
- --- a/Projects/Carto/src/Carto/Viewport.cpp
- +++ b/Projects/Carto/src/Carto/Viewport.cpp
- @@ -296,29 +296,25 @@ public: // IViewportPrivate
- public:
- ViewportId id() const;
- -
- - void add_project(
- - const IProjectPtr &project,
- - const IViewSettingsPtr &view_settings,
- - const std::shared_ptr<Styles> &project_view_data);
- - std::shared_ptr<Styles> prepare_styles(
- + std::shared_ptr<StylesProxy> prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_callback) const;
- - std::shared_ptr<Styles> set_styles(
- + void add_project(
- + const IProjectPtr &project,
- + const IViewSettingsPtr &view_settings,
- + const std::shared_ptr<StylesProxy> &project_view_data);
- +
- + void set_styles(
- ProjectId project_id,
- - const std::shared_ptr<Styles> &styles,
- + const std::shared_ptr<StylesProxy> &styles,
- bool play_switch_animation);
- - void free_styles(
- - const std::shared_ptr<Styles> &styles);
- + void remove_project(
- + const IProjectPtr & project);
- - IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles);
- - IProjectConstPtrContainer const_projects_with_styles(const std::shared_ptr<Styles> &styles) const;
- -
- - std::shared_ptr<Styles> remove_project(const IProjectPtr & project);
- ICartoPtr carto() const;
- IProjectPtr project(ProjectId id);
- IProjectPtrContainer projects();
- @@ -485,7 +481,7 @@ private: // Types
- const IProjectPtr& in_project,
- const MapBox& in_bounding_box,
- const IViewSettingsPtr& in_view_settings,
- - std::shared_ptr<Styles> in_styles)
- + std::shared_ptr<StylesProxy> in_styles)
- : project(in_project)
- , bounding_box(in_bounding_box)
- , view_settings(in_view_settings)
- @@ -497,7 +493,7 @@ private: // Types
- IProjectPtr project;
- MapBox bounding_box;
- IViewSettingsPtr view_settings;
- - std::shared_ptr<Styles> styles;
- + std::shared_ptr<StylesProxy> styles;
- /*
- Флаг, который вЕводится для того, чтобы перевести состояние анимируемых объектов сцены сраЕу в финальное
- @@ -520,7 +516,8 @@ private:
- void camera_changed(const MapPosition &position);
- void process_viewport_change(ViewportChangeType type);
- - void process_dynamic_views(const std::function<void(IDynamicLayerView *)> &function);
- + template<typename T>
- + void process_dynamic_views(const T& function);
- // Установка/восстановление параметров для ЕагруЕки всех объектов карты.
- void begin_whole_map_scene_processing(
- @@ -606,7 +603,7 @@ private:
- std::unique_ptr<IndoorController> indoor_controller_;
- - StyleSetCache style_set_cache_;
- + std::shared_ptr<StyleSetCache> style_set_cache_;
- };
- Viewport::Impl::Impl(
- @@ -658,6 +655,7 @@ Viewport::Impl::Impl(
- , force_visible_layers_(force_visible_layers)
- , force_invisible_layers_(force_invisible_layers)
- , is_primary_viewport_(is_primary_viewport)
- + , style_set_cache_(std::make_shared<StyleSetCache>())
- {
- UNI_ASSERT(carto_);
- UNI_ASSERT(need_redraw_function_);
- @@ -751,7 +749,10 @@ Viewport::Impl::Impl(
- *this,
- *view_,
- *navigator_.get(),
- - std::bind(&Viewport::Impl::prepare_frame_rendering, this, std::placeholders::_1),
- + [this](tme::tmrender::AnimationContext& context)
- + {
- + return prepare_frame_rendering(context);
- + },
- need_redraw_function_,
- #ifdef TM_USE_EXTERNAL_RENDER
- render_,
- @@ -806,9 +807,9 @@ ViewportId Viewport::Impl::id() const
- return ViewportId(reinterpret_cast<boost::uintptr_t>(view_.get()));
- }
- -std::shared_ptr<Styles> Viewport::Impl::set_styles(
- +void Viewport::Impl::set_styles(
- const ProjectId project_id,
- - const std::shared_ptr<Styles>& styles,
- + const std::shared_ptr<StylesProxy>& styles,
- const bool play_switch_animation)
- {
- UNI_ASSERT(nullptr != styles);
- @@ -817,56 +818,36 @@ std::shared_ptr<Styles> Viewport::Impl::set_styles(
- if (target_project != projects_.end())
- {
- - style_set_cache_.look_after(styles);
- + style_set_cache_->unbind(project_id, target_project->second.styles);
- + style_set_cache_->bind(project_id, styles);
- - const auto old_styles = target_project->second.styles;
- target_project->second.styles = styles;
- target_project->second.finish_animation = !play_switch_animation;
- carto_->private_interface().set_viewport_styles(
- project_id,
- id(),
- - styles->storage,
- + styles->get().storage,
- nullptr);
- process_dynamic_views(
- - [&styles](IDynamicLayerView* const dynamic_layer_view)
- - {
- - dynamic_layer_view->set_styles(styles->storage);
- - });
- + [&styles](IDynamicLayerView& dynamic_layer_view)
- + {
- + dynamic_layer_view.set_styles(styles->get().storage);
- + });
- need_redraw_function_();
- - return old_styles;
- }
- UNILOG_WARNING << "trying to set styles on a absent project with id " << project_id;
- - return {};
- -}
- -
- -void Viewport::Impl::free_styles(const std::shared_ptr<Styles>& styles)
- -{
- - UNI_ASSERT(nullptr != styles);
- -
- -#ifdef UNI_ASSERT_ENABLED
- - for (const auto& item : projects_)
- - {
- - if (item.second.styles == styles)
- - {
- - UNILOG_WARNING << "freeing styles bound to a project";
- - break;
- - }
- - }
- -#endif // #ifdef UNI_ASSERT_ENABLED
- -
- - style_set_cache_.adandon(styles);
- }
- void Viewport::Impl::add_project(
- const IProjectPtr& in_project,
- const IViewSettingsPtr& in_view_settings,
- - const std::shared_ptr<Styles>& in_styles)
- + const std::shared_ptr<StylesProxy>& in_styles)
- {
- - UNI_ASSERT(in_styles->viewport_id == id());
- + UNI_ASSERT(in_styles->get().viewport_id == id());
- check_project_before_add(in_project, in_view_settings);
- @@ -880,16 +861,16 @@ void Viewport::Impl::add_project(
- in_styles
- });
- - auto error_string = get_styles_loading_errors(*in_styles);
- + auto error_string = get_styles_loading_errors(in_styles->get());
- - const auto data_validation_errors_callback = in_styles->source.data_validation_errors_callback;
- + const auto data_validation_errors_callback = in_styles->get().source.data_validation_errors_callback;
- // Регистрируем проект в Carto и ЕагруЕчике
- carto_->private_interface().add_project(
- in_project,
- parent_,
- in_view_settings,
- - in_styles->storage,
- + in_styles->get().storage,
- models_visibility_type_,
- data_validation_errors_callback ? &error_string : nullptr);
- @@ -898,32 +879,33 @@ void Viewport::Impl::add_project(
- data_validation_errors_callback(error_string);
- }
- - style_set_cache_.look_after(in_styles);
- + style_set_cache_->bind(in_project->id(), in_styles);
- }
- -std::shared_ptr<Styles> Viewport::Impl::prepare_styles(
- +std::shared_ptr<StylesProxy> Viewport::Impl::prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_callback) const
- {
- return StyleSetCache::prepare_styles(
- + style_set_cache_,
- id(),
- surface_manager_,
- { style_folder, style_file_name, data_validation_errors_callback });
- }
- -std::shared_ptr<Styles> Viewport::Impl::remove_project(const IProjectPtr &in_project)
- +void Viewport::Impl::remove_project(const IProjectPtr &in_project)
- {
- carto_->private_interface().remove_project(in_project, parent_);
- const auto project_view_iter = projects_.find(in_project->id());
- - const auto styles = project_view_iter->second.styles;
- UNI_ASSERT(project_view_iter != projects_.end());
- +
- + style_set_cache_->unbind(in_project->id(), project_view_iter->second.styles);
- projects_.erase(project_view_iter);
- + style_set_cache_->delete_scheduled_styles();
- // GTODO: unregister screen coordinates ?
- -
- - return styles;
- }
- std::chrono::milliseconds Viewport::Impl::current_time() const
- @@ -946,8 +928,10 @@ ISymbolContainerPtr Viewport::Impl::styles(const ProjectId project_id) const
- const auto project_iter = projects_.find(project_id);
- if (project_iter != projects_.end())
- {
- - UNI_ASSERT(project_iter->second.styles->storage);
- - return project_iter->second.styles->storage;
- + auto styles_set = project_iter->second.styles->get();
- +
- + UNI_ASSERT(styles_set.storage);
- + return styles_set.storage;
- }
- return {};
- @@ -1054,36 +1038,6 @@ IProjectConstPtrContainer Viewport::Impl::const_projects() const
- return project_container;
- }
- -IProjectPtrContainer Viewport::Impl::projects_with_styles(const std::shared_ptr<Styles> &styles)
- -{
- - auto result = tme::make_vector_with_capacity<IProjectPtr>(projects_.size());
- -
- - for (const auto& item : projects_)
- - {
- - if (item.second.styles == styles)
- - {
- - result.push_back(item.second.project);
- - }
- - }
- -
- - return result;
- -}
- -
- -IProjectConstPtrContainer Viewport::Impl::const_projects_with_styles(const std::shared_ptr<Styles> &styles) const
- -{
- - auto result = tme::make_vector_with_capacity<IProjectConstPtr>(projects_.size());
- -
- - for (const auto& item : projects_)
- - {
- - if (item.second.styles == styles)
- - {
- - result.push_back(item.second.project);
- - }
- - }
- -
- - return result;
- -}
- -
- IProjectPtrContainer Viewport::Impl::visible_projects() const
- {
- if (projects_.empty())
- @@ -1577,19 +1531,19 @@ void Viewport::Impl::set_view_settings(
- const auto found_project = projects_.find(project_id);
- if (found_project != projects_.end())
- {
- - const auto project_styles = found_project->second.styles;
- + const auto& project_styles = found_project->second.styles->get();
- found_project->second.project->private_interface().remove_viewport(parent_);
- std::string error_string;
- found_project->second.view_settings = in_view_settings;
- - const auto styles_loading_errors_callback = project_styles->source.data_validation_errors_callback;
- + const auto& styles_loading_errors_callback = project_styles.source.data_validation_errors_callback;
- carto_->private_interface().set_viewport_view(
- project_id,
- id(),
- in_view_settings,
- - project_styles->storage,
- + project_styles.storage,
- styles_loading_errors_callback ? &error_string : nullptr);
- found_project->second.project->private_interface().connect_viewport(parent_);
- @@ -1657,7 +1611,7 @@ void Viewport::Impl::force_render_init()
- void Viewport::Impl::external_render_context_lost()
- {
- - style_set_cache_.external_render_context_lost();
- + style_set_cache_->external_render_context_lost();
- for (auto& item : projects_)
- {
- @@ -1686,7 +1640,7 @@ void Viewport::Impl::external_render_context_recreated()
- }
- #endif // TM_USE_EXTERNAL_RENDER
- - style_set_cache_.external_render_context_recreated();
- + style_set_cache_->external_render_context_recreated();
- for (const auto& item : projects_)
- {
- @@ -1694,7 +1648,7 @@ void Viewport::Impl::external_render_context_recreated()
- item.second.project,
- parent_,
- item.second.view_settings,
- - item.second.styles->storage,
- + item.second.styles->get().storage,
- models_visibility_type_,
- nullptr);
- }
- @@ -1946,8 +1900,14 @@ bool Viewport::Impl::animate_projects(tme::tmrender::AnimationContext & context)
- bool Viewport::Impl::prepare_frame_rendering(tme::tmrender::AnimationContext & context)
- {
- + style_set_cache_->delete_scheduled_styles();
- +
- // Подготавливаем данные динамических слоёв
- - process_dynamic_views(std::bind(&IDynamicLayerView::prepare, std::placeholders::_1));
- + process_dynamic_views(
- + [](IDynamicLayerView& dynamic_layer_view)
- + {
- + dynamic_layer_view.prepare();
- + });
- // Анимируем объекты
- const bool is_redraw_needed = animate_projects(context);
- @@ -2010,18 +1970,21 @@ void Viewport::Impl::camera_changed(const MapPosition &)
- void Viewport::Impl::process_viewport_change(ViewportChangeType type)
- {
- - process_dynamic_views(std::bind(&IDynamicLayerView::process_viewport_change, std::placeholders::_1, type));
- + process_dynamic_views(
- + [type](IDynamicLayerView& dynamic_layer_view)
- + {
- + dynamic_layer_view.process_viewport_change(type);
- + });
- }
- -void Viewport::Impl::process_dynamic_views(const std::function<void(IDynamicLayerView *)> &function)
- +template<typename T>
- +void Viewport::Impl::process_dynamic_views(const T& function)
- {
- - UNI_ASSERT(function);
- -
- for (const LayerViewContainer::value_type &data : layer_views_)
- {
- if (data.view->is_dynamic())
- {
- - function(tme::checked_cast<IDynamicLayerView *>(data.view.get()));
- + function(*tme::checked_cast<IDynamicLayerView*>(data.view.get()));
- }
- }
- }
- @@ -2214,12 +2177,12 @@ ViewportId Viewport::id() const
- void Viewport::add_project(
- const IProjectPtr &in_project,
- const IViewSettingsPtr &in_view_settings,
- - const std::shared_ptr<Styles> &styles)
- + const std::shared_ptr<StylesProxy> &styles)
- {
- impl_->add_project(in_project, in_view_settings, styles);
- }
- -std::shared_ptr<Styles> Viewport::prepare_styles(
- +std::shared_ptr<StylesProxy> Viewport::prepare_styles(
- const UniFS::IDirPtr &style_folder,
- const std::string &style_file_name,
- const DataValidationErrorsFunction &data_validation_errors_callback) const
- @@ -2230,9 +2193,9 @@ std::shared_ptr<Styles> Viewport::prepare_styles(
- data_validation_errors_callback);
- }
- -std::shared_ptr<Styles> Viewport::remove_project(const IProjectPtr &in_project)
- +void Viewport::remove_project(const IProjectPtr &in_project)
- {
- - return impl_->remove_project(in_project);
- + impl_->remove_project(in_project);
- }
- ICartoPtr Viewport::carto() const
- @@ -2270,16 +2233,6 @@ IProjectConstPtrContainer Viewport::visible_projects() const
- return impl_->visible_const_projects();
- }
- -IProjectPtrContainer Viewport::projects_with_styles(const std::shared_ptr<Styles>& styles)
- -{
- - return impl_->projects_with_styles(styles);
- -}
- -
- -IProjectConstPtrContainer Viewport::projects_with_styles(const std::shared_ptr<Styles>& styles) const
- -{
- - return impl_->const_projects_with_styles(styles);
- -}
- -
- IViewportLayerProxyPtr Viewport::layer(const ProjectId project_id, const std::string &name) const
- {
- return impl_->layer(project_id, name);
- @@ -2513,31 +2466,19 @@ void Viewport::set_view_settings(
- impl_->set_view_settings(project_id, in_view_settings, play_switch_animation);
- }
- -
- -void Viewport::free_styles(const std::shared_ptr<Styles>& styles)
- -{
- - if (nullptr == styles)
- - {
- - UNILOG_ERROR << "can't free null styles";
- - }
- - else
- - {
- - impl_->free_styles(styles);
- - }
- -}
- -
- -std::shared_ptr<Styles> Viewport::set_styles(
- +void Viewport::set_styles(
- const ProjectId project_id,
- - const std::shared_ptr<Styles>& styles,
- + const std::shared_ptr<StylesProxy>& styles,
- const bool play_switch_animation)
- {
- if (nullptr == styles)
- {
- UNILOG_ERROR << "can't apply null styles";
- - return{};
- }
- -
- - return impl_->set_styles(project_id, styles, play_switch_animation);
- + else
- + {
- + impl_->set_styles(project_id, styles, play_switch_animation);
- + }
- }
- boost::optional<float> Viewport::max_3d_scale(const ProjectId project_id) const
- diff --git a/Projects/CartoQtTestAppLib/CartoWidget.hqt b/Projects/CartoQtTestAppLib/CartoWidget.hqt
- index f7b3819..9db959f 100644
- --- a/Projects/CartoQtTestAppLib/CartoWidget.hqt
- +++ b/Projects/CartoQtTestAppLib/CartoWidget.hqt
- @@ -368,7 +368,7 @@ private:
- boost::unordered_map<ProjectId, ProjectParameters> projects_;
- ActivityContainer viewport_activities_;
- - std::shared_ptr<Styles> cached_styles_;
- + std::shared_ptr<StylesProxy> cached_styles_;
- ICartoPtr carto_;
- std::shared_ptr<RenderTimeScaled> render_time_;
- diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- index 48c61c4..d55e1ae 100644
- --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- @@ -892,19 +892,8 @@ void CartoWidget::loadGlobalStyles(const QString & file_name)
- const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
- const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
- -
- - const auto old_styles = cached_styles_;
- cached_styles_ = viewport().prepare_styles(styles_folder, g_style_default, on_unknown_symbol);
- -
- - if (nullptr != old_styles)
- - {
- - for (const auto& project : viewport().projects_with_styles(old_styles))
- - {
- - viewport().set_styles(project->id(), cached_styles_);
- - }
- - viewport().free_styles(old_styles);
- - }
- }
- catch (const std::exception& e)
- {
- @@ -988,12 +977,7 @@ void CartoWidget::closeProjects(const bool emit_signal)
- for (const auto & params : projects_)
- {
- - const auto styles = viewport().remove_project(params.second.project_ptr);
- -
- - if (styles != cached_styles_)
- - {
- - viewport().free_styles(styles);
- - }
- + viewport().remove_project(params.second.project_ptr);
- }
- UNI_ASSERT(viewport().projects().empty());
- @@ -1018,12 +1002,7 @@ void CartoWidget::closeProject(const ProjectId project_id)
- if (currentCartoWidget())
- {
- - const auto styles = viewport().remove_project(project_ptr);
- -
- - if (viewport().projects_with_styles(styles).empty() && styles != cached_styles_)
- - {
- - viewport().free_styles(styles);
- - }
- + viewport().remove_project(project_ptr);
- }
- deinitActivities(project_id);
- @@ -1058,12 +1037,7 @@ void CartoWidget::setStylesPath(ProjectId project_id, const QString & styles_pat
- params.style_file_name,
- std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- - const auto old_styles = viewport().set_styles(project_id, styles);
- -
- - if (viewport().projects_with_styles(old_styles).empty() && cached_styles_ != old_styles)
- - {
- - viewport().free_styles(old_styles);
- - }
- + viewport().set_styles(project_id, styles);
- }
- emit stylesOpened(project_id);
- }
- @@ -1372,12 +1346,7 @@ void CartoWidget::setStyle(ProjectId project_id, const QString & style_file_name
- params.style_file_name,
- std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- - const auto old_styles = viewport().set_styles(project_id, styles);
- -
- - if (viewport().projects_with_styles(old_styles).empty() && cached_styles_ != old_styles)
- - {
- - viewport().free_styles(old_styles);
- - }
- + viewport().set_styles(project_id, styles);
- }
- }
- }
- --
- 1.9.5.msysgit.1
- From 82392920ff4314a1190a58bb2f742094b03249fa Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Mon, 13 Jul 2015 17:36:41 +0600
- Subject: [PATCH 22/24] =?UTF-8?q?=D0=91=D0=B5=D0=BD=D1=87=D0=BC=D0=B0?=
- =?UTF-8?q?=D1=80=D0=BA=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BA?=
- =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D0=B8=D1=80=D1=83=D0=B5=D1=82?=
- =?UTF-8?q?=D1=81=D1=8F.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Benchmark/src/Benchmark.cpp | 5 -----
- 1 file changed, 5 deletions(-)
- diff --git a/Projects/Benchmark/src/Benchmark.cpp b/Projects/Benchmark/src/Benchmark.cpp
- index 0d72fcd..80d9b10 100644
- --- a/Projects/Benchmark/src/Benchmark.cpp
- +++ b/Projects/Benchmark/src/Benchmark.cpp
- @@ -433,11 +433,6 @@ Result Benchmark::run(const Configuration &configuration)
- "3d.style",
- Carto::DataValidationErrorsFunction());
- - const auto styles_deleter = tme::make_guard([&styles, &viewport]()
- - {
- - viewport->free_styles(styles);
- - });
- -
- viewport->add_project(
- project,
- view_settings,
- --
- 1.9.5.msysgit.1
- From cd891496c96eeba20a3f1a8a9c305583091b2c7b Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Tue, 14 Jul 2015 10:01:18 +0600
- Subject: [PATCH 23/24] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD?=
- =?UTF-8?q?=D0=B8=D0=BB=20code=20review.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/Carto/Carto/IViewport.h | 2 +-
- Projects/Carto/src/Carto/StyleSetCache.cpp | 36 +++++++++++++++++++-------
- Projects/Carto/src/Carto/Viewport.cpp | 16 ++++++------
- Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 6 ++---
- 4 files changed, 38 insertions(+), 22 deletions(-)
- diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
- index c8e6c21..8e57e28 100644
- --- a/Projects/Carto/Carto/IViewport.h
- +++ b/Projects/Carto/Carto/IViewport.h
- @@ -98,7 +98,7 @@ public:
- const DataValidationErrorsFunction &data_validation_errors_callback) const = 0;
- //! Удаление проекта иЕ порта просмотра.
- - virtual void remove_project(const IProjectPtr &project) = 0;
- + virtual void remove_project(const IProjectPtr & project) = 0;
- /*!
- * Получение карты, к которой привяЕана данная область просмотра.
- diff --git a/Projects/Carto/src/Carto/StyleSetCache.cpp b/Projects/Carto/src/Carto/StyleSetCache.cpp
- index 67cd483..7d89b0a 100644
- --- a/Projects/Carto/src/Carto/StyleSetCache.cpp
- +++ b/Projects/Carto/src/Carto/StyleSetCache.cpp
- @@ -13,13 +13,11 @@ namespace
- {
- std::shared_ptr<tme::CSymbolContainer> symbols_from_source(
- - const ISurfaceManagerPtr& surface_manager,
- + tme::tmrender::ISurfaceManager& surface_manager,
- const StylesLoadingData& source)
- {
- - UNI_ASSERT(nullptr != surface_manager);
- -
- return std::make_shared<tme::CSymbolContainer>(
- - *surface_manager,
- + surface_manager,
- source.folder,
- source.file_name);
- }
- @@ -46,7 +44,6 @@ StylesProxy::~StylesProxy()
- }
- }
- -
- Styles& StylesProxy::get()
- {
- return *styles_.get();
- @@ -73,13 +70,17 @@ auto StyleSetCache::prepare_styles(
- const ISurfaceManagerPtr& reference_surface_manager,
- const StylesLoadingData& source) -> std::shared_ptr<StylesProxy>
- {
- - UNI_ASSERT(nullptr != reference_surface_manager);
- + if (nullptr == reference_surface_manager)
- + {
- + UNILOG_ERROR << "surface manager is null";
- + return {};
- + }
- const ISurfaceManagerPtr surface_manager(reference_surface_manager->clone(true));
- - const auto styles_storage = symbols_from_source(surface_manager, source);
- + const auto styles_storage = symbols_from_source(*surface_manager, source);
- - auto new_styles_set = std::make_unique<Styles>(source);
- + auto new_styles_set = std::unique_ptr<Styles>(new Styles(source));
- new_styles_set->viewport_id = host_viewport_id;
- new_styles_set->storage = styles_storage;
- @@ -90,11 +91,24 @@ auto StyleSetCache::prepare_styles(
- void StyleSetCache::bind(const ProjectId project, const std::shared_ptr<StylesProxy>& styles)
- {
- + if (nullptr == styles)
- + {
- + UNILOG_ERROR << "styles is null";
- + return;
- + }
- +
- + if (nullptr == styles->get().surface_manager)
- + {
- + UNILOG_ERROR << "styles without surface manager";
- + return;
- + }
- +
- const auto found = bound_styles_.find(styles);
- if (found == bound_styles_.end())
- {
- - bound_styles_.emplace(styles, std::set<ProjectId>{}).first->second.insert(project);
- + const auto new_binding = bound_styles_.emplace(styles, std::set<ProjectId>{});
- + new_binding.first->second.insert(project);
- }
- else
- {
- @@ -128,6 +142,7 @@ void StyleSetCache::external_render_context_lost()
- for (const auto& item : bound_styles_)
- {
- auto& styles = item.first->get();
- + UNI_ASSERT(nullptr != styles.surface_manager);
- styles.storage.reset();
- styles.surface_manager->purge_uploaded_surfaces();
- @@ -139,8 +154,9 @@ void StyleSetCache::external_render_context_recreated()
- for (const auto& item : bound_styles_)
- {
- auto& styles = item.first->get();
- + UNI_ASSERT(nullptr != styles.surface_manager);
- - const auto new_styles_storage = symbols_from_source(styles.surface_manager, styles.source);
- + const auto new_styles_storage = symbols_from_source(*styles.surface_manager, styles.source);
- styles.storage = new_styles_storage;
- diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
- index 890960c..68cc7b3 100644
- --- a/Projects/Carto/src/Carto/Viewport.cpp
- +++ b/Projects/Carto/src/Carto/Viewport.cpp
- @@ -809,37 +809,37 @@ ViewportId Viewport::Impl::id() const
- void Viewport::Impl::set_styles(
- const ProjectId project_id,
- - const std::shared_ptr<StylesProxy>& styles,
- + const std::shared_ptr<StylesProxy>& new_styles,
- const bool play_switch_animation)
- {
- - UNI_ASSERT(nullptr != styles);
- + UNI_ASSERT(nullptr != new_styles);
- const auto target_project = projects_.find(project_id);
- if (target_project != projects_.end())
- {
- style_set_cache_->unbind(project_id, target_project->second.styles);
- - style_set_cache_->bind(project_id, styles);
- + style_set_cache_->bind(project_id, new_styles);
- - target_project->second.styles = styles;
- + target_project->second.styles = new_styles;
- target_project->second.finish_animation = !play_switch_animation;
- carto_->private_interface().set_viewport_styles(
- project_id,
- id(),
- - styles->get().storage,
- + new_styles->get().storage,
- nullptr);
- process_dynamic_views(
- - [&styles](IDynamicLayerView& dynamic_layer_view)
- + [&new_styles](IDynamicLayerView& dynamic_layer_view)
- {
- - dynamic_layer_view.set_styles(styles->get().storage);
- + dynamic_layer_view.set_styles(new_styles->get().storage);
- });
- need_redraw_function_();
- }
- - UNILOG_WARNING << "trying to set styles on a absent project with id " << project_id;
- + UNILOG_WARNING << "trying to set styles on an absent project with id " << project_id;
- }
- void Viewport::Impl::add_project(
- diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- index d55e1ae..492b2e4 100644
- --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- @@ -1990,16 +1990,16 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
- view_settings_block);
- UNI_ASSERT(view_settings);
- - const auto styles = viewport().prepare_styles(
- + const auto prepared_styles = viewport().prepare_styles(
- project_param.styles_folder,
- project_param.style_file_name,
- std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- - UNI_ASSERT(styles);
- + UNI_ASSERT(prepared_styles);
- viewport().add_project(
- project_param.project_ptr,
- view_settings,
- - styles);
- + prepared_styles);
- }
- catch (::Map::IO::FileNotFoundException &path_exception)
- {
- --
- 1.9.5.msysgit.1
- From caf8a489c51432de419379fc0694601a29e7133c Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
- =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
- =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
- Date: Tue, 14 Jul 2015 16:36:00 +0600
- Subject: [PATCH 24/24] =?UTF-8?q?=D0=98=20=D0=B5=D1=89=D1=91=20=D0=B4?=
- =?UTF-8?q?=D0=BE=D1=81=D1=8B=D0=BF=D0=B0=D0=BB=20=D0=BF=D1=80=D0=B0=D0=B2?=
- =?UTF-8?q?=D0=BE=D0=BA=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?=
- =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=20=D0=BE=D1=82=20=D0=BF=D0=BE?=
- =?UTF-8?q?=D1=86=D0=BE=D0=BD=D0=BE=D0=B2=20=D0=B8=20=D0=BA=D0=BE=D0=BC?=
- =?UTF-8?q?=D0=BF=D0=B8=D0=BB=D1=8F=D1=82=D0=BE=D1=80=D0=BE=D0=B2.?=
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ---
- Projects/AndroidTestApp/jni/AndroidTestApp.cpp | 9 ++++++---
- Projects/Carto/src/Carto/StyleSetCache.cpp | 8 +++++---
- Projects/Carto/src/Carto/Viewport.cpp | 9 +--------
- Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 12 ++++++------
- 4 files changed, 18 insertions(+), 20 deletions(-)
- diff --git a/Projects/AndroidTestApp/jni/AndroidTestApp.cpp b/Projects/AndroidTestApp/jni/AndroidTestApp.cpp
- index 129dd1e..517f28c 100644
- --- a/Projects/AndroidTestApp/jni/AndroidTestApp.cpp
- +++ b/Projects/AndroidTestApp/jni/AndroidTestApp.cpp
- @@ -92,12 +92,15 @@ int main(int, char *[])
- const UniFS::IDirPtr style_folder = Carto::get_style_folder(map_path);
- - window.viewport().add_project(
- - project,
- - view_settings,
- + const auto new_styles = window.viewport().prepare_styles(
- style_folder,
- "3d.style",
- Carto::DataValidationErrorsFunction());
- +
- + window.viewport().add_project(
- + project,
- + view_settings,
- + new_styles);
- }
- window.viewport().navigator().set_position(window.viewport().navigator().full_map_position());
- diff --git a/Projects/Carto/src/Carto/StyleSetCache.cpp b/Projects/Carto/src/Carto/StyleSetCache.cpp
- index 7d89b0a..e88fe1f 100644
- --- a/Projects/Carto/src/Carto/StyleSetCache.cpp
- +++ b/Projects/Carto/src/Carto/StyleSetCache.cpp
- @@ -1,10 +1,12 @@
- #include "stable.h"
- +#include "StyleSetCache.h"
- +
- #include <tmSymbol/CSymbolContainer.h>
- #include <tmRender/ISurfaceManager.h>
- -#include "StyleSetCache.h"
- +#include <tmCore/make_unique.h>
- namespace Carto
- {
- @@ -80,7 +82,7 @@ auto StyleSetCache::prepare_styles(
- const auto styles_storage = symbols_from_source(*surface_manager, source);
- - auto new_styles_set = std::unique_ptr<Styles>(new Styles(source));
- + auto new_styles_set = tme::make_unique<Styles>(source);
- new_styles_set->viewport_id = host_viewport_id;
- new_styles_set->storage = styles_storage;
- @@ -122,7 +124,7 @@ void StyleSetCache::unbind(const ProjectId project, const std::shared_ptr<Styles
- if (found == bound_styles_.end())
- {
- - UNILOG_WARNING << "projeect " << project << " has already been unbound";
- + UNILOG_WARNING << "project " << project << " has already been unbound";
- }
- else
- {
- diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
- index 68cc7b3..9a773e5 100644
- --- a/Projects/Carto/src/Carto/Viewport.cpp
- +++ b/Projects/Carto/src/Carto/Viewport.cpp
- @@ -2471,14 +2471,7 @@ void Viewport::set_styles(
- const std::shared_ptr<StylesProxy>& styles,
- const bool play_switch_animation)
- {
- - if (nullptr == styles)
- - {
- - UNILOG_ERROR << "can't apply null styles";
- - }
- - else
- - {
- - impl_->set_styles(project_id, styles, play_switch_animation);
- - }
- + impl_->set_styles(project_id, styles, play_switch_animation);
- }
- boost::optional<float> Viewport::max_3d_scale(const ProjectId project_id) const
- diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- index 492b2e4..cc28579 100644
- --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
- @@ -1032,12 +1032,12 @@ void CartoWidget::setStylesPath(ProjectId project_id, const QString & styles_pat
- params.styles_folder = new_styles_folder;
- if (currentCartoWidget())
- {
- - const auto styles = viewport().prepare_styles(
- + const auto new_styles = viewport().prepare_styles(
- params.styles_folder,
- params.style_file_name,
- std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- - viewport().set_styles(project_id, styles);
- + viewport().set_styles(project_id, new_styles);
- }
- emit stylesOpened(project_id);
- }
- @@ -1341,12 +1341,12 @@ void CartoWidget::setStyle(ProjectId project_id, const QString & style_file_name
- if (currentCartoWidget())
- {
- - const auto styles = viewport().prepare_styles(
- + const auto new_styles = viewport().prepare_styles(
- params.styles_folder,
- params.style_file_name,
- std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- - viewport().set_styles(project_id, styles);
- + viewport().set_styles(project_id, new_styles);
- }
- }
- }
- @@ -1660,7 +1660,7 @@ void CartoWidget::initSlaveCartoWidget(
- {
- try
- {
- - const auto styles = widget_viewport.prepare_styles(
- + const auto new_styles = widget_viewport.prepare_styles(
- params.second.styles_folder,
- params.second.style_file_name,
- std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
- @@ -1668,7 +1668,7 @@ void CartoWidget::initSlaveCartoWidget(
- widget_viewport.add_project(
- params.second.project_ptr,
- reference_viewport.view_settings(params.second.project_ptr->id()),
- - styles);
- + new_styles);
- }
- catch (...)
- {
- --
- 1.9.5.msysgit.1
Add Comment
Please, Sign In to add comment