Guest User

Untitled

a guest
Jul 14th, 2015
430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 316.74 KB | None | 0 0
  1. From 1451ce81d4aa5b8686500d2b0e3e0d881fb24a64 Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  3. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  4. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  5. Date: Mon, 29 Jun 2015 10:32:03 +0600
  6. Subject: [PATCH 01/24] =?UTF-8?q?[LMAP-1478]=20move=20=D0=BA=D0=BE=D0=BD?=
  7. =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=20=D0=B4=D0=BB?=
  8. =?UTF-8?q?=D1=8F=20CGraphicsPrimitive?=
  9. MIME-Version: 1.0
  10. Content-Type: text/plain; charset=UTF-8
  11. Content-Transfer-Encoding: 8bit
  12.  
  13. ---
  14. Projects/tmRender/CGraphicsPrimitive.h | 24 ++++++++++++++++++++++++
  15. 1 file changed, 24 insertions(+)
  16.  
  17. diff --git a/Projects/tmRender/CGraphicsPrimitive.h b/Projects/tmRender/CGraphicsPrimitive.h
  18. index d5078d5..4820cb7 100644
  19. --- a/Projects/tmRender/CGraphicsPrimitive.h
  20. +++ b/Projects/tmRender/CGraphicsPrimitive.h
  21. @@ -1,5 +1,7 @@
  22. #pragma once
  23.  
  24. +#include <unicore/uni_assert.h>
  25. +
  26. #include <tmCore/CorTypes.h>
  27.  
  28. #include "Fwd.h"
  29. @@ -384,6 +386,28 @@ public:
  30. }
  31. }
  32.  
  33. + CGraphicsPrimitive(CGraphicsPrimitive && other)
  34. + : SType(other.SType)
  35. + , GType(other.GType)
  36. + , StartOrIndex(other.StartOrIndex)
  37. + , Count(other.Count)
  38. + , Flags(other.Flags)
  39. + {
  40. + switch (SType)
  41. + {
  42. + case EPST_RANGE:
  43. + break;
  44. + case EPST_IDX32:
  45. + other.StartOrIndex.Index32 = nullptr;
  46. + break;
  47. + case EPST_IDX16:
  48. + other.StartOrIndex.Index16 = nullptr;
  49. + break;
  50. + default:
  51. + UNI_ASSERT(false);
  52. + }
  53. + }
  54. +
  55. ~CGraphicsPrimitive()
  56. {
  57. deleteIndex();
  58. --
  59. 1.9.5.msysgit.1
  60.  
  61. From 6b141f45d25bee489d4f2e5e2035becf55b95c94 Mon Sep 17 00:00:00 2001
  62. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  63. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  64. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  65. Date: Mon, 13 Jul 2015 17:49:25 +0600
  66. Subject: [PATCH 02/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
  67. =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20make=5Fintrusive?=
  68. MIME-Version: 1.0
  69. Content-Type: text/plain; charset=UTF-8
  70. Content-Transfer-Encoding: 8bit
  71.  
  72. ---
  73. Projects/tmCore/make_intrusive.h | 14 ++++++++++++++
  74. Projects/tmCore/tmCore.gyp | 1 +
  75. 2 files changed, 15 insertions(+)
  76. create mode 100644 Projects/tmCore/make_intrusive.h
  77.  
  78. diff --git a/Projects/tmCore/make_intrusive.h b/Projects/tmCore/make_intrusive.h
  79. new file mode 100644
  80. index 0000000..2e023f0
  81. --- /dev/null
  82. +++ b/Projects/tmCore/make_intrusive.h
  83. @@ -0,0 +1,14 @@
  84. +#pragma once
  85. +
  86. +#include <boost/intrusive_ptr.hpp>
  87. +
  88. +namespace tme
  89. +{
  90. +
  91. +template <class T, class... Args>
  92. +inline boost::intrusive_ptr<T> make_intrusive(Args &&... args)
  93. +{
  94. + return boost::intrusive_ptr<T>(new T(std::forward<Args>(args)...));
  95. +}
  96. +
  97. +} // namespace tme
  98. diff --git a/Projects/tmCore/tmCore.gyp b/Projects/tmCore/tmCore.gyp
  99. index ab243e6..2f97b8e 100644
  100. --- a/Projects/tmCore/tmCore.gyp
  101. +++ b/Projects/tmCore/tmCore.gyp
  102. @@ -24,6 +24,7 @@
  103. 'ISystem.h',
  104. 'IThread.h',
  105. 'make_unique.h',
  106. + 'make_intrusive.h',
  107. 'make_vector_with_capacity.h',
  108. 'move_and_clear.h',
  109. 'clear_and_reserve.h',
  110. --
  111. 1.9.5.msysgit.1
  112.  
  113. From c59164944078784aebde4bbfc1df8e4e4edc1718 Mon Sep 17 00:00:00 2001
  114. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  115. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  116. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  117. Date: Mon, 29 Jun 2015 10:34:40 +0600
  118. Subject: [PATCH 03/24] =?UTF-8?q?[LMAP-1478]=20setDataCopyVertexRenderNode?=
  119. =?UTF-8?q?=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF=D1=80=D0=B8?=
  120. =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82=20intrusive=5Fptr?=
  121. MIME-Version: 1.0
  122. Content-Type: text/plain; charset=UTF-8
  123. Content-Transfer-Encoding: 8bit
  124.  
  125. ---
  126. Projects/tmRender/CLabelSceneNode.h | 2 +-
  127. Projects/tmRender/CPrimitiveSetSceneNode.h | 2 +-
  128. Projects/tmRender/CRasterSceneNode.h | 2 +-
  129. Projects/tmRender/IMorphAnimatedSceneNode.h | 2 +-
  130. Projects/tmRender/src/CLabelSceneNode.cpp | 2 +-
  131. Projects/tmRender/src/CRasterSceneNode.cpp | 4 +---
  132. 6 files changed, 6 insertions(+), 8 deletions(-)
  133.  
  134. diff --git a/Projects/tmRender/CLabelSceneNode.h b/Projects/tmRender/CLabelSceneNode.h
  135. index 1ffaf8d..2feaaad 100644
  136. --- a/Projects/tmRender/CLabelSceneNode.h
  137. +++ b/Projects/tmRender/CLabelSceneNode.h
  138. @@ -69,7 +69,7 @@ public: // IMorphAnimatedSceneNode
  139.  
  140. virtual void setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &vertices) override;
  141. virtual IVertexRenderNode * getDataCopyVertexRenderNode() override;
  142. - virtual void setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node_) override;
  143. + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node_) override;
  144. virtual SVertexStream * getDataCopyVertices() override;
  145. virtual const SVertexStream * getDataCopyConstVertices() const override;
  146.  
  147. diff --git a/Projects/tmRender/CPrimitiveSetSceneNode.h b/Projects/tmRender/CPrimitiveSetSceneNode.h
  148. index e187670..c96f779 100644
  149. --- a/Projects/tmRender/CPrimitiveSetSceneNode.h
  150. +++ b/Projects/tmRender/CPrimitiveSetSceneNode.h
  151. @@ -109,7 +109,7 @@ public: // IMorphAnimatedSceneNode.
  152. virtual bool accessDataCopyPrimitives(IMorphSourcePrimitiveEnumerator &enumerator) override;
  153.  
  154. virtual void setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &vertices) override;
  155. - virtual void setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node) override;
  156. + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node) override;
  157. virtual SVertexStream * getDataCopyVertices() override;
  158. virtual const SVertexStream * getDataCopyConstVertices() const override;
  159. virtual IVertexRenderNode * getDataCopyVertexRenderNode() override;
  160. diff --git a/Projects/tmRender/CRasterSceneNode.h b/Projects/tmRender/CRasterSceneNode.h
  161. index 77610ce..f8c357a 100644
  162. --- a/Projects/tmRender/CRasterSceneNode.h
  163. +++ b/Projects/tmRender/CRasterSceneNode.h
  164. @@ -62,7 +62,7 @@ public: // IMorphAnimatedSceneNode
  165.  
  166. virtual void setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &vertices) override;
  167. virtual IVertexRenderNode * getDataCopyVertexRenderNode() override;
  168. - virtual void setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node_) override;
  169. + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node_) override;
  170. virtual SVertexStream * getDataCopyVertices() override;
  171. virtual const SVertexStream * getDataCopyConstVertices() const override;
  172.  
  173. diff --git a/Projects/tmRender/IMorphAnimatedSceneNode.h b/Projects/tmRender/IMorphAnimatedSceneNode.h
  174. index 2966a7c..2738a94 100644
  175. --- a/Projects/tmRender/IMorphAnimatedSceneNode.h
  176. +++ b/Projects/tmRender/IMorphAnimatedSceneNode.h
  177. @@ -391,7 +391,7 @@ public:
  178. virtual IVertexRenderNode * getDataCopyVertexRenderNode() = 0;
  179.  
  180. // Замена целиком уЕла с вершинным буфером
  181. - virtual void setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node) = 0;
  182. + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node) = 0;
  183.  
  184. virtual void setDataCopyCulling(ERenderFaceCulling culling) = 0;
  185. virtual void setDataCopyDepthTest(ERenderDepthTestMode depthmode, ERenderDepthTestFunc depthfunc) = 0;
  186. diff --git a/Projects/tmRender/src/CLabelSceneNode.cpp b/Projects/tmRender/src/CLabelSceneNode.cpp
  187. index a8d01c2..5e7b9b4 100644
  188. --- a/Projects/tmRender/src/CLabelSceneNode.cpp
  189. +++ b/Projects/tmRender/src/CLabelSceneNode.cpp
  190. @@ -179,7 +179,7 @@ IVertexRenderNode * CLabelSceneNode::getDataCopyVertexRenderNode()
  191. return nullptr;
  192. }
  193.  
  194. -void CLabelSceneNode::setDataCopyVertexRenderNode(IVertexRenderNode * const)
  195. +void CLabelSceneNode::setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> &)
  196. {
  197. UNI_ASSERT(false);
  198. }
  199. diff --git a/Projects/tmRender/src/CRasterSceneNode.cpp b/Projects/tmRender/src/CRasterSceneNode.cpp
  200. index 0ab5bdb..40ffb3a 100644
  201. --- a/Projects/tmRender/src/CRasterSceneNode.cpp
  202. +++ b/Projects/tmRender/src/CRasterSceneNode.cpp
  203. @@ -394,10 +394,8 @@ void CRasterSceneNode::setDataCopyVertices(const boost::intrusive_ptr<SVertexStr
  204. UNI_ASSERT(false);
  205. }
  206.  
  207. -void CRasterSceneNode::setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node)
  208. +void CRasterSceneNode::setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> &)
  209. {
  210. - UNI_UNUSED(vertex_render_node);
  211. -
  212. UNI_ASSERT(false);
  213. TM_THROW_AND_LOG(std::runtime_error("CRasterSceneNode::setDataCopyVertexRenderNode not implemented."));
  214. }
  215. --
  216. 1.9.5.msysgit.1
  217.  
  218. From 832b59b608ecfabbfa6b30edbd4d441e17e40f56 Mon Sep 17 00:00:00 2001
  219. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  220. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  221. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  222. Date: Mon, 29 Jun 2015 10:36:43 +0600
  223. Subject: [PATCH 04/24] =?UTF-8?q?[LMAP-1478]=20=D0=A0=D0=B5=D1=84=D0=B0?=
  224. =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20CPrimitiveSetScene?=
  225. =?UTF-8?q?Node.=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20=D1=80=D1=83?=
  226. =?UTF-8?q?=D1=87=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?=
  227. =?UTF-8?q?=20=D1=81=20RefCounted-=D1=82=D0=B8=D0=BF=D0=B0=D0=BC=D0=B8.=20?=
  228. =?UTF-8?q?=D0=A1=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20=D0=B2=D0=BC=D0=B5=D1=81?=
  229. =?UTF-8?q?=D1=82=D0=BE=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB?=
  230. =?UTF-8?q?=D0=B5=D0=B9,=20=D1=82=D0=B0=D0=BC=20=D0=B3=D0=B4=D0=B5=20?=
  231. =?UTF-8?q?=D1=8D=D1=82=D0=BE=20=D0=BD=D1=83=D0=B6=D0=BD=D0=BE.?=
  232. MIME-Version: 1.0
  233. Content-Type: text/plain; charset=UTF-8
  234. Content-Transfer-Encoding: 8bit
  235.  
  236. ---
  237. Projects/tmRender/CPrimitiveSetSceneNode.h | 8 +-
  238. Projects/tmRender/src/CPrimitiveSetSceneNode.cpp | 454 ++++++++---------------
  239. 2 files changed, 158 insertions(+), 304 deletions(-)
  240.  
  241. diff --git a/Projects/tmRender/CPrimitiveSetSceneNode.h b/Projects/tmRender/CPrimitiveSetSceneNode.h
  242. index c96f779..6fe3bfa 100644
  243. --- a/Projects/tmRender/CPrimitiveSetSceneNode.h
  244. +++ b/Projects/tmRender/CPrimitiveSetSceneNode.h
  245. @@ -41,8 +41,8 @@ public:
  246. * \param callback интерфейс сообщения раЕделяемому буферу, о требовании или
  247. * отсутствии требования добавлять раЕделяемую ноду в дерево рендеринга
  248. */
  249. - void beginSet(SVertexStream * vertices, ISharedBufferCallback *callback);
  250. - void addPrimitive(const CGraphicsPrimitive & other);
  251. + void beginSet(const boost::intrusive_ptr<SVertexStream> & vertices, ISharedBufferCallback *callback);
  252. + void addPrimitive(const CGraphicsPrimitive & shared_primitive);
  253. void addPrimitive(
  254. EPrimitiveGraphicsType type,
  255. tm_size_type start,
  256. @@ -150,6 +150,7 @@ protected:
  257.  
  258. private:
  259. void resetVerticesRange();
  260. + void addPrimitive(const boost::intrusive_ptr<CPrimitiveRenderNode> & shared_primitive);
  261.  
  262. private: // геттеры примитивов
  263. static bool get_source_primitives(
  264. @@ -174,7 +175,8 @@ private:
  265. std::shared_ptr<SDataCopy> DataCopy;
  266. EAnimationMethod animation_method_;
  267.  
  268. - std::vector<CPrimitiveRenderNode *> Primitives; // Набор примитивов над вышележащим вершинным буфером
  269. + // Набор примитивов над вышележащим вершинным буфером.
  270. + std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> Primitives;
  271. tm_size_type SourceStart; // Начало диапаЕона вершин, испольЕуемых примитивами этого объекта
  272. tm_size_type SourceEnd; // Конец диапаЕона вершин, испольЕуемых примитивами этого объекта
  273. // Вершинный буфер исходных вершин. Предполагается неиЕменным, испольЕуется для соЕдания локальной копии.
  274. diff --git a/Projects/tmRender/src/CPrimitiveSetSceneNode.cpp b/Projects/tmRender/src/CPrimitiveSetSceneNode.cpp
  275. index 2428e8d..9b884f3 100644
  276. --- a/Projects/tmRender/src/CPrimitiveSetSceneNode.cpp
  277. +++ b/Projects/tmRender/src/CPrimitiveSetSceneNode.cpp
  278. @@ -3,6 +3,7 @@
  279. #include "../CPrimitiveSetSceneNode.h"
  280.  
  281. #include <tmCore/Config.h>
  282. +#include <tmCore/make_intrusive.h>
  283. #include <tmRender/VertexStream.inl>
  284. #include "../CVertexRenderNode.h"
  285. #include "../IMorphAnimator.h"
  286. @@ -16,10 +17,10 @@ namespace tmrender
  287. namespace
  288. {
  289.  
  290. -class CVertexRenderNodeProxy : public IVertexRenderNode
  291. +class CVertexRenderNodeProxy final : public IVertexRenderNode
  292. {
  293. public:
  294. - CVertexRenderNodeProxy(const IVertexRenderNode *vertex_render_node)
  295. + explicit CVertexRenderNodeProxy(const boost::intrusive_ptr<const IVertexRenderNode> & vertex_render_node)
  296. : IVertexRenderNode(nullptr)
  297. , shared_buffer_(vertex_render_node)
  298. {
  299. @@ -61,80 +62,62 @@ public:
  300. }
  301.  
  302. private:
  303. - boost::intrusive_ptr<const IVertexRenderNode> shared_buffer_;
  304. + const boost::intrusive_ptr<const IVertexRenderNode> shared_buffer_;
  305. };
  306.  
  307. } // namespace
  308.  
  309. -struct CPrimitiveSetSceneNode::SDataCopy
  310. +struct CPrimitiveSetSceneNode::SDataCopy final
  311. {
  312. - SDataCopy(CPrimitiveSetSceneNode *node);
  313. + explicit SDataCopy(CPrimitiveSetSceneNode & node);
  314. ~SDataCopy();
  315.  
  316. - CPrimitiveSetSceneNode *node_; // source node
  317. + CPrimitiveSetSceneNode & node_;
  318.  
  319. - IVertexRenderNode * render_node_; // текущая рабочая копия, содержащая морфированные вершины
  320. + // текущая рабочая копия, содержащая морфированные вершины.
  321. + boost::intrusive_ptr<IVertexRenderNode> render_node_;
  322. boost::intrusive_ptr<CVertexRenderNodeProxy> area_render_node_;
  323. boost::intrusive_ptr<CVertexRenderNodeProxy> line_render_node_;
  324. // морфированные примитивы. Если Еадается локальный вершинный буфер, то они
  325. // автоматом присоединяются к соотвествующей вертексной ноде, иначе вершинный
  326. // буфер остается внешним(исходным или морфированным) и присоединение происходит к нему
  327. - std::vector<CPrimitiveRenderNode *> primitives_;
  328. + std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> primitives_;
  329. // морфированные примитивы, эти примитивы служат для двухпроходного
  330. // рендеринга (площадные, линейные)
  331. - std::vector<CPrimitiveRenderNode *> area_primitives_;
  332. - std::vector<CPrimitiveRenderNode *> line_primitives_;
  333. + std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> area_primitives_;
  334. + std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> line_primitives_;
  335. // Флаг вЕведен, когда установлены примитивы для копии.
  336. - bool use_copy_primitives_;
  337. + bool use_copy_primitives_ = false;
  338. };
  339. //------------------------------------------------------------------------------------------------------------
  340. -CPrimitiveSetSceneNode::SDataCopy::SDataCopy(CPrimitiveSetSceneNode *node)
  341. +CPrimitiveSetSceneNode::SDataCopy::SDataCopy(CPrimitiveSetSceneNode & node)
  342. : node_(node)
  343. - , render_node_(0)
  344. - , primitives_()
  345. - , use_copy_primitives_(false)
  346. {
  347. }
  348.  
  349. CPrimitiveSetSceneNode::SDataCopy::~SDataCopy()
  350. {
  351. - if (render_node_)
  352. + if (render_node_ && node_.Callback)
  353. {
  354. - render_node_->drop();
  355. - if (node_->Callback)
  356. - {
  357. - node_->Callback->requireSharedBuffer(node_);
  358. - }
  359. - }
  360. - for (CPrimitiveRenderNode *primitive : primitives_)
  361. - {
  362. - primitive->drop();
  363. - }
  364. - for (CPrimitiveRenderNode *primitive : area_primitives_)
  365. - {
  366. - primitive->drop();
  367. - }
  368. - for (CPrimitiveRenderNode *primitive : line_primitives_)
  369. - {
  370. - primitive->drop();
  371. + node_.Callback->requireSharedBuffer(&node_);
  372. }
  373. }
  374.  
  375. bool CPrimitiveSetSceneNode::get_source_primitives(
  376. SPrimitiveData &primitive_data,
  377. - IMorphAnimatedSceneNode *primitive_set_scene,
  378. - int index)
  379. + IMorphAnimatedSceneNode * const primitive_set_scene,
  380. + const int index)
  381. {
  382. - CPrimitiveSetSceneNode *scene_node = static_cast<CPrimitiveSetSceneNode *>(primitive_set_scene);
  383. + UNI_ASSERT(primitive_set_scene);
  384. + auto & scene_node = checked_cast<CPrimitiveSetSceneNode &>(*primitive_set_scene);
  385. if (index < 0
  386. - || scene_node->Primitives.size() <= size_t(index))
  387. + || scene_node.Primitives.size() <= size_t(index))
  388. {
  389. return false;
  390. }
  391.  
  392. - CPrimitiveRenderNode *requested_primitive = scene_node->Primitives[
  393. - static_cast<size_t>(index)];
  394. - primitive_data.Primitive = requested_primitive;
  395. + const auto & requested_primitive = scene_node.Primitives[static_cast<size_t>(index)];
  396. + primitive_data.Primitive = requested_primitive.get();
  397. primitive_data.ColorIndex = &requested_primitive->accessColorIndex();
  398.  
  399. return true;
  400. @@ -142,19 +125,19 @@ bool CPrimitiveSetSceneNode::get_source_primitives(
  401.  
  402. bool CPrimitiveSetSceneNode::get_source_const_primitives(
  403. SPrimitiveConstData &primitive_data,
  404. - const IMorphAnimatedSceneNode *primitive_set_scene,
  405. - int index)
  406. + const IMorphAnimatedSceneNode * const primitive_set_scene,
  407. + const int index)
  408. {
  409. - const CPrimitiveSetSceneNode *scene_node = static_cast<const CPrimitiveSetSceneNode *>(primitive_set_scene);
  410. + UNI_ASSERT(primitive_set_scene);
  411. + const auto & scene_node = checked_cast<const CPrimitiveSetSceneNode &>(*primitive_set_scene);
  412. if (index < 0
  413. - || scene_node->Primitives.size() <= size_t(index))
  414. + || scene_node.Primitives.size() <= size_t(index))
  415. {
  416. return false;
  417. }
  418.  
  419. - CPrimitiveRenderNode *requested_primitive = scene_node->Primitives[
  420. - static_cast<size_t>(index)];
  421. - primitive_data.Primitive = requested_primitive;
  422. + const auto & requested_primitive = scene_node.Primitives[static_cast<size_t>(index)];
  423. + primitive_data.Primitive = requested_primitive.get();
  424. primitive_data.ColorIndex = requested_primitive->getColorIndex();
  425.  
  426. return true;
  427. @@ -162,19 +145,19 @@ bool CPrimitiveSetSceneNode::get_source_const_primitives(
  428.  
  429. bool CPrimitiveSetSceneNode::get_data_copy_primitives(
  430. SPrimitiveData &primitive_data,
  431. - IMorphAnimatedSceneNode *primitive_set_scene,
  432. - int index)
  433. + IMorphAnimatedSceneNode * const primitive_set_scene,
  434. + const int index)
  435. {
  436. - CPrimitiveSetSceneNode *scene_node = static_cast<CPrimitiveSetSceneNode *>(primitive_set_scene);
  437. + UNI_ASSERT(primitive_set_scene);
  438. + auto & scene_node = checked_cast<CPrimitiveSetSceneNode &>(*primitive_set_scene);
  439. if (index < 0
  440. - || scene_node->DataCopy->primitives_.size() <= size_t(index))
  441. + || scene_node.DataCopy->primitives_.size() <= size_t(index))
  442. {
  443. return false;
  444. }
  445.  
  446. - CPrimitiveRenderNode *requested_primitive = scene_node->DataCopy->primitives_[
  447. - static_cast<size_t>(index)];
  448. - primitive_data.Primitive = requested_primitive;
  449. + const auto & requested_primitive = scene_node.DataCopy->primitives_[static_cast<size_t>(index)];
  450. + primitive_data.Primitive = requested_primitive.get();
  451. primitive_data.ColorIndex = &requested_primitive->accessColorIndex();
  452.  
  453. return true;
  454. @@ -182,19 +165,19 @@ bool CPrimitiveSetSceneNode::get_data_copy_primitives(
  455.  
  456. bool CPrimitiveSetSceneNode::get_data_copy_const_primitives(
  457. SPrimitiveConstData &primitive_data,
  458. - const IMorphAnimatedSceneNode *primitive_set_scene,
  459. - int index)
  460. + const IMorphAnimatedSceneNode * const primitive_set_scene,
  461. + const int index)
  462. {
  463. - const CPrimitiveSetSceneNode *scene_node = static_cast<const CPrimitiveSetSceneNode *>(primitive_set_scene);
  464. + UNI_ASSERT(primitive_set_scene);
  465. + const auto & scene_node = checked_cast<const CPrimitiveSetSceneNode &>(*primitive_set_scene);
  466. if (index < 0
  467. - || scene_node->DataCopy->primitives_.size() <= size_t(index))
  468. + || scene_node.DataCopy->primitives_.size() <= size_t(index))
  469. {
  470. return false;
  471. }
  472.  
  473. - CPrimitiveRenderNode *requested_primitive = scene_node->DataCopy->primitives_[
  474. - static_cast<size_t>(index)];
  475. - primitive_data.Primitive = requested_primitive;
  476. + const auto & requested_primitive = scene_node.DataCopy->primitives_[static_cast<size_t>(index)];
  477. + primitive_data.Primitive = requested_primitive.get();
  478. primitive_data.ColorIndex = requested_primitive->getColorIndex();
  479.  
  480. return true;
  481. @@ -213,13 +196,11 @@ CPrimitiveSetSceneNode::CPrimitiveSetSceneNode()
  482.  
  483. CPrimitiveSetSceneNode::~CPrimitiveSetSceneNode()
  484. {
  485. - for (CPrimitiveRenderNode * primitive : Primitives)
  486. - {
  487. - primitive->drop();
  488. - }
  489. }
  490.  
  491. -void CPrimitiveSetSceneNode::beginSet(SVertexStream * vertices, ISharedBufferCallback *callback)
  492. +void CPrimitiveSetSceneNode::beginSet(
  493. + const boost::intrusive_ptr<SVertexStream> & vertices,
  494. + ISharedBufferCallback * callback)
  495. {
  496. deleteDataCopy();
  497.  
  498. @@ -228,10 +209,6 @@ void CPrimitiveSetSceneNode::beginSet(SVertexStream * vertices, ISharedBufferCal
  499. Callback->releaseSharedBuffer(this);
  500. }
  501.  
  502. - for (CPrimitiveRenderNode * primitive : Primitives)
  503. - {
  504. - primitive->drop();
  505. - }
  506. Primitives.clear();
  507. SourceVertices = vertices;
  508. Callback = callback;
  509. @@ -242,13 +219,16 @@ void CPrimitiveSetSceneNode::beginSet(SVertexStream * vertices, ISharedBufferCal
  510. }
  511. }
  512.  
  513. -void CPrimitiveSetSceneNode::addPrimitive(const CGraphicsPrimitive & other)
  514. +void CPrimitiveSetSceneNode::addPrimitive(const boost::intrusive_ptr<CPrimitiveRenderNode> & shared_primitive)
  515. {
  516. - CPrimitiveRenderNode *pnode = new CPrimitiveRenderNode(other);
  517. - pnode->grab();
  518. + UNI_ASSERT(shared_primitive);
  519. + shared_primitive->updateVerticesRange(SourceStart, SourceEnd);
  520. + Primitives.push_back(shared_primitive);
  521. +}
  522.  
  523. - pnode->updateVerticesRange(SourceStart, SourceEnd);
  524. - Primitives.push_back(pnode);
  525. +void CPrimitiveSetSceneNode::addPrimitive(const CGraphicsPrimitive & other)
  526. +{
  527. + addPrimitive(new CPrimitiveRenderNode(other));
  528. }
  529.  
  530. void CPrimitiveSetSceneNode::addPrimitive(
  531. @@ -257,11 +237,9 @@ void CPrimitiveSetSceneNode::addPrimitive(
  532. tm_size_type count,
  533. unsigned int flags)
  534. {
  535. - CPrimitiveRenderNode *pnode = new CPrimitiveRenderNode(type, start, count);
  536. - pnode->grab();
  537. + const auto pnode = make_intrusive<CPrimitiveRenderNode>(type, start, count);
  538. pnode->setFlags(flags);
  539. - pnode->updateVerticesRange(SourceStart, SourceEnd);
  540. - Primitives.push_back(pnode);
  541. + addPrimitive(pnode);
  542. }
  543.  
  544. #ifdef USE_32BIT_INDICES
  545. @@ -272,11 +250,9 @@ void CPrimitiveSetSceneNode::addPrimitive(
  546. unsigned int flags,
  547. bool copy)
  548. {
  549. - CPrimitiveRenderNode *pnode = new CPrimitiveRenderNode(type, indices, count, copy);
  550. - pnode->grab();
  551. + const auto pnode = make_intrusive<CPrimitiveRenderNode>(type, indices, count, copy);
  552. pnode->setFlags(flags);
  553. - pnode->updateVerticesRange(SourceStart, SourceEnd);
  554. - Primitives.push_back(pnode);
  555. + addPrimitive(pnode);
  556. }
  557. #endif // USE_32BIT_INDICES
  558.  
  559. @@ -287,11 +263,9 @@ void CPrimitiveSetSceneNode::addPrimitive(
  560. unsigned int flags,
  561. bool copy)
  562. {
  563. - CPrimitiveRenderNode *pnode = new CPrimitiveRenderNode(type, indices, count, copy);
  564. - pnode->grab();
  565. + const auto pnode = make_intrusive<CPrimitiveRenderNode>(type, indices, count, copy);
  566. pnode->setFlags(flags);
  567. - pnode->updateVerticesRange(SourceStart, SourceEnd);
  568. - Primitives.push_back(pnode);
  569. + addPrimitive(pnode);
  570. }
  571.  
  572. void CPrimitiveSetSceneNode::endSet()
  573. @@ -306,9 +280,9 @@ void CPrimitiveSetSceneNode::endSet(const tmmath::rect2x& bound_rect)
  574. bool CPrimitiveSetSceneNode::getSourcePrimitives(IGraphicsPrimitiveEnumerator * enumerator) const
  575. {
  576. // перебираем исходные примитивы
  577. - for (CPrimitiveRenderNode * primitive : Primitives)
  578. + for (const auto & primitive : Primitives)
  579. {
  580. - if (!enumerator->onNextConstPrimitive(primitive))
  581. + if (!enumerator->onNextConstPrimitive(primitive.get()))
  582. {
  583. return false;
  584. }
  585. @@ -319,129 +293,62 @@ bool CPrimitiveSetSceneNode::getSourcePrimitives(IGraphicsPrimitiveEnumerator *
  586. void CPrimitiveSetSceneNode::overrideLineColorIndex(u32 color_index)
  587. {
  588. UNI_ASSERT(color_index <= static_cast<u32>(std::numeric_limits<int>::max()));
  589. - switch (animation_method_)
  590. - {
  591. - case EAM_MANUAL_COPY:
  592. - {
  593. - if (DataCopy)
  594. - {
  595. - std::vector<CPrimitiveRenderNode *> *primitives = 0;
  596. - if (DataCopy->use_copy_primitives_)
  597. - {
  598. - primitives = &(DataCopy->primitives_);
  599. - }
  600. - else
  601. - {
  602. - primitives = &Primitives;
  603. - }
  604. - for (CPrimitiveRenderNode * pnode : *primitives)
  605. - {
  606. - if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
  607. - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
  608. - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
  609. - {
  610. - pnode->accessColorIndex() = static_cast<int>(color_index);
  611. - }
  612. - }
  613. - }
  614. - }
  615. - break;
  616. + UNI_ASSERT(animation_method_ == EAM_MANUAL_COPY || animation_method_ == EAM_DIRECT);
  617.  
  618. - case EAM_DIRECT:
  619. + if ((animation_method_ == EAM_MANUAL_COPY && DataCopy)
  620. + || animation_method_ == EAM_DIRECT)
  621. + {
  622. + const auto & primitives =
  623. + animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
  624. + ? DataCopy->primitives_
  625. + : Primitives;
  626. + for (const auto & pnode : primitives)
  627. {
  628. - for (CPrimitiveRenderNode * pnode : Primitives)
  629. + if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
  630. + || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
  631. + || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
  632. {
  633. - if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
  634. - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
  635. - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
  636. - {
  637. - pnode->accessColorIndex() = static_cast<int>(color_index);
  638. - }
  639. + pnode->accessColorIndex() = static_cast<int>(color_index);
  640. }
  641. }
  642. - break;
  643. -
  644. - case EAM_NONE:
  645. - UNI_ASSERT(false);
  646. }
  647. }
  648.  
  649. void CPrimitiveSetSceneNode::overridePrimitiveVisibility(bool lines_visible, bool area_visible)
  650. {
  651. - switch (animation_method_)
  652. + UNI_ASSERT(animation_method_ == EAM_MANUAL_COPY || animation_method_ == EAM_DIRECT);
  653. +
  654. + if ((animation_method_ == EAM_MANUAL_COPY && DataCopy)
  655. + || animation_method_ == EAM_DIRECT)
  656. {
  657. - case EAM_MANUAL_COPY:
  658. + const auto & primitives =
  659. + animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
  660. + ? DataCopy->primitives_
  661. + : Primitives;
  662. + for (const auto & pnode : primitives)
  663. {
  664. - if (DataCopy)
  665. + bool visible = true;
  666. + if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
  667. + || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
  668. + || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
  669. {
  670. - std::vector<CPrimitiveRenderNode *> *primitives = 0;
  671. - if (DataCopy->use_copy_primitives_)
  672. - {
  673. - primitives = &(DataCopy->primitives_);
  674. - }
  675. - else
  676. - {
  677. - primitives = &Primitives;
  678. - }
  679. - for (CPrimitiveRenderNode * pnode : *primitives)
  680. - {
  681. - bool visible = true;
  682. - if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
  683. - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
  684. - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
  685. - {
  686. - visible = lines_visible;
  687. - }
  688. - else if ((pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_FAN)
  689. - || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_STRIP)
  690. - || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_LIST))
  691. - {
  692. - visible = area_visible;
  693. - }
  694. - if (visible)
  695. - {
  696. - pnode->setFlags(pnode->getFlags() & static_cast<unsigned>(~tmrender::EPA_DIRECT_ANIMATION_INVISIBLE));
  697. - }
  698. - else
  699. - {
  700. - pnode->setFlags(pnode->getFlags() | tmrender::EPA_DIRECT_ANIMATION_INVISIBLE);
  701. - }
  702. - }
  703. + visible = lines_visible;
  704. }
  705. - }
  706. - break;
  707. -
  708. - case EAM_DIRECT:
  709. - {
  710. - for (CPrimitiveRenderNode * pnode : Primitives)
  711. + else if ((pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_FAN)
  712. + || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_STRIP)
  713. + || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_LIST))
  714. {
  715. - bool visible = true;
  716. - if ((pnode->getGraphicsType() == tmrender::EPGT_LINE_LOOP)
  717. - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_STRIP)
  718. - || (pnode->getGraphicsType() == tmrender::EPGT_LINE_LIST))
  719. - {
  720. - visible = lines_visible;
  721. - }
  722. - else if ((pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_FAN)
  723. - || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_STRIP)
  724. - || (pnode->getGraphicsType() == tmrender::EPGT_TRIANGLE_LIST))
  725. - {
  726. - visible = area_visible;
  727. - }
  728. - if (visible)
  729. - {
  730. - pnode->setFlags(pnode->getFlags() & static_cast<unsigned>(~tmrender::EPA_DIRECT_ANIMATION_INVISIBLE));
  731. - }
  732. - else
  733. - {
  734. - pnode->setFlags(pnode->getFlags() | tmrender::EPA_DIRECT_ANIMATION_INVISIBLE);
  735. - }
  736. + visible = area_visible;
  737. + }
  738. + if (visible)
  739. + {
  740. + pnode->setFlags(pnode->getFlags() & static_cast<unsigned>(~tmrender::EPA_DIRECT_ANIMATION_INVISIBLE));
  741. + }
  742. + else
  743. + {
  744. + pnode->setFlags(pnode->getFlags() | tmrender::EPA_DIRECT_ANIMATION_INVISIBLE);
  745. }
  746. }
  747. - break;
  748. -
  749. - case EAM_NONE:
  750. - UNI_ASSERT(false);
  751. }
  752. }
  753.  
  754. @@ -480,18 +387,12 @@ bool CPrimitiveSetSceneNode::getPrimitives(IScenePrimitiveEnumerator * enumerato
  755. {
  756. if (enumerator)
  757. {
  758. - const std::vector<CPrimitiveRenderNode *> *primitives = &Primitives;
  759. - if (animation_method_ == EAM_MANUAL_COPY)
  760. + const auto & primitives = animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
  761. + ? DataCopy->primitives_
  762. + : Primitives;
  763. + for (const auto & primitive : primitives)
  764. {
  765. - if (DataCopy && DataCopy->use_copy_primitives_)
  766. - {
  767. - primitives = &(DataCopy->primitives_);
  768. - }
  769. - }
  770. -
  771. - for (CPrimitiveRenderNode * primitive : *primitives)
  772. - {
  773. - if (!enumerator->onNextConstPrimitive(primitive))
  774. + if (!enumerator->onNextConstPrimitive(primitive.get()))
  775. {
  776. return false;
  777. }
  778. @@ -505,8 +406,8 @@ bool CPrimitiveSetSceneNode::testIntersection(IIdentifyProcessor& identify_proce
  779. {
  780. if (animator())
  781. {
  782. - const IMorphAnimator *morph_animator = checked_cast<const IMorphAnimator *>(animator());
  783. - return morph_animator->testIntersection(this, this, identify_processor);
  784. + const auto & morph_animator = checked_cast<const IMorphAnimator &>(*animator());
  785. + return morph_animator.testIntersection(this, this, identify_processor);
  786. }
  787. else
  788. {
  789. @@ -522,42 +423,30 @@ void CPrimitiveSetSceneNode::applySceneLinker(const ISceneLinkerPtr &linker) con
  790. return;
  791. }
  792.  
  793. - CPrimitiveRenderNode *const*pdata = Primitives.empty() ? 0 : &Primitives[0];
  794. - CPrimitiveRenderNode *const*pend = pdata + Primitives.size();
  795. -
  796. - if (animation_method_ == EAM_MANUAL_COPY)
  797. + if (animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->render_node_)
  798. {
  799. - if (DataCopy)
  800. - {
  801. - if (DataCopy->render_node_)
  802. - {
  803. - linker->addVertices(DataCopy->render_node_->getVertices());
  804. - }
  805. - if (DataCopy->use_copy_primitives_)
  806. - {
  807. - pdata = DataCopy->primitives_.empty() ? 0 : &DataCopy->primitives_[0];
  808. - pend = pdata + DataCopy->primitives_.size();
  809. - }
  810. - }
  811. + linker->addVertices(DataCopy->render_node_->getVertices());
  812. }
  813. - while (pdata != pend)
  814. +
  815. + const auto & primitives = animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
  816. + ? DataCopy->primitives_
  817. + : Primitives;
  818. + for (const auto & primitive : primitives)
  819. {
  820. - if (0 == ((*pdata)->getFlags() & EPA_DIRECT_ANIMATION_INVISIBLE))
  821. + if (0 == (primitive->getFlags() & EPA_DIRECT_ANIMATION_INVISIBLE))
  822. {
  823. - linker->addPrimitive(**pdata);
  824. + linker->addPrimitive(*primitive);
  825. }
  826. - ++pdata;
  827. }
  828. UNI_ASSERT(getFirstChild() == NULL);
  829. }
  830.  
  831. void CPrimitiveSetSceneNode::clearExternalResources()
  832. {
  833. - for (size_t i = 0; i < Primitives.size(); ++i)
  834. + for (const auto & primitive : Primitives)
  835. {
  836. - Primitives[i]->clearExternalResources();
  837. + primitive->clearExternalResources();
  838. }
  839. -
  840. UNI_ASSERT(!DataCopy);
  841.  
  842. ISceneNode::clearExternalResources();
  843. @@ -576,8 +465,6 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
  844.  
  845. bool two_stage_rendering = (context.AreaVertexRoot || context.LineVertexRoot);
  846. CPrimitiveRenderNodeList *primitives_root = context.PrimitiveRoot;
  847. - CPrimitiveRenderNode **pdata = Primitives.empty() ? 0 : &Primitives[0];
  848. - CPrimitiveRenderNode **pend = pdata + Primitives.size();
  849.  
  850. // если двухпроходный рендеринг, то мы обяЕаны иметь DataCopy
  851. UNI_ASSERT(!two_stage_rendering
  852. @@ -596,7 +483,7 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
  853. DataCopy->area_primitives_.reserve(DataCopy->primitives_.size());
  854. DataCopy->line_primitives_.reserve(DataCopy->primitives_.size());
  855.  
  856. - for (CPrimitiveRenderNode *primitive: DataCopy->primitives_)
  857. + for (const auto & primitive : DataCopy->primitives_)
  858. {
  859. std::vector<index16_t> area_primitive_indices;
  860. std::vector<index16_t> line_primitive_indices;
  861. @@ -610,11 +497,10 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
  862. if (!(EPA_POLYGONAL_LINE & primitive->getFlags()))
  863. {
  864. DataCopy->area_primitives_.push_back(primitive);
  865. - DataCopy->area_primitives_.back()->grab();
  866. continue;
  867. }
  868.  
  869. - for (SPrimitiveTriangle curr_triangle: primitive->getTriangles())
  870. + for (const SPrimitiveTriangle & curr_triangle: primitive->getTriangles())
  871. {
  872. if (vertex_stream->atDistanceRaw(curr_triangle.Index0 + 2)[0])
  873. {
  874. @@ -642,7 +528,6 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
  875. area_primitive_indices.data(),
  876. static_cast<tm_size_type>(area_primitive_indices.size()),
  877. true));
  878. - DataCopy->area_primitives_.back()->grab();
  879. DataCopy->area_primitives_.back()->setFlags(primitive->getFlags());
  880. DataCopy->area_primitives_.back()->setColorIndex(primitive->getColorIndex());
  881. }
  882. @@ -654,7 +539,6 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
  883. line_primitive_indices.data(),
  884. static_cast<tm_size_type>(line_primitive_indices.size()),
  885. true));
  886. - DataCopy->line_primitives_.back()->grab();
  887. DataCopy->line_primitives_.back()->setFlags(primitive->getFlags());
  888. DataCopy->line_primitives_.back()->setColorIndex(primitive->getColorIndex());
  889. }
  890. @@ -666,12 +550,6 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
  891. {
  892. if (DataCopy)
  893. {
  894. - if (DataCopy->use_copy_primitives_)
  895. - {
  896. - pdata = DataCopy->primitives_.empty() ? 0 : &DataCopy->primitives_[0];
  897. - pend = pdata + DataCopy->primitives_.size();
  898. - }
  899. -
  900. if (DataCopy->render_node_ && two_stage_rendering)
  901. {
  902. UNI_ASSERT(DataCopy->render_node_->getVertices());
  903. @@ -707,39 +585,41 @@ void CPrimitiveSetSceneNode::constructMyFrame(RenderContext & context)
  904. return;
  905. }
  906. DataCopy->render_node_->clearChilds();
  907. - context.VertexRoot->addNode(DataCopy->render_node_);
  908. + context.VertexRoot->addNode(DataCopy->render_node_.get());
  909.  
  910. - primitives_root = DataCopy->render_node_;
  911. + primitives_root = DataCopy->render_node_.get();
  912. }
  913. }
  914. }
  915.  
  916. if (primitives_root && !two_stage_rendering)
  917. {
  918. - while (pdata != pend)
  919. + const auto & primitives = animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
  920. + ? DataCopy->primitives_
  921. + : Primitives;
  922. + for (const auto & primitive : primitives)
  923. {
  924. - if (0 == ((*pdata)->getFlags() & EPA_DIRECT_ANIMATION_INVISIBLE))
  925. + if (0 == (primitive->getFlags() & EPA_DIRECT_ANIMATION_INVISIBLE))
  926. {
  927. - primitives_root->addNode(*pdata);
  928. + primitives_root->addNode(primitive.get());
  929. }
  930. - ++pdata;
  931. }
  932. }
  933. else if (two_stage_rendering)
  934. {
  935. if (context.AreaVertexRoot)
  936. {
  937. - for (CPrimitiveRenderNode *render_node: DataCopy->area_primitives_)
  938. + for (const auto & render_node : DataCopy->area_primitives_)
  939. {
  940. - DataCopy->area_render_node_->addNode(render_node);
  941. + DataCopy->area_render_node_->addNode(render_node.get());
  942. }
  943. }
  944.  
  945. if (context.LineVertexRoot)
  946. {
  947. - for (CPrimitiveRenderNode *render_node: DataCopy->line_primitives_)
  948. + for (const auto & render_node : DataCopy->line_primitives_)
  949. {
  950. - DataCopy->line_render_node_->addNode(render_node);
  951. + DataCopy->line_render_node_->addNode(render_node.get());
  952. }
  953. }
  954. }
  955. @@ -757,11 +637,12 @@ bool CPrimitiveSetSceneNode::createDataCopy(EAnimationMethod method)
  956.  
  957. case EAM_MANUAL_COPY:
  958. animation_method_ = method;
  959. - DataCopy = std::make_shared<SDataCopy>(this);
  960. + DataCopy = std::make_shared<SDataCopy>(*this);
  961. return true;
  962.  
  963. case EAM_NONE:
  964. - return false;
  965. + default:
  966. + UNI_ASSERT(false);
  967. }
  968. return false;
  969. }
  970. @@ -879,22 +760,17 @@ void CPrimitiveSetSceneNode::setDataCopyVertices(const boost::intrusive_ptr<SVer
  971.  
  972. // СоЕдадим вертексную рендер-ноду.
  973. DataCopy->render_node_ = new tme::tmrender::CVertexRenderNode(vertices.get());
  974. - DataCopy->render_node_->grab();
  975. }
  976.  
  977. notifyNodeChanged();
  978. }
  979.  
  980. -void CPrimitiveSetSceneNode::setDataCopyVertexRenderNode(IVertexRenderNode * vertex_render_node)
  981. +void CPrimitiveSetSceneNode::setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node)
  982. {
  983. UNI_ASSERT(animation_method_ == EAM_MANUAL_COPY);
  984. UNI_ASSERT(DataCopy);
  985.  
  986. - if (DataCopy->render_node_)
  987. - {
  988. - DataCopy->render_node_->drop();
  989. - }
  990. - else if (Callback)
  991. + if (!DataCopy->render_node_ && Callback)
  992. {
  993. // Удаляем ссылку на старый вершинный буфер
  994. Callback->releaseSharedBuffer(this);
  995. @@ -902,7 +778,6 @@ void CPrimitiveSetSceneNode::setDataCopyVertexRenderNode(IVertexRenderNode * ver
  996.  
  997. // Установим вертексную рендер-ноду.
  998. DataCopy->render_node_ = vertex_render_node;
  999. - DataCopy->render_node_->grab();
  1000.  
  1001. notifyNodeChanged();
  1002. }
  1003. @@ -916,7 +791,7 @@ SVertexStream * CPrimitiveSetSceneNode::getDataCopyVertices()
  1004. {
  1005. return DataCopy->render_node_->getVertices();
  1006. }
  1007. - return 0;
  1008. + return nullptr;
  1009. }
  1010.  
  1011. const SVertexStream * CPrimitiveSetSceneNode::getDataCopyConstVertices() const
  1012. @@ -931,9 +806,9 @@ IVertexRenderNode * CPrimitiveSetSceneNode::getDataCopyVertexRenderNode()
  1013.  
  1014. if (DataCopy->render_node_)
  1015. {
  1016. - return DataCopy->render_node_;
  1017. + return DataCopy->render_node_.get();
  1018. }
  1019. - return 0;
  1020. + return nullptr;
  1021. }
  1022.  
  1023. void CPrimitiveSetSceneNode::setDataCopyCulling(ERenderFaceCulling culling)
  1024. @@ -968,9 +843,9 @@ void CPrimitiveSetSceneNode::appendSharedDataCopyVertices(const boost::intrusive
  1025.  
  1026. bool CPrimitiveSetSceneNode::accessSourcePrimitives(IMorphSourcePrimitiveEnumerator &enumerator)
  1027. {
  1028. - for (CPrimitiveRenderNode * pnode : Primitives)
  1029. + for (const auto & pnode : Primitives)
  1030. {
  1031. - if (!enumerator.onNextPrimitive(pnode, pnode->accessColorIndex()))
  1032. + if (!enumerator.onNextPrimitive(pnode.get(), pnode->accessColorIndex()))
  1033. {
  1034. return false;
  1035. }
  1036. @@ -986,9 +861,9 @@ bool CPrimitiveSetSceneNode::accessDataCopyPrimitives(IMorphSourcePrimitiveEnume
  1037.  
  1038. notifyNodeChanged();
  1039.  
  1040. - for (CPrimitiveRenderNode * pnode : DataCopy->primitives_)
  1041. + for (const auto & pnode : DataCopy->primitives_)
  1042. {
  1043. - if (!enumerator.onNextPrimitive(pnode, pnode->accessColorIndex()))
  1044. + if (!enumerator.onNextPrimitive(pnode.get(), pnode->accessColorIndex()))
  1045. {
  1046. return false;
  1047. }
  1048. @@ -1002,27 +877,13 @@ void CPrimitiveSetSceneNode::setDataCopyPrimitives(IMorphPrimitiveProvider &enum
  1049. UNI_ASSERT(animation_method_ == EAM_MANUAL_COPY);
  1050. UNI_ASSERT(DataCopy);
  1051.  
  1052. - CPrimitiveRenderNode * primitive_node = NULL;
  1053. -
  1054. if (DataCopy->render_node_)
  1055. {
  1056. DataCopy->render_node_->clearChilds();
  1057. }
  1058. - for (tmrender::CPrimitiveRenderNode *primitive : DataCopy->primitives_)
  1059. - {
  1060. - primitive->drop();
  1061. - }
  1062. DataCopy->primitives_.clear();
  1063. - for (tmrender::CPrimitiveRenderNode *primitive : DataCopy->area_primitives_)
  1064. - {
  1065. - primitive->drop();
  1066. - }
  1067. DataCopy->area_primitives_.clear();
  1068. DataCopy->area_render_node_.reset();
  1069. - for (tmrender::CPrimitiveRenderNode *primitive : DataCopy->line_primitives_)
  1070. - {
  1071. - primitive->drop();
  1072. - }
  1073. DataCopy->line_primitives_.clear();
  1074. DataCopy->line_render_node_.reset();
  1075. DataCopy->use_copy_primitives_ = true;
  1076. @@ -1034,6 +895,7 @@ void CPrimitiveSetSceneNode::setDataCopyPrimitives(IMorphPrimitiveProvider &enum
  1077. DataCopy->primitives_.reserve(estimated_primitive_count);
  1078. }
  1079.  
  1080. + CPrimitiveRenderNode * primitive_node = nullptr;
  1081. while (enumerator.setNextPrimitive(primitive_node))
  1082. {
  1083. if (!primitive_node)
  1084. @@ -1047,9 +909,8 @@ void CPrimitiveSetSceneNode::setDataCopyPrimitives(IMorphPrimitiveProvider &enum
  1085. }
  1086.  
  1087. DataCopy->primitives_.push_back(primitive_node);
  1088. - primitive_node->grab();
  1089.  
  1090. - primitive_node = NULL;
  1091. + primitive_node = nullptr;
  1092. }
  1093.  
  1094. notifyNodeChanged();
  1095. @@ -1068,22 +929,13 @@ void CPrimitiveSetSceneNode::resetVerticesRange()
  1096.  
  1097. void CPrimitiveSetSceneNode::enumerateEnumerateAllPrimitives(const PrimitivesEnumerator &enumerator)const
  1098. {
  1099. - if (animation_method_ == EAM_MANUAL_COPY)
  1100. - {
  1101. - if (DataCopy && DataCopy->use_copy_primitives_)
  1102. - {
  1103. - for (CPrimitiveRenderNode * primitive : DataCopy->primitives_)
  1104. - {
  1105. - enumerator(primitive);
  1106. - }
  1107. - return;
  1108. - }
  1109. - }
  1110. -
  1111. + const auto & primitives = animation_method_ == EAM_MANUAL_COPY && DataCopy && DataCopy->use_copy_primitives_
  1112. + ? DataCopy->primitives_
  1113. + : Primitives;
  1114. // перебираем исходные примитивы
  1115. - for (CPrimitiveRenderNode * primitive : Primitives)
  1116. + for (const auto & primitive : primitives)
  1117. {
  1118. - enumerator(primitive);
  1119. + enumerator(primitive.get());
  1120. }
  1121. }
  1122.  
  1123. --
  1124. 1.9.5.msysgit.1
  1125.  
  1126. From befb46da746f210251ac338b3b80e62839212122 Mon Sep 17 00:00:00 2001
  1127. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  1128. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  1129. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  1130. Date: Mon, 29 Jun 2015 10:38:44 +0600
  1131. Subject: [PATCH 05/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
  1132. =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=83=D0=B7=D0=B5=D0=BB=20=D1=81?=
  1133. =?UTF-8?q?=D1=86=D0=B5=D0=BD=D1=8B=20=D1=81=20=D1=80=D0=B0=D0=B7=D0=B4?=
  1134. =?UTF-8?q?=D0=B5=D0=BB=D1=8F=D0=B5=D0=BC=D1=8B=D0=BC=D0=B8=20=D0=B4=D0=B0?=
  1135. =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8.?=
  1136. MIME-Version: 1.0
  1137. Content-Type: text/plain; charset=UTF-8
  1138. Content-Transfer-Encoding: 8bit
  1139.  
  1140. ---
  1141. Projects/tmRender/Fwd.h | 2 +
  1142. Projects/tmRender/SharedVertexSceneNode.h | 87 ++++++++++
  1143. Projects/tmRender/src/SharedVertexSceneNode.cpp | 221 ++++++++++++++++++++++++
  1144. Projects/tmRender/tmRender.gyp | 2 +
  1145. 4 files changed, 312 insertions(+)
  1146. create mode 100644 Projects/tmRender/SharedVertexSceneNode.h
  1147. create mode 100644 Projects/tmRender/src/SharedVertexSceneNode.cpp
  1148.  
  1149. diff --git a/Projects/tmRender/Fwd.h b/Projects/tmRender/Fwd.h
  1150. index 0824202..98d628f 100644
  1151. --- a/Projects/tmRender/Fwd.h
  1152. +++ b/Projects/tmRender/Fwd.h
  1153. @@ -63,6 +63,8 @@ class ISceneConstruction;
  1154. class ISceneNode;
  1155. typedef boost::intrusive_ptr<ISceneNode> SceneNodePtr;
  1156.  
  1157. +struct SharedVertexData;
  1158. +
  1159. class IAnimatedSceneNode;
  1160. class ISkinAnimator;
  1161. class ISkinAnimatedSceneNode;
  1162. diff --git a/Projects/tmRender/SharedVertexSceneNode.h b/Projects/tmRender/SharedVertexSceneNode.h
  1163. new file mode 100644
  1164. index 0000000..36b9b31
  1165. --- /dev/null
  1166. +++ b/Projects/tmRender/SharedVertexSceneNode.h
  1167. @@ -0,0 +1,87 @@
  1168. +#pragma once
  1169. +
  1170. +#include <tmRender/LocalBoundRectSceneNode.h>
  1171. +#include <tmRender/IMorphAnimatedSceneNode.h>
  1172. +
  1173. +namespace tme
  1174. +{
  1175. +namespace tmrender
  1176. +{
  1177. +
  1178. +struct SharedVertexData final : public RefCountedSingleThread
  1179. +{
  1180. + boost::intrusive_ptr<SVertexStream> vertices;
  1181. + std::vector<CGraphicsPrimitive> primitives;
  1182. +
  1183. + //! Некий void* с данными, полученными после морфирования вершин и примитивов.
  1184. + boost::intrusive_ptr<RefCountedSingleThread> morph_result;
  1185. +
  1186. + SharedVertexData() = default;
  1187. +
  1188. + //! Копировать большое количество данных - дорого.
  1189. + SharedVertexData(const SharedVertexData &) = delete;
  1190. + SharedVertexData & operator =(const SharedVertexData &) = delete;
  1191. +};
  1192. +
  1193. +class SharedVertexSceneNode final
  1194. + : public LocalBoundRectSceneNode
  1195. + , public IMorphAnimatedSceneNode
  1196. +{
  1197. +public:
  1198. + explicit SharedVertexSceneNode(const boost::intrusive_ptr<SharedVertexData> & shared_data);
  1199. +
  1200. + bool morphResultCreated() const;
  1201. + boost::intrusive_ptr<RefCountedSingleThread> getMorphResult() const;
  1202. + void setMorphResult(const boost::intrusive_ptr<RefCountedSingleThread> & morph_result);
  1203. +
  1204. + void setRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & render_node);
  1205. +
  1206. + const SVertexStream & getSharedVertices() const;
  1207. + const std::vector<CGraphicsPrimitive> & getSharedPrimitives() const;
  1208. +
  1209. +public: // ISceneNode
  1210. + virtual ESceneNodeClass getNodeClass() const override;
  1211. + virtual IAnimatedSceneNode * getAnimationInterface() override;
  1212. + virtual void constructRenderTree(RenderContext & context) override;
  1213. +
  1214. +protected: // LocalBoundRectSceneNode
  1215. + virtual tmmath::rect2x calculateCurrentNodeLocal2dBoundRect() const override;
  1216. +
  1217. +public: // IMorphAnimatedSceneNode
  1218. + virtual ISceneNode * getSceneNodeInterface() override;
  1219. +
  1220. + virtual const SVertexStream * accessPrecalculatedDataCopyVertices() override;
  1221. + virtual const PrimitiveCollection & accessPrecalculatedDataCopyPrimitives() const override;
  1222. + virtual LoaderAnimationType getPrecalculatedDataCopyType() const override;
  1223. + virtual const SVertexStream * accessSourceVertices() const override;
  1224. + virtual IndexRange getUsedVertexRange() const override;
  1225. + virtual bool accessSourcePrimitives(IMorphSourcePrimitiveEnumerator & enumerator) override;
  1226. + virtual bool accessDataCopyPrimitives(IMorphSourcePrimitiveEnumerator & enumerator) override;
  1227. + virtual void setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> & vertices) override;
  1228. + virtual SVertexStream * getDataCopyVertices() override;
  1229. + virtual const SVertexStream * getDataCopyConstVertices() const override;
  1230. + virtual IVertexRenderNode * getDataCopyVertexRenderNode() override;
  1231. + virtual void setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & vertex_render_node) override;
  1232. + virtual void setDataCopyCulling(ERenderFaceCulling culling) override;
  1233. + virtual void setDataCopyDepthTest(ERenderDepthTestMode depthmode, ERenderDepthTestFunc depthfunc) override;
  1234. + virtual tmrender::index16_t getSharedIndexOffset() override;
  1235. + virtual void appendSharedDataCopyVertices(const boost::intrusive_ptr<SVertexStream> & vertices) override;
  1236. + virtual void verticesChanged() override;
  1237. + virtual void boundRectChanged() override;
  1238. + virtual void setDataCopyPrimitives(IMorphPrimitiveProvider & enumerator) override;
  1239. + virtual std::vector<MorphingParameter> getParams() const override;
  1240. +
  1241. +protected: // IMorphAnimatedSceneNode
  1242. + virtual CMorphPrimitiveContainer::const_iterator::TDataGetter getSourcePrimtiveGetter() override;
  1243. + virtual CMorphPrimitiveConstContainer::const_iterator::TDataGetter getSourcePrimtiveConstGetter() const override;
  1244. + virtual CMorphPrimitiveContainer::const_iterator::TDataGetter getDataCopyPrimtiveGetter() override;
  1245. + virtual CMorphPrimitiveConstContainer::const_iterator::TDataGetter getDataCopyPrimtiveConstGetter() const override;
  1246. +
  1247. +private:
  1248. + const boost::intrusive_ptr<SharedVertexData> shared_data_;
  1249. + boost::intrusive_ptr<IVertexRenderNode> render_node_;
  1250. + const tmmath::rect2x bounding_rect_;
  1251. +};
  1252. +
  1253. +} // namespace tmrender
  1254. +} // namespace tme
  1255. diff --git a/Projects/tmRender/src/SharedVertexSceneNode.cpp b/Projects/tmRender/src/SharedVertexSceneNode.cpp
  1256. new file mode 100644
  1257. index 0000000..c889ef5
  1258. --- /dev/null
  1259. +++ b/Projects/tmRender/src/SharedVertexSceneNode.cpp
  1260. @@ -0,0 +1,221 @@
  1261. +#include "stdafx.h"
  1262. +
  1263. +#include <tmRender/SharedVertexSceneNode.h>
  1264. +
  1265. +#include <tmRender/VertexStream.inl>
  1266. +
  1267. +namespace tme
  1268. +{
  1269. +namespace tmrender
  1270. +{
  1271. +
  1272. +namespace
  1273. +{
  1274. +
  1275. +tmmath::rect2x calculate_bounding_rect(const SVertexStream & vertices)
  1276. +{
  1277. + tmmath::rect2x result;
  1278. + result.startInternalPointAdd();
  1279. + for (tm_size_type i = 0; i < vertices.Count; ++i)
  1280. + {
  1281. + result.addInternalPoint(vertices.at2d(i));
  1282. + }
  1283. + return result;
  1284. +}
  1285. +
  1286. +} // namespace
  1287. +
  1288. +SharedVertexSceneNode::SharedVertexSceneNode(const boost::intrusive_ptr<SharedVertexData> & shared_data)
  1289. + : shared_data_(shared_data)
  1290. + , bounding_rect_(calculate_bounding_rect(*shared_data_->vertices))
  1291. +{
  1292. + UNI_ASSERT(shared_data_);
  1293. + UNI_ASSERT(shared_data_->vertices);
  1294. + UNI_ASSERT(!shared_data_->primitives.empty());
  1295. +}
  1296. +
  1297. +bool SharedVertexSceneNode::morphResultCreated() const
  1298. +{
  1299. + return static_cast<bool>(shared_data_->morph_result);
  1300. +}
  1301. +
  1302. +boost::intrusive_ptr<RefCountedSingleThread> SharedVertexSceneNode::getMorphResult() const
  1303. +{
  1304. + UNI_ASSERT(morphResultCreated());
  1305. + return shared_data_->morph_result;
  1306. +}
  1307. +
  1308. +void SharedVertexSceneNode::setMorphResult(const boost::intrusive_ptr<RefCountedSingleThread> & morph_result)
  1309. +{
  1310. + UNI_ASSERT(!morphResultCreated());
  1311. + shared_data_->morph_result = morph_result;
  1312. +}
  1313. +
  1314. +void SharedVertexSceneNode::setRenderNode(const boost::intrusive_ptr<IVertexRenderNode> & render_node)
  1315. +{
  1316. + UNI_ASSERT(render_node);
  1317. + UNI_ASSERT(!render_node_);
  1318. + render_node_ = render_node;
  1319. +}
  1320. +
  1321. +const SVertexStream & SharedVertexSceneNode::getSharedVertices() const
  1322. +{
  1323. + return *shared_data_->vertices;
  1324. +}
  1325. +
  1326. +const std::vector<CGraphicsPrimitive> & SharedVertexSceneNode::getSharedPrimitives() const
  1327. +{
  1328. + return shared_data_->primitives;
  1329. +}
  1330. +
  1331. +ESceneNodeClass SharedVertexSceneNode::getNodeClass() const
  1332. +{
  1333. + return static_cast<ESceneNodeClass>(ESNC_LOCAL_BOUND_RECT | ESNC_MORPHING);
  1334. +}
  1335. +
  1336. +IAnimatedSceneNode * SharedVertexSceneNode::getAnimationInterface()
  1337. +{
  1338. + return this;
  1339. +}
  1340. +
  1341. +void SharedVertexSceneNode::constructRenderTree(RenderContext & context)
  1342. +{
  1343. + if (!renderDisabled())
  1344. + {
  1345. + UNI_ASSERT(render_node_);
  1346. + context.VertexRoot->addNode(render_node_.get());
  1347. + }
  1348. +}
  1349. +
  1350. +tmmath::rect2x SharedVertexSceneNode::calculateCurrentNodeLocal2dBoundRect() const
  1351. +{
  1352. + return bounding_rect_;
  1353. +}
  1354. +
  1355. +ISceneNode * SharedVertexSceneNode::getSceneNodeInterface()
  1356. +{
  1357. + return this;
  1358. +}
  1359. +
  1360. +const SVertexStream * SharedVertexSceneNode::accessPrecalculatedDataCopyVertices()
  1361. +{
  1362. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1363. +}
  1364. +
  1365. +const PrimitiveCollection & SharedVertexSceneNode::accessPrecalculatedDataCopyPrimitives() const
  1366. +{
  1367. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1368. +}
  1369. +
  1370. +LoaderAnimationType SharedVertexSceneNode::getPrecalculatedDataCopyType() const
  1371. +{
  1372. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1373. +}
  1374. +
  1375. +const SVertexStream * SharedVertexSceneNode::accessSourceVertices() const
  1376. +{
  1377. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1378. +}
  1379. +
  1380. +IndexRange SharedVertexSceneNode::getUsedVertexRange() const
  1381. +{
  1382. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1383. +}
  1384. +
  1385. +bool SharedVertexSceneNode::accessSourcePrimitives(IMorphSourcePrimitiveEnumerator &)
  1386. +{
  1387. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1388. +}
  1389. +
  1390. +bool SharedVertexSceneNode::accessDataCopyPrimitives(IMorphSourcePrimitiveEnumerator &)
  1391. +{
  1392. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1393. +}
  1394. +
  1395. +void SharedVertexSceneNode::setDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &)
  1396. +{
  1397. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1398. +}
  1399. +
  1400. +SVertexStream * SharedVertexSceneNode::getDataCopyVertices()
  1401. +{
  1402. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1403. +}
  1404. +
  1405. +const SVertexStream * SharedVertexSceneNode::getDataCopyConstVertices() const
  1406. +{
  1407. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1408. +}
  1409. +
  1410. +IVertexRenderNode * SharedVertexSceneNode::getDataCopyVertexRenderNode()
  1411. +{
  1412. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1413. +}
  1414. +
  1415. +void SharedVertexSceneNode::setDataCopyVertexRenderNode(const boost::intrusive_ptr<IVertexRenderNode> &)
  1416. +{
  1417. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1418. +}
  1419. +
  1420. +void SharedVertexSceneNode::setDataCopyCulling(ERenderFaceCulling)
  1421. +{
  1422. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1423. +}
  1424. +
  1425. +void SharedVertexSceneNode::setDataCopyDepthTest(ERenderDepthTestMode, ERenderDepthTestFunc)
  1426. +{
  1427. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1428. +}
  1429. +
  1430. +index16_t SharedVertexSceneNode::getSharedIndexOffset()
  1431. +{
  1432. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1433. +}
  1434. +
  1435. +void SharedVertexSceneNode::appendSharedDataCopyVertices(const boost::intrusive_ptr<SVertexStream> &)
  1436. +{
  1437. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1438. +}
  1439. +
  1440. +void SharedVertexSceneNode::verticesChanged()
  1441. +{
  1442. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1443. +}
  1444. +
  1445. +void SharedVertexSceneNode::boundRectChanged()
  1446. +{
  1447. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1448. +}
  1449. +
  1450. +void SharedVertexSceneNode::setDataCopyPrimitives(IMorphPrimitiveProvider &)
  1451. +{
  1452. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1453. +}
  1454. +
  1455. +std::vector<IMorphAnimatedSceneNode::MorphingParameter> SharedVertexSceneNode::getParams() const
  1456. +{
  1457. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1458. +}
  1459. +
  1460. +CMorphPrimitiveContainer::const_iterator::TDataGetter SharedVertexSceneNode::getSourcePrimtiveGetter()
  1461. +{
  1462. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1463. +}
  1464. +
  1465. +CMorphPrimitiveConstContainer::const_iterator::TDataGetter SharedVertexSceneNode::getSourcePrimtiveConstGetter() const
  1466. +{
  1467. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1468. +}
  1469. +
  1470. +CMorphPrimitiveContainer::const_iterator::TDataGetter SharedVertexSceneNode::getDataCopyPrimtiveGetter()
  1471. +{
  1472. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1473. +}
  1474. +
  1475. +CMorphPrimitiveConstContainer::const_iterator::TDataGetter SharedVertexSceneNode::getDataCopyPrimtiveConstGetter() const
  1476. +{
  1477. + throw std::logic_error(std::string(__FUNCTION__) + " not supported.");
  1478. +}
  1479. +
  1480. +} // namespace tmrender
  1481. +} // namespace tme
  1482. diff --git a/Projects/tmRender/tmRender.gyp b/Projects/tmRender/tmRender.gyp
  1483. index 6386931..2496209 100644
  1484. --- a/Projects/tmRender/tmRender.gyp
  1485. +++ b/Projects/tmRender/tmRender.gyp
  1486. @@ -246,6 +246,7 @@
  1487. 'SceneManagement/PluginDynamicSublayer.h',
  1488. 'SceneManagement/Types.h',
  1489. 'SDataCopy.h',
  1490. + 'SharedVertexSceneNode.h',
  1491. 'SharedStream.h',
  1492. 'SInputGeometry.h',
  1493. 'SkinAnimatorWrapper.h',
  1494. @@ -624,6 +625,7 @@
  1495. 'src/SceneManagement/SublayerSceneNode.h',
  1496. 'src/stdafx.cpp',
  1497. 'src/stdafx.h',
  1498. + 'src/SharedVertexSceneNode.cpp',
  1499. 'src/SurfaceUtilities.cpp',
  1500. 'src/TransformContext.cpp',
  1501. 'SurfaceStream.h',
  1502. --
  1503. 1.9.5.msysgit.1
  1504.  
  1505. From 53c1ade4b86bae881affb7d6114a57ecc7a1d380 Mon Sep 17 00:00:00 2001
  1506. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  1507. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  1508. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  1509. Date: Mon, 29 Jun 2015 10:37:23 +0600
  1510. Subject: [PATCH 06/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
  1511. =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B4=D0=B8=D0=BD=D0=B0=D0=BC=D0=B8?=
  1512. =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9=20=D0=BE=D0=B1=D1=8A=D0=B5?=
  1513. =?UTF-8?q?=D0=BA=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B1?=
  1514. =?UTF-8?q?=D0=BE=D0=BA?=
  1515. MIME-Version: 1.0
  1516. Content-Type: text/plain; charset=UTF-8
  1517. Content-Transfer-Encoding: 8bit
  1518.  
  1519. ---
  1520. Projects/Carto/Carto.gyp | 4 ++
  1521. .../TrafficLineDynamicObjectFactory.h | 11 ++++
  1522. .../DynamicObjects/TrafficLineDynamicObject.cpp | 76 ++++++++++++++++++++++
  1523. .../DynamicObjects/TrafficLineDynamicObject.h | 37 +++++++++++
  1524. .../TrafficLineDynamicObjectFactory.cpp | 14 ++++
  1525. 5 files changed, 142 insertions(+)
  1526. create mode 100644 Projects/Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h
  1527. create mode 100644 Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp
  1528. create mode 100644 Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.h
  1529. create mode 100644 Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp
  1530.  
  1531. diff --git a/Projects/Carto/Carto.gyp b/Projects/Carto/Carto.gyp
  1532. index 251489c..f5d1c55 100644
  1533. --- a/Projects/Carto/Carto.gyp
  1534. +++ b/Projects/Carto/Carto.gyp
  1535. @@ -28,6 +28,7 @@
  1536. 'Carto/DynamicObjects/GradientColoredLineDynamicObject.h',
  1537. 'Carto/DynamicObjects/MultipointDynamicObject.h',
  1538. 'Carto/DynamicObjects/TextDynamicObject.h',
  1539. + 'Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h',
  1540. 'Carto/Geometry.h',
  1541. 'Carto/ICarto.h',
  1542. 'Carto/IDynamicLayer.h',
  1543. @@ -177,12 +178,15 @@
  1544. 'src/Carto/DynamicObjectPrivate.h',
  1545. 'src/Carto/DynamicObjectProxy.cpp',
  1546. 'src/Carto/DynamicObjectProxy.h',
  1547. + 'src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp',
  1548. 'src/Carto/DynamicObjects/CircleDynamicObject.cpp',
  1549. 'src/Carto/DynamicObjects/DirectionalDynamicObject.cpp',
  1550. 'src/Carto/DynamicObjects/EntranceArrowDynamicObject.cpp',
  1551. 'src/Carto/DynamicObjects/GradientColoredLineDynamicObject.cpp',
  1552. 'src/Carto/DynamicObjects/MultipointDynamicObject.cpp',
  1553. 'src/Carto/DynamicObjects/TextDynamicObject.cpp',
  1554. + 'src/Carto/DynamicObjects/TrafficLineDynamicObject.h',
  1555. + 'src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp',
  1556. 'src/Carto/DynamicObjectView.cpp',
  1557. 'src/Carto/DynamicObjectView.h',
  1558. 'src/Carto/EmptyLayerObjectEnumerator.h',
  1559. diff --git a/Projects/Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h b/Projects/Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h
  1560. new file mode 100644
  1561. index 0000000..8751fee
  1562. --- /dev/null
  1563. +++ b/Projects/Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h
  1564. @@ -0,0 +1,11 @@
  1565. +#pragma once
  1566. +
  1567. +#include <Carto/Carto/Fwd.h>
  1568. +#include <Carto/Carto/TMRenderForwarding.h>
  1569. +
  1570. +namespace Carto
  1571. +{
  1572. +
  1573. +IDynamicObjectPtr create_traffic_line_dynamic_object(ObjectId id, const IGeometryConstPtr & geometry);
  1574. +
  1575. +} // namespace Carto
  1576. diff --git a/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp
  1577. new file mode 100644
  1578. index 0000000..1e0bdad
  1579. --- /dev/null
  1580. +++ b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.cpp
  1581. @@ -0,0 +1,76 @@
  1582. +#include "stable.h"
  1583. +
  1584. +#include "TrafficLineDynamicObject.h"
  1585. +
  1586. +#include <tmCore/checked_cast.h>
  1587. +#include <tmCore/make_intrusive.h>
  1588. +#include <tmRender/CVertexSceneNode.h>
  1589. +#include <tmRender/CPrimitiveSetSceneNode.h>
  1590. +#include <tmRender/SharedVertexSceneNode.h>
  1591. +#include <tmRender/VertexStream.inl>
  1592. +
  1593. +#include <Carto/Carto/MultiPolylineGeometry.h>
  1594. +
  1595. +namespace Carto
  1596. +{
  1597. +
  1598. +TrafficLineDynamicObject::TrafficLineDynamicObject(
  1599. + const ObjectId in_id,
  1600. + const IGeometryConstPtr & in_geometry)
  1601. + : IDynamicObject(in_id)
  1602. + , DynamicObjectPrivate(in_id, in_geometry, 0)
  1603. +{
  1604. + if (!tme::check_type<const MultiPolylineGeometry &>(*in_geometry))
  1605. + {
  1606. + // Оптимальная работа будет только с MultiPolylineGeometry.
  1607. + UNILOG_WARNING << "TrafficLine geometry is not MultiPolylineGeometry";
  1608. + }
  1609. +}
  1610. +
  1611. +TrafficLineDynamicObject::~TrafficLineDynamicObject()
  1612. +{
  1613. +}
  1614. +
  1615. +IDynamicObjectPrivate & TrafficLineDynamicObject::private_interface()
  1616. +{
  1617. + return *this;
  1618. +}
  1619. +
  1620. +ISceneNodePtr TrafficLineDynamicObject::node(
  1621. + const IViewport & viewport,
  1622. + const ProjectId project_id,
  1623. + const SublayerIndex sublayer_index) const
  1624. +{
  1625. + if (!shared_data_)
  1626. + {
  1627. + shared_data_ = tme::make_intrusive<tme::tmrender::SharedVertexData>();
  1628. +
  1629. + //! На данный момент не умеем соЕдавать иЕ IGeometry сраЕу венршины и примитивы. СоЕдается ветка сцены с этими данными.
  1630. + //! Поэтому вытаскиваем иЕ сцены данные, а уЕлы удаляем.
  1631. + //! \todo переделать беЕ соЕдания ветки сцены.
  1632. + const auto scene_node_with_data = DynamicObjectPrivate::node(viewport, project_id, sublayer_index);
  1633. + UNI_ASSERT(scene_node_with_data);
  1634. + auto & vertex_node =
  1635. + tme::checked_cast<tme::tmrender::CVertexSceneNode &>(*scene_node_with_data);
  1636. +
  1637. + // Структура сцены должна быть такой:
  1638. + UNI_ASSERT(vertex_node.getFirstChild());
  1639. + UNI_ASSERT(!vertex_node.getNextSibling());
  1640. + UNI_ASSERT(!vertex_node.getFirstChild()->getNextSibling());
  1641. + UNI_ASSERT(!vertex_node.getFirstChild()->getFirstChild());
  1642. +
  1643. + auto & primitives_node =
  1644. + tme::checked_cast<tme::tmrender::CPrimitiveSetSceneNode &>(*vertex_node.getFirstChild());
  1645. +
  1646. + shared_data_->vertices = const_cast<tme::tmrender::SVertexStream *>(vertex_node.getVertices());
  1647. +
  1648. + for (auto & primitive : primitives_node.accessSourcePrimitivesEx())
  1649. + {
  1650. + shared_data_->primitives.emplace_back(std::move(*primitive.Primitive));
  1651. + }
  1652. + }
  1653. +
  1654. + return tme::make_intrusive<tme::tmrender::SharedVertexSceneNode>(shared_data_);
  1655. +}
  1656. +
  1657. +} // namespace Carto
  1658. diff --git a/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.h b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.h
  1659. new file mode 100644
  1660. index 0000000..c5658c0
  1661. --- /dev/null
  1662. +++ b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObject.h
  1663. @@ -0,0 +1,37 @@
  1664. +#pragma once
  1665. +
  1666. +#include <tmRender/Fwd.h>
  1667. +
  1668. +#include <Carto/Carto/Fwd.h>
  1669. +#include <Carto/Carto/IDynamicObject.h>
  1670. +#include "../DynamicObjectPrivate.h"
  1671. +
  1672. +namespace Carto
  1673. +{
  1674. +
  1675. +class TrafficLineDynamicObject final
  1676. + : public IDynamicObject
  1677. + , public DynamicObjectPrivate
  1678. +{
  1679. +public:
  1680. + TrafficLineDynamicObject(
  1681. + ObjectId in_id,
  1682. + const IGeometryConstPtr & in_geometry);
  1683. + virtual ~TrafficLineDynamicObject() override;
  1684. +
  1685. +public: // IDynamicObject
  1686. + virtual IDynamicObjectPrivate & private_interface() override;
  1687. +
  1688. +public: // DynamicObjectPrivate
  1689. + virtual ISceneNodePtr node(
  1690. + const IViewport & viewport,
  1691. + ProjectId project_id,
  1692. + SublayerIndex sublayer_index) const override;
  1693. +
  1694. +private:
  1695. + // Данные испольЕуемые всеми уЕлами сцены этого объекта.
  1696. + // СоЕдаются при первом получении уЕла сцены.
  1697. + mutable boost::intrusive_ptr<tme::tmrender::SharedVertexData> shared_data_;
  1698. +};
  1699. +
  1700. +} // namespace Carto
  1701. diff --git a/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp
  1702. new file mode 100644
  1703. index 0000000..6dd7b16
  1704. --- /dev/null
  1705. +++ b/Projects/Carto/src/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.cpp
  1706. @@ -0,0 +1,14 @@
  1707. +#include "stable.h"
  1708. +
  1709. +#include <Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h>
  1710. +#include "TrafficLineDynamicObject.h"
  1711. +
  1712. +namespace Carto
  1713. +{
  1714. +
  1715. +IDynamicObjectPtr create_traffic_line_dynamic_object(ObjectId id, const IGeometryConstPtr & geometry)
  1716. +{
  1717. + return std::make_shared<TrafficLineDynamicObject>(id, geometry);
  1718. +}
  1719. +
  1720. +} // namespace Carto
  1721. --
  1722. 1.9.5.msysgit.1
  1723.  
  1724. From 601c58482d14a1568e7b24fa6fa884ec82c76da6 Mon Sep 17 00:00:00 2001
  1725. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  1726. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  1727. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  1728. Date: Mon, 29 Jun 2015 10:39:32 +0600
  1729. Subject: [PATCH 07/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
  1730. =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=202=20=D1=84=D1=83=D0=BD=D0=BA?=
  1731. =?UTF-8?q?=D1=86=D0=B8=D0=B8-=D0=BE=D0=B1=D0=B5=D1=80=D1=82=D0=BA=D0=B8?=
  1732. =?UTF-8?q?=20=D0=B2=20=D1=8D=D0=BD=D1=83=D0=BC=D0=B5=D1=80=D0=B0=D1=82?=
  1733. =?UTF-8?q?=D0=BE=D1=80=20=D0=BB=D0=B8=D0=BD=D0=B8=D0=B9=20=D1=81=20=D0=BA?=
  1734. =?UTF-8?q?=D1=80=D1=83=D0=B6=D0=BE=D1=87=D0=BA=D0=B0=D0=BC=D0=B8.=20?=
  1735. =?UTF-8?q?=D0=98=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8?=
  1736. =?UTF-8?q?=D0=BD=D0=B3.?=
  1737. MIME-Version: 1.0
  1738. Content-Type: text/plain; charset=UTF-8
  1739. Content-Transfer-Encoding: 8bit
  1740.  
  1741. ---
  1742. .../Loading/Animators/LineWithCirclesEnumerator.h | 12 +++
  1743. .../Animators/LineWithCirclesEnumerator.cpp | 112 +++++++++++++--------
  1744. 2 files changed, 84 insertions(+), 40 deletions(-)
  1745.  
  1746. diff --git a/Projects/tmRender/Loading/Animators/LineWithCirclesEnumerator.h b/Projects/tmRender/Loading/Animators/LineWithCirclesEnumerator.h
  1747. index 1a9ffce..1da2de4 100644
  1748. --- a/Projects/tmRender/Loading/Animators/LineWithCirclesEnumerator.h
  1749. +++ b/Projects/tmRender/Loading/Animators/LineWithCirclesEnumerator.h
  1750. @@ -31,7 +31,13 @@ public:
  1751. const std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> & source_primitives);
  1752. void process_primitives(
  1753. const SVertexStream & source,
  1754. + const std::vector<const CGraphicsPrimitive *> & source_primitives);
  1755. + void process_primitives(
  1756. + const SVertexStream & source,
  1757. const std::vector<CGraphicsPrimitive *> & source_primitives);
  1758. + void process_primitives(
  1759. + const SVertexStream & source,
  1760. + const std::vector<CGraphicsPrimitive> & source_primitives);
  1761. void process_primitive(
  1762. const SVertexStream & source,
  1763. const CGraphicsPrimitive & source_primitive);
  1764. @@ -46,6 +52,12 @@ public:
  1765. private:
  1766. void allocate_vertices(tm_size_type vertex_count, tm_size_type index_count);
  1767.  
  1768. + template <class ContainerType, class PrimitiveGetter>
  1769. + void process_primitives(
  1770. + const SVertexStream & source,
  1771. + const ContainerType & source_primitives,
  1772. + const PrimitiveGetter & primitive_getter);
  1773. +
  1774. private:
  1775. const LineWithCirclesType wide_line_type_;
  1776. const LineEndingType ending_type_;
  1777. diff --git a/Projects/tmRender/src/Loading/Animators/LineWithCirclesEnumerator.cpp b/Projects/tmRender/src/Loading/Animators/LineWithCirclesEnumerator.cpp
  1778. index ac35e6b..74701c1 100644
  1779. --- a/Projects/tmRender/src/Loading/Animators/LineWithCirclesEnumerator.cpp
  1780. +++ b/Projects/tmRender/src/Loading/Animators/LineWithCirclesEnumerator.cpp
  1781. @@ -67,34 +67,33 @@ tm_size_type calculate_circle_index_count(const LineEndingType ending_type, cons
  1782. return circle_count * g_triangles_per_segment * g_indices_per_triangle;
  1783. }
  1784.  
  1785. +template <class ContainerType, class PrimitiveGetter>
  1786. tm_size_type calculate_primitives_vertex_count(
  1787. const LineEndingType ending_type,
  1788. - const std::vector<CGraphicsPrimitive *> & source_primitives)
  1789. + const ContainerType & source_primitives,
  1790. + const PrimitiveGetter & primitive_getter)
  1791. {
  1792. - return std::accumulate(
  1793. - source_primitives.cbegin(),
  1794. - source_primitives.cend(),
  1795. - tm_size_type{0},
  1796. - [&ending_type] (const tm_size_type previous, CGraphicsPrimitive * const primitive) -> tm_size_type {
  1797. - UNI_ASSERT(primitive);
  1798. - return previous + calculate_primitive_vertex_count(ending_type, *primitive);
  1799. - });
  1800. + tm_size_type count = 0;
  1801. + for (const auto & primitive : source_primitives)
  1802. + {
  1803. + count += calculate_primitive_vertex_count(ending_type, primitive_getter(primitive));
  1804. + }
  1805. + return count;
  1806. }
  1807.  
  1808. +template <class ContainerType, class PrimitiveGetter>
  1809. tm_size_type calculate_primitives_index_count(
  1810. const LineEndingType ending_type,
  1811. - const std::vector<CGraphicsPrimitive *> & source_primitives)
  1812. + const ContainerType & source_primitives,
  1813. + const PrimitiveGetter & primitive_getter)
  1814. {
  1815. - return std::accumulate(
  1816. - source_primitives.cbegin(),
  1817. - source_primitives.cend(),
  1818. - tm_size_type{0},
  1819. - [&ending_type] (const tm_size_type previous, CGraphicsPrimitive * const primitive) -> tm_size_type {
  1820. - UNI_ASSERT(primitive);
  1821. - return previous
  1822. - + calculate_line_index_count(*primitive)
  1823. - + calculate_circle_index_count(ending_type, *primitive);
  1824. - });
  1825. + tm_size_type count = 0;
  1826. + for (const auto & primitive : source_primitives)
  1827. + {
  1828. + count += calculate_line_index_count(primitive_getter(primitive))
  1829. + + calculate_circle_index_count(ending_type, primitive_getter(primitive));
  1830. + }
  1831. + return count;
  1832. }
  1833.  
  1834. #include <tmCore/Pragmas/disable_warning_conditional_expression_is_constant.h>
  1835. @@ -378,18 +377,19 @@ void LineWithCirclesEnumerator::allocate_vertices(const tm_size_type vertex_coun
  1836. render_node_data_.output_indices.resize(index_count);
  1837. }
  1838.  
  1839. +template <class ContainerType, class PrimitiveGetter>
  1840. void LineWithCirclesEnumerator::process_primitives(
  1841. const SVertexStream & source,
  1842. - const std::vector<CGraphicsPrimitive *> & source_primitives)
  1843. + const ContainerType & source_primitives,
  1844. + const PrimitiveGetter & primitive_getter)
  1845. {
  1846. allocate_vertices(
  1847. - calculate_primitives_vertex_count(ending_type_, source_primitives),
  1848. - calculate_primitives_index_count(ending_type_, source_primitives));
  1849. + calculate_primitives_vertex_count(ending_type_, source_primitives, primitive_getter),
  1850. + calculate_primitives_index_count(ending_type_, source_primitives, primitive_getter));
  1851.  
  1852. for (const auto & primitive : source_primitives)
  1853. {
  1854. - UNI_ASSERT(primitive);
  1855. - process_primitive(source, *primitive);
  1856. + process_primitive(source, primitive_getter(primitive));
  1857. }
  1858. }
  1859.  
  1860. @@ -428,30 +428,62 @@ void LineWithCirclesEnumerator::process_primitive(
  1861.  
  1862. void LineWithCirclesEnumerator::process_primitives(
  1863. const SVertexStream & source,
  1864. - const CMorphPrimitiveContainer & source_primitives)
  1865. + const std::vector<const CGraphicsPrimitive *> & source_primitives)
  1866. {
  1867. - auto primitives_container = make_vector_with_capacity<CGraphicsPrimitive *>(
  1868. - range_checked_cast<size_t>(std::distance(source_primitives.begin(), source_primitives.end())));
  1869. - for (const auto & primitive : source_primitives)
  1870. - {
  1871. - primitives_container.push_back(primitive.Primitive);
  1872. - }
  1873. + process_primitives(
  1874. + source,
  1875. + source_primitives,
  1876. + [] (const CGraphicsPrimitive * const primitive) -> const CGraphicsPrimitive & {
  1877. + return *primitive;
  1878. + });
  1879. +}
  1880.  
  1881. - process_primitives(source, primitives_container);
  1882. +void LineWithCirclesEnumerator::process_primitives(
  1883. + const SVertexStream & source,
  1884. + const CMorphPrimitiveContainer & source_primitives)
  1885. +{
  1886. + process_primitives(
  1887. + source,
  1888. + source_primitives,
  1889. + [] (const SPrimitiveData & primitive) -> const CGraphicsPrimitive & {
  1890. + return *primitive.Primitive;
  1891. + });
  1892. }
  1893.  
  1894. void LineWithCirclesEnumerator::process_primitives(
  1895. const SVertexStream & source,
  1896. const std::vector<boost::intrusive_ptr<CPrimitiveRenderNode>> & source_primitives)
  1897. {
  1898. - auto primitives_container =
  1899. - make_vector_with_capacity<CGraphicsPrimitive *>(source_primitives.size());
  1900. - for (const auto & primitive : source_primitives)
  1901. - {
  1902. - primitives_container.push_back(primitive.get());
  1903. - }
  1904. + process_primitives(
  1905. + source,
  1906. + source_primitives,
  1907. + [] (const boost::intrusive_ptr<CPrimitiveRenderNode> & primitive) -> const CGraphicsPrimitive & {
  1908. + return *primitive;
  1909. + });
  1910. +}
  1911.  
  1912. - process_primitives(source, primitives_container);
  1913. +void LineWithCirclesEnumerator::process_primitives(
  1914. + const SVertexStream & source,
  1915. + const std::vector<CGraphicsPrimitive *> & source_primitives)
  1916. +{
  1917. + process_primitives(
  1918. + source,
  1919. + source_primitives,
  1920. + [] (const CGraphicsPrimitive * const primitive) -> const CGraphicsPrimitive & {
  1921. + return *primitive;
  1922. + });
  1923. +}
  1924. +
  1925. +void LineWithCirclesEnumerator::process_primitives(
  1926. + const SVertexStream & source,
  1927. + const std::vector<CGraphicsPrimitive> & source_primitives)
  1928. +{
  1929. + process_primitives(
  1930. + source,
  1931. + source_primitives,
  1932. + [] (const CGraphicsPrimitive & primitive) -> const CGraphicsPrimitive & {
  1933. + return primitive;
  1934. + });
  1935. }
  1936.  
  1937. CHugeVertexRenderNodeData LineWithCirclesEnumerator::release_morph_result()
  1938. --
  1939. 1.9.5.msysgit.1
  1940.  
  1941. From fe8817952035f27600de6822ca5afe08fe0eb4a8 Mon Sep 17 00:00:00 2001
  1942. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  1943. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  1944. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  1945. Date: Mon, 29 Jun 2015 10:42:24 +0600
  1946. Subject: [PATCH 08/24] =?UTF-8?q?[LMAP-1478]=20CHugeVertexRenderNode=20?=
  1947. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE?=
  1948. =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82=20=D1=81=20=D1=80=D0=B0=D0=B7=D0=B4?=
  1949. =?UTF-8?q?=D0=B5=D0=BB=D1=8F=D0=B5=D0=BC=D1=8B=D0=BC=20=D0=B1=D1=83=D1=84?=
  1950. =?UTF-8?q?=D0=B5=D1=80=D0=B0=D0=BC=D0=B8?=
  1951. MIME-Version: 1.0
  1952. Content-Type: text/plain; charset=UTF-8
  1953. Content-Transfer-Encoding: 8bit
  1954.  
  1955. ---
  1956. Projects/tmRender/CHugeVertexRenderNode.h | 26 +++++++++--
  1957. Projects/tmRender/CHugeVertexRenderNode.inl | 72 ++++++++++++++++++++---------
  1958. 2 files changed, 72 insertions(+), 26 deletions(-)
  1959.  
  1960. diff --git a/Projects/tmRender/CHugeVertexRenderNode.h b/Projects/tmRender/CHugeVertexRenderNode.h
  1961. index c6f4a51..e4f70a7 100644
  1962. --- a/Projects/tmRender/CHugeVertexRenderNode.h
  1963. +++ b/Projects/tmRender/CHugeVertexRenderNode.h
  1964. @@ -92,15 +92,22 @@ public:
  1965. template<typename ...Args>
  1966. explicit CHugeVertexRenderNode(
  1967. CHugeVertexRenderNodeData &&data, Args&&... args);
  1968. +
  1969. + //! Конструктор от некого void* на морфированные данные и графические буферы.
  1970. + template<typename ...Args>
  1971. + explicit CHugeVertexRenderNode(const boost::intrusive_ptr<RefCountedSingleThread> & shared_data, Args&&... args);
  1972. +
  1973. virtual ~CHugeVertexRenderNode() override;
  1974.  
  1975. public:
  1976. CHugeVertexRenderNodeRenderer &get_renderer_ref();
  1977. const CHugeVertexRenderNodeRenderer &get_renderer_ref() const;
  1978.  
  1979. + //! ВоЕвращает некий void* на морфированные данные и графические буферы.
  1980. + boost::intrusive_ptr<RefCountedSingleThread> getSharedHugeDataWithBuffers();
  1981. +
  1982. public: // IVertexRenderNode
  1983. virtual void clearExternalResources() override;
  1984. - virtual void hardwareDraw(IRender * render) const override;
  1985.  
  1986. // отрисовка рендером.
  1987. virtual void hardwareDrawCustomTree(
  1988. @@ -121,10 +128,21 @@ private:
  1989. const std::vector<CHugeVertexRenderNodeData::PrimitiveDesc> &primitive_descs) const;
  1990.  
  1991. private:
  1992. - mutable std::vector<RenderPrimitive> render_primitives;
  1993. - mutable boost::intrusive_ptr<IRenderBufferObject> IndexBuffer;
  1994. + struct SharedDataWithBuffers final : public RefCountedSingleThread
  1995. + {
  1996. + const CHugeVertexRenderNodeData data_;
  1997. +
  1998. + std::vector<RenderPrimitive> render_primitives;
  1999. + boost::intrusive_ptr<IRenderBufferObject> IndexBuffer;
  2000. +
  2001. + explicit SharedDataWithBuffers(CHugeVertexRenderNodeData && data);
  2002. +
  2003. + SharedDataWithBuffers(const CHugeVertexRenderNodeData &) = delete;
  2004. + };
  2005. +
  2006. +private:
  2007. + const boost::intrusive_ptr<SharedDataWithBuffers> shared_data_with_buffers_;
  2008. #endif
  2009. - const CHugeVertexRenderNodeData render_node_data_;
  2010. CHugeVertexRenderNodeRenderer renderer_;
  2011. };
  2012.  
  2013. diff --git a/Projects/tmRender/CHugeVertexRenderNode.inl b/Projects/tmRender/CHugeVertexRenderNode.inl
  2014. index 3e8c555..ba15cd1 100644
  2015. --- a/Projects/tmRender/CHugeVertexRenderNode.inl
  2016. +++ b/Projects/tmRender/CHugeVertexRenderNode.inl
  2017. @@ -1,9 +1,9 @@
  2018. #pragma once
  2019.  
  2020. -#include <tmRender/RenderCounters.inl>
  2021. -
  2022. #include "CHugeVertexRenderNode.h"
  2023.  
  2024. +#include <tmCore/make_intrusive.h>
  2025. +#include <tmRender/RenderCounters.inl>
  2026. #include "VertexStream.inl"
  2027. #include "IRenderObject.h"
  2028. #include "IRender.h"
  2029. @@ -14,17 +14,37 @@ namespace tmrender
  2030. {
  2031.  
  2032. template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
  2033. +CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::SharedDataWithBuffers::SharedDataWithBuffers(
  2034. + CHugeVertexRenderNodeData && data)
  2035. + : data_(std::move(data))
  2036. +{
  2037. +}
  2038. +
  2039. +template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
  2040. template<typename ...Args>
  2041. CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::CHugeVertexRenderNode(
  2042. CHugeVertexRenderNodeData &&data,
  2043. Args&&... args)
  2044. : IVertexRenderNode(data.output_stream)
  2045. - , render_node_data_(std::move(data))
  2046. + , shared_data_with_buffers_(make_intrusive<SharedDataWithBuffers>(std::move(data)))
  2047. , renderer_(std::forward<Args>(args)...)
  2048. {
  2049. }
  2050.  
  2051. template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
  2052. +template<typename ...Args>
  2053. +CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::CHugeVertexRenderNode(
  2054. + const boost::intrusive_ptr<RefCountedSingleThread> & shared_data,
  2055. + Args&&... args)
  2056. + : IVertexRenderNode(checked_cast<SharedDataWithBuffers &>(*shared_data).data_.output_stream)
  2057. + , shared_data_with_buffers_(checked_cast<SharedDataWithBuffers *>(shared_data.get()))
  2058. + , renderer_(std::forward<Args>(args)...)
  2059. +{
  2060. + UNI_ASSERT(shared_data);
  2061. + UNI_ASSERT(check_type<SharedDataWithBuffers &>(*shared_data));
  2062. +}
  2063. +
  2064. +template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
  2065. CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::~CHugeVertexRenderNode()
  2066. {
  2067. clearExternalResources();
  2068. @@ -43,16 +63,20 @@ const CHugeVertexRenderNodeRenderer &CHugeVertexRenderNode<RenderPrimitive, CHug
  2069. }
  2070.  
  2071. template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
  2072. -void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::clearExternalResources()
  2073. +boost::intrusive_ptr<RefCountedSingleThread>
  2074. + CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::getSharedHugeDataWithBuffers()
  2075. {
  2076. - render_primitives.clear();
  2077. - IndexBuffer.reset();
  2078. + UNI_ASSERT(shared_data_with_buffers_);
  2079. + return shared_data_with_buffers_;
  2080. }
  2081.  
  2082. template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
  2083. -void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::hardwareDraw(IRender * render) const
  2084. +void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::clearExternalResources()
  2085. {
  2086. - hardwareDrawCustomTree(render, nullptr);
  2087. + // Неоптимально, так как другие CHugeVertexRenderNode тоже могут испольЕовать раЕделяемые вершинные буферы.
  2088. + // Но ничего не ломает, так как удаленные буферы переЕальются при следующей отрисовке.
  2089. + shared_data_with_buffers_->render_primitives.clear();
  2090. + shared_data_with_buffers_->IndexBuffer.reset();
  2091. }
  2092.  
  2093. template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
  2094. @@ -62,20 +86,22 @@ void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::hard
  2095. {
  2096. #ifdef TM_USE_EXTERNAL_RENDER
  2097. UNI_ASSERT(render);
  2098. - if (!IndexBuffer)
  2099. +
  2100. + UNI_ASSERT(shared_data_with_buffers_);
  2101. + if (!shared_data_with_buffers_->IndexBuffer)
  2102. {
  2103. - IndexBuffer = render->createElementArray16(
  2104. - render_node_data_.output_indices.data(),
  2105. - static_cast<tm_size_type>(render_node_data_.output_indices.size()),
  2106. + shared_data_with_buffers_->IndexBuffer = render->createElementArray16(
  2107. + shared_data_with_buffers_->data_.output_indices.data(),
  2108. + static_cast<tm_size_type>(shared_data_with_buffers_->data_.output_indices.size()),
  2109. ERBUH_STATIC);
  2110. }
  2111.  
  2112. - if (render_primitives.empty())
  2113. + if (shared_data_with_buffers_->render_primitives.empty())
  2114. {
  2115. update_render_primitives(
  2116. *render,
  2117. - render_node_data_.output_stream.get(),
  2118. - render_node_data_.output_primitives);
  2119. + shared_data_with_buffers_->data_.output_stream.get(),
  2120. + shared_data_with_buffers_->data_.output_primitives);
  2121. }
  2122.  
  2123. const bool is2d = !getVertices() || (getVertices()->Desc & EVD_VECTOR_3D) == 0;
  2124. @@ -92,15 +118,16 @@ void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::hard
  2125.  
  2126. renderer_.set_opengl_state(*render);
  2127.  
  2128. - for (const auto &render_primitive : render_primitives)
  2129. + for (const auto &render_primitive : shared_data_with_buffers_->render_primitives)
  2130. {
  2131. - renderer_.render_primitive(*render, IndexBuffer, render_primitive);
  2132. + renderer_.render_primitive(*render, shared_data_with_buffers_->IndexBuffer, render_primitive);
  2133. }
  2134.  
  2135. g_render_counters.count_vbo();
  2136. - g_render_counters.count_vertices(render_node_data_.output_stream->Count);
  2137. + g_render_counters.count_vertices(shared_data_with_buffers_->data_.output_stream->Count);
  2138. g_render_counters.count_primitives(
  2139. - tme::range_checked_cast<performance::RenderCounters::CounterType>(render_primitives.size()));
  2140. + tme::range_checked_cast<performance::RenderCounters::CounterType>(
  2141. + shared_data_with_buffers_->render_primitives.size()));
  2142.  
  2143. #else // TM_USE_EXTERNAL_RENDER
  2144. throw std::logic_error("Not implemented w/o TM_USE_EXTERNAL_RENDER");
  2145. @@ -110,7 +137,7 @@ void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::hard
  2146. template<typename RenderPrimitive, typename CHugeVertexRenderNodeRenderer>
  2147. void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::verticesChanged()
  2148. {
  2149. - render_primitives.clear();
  2150. + shared_data_with_buffers_->render_primitives.clear();
  2151. }
  2152.  
  2153. #ifndef TM_DISABLE_SOFTWARE_RENDERING
  2154. @@ -133,12 +160,13 @@ void CHugeVertexRenderNode<RenderPrimitive, CHugeVertexRenderNodeRenderer>::upda
  2155.  
  2156. #ifdef TM_USE_EXTERNAL_RENDER
  2157. VertexStreamAttribsDesc attribs_desc = render.createVertexAttribObject(vertex_stream, ERBUH_STATIC);
  2158. - render_primitives.reserve(primitive_descs.size());
  2159. + shared_data_with_buffers_->render_primitives.reserve(primitive_descs.size());
  2160.  
  2161. const auto position_desc = getVertices()->getPositionDesc();
  2162. for (const auto &primitive_desc : primitive_descs)
  2163. {
  2164. - render_primitives.push_back(renderer_.create_primitive(render, attribs_desc, position_desc, primitive_desc));
  2165. + shared_data_with_buffers_->render_primitives.push_back(
  2166. + renderer_.create_primitive(render, attribs_desc, position_desc, primitive_desc));
  2167. }
  2168. #endif // TM_USE_EXTERNAL_RENDER
  2169. }
  2170. --
  2171. 1.9.5.msysgit.1
  2172.  
  2173. From d57bf02a260dbc990b5c1b9225977fa75fa568fa Mon Sep 17 00:00:00 2001
  2174. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  2175. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  2176. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  2177. Date: Mon, 29 Jun 2015 10:43:41 +0600
  2178. Subject: [PATCH 09/24] =?UTF-8?q?[LMAP-1478]=20=D0=9F=D0=BE=D0=B4=D0=B4?=
  2179. =?UTF-8?q?=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20SharedVertexSceneNode=20=D0=B2?=
  2180. =?UTF-8?q?=20TrafficLineAnimator?=
  2181. MIME-Version: 1.0
  2182. Content-Type: text/plain; charset=UTF-8
  2183. Content-Transfer-Encoding: 8bit
  2184.  
  2185. ---
  2186. .../tmSymbol/src/Animators/TrafficLineAnimator.cpp | 47 ++++++++++++++--------
  2187. 1 file changed, 31 insertions(+), 16 deletions(-)
  2188.  
  2189. diff --git a/Projects/tmSymbol/src/Animators/TrafficLineAnimator.cpp b/Projects/tmSymbol/src/Animators/TrafficLineAnimator.cpp
  2190. index 9d0a264..c44d6d4 100644
  2191. --- a/Projects/tmSymbol/src/Animators/TrafficLineAnimator.cpp
  2192. +++ b/Projects/tmSymbol/src/Animators/TrafficLineAnimator.cpp
  2193. @@ -3,6 +3,7 @@
  2194. #include "TrafficLineAnimator.h"
  2195.  
  2196. #include <tmCore/move_and_clear.h>
  2197. +#include <tmCore/make_intrusive.h>
  2198. #include <tmRender/VertexStream.inl>
  2199. #include <tmRender/CHugeVertexRenderNode.h>
  2200. #include <tmRender/Loading/Animators/LineWithCirclesEnumerator.h>
  2201. @@ -13,6 +14,7 @@
  2202. #include <tmRender/ProgramUtils.h>
  2203. #include <tmRender/ISceneNode.h>
  2204. #include <tmRender/CPrimitiveSetSceneNode.h>
  2205. +#include <tmRender/SharedVertexSceneNode.h>
  2206. #include <tmRender/CMaterialSceneNode.h>
  2207. #include <tmRender/AnimationContext.h>
  2208. #include <tmRender/LineGenerator.h>
  2209. @@ -171,7 +173,7 @@ public:
  2210. public:
  2211. void process_primitives(
  2212. const tmrender::SVertexStream & source,
  2213. - const tmrender::CMorphPrimitiveContainer & source_primitives);
  2214. + const std::vector<tmrender::CGraphicsPrimitive> & source_primitives);
  2215.  
  2216. public:
  2217. tmrender::CHugeVertexRenderNodeData release_morph_result();
  2218. @@ -250,7 +252,8 @@ public:
  2219. //! получаем объект анимации по уЕлу. свяЕка материал-морфер должна быть 1:1, материал является парентом для морфера
  2220. TrafficAnimationInfoPtr GetAnimationInfo(tme::tmrender::IAnimatedSceneNode *in_node)
  2221. {
  2222. - if (dynamic_cast<tmrender::CPrimitiveSetSceneNode*>(in_node))
  2223. + if (dynamic_cast<tmrender::CPrimitiveSetSceneNode*>(in_node)
  2224. + || dynamic_cast<tmrender::SharedVertexSceneNode*>(in_node))
  2225. {
  2226. tmrender::CPrimitiveSetSceneNode * primitive_node = static_cast<tmrender::CPrimitiveSetSceneNode*>(in_node);
  2227. UNI_ASSERT(dynamic_cast<tmrender::CMaterialSceneNode*>(primitive_node->getMaterialNode()));
  2228. @@ -408,11 +411,11 @@ void TrafficLineAnimator::skin_attach(tmrender::ISkinAnimatedSceneNode * const n
  2229.  
  2230. void TrafficLineAnimator::morph_attach(tmrender::IMorphAnimatedSceneNode * const node)
  2231. {
  2232. - node->createDataCopy(tme::tmrender::EAM_MANUAL_COPY);
  2233. - node->enterDataCopy();
  2234. -
  2235. if (need_arrow_)
  2236. {
  2237. + node->createDataCopy(tme::tmrender::EAM_MANUAL_COPY);
  2238. + node->enterDataCopy();
  2239. +
  2240. // переберем все примитивы, чтобы определить раЕмер реЕультирующего массива точек
  2241. TrafficLinePrimitiveEnumerator modifier(node->accessSourceVertices(), attributes_, line_offset_result_cache_);
  2242.  
  2243. @@ -422,24 +425,36 @@ void TrafficLineAnimator::morph_attach(tmrender::IMorphAnimatedSceneNode * const
  2244. node->setDataCopyVertexRenderNode(
  2245. new tmrender::HugeAALinesVertexRenderNode(
  2246. tme::move_and_clear(output_data.render_node_data)));
  2247. +
  2248. + node->leaveDataCopy();
  2249. }
  2250. else
  2251. {
  2252. - TrafficLineWithoutArrowPrimitiveEnumerator modifier(attributes_->arrow_shift_, line_offset_result_cache_);
  2253. - modifier.process_primitives(*node->accessSourceVertices(), node->accessSourcePrimitivesEx());
  2254. + tmrender::SharedVertexSceneNode & scene_node = checked_cast<tmrender::SharedVertexSceneNode &>(*node);
  2255.  
  2256. - auto morph_result = modifier.release_morph_result();
  2257. + boost::intrusive_ptr<tmrender::LineWithCirclesVertexRenderNode> render_node;
  2258. + if (!scene_node.morphResultCreated())
  2259. + {
  2260. + TrafficLineWithoutArrowPrimitiveEnumerator modifier(attributes_->arrow_shift_, line_offset_result_cache_);
  2261. + modifier.process_primitives(scene_node.getSharedVertices(), scene_node.getSharedPrimitives());
  2262. +
  2263. + render_node = make_intrusive<tmrender::LineWithCirclesVertexRenderNode>(
  2264. + modifier.release_morph_result(),
  2265. + tmrender::LineWithCirclesType::NonStriped);
  2266.  
  2267. - const auto render_node =
  2268. - new tmrender::LineWithCirclesVertexRenderNode(
  2269. - tme::move_and_clear(morph_result),
  2270. + scene_node.setMorphResult(render_node->getSharedHugeDataWithBuffers());
  2271. + }
  2272. + else
  2273. + {
  2274. + render_node = make_intrusive<tmrender::LineWithCirclesVertexRenderNode>(
  2275. + scene_node.getMorphResult(),
  2276. tmrender::LineWithCirclesType::NonStriped);
  2277. + }
  2278. +
  2279. render_node->get_renderer_ref().set_width(attributes_->width_);
  2280. - node->setDataCopyVertexRenderNode(render_node);
  2281. + scene_node.setRenderNode(render_node);
  2282. }
  2283.  
  2284. - node->leaveDataCopy();
  2285. -
  2286. tmrender::ISkinAnimatedSceneNode * const skin_node =
  2287. checked_cast<tmrender::CMaterialSceneNode*>(node->getSceneNodeInterface()->getMaterialNode());
  2288.  
  2289. @@ -908,14 +923,14 @@ TrafficLineWithoutArrowPrimitiveEnumerator::TrafficLineWithoutArrowPrimitiveEnum
  2290.  
  2291. void TrafficLineWithoutArrowPrimitiveEnumerator::process_primitives(
  2292. const tmrender::SVertexStream & source,
  2293. - const tmrender::CMorphPrimitiveContainer & source_primitives)
  2294. + const std::vector<tmrender::CGraphicsPrimitive> & source_primitives)
  2295. {
  2296. if (!shift_.isZero())
  2297. {
  2298. for (const auto & primitive : source_primitives)
  2299. {
  2300. move_line_with_rounding(
  2301. - primitive.Primitive,
  2302. + &primitive,
  2303. &source,
  2304. shift_,
  2305. collapse_line_to_first_last_and_furthest_vertices,
  2306. --
  2307. 1.9.5.msysgit.1
  2308.  
  2309. From affbbb60cad9a7858c37686fefffb2ae7b79f3ea Mon Sep 17 00:00:00 2001
  2310. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  2311. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  2312. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  2313. Date: Mon, 29 Jun 2015 10:52:43 +0600
  2314. Subject: [PATCH 10/24] =?UTF-8?q?[LMAP-1478]=20=D0=92=D1=81=D0=B5=20traffi?=
  2315. =?UTF-8?q?c=5Fline=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF=D0=B5=D1=80?=
  2316. =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=B2=20=D0=BC?=
  2317. =?UTF-8?q?=D0=B5=D0=BD=D1=8E=20traffic=20line?=
  2318. MIME-Version: 1.0
  2319. Content-Type: text/plain; charset=UTF-8
  2320. Content-Transfer-Encoding: 8bit
  2321.  
  2322. ---
  2323. Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 54 +++++++++++------------
  2324. 1 file changed, 27 insertions(+), 27 deletions(-)
  2325.  
  2326. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2327. index 92df4ee..e378a9d 100644
  2328. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2329. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2330. @@ -5083,6 +5083,33 @@ QMenu * MainWindowImpl::createSymbolTestMenu(const QString & text)
  2331.  
  2332. add_symbol_test(
  2333. menu,
  2334. + tr("Points without height (raster_marker)"),
  2335. + [] (tme::tmrender::ISymbolCreationFactory & symbol_factory, const std::string & symbol_name) {
  2336. + symbol_factory.create_point_symbol(symbol_name, "poi_2gis", 70, 0, false);
  2337. + },
  2338. + [] (const PlanePoint & center_point) {
  2339. + return create_point_test_geometry(center_point, false);
  2340. + });
  2341. +
  2342. + add_symbol_test(
  2343. + menu,
  2344. + tr("Points with height (raster_marker)"),
  2345. + [] (tme::tmrender::ISymbolCreationFactory & symbol_factory, const std::string & symbol_name) {
  2346. + symbol_factory.create_point_symbol(symbol_name, "poi_2gis", 70, 0, true);
  2347. + },
  2348. + [] (const PlanePoint & center_point) {
  2349. + return create_point_test_geometry(center_point, true);
  2350. + });
  2351. +
  2352. + return menu;
  2353. +}
  2354. +
  2355. +QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2356. +{
  2357. + QMenu * menu = new QMenu(text, parent_);
  2358. +
  2359. + add_symbol_test(
  2360. + menu,
  2361. tr("Traffic Line arrow (traffic_line arrow)"),
  2362. &create_traffic_line_arrow_symbol,
  2363. &create_traffic_line_test_geometry);
  2364. @@ -5117,33 +5144,6 @@ QMenu * MainWindowImpl::createSymbolTestMenu(const QString & text)
  2365.  
  2366. add_symbol_test(
  2367. menu,
  2368. - tr("Points without height (raster_marker)"),
  2369. - [] (tme::tmrender::ISymbolCreationFactory & symbol_factory, const std::string & symbol_name) {
  2370. - symbol_factory.create_point_symbol(symbol_name, "poi_2gis", 70, 0, false);
  2371. - },
  2372. - [] (const PlanePoint & center_point) {
  2373. - return create_point_test_geometry(center_point, false);
  2374. - });
  2375. -
  2376. - add_symbol_test(
  2377. - menu,
  2378. - tr("Points with height (raster_marker)"),
  2379. - [] (tme::tmrender::ISymbolCreationFactory & symbol_factory, const std::string & symbol_name) {
  2380. - symbol_factory.create_point_symbol(symbol_name, "poi_2gis", 70, 0, true);
  2381. - },
  2382. - [] (const PlanePoint & center_point) {
  2383. - return create_point_test_geometry(center_point, true);
  2384. - });
  2385. -
  2386. - return menu;
  2387. -}
  2388. -
  2389. -QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2390. -{
  2391. - QMenu * menu = new QMenu(text, parent_);
  2392. -
  2393. - add_symbol_test(
  2394. - menu,
  2395. tr("Multipolylines Traffic Line pbl (traffic_line pbl)"),
  2396. std::bind(create_traffic_line_pbl_symbol, std::placeholders::_1, std::placeholders::_2, 200),
  2397. &create_multi_polyline_test_geometry);
  2398. --
  2399. 1.9.5.msysgit.1
  2400.  
  2401. From fe828c79f7901e551da86eed09340217761c382c Mon Sep 17 00:00:00 2001
  2402. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  2403. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  2404. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  2405. Date: Mon, 29 Jun 2015 10:52:53 +0600
  2406. Subject: [PATCH 11/24] [LMAP-#] Codestyle
  2407.  
  2408. ---
  2409. Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 10 +++++-----
  2410. Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt | 2 +-
  2411. 2 files changed, 6 insertions(+), 6 deletions(-)
  2412.  
  2413. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2414. index e378a9d..a1efcc3 100644
  2415. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2416. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2417. @@ -977,7 +977,7 @@ PlanePointContainer create_complex_line_geometry_for_gradient_testing(const Plan
  2418. };
  2419.  
  2420. auto points = tme::make_vector_with_capacity<PlanePoint>(shifts.size());
  2421. -
  2422. +
  2423. std::transform(shifts.begin(), shifts.end(), std::back_inserter(points),
  2424. [&center_point](const PlaneShift& shift)
  2425. {
  2426. @@ -990,7 +990,7 @@ PlanePointContainer create_complex_line_geometry_for_gradient_testing(const Plan
  2427. std::vector<IGeometryConstPtr> create_colored_line_test_geometry(const PlanePoint & center_point)
  2428. {
  2429. auto points = create_complex_line_geometry_for_gradient_testing(center_point);
  2430. - auto colors = create_complex_line_colors_for_gradient_testing();
  2431. + auto colors = create_complex_line_colors_for_gradient_testing();
  2432.  
  2433. /*
  2434.  
  2435. @@ -3334,14 +3334,14 @@ void MainWindowImpl::onColoredLineHidingTestActionChecked(const bool checked)
  2436. colored_gradient_line_ = object;
  2437. custom_colored_line_layer_->add_object(colored_gradient_line_);
  2438. carto_widget_->addDynamicLayer(custom_colored_line_layer_, project_id);
  2439. -
  2440. +
  2441. colored_line_control_ = parent_->addToolBar("Line Part To Hide");
  2442. -
  2443. +
  2444. const auto slider = new QSlider(Qt::Horizontal);
  2445. slider->setMinimum(0);
  2446. slider->setMaximum(static_cast<int>(g_gradient_line_hiding_test_granularity));
  2447. colored_line_control_->addWidget(slider);
  2448. -
  2449. +
  2450. connect(slider, SIGNAL(valueChanged(int)), this, SLOT(onColoredLinePartToHideChanged(int)));
  2451. }
  2452.  
  2453. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  2454. index 619564e..8a38c56 100644
  2455. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  2456. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  2457. @@ -408,7 +408,7 @@ private:
  2458. std::shared_ptr<PluginDynamicLayer> geocoding_by_click_layer_;
  2459. std::shared_ptr<StyleDynamicLayer> screen_coord_test_layer_;
  2460. std::shared_ptr<StyleDynamicLayer> raster_with_height_layer_;
  2461. -
  2462. +
  2463. std::shared_ptr<StyleDynamicLayer> custom_colored_line_layer_;
  2464. IDynamicObjectPtr colored_gradient_line_;
  2465. QToolBar* colored_line_control_;
  2466. --
  2467. 1.9.5.msysgit.1
  2468.  
  2469. From 6daed80aa03a24aec9a93117ef1c0eb5f8ddefd2 Mon Sep 17 00:00:00 2001
  2470. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  2471. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  2472. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  2473. Date: Mon, 29 Jun 2015 12:04:23 +0600
  2474. Subject: [PATCH 12/24] =?UTF-8?q?[LMAP-1478]=20=D0=9F=D0=BE=D1=87=D0=B8?=
  2475. =?UTF-8?q?=D0=BD=D0=BA=D0=B0=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D1=85=20?=
  2476. =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20traffic=5Fline?=
  2477. MIME-Version: 1.0
  2478. Content-Type: text/plain; charset=UTF-8
  2479. Content-Transfer-Encoding: 8bit
  2480.  
  2481. ---
  2482. Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 53 +++++++++++++++++++----
  2483. 1 file changed, 45 insertions(+), 8 deletions(-)
  2484.  
  2485. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2486. index a1efcc3..fa8ce17 100644
  2487. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2488. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2489. @@ -199,6 +199,7 @@ void TestListener::on_buildings_placement_changed(
  2490. last_visible_objects_.push_back(object_details.object_id);
  2491. }
  2492. }
  2493. +
  2494. std::vector<IDynamicObjectPtr> create_directional_model_object_from_file(
  2495. const PlanePoint & center_point,
  2496. const ProjectId,
  2497. @@ -1158,6 +1159,18 @@ std::vector<IGeometryConstPtr> create_area_test_geometry(const PlanePoint & cent
  2498. return geometries;
  2499. }
  2500.  
  2501. +std::vector<IDynamicObjectPtr> create_traffic_line_test_objects(const std::vector<IGeometryConstPtr> & geometries)
  2502. +{
  2503. + ObjectId object_id(1);
  2504. + std::vector<IDynamicObjectPtr> objects;
  2505. + for (const auto & geometry : geometries)
  2506. + {
  2507. + objects.push_back(std::make_shared<TrafficLineDynamicObject>(object_id, geometry));
  2508. + ++object_id;
  2509. + }
  2510. + return objects;
  2511. +}
  2512. +
  2513. template<typename output_type>
  2514. output_type read_32(std::istream &input_stream)
  2515. {
  2516. @@ -5122,7 +5135,10 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2517. std::placeholders::_1,
  2518. std::placeholders::_2,
  2519. 800),
  2520. - &create_line_test_geometry);
  2521. + CreateObjectsGeometryFunction(),
  2522. + [] (const PlanePoint & center, ProjectId) {
  2523. + return create_traffic_line_test_objects(create_line_test_geometry(center));
  2524. + });
  2525.  
  2526. add_symbol_test(
  2527. menu,
  2528. @@ -5132,13 +5148,19 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2529. std::placeholders::_1,
  2530. std::placeholders::_2,
  2531. -800),
  2532. - &create_line_test_geometry);
  2533. + CreateObjectsGeometryFunction(),
  2534. + [] (const PlanePoint & center, ProjectId) {
  2535. + return create_traffic_line_test_objects(create_line_test_geometry(center));
  2536. + });
  2537.  
  2538. add_symbol_test(
  2539. menu,
  2540. tr("Traffic Line pbl without shift (traffic_line pbl)"),
  2541. std::bind(create_traffic_line_pbl_symbol, std::placeholders::_1, std::placeholders::_2, 0),
  2542. - &create_line_test_geometry);
  2543. + CreateObjectsGeometryFunction(),
  2544. + [] (const PlanePoint & center, ProjectId) {
  2545. + return create_traffic_line_test_objects(create_line_test_geometry(center));
  2546. + });
  2547.  
  2548. menu->addSeparator();
  2549.  
  2550. @@ -5146,13 +5168,19 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2551. menu,
  2552. tr("Multipolylines Traffic Line pbl (traffic_line pbl)"),
  2553. std::bind(create_traffic_line_pbl_symbol, std::placeholders::_1, std::placeholders::_2, 200),
  2554. - &create_multi_polyline_test_geometry);
  2555. + CreateObjectsGeometryFunction(),
  2556. + [] (const PlanePoint & center, ProjectId) {
  2557. + return create_traffic_line_test_objects(create_multi_polyline_test_geometry(center));
  2558. + });
  2559.  
  2560. add_symbol_test(
  2561. menu,
  2562. tr("Many polylines Traffic Line pbl (traffic_line pbl)"),
  2563. std::bind(create_traffic_line_pbl_symbol, std::placeholders::_1, std::placeholders::_2, 200),
  2564. - &create_many_polyline_test_geometry);
  2565. + CreateObjectsGeometryFunction(),
  2566. + [] (const PlanePoint & center, ProjectId) {
  2567. + return create_traffic_line_test_objects(create_many_polyline_test_geometry(center));
  2568. + });
  2569.  
  2570. add_symbol_test(
  2571. menu,
  2572. @@ -5238,7 +5266,10 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2573. menu,
  2574. tr("Road graph Traffic Line pbl (traffic_line pbl)"),
  2575. &create_traffic_line_zoom_10_symbol,
  2576. - import_traffic_data);
  2577. + CreateObjectsGeometryFunction(),
  2578. + [import_traffic_data] (const PlanePoint & center, ProjectId) {
  2579. + return create_traffic_line_test_objects(import_traffic_data(center));
  2580. + });
  2581.  
  2582. add_symbol_test(
  2583. menu,
  2584. @@ -5253,7 +5284,10 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2585. menu,
  2586. tr("Road graph v3 Traffic Line pbl (traffic_line pbl)"),
  2587. &create_traffic_line_zoom_10_symbol,
  2588. - import_traffic_v3_data);
  2589. + CreateObjectsGeometryFunction(),
  2590. + [import_traffic_v3_data] (const PlanePoint & center, ProjectId) {
  2591. + return create_traffic_line_test_objects(import_traffic_v3_data(center));
  2592. + });
  2593.  
  2594. add_symbol_test(
  2595. menu,
  2596. @@ -5266,7 +5300,10 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2597. menu,
  2598. tr("Road graph v3 Traffic Line pbl (traffic_line pbl)"),
  2599. &create_traffic_line_zoom_10_symbol,
  2600. - import_traffic_v3_data_many);
  2601. + CreateObjectsGeometryFunction(),
  2602. + [import_traffic_v3_data_many] (const PlanePoint & center, ProjectId) {
  2603. + return create_traffic_line_test_objects(import_traffic_v3_data_many(center));
  2604. + });
  2605.  
  2606. add_symbol_test(
  2607. menu,
  2608. --
  2609. 1.9.5.msysgit.1
  2610.  
  2611. From fdab2a7ef2966469fe1a4e6a7aca56acad34625d Mon Sep 17 00:00:00 2001
  2612. From: =?UTF-8?q?=D0=91=D0=B0=D0=BD=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=A1?=
  2613. =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5?=
  2614. =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= <s.banschikov@2gis.ru>
  2615. Date: Mon, 29 Jun 2015 16:07:29 +0600
  2616. Subject: [PATCH 13/24] =?UTF-8?q?[LMAP-1478]=20=D0=94=D0=BE=D0=B1=D0=B0?=
  2617. =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4?=
  2618. =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BE=D0=BA=20=D1=81=20?=
  2619. =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BB=D0=BE=D0=B6=D0=BA=D0=BE=D0=B9?=
  2620. MIME-Version: 1.0
  2621. Content-Type: text/plain; charset=UTF-8
  2622. Content-Transfer-Encoding: 8bit
  2623.  
  2624. ---
  2625. Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 98 ++++++++++++++++++++++-
  2626. Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt | 2 +
  2627. 2 files changed, 99 insertions(+), 1 deletion(-)
  2628.  
  2629. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2630. index fa8ce17..e65b703 100644
  2631. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2632. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  2633. @@ -49,6 +49,7 @@
  2634. #include <Carto/Carto/Material.h>
  2635. #include <Carto/Carto/MaterialGeometryObject.h>
  2636. #include <Carto/Carto/MaterialGeometryObjectComponent.h>
  2637. +#include <Carto/Carto/DynamicObjects/TrafficLineDynamicObjectFactory.h>
  2638. #include <Carto/Carto/DynamicObjects/DirectionalDynamicObject.h>
  2639. #include <Carto/Carto/DynamicObjects/CircleDynamicObject.h>
  2640. #include <Carto/Carto/DynamicObjects/GradientColoredLineDynamicObject.h>
  2641. @@ -1159,13 +1160,45 @@ std::vector<IGeometryConstPtr> create_area_test_geometry(const PlanePoint & cent
  2642. return geometries;
  2643. }
  2644.  
  2645. +std::vector<IGeometryConstPtr> create_helix_multipolyline_test_geometry(const PlanePoint & center_point)
  2646. +{
  2647. + const float pi = boost::math::constants::pi<float>();
  2648. + const auto create_one_helix = [&pi] (const PlanePoint & center, const float direction) {
  2649. + PlanePointContainer points;
  2650. + const size_t points_in_helix = 1000;
  2651. + for (float angle = 0.f, radius = 100.f; points.size() < points_in_helix; (angle += direction * pi / 36), (radius += 100.f))
  2652. + {
  2653. + const float x = std::cos(angle) * radius;
  2654. + const float y = std::sin(angle) * radius;
  2655. + points.emplace_back(center + PlaneShift(static_cast<MapUnit>(x), static_cast<MapUnit>(y)));
  2656. + }
  2657. + return points;
  2658. + };
  2659. +
  2660. + std::vector<PlanePointContainer> geometries;
  2661. +
  2662. + const MapUnit radius = 110000;
  2663. + const size_t helix_count = 10;
  2664. + for (float angle = 0.f, direction = 1.f; geometries.size() < helix_count; (angle += (2.f * pi / helix_count)), (direction *= -1.f))
  2665. + {
  2666. + const float shift_x = std::cos(angle) * radius;
  2667. + const float shift_y = std::sin(angle) * radius;
  2668. + geometries.push_back(
  2669. + create_one_helix(
  2670. + center_point + PlaneShift(static_cast<MapUnit>(shift_x), static_cast<MapUnit>(shift_y)),
  2671. + direction));
  2672. + }
  2673. +
  2674. + return { create_multi_polyline_geometry(geometries) };
  2675. +}
  2676. +
  2677. std::vector<IDynamicObjectPtr> create_traffic_line_test_objects(const std::vector<IGeometryConstPtr> & geometries)
  2678. {
  2679. ObjectId object_id(1);
  2680. std::vector<IDynamicObjectPtr> objects;
  2681. for (const auto & geometry : geometries)
  2682. {
  2683. - objects.push_back(std::make_shared<TrafficLineDynamicObject>(object_id, geometry));
  2684. + objects.push_back(create_traffic_line_dynamic_object(object_id, geometry));
  2685. ++object_id;
  2686. }
  2687. return objects;
  2688. @@ -5311,9 +5344,72 @@ QMenu * MainWindowImpl::createTrafficTestMenu(const QString & text)
  2689. &create_traffic_line_zoom_15_symbol,
  2690. import_traffic_v3_data_many);
  2691.  
  2692. + menu->addSection(tr("--With border"));
  2693. +
  2694. + menu->addAction(
  2695. + tr("Traffic line with border (shared dynamic object)"),
  2696. + this,
  2697. + SLOT(onAddSharedTrafficLineObjectActionChecked(bool)))->setCheckable(true);
  2698. +
  2699. return menu;
  2700. }
  2701.  
  2702. +void MainWindowImpl::onAddSharedTrafficLineObjectActionChecked(const bool checked)
  2703. +{
  2704. + if (checked)
  2705. + {
  2706. + const auto project_and_point = centerProjectAndPointForTest();
  2707. + const ProjectId & project_id = project_and_point.first;
  2708. + const PlanePoint & center_point = project_and_point.second;
  2709. +
  2710. + const std::string symbol_basename = "Shared traffic_line symbol #";
  2711. +
  2712. + const auto create_layer = [&] (const tmmath::CNonPremultipliedColor color, const tmmath::real32x width) {
  2713. + const std::string symbol_name = symbol_basename + boost::lexical_cast<std::string>(width.toFloat());
  2714. + carto_widget_->symbolCreationFactory(project_id).create_traffic_line_pbl_symbol(
  2715. + symbol_name,
  2716. + color,
  2717. + color,
  2718. + width,
  2719. + 0,
  2720. + 0,
  2721. + 0,
  2722. + 0,
  2723. + 100);
  2724. + return create_style_dynamic_layer(
  2725. + project_id,
  2726. + "Style layer for " + symbol_name,
  2727. + symbol_name,
  2728. + "",
  2729. + "dynamic:screen:plugins");
  2730. + };
  2731. +
  2732. + layers_for_shared_traffic_line_test_ = {
  2733. + create_layer(tmmath::CNonPremultipliedColor(0, 0, 255), 500),
  2734. + create_layer(tmmath::CNonPremultipliedColor(0, 255, 0), 300),
  2735. + create_layer(tmmath::CNonPremultipliedColor(255, 0, 0), 100),
  2736. + };
  2737. +
  2738. + const auto dynamic_object =
  2739. + create_traffic_line_test_objects({ create_helix_multipolyline_test_geometry(center_point) }).front();
  2740. +
  2741. + for (const auto & layer : layers_for_shared_traffic_line_test_)
  2742. + {
  2743. + layer->add_object(dynamic_object);
  2744. +
  2745. + carto_widget_->addDynamicLayer(layer, project_id);
  2746. + }
  2747. + }
  2748. + else
  2749. + {
  2750. + for (const auto & layer : layers_for_shared_traffic_line_test_)
  2751. + {
  2752. + carto_widget_->removeDynamicLayer(layer);
  2753. + }
  2754. + layers_for_shared_traffic_line_test_.clear();
  2755. + }
  2756. +}
  2757. +
  2758. void MainWindowImpl::createTilesMenu()
  2759. {
  2760. tiles_menu_ = new QMenu(tr("T&iles"), parent_);
  2761. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  2762. index 8a38c56..c603dab 100644
  2763. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  2764. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  2765. @@ -175,6 +175,7 @@ private slots:
  2766. void onSelectOnHoverActionChecked(bool checked);
  2767.  
  2768. void onTrafficLayerTestActionChecked(bool checked);
  2769. + void onAddSharedTrafficLineObjectActionChecked(bool checked);
  2770. void onStyleLayerTestActionChecked(bool checked);
  2771. void onMaterialLayerTestActionChecked(bool checked);
  2772. void onPluginLayerTestActionChecked(bool checked);
  2773. @@ -419,6 +420,7 @@ private:
  2774. std::shared_ptr<StyleDynamicLayer> directional_model_layer_;
  2775. std::shared_ptr<StyleDynamicLayer> labeled_rasters_symbol_point_layer_;
  2776. std::shared_ptr<StyleDynamicLayer> labeled_rasters_symbol_line_layer_;
  2777. + std::vector<std::shared_ptr<StyleDynamicLayer>> layers_for_shared_traffic_line_test_;
  2778.  
  2779. std::map<QAction *, TestSymbolData> symbol_test_data_;
  2780.  
  2781. --
  2782. 1.9.5.msysgit.1
  2783.  
  2784. From 304ac1e62a584197d417910f6d80799f32b7eec1 Mon Sep 17 00:00:00 2001
  2785. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  2786. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  2787. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  2788. Date: Thu, 2 Jul 2015 16:00:45 +0600
  2789. Subject: [PATCH 14/24] =?UTF-8?q?[LMAP-#]=20=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8?=
  2790. =?UTF-8?q?=D0=B5=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D1=8F?=
  2791. =?UTF-8?q?:=20final,=20override,=20=3Ddefault=20=D0=B4=D0=B5=D1=81=D1=82?=
  2792. =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80,=20=D0=BE=D1=84=D0=BE?=
  2793. =?UTF-8?q?=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE?=
  2794. =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D1=81=D1=82=D0=B2=20=D0=B8=D0=BC?=
  2795. =?UTF-8?q?=D1=91=D0=BD.?=
  2796. MIME-Version: 1.0
  2797. Content-Type: text/plain; charset=UTF-8
  2798. Content-Transfer-Encoding: 8bit
  2799.  
  2800. ---
  2801. Projects/Carto/Carto/IViewport.h | 2 +-
  2802. Projects/tmRender/CView.h | 2 +-
  2803. Projects/tmRender/CViewCollection.h | 2 +-
  2804. Projects/tmRender/src/CViewCollection.cpp | 5 ++---
  2805. Projects/tmSymbol/CSymbolContainer.h | 14 +++++---------
  2806. 5 files changed, 10 insertions(+), 15 deletions(-)
  2807.  
  2808. diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
  2809. index c7d0a71..2cf8f69 100644
  2810. --- a/Projects/Carto/Carto/IViewport.h
  2811. +++ b/Projects/Carto/Carto/IViewport.h
  2812. @@ -64,7 +64,7 @@ public:
  2813. class IViewport : public IEventProcessor
  2814. {
  2815. public:
  2816. - virtual ~IViewport() {}
  2817. + virtual ~IViewport() = default;
  2818.  
  2819. /*!
  2820. * Уникальный идентификатор порта просмотра.
  2821. diff --git a/Projects/tmRender/CView.h b/Projects/tmRender/CView.h
  2822. index 3358e61..2df6418 100644
  2823. --- a/Projects/tmRender/CView.h
  2824. +++ b/Projects/tmRender/CView.h
  2825. @@ -23,7 +23,7 @@ namespace tmrender
  2826. //
  2827. //**************************************************************************************************
  2828.  
  2829. -class CView : private boost::noncopyable
  2830. +class CView final : private boost::noncopyable
  2831. {
  2832. public:
  2833. // соЕдание просмотра с внешним аппаратным рендером.
  2834. diff --git a/Projects/tmRender/CViewCollection.h b/Projects/tmRender/CViewCollection.h
  2835. index 9859a67..6e0d54c 100644
  2836. --- a/Projects/tmRender/CViewCollection.h
  2837. +++ b/Projects/tmRender/CViewCollection.h
  2838. @@ -9,7 +9,7 @@ namespace tme
  2839. namespace tmrender
  2840. {
  2841.  
  2842. -class CViewCollection
  2843. +class CViewCollection final
  2844. {
  2845. public:
  2846. // добавление компонента в коллекцию.
  2847. diff --git a/Projects/tmRender/src/CViewCollection.cpp b/Projects/tmRender/src/CViewCollection.cpp
  2848. index 72aaa9c..fdc3382 100644
  2849. --- a/Projects/tmRender/src/CViewCollection.cpp
  2850. +++ b/Projects/tmRender/src/CViewCollection.cpp
  2851. @@ -2,7 +2,6 @@
  2852. #include <tmRender/CViewCollection.h>
  2853. #include <tmRender/ISceneNode.h>
  2854.  
  2855. -
  2856. namespace tme
  2857. {
  2858. namespace tmrender
  2859. @@ -160,5 +159,5 @@ void CViewCollection::applyConstFunctionToScene(const SceneNodeConstFunction &fu
  2860. }
  2861.  
  2862.  
  2863. -}
  2864. -}
  2865. +} // namespace tmrender
  2866. +} // namespace tme
  2867. diff --git a/Projects/tmSymbol/CSymbolContainer.h b/Projects/tmSymbol/CSymbolContainer.h
  2868. index 0e2c303..34d5cff 100644
  2869. --- a/Projects/tmSymbol/CSymbolContainer.h
  2870. +++ b/Projects/tmSymbol/CSymbolContainer.h
  2871. @@ -3,8 +3,6 @@
  2872. #include <memory>
  2873. #include <UniFS/Fwd.h>
  2874.  
  2875. -#include <tmCoordSystem/CoordSystem.h>
  2876. -#include <tmRender/DrawConsts.h>
  2877. #include <tmRender/ISymbolContainer.h>
  2878. #include <tmSymbol/Fwd.h>
  2879.  
  2880. @@ -18,8 +16,6 @@ class CSymbolContainer : public tmrender::ISymbolContainer
  2881. {
  2882. public:
  2883. /*!
  2884. - * Конструктор.
  2885. - * \param coord_system система координат проекта.
  2886. * \param loader ЕагруЕчик иЕображений.
  2887. * \param folder интерфейс доступа до древовидной структуры файлов, где хранится описание условных Енаков.
  2888. * \param file имя файла с описанием условных Енаков.
  2889. @@ -28,17 +24,17 @@ public:
  2890. tmrender::ISurfaceManager & loader,
  2891. const UniFS::IDirPtr &folder,
  2892. const std::string &file = std::string("3d.style"));
  2893. - virtual ~CSymbolContainer();
  2894. + virtual ~CSymbolContainer() override;
  2895.  
  2896. public:
  2897. void AddSymbol(const std::string & symbol_name, const tmrender::ISymbolPtr & symbol);
  2898. std::string GetErrorString() const;
  2899.  
  2900. public: // ISymbolContainer
  2901. - virtual tmrender::ISymbolPtr Symbol(const std::string &symbol_name) const;
  2902. - virtual tmrender::ISymbolPtr GetInvisibleSymbol() const;
  2903. - virtual tmrender::CTextureFont * TextureFont(const std::string &font_name) const;
  2904. - virtual tmrender::ISymbolCreationFactory & GetSymbolCreationFactory();
  2905. + virtual tmrender::ISymbolPtr Symbol(const std::string &symbol_name) const override;
  2906. + virtual tmrender::ISymbolPtr GetInvisibleSymbol() const override;
  2907. + virtual tmrender::CTextureFont * TextureFont(const std::string &font_name) const override;
  2908. + virtual tmrender::ISymbolCreationFactory & GetSymbolCreationFactory() override;
  2909.  
  2910. private:
  2911. struct SymbolContainerData;
  2912. --
  2913. 1.9.5.msysgit.1
  2914.  
  2915. From 7c11e74f8e4735ba3519b22f27a49f772b49ec5a Mon Sep 17 00:00:00 2001
  2916. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  2917. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  2918. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  2919. Date: Thu, 2 Jul 2015 16:01:46 +0600
  2920. Subject: [PATCH 15/24] =?UTF-8?q?[LMAP-1399]=20=D0=A1=D0=BE=D0=B7=D0=B4?=
  2921. =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9?=
  2922. =?UTF-8?q?=20=D0=B1=D0=B5=D0=B7=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82?=
  2923. =?UTF-8?q?=D0=B0.?=
  2924. MIME-Version: 1.0
  2925. Content-Type: text/plain; charset=UTF-8
  2926. Content-Transfer-Encoding: 8bit
  2927.  
  2928. ---
  2929. Projects/Carto/Carto/Fwd.h | 2 +-
  2930. Projects/Carto/Carto/IViewport.h | 13 ++-
  2931. Projects/Carto/Carto/Types.h | 6 +-
  2932. Projects/Carto/Carto/Viewport.h | 6 +-
  2933. Projects/Carto/src/Carto/Viewport.cpp | 174 +++++++++++++++++++---------------
  2934. 5 files changed, 110 insertions(+), 91 deletions(-)
  2935.  
  2936. diff --git a/Projects/Carto/Carto/Fwd.h b/Projects/Carto/Carto/Fwd.h
  2937. index 24577b5..213deb9 100644
  2938. --- a/Projects/Carto/Carto/Fwd.h
  2939. +++ b/Projects/Carto/Carto/Fwd.h
  2940. @@ -95,7 +95,7 @@ struct ProjectCoordinates;
  2941. struct ProjectInfo;
  2942. class ViewTrapezium;
  2943. struct ScreenPointPosition;
  2944. -struct ProjectViewData;
  2945. +struct StylesData;
  2946.  
  2947. //! Тип необяЕательного диапаЕона масштабов.
  2948. typedef boost::optional<ScaleRange> OptionalScaleRange;
  2949. diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
  2950. index 2cf8f69..67d69ff 100644
  2951. --- a/Projects/Carto/Carto/IViewport.h
  2952. +++ b/Projects/Carto/Carto/IViewport.h
  2953. @@ -98,9 +98,14 @@ public:
  2954. * Добавление проекта для его отображения в порте просмотра, Identify и т.д.
  2955. * При добавлении проектов с одинаковыми идентификаторами (ProjectId)
  2956. * или с раЕличными списками фаЕ кидается исключение.
  2957. - * \param project_view_data данные для добавления проекта в порт просмотра.
  2958. + * \param project проект.
  2959. + * \param view_settings настройки отображения для данного порта просмотра.
  2960. + * \param project_view_data стили для проекта, предварительно Еагруженные функцией 'prepare_project_styles_data'.
  2961. */
  2962. - virtual void add_prepared_project(ProjectViewDataConstPtr project_view_data) = 0;
  2963. + virtual void add_project(
  2964. + const IProjectPtr& project,
  2965. + const IViewSettingsPtr& view_settings,
  2966. + const StylesData& project_view_data) = 0;
  2967.  
  2968. /*!
  2969. * Подготовка данных для добавления проекта в порт просмотра. Можно Еапускать в отдельном потоке.
  2970. @@ -114,9 +119,7 @@ public:
  2971. * \param style_folder директория с условными Енаками.
  2972. * \param style_file_name Еагружаемый файл в директории с условными Енаками.
  2973. */
  2974. - virtual ProjectViewDataConstPtr prepare_project_view_data(
  2975. - const IProjectPtr & project,
  2976. - const IViewSettingsPtr &view_settings,
  2977. + virtual StylesDataConstPtr prepare_project_styles_data(
  2978. const UniFS::IDirPtr &style_folder,
  2979. const std::string &style_file_name,
  2980. const DataValidationErrorsFunction &data_validation_errors_function) const = 0;
  2981. diff --git a/Projects/Carto/Carto/Types.h b/Projects/Carto/Carto/Types.h
  2982. index c407a99..e4468b4 100644
  2983. --- a/Projects/Carto/Carto/Types.h
  2984. +++ b/Projects/Carto/Carto/Types.h
  2985. @@ -14,12 +14,12 @@
  2986. namespace Carto
  2987. {
  2988.  
  2989. -struct ProjectViewDataCustomDeleter
  2990. +struct StylesDataDeleter
  2991. {
  2992. - void operator()(const ProjectViewData *object) const;
  2993. + void operator()(const StylesData *object) const;
  2994. };
  2995.  
  2996. -typedef std::unique_ptr<const ProjectViewData, ProjectViewDataCustomDeleter> ProjectViewDataConstPtr;
  2997. +typedef std::unique_ptr<const StylesData, StylesDataDeleter> StylesDataConstPtr;
  2998.  
  2999. //! Цвет.
  3000. class Color
  3001. diff --git a/Projects/Carto/Carto/Viewport.h b/Projects/Carto/Carto/Viewport.h
  3002. index b9c4266..8f7a58e 100644
  3003. --- a/Projects/Carto/Carto/Viewport.h
  3004. +++ b/Projects/Carto/Carto/Viewport.h
  3005. @@ -61,10 +61,8 @@ public: // IViewport
  3006. const UniFS::IDirPtr &style_folder,
  3007. const std::string &style_file_name,
  3008. const DataValidationErrorsFunction &data_validation_errors_function) override;
  3009. - virtual void add_prepared_project(ProjectViewDataConstPtr project_view_data) override;
  3010. - virtual ProjectViewDataConstPtr prepare_project_view_data(
  3011. - const IProjectPtr & project,
  3012. - const IViewSettingsPtr &view_settings,
  3013. + virtual void add_project(const IProjectPtr & project, const IViewSettingsPtr &view_settings, const StylesData& project_view_data) override;
  3014. + virtual StylesDataConstPtr prepare_project_styles_data(
  3015. const UniFS::IDirPtr &style_folder,
  3016. const std::string &style_file_name,
  3017. const DataValidationErrorsFunction &data_validation_errors_function) const override;
  3018. diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
  3019. index 12c45d9..6117bfb 100644
  3020. --- a/Projects/Carto/src/Carto/Viewport.cpp
  3021. +++ b/Projects/Carto/src/Carto/Viewport.cpp
  3022. @@ -50,18 +50,14 @@ namespace Carto
  3023. {
  3024.  
  3025. // Данные для отображения проекта
  3026. -struct ProjectViewData final
  3027. +struct StylesData final
  3028. {
  3029. ViewportId viewport_id_;
  3030. - IProjectPtr project_;
  3031. - IViewSettingsPtr view_settings_;
  3032. ISymbolContainerPtr styles_;
  3033. UniFS::IDirPtr styles_folder_;
  3034. std::string styles_filename_;
  3035. ISurfaceManagerPtr surface_manager_;
  3036.  
  3037. - MapBox map_box_;
  3038. -
  3039. //! Флаг, который вЕводится для того, чтобы перевести состояние анимируемых объектов сцены
  3040. //! сраЕу в финальное состояние, например при смене стилей.
  3041. bool finish_animation_flag_ = false;
  3042. @@ -69,7 +65,7 @@ struct ProjectViewData final
  3043. DataValidationErrorsFunction data_validation_errors_function_;
  3044. };
  3045.  
  3046. -void ProjectViewDataCustomDeleter::operator()(const ProjectViewData * const object) const
  3047. +void StylesDataDeleter::operator()(const StylesData * const object) const
  3048. {
  3049. delete object;
  3050. }
  3051. @@ -319,10 +315,11 @@ public:
  3052. const UniFS::IDirPtr &style_folder,
  3053. const std::string &style_file_name,
  3054. const DataValidationErrorsFunction &data_validation_errors_function);
  3055. - void add_prepared_project(ProjectViewDataConstPtr project_view_data);
  3056. - ProjectViewDataConstPtr prepare_project_view_data(
  3057. - const IProjectPtr & project,
  3058. - const IViewSettingsPtr &view_settings,
  3059. + void add_project(
  3060. + const IProjectPtr& project,
  3061. + const IViewSettingsPtr& view_settings,
  3062. + const StylesData& project_view_data);
  3063. + StylesDataConstPtr prepare_project_styles_data(
  3064. const UniFS::IDirPtr &style_folder,
  3065. const std::string &style_file_name,
  3066. const DataValidationErrorsFunction &data_validation_errors_function) const;
  3067. @@ -474,6 +471,7 @@ private: // Types
  3068.  
  3069. struct LayerIdTag;
  3070. struct LayerNameTag;
  3071. +
  3072. typedef boost::multi_index_container<
  3073. LayerViewData,
  3074. boost::multi_index::indexed_by<
  3075. @@ -490,12 +488,33 @@ private: // Types
  3076. boost::multi_index::member<LayerViewData, const ProjectId, &LayerViewData::project_id>,
  3077. boost::multi_index::member<LayerViewData, const std::string, &LayerViewData::layer_name> > > > >
  3078. LayerViewContainer;
  3079. +
  3080. + struct ProjectWithView final
  3081. + {
  3082. + ProjectWithView(
  3083. + const IProjectPtr& in_project,
  3084. + const MapBox& in_project_bounding_box,
  3085. + const IViewSettingsPtr& in_view_settings,
  3086. + const StylesData& in_view)
  3087. + : project(in_project)
  3088. + , project_bounding_box(in_project_bounding_box)
  3089. + , view_settings(in_view_settings)
  3090. + , visual(in_view)
  3091. + {
  3092. + }
  3093. +
  3094. + IProjectPtr project;
  3095. + MapBox project_bounding_box;
  3096. + IViewSettingsPtr view_settings;
  3097. + StylesData visual;
  3098. + };
  3099. +
  3100. typedef LayerViewContainer::index<LayerIdTag>::type LayerIdIndex;
  3101. typedef LayerViewContainer::index<LayerNameTag>::type LayerNameIndex;
  3102.  
  3103. typedef boost::unordered_map<DrawingType, HeavyOperationSettings> DrawingTypeMap;
  3104.  
  3105. - typedef boost::unordered_map<ProjectId, ProjectViewData> ProjectViewMap;
  3106. + typedef boost::unordered_map<ProjectId, ProjectWithView> ProjectViewMap;
  3107. typedef boost::unordered_set<IViewportDeletionListenerPtr> IViewportDeletionListenerContainer;
  3108.  
  3109. private:
  3110. @@ -767,7 +786,7 @@ Viewport::Impl::~Impl()
  3111.  
  3112. for (const ProjectViewMap::value_type & project_view : project_views_)
  3113. {
  3114. - carto_->private_interface().remove_project(project_view.second.project_, parent_);
  3115. + carto_->private_interface().remove_project(project_view.second.project, parent_);
  3116. }
  3117. project_views_.clear();
  3118.  
  3119. @@ -797,45 +816,50 @@ void Viewport::Impl::add_project(
  3120. {
  3121. check_project_before_add(in_project, in_view_settings);
  3122.  
  3123. - add_prepared_project(prepare_project_view_data(
  3124. - in_project,
  3125. - in_view_settings,
  3126. + add_project(in_project, in_view_settings, *prepare_project_styles_data(
  3127. style_folder,
  3128. style_file_name,
  3129. - data_validation_errors_function));
  3130. + data_validation_errors_function).get());
  3131. }
  3132.  
  3133. -void Viewport::Impl::add_prepared_project(ProjectViewDataConstPtr in_project_view_data)
  3134. +void Viewport::Impl::add_project(
  3135. + const IProjectPtr& in_project,
  3136. + const IViewSettingsPtr& in_view_settings,
  3137. + const StylesData& in_project_view_data)
  3138. {
  3139. - const ProjectViewData &project_view_data = *in_project_view_data;
  3140. + UNI_ASSERT(in_project_view_data.viewport_id_ == id());
  3141.  
  3142. - UNI_ASSERT(project_view_data.viewport_id_ == id());
  3143. -
  3144. - check_project_before_add(project_view_data.project_, project_view_data.view_settings_);
  3145. + check_project_before_add(in_project, in_view_settings);
  3146.  
  3147. - project_views_.emplace(project_view_data.project_->id(), project_view_data);
  3148. + project_views_.emplace(
  3149. + in_project->id(),
  3150. + ProjectWithView
  3151. + {
  3152. + in_project,
  3153. + in_project->bounding_box(),
  3154. + in_view_settings,
  3155. + in_project_view_data
  3156. + });
  3157.  
  3158. std::string error_string
  3159. - = tme::checked_cast<tme::CSymbolContainer*>(project_view_data.styles_.get())->GetErrorString();
  3160. + = tme::checked_cast<tme::CSymbolContainer*>(in_project_view_data.styles_.get())->GetErrorString();
  3161.  
  3162. // Регистрируем проект в Carto и ЕагруЕчике
  3163. carto_->private_interface().add_project(
  3164. - project_view_data.project_,
  3165. + in_project,
  3166. parent_,
  3167. - project_view_data.view_settings_,
  3168. - project_view_data.styles_,
  3169. + in_view_settings,
  3170. + in_project_view_data.styles_,
  3171. models_visibility_type_,
  3172. - project_view_data.data_validation_errors_function_ ? &error_string : nullptr);
  3173. + in_project_view_data.data_validation_errors_function_ ? &error_string : nullptr);
  3174.  
  3175. - if (project_view_data.data_validation_errors_function_ && !error_string.empty())
  3176. + if (in_project_view_data.data_validation_errors_function_ && !error_string.empty())
  3177. {
  3178. - project_view_data.data_validation_errors_function_(error_string);
  3179. + in_project_view_data.data_validation_errors_function_(error_string);
  3180. }
  3181. }
  3182.  
  3183. -ProjectViewDataConstPtr Viewport::Impl::prepare_project_view_data(
  3184. - const IProjectPtr &in_project,
  3185. - const IViewSettingsPtr &in_view_settings,
  3186. +StylesDataConstPtr Viewport::Impl::prepare_project_styles_data(
  3187. const UniFS::IDirPtr &style_folder,
  3188. const std::string &style_file_name,
  3189. const DataValidationErrorsFunction &data_validation_errors_function) const
  3190. @@ -851,18 +875,15 @@ ProjectViewDataConstPtr Viewport::Impl::prepare_project_view_data(
  3191. style_file_name);
  3192.  
  3193. // Сохраняем информацию о проекте и его настройках отображения
  3194. - const auto project_view_data = new ProjectViewData;
  3195. + const auto project_view_data = new StylesData;
  3196. project_view_data->viewport_id_ = id();
  3197. - project_view_data->project_ = in_project;
  3198. - project_view_data->view_settings_ = in_view_settings;
  3199. project_view_data->styles_ = local_styles;
  3200. project_view_data->styles_folder_ = style_folder;
  3201. project_view_data->styles_filename_ = style_file_name;
  3202. project_view_data->surface_manager_ = project_view_surface_manager;
  3203. project_view_data->data_validation_errors_function_ = data_validation_errors_function;
  3204. - project_view_data->map_box_ = in_project->bounding_box();
  3205.  
  3206. - return ProjectViewDataConstPtr(project_view_data);
  3207. + return StylesDataConstPtr(project_view_data);
  3208. }
  3209.  
  3210. void Viewport::Impl::remove_project(const IProjectPtr &in_project)
  3211. @@ -891,18 +912,16 @@ DeviceType Viewport::Impl::device_type() const
  3212. return device_type_;
  3213. }
  3214.  
  3215. -ISymbolContainerPtr Viewport::Impl::styles(ProjectId project_id) const
  3216. +ISymbolContainerPtr Viewport::Impl::styles(const ProjectId project_id) const
  3217. {
  3218. ProjectViewMap::const_iterator project_iter = project_views_.find(project_id);
  3219. if (project_iter != project_views_.end())
  3220. {
  3221. - UNI_ASSERT(project_iter->second.styles_);
  3222. - return project_iter->second.styles_;
  3223. - }
  3224. - else
  3225. - {
  3226. - return ISymbolContainerPtr();
  3227. + UNI_ASSERT(project_iter->second.visual.styles_);
  3228. + return project_iter->second.visual.styles_;
  3229. }
  3230. +
  3231. + return{};
  3232. }
  3233.  
  3234. void Viewport::Impl::add_layer_view(
  3235. @@ -979,7 +998,7 @@ IProjectPtr Viewport::Impl::project(ProjectId in_id)
  3236. ProjectViewMap::iterator project_view_iter = project_views_.find(in_id);
  3237. UNI_ASSERT(project_view_iter != project_views_.end());
  3238.  
  3239. - return project_view_iter->second.project_;
  3240. + return project_view_iter->second.project;
  3241. }
  3242.  
  3243. IProjectPtrContainer Viewport::Impl::projects()
  3244. @@ -987,7 +1006,7 @@ IProjectPtrContainer Viewport::Impl::projects()
  3245. IProjectPtrContainer project_container;
  3246. for (const ProjectViewMap::value_type & item : project_views_)
  3247. {
  3248. - project_container.push_back(item.second.project_);
  3249. + project_container.push_back(item.second.project);
  3250. }
  3251.  
  3252. return project_container;
  3253. @@ -998,7 +1017,7 @@ IProjectConstPtrContainer Viewport::Impl::const_projects() const
  3254. IProjectConstPtrContainer project_container;
  3255. for (const ProjectViewMap::value_type & item : project_views_)
  3256. {
  3257. - project_container.push_back(item.second.project_);
  3258. + project_container.push_back(item.second.project);
  3259. }
  3260.  
  3261. return project_container;
  3262. @@ -1051,13 +1070,13 @@ IProjectPtrContainer Viewport::Impl::visible_projects() const
  3263. IProjectPtrContainer result;
  3264. for (const ProjectViewMap::value_type & item : project_views_)
  3265. {
  3266. - if (item.second.project_->scale_limits().contains(scale))
  3267. + if (item.second.project->scale_limits().contains(scale))
  3268. {
  3269. - const MapRect & project_rect = item.second.project_->bounding_box().rect();
  3270. + const MapRect & project_rect = item.second.project->bounding_box().rect();
  3271. IGeometryConstPtr project_geometry = create_polygon_geometry(project_rect);
  3272. if (screen_geometry->is_intersects(*project_geometry))
  3273. {
  3274. - result.push_back(item.second.project_);
  3275. + result.push_back(item.second.project);
  3276. }
  3277. }
  3278. }
  3279. @@ -1259,7 +1278,7 @@ MapBox Viewport::Impl::bounding_box_all_projects() const
  3280. global_map_box.set_invalid();
  3281. for (const ProjectViewMap::value_type & item : project_views_)
  3282. {
  3283. - global_map_box.expand(item.second.map_box_);
  3284. + global_map_box.expand(item.second.project_bounding_box);
  3285. }
  3286. return global_map_box;
  3287. }
  3288. @@ -1274,7 +1293,7 @@ MapBox Viewport::Impl::bounding_box_visible_projects() const
  3289. {
  3290. ProjectViewMap::const_iterator it = project_views_.find(item->id());
  3291. UNI_ASSERT(it != project_views_.end());
  3292. - global_map_box.expand(it->second.map_box_);
  3293. + global_map_box.expand(it->second.project_bounding_box);
  3294. }
  3295. return global_map_box;
  3296. }
  3297. @@ -1491,19 +1510,19 @@ void Viewport::Impl::set_view_settings(
  3298. ProjectViewMap::iterator project_iter = project_views_.find(project_id);
  3299. if (project_iter != project_views_.end())
  3300. {
  3301. - ProjectViewData & project_data = project_iter->second;
  3302. - project_data.project_->private_interface().remove_viewport(parent_);
  3303. + StylesData & project_data = project_iter->second.visual;
  3304. + project_iter->second.project->private_interface().remove_viewport(parent_);
  3305.  
  3306. std::string error_string;
  3307. - project_data.view_settings_ = in_view_settings;
  3308. + project_iter->second.view_settings = in_view_settings;
  3309. carto_->private_interface().set_viewport_view(
  3310. project_id,
  3311. id(),
  3312. - project_data.view_settings_,
  3313. + in_view_settings,
  3314. project_data.styles_,
  3315. project_data.data_validation_errors_function_ ? &error_string : nullptr);
  3316.  
  3317. - project_data.project_->private_interface().connect_viewport(parent_);
  3318. + project_iter->second.project->private_interface().connect_viewport(parent_);
  3319. project_data.finish_animation_flag_ = !play_switch_animation;
  3320. need_redraw_function_();
  3321. if (project_data.data_validation_errors_function_ && !error_string.empty())
  3322. @@ -1531,7 +1550,7 @@ void Viewport::Impl::set_styles(
  3323. ProjectViewMap::iterator project_iter = project_views_.find(project_id);
  3324. if (project_iter != project_views_.end())
  3325. {
  3326. - ProjectViewData & project_view = project_iter->second;
  3327. + StylesData & project_view = project_iter->second.visual;
  3328.  
  3329. UNI_ASSERT(project_view.styles_);
  3330.  
  3331. @@ -1578,8 +1597,8 @@ IViewSettingsPtr Viewport::Impl::view_settings(ProjectId project_id) const
  3332. ProjectViewMap::const_iterator project_iter = project_views_.find(project_id);
  3333. if (project_iter != project_views_.end())
  3334. {
  3335. - UNI_ASSERT(project_iter->second.view_settings_);
  3336. - return project_iter->second.view_settings_;
  3337. + UNI_ASSERT(project_iter->second.view_settings);
  3338. + return project_iter->second.view_settings;
  3339. }
  3340. else
  3341. {
  3342. @@ -1618,10 +1637,10 @@ void Viewport::Impl::external_render_context_lost()
  3343. for (ProjectViewMap::value_type &project_view_pair : project_views_)
  3344. {
  3345. // удалим ссылку на условные Енаки
  3346. - project_view_pair.second.styles_.reset();
  3347. + project_view_pair.second.visual.styles_.reset();
  3348. // удалим иЕ кэша картинок некорректные картинки
  3349. - project_view_pair.second.surface_manager_->purge_uploaded_surfaces();
  3350. - carto_->private_interface().remove_project(project_view_pair.second.project_, parent_);
  3351. + project_view_pair.second.visual.surface_manager_->purge_uploaded_surfaces();
  3352. + carto_->private_interface().remove_project(project_view_pair.second.project, parent_);
  3353. }
  3354. // удалим последние ссылки на ресурсы отрисовки
  3355. view_->getRenderTree().clearChilds();
  3356. @@ -1645,7 +1664,7 @@ void Viewport::Impl::external_render_context_recreated()
  3357. #endif // TM_USE_EXTERNAL_RENDER
  3358. for (ProjectViewMap::value_type &project_view_pair : project_views_)
  3359. {
  3360. - ProjectViewData & project_view = project_view_pair.second;
  3361. + StylesData & project_view = project_view_pair.second.visual;
  3362.  
  3363. // соЕдадим условные Енаки
  3364. std::string error_string;
  3365. @@ -1662,9 +1681,9 @@ void Viewport::Impl::external_render_context_recreated()
  3366. }
  3367.  
  3368. carto_->private_interface().add_project(
  3369. - project_view.project_,
  3370. + project_view_pair.second.project,
  3371. parent_,
  3372. - project_view.view_settings_,
  3373. + project_view_pair.second.view_settings,
  3374. project_view.styles_,
  3375. models_visibility_type_,
  3376. nullptr);
  3377. @@ -1712,7 +1731,7 @@ bool Viewport::Impl::check_plan_valid(const IndoorPlan & plan) const
  3378. if (project_views_.end() != it)
  3379. {
  3380. const std::vector<PlanInternalID> plans
  3381. - = it->second.project_->indoor_data().plans_for_object(plan.object_id);
  3382. + = it->second.project->indoor_data().plans_for_object(plan.object_id);
  3383. // Проверка, что в Едании есть такой этаж.
  3384. UNI_ASSERT(plans.end() != boost::find(plans, plan.plan_id));
  3385. return plans.end() != boost::find(plans, plan.plan_id);
  3386. @@ -1898,11 +1917,11 @@ bool Viewport::Impl::animate_projects(tme::tmrender::AnimationContext & context)
  3387. context.scene_animation_mode = tme::tmrender::SceneAnimationMode::Instant;
  3388. break;
  3389. }
  3390. - if (item.second.finish_animation_flag_)
  3391. + if (item.second.visual.finish_animation_flag_)
  3392. {
  3393. // Переводим аниматоры сраЕу в конечное состояние.
  3394. context.scene_animation_mode = tme::tmrender::SceneAnimationMode::Instant;
  3395. - item.second.finish_animation_flag_ = false;
  3396. + item.second.visual.finish_animation_flag_ = false;
  3397. }
  3398.  
  3399. is_redraw_needed = city_view->animate(context) || is_redraw_needed;
  3400. @@ -2130,7 +2149,7 @@ void Viewport::Impl::check_project_before_add(const IProjectPtr & in_project, co
  3401. // Проверка того, что список фаЕ добавляемого проекта полностью и в том же порядке
  3402. // входит в списк фаЕ уже добавленных проектов.
  3403. if (!project_views_.empty()
  3404. - && !check_valid_list_of_phases(project_views_.begin()->second.view_settings_, in_view_settings))
  3405. + && !check_valid_list_of_phases(project_views_.begin()->second.view_settings, in_view_settings))
  3406. {
  3407. TM_THROW_AND_LOG(ListsOfPhasesDifferException("Lists of phases differ"));
  3408. }
  3409. @@ -2193,21 +2212,20 @@ void Viewport::add_project(
  3410. data_validation_errors_function);
  3411. }
  3412.  
  3413. -void Viewport::add_prepared_project(ProjectViewDataConstPtr project_view_data)
  3414. +void Viewport::add_project(
  3415. + const IProjectPtr& project,
  3416. + const IViewSettingsPtr& in_view_settings,
  3417. + const StylesData& project_view_data)
  3418. {
  3419. - impl_->add_prepared_project(std::move(project_view_data));
  3420. + impl_->add_project(project, in_view_settings, project_view_data);
  3421. }
  3422.  
  3423. -ProjectViewDataConstPtr Viewport::prepare_project_view_data(
  3424. - const IProjectPtr & in_project,
  3425. - const IViewSettingsPtr &in_view_settings,
  3426. +StylesDataConstPtr Viewport::prepare_project_styles_data(
  3427. const UniFS::IDirPtr &style_folder,
  3428. const std::string &style_file_name,
  3429. const DataValidationErrorsFunction &data_validation_errors_function) const
  3430. {
  3431. - return impl_->prepare_project_view_data(
  3432. - in_project,
  3433. - in_view_settings,
  3434. + return impl_->prepare_project_styles_data(
  3435. style_folder,
  3436. style_file_name,
  3437. data_validation_errors_function);
  3438. --
  3439. 1.9.5.msysgit.1
  3440.  
  3441. From c6b9f05f8b44a083b8af9fee08569c09a4308597 Mon Sep 17 00:00:00 2001
  3442. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  3443. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  3444. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  3445. Date: Thu, 2 Jul 2015 16:01:55 +0600
  3446. Subject: [PATCH 16/24] =?UTF-8?q?[LMAP-1399]=20=D0=A2=D0=B5=D1=81=D1=82=20?=
  3447. =?UTF-8?q?=D0=B2=20CartoQtTestApp=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB?=
  3448. =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?=
  3449. =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20?=
  3450. =?UTF-8?q?=D0=B8=20=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9.?=
  3451. MIME-Version: 1.0
  3452. Content-Type: text/plain; charset=UTF-8
  3453. Content-Transfer-Encoding: 8bit
  3454.  
  3455. ---
  3456. Projects/CartoQtTestAppLib/CartoWidget.hqt | 4 +
  3457. Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 100 ++++++++++++++++++++--
  3458. Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 85 ++++++++++++++++++
  3459. Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt | 9 ++
  3460. 4 files changed, 191 insertions(+), 7 deletions(-)
  3461.  
  3462. diff --git a/Projects/CartoQtTestAppLib/CartoWidget.hqt b/Projects/CartoQtTestAppLib/CartoWidget.hqt
  3463. index 1ed5f00..f8cee4c 100644
  3464. --- a/Projects/CartoQtTestAppLib/CartoWidget.hqt
  3465. +++ b/Projects/CartoQtTestAppLib/CartoWidget.hqt
  3466. @@ -136,6 +136,8 @@ public:
  3467.  
  3468. public slots:
  3469. void showError(const QString &error_message);
  3470. + void loadGlobalStyles(const QString & file_name);
  3471. + ProjectId openProjectWithGlobalSyle(const QString & file_name);
  3472. ProjectId addProject(const QString & file_name);
  3473. ProjectId addProject(
  3474. const QString & map_path,
  3475. @@ -365,6 +367,8 @@ private:
  3476. boost::unordered_map<ProjectId, ProjectParameters> projects_;
  3477. ActivityContainer viewport_activities_;
  3478.  
  3479. + StylesDataConstPtr cached_styles_;
  3480. +
  3481. ICartoPtr carto_;
  3482. std::shared_ptr<RenderTimeScaled> render_time_;
  3483.  
  3484. diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  3485. index 2ff6841..7617914 100644
  3486. --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  3487. +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  3488. @@ -88,6 +88,19 @@ const int g_depth_buffer_size = 24;
  3489.  
  3490. ProjectId g_project_id_for_project_without_project_info(g_empty_project_id);
  3491.  
  3492. +QString project_info_path(const QString& file_name)
  3493. +{
  3494. + QFileInfo file_info(file_name);
  3495. + QString info_path = file_info.absolutePath() + "/" + file_info.completeBaseName() + ".xml";
  3496. +
  3497. + if (!QFile::exists(info_path))
  3498. + {
  3499. + return file_name;
  3500. + }
  3501. +
  3502. + return info_path;
  3503. +};
  3504. +
  3505. UniFS::IDirPtr getModelSource(
  3506. const QString &path,
  3507. const IStableIdConverterConstPtr & stable_id_converter,
  3508. @@ -804,18 +817,91 @@ void CartoWidget::showError(const QString &error_message)
  3509. msgBox.exec();
  3510. }
  3511.  
  3512. -ProjectId CartoWidget::addProject(const QString & file_name)
  3513. +ProjectId CartoWidget::openProjectWithGlobalSyle(const QString & file_name)
  3514. {
  3515. - UNI_ASSERT(!file_name.isEmpty());
  3516. + UNI_ASSERT(false == file_name.isEmpty());
  3517. + UNI_ASSERT(nullptr != cached_styles_);
  3518.  
  3519. - QFileInfo file_info(file_name);
  3520. - QString proj_info_path = file_info.absolutePath() + "/" + file_info.completeBaseName() + ".xml";
  3521. - if (!QFile::exists(proj_info_path))
  3522. + ProjectParameters project_parameters;
  3523. + project_parameters.map_path = file_name;
  3524. + project_parameters.map_version_path = file_name;
  3525. + project_parameters.project_info_path = project_info_path(file_name);
  3526. + project_parameters.view_settings_path = file_name;
  3527. + project_parameters.styles_path = file_name;
  3528. + project_parameters.styles_folder = get_style_folder(file_name.toUtf8().constData());
  3529. + project_parameters.style_file_name = g_style_default;
  3530. + project_parameters.models_path = file_name;
  3531. + project_parameters.stable_id_source_path = file_name;
  3532. +
  3533. + createProject(project_parameters);
  3534. +
  3535. + const auto project = project_parameters.project_ptr;
  3536. +
  3537. + if (nullptr == project)
  3538. + {
  3539. + return ProjectId { 0 };
  3540. + }
  3541. +
  3542. + try
  3543. + {
  3544. + const ProjectId project_id = project->id();
  3545. + UNI_ASSERT(projects_.find(project_id) == projects_.end());
  3546. +
  3547. + const auto view_settings_block = get_view_settings_block(file_name.toUtf8().constData());
  3548. + UNI_ASSERT(view_settings_block);
  3549. +
  3550. + const IViewSettingsPtr view_settings = std::make_shared<ViewSettings>(project, view_settings_block);
  3551. + UNI_ASSERT(view_settings);
  3552. +
  3553. + viewport().add_project(project, view_settings, *cached_styles_.get());
  3554. +
  3555. + projects_[project_id] = project_parameters;
  3556. +
  3557. + emit projectOpened(project_id);
  3558. + if (project_parameters.stable_ids_converter)
  3559. + {
  3560. + emit stableIdSourceOpened(project_id);
  3561. + }
  3562. +
  3563. + return project_id;
  3564. + }
  3565. + catch (const std::exception& e)
  3566. {
  3567. - proj_info_path = file_name;
  3568. + const QString exception_message = e.what();
  3569. + QMessageBox::critical(nullptr, QObject::tr("Error adding project"), exception_message);
  3570. }
  3571.  
  3572. - return addProject(file_name, file_name, proj_info_path, file_name, file_name, file_name, file_name);
  3573. + return ProjectId { 0 };
  3574. +}
  3575. +
  3576. +void CartoWidget::loadGlobalStyles(const QString & file_name)
  3577. +{
  3578. + UNI_ASSERT(false == file_name.isEmpty());
  3579. +
  3580. + if (nullptr == currentCartoWidget())
  3581. + {
  3582. + createWidget();
  3583. + }
  3584. +
  3585. + const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
  3586. + const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
  3587. +
  3588. + try
  3589. + {
  3590. + auto styles = viewport().prepare_project_styles_data(styles_folder, g_style_default, on_unknown_symbol);
  3591. + cached_styles_ = std::move(styles);
  3592. + }
  3593. + catch (const std::exception& e)
  3594. + {
  3595. + const QString exception_message = e.what();
  3596. + QMessageBox::critical(nullptr, QObject::tr("Error"), exception_message);
  3597. + }
  3598. +}
  3599. +
  3600. +ProjectId CartoWidget::addProject(const QString & file_name)
  3601. +{
  3602. + UNI_ASSERT(!file_name.isEmpty());
  3603. + return addProject(file_name, file_name, project_info_path(file_name), file_name, file_name, file_name, file_name);
  3604. }
  3605.  
  3606. ProjectId CartoWidget::addProject(
  3607. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  3608. index e65b703..f5a64df 100644
  3609. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  3610. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  3611. @@ -1374,6 +1374,24 @@ std::vector<IDynamicObjectPtr> create_animated_raster_test_objects(const PlanePo
  3612. return { std::make_shared<DirectionalDynamicObject>(ObjectId(1), center_point, 45.0f) };
  3613. }
  3614.  
  3615. +
  3616. +QString open_2gis_container(QMainWindow* const window)
  3617. +{
  3618. + return QFileDialog::getOpenFileName(
  3619. + window,
  3620. + QObject::tr("Select 2GIS container"),
  3621. + QDir::current().absolutePath(),
  3622. + QObject::tr("2GIS data file (*.2gis)"));
  3623. +}
  3624. +
  3625. +QString open_map3d_directory(QMainWindow* const window)
  3626. +{
  3627. + return QFileDialog::getExistingDirectory(
  3628. + window,
  3629. + QObject::tr("Open 2GIS map3d directory"),
  3630. + QDir::current().absolutePath());
  3631. +}
  3632. +
  3633. } // namespace
  3634.  
  3635. MainWindowImpl::MainWindowImpl(QMainWindow *in_parent)
  3636. @@ -2235,6 +2253,60 @@ void MainWindowImpl::onActiveAreaChanged(const ScreenMargin & active_area)
  3637. center_point_position_));
  3638. }
  3639.  
  3640. +void MainWindowImpl::onLoadGlobalStyles2gisTriggered()
  3641. +{
  3642. + QString file_name = open_2gis_container(parent_);
  3643. +
  3644. + if (false == file_name.isEmpty())
  3645. + {
  3646. + carto_widget_->loadGlobalStyles(file_name);
  3647. + open_project_with_global_styles_from_folder_menu_->setEnabled(true);
  3648. + open_project_with_global_styles_from_2gis_menu_->setEnabled(true);
  3649. + }
  3650. +}
  3651. +
  3652. +void MainWindowImpl::onLoadGlobalStylesMap3dTriggered()
  3653. +{
  3654. + QString directory_name = open_map3d_directory(parent_);
  3655. +
  3656. + if (false == directory_name.isEmpty())
  3657. + {
  3658. + carto_widget_->loadGlobalStyles(directory_name);
  3659. + open_project_with_global_styles_from_folder_menu_->setEnabled(true);
  3660. + open_project_with_global_styles_from_2gis_menu_->setEnabled(true);
  3661. + }
  3662. +}
  3663. +
  3664. +void MainWindowImpl::onOpenGlobalStylesProject2gisTriggered()
  3665. +{
  3666. + QString file_name = open_2gis_container(parent_);
  3667. +
  3668. + if (false == file_name.isEmpty())
  3669. + {
  3670. + if (false == carto_widget_->projects().isEmpty())
  3671. + {
  3672. + carto_widget_->closeProjects();
  3673. + }
  3674. +
  3675. + carto_widget_->openProjectWithGlobalSyle(file_name);
  3676. + }
  3677. +}
  3678. +
  3679. +void MainWindowImpl::onOpenGlobalStylesProjectMap3dTriggered()
  3680. +{
  3681. + QString directory_name = open_map3d_directory(parent_);
  3682. +
  3683. + if (false == directory_name.isEmpty())
  3684. + {
  3685. + if (false == carto_widget_->projects().isEmpty())
  3686. + {
  3687. + carto_widget_->closeProjects();
  3688. + }
  3689. +
  3690. + carto_widget_->openProjectWithGlobalSyle(directory_name);
  3691. + }
  3692. +}
  3693. +
  3694. void MainWindowImpl::onOpenProjects2gisTriggered()
  3695. {
  3696. QStringList file_names = QFileDialog::getOpenFileNames(
  3697. @@ -4206,6 +4278,19 @@ void MainWindowImpl::createFileMenu()
  3698. add_project->addAction(tr("2&gis file"), this, SLOT(onAddProject2gisTriggered()), tr("Ctrl+O"));
  3699. add_project->addAction(tr("&map3d directory"), this, SLOT(onAddProjectMap3dTriggered()));
  3700.  
  3701. + QMenu * global_styles_menu = file->addMenu(tr("&Global styles"));
  3702. + global_styles_menu->addAction(tr("Load global styles from 2gis file"), this, SLOT(onLoadGlobalStyles2gisTriggered()));
  3703. + global_styles_menu->addAction(tr("Load global styles from map3d directory"), this, SLOT(onLoadGlobalStylesMap3dTriggered()));
  3704. +
  3705. + open_project_with_global_styles_from_2gis_menu_ =
  3706. + global_styles_menu->addAction(tr("Load project from 2gis file"), this, SLOT(onOpenGlobalStylesProject2gisTriggered()));;
  3707. +
  3708. + open_project_with_global_styles_from_folder_menu_ =
  3709. + global_styles_menu->addAction(tr("Load project from map3d directory"), this, SLOT(onOpenGlobalStylesProjectMap3dTriggered()));
  3710. +
  3711. + open_project_with_global_styles_from_folder_menu_->setEnabled(false);
  3712. + open_project_with_global_styles_from_2gis_menu_->setEnabled(false);
  3713. +
  3714. close_project_menu_ = file->addMenu(tr("&Close project"));
  3715. connect(close_project_menu_, SIGNAL(aboutToShow()), this, SLOT(onCloseProjectMenuShow()));
  3716. close_project_menu_->addAction(tr("&All"), carto_widget_, SLOT(closeProjects()), tr("Ctrl+W"));
  3717. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  3718. index c603dab..077c20c 100644
  3719. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  3720. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  3721. @@ -134,6 +134,11 @@ private slots:
  3722. void onLoadProjectsStateTriggered();
  3723. void onSaveProjectsStateTriggered();
  3724.  
  3725. + void onLoadGlobalStyles2gisTriggered();
  3726. + void onLoadGlobalStylesMap3dTriggered();
  3727. + void onOpenGlobalStylesProject2gisTriggered();
  3728. + void onOpenGlobalStylesProjectMap3dTriggered();
  3729. +
  3730. void onCopyMapPositionTriggered();
  3731. void onCopyGeoPositionTriggered();
  3732.  
  3733. @@ -347,6 +352,10 @@ private:
  3734. QMenu * open_models_dir_menu_;
  3735. QMenu * close_models_menu_;
  3736. QMenu * save_models_menu_;
  3737. +
  3738. + QAction * open_project_with_global_styles_from_2gis_menu_;
  3739. + QAction * open_project_with_global_styles_from_folder_menu_;
  3740. +
  3741. QAction * load_viewport_state_action_;
  3742. QAction * save_viewport_state_action_;
  3743. QAction * load_projects_state_action_;
  3744. --
  3745. 1.9.5.msysgit.1
  3746.  
  3747. From c67dc928e7129a20cd05cd8ce778944747ac81c4 Mon Sep 17 00:00:00 2001
  3748. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  3749. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  3750. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  3751. Date: Thu, 2 Jul 2015 19:01:17 +0600
  3752. Subject: [PATCH 17/24] =?UTF-8?q?[LMAP-1399]=20=D0=98=D1=81=D0=BF=D1=80?=
  3753. =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B5=D0=B4?=
  3754. =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B5=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20?=
  3755. =?UTF-8?q?GCC:=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5?=
  3756. =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5?=
  3757. =?UTF-8?q?=20=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5=20=D0=BD=D0=B5=20=D1=81=D0=BA?=
  3758. =?UTF-8?q?=D1=80=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=20=D1=87=D0=BB=D0=B5=D0=BD?=
  3759. =?UTF-8?q?=D1=8B=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B0.?=
  3760. MIME-Version: 1.0
  3761. Content-Type: text/plain; charset=UTF-8
  3762. Content-Transfer-Encoding: 8bit
  3763.  
  3764. ---
  3765. Projects/Carto/src/Carto/Viewport.cpp | 4 ++--
  3766. Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 29 +++++++++++++-------------
  3767. 2 files changed, 16 insertions(+), 17 deletions(-)
  3768.  
  3769. diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
  3770. index 6117bfb..8769fa2 100644
  3771. --- a/Projects/Carto/src/Carto/Viewport.cpp
  3772. +++ b/Projects/Carto/src/Carto/Viewport.cpp
  3773. @@ -2213,11 +2213,11 @@ void Viewport::add_project(
  3774. }
  3775.  
  3776. void Viewport::add_project(
  3777. - const IProjectPtr& project,
  3778. + const IProjectPtr& in_project,
  3779. const IViewSettingsPtr& in_view_settings,
  3780. const StylesData& project_view_data)
  3781. {
  3782. - impl_->add_project(project, in_view_settings, project_view_data);
  3783. + impl_->add_project(in_project, in_view_settings, project_view_data);
  3784. }
  3785.  
  3786. StylesDataConstPtr Viewport::prepare_project_styles_data(
  3787. diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  3788. index 7617914..503c94b 100644
  3789. --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  3790. +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  3791. @@ -99,7 +99,7 @@ QString project_info_path(const QString& file_name)
  3792. }
  3793.  
  3794. return info_path;
  3795. -};
  3796. +}
  3797.  
  3798. UniFS::IDirPtr getModelSource(
  3799. const QString &path,
  3800. @@ -835,25 +835,25 @@ ProjectId CartoWidget::openProjectWithGlobalSyle(const QString & file_name)
  3801.  
  3802. createProject(project_parameters);
  3803.  
  3804. - const auto project = project_parameters.project_ptr;
  3805. + const auto project_to_be_opened = project_parameters.project_ptr;
  3806.  
  3807. - if (nullptr == project)
  3808. + if (nullptr == project_to_be_opened)
  3809. {
  3810. return ProjectId { 0 };
  3811. }
  3812.  
  3813. try
  3814. {
  3815. - const ProjectId project_id = project->id();
  3816. + const ProjectId project_id = project_to_be_opened->id();
  3817. UNI_ASSERT(projects_.find(project_id) == projects_.end());
  3818.  
  3819. const auto view_settings_block = get_view_settings_block(file_name.toUtf8().constData());
  3820. UNI_ASSERT(view_settings_block);
  3821.  
  3822. - const IViewSettingsPtr view_settings = std::make_shared<ViewSettings>(project, view_settings_block);
  3823. + const auto view_settings = std::make_shared<ViewSettings>(project_to_be_opened, view_settings_block);
  3824. UNI_ASSERT(view_settings);
  3825.  
  3826. - viewport().add_project(project, view_settings, *cached_styles_.get());
  3827. + viewport().add_project(project_to_be_opened, view_settings, *cached_styles_.get());
  3828.  
  3829. projects_[project_id] = project_parameters;
  3830.  
  3831. @@ -878,18 +878,17 @@ void CartoWidget::loadGlobalStyles(const QString & file_name)
  3832. {
  3833. UNI_ASSERT(false == file_name.isEmpty());
  3834.  
  3835. - if (nullptr == currentCartoWidget())
  3836. + try
  3837. {
  3838. - createWidget();
  3839. - }
  3840. + if (nullptr == currentCartoWidget())
  3841. + {
  3842. + createWidget();
  3843. + }
  3844.  
  3845. - const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
  3846. - const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
  3847. + const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
  3848. + const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
  3849.  
  3850. - try
  3851. - {
  3852. - auto styles = viewport().prepare_project_styles_data(styles_folder, g_style_default, on_unknown_symbol);
  3853. - cached_styles_ = std::move(styles);
  3854. + cached_styles_ = viewport().prepare_project_styles_data(styles_folder, g_style_default, on_unknown_symbol);
  3855. }
  3856. catch (const std::exception& e)
  3857. {
  3858. --
  3859. 1.9.5.msysgit.1
  3860.  
  3861. From 4eab0cbb510cf20189fa52745ea740c1b4982bc3 Mon Sep 17 00:00:00 2001
  3862. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  3863. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  3864. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  3865. Date: Wed, 8 Jul 2015 18:30:19 +0600
  3866. Subject: [PATCH 18/24] =?UTF-8?q?[LMAP-1399]=20=D0=9C=D0=B5=D1=82=D0=BE?=
  3867. =?UTF-8?q?=D0=B4=20'clone'=20=D1=83=20CSurfaceManager=20=D1=82=D0=B5?=
  3868. =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20thread=20safe=20(=D1=81=20=D1=82?=
  3869. =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20=D0=B4=D0=BE?=
  3870. =?UTF-8?q?=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?=
  3871. =?UTF-8?q?=D0=B8=D0=B9=20=D0=BD=D0=B8=D0=B6=D0=B5=20=D0=BF=D0=BE=20call?=
  3872. =?UTF-8?q?=20stack).?=
  3873. MIME-Version: 1.0
  3874. Content-Type: text/plain; charset=UTF-8
  3875. Content-Transfer-Encoding: 8bit
  3876.  
  3877. ---
  3878. Projects/AndroidTestApp/jni/SDLCartoWindow.cpp | 8 ++-
  3879. Projects/Benchmark/src/Benchmark.cpp | 8 ++-
  3880. Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp | 8 ++-
  3881. Projects/MakeBinaryModels/src/MakeBinaryModels.cpp | 8 ++-
  3882. Projects/tmRender/CSurfaceManager.h | 27 ++++-----
  3883. Projects/tmRender/ISurfaceManager.h | 3 -
  3884. Projects/tmRender/src/CSurfaceManager.cpp | 69 ++++++----------------
  3885. 7 files changed, 51 insertions(+), 80 deletions(-)
  3886.  
  3887. diff --git a/Projects/AndroidTestApp/jni/SDLCartoWindow.cpp b/Projects/AndroidTestApp/jni/SDLCartoWindow.cpp
  3888. index 8627435..5a2609a 100644
  3889. --- a/Projects/AndroidTestApp/jni/SDLCartoWindow.cpp
  3890. +++ b/Projects/AndroidTestApp/jni/SDLCartoWindow.cpp
  3891. @@ -80,9 +80,11 @@ SDLCartoWindow::SDLCartoWindow(
  3892. throw std::runtime_error("Couldn't create OpenGL context: " + std::string(SDL_GetError()));
  3893. }
  3894.  
  3895. - surface_manager_ = std::make_shared<tme::tmrender::CSurfaceManager>();
  3896. - surface_manager_->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderTGA());
  3897. - surface_manager_->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderPNG());
  3898. + surface_manager_ = std::make_shared<tme::tmrender::CSurfaceManager>(
  3899. + nullptr,
  3900. + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
  3901. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
  3902. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
  3903.  
  3904. viewport_.reset(new Viewport(
  3905. carto_,
  3906. diff --git a/Projects/Benchmark/src/Benchmark.cpp b/Projects/Benchmark/src/Benchmark.cpp
  3907. index 54bca2f..9b716fd 100644
  3908. --- a/Projects/Benchmark/src/Benchmark.cpp
  3909. +++ b/Projects/Benchmark/src/Benchmark.cpp
  3910. @@ -369,9 +369,11 @@ Result Benchmark::run(const Configuration &configuration)
  3911. carto = std::make_shared<Carto::Carto>(system);
  3912. }
  3913.  
  3914. - Carto::ISurfaceManagerPtr surface_manager(new tme::tmrender::CSurfaceManager());
  3915. - surface_manager->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderTGA());
  3916. - surface_manager->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderPNG());
  3917. + const auto surface_manager = std::make_shared<tme::tmrender::CSurfaceManager>(
  3918. + nullptr,
  3919. + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
  3920. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
  3921. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
  3922.  
  3923. const UniFS::IOpenedFilePtr map_file = Carto::get_map_block(location.getMapPath());
  3924. if (!map_file)
  3925. diff --git a/Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp b/Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp
  3926. index f51bee7..bcb824f 100644
  3927. --- a/Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp
  3928. +++ b/Projects/CartoQtTestAppLib/src/CartoWidgetImpl.cpp
  3929. @@ -57,9 +57,11 @@ CartoWidgetImpl::CartoWidgetImpl(
  3930. #endif
  3931. UNI_ASSERT(render || present_function);
  3932.  
  3933. - surface_manager_ = std::make_shared<tme::tmrender::CSurfaceManager>();
  3934. - surface_manager_->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderTGA());
  3935. - surface_manager_->addSurfaceLoader(new QtSurfaceLoader());
  3936. + surface_manager_ = std::make_shared<tme::tmrender::CSurfaceManager>(
  3937. + nullptr,
  3938. + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
  3939. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
  3940. + tme::tmrender::CSurfaceManager::Loader(new QtSurfaceLoader())});
  3941.  
  3942. viewport_.reset(new Viewport(
  3943. carto_,
  3944. diff --git a/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp b/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
  3945. index 7ce7a3d..13cfa88 100644
  3946. --- a/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
  3947. +++ b/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
  3948. @@ -185,9 +185,11 @@ int main(const int argc, char ** const argv)
  3949. const std::string input_folder_utf8 = params["input"].as<std::string>();
  3950. const std::string output_folder_utf8 = params["output"].as<std::string>();
  3951.  
  3952. - std::shared_ptr<tme::tmrender::ISurfaceManager> surface_manager(new tme::tmrender::CSurfaceManager());
  3953. - surface_manager->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderTGA());
  3954. - surface_manager->addSurfaceLoader(new SurfaceLoader::CSurfaceLoaderPNG());
  3955. + const auto surface_manager = std::make_shared<tme::tmrender::CSurfaceManager>(
  3956. + nullptr,
  3957. + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
  3958. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
  3959. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
  3960.  
  3961. const auto input_folder_ptr = ::UniFS_StdFS::CreateDir(input_folder_utf8, "/");
  3962. const auto output_folder_ptr = std::make_shared<FolderImpl>(UTF_Utils::UTF8ToWString(output_folder_utf8));
  3963. diff --git a/Projects/tmRender/CSurfaceManager.h b/Projects/tmRender/CSurfaceManager.h
  3964. index 3b7f643..9427c4b 100644
  3965. --- a/Projects/tmRender/CSurfaceManager.h
  3966. +++ b/Projects/tmRender/CSurfaceManager.h
  3967. @@ -1,6 +1,8 @@
  3968. #pragma once
  3969.  
  3970. -#include <list>
  3971. +#include <vector>
  3972. +#include <initializer_list>
  3973. +
  3974. #include <tmRender/ISurfaceManager.h>
  3975.  
  3976. namespace tme
  3977. @@ -8,21 +10,19 @@ namespace tme
  3978. namespace tmrender
  3979. {
  3980.  
  3981. -class CSurfaceManager : public ISurfaceManager
  3982. +class CSurfaceManager final : public ISurfaceManager
  3983. {
  3984. public:
  3985. - CSurfaceManager();
  3986. - explicit CSurfaceManager(const UniFS::IDirPtr &fs);
  3987. + using Loader = boost::intrusive_ptr<ISurfaceLoader>;
  3988. +
  3989. + CSurfaceManager(const UniFS::IDirPtr &fs, std::initializer_list<Loader> loaders);
  3990. virtual ~CSurfaceManager();
  3991.  
  3992. public:
  3993. virtual const UniFS::IDirPtr & getFileSystem() override { return FileSystem; }
  3994. - virtual void setFileSystem(const UniFS::IDirPtr &new_file_system) override;
  3995. virtual std::unique_ptr<ISurfaceManager> clone(bool enable_cache) const override;
  3996. virtual std::unique_ptr<ISurfaceManager> clone(const UniFS::IDirPtr &fs, bool enable_cache) const override;
  3997.  
  3998. - virtual void addSurfaceLoader(ISurfaceLoader * loader) override;
  3999. -
  4000. virtual void purge_uploaded_surfaces() override;
  4001.  
  4002. public:
  4003. @@ -30,17 +30,16 @@ public:
  4004. virtual ISurface * load(const UniFS::IFilePtr &file, ESurfaceFormat format) override;
  4005.  
  4006. private:
  4007. - explicit CSurfaceManager(const CSurfaceManager * other, bool enable_cache);
  4008. - CSurfaceManager(const CSurfaceManager * other, const UniFS::IDirPtr &fs, bool enable_cache);
  4009. -
  4010. - ISurfaceLoader * find_surface_loader(const std::string & file_name) const;
  4011. + typedef std::vector<Loader> TLoadersList;
  4012.  
  4013. private:
  4014. - typedef std::list<boost::intrusive_ptr<ISurfaceLoader> > TLoadersList;
  4015. + CSurfaceManager(const CSurfaceManager& other, const UniFS::IDirPtr &fs, bool enable_cache);
  4016. +
  4017. + ISurfaceLoader * find_surface_loader(const std::string & file_name) const;
  4018.  
  4019. private:
  4020. - UniFS::IDirPtr FileSystem;
  4021. - TLoadersList Loaders;
  4022. + const UniFS::IDirPtr FileSystem;
  4023. + const TLoadersList Loaders;
  4024. boost::intrusive_ptr<ISurfaceCache> Cache;
  4025. };
  4026.  
  4027. diff --git a/Projects/tmRender/ISurfaceManager.h b/Projects/tmRender/ISurfaceManager.h
  4028. index b1c8d3c..1b69489 100644
  4029. --- a/Projects/tmRender/ISurfaceManager.h
  4030. +++ b/Projects/tmRender/ISurfaceManager.h
  4031. @@ -16,12 +16,9 @@ struct ISurfaceManager : private boost::noncopyable
  4032. virtual ~ISurfaceManager() = default;
  4033.  
  4034. virtual const ::UniFS::IDirPtr &getFileSystem() = 0;
  4035. - virtual void setFileSystem(const ::UniFS::IDirPtr &new_file_system) = 0;
  4036. virtual std::unique_ptr<ISurfaceManager> clone(bool enable_cache) const = 0;
  4037. virtual std::unique_ptr<ISurfaceManager> clone(const ::UniFS::IDirPtr &fs, bool enable_cache) const = 0;
  4038.  
  4039. - virtual void addSurfaceLoader(ISurfaceLoader * loader) = 0;
  4040. -
  4041. /*!
  4042. * Служит для очистки тех картинок, которые были Еалиты в видео память.
  4043. */
  4044. diff --git a/Projects/tmRender/src/CSurfaceManager.cpp b/Projects/tmRender/src/CSurfaceManager.cpp
  4045. index d6ba130..7673913 100644
  4046. --- a/Projects/tmRender/src/CSurfaceManager.cpp
  4047. +++ b/Projects/tmRender/src/CSurfaceManager.cpp
  4048. @@ -2,79 +2,47 @@
  4049.  
  4050. #include <tmRender/CSurfaceManager.h>
  4051.  
  4052. -#include <Map_IO/FileNotFoundException.h>
  4053. #include <tmRender/CSurfaceCache.h>
  4054. -#include <tmRender/CSurfaceManager.h>
  4055. #include <tmRender/ISurfaceLoader.h>
  4056.  
  4057. +#include <Map_IO/FileNotFoundException.h>
  4058. +
  4059. namespace tme
  4060. {
  4061. namespace tmrender
  4062. {
  4063.  
  4064. -CSurfaceManager::CSurfaceManager()
  4065. - : ISurfaceManager()
  4066. -{
  4067. -}
  4068. -
  4069. -CSurfaceManager::CSurfaceManager(const UniFS::IDirPtr &fs)
  4070. - : ISurfaceManager()
  4071. - , FileSystem(fs)
  4072. -{
  4073. - UNI_ASSERT(FileSystem);
  4074. -}
  4075. -
  4076. CSurfaceManager::~CSurfaceManager()
  4077. {
  4078. }
  4079.  
  4080. -CSurfaceManager::CSurfaceManager(const CSurfaceManager * other, bool enable_cache)
  4081. - : ISurfaceManager()
  4082. - , FileSystem(other->FileSystem)
  4083. +CSurfaceManager::CSurfaceManager(
  4084. + const UniFS::IDirPtr &fs,
  4085. + std::initializer_list<Loader> loaders)
  4086. + : FileSystem(fs)
  4087. + , Loaders(loaders.begin(), loaders.end())
  4088. {
  4089. - for (TLoadersList::const_iterator it = other->Loaders.begin(); it != other->Loaders.end(); ++it)
  4090. - {
  4091. - Loaders.push_back(*it);
  4092. - }
  4093. - if (enable_cache)
  4094. - {
  4095. - Cache.reset(new CSurfaceCache());
  4096. - }
  4097. }
  4098.  
  4099. -CSurfaceManager::CSurfaceManager(const CSurfaceManager * other, const UniFS::IDirPtr &fs, bool enable_cache)
  4100. +CSurfaceManager::CSurfaceManager(const CSurfaceManager& other, const UniFS::IDirPtr &fs, const bool enable_cache)
  4101. : ISurfaceManager()
  4102. , FileSystem(fs)
  4103. + , Loaders(other.Loaders)
  4104. {
  4105. - UNI_ASSERT(FileSystem);
  4106. - for (TLoadersList::const_iterator it = other->Loaders.begin(); it != other->Loaders.end(); ++it)
  4107. - {
  4108. - Loaders.push_back(*it);
  4109. - }
  4110. if (enable_cache)
  4111. {
  4112. Cache.reset(new CSurfaceCache());
  4113. }
  4114. }
  4115.  
  4116. -void CSurfaceManager::setFileSystem(const UniFS::IDirPtr &new_file_system)
  4117. -{
  4118. - FileSystem = new_file_system;
  4119. -}
  4120. -
  4121. std::unique_ptr<ISurfaceManager> CSurfaceManager::clone(const bool enable_cache) const
  4122. {
  4123. - return std::unique_ptr<ISurfaceManager>(new CSurfaceManager(this, enable_cache));
  4124. + return std::unique_ptr<ISurfaceManager>(new CSurfaceManager(*this, FileSystem, enable_cache));
  4125. }
  4126.  
  4127. std::unique_ptr<ISurfaceManager> CSurfaceManager::clone(const UniFS::IDirPtr & fs, const bool enable_cache) const
  4128. {
  4129. - return std::unique_ptr<ISurfaceManager>(new CSurfaceManager(this, fs, enable_cache));
  4130. -}
  4131. -
  4132. -void CSurfaceManager::addSurfaceLoader(ISurfaceLoader * loader)
  4133. -{
  4134. - Loaders.push_back(boost::intrusive_ptr<ISurfaceLoader>(loader));
  4135. + return std::unique_ptr<ISurfaceManager>(new CSurfaceManager(*this, fs, enable_cache));
  4136. }
  4137.  
  4138. void CSurfaceManager::purge_uploaded_surfaces()
  4139. @@ -85,16 +53,17 @@ void CSurfaceManager::purge_uploaded_surfaces()
  4140. }
  4141. }
  4142.  
  4143. -ISurface * CSurfaceManager::load(const std::string & fileName, ESurfaceFormat format)
  4144. +ISurface * CSurfaceManager::load(const std::string & fileName, const ESurfaceFormat format)
  4145. {
  4146. - ISurface * surface = 0;
  4147. + UNI_ASSERT(FileSystem);
  4148. +
  4149. + ISurface * surface = nullptr;
  4150. if (Cache)
  4151. {
  4152. surface = Cache->find(fileName, format);
  4153. }
  4154. if (!surface)
  4155. {
  4156. - UNI_ASSERT(FileSystem);
  4157. ISurfaceLoader * loader = find_surface_loader(fileName);
  4158. if (loader)
  4159. {
  4160. @@ -105,7 +74,6 @@ ISurface * CSurfaceManager::load(const std::string & fileName, ESurfaceFormat fo
  4161. }
  4162. else
  4163. {
  4164. - UNILOG_ERROR << "Cannot open image file: " << fileName;
  4165. throw ::Map::IO::FileNotFoundException(file->FullPath());
  4166. }
  4167. }
  4168. @@ -118,9 +86,9 @@ ISurface * CSurfaceManager::load(const std::string & fileName, ESurfaceFormat fo
  4169. return surface;
  4170. }
  4171.  
  4172. -ISurface * CSurfaceManager::load(const UniFS::IFilePtr &file, ESurfaceFormat format)
  4173. +ISurface * CSurfaceManager::load(const UniFS::IFilePtr &file, const ESurfaceFormat format)
  4174. {
  4175. - ISurface * surface = 0;
  4176. + ISurface * surface = nullptr;
  4177. // Будем испольЕовать другое пространство имен в кэше
  4178. const std::string cache_file_name = "::" + file->FullPath();
  4179. if (Cache)
  4180. @@ -138,7 +106,6 @@ ISurface * CSurfaceManager::load(const UniFS::IFilePtr &file, ESurfaceFormat for
  4181. }
  4182. else
  4183. {
  4184. - UNILOG_ERROR << "Cannot open image file: " << file->FullPath();
  4185. throw ::Map::IO::FileNotFoundException(file->FullPath());
  4186. }
  4187. }
  4188. @@ -160,7 +127,7 @@ ISurfaceLoader *CSurfaceManager::find_surface_loader(const std::string &file_nam
  4189. return loader.get();
  4190. }
  4191. }
  4192. - return 0;
  4193. + return nullptr;
  4194. }
  4195.  
  4196. }} // namespace tme::tmrender
  4197. --
  4198. 1.9.5.msysgit.1
  4199.  
  4200. From c0644b5b1decebbc443b4317d44d3a5fa91a92a1 Mon Sep 17 00:00:00 2001
  4201. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  4202. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  4203. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  4204. Date: Thu, 9 Jul 2015 11:05:28 +0600
  4205. Subject: [PATCH 19/24] =?UTF-8?q?[LMAP-1399]=20=D0=9F=D0=B5=D1=80=D0=B5?=
  4206. =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=B3=D0=BB?=
  4207. =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=81=D1=82?=
  4208. =?UTF-8?q?=D0=B8=D0=BB=D0=B5=D0=B9=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BC?=
  4209. =?UTF-8?q?=D0=B5=D0=BD=D0=B5=20OpenGL-=D0=BA=D0=BE=D0=BD=D1=82=D0=B5?=
  4210. =?UTF-8?q?=D0=BA=D1=81=D1=82=D0=B0.=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?=
  4211. =?UTF-8?q?=D0=BD=D1=8B=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20=D0=BC?=
  4212. =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83?=
  4213. =?UTF-8?q?=D0=B7=D0=BA=D0=B8=20=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9=20?=
  4214. =?UTF-8?q?=D0=B2=20=D0=BF=D0=BE=D1=80=D1=82=20=D0=BF=D1=80=D0=BE=D1=81?=
  4215. =?UTF-8?q?=D0=BC=D0=BE=D1=82=D1=80=D0=B0=20=D1=81=20=D1=83=D0=BA=D0=B0?=
  4216. =?UTF-8?q?=D0=B7=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D1=84=D0=B0=D0=B9=D0=BB?=
  4217. =?UTF-8?q?=D0=B0.?=
  4218. MIME-Version: 1.0
  4219. Content-Type: text/plain; charset=UTF-8
  4220. Content-Transfer-Encoding: 8bit
  4221.  
  4222. ---
  4223. Projects/Carto/Carto.gyp | 2 +
  4224. Projects/Carto/Carto/Fwd.h | 2 +-
  4225. Projects/Carto/Carto/IViewport.h | 77 +--
  4226. Projects/Carto/Carto/Types.h | 7 -
  4227. Projects/Carto/Carto/Viewport.h | 34 +-
  4228. Projects/Carto/src/Carto/StyleSetCache.cpp | 102 +++
  4229. Projects/Carto/src/Carto/StyleSetCache.h | 65 ++
  4230. Projects/Carto/src/Carto/Viewport.cpp | 749 +++++++++++-----------
  4231. Projects/CartoQtTestAppLib/CartoWidget.hqt | 3 +-
  4232. Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 126 +++-
  4233. Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp | 13 +-
  4234. Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt | 2 +
  4235. 12 files changed, 725 insertions(+), 457 deletions(-)
  4236. create mode 100644 Projects/Carto/src/Carto/StyleSetCache.cpp
  4237. create mode 100644 Projects/Carto/src/Carto/StyleSetCache.h
  4238.  
  4239. diff --git a/Projects/Carto/Carto.gyp b/Projects/Carto/Carto.gyp
  4240. index f5d1c55..e67c465 100644
  4241. --- a/Projects/Carto/Carto.gyp
  4242. +++ b/Projects/Carto/Carto.gyp
  4243. @@ -270,6 +270,8 @@
  4244. 'src/Carto/StyleDynamicLayer.cpp',
  4245. 'src/Carto/StyleDynamicLayerView.cpp',
  4246. 'src/Carto/StyleDynamicLayerView.h',
  4247. + 'src/Carto/StyleSetCache.cpp',
  4248. + 'src/Carto/StyleSetCache.h',
  4249. 'src/Carto/TypesImpl.h',
  4250. 'src/Carto/Util.cpp',
  4251. 'src/Carto/UtilsImpl.cpp',
  4252. diff --git a/Projects/Carto/Carto/Fwd.h b/Projects/Carto/Carto/Fwd.h
  4253. index 213deb9..225574c 100644
  4254. --- a/Projects/Carto/Carto/Fwd.h
  4255. +++ b/Projects/Carto/Carto/Fwd.h
  4256. @@ -95,7 +95,7 @@ struct ProjectCoordinates;
  4257. struct ProjectInfo;
  4258. class ViewTrapezium;
  4259. struct ScreenPointPosition;
  4260. -struct StylesData;
  4261. +struct Styles;
  4262.  
  4263. //! Тип необяЕательного диапаЕона масштабов.
  4264. typedef boost::optional<ScaleRange> OptionalScaleRange;
  4265. diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
  4266. index 67d69ff..f8051a1 100644
  4267. --- a/Projects/Carto/Carto/IViewport.h
  4268. +++ b/Projects/Carto/Carto/IViewport.h
  4269. @@ -1,7 +1,5 @@
  4270. #pragma once
  4271.  
  4272. -#include <exception>
  4273. -
  4274. #include <UniFS/Fwd.h>
  4275. #include <Carto/Carto/Types.h>
  4276. #include <Carto/Tools/Fwd.h>
  4277. @@ -78,54 +76,41 @@ public:
  4278. * или с раЕличными списками фаЕ кидается исключение.
  4279. * \param project проект.
  4280. * \param view_settings настройки отображения для данного порта просмотра.
  4281. - * \param data_validation_errors_function функция, выЕываемая при обнаружении ошибок экспорта, стилей,
  4282. - * настроек отображения и всего такого.
  4283. - * Данный функтор копируется внутрь объекта и выЕывается в местах, где это необходимо, например,
  4284. - * при Еадании новой библиотеки стилей.
  4285. - * Может выЕваться прямо иЕ конструктора. Можно укаЕать пустую функцию, тогда проверка
  4286. - * не будет осуществляться.
  4287. - * \param style_folder директория с условными Енаками.
  4288. - * \param style_file_name Еагружаемый файл в директории с условными Енаками.
  4289. + * \param styles стили, предварительно Еагруженные функцией 'prepare_styles'.
  4290. */
  4291. virtual void add_project(
  4292. - const IProjectPtr & project,
  4293. + const IProjectPtr &project,
  4294. const IViewSettingsPtr &view_settings,
  4295. - const UniFS::IDirPtr &style_folder,
  4296. - const std::string &style_file_name,
  4297. - const DataValidationErrorsFunction &data_validation_errors_function) = 0;
  4298. -
  4299. - /*!
  4300. - * Добавление проекта для его отображения в порте просмотра, Identify и т.д.
  4301. - * При добавлении проектов с одинаковыми идентификаторами (ProjectId)
  4302. - * или с раЕличными списками фаЕ кидается исключение.
  4303. - * \param project проект.
  4304. - * \param view_settings настройки отображения для данного порта просмотра.
  4305. - * \param project_view_data стили для проекта, предварительно Еагруженные функцией 'prepare_project_styles_data'.
  4306. - */
  4307. - virtual void add_project(
  4308. - const IProjectPtr& project,
  4309. - const IViewSettingsPtr& view_settings,
  4310. - const StylesData& project_view_data) = 0;
  4311. + const std::shared_ptr<Styles> &styles) = 0;
  4312.  
  4313. /*!
  4314. - * Подготовка данных для добавления проекта в порт просмотра. Можно Еапускать в отдельном потоке.
  4315. - * \param project проект.
  4316. - * \param view_settings настройки отображения для данного порта просмотра.
  4317. - * \param data_validation_errors_function функция, выЕываемая при обнаружении ошибок экспорта, стилей,
  4318. - * настроек отображения и всего такого.
  4319. - * Данный функтор хранится вместе с проектом и выЕывается в местах, где это необходимо, например,
  4320. - * при добавлении в порт просмотра или Еадании новой библиотеки стилей.
  4321. - * Можно укаЕать пустую функцию, тогда проверка не будет осуществляться.
  4322. + * Подготовка данных для добавления проекта в порт просмотра. Можно Еапускать в отдельной нити.
  4323. * \param style_folder директория с условными Енаками.
  4324. * \param style_file_name Еагружаемый файл в директории с условными Енаками.
  4325. + * \param data_validation_errors_callback функция, выЕываемая при обнаружении ошибок экспорта, стилей, настроек
  4326. + * отображения и всего такого. Копируется внутрь и выЕывается в местах, где это необходимо, например, при
  4327. + * Еадании новой библиотеки стилей. Может выЕваться прямо иЕ конструктора. Можно укаЕать пустую функцию,
  4328. + * тогда проверка не будет осуществляться.
  4329. */
  4330. - virtual StylesDataConstPtr prepare_project_styles_data(
  4331. + virtual std::shared_ptr<Styles> prepare_styles(
  4332. const UniFS::IDirPtr &style_folder,
  4333. const std::string &style_file_name,
  4334. - const DataValidationErrorsFunction &data_validation_errors_function) const = 0;
  4335. + const DataValidationErrorsFunction &data_validation_errors_callback) const = 0;
  4336. +
  4337. + /*!
  4338. + * Удалить все ссылки на стили иЕ внутренних структур данных. После выЕова этого метода стили не будут
  4339. + * восстанавливаться при смене контекста рендера. Данная функция никак не портит содержимое по переданному
  4340. + * укаЕателю и её действие можно отменить, к примеру, добавив проект с освобождёнными стилями. Для окончательной
  4341. + * выгруЕки всех данных, выЕывающей стороне так же необходимо освободить свою копию укаЕателя.
  4342. + *
  4343. + * \param styles стили, предварительно Еагруженные функцией 'prepare_styles'.
  4344. + */
  4345. + virtual void free_styles(
  4346. + const std::shared_ptr<Styles> &styles) = 0;
  4347.  
  4348. //! Удаление проекта иЕ порта просмотра.
  4349. - virtual void remove_project(const IProjectPtr & project) = 0;
  4350. + //! \return стили удалённого проекта.
  4351. + virtual std::shared_ptr<Styles> remove_project(const IProjectPtr &project) = 0;
  4352.  
  4353. /*!
  4354. * Получение карты, к которой привяЕана данная область просмотра.
  4355. @@ -156,6 +141,13 @@ public:
  4356. virtual IProjectConstPtrContainer visible_projects() const = 0;
  4357.  
  4358. /*!
  4359. + * Получение интерфейсов всех проектов, испольЕующих данные стили.
  4360. + * \return множество проектов.
  4361. + */
  4362. + virtual IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) = 0;
  4363. + virtual IProjectConstPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) const = 0;
  4364. +
  4365. + /*!
  4366. * Получение класса для управления отображением слоя по имени.
  4367. * \param project_id идентификатор проекта.
  4368. * \param name имя слоя.
  4369. @@ -441,14 +433,13 @@ public:
  4370. /*!
  4371. * Смена испольЕуемых условных Енаков.
  4372. * \param project_id идентификатор проекта
  4373. - * \param style_folder директория с условными Енаками.
  4374. - * \param style_file_name Еагружаемый файл в директории с условными Енаками.
  4375. + * \param стили, предварительно Еагруженные функцией 'prepare_styles'.
  4376. * \param play_switch_animation флаг необходимости проигрывания анимации появления для уже Еагруженных объектов.
  4377. + * \return предыдущие настройки отображения для данного проекта.
  4378. */
  4379. - virtual void set_styles(
  4380. + virtual std::shared_ptr<Styles> set_styles(
  4381. ProjectId project_id,
  4382. - const UniFS::IDirPtr &style_folder,
  4383. - const std::string &style_file_name,
  4384. + const std::shared_ptr<Styles> &styles,
  4385. bool play_switch_animation = true) = 0;
  4386.  
  4387. /*!
  4388. diff --git a/Projects/Carto/Carto/Types.h b/Projects/Carto/Carto/Types.h
  4389. index e4468b4..9a96817 100644
  4390. --- a/Projects/Carto/Carto/Types.h
  4391. +++ b/Projects/Carto/Carto/Types.h
  4392. @@ -14,13 +14,6 @@
  4393. namespace Carto
  4394. {
  4395.  
  4396. -struct StylesDataDeleter
  4397. -{
  4398. - void operator()(const StylesData *object) const;
  4399. -};
  4400. -
  4401. -typedef std::unique_ptr<const StylesData, StylesDataDeleter> StylesDataConstPtr;
  4402. -
  4403. //! Цвет.
  4404. class Color
  4405. {
  4406. diff --git a/Projects/Carto/Carto/Viewport.h b/Projects/Carto/Carto/Viewport.h
  4407. index 8f7a58e..2109d1f 100644
  4408. --- a/Projects/Carto/Carto/Viewport.h
  4409. +++ b/Projects/Carto/Carto/Viewport.h
  4410. @@ -55,18 +55,29 @@ public:
  4411.  
  4412. public: // IViewport
  4413. virtual ViewportId id() const override;
  4414. +
  4415. virtual void add_project(
  4416. - const IProjectPtr & project,
  4417. - const IViewSettingsPtr &view_settings,
  4418. - const UniFS::IDirPtr &style_folder,
  4419. - const std::string &style_file_name,
  4420. - const DataValidationErrorsFunction &data_validation_errors_function) override;
  4421. - virtual void add_project(const IProjectPtr & project, const IViewSettingsPtr &view_settings, const StylesData& project_view_data) override;
  4422. - virtual StylesDataConstPtr prepare_project_styles_data(
  4423. + const IProjectPtr &project,
  4424. + const IViewSettingsPtr &view_settings,
  4425. + const std::shared_ptr<Styles> &styles) override;
  4426. +
  4427. + virtual std::shared_ptr<Styles> prepare_styles(
  4428. const UniFS::IDirPtr &style_folder,
  4429. const std::string &style_file_name,
  4430. - const DataValidationErrorsFunction &data_validation_errors_function) const override;
  4431. - virtual void remove_project(const IProjectPtr & project) override;
  4432. + const DataValidationErrorsFunction &data_validation_errors_callback) const override;
  4433. +
  4434. + virtual void free_styles(
  4435. + const std::shared_ptr<Styles> &styles) override;
  4436. +
  4437. + virtual std::shared_ptr<Styles> set_styles(
  4438. + ProjectId project_id,
  4439. + const std::shared_ptr<Styles> &styles,
  4440. + bool play_switch_animation) override;
  4441. +
  4442. + virtual IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) override;
  4443. + virtual IProjectConstPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) const override;
  4444. +
  4445. + virtual std::shared_ptr<Styles> remove_project(const IProjectPtr & project) override;
  4446. virtual ICartoPtr carto() const override;
  4447. virtual IProjectPtr project(ProjectId id) override;
  4448. virtual IProjectConstPtr project(ProjectId id) const override;
  4449. @@ -123,11 +134,6 @@ public: // IViewport
  4450. virtual void set_display_label_bound_box(bool display) override;
  4451. virtual void set_label_placement(LabelPlacement placement) override;
  4452.  
  4453. - virtual void set_styles(
  4454. - ProjectId project_id,
  4455. - const UniFS::IDirPtr &style_folder,
  4456. - const std::string &style_file_name,
  4457. - bool play_switch_animation = true) override;
  4458. virtual void set_view_settings(
  4459. ProjectId project_id,
  4460. const IViewSettingsPtr &view_settings,
  4461. diff --git a/Projects/Carto/src/Carto/StyleSetCache.cpp b/Projects/Carto/src/Carto/StyleSetCache.cpp
  4462. new file mode 100644
  4463. index 0000000..21b8778
  4464. --- /dev/null
  4465. +++ b/Projects/Carto/src/Carto/StyleSetCache.cpp
  4466. @@ -0,0 +1,102 @@
  4467. +#include "stable.h"
  4468. +
  4469. +#include <tmSymbol/CSymbolContainer.h>
  4470. +
  4471. +#include <tmRender/ISurfaceManager.h>
  4472. +
  4473. +#include "StyleSetCache.h"
  4474. +
  4475. +namespace Carto
  4476. +{
  4477. +
  4478. +namespace
  4479. +{
  4480. +
  4481. +std::shared_ptr<tme::CSymbolContainer> symbols_from_source(
  4482. + const ISurfaceManagerPtr& surface_manager,
  4483. + const StylesLoadingData& source)
  4484. +{
  4485. + UNI_ASSERT(nullptr != surface_manager);
  4486. +
  4487. + return std::make_shared<tme::CSymbolContainer>(
  4488. + *surface_manager,
  4489. + source.folder,
  4490. + source.file_name);
  4491. +}
  4492. +
  4493. +} // namespace
  4494. +
  4495. +StylesLoadingData::StylesLoadingData(
  4496. + UniFS::IDirPtr in_source_folder,
  4497. + std::string in_source_file_name,
  4498. + DataValidationErrorsFunction in_data_validation_errors_callback)
  4499. + : folder(std::move(in_source_folder))
  4500. + , file_name(std::move(in_source_file_name))
  4501. + , data_validation_errors_callback(std::move(in_data_validation_errors_callback))
  4502. +{
  4503. +}
  4504. +
  4505. +Styles::Styles(const StylesLoadingData& in_source)
  4506. + : source(in_source)
  4507. +{
  4508. +}
  4509. +
  4510. +std::shared_ptr<Styles> StyleSetCache::prepare_styles(
  4511. + const ViewportId host_viewport_id,
  4512. + const ISurfaceManagerPtr& reference_surface_manager,
  4513. + const StylesLoadingData& source)
  4514. +{
  4515. + UNI_ASSERT(nullptr != reference_surface_manager);
  4516. +
  4517. + const ISurfaceManagerPtr surface_manager(reference_surface_manager->clone(true));
  4518. +
  4519. + const auto styles_storage = symbols_from_source(surface_manager, source);
  4520. +
  4521. + const auto new_styles_set = std::make_shared<Styles>(source);
  4522. +
  4523. + new_styles_set->viewport_id = host_viewport_id;
  4524. + new_styles_set->storage = styles_storage;
  4525. + new_styles_set->surface_manager = surface_manager;
  4526. +
  4527. + return new_styles_set;
  4528. +}
  4529. +
  4530. +void StyleSetCache::look_after(const std::shared_ptr<Styles>& target)
  4531. +{
  4532. + UNI_ASSERT(nullptr != target);
  4533. + style_sets_.insert(target);
  4534. +}
  4535. +
  4536. +void StyleSetCache::adandon(const std::shared_ptr<Styles>& target)
  4537. +{
  4538. + UNI_ASSERT(nullptr != target);
  4539. +
  4540. + style_sets_.erase(target);
  4541. +}
  4542. +
  4543. +void StyleSetCache::external_render_context_lost()
  4544. +{
  4545. + for (const auto& styles_set : style_sets_)
  4546. + {
  4547. + styles_set->storage.reset();
  4548. + styles_set->surface_manager->purge_uploaded_surfaces();
  4549. + }
  4550. +}
  4551. +
  4552. +void StyleSetCache::external_render_context_recreated()
  4553. +{
  4554. + for (const auto& styles_set : style_sets_)
  4555. + {
  4556. + const auto new_styles_storage = symbols_from_source(styles_set->surface_manager, styles_set->source);
  4557. +
  4558. + styles_set->storage = new_styles_storage;
  4559. +
  4560. + const auto error_message = new_styles_storage->GetErrorString();
  4561. + if (nullptr != styles_set->source.data_validation_errors_callback && false == error_message.empty())
  4562. + {
  4563. + styles_set->source.data_validation_errors_callback(error_message);
  4564. + }
  4565. + }
  4566. +}
  4567. +
  4568. +} // namespace Carto
  4569. diff --git a/Projects/Carto/src/Carto/StyleSetCache.h b/Projects/Carto/src/Carto/StyleSetCache.h
  4570. new file mode 100644
  4571. index 0000000..8aa6fb0
  4572. --- /dev/null
  4573. +++ b/Projects/Carto/src/Carto/StyleSetCache.h
  4574. @@ -0,0 +1,65 @@
  4575. +#pragma once
  4576. +
  4577. +#include <Carto/Carto/Types.h>
  4578. +#include <Carto/Carto/TMRenderForwarding.h>
  4579. +
  4580. +#include "Fwd.h"
  4581. +
  4582. +#include <set>
  4583. +#include <memory>
  4584. +
  4585. +namespace Carto
  4586. +{
  4587. +
  4588. +struct StylesLoadingData final
  4589. +{
  4590. + StylesLoadingData(
  4591. + UniFS::IDirPtr source_folder,
  4592. + std::string source_file_name,
  4593. + DataValidationErrorsFunction data_validation_errors_callback);
  4594. +
  4595. + const UniFS::IDirPtr folder;
  4596. + const std::string file_name;
  4597. + const DataValidationErrorsFunction data_validation_errors_callback;
  4598. +};
  4599. +
  4600. +struct Styles final
  4601. +{
  4602. + explicit Styles(const StylesLoadingData& source);
  4603. + Styles(const Styles& other) = default;
  4604. +
  4605. + ViewportId viewport_id;
  4606. +
  4607. + ISurfaceManagerPtr surface_manager;
  4608. + ISymbolContainerPtr storage;
  4609. +
  4610. + const StylesLoadingData source;
  4611. +};
  4612. +
  4613. +class StyleSetCache final
  4614. +{
  4615. +public:
  4616. +
  4617. + StyleSetCache() = default;
  4618. +
  4619. + StyleSetCache(const StyleSetCache&) = delete;
  4620. + StyleSetCache& operator=(const StyleSetCache&) = delete;
  4621. +
  4622. + static std::shared_ptr<Styles> prepare_styles(
  4623. + ViewportId host_viewport_id,
  4624. + const ISurfaceManagerPtr& surface_manager,
  4625. + const StylesLoadingData& source);
  4626. +
  4627. + void look_after(const std::shared_ptr<Styles>& styles);
  4628. + void adandon(const std::shared_ptr<Styles>& styles);
  4629. +
  4630. + void external_render_context_lost();
  4631. + void external_render_context_recreated();
  4632. +
  4633. +private:
  4634. +
  4635. + std::set<const std::shared_ptr<Styles>> style_sets_;
  4636. +
  4637. +};
  4638. +
  4639. +} // namespace Carto
  4640. diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
  4641. index 8769fa2..ed1b87c 100644
  4642. --- a/Projects/Carto/src/Carto/Viewport.cpp
  4643. +++ b/Projects/Carto/src/Carto/Viewport.cpp
  4644. @@ -6,6 +6,8 @@
  4645. #include <tmCore/checked_cast.h>
  4646. #include <tmCore/OrderedVector.inl>
  4647. #include <tmCore/make_vector_with_capacity.h>
  4648. +#include <tmCore/range_checked_cast.h>
  4649. +
  4650. #include <tmRender/Loading/IViewSettings.h>
  4651. #include <tmRender/Loading/IPlanManager.h>
  4652. #include <tmRender/CView.h>
  4653. @@ -45,31 +47,11 @@
  4654. #include "ViewportLayerProxy.h"
  4655. #include "UtilsImpl.h"
  4656. #include "IViewSettingsPrivate.h"
  4657. +#include "StyleSetCache.h"
  4658.  
  4659. namespace Carto
  4660. {
  4661.  
  4662. -// Данные для отображения проекта
  4663. -struct StylesData final
  4664. -{
  4665. - ViewportId viewport_id_;
  4666. - ISymbolContainerPtr styles_;
  4667. - UniFS::IDirPtr styles_folder_;
  4668. - std::string styles_filename_;
  4669. - ISurfaceManagerPtr surface_manager_;
  4670. -
  4671. - //! Флаг, который вЕводится для того, чтобы перевести состояние анимируемых объектов сцены
  4672. - //! сраЕу в финальное состояние, например при смене стилей.
  4673. - bool finish_animation_flag_ = false;
  4674. -
  4675. - DataValidationErrorsFunction data_validation_errors_function_;
  4676. -};
  4677. -
  4678. -void StylesDataDeleter::operator()(const StylesData * const object) const
  4679. -{
  4680. - delete object;
  4681. -}
  4682. -
  4683. namespace
  4684. {
  4685.  
  4686. @@ -79,7 +61,7 @@ const float g_vertical_fov = 50.f;
  4687. class IsPrefix
  4688. {
  4689. public:
  4690. - explicit IsPrefix(const std::string * target)
  4691. + explicit IsPrefix(const std::string * const target)
  4692. : target_(target)
  4693. {
  4694. UNI_ASSERT(target_);
  4695. @@ -108,6 +90,11 @@ private:
  4696. const std::string * target_;
  4697. };
  4698.  
  4699. +std::string get_styles_loading_errors(const Styles& source)
  4700. +{
  4701. + return tme::checked_cast<const tme::CSymbolContainer*>(source.storage.get())->GetErrorString();
  4702. +}
  4703. +
  4704. //! Проверка того, что списки фаЕ в checklist полностью и в том же порядке входят в списки фаЕ base_list.
  4705. bool check_valid_list_of_phases(const IViewSettingsPtr & base_list, const IViewSettingsPtr & checklist)
  4706. {
  4707. @@ -122,7 +109,7 @@ bool check_valid_list_of_phases(const IViewSettingsPtr & base_list, const IViewS
  4708. const tme::tmrender::DrawingPhaseContainer & base_phases,
  4709. const tme::tmrender::DrawingPhaseContainer & check_phases) -> bool {
  4710.  
  4711. - tme::tmrender::DrawingPhaseContainer::const_iterator base_phases_it = base_phases.begin();
  4712. + auto base_phases_it = base_phases.begin();
  4713. for (const std::string & check_phase : check_phases)
  4714. {
  4715. base_phases_it = std::find(base_phases_it, base_phases.end(), check_phase);
  4716. @@ -145,7 +132,7 @@ bool check_valid_list_of_phases(const IViewSettingsPtr & base_list, const IViewS
  4717. class IndoorController : public IIndoorController
  4718. {
  4719. public:
  4720. - typedef boost::function<bool (const IndoorPlan &)> IndoorPlanValidator;
  4721. + typedef std::function<bool (const IndoorPlan &)> IndoorPlanValidator;
  4722.  
  4723. public:
  4724. IndoorController(
  4725. @@ -164,17 +151,17 @@ public: // IIndoorController
  4726. virtual PlanVisibilityMode get_plan_mode() override;
  4727.  
  4728. private:
  4729. - ViewportId viewport_id_;
  4730. + const ViewportId viewport_id_;
  4731. tme::tmrender::IPlanManager &plan_manager_;
  4732. - NeedRedrawFunction need_redraw_function_;
  4733. + const NeedRedrawFunction need_redraw_function_;
  4734. // Функтор для проверки, иЕвестен ли нам Еаданный план.
  4735. - IndoorPlanValidator check_plan_valid_;
  4736. + const IndoorPlanValidator check_plan_valid_;
  4737. };
  4738.  
  4739. // IndoorController
  4740.  
  4741. IndoorController::IndoorController(
  4742. - ViewportId viewport_id,
  4743. + const ViewportId viewport_id,
  4744. tme::tmrender::IPlanManager &manager,
  4745. const NeedRedrawFunction & need_redraw_function,
  4746. const IndoorPlanValidator & plan_validator)
  4747. @@ -205,9 +192,9 @@ std::vector<IndoorPlan> IndoorController::get_visible_plans() const
  4748. const tme::tmrender::OrderedPlansContainer internal_ids =
  4749. plan_manager_.get_active_plans(viewport_id_);
  4750.  
  4751. - std::vector<IndoorPlan> result = tme::make_vector_with_capacity<IndoorPlan>(internal_ids.size());
  4752. + auto result = tme::make_vector_with_capacity<IndoorPlan>(internal_ids.size());
  4753.  
  4754. - for (const tme::tmrender::PlanID &plan : internal_ids)
  4755. + for (const auto &plan : internal_ids)
  4756. {
  4757. result.emplace_back(
  4758. ObjectComplexId(
  4759. @@ -247,7 +234,7 @@ void IndoorController::reset_visible_plan(const ObjectComplexId &object_id)
  4760. }
  4761. }
  4762.  
  4763. -void IndoorController::set_plan_mode(PlanVisibilityMode new_mode)
  4764. +void IndoorController::set_plan_mode(const PlanVisibilityMode new_mode)
  4765. {
  4766. const PlanVisibilityMode current_mode = plan_manager_.get_plan_mode(viewport_id_);
  4767. if (current_mode != new_mode)
  4768. @@ -309,21 +296,29 @@ public: // IViewportPrivate
  4769.  
  4770. public:
  4771. ViewportId id() const;
  4772. +
  4773. void add_project(
  4774. - const IProjectPtr & project,
  4775. + const IProjectPtr &project,
  4776. const IViewSettingsPtr &view_settings,
  4777. + const std::shared_ptr<Styles> &project_view_data);
  4778. +
  4779. + std::shared_ptr<Styles> prepare_styles(
  4780. const UniFS::IDirPtr &style_folder,
  4781. const std::string &style_file_name,
  4782. - const DataValidationErrorsFunction &data_validation_errors_function);
  4783. - void add_project(
  4784. - const IProjectPtr& project,
  4785. - const IViewSettingsPtr& view_settings,
  4786. - const StylesData& project_view_data);
  4787. - StylesDataConstPtr prepare_project_styles_data(
  4788. - const UniFS::IDirPtr &style_folder,
  4789. - const std::string &style_file_name,
  4790. - const DataValidationErrorsFunction &data_validation_errors_function) const;
  4791. - void remove_project(const IProjectPtr & project);
  4792. + const DataValidationErrorsFunction &data_validation_errors_callback) const;
  4793. +
  4794. + std::shared_ptr<Styles> set_styles(
  4795. + ProjectId project_id,
  4796. + const std::shared_ptr<Styles> &styles,
  4797. + bool play_switch_animation);
  4798. +
  4799. + void free_styles(
  4800. + const std::shared_ptr<Styles> &styles);
  4801. +
  4802. + IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles);
  4803. + IProjectConstPtrContainer const_projects_with_styles(const std::shared_ptr<Styles> &styles) const;
  4804. +
  4805. + std::shared_ptr<Styles> remove_project(const IProjectPtr & project);
  4806. ICartoPtr carto() const;
  4807. IProjectPtr project(ProjectId id);
  4808. IProjectPtrContainer projects();
  4809. @@ -382,11 +377,7 @@ public:
  4810. ProjectId project_id,
  4811. const IViewSettingsPtr &view_settings,
  4812. bool play_switch_animation);
  4813. - void set_styles(
  4814. - ProjectId project_id,
  4815. - const UniFS::IDirPtr &style_folder,
  4816. - const std::string &style_file_name,
  4817. - bool play_switch_animation);
  4818. +
  4819. boost::optional<float> max_3d_scale(ProjectId project_id) const;
  4820. IViewSettingsPtr view_settings(ProjectId project_id) const;
  4821. IIndoorController & indoor_controller();
  4822. @@ -438,7 +429,7 @@ public:
  4823. void process_cancel();
  4824.  
  4825. private: // Types
  4826. - struct SelectionViewData
  4827. + struct SelectionViewData final
  4828. {
  4829. ISelectionPtr selection;
  4830. ISelectionViewPtr selection_view;
  4831. @@ -446,7 +437,7 @@ private: // Types
  4832. };
  4833. typedef boost::unordered_map<const ISelection *, SelectionViewData> SelectionViewMap;
  4834.  
  4835. - struct LayerViewData
  4836. + struct LayerViewData final
  4837. {
  4838. LayerViewData(
  4839. const ProjectId in_project_id,
  4840. @@ -465,8 +456,7 @@ private: // Types
  4841. const std::string layer_name;
  4842. const ILayerViewPtr view;
  4843.  
  4844. - private:
  4845. - const LayerViewData & operator=(const LayerViewData &);
  4846. + const LayerViewData & operator=(const LayerViewData &) = delete;
  4847. };
  4848.  
  4849. struct LayerIdTag;
  4850. @@ -493,20 +483,27 @@ private: // Types
  4851. {
  4852. ProjectWithView(
  4853. const IProjectPtr& in_project,
  4854. - const MapBox& in_project_bounding_box,
  4855. + const MapBox& in_bounding_box,
  4856. const IViewSettingsPtr& in_view_settings,
  4857. - const StylesData& in_view)
  4858. + std::shared_ptr<Styles> in_styles)
  4859. : project(in_project)
  4860. - , project_bounding_box(in_project_bounding_box)
  4861. + , bounding_box(in_bounding_box)
  4862. , view_settings(in_view_settings)
  4863. - , visual(in_view)
  4864. + , styles(std::move(in_styles))
  4865. {
  4866. + in_styles.reset();
  4867. }
  4868.  
  4869. IProjectPtr project;
  4870. - MapBox project_bounding_box;
  4871. + MapBox bounding_box;
  4872. IViewSettingsPtr view_settings;
  4873. - StylesData visual;
  4874. + std::shared_ptr<Styles> styles;
  4875. +
  4876. + /*
  4877. + Флаг, который вЕводится для того, чтобы перевести состояние анимируемых объектов сцены сраЕу в финальное
  4878. + состояние, например при смене стилей.
  4879. + */
  4880. + bool finish_animation = false;
  4881. };
  4882.  
  4883. typedef LayerViewContainer::index<LayerIdTag>::type LayerIdIndex;
  4884. @@ -514,7 +511,7 @@ private: // Types
  4885.  
  4886. typedef boost::unordered_map<DrawingType, HeavyOperationSettings> DrawingTypeMap;
  4887.  
  4888. - typedef boost::unordered_map<ProjectId, ProjectWithView> ProjectViewMap;
  4889. + typedef boost::unordered_map<ProjectId, ProjectWithView> ProjectMap;
  4890. typedef boost::unordered_set<IViewportDeletionListenerPtr> IViewportDeletionListenerContainer;
  4891.  
  4892. private:
  4893. @@ -585,7 +582,7 @@ private:
  4894.  
  4895. ViewportSize size_;
  4896.  
  4897. - ProjectViewMap project_views_;
  4898. + ProjectMap projects_;
  4899.  
  4900. SelectionViewMap selection_views_;
  4901.  
  4902. @@ -608,21 +605,23 @@ private:
  4903. tme::tmrender::RenderStartup render_startup_;
  4904.  
  4905. std::unique_ptr<IndoorController> indoor_controller_;
  4906. +
  4907. + StyleSetCache style_set_cache_;
  4908. };
  4909.  
  4910. Viewport::Impl::Impl(
  4911. IViewport &parent,
  4912. const ICartoPtr &in_carto,
  4913. const std::shared_ptr<tme::tmrender::IRender> &render,
  4914. - bool in_has_multisampling,
  4915. - DeviceType in_device_type,
  4916. - LoadingType in_loading_type,
  4917. + const bool in_has_multisampling,
  4918. + const DeviceType in_device_type,
  4919. + const LoadingType in_loading_type,
  4920. const ISurfaceManagerPtr &in_surface_manager,
  4921. const NeedRedrawFunction &need_redraw_function,
  4922. const PresentFunction &present_function,
  4923. const std::vector<std::string> &force_visible_layers,
  4924. const std::vector<std::string> &force_invisible_layers,
  4925. - bool is_primary_viewport,
  4926. + const bool is_primary_viewport,
  4927. const DrawingTypeChangeNotification &drawing_type_changed_notification)
  4928. : parent_(parent)
  4929. , carto_(in_carto)
  4930. @@ -766,7 +765,7 @@ Viewport::Impl::Impl(
  4931. id(),
  4932. carto_->private_interface().get_plan_manager(),
  4933. need_redraw_function_,
  4934. - boost::bind(&Impl::check_plan_valid, this, _1)));
  4935. + std::bind(&Impl::check_plan_valid, this, std::placeholders::_1)));
  4936. }
  4937.  
  4938. Viewport::Impl::~Impl()
  4939. @@ -784,11 +783,11 @@ Viewport::Impl::~Impl()
  4940.  
  4941. selection_views_.clear();
  4942.  
  4943. - for (const ProjectViewMap::value_type & project_view : project_views_)
  4944. + for (const auto& item : projects_)
  4945. {
  4946. - carto_->private_interface().remove_project(project_view.second.project, parent_);
  4947. + carto_->private_interface().remove_project(item.second.project, parent_);
  4948. }
  4949. - project_views_.clear();
  4950. + projects_.clear();
  4951.  
  4952. // Отображения слоев layer_views_ автоматически удаляются при удалении всех проектов иЕ порта просмотра.
  4953. carto_->private_interface().remove_viewport(parent_);
  4954. @@ -807,94 +806,124 @@ ViewportId Viewport::Impl::id() const
  4955. return ViewportId(reinterpret_cast<boost::uintptr_t>(view_.get()));
  4956. }
  4957.  
  4958. -void Viewport::Impl::add_project(
  4959. - const IProjectPtr &in_project,
  4960. - const IViewSettingsPtr &in_view_settings,
  4961. - const UniFS::IDirPtr &style_folder,
  4962. - const std::string &style_file_name,
  4963. - const DataValidationErrorsFunction &data_validation_errors_function)
  4964. +std::shared_ptr<Styles> Viewport::Impl::set_styles(
  4965. + const ProjectId project_id,
  4966. + const std::shared_ptr<Styles>& styles,
  4967. + const bool play_switch_animation)
  4968. {
  4969. - check_project_before_add(in_project, in_view_settings);
  4970. + UNI_ASSERT(nullptr != styles);
  4971.  
  4972. - add_project(in_project, in_view_settings, *prepare_project_styles_data(
  4973. - style_folder,
  4974. - style_file_name,
  4975. - data_validation_errors_function).get());
  4976. + const auto target_project = projects_.find(project_id);
  4977. +
  4978. + if (target_project != projects_.end())
  4979. + {
  4980. + style_set_cache_.look_after(styles);
  4981. +
  4982. + const auto old_styles = target_project->second.styles;
  4983. + target_project->second.styles = styles;
  4984. + target_project->second.finish_animation = !play_switch_animation;
  4985. +
  4986. + carto_->private_interface().set_viewport_styles(
  4987. + project_id,
  4988. + id(),
  4989. + styles->storage,
  4990. + nullptr);
  4991. +
  4992. + process_dynamic_views(
  4993. + [&styles](IDynamicLayerView* const dynamic_layer_view)
  4994. + {
  4995. + dynamic_layer_view->set_styles(styles->storage);
  4996. + });
  4997. +
  4998. + need_redraw_function_();
  4999. + return old_styles;
  5000. + }
  5001. +
  5002. + UNILOG_WARNING << "trying to set styles on a absent project with id " << project_id;
  5003. + return {};
  5004. +}
  5005. +
  5006. +void Viewport::Impl::free_styles(const std::shared_ptr<Styles>& styles)
  5007. +{
  5008. + UNI_ASSERT(nullptr != styles);
  5009. +
  5010. +#ifdef UNI_ASSERT_ENABLED
  5011. + for (const auto& item : projects_)
  5012. + {
  5013. + if (item.second.styles == styles)
  5014. + {
  5015. + UNILOG_WARNING << "freeing styles bound to a project";
  5016. + break;
  5017. + }
  5018. + }
  5019. +#endif // #ifdef UNI_ASSERT_ENABLED
  5020. +
  5021. + style_set_cache_.adandon(styles);
  5022. }
  5023.  
  5024. void Viewport::Impl::add_project(
  5025. const IProjectPtr& in_project,
  5026. const IViewSettingsPtr& in_view_settings,
  5027. - const StylesData& in_project_view_data)
  5028. + const std::shared_ptr<Styles>& in_styles)
  5029. {
  5030. - UNI_ASSERT(in_project_view_data.viewport_id_ == id());
  5031. + UNI_ASSERT(in_styles->viewport_id == id());
  5032.  
  5033. check_project_before_add(in_project, in_view_settings);
  5034.  
  5035. - project_views_.emplace(
  5036. + projects_.emplace(
  5037. in_project->id(),
  5038. ProjectWithView
  5039. {
  5040. in_project,
  5041. in_project->bounding_box(),
  5042. in_view_settings,
  5043. - in_project_view_data
  5044. + in_styles
  5045. });
  5046.  
  5047. - std::string error_string
  5048. - = tme::checked_cast<tme::CSymbolContainer*>(in_project_view_data.styles_.get())->GetErrorString();
  5049. + auto error_string = get_styles_loading_errors(*in_styles);
  5050. +
  5051. + const auto data_validation_errors_callback = in_styles->source.data_validation_errors_callback;
  5052.  
  5053. // Регистрируем проект в Carto и ЕагруЕчике
  5054. carto_->private_interface().add_project(
  5055. in_project,
  5056. parent_,
  5057. in_view_settings,
  5058. - in_project_view_data.styles_,
  5059. + in_styles->storage,
  5060. models_visibility_type_,
  5061. - in_project_view_data.data_validation_errors_function_ ? &error_string : nullptr);
  5062. + data_validation_errors_callback ? &error_string : nullptr);
  5063.  
  5064. - if (in_project_view_data.data_validation_errors_function_ && !error_string.empty())
  5065. + if (data_validation_errors_callback && !error_string.empty())
  5066. {
  5067. - in_project_view_data.data_validation_errors_function_(error_string);
  5068. + data_validation_errors_callback(error_string);
  5069. }
  5070. +
  5071. + style_set_cache_.look_after(in_styles);
  5072. }
  5073.  
  5074. -StylesDataConstPtr Viewport::Impl::prepare_project_styles_data(
  5075. +std::shared_ptr<Styles> Viewport::Impl::prepare_styles(
  5076. const UniFS::IDirPtr &style_folder,
  5077. const std::string &style_file_name,
  5078. - const DataValidationErrorsFunction &data_validation_errors_function) const
  5079. + const DataValidationErrorsFunction &data_validation_errors_callback) const
  5080. {
  5081. - // ИспольЕуем кэш картинок
  5082. - ISurfaceManagerPtr project_view_surface_manager(surface_manager_->clone(true));
  5083. -
  5084. - // CSymbolContainer должен быть Еависимым от проекта, т.к. для аниматоров и
  5085. - // условных Енаков требуется Енать scale проекта для правильного вычисления LMU
  5086. - ISymbolContainerPtr local_styles = std::make_shared<tme::CSymbolContainer>(
  5087. - *project_view_surface_manager,
  5088. - style_folder,
  5089. - style_file_name);
  5090. -
  5091. - // Сохраняем информацию о проекте и его настройках отображения
  5092. - const auto project_view_data = new StylesData;
  5093. - project_view_data->viewport_id_ = id();
  5094. - project_view_data->styles_ = local_styles;
  5095. - project_view_data->styles_folder_ = style_folder;
  5096. - project_view_data->styles_filename_ = style_file_name;
  5097. - project_view_data->surface_manager_ = project_view_surface_manager;
  5098. - project_view_data->data_validation_errors_function_ = data_validation_errors_function;
  5099. -
  5100. - return StylesDataConstPtr(project_view_data);
  5101. + return StyleSetCache::prepare_styles(
  5102. + id(),
  5103. + surface_manager_,
  5104. + { style_folder, style_file_name, data_validation_errors_callback });
  5105. }
  5106.  
  5107. -void Viewport::Impl::remove_project(const IProjectPtr &in_project)
  5108. +std::shared_ptr<Styles> Viewport::Impl::remove_project(const IProjectPtr &in_project)
  5109. {
  5110. carto_->private_interface().remove_project(in_project, parent_);
  5111.  
  5112. - ProjectViewMap::iterator project_view_iter = project_views_.find(in_project->id());
  5113. - UNI_ASSERT(project_view_iter != project_views_.end());
  5114. - project_views_.erase(project_view_iter);
  5115. + const auto project_view_iter = projects_.find(in_project->id());
  5116. + const auto styles = project_view_iter->second.styles;
  5117. + UNI_ASSERT(project_view_iter != projects_.end());
  5118. + projects_.erase(project_view_iter);
  5119.  
  5120. // GTODO: unregister screen coordinates ?
  5121. +
  5122. + return styles;
  5123. }
  5124.  
  5125. std::chrono::milliseconds Viewport::Impl::current_time() const
  5126. @@ -914,14 +943,14 @@ DeviceType Viewport::Impl::device_type() const
  5127.  
  5128. ISymbolContainerPtr Viewport::Impl::styles(const ProjectId project_id) const
  5129. {
  5130. - ProjectViewMap::const_iterator project_iter = project_views_.find(project_id);
  5131. - if (project_iter != project_views_.end())
  5132. + const auto project_iter = projects_.find(project_id);
  5133. + if (project_iter != projects_.end())
  5134. {
  5135. - UNI_ASSERT(project_iter->second.visual.styles_);
  5136. - return project_iter->second.visual.styles_;
  5137. + UNI_ASSERT(project_iter->second.styles->storage);
  5138. + return project_iter->second.styles->storage;
  5139. }
  5140.  
  5141. - return{};
  5142. + return {};
  5143. }
  5144.  
  5145. void Viewport::Impl::add_layer_view(
  5146. @@ -932,10 +961,10 @@ void Viewport::Impl::add_layer_view(
  5147. UNI_ASSERT(layer_view);
  5148.  
  5149. #ifdef UNI_ASSERT_ENABLED
  5150. - LayerIdIndex &id_index = layer_views_.get<LayerIdTag>();
  5151. + const LayerIdIndex &id_index = layer_views_.get<LayerIdTag>();
  5152. UNI_ASSERT(id_index.find(boost::make_tuple(layer_id.project_id, layer_id.layer_id)) == id_index.end());
  5153.  
  5154. - LayerNameIndex &name_index = layer_views_.get<LayerNameTag>();
  5155. + const LayerNameIndex &name_index = layer_views_.get<LayerNameTag>();
  5156. UNI_ASSERT(name_index.find(boost::make_tuple(layer_id.project_id, layer_name)) == name_index.end());
  5157. #endif
  5158.  
  5159. @@ -949,7 +978,7 @@ void Viewport::Impl::add_layer_view(
  5160. layer_view->force_visibility(false);
  5161. }
  5162.  
  5163. - LayerViewData data(layer_id.project_id, layer_id.layer_id, layer_name, layer_view);
  5164. + const LayerViewData data(layer_id.project_id, layer_id.layer_id, layer_name, layer_view);
  5165. layer_views_.insert(data);
  5166. }
  5167.  
  5168. @@ -962,7 +991,7 @@ void Viewport::Impl::remove_layer_view(const LayerComplexId & layer_id)
  5169. }
  5170.  
  5171. LayerIdIndex &id_index = layer_views_.get<LayerIdTag>();
  5172. - LayerIdIndex::iterator it = id_index.find(boost::make_tuple(layer_id.project_id, layer_id.layer_id));
  5173. + const auto it = id_index.find(boost::make_tuple(layer_id.project_id, layer_id.layer_id));
  5174. UNI_ASSERT(it != id_index.end());
  5175.  
  5176. id_index.erase(it);
  5177. @@ -978,7 +1007,7 @@ tme::tmrender::Map * Viewport::Impl::scene() const
  5178. return map_;
  5179. }
  5180.  
  5181. -tme::tmrender::City * Viewport::Impl::city(ProjectId project_id) const
  5182. +tme::tmrender::City * Viewport::Impl::city(const ProjectId project_id) const
  5183. {
  5184. return carto_->private_interface().city(project_id, id()).get();
  5185. }
  5186. @@ -993,18 +1022,19 @@ ICartoPtr Viewport::Impl::carto() const
  5187. return carto_;
  5188. }
  5189.  
  5190. -IProjectPtr Viewport::Impl::project(ProjectId in_id)
  5191. +IProjectPtr Viewport::Impl::project(const ProjectId in_id)
  5192. {
  5193. - ProjectViewMap::iterator project_view_iter = project_views_.find(in_id);
  5194. - UNI_ASSERT(project_view_iter != project_views_.end());
  5195. + const auto found = projects_.find(in_id);
  5196. + UNI_ASSERT(found != projects_.end());
  5197.  
  5198. - return project_view_iter->second.project;
  5199. + return found->second.project;
  5200. }
  5201.  
  5202. IProjectPtrContainer Viewport::Impl::projects()
  5203. {
  5204. - IProjectPtrContainer project_container;
  5205. - for (const ProjectViewMap::value_type & item : project_views_)
  5206. + auto project_container = tme::make_vector_with_capacity<IProjectPtr>(projects_.size());
  5207. +
  5208. + for (const auto& item : projects_)
  5209. {
  5210. project_container.push_back(item.second.project);
  5211. }
  5212. @@ -1014,8 +1044,9 @@ IProjectPtrContainer Viewport::Impl::projects()
  5213.  
  5214. IProjectConstPtrContainer Viewport::Impl::const_projects() const
  5215. {
  5216. - IProjectConstPtrContainer project_container;
  5217. - for (const ProjectViewMap::value_type & item : project_views_)
  5218. + auto project_container = tme::make_vector_with_capacity<IProjectConstPtr>(projects_.size());
  5219. +
  5220. + for (const auto& item : projects_)
  5221. {
  5222. project_container.push_back(item.second.project);
  5223. }
  5224. @@ -1023,25 +1054,55 @@ IProjectConstPtrContainer Viewport::Impl::const_projects() const
  5225. return project_container;
  5226. }
  5227.  
  5228. +IProjectPtrContainer Viewport::Impl::projects_with_styles(const std::shared_ptr<Styles> &styles)
  5229. +{
  5230. + auto result = tme::make_vector_with_capacity<IProjectPtr>(projects_.size());
  5231. +
  5232. + for (const auto& item : projects_)
  5233. + {
  5234. + if (item.second.styles == styles)
  5235. + {
  5236. + result.push_back(item.second.project);
  5237. + }
  5238. + }
  5239. +
  5240. + return result;
  5241. +}
  5242. +
  5243. +IProjectConstPtrContainer Viewport::Impl::const_projects_with_styles(const std::shared_ptr<Styles> &styles) const
  5244. +{
  5245. + auto result = tme::make_vector_with_capacity<IProjectConstPtr>(projects_.size());
  5246. +
  5247. + for (const auto& item : projects_)
  5248. + {
  5249. + if (item.second.styles == styles)
  5250. + {
  5251. + result.push_back(item.second.project);
  5252. + }
  5253. + }
  5254. +
  5255. + return result;
  5256. +}
  5257. +
  5258. IProjectPtrContainer Viewport::Impl::visible_projects() const
  5259. {
  5260. - if (project_views_.empty())
  5261. + if (projects_.empty())
  5262. {
  5263. return IProjectPtrContainer();
  5264. }
  5265.  
  5266. - boost::optional<PlanePoint> map_top_left = screen_coordinates_->screen_to_map_clipped(
  5267. + const boost::optional<PlanePoint> map_top_left = screen_coordinates_->screen_to_map_clipped(
  5268. ScreenPoint(0, 0));
  5269. UNI_ASSERT(map_top_left);
  5270. - boost::optional<PlanePoint> map_top_right = screen_coordinates_->screen_to_map_clipped(
  5271. + const boost::optional<PlanePoint> map_top_right = screen_coordinates_->screen_to_map_clipped(
  5272. ScreenPoint(static_cast<ScreenUnit>(size_.width), 0));
  5273. UNI_ASSERT(map_top_right);
  5274. - boost::optional<PlanePoint> map_bottom_right =
  5275. + const boost::optional<PlanePoint> map_bottom_right =
  5276. screen_coordinates_->screen_to_map_clipped(ScreenPoint(
  5277. static_cast<ScreenUnit>(size_.width),
  5278. static_cast<ScreenUnit>(size_.height)));
  5279. UNI_ASSERT(map_bottom_right);
  5280. - boost::optional<PlanePoint> map_bottom_left = screen_coordinates_->screen_to_map_clipped(
  5281. + const boost::optional<PlanePoint> map_bottom_left = screen_coordinates_->screen_to_map_clipped(
  5282. ScreenPoint(0, static_cast<ScreenUnit>(size_.height)));
  5283. UNI_ASSERT(map_bottom_left);
  5284.  
  5285. @@ -1064,11 +1125,13 @@ IProjectPtrContainer Viewport::Impl::visible_projects() const
  5286. screen_points.erase(screen_points.end() - 1);
  5287. }
  5288. UNI_ASSERT(screen_points.size() >= 3);
  5289. - IGeometryConstPtr screen_geometry = create_polygon_geometry(screen_points);
  5290. + const IGeometryConstPtr screen_geometry = create_polygon_geometry(screen_points);
  5291.  
  5292. const Scale & scale = navigator_->position().scale;
  5293. - IProjectPtrContainer result;
  5294. - for (const ProjectViewMap::value_type & item : project_views_)
  5295. +
  5296. + auto project_container = tme::make_vector_with_capacity<IProjectPtr>(projects_.size());
  5297. +
  5298. + for (const ProjectMap::value_type & item : projects_)
  5299. {
  5300. if (item.second.project->scale_limits().contains(scale))
  5301. {
  5302. @@ -1076,37 +1139,39 @@ IProjectPtrContainer Viewport::Impl::visible_projects() const
  5303. IGeometryConstPtr project_geometry = create_polygon_geometry(project_rect);
  5304. if (screen_geometry->is_intersects(*project_geometry))
  5305. {
  5306. - result.push_back(item.second.project);
  5307. + project_container.push_back(item.second.project);
  5308. }
  5309. }
  5310. }
  5311. - return result;
  5312. + return project_container;
  5313. }
  5314.  
  5315. IProjectConstPtrContainer Viewport::Impl::visible_const_projects() const
  5316. {
  5317. - IProjectConstPtrContainer result;
  5318. - for (const IProjectPtr & item : visible_projects())
  5319. + const auto visible = visible_projects();
  5320. +
  5321. + auto result = tme::make_vector_with_capacity<IProjectConstPtr>(visible.size());
  5322. + for (const auto& item : visible)
  5323. {
  5324. result.push_back(item);
  5325. }
  5326. return result;
  5327. }
  5328.  
  5329. -IViewportLayerProxyPtr Viewport::Impl::layer(ProjectId project_id, const std::string &name) const
  5330. +IViewportLayerProxyPtr Viewport::Impl::layer(const ProjectId project_id, const std::string &name) const
  5331. {
  5332. const LayerNameIndex &name_index = layer_views_.get<LayerNameTag>();
  5333. - LayerNameIndex::iterator it = name_index.find(boost::make_tuple(project_id, name));
  5334. + const auto found_layer = name_index.find(boost::make_tuple(project_id, name));
  5335.  
  5336. - if (it != name_index.end())
  5337. + if (found_layer != name_index.end())
  5338. {
  5339. - return std::make_shared<ViewportLayerProxy>(it->view);
  5340. + return std::make_shared<ViewportLayerProxy>(found_layer->view);
  5341. }
  5342.  
  5343. - return IViewportLayerProxyPtr();
  5344. + return {};
  5345. }
  5346.  
  5347. -IViewportLayerProxyPtr Viewport::Impl::layer(ProjectId project_id, LayerId layer_id) const
  5348. +IViewportLayerProxyPtr Viewport::Impl::layer(const ProjectId project_id, const LayerId layer_id) const
  5349. {
  5350. const LayerIdIndex &id_index = layer_views_.get<LayerIdTag>();
  5351. LayerIdIndex::iterator it = id_index.find(boost::make_tuple(project_id, layer_id));
  5352. @@ -1116,7 +1181,7 @@ IViewportLayerProxyPtr Viewport::Impl::layer(ProjectId project_id, LayerId layer
  5353. return std::make_shared<ViewportLayerProxy>(it->view);
  5354. }
  5355.  
  5356. - return IViewportLayerProxyPtr();
  5357. + return {};
  5358. }
  5359.  
  5360. void Viewport::Impl::add_selection(
  5361. @@ -1130,21 +1195,21 @@ void Viewport::Impl::add_selection(
  5362. selection_view_data.selection_view = selection->private_interface().create_view(parent_, color);
  5363. selection_view_data.color = color;
  5364.  
  5365. - selection_views_.insert(std::make_pair(selection.get(), selection_view_data));
  5366. + selection_views_.emplace(selection.get(), selection_view_data);
  5367. }
  5368.  
  5369. -void Viewport::Impl::remove_selection(const ISelection * selection)
  5370. +void Viewport::Impl::remove_selection(const ISelection * const selection)
  5371. {
  5372. - SelectionViewMap::iterator it = selection_views_.find(selection);
  5373. - UNI_ASSERT(it != selection_views_.end());
  5374. + const auto found_selection = selection_views_.find(selection);
  5375. + UNI_ASSERT(found_selection != selection_views_.end());
  5376.  
  5377. - selection_views_.erase(it);
  5378. + selection_views_.erase(found_selection);
  5379. }
  5380.  
  5381. std::vector<ISelectionPtr> Viewport::Impl::selections()
  5382. {
  5383. std::vector<ISelectionPtr> viewport_selections;
  5384. - for (const SelectionViewMap::value_type & item : selection_views_)
  5385. + for (const auto & item : selection_views_)
  5386. {
  5387. viewport_selections.push_back(item.second.selection);
  5388. }
  5389. @@ -1156,7 +1221,7 @@ ViewportProjectionType Viewport::Impl::projection() const
  5390. return projection_;
  5391. }
  5392.  
  5393. -void Viewport::Impl::set_projection(ViewportProjectionType type)
  5394. +void Viewport::Impl::set_projection(const ViewportProjectionType type)
  5395. {
  5396. if (projection_ != type)
  5397. {
  5398. @@ -1276,25 +1341,27 @@ MapBox Viewport::Impl::bounding_box_all_projects() const
  5399. {
  5400. MapBox global_map_box;
  5401. global_map_box.set_invalid();
  5402. - for (const ProjectViewMap::value_type & item : project_views_)
  5403. + for (const auto& slave_project : projects_)
  5404. {
  5405. - global_map_box.expand(item.second.project_bounding_box);
  5406. + global_map_box.expand(slave_project.second.bounding_box);
  5407. }
  5408. return global_map_box;
  5409. }
  5410.  
  5411. MapBox Viewport::Impl::bounding_box_visible_projects() const
  5412. {
  5413. - IProjectConstPtrContainer vis_projects = visible_const_projects();
  5414. + const auto visible_projects_container = visible_const_projects();
  5415.  
  5416. MapBox global_map_box;
  5417. global_map_box.set_invalid();
  5418. - for (const IProjectConstPtr & item : vis_projects)
  5419. +
  5420. + for (const auto& item : visible_projects_container)
  5421. {
  5422. - ProjectViewMap::const_iterator it = project_views_.find(item->id());
  5423. - UNI_ASSERT(it != project_views_.end());
  5424. - global_map_box.expand(it->second.project_bounding_box);
  5425. + const auto visible_project = projects_.find(item->id());
  5426. + UNI_ASSERT(visible_project != projects_.end());
  5427. + global_map_box.expand(visible_project->second.bounding_box);
  5428. }
  5429. +
  5430. return global_map_box;
  5431. }
  5432.  
  5433. @@ -1376,7 +1443,7 @@ AnimationType Viewport::Impl::animation_type() const
  5434. return animation_type_;
  5435. }
  5436.  
  5437. -void Viewport::Impl::set_animation_type(AnimationType type)
  5438. +void Viewport::Impl::set_animation_type(const AnimationType type)
  5439. {
  5440. if (type != animation_type_)
  5441. {
  5442. @@ -1394,7 +1461,7 @@ DrawingType Viewport::Impl::drawing_type() const
  5443. return drawing_type_;
  5444. }
  5445.  
  5446. -void Viewport::Impl::set_drawing_type(DrawingType type)
  5447. +void Viewport::Impl::set_drawing_type(const DrawingType type)
  5448. {
  5449. if (type != drawing_type_)
  5450. {
  5451. @@ -1405,17 +1472,17 @@ void Viewport::Impl::set_drawing_type(DrawingType type)
  5452. }
  5453. }
  5454.  
  5455. -HeavyOperationSettings Viewport::Impl::drawing_flags(DrawingType type) const
  5456. +HeavyOperationSettings Viewport::Impl::drawing_flags(const DrawingType type) const
  5457. {
  5458. - DrawingTypeMap::const_iterator it = flags_.find(type);
  5459. + const auto it = flags_.find(type);
  5460. UNI_ASSERT(it != flags_.end());
  5461.  
  5462. return it->second;
  5463. }
  5464.  
  5465. void Viewport::Impl::set_drawing_flags(
  5466. - DrawingType type,
  5467. - HeavyOperationSettings flags)
  5468. + const DrawingType type,
  5469. + const HeavyOperationSettings flags)
  5470. {
  5471. UNI_ASSERT(flags_.find(type) != flags_.end());
  5472.  
  5473. @@ -1434,7 +1501,7 @@ LoadingType Viewport::Impl::loading_type() const
  5474. }
  5475. }
  5476.  
  5477. -void Viewport::Impl::set_loading_type(LoadingType type)
  5478. +void Viewport::Impl::set_loading_type(const LoadingType type)
  5479. {
  5480. view_->setLoadingSynchronous(type == LoadingTypeSynchronous);
  5481. }
  5482. @@ -1444,7 +1511,7 @@ VisibilityType Viewport::Impl::models_visibility_type() const
  5483. return models_visibility_type_;
  5484. }
  5485.  
  5486. -void Viewport::Impl::set_models_visibility_type(VisibilityType type)
  5487. +void Viewport::Impl::set_models_visibility_type(const VisibilityType type)
  5488. {
  5489. if (models_visibility_type_ != type)
  5490. {
  5491. @@ -1461,7 +1528,7 @@ LabelingMode Viewport::Impl::labeling_mode() const
  5492. return labeling_mode_;
  5493. }
  5494.  
  5495. -void Viewport::Impl::set_labeling_mode(LabelingMode mode)
  5496. +void Viewport::Impl::set_labeling_mode(const LabelingMode mode)
  5497. {
  5498. switch (mode)
  5499. {
  5500. @@ -1496,38 +1563,41 @@ void Viewport::Impl::set_labeling_cache(const ILabelingCachePtr &labeling_cache)
  5501. labeling_cache_ = labeling_cache;
  5502. }
  5503.  
  5504. -void Viewport::Impl::set_display_label_bound_box(bool display)
  5505. +void Viewport::Impl::set_display_label_bound_box(const bool display)
  5506. {
  5507. map_->setDisplayLabelBoundBox(display);
  5508. need_redraw();
  5509. }
  5510.  
  5511. void Viewport::Impl::set_view_settings(
  5512. - ProjectId project_id,
  5513. + const ProjectId project_id,
  5514. const IViewSettingsPtr &in_view_settings,
  5515. - bool play_switch_animation)
  5516. + const bool play_switch_animation)
  5517. {
  5518. - ProjectViewMap::iterator project_iter = project_views_.find(project_id);
  5519. - if (project_iter != project_views_.end())
  5520. + const auto found_project = projects_.find(project_id);
  5521. + if (found_project != projects_.end())
  5522. {
  5523. - StylesData & project_data = project_iter->second.visual;
  5524. - project_iter->second.project->private_interface().remove_viewport(parent_);
  5525. + const auto project_styles = found_project->second.styles;
  5526. + found_project->second.project->private_interface().remove_viewport(parent_);
  5527.  
  5528. std::string error_string;
  5529. - project_iter->second.view_settings = in_view_settings;
  5530. + found_project->second.view_settings = in_view_settings;
  5531. +
  5532. + const auto styles_loading_errors_callback = project_styles->source.data_validation_errors_callback;
  5533. +
  5534. carto_->private_interface().set_viewport_view(
  5535. project_id,
  5536. id(),
  5537. in_view_settings,
  5538. - project_data.styles_,
  5539. - project_data.data_validation_errors_function_ ? &error_string : nullptr);
  5540. + project_styles->storage,
  5541. + styles_loading_errors_callback ? &error_string : nullptr);
  5542.  
  5543. - project_iter->second.project->private_interface().connect_viewport(parent_);
  5544. - project_data.finish_animation_flag_ = !play_switch_animation;
  5545. + found_project->second.project->private_interface().connect_viewport(parent_);
  5546. + found_project->second.finish_animation = !play_switch_animation;
  5547. need_redraw_function_();
  5548. - if (project_data.data_validation_errors_function_ && !error_string.empty())
  5549. + if (styles_loading_errors_callback && !error_string.empty())
  5550. {
  5551. - project_data.data_validation_errors_function_(error_string);
  5552. + styles_loading_errors_callback(error_string);
  5553. }
  5554. }
  5555. else
  5556. @@ -1541,69 +1611,22 @@ const tme::tmrender::ISurfaceManager & Viewport::Impl::surface_manager() const
  5557. return *surface_manager_;
  5558. }
  5559.  
  5560. -void Viewport::Impl::set_styles(
  5561. - ProjectId project_id,
  5562. - const UniFS::IDirPtr &style_folder,
  5563. - const std::string &style_file_name,
  5564. - bool play_switch_animation)
  5565. -{
  5566. - ProjectViewMap::iterator project_iter = project_views_.find(project_id);
  5567. - if (project_iter != project_views_.end())
  5568. - {
  5569. - StylesData & project_view = project_iter->second.visual;
  5570. -
  5571. - UNI_ASSERT(project_view.styles_);
  5572. -
  5573. - std::string error_string;
  5574. - const auto new_styles
  5575. - = std::make_shared<tme::CSymbolContainer>(
  5576. - *project_view.surface_manager_,
  5577. - style_folder,
  5578. - style_file_name);
  5579. - error_string += new_styles->GetErrorString();
  5580. -
  5581. - project_view.styles_ = new_styles;
  5582. - project_view.styles_folder_ = style_folder;
  5583. - project_view.styles_filename_ = style_file_name;
  5584. -
  5585. - carto_->private_interface().set_viewport_styles(
  5586. - project_id,
  5587. - id(),
  5588. - project_view.styles_,
  5589. - project_view.data_validation_errors_function_ ? &error_string : nullptr);
  5590. - if (project_view.data_validation_errors_function_ && !error_string.empty())
  5591. - {
  5592. - project_view.data_validation_errors_function_(error_string);
  5593. - }
  5594. -
  5595. - process_dynamic_views(
  5596. - std::bind(&IDynamicLayerView::set_styles,
  5597. - std::placeholders::_1,
  5598. - std::cref(project_view.styles_)));
  5599. -
  5600. - project_view.finish_animation_flag_ = !play_switch_animation;
  5601. - need_redraw_function_();
  5602. - }
  5603. -}
  5604. -
  5605. -boost::optional<float> Viewport::Impl::max_3d_scale(ProjectId project_id) const
  5606. +boost::optional<float> Viewport::Impl::max_3d_scale(const ProjectId project_id) const
  5607. {
  5608. return view_settings(project_id)->private_interface().view_settings()->get_max_3d_scale(
  5609. device_type_to_internal(device_type_));
  5610. }
  5611.  
  5612. -IViewSettingsPtr Viewport::Impl::view_settings(ProjectId project_id) const
  5613. +IViewSettingsPtr Viewport::Impl::view_settings(const ProjectId project_id) const
  5614. {
  5615. - ProjectViewMap::const_iterator project_iter = project_views_.find(project_id);
  5616. - if (project_iter != project_views_.end())
  5617. + const auto host_project = projects_.find(project_id);
  5618. + if (host_project != projects_.end())
  5619. {
  5620. - UNI_ASSERT(project_iter->second.view_settings);
  5621. - return project_iter->second.view_settings;
  5622. - }
  5623. - else
  5624. - {
  5625. - return IViewSettingsPtr();
  5626. + UNI_ASSERT(host_project->second.view_settings);
  5627. + return host_project->second.view_settings;
  5628. }
  5629. +
  5630. + return {};
  5631. }
  5632.  
  5633. IIndoorController & Viewport::Impl::indoor_controller()
  5634. @@ -1633,15 +1656,14 @@ void Viewport::Impl::force_render_init()
  5635. }
  5636.  
  5637. void Viewport::Impl::external_render_context_lost()
  5638. -{
  5639. - for (ProjectViewMap::value_type &project_view_pair : project_views_)
  5640. +{
  5641. + style_set_cache_.external_render_context_lost();
  5642. +
  5643. + for (auto& item : projects_)
  5644. {
  5645. - // удалим ссылку на условные Енаки
  5646. - project_view_pair.second.visual.styles_.reset();
  5647. - // удалим иЕ кэша картинок некорректные картинки
  5648. - project_view_pair.second.visual.surface_manager_->purge_uploaded_surfaces();
  5649. - carto_->private_interface().remove_project(project_view_pair.second.project, parent_);
  5650. + carto_->private_interface().remove_project(item.second.project, parent_);
  5651. }
  5652. +
  5653. // удалим последние ссылки на ресурсы отрисовки
  5654. view_->getRenderTree().clearChilds();
  5655.  
  5656. @@ -1656,44 +1678,34 @@ void Viewport::Impl::external_render_context_lost()
  5657.  
  5658. void Viewport::Impl::external_render_context_recreated()
  5659. {
  5660. +
  5661. #ifdef TM_USE_EXTERNAL_RENDER
  5662. if (render_)
  5663. {
  5664. render_->init(render_startup_);
  5665. }
  5666. #endif // TM_USE_EXTERNAL_RENDER
  5667. - for (ProjectViewMap::value_type &project_view_pair : project_views_)
  5668. - {
  5669. - StylesData & project_view = project_view_pair.second.visual;
  5670. -
  5671. - // соЕдадим условные Енаки
  5672. - std::string error_string;
  5673. - const auto new_styles = std::make_shared<tme::CSymbolContainer>(
  5674. - *project_view.surface_manager_,
  5675. - project_view.styles_folder_,
  5676. - project_view.styles_filename_);
  5677. - error_string += new_styles->GetErrorString();
  5678. -
  5679. - project_view.styles_ = new_styles;
  5680. - if (project_view.data_validation_errors_function_ && !error_string.empty())
  5681. - {
  5682. - project_view.data_validation_errors_function_(error_string);
  5683. - }
  5684. +
  5685. + style_set_cache_.external_render_context_recreated();
  5686.  
  5687. + for (const auto& item : projects_)
  5688. + {
  5689. carto_->private_interface().add_project(
  5690. - project_view_pair.second.project,
  5691. + item.second.project,
  5692. parent_,
  5693. - project_view_pair.second.view_settings,
  5694. - project_view.styles_,
  5695. + item.second.view_settings,
  5696. + item.second.styles->storage,
  5697. models_visibility_type_,
  5698. nullptr);
  5699. }
  5700.  
  5701. // Сообщим всем, что нужно пересоЕдать сцену
  5702. {
  5703. + const auto width = tme::range_checked_cast<int>(size_.width);
  5704. + const auto height = tme::range_checked_cast<int>(size_.height);
  5705. +
  5706. view_->beginChanging();
  5707. - view_->changeFrameSize(
  5708. - tmmath::vector2i(int(size_.width), int(size_.height)));
  5709. + view_->changeFrameSize({ width, height});
  5710. view_->endChanging();
  5711.  
  5712. //! Местоположение и направление камеры.
  5713. @@ -1707,7 +1719,7 @@ void Viewport::Impl::external_render_context_recreated()
  5714. }
  5715.  
  5716. // Сообщим приложению, что сцену надо перерисовать
  5717. - if (!project_views_.empty())
  5718. + if (!projects_.empty())
  5719. {
  5720. need_redraw_function_();
  5721. }
  5722. @@ -1725,10 +1737,12 @@ const IViewportPrivate & Viewport::Impl::private_interface() const
  5723.  
  5724. bool Viewport::Impl::check_plan_valid(const IndoorPlan & plan) const
  5725. {
  5726. - const auto it = project_views_.find(plan.object_id.project_id);
  5727. + const auto it = projects_.find(plan.object_id.project_id);
  5728. +
  5729. + // Здание должно иметь этажи.
  5730. + UNI_ASSERT(projects_.end() != it);
  5731.  
  5732. - UNI_ASSERT(project_views_.end() != it); //<- Здание не имеет этажей.
  5733. - if (project_views_.end() != it)
  5734. + if (projects_.end() != it)
  5735. {
  5736. const std::vector<PlanInternalID> plans
  5737. = it->second.project->indoor_data().plans_for_object(plan.object_id);
  5738. @@ -1901,7 +1915,7 @@ void Viewport::Impl::apply_drawing_type_internal()
  5739. bool Viewport::Impl::animate_projects(tme::tmrender::AnimationContext & context)
  5740. {
  5741. bool is_redraw_needed = false;
  5742. - for (ProjectViewMap::value_type & item : project_views_)
  5743. + for (auto & item : projects_)
  5744. {
  5745. CityPtr city_view = carto_->private_interface().city(item.first, id());
  5746. UNI_ASSERT(city_view);
  5747. @@ -1917,11 +1931,11 @@ bool Viewport::Impl::animate_projects(tme::tmrender::AnimationContext & context)
  5748. context.scene_animation_mode = tme::tmrender::SceneAnimationMode::Instant;
  5749. break;
  5750. }
  5751. - if (item.second.visual.finish_animation_flag_)
  5752. + if (item.second.finish_animation)
  5753. {
  5754. // Переводим аниматоры сраЕу в конечное состояние.
  5755. context.scene_animation_mode = tme::tmrender::SceneAnimationMode::Instant;
  5756. - item.second.visual.finish_animation_flag_ = false;
  5757. + item.second.finish_animation = false;
  5758. }
  5759.  
  5760. is_redraw_needed = city_view->animate(context) || is_redraw_needed;
  5761. @@ -1942,17 +1956,17 @@ bool Viewport::Impl::prepare_frame_rendering(tme::tmrender::AnimationContext & c
  5762.  
  5763. void Viewport::Impl::process_whole_map_scene(
  5764. const ProcessSceneFunction & process_scene_function,
  5765. - bool labeling_only)
  5766. + const bool labeling_only)
  5767. {
  5768. - bool change_loading_type = (!view_->isLoadingSynchronous());
  5769. + const bool change_loading_type = (!view_->isLoadingSynchronous());
  5770.  
  5771. // Запоминаем состояние области просмотра
  5772. - bool current_is_rendering_enabled = view_->isRenderingEnabled();
  5773. - IMapPositionClipperConstPtr clipper = navigator_->clipper();
  5774. - ViewportSize current_size = size();
  5775. - MapPosition current_position = navigator_->position();
  5776. - ViewportProjectionType current_projection = projection();
  5777. - AnimationType current_animation_type = animation_type();
  5778. + const bool current_is_rendering_enabled = view_->isRenderingEnabled();
  5779. + const IMapPositionClipperConstPtr clipper = navigator_->clipper();
  5780. + const ViewportSize current_size = size();
  5781. + const MapPosition current_position = navigator_->position();
  5782. + const ViewportProjectionType current_projection = projection();
  5783. + const AnimationType current_animation_type = animation_type();
  5784.  
  5785. // Устанавливаем область просмотра, чтобы ЕагруЕилась вся карта
  5786. begin_whole_map_scene_processing(
  5787. @@ -2013,10 +2027,10 @@ void Viewport::Impl::process_dynamic_views(const std::function<void(IDynamicLaye
  5788. }
  5789.  
  5790. void Viewport::Impl::begin_whole_map_scene_processing(
  5791. - bool change_loading_type,
  5792. - Scale scale,
  5793. - float angle,
  5794. - bool labeling_only)
  5795. + const bool change_loading_type,
  5796. + const Scale scale,
  5797. + const float angle,
  5798. + const bool labeling_only)
  5799. {
  5800. view_->enableRendering(false);
  5801. // Отключаем клиппирование, а то умрём на определении max_scale
  5802. @@ -2029,7 +2043,7 @@ void Viewport::Impl::begin_whole_map_scene_processing(
  5803.  
  5804. // При отображении нескольких проектов раЕмер порта просмотра получается очень большой
  5805. // и содержимое раЕмещается неправильно. Поэтому эту функцию можно испольЕовать только с одним проектом.
  5806. - UNI_ASSERT(project_views_.size() <= 1);
  5807. + UNI_ASSERT(projects_.size() <= 1);
  5808. // Делаем, чтобы область просмотра отображает всю карту
  5809. const MapRect whole_map_rect = bounding_box_all_projects().rect();
  5810.  
  5811. @@ -2064,14 +2078,14 @@ void Viewport::Impl::begin_whole_map_scene_processing(
  5812. }
  5813.  
  5814. void Viewport::Impl::end_whole_map_scene_processing(
  5815. - bool change_loading_type,
  5816. - bool current_is_rendering_enabled,
  5817. - IMapPositionClipperConstPtr clipper,
  5818. - ViewportSize current_size,
  5819. - MapPosition current_position,
  5820. - ViewportProjectionType current_projection,
  5821. - AnimationType current_animation_type,
  5822. - bool labeling_only)
  5823. + const bool change_loading_type,
  5824. + const bool current_is_rendering_enabled,
  5825. + const IMapPositionClipperConstPtr clipper,
  5826. + const ViewportSize current_size,
  5827. + const MapPosition current_position,
  5828. + const ViewportProjectionType current_projection,
  5829. + const AnimationType current_animation_type,
  5830. + const bool labeling_only)
  5831. {
  5832. // ВоЕвращаем Viewport в исходное состояние
  5833. if (labeling_only)
  5834. @@ -2099,7 +2113,7 @@ void Viewport::Impl::end_whole_map_scene_processing(
  5835.  
  5836. void Viewport::Impl::refresh_active_labeling_info()
  5837. {
  5838. - Scale scale = navigator_->position().scale;
  5839. + const Scale scale = navigator_->position().scale;
  5840.  
  5841. if (labeling_cache_)
  5842. {
  5843. @@ -2136,20 +2150,20 @@ void Viewport::Impl::check_project_before_add(const IProjectPtr & in_project, co
  5844. {
  5845. // Проверка Еагруженности проекта беЕ ProjectInfo.
  5846. // То есть мы можем ЕагруЕить только один проект, если он беЕ секции ProjectInfo.
  5847. - if (project_views_.find(g_empty_project_id) != project_views_.end())
  5848. + if (projects_.find(g_empty_project_id) != projects_.end())
  5849. {
  5850. TM_THROW_AND_LOG(ProjectWithoutProjectIndoLoadedException(
  5851. "Project without project_info section has already been added in viewport"));
  5852. }
  5853. // Проверка добавления проекта с уже Еагруженным ProjectId
  5854. - if (project_views_.find(in_project->id()) != project_views_.end())
  5855. + if (projects_.find(in_project->id()) != projects_.end())
  5856. {
  5857. TM_THROW_AND_LOG(ProjectIdDuplicatedException("Project id duplicated"));
  5858. }
  5859. // Проверка того, что список фаЕ добавляемого проекта полностью и в том же порядке
  5860. // входит в списк фаЕ уже добавленных проектов.
  5861. - if (!project_views_.empty()
  5862. - && !check_valid_list_of_phases(project_views_.begin()->second.view_settings, in_view_settings))
  5863. + if (!projects_.empty()
  5864. + && !check_valid_list_of_phases(projects_.begin()->second.view_settings, in_view_settings))
  5865. {
  5866. TM_THROW_AND_LOG(ListsOfPhasesDifferException("Lists of phases differ"));
  5867. }
  5868. @@ -2158,15 +2172,15 @@ void Viewport::Impl::check_project_before_add(const IProjectPtr & in_project, co
  5869. Viewport::Viewport(
  5870. const ICartoPtr &in_carto,
  5871. const std::shared_ptr<tme::tmrender::IRender> &render,
  5872. - bool in_has_multisampling,
  5873. - DeviceType in_device_type,
  5874. - LoadingType in_loading_type,
  5875. + const bool in_has_multisampling,
  5876. + const DeviceType in_device_type,
  5877. + const LoadingType in_loading_type,
  5878. const ISurfaceManagerPtr &surface_manager,
  5879. const NeedRedrawFunction &need_redraw_function,
  5880. const std::vector<std::string> &force_visible_layers,
  5881. const std::vector<std::string> &force_invisible_layers,
  5882. const PresentFunction &present_function,
  5883. - bool is_primary_viewport,
  5884. + const bool is_primary_viewport,
  5885. const DrawingTypeChangeNotification &drawing_type_changed_notification)
  5886. : impl_()
  5887. {
  5888. @@ -2198,42 +2212,27 @@ ViewportId Viewport::id() const
  5889. }
  5890.  
  5891. void Viewport::add_project(
  5892. - const IProjectPtr &in_project,
  5893. - const IViewSettingsPtr &in_view_settings,
  5894. - const UniFS::IDirPtr &style_folder,
  5895. - const std::string &style_file_name,
  5896. - const DataValidationErrorsFunction &data_validation_errors_function)
  5897. -{
  5898. - impl_->add_project(
  5899. - in_project,
  5900. - in_view_settings,
  5901. - style_folder,
  5902. - style_file_name,
  5903. - data_validation_errors_function);
  5904. -}
  5905. -
  5906. -void Viewport::add_project(
  5907. - const IProjectPtr& in_project,
  5908. - const IViewSettingsPtr& in_view_settings,
  5909. - const StylesData& project_view_data)
  5910. + const IProjectPtr &in_project,
  5911. + const IViewSettingsPtr &in_view_settings,
  5912. + const std::shared_ptr<Styles> &styles)
  5913. {
  5914. - impl_->add_project(in_project, in_view_settings, project_view_data);
  5915. + impl_->add_project(in_project, in_view_settings, styles);
  5916. }
  5917.  
  5918. -StylesDataConstPtr Viewport::prepare_project_styles_data(
  5919. +std::shared_ptr<Styles> Viewport::prepare_styles(
  5920. const UniFS::IDirPtr &style_folder,
  5921. const std::string &style_file_name,
  5922. - const DataValidationErrorsFunction &data_validation_errors_function) const
  5923. + const DataValidationErrorsFunction &data_validation_errors_callback) const
  5924. {
  5925. - return impl_->prepare_project_styles_data(
  5926. + return impl_->prepare_styles(
  5927. style_folder,
  5928. style_file_name,
  5929. - data_validation_errors_function);
  5930. + data_validation_errors_callback);
  5931. }
  5932.  
  5933. -void Viewport::remove_project(const IProjectPtr &in_project)
  5934. +std::shared_ptr<Styles> Viewport::remove_project(const IProjectPtr &in_project)
  5935. {
  5936. - impl_->remove_project(in_project);
  5937. + return impl_->remove_project(in_project);
  5938. }
  5939.  
  5940. ICartoPtr Viewport::carto() const
  5941. @@ -2241,12 +2240,12 @@ ICartoPtr Viewport::carto() const
  5942. return impl_->carto();
  5943. }
  5944.  
  5945. -IProjectPtr Viewport::project(ProjectId in_id)
  5946. +IProjectPtr Viewport::project(const ProjectId in_id)
  5947. {
  5948. return impl_->project(in_id);
  5949. }
  5950.  
  5951. -IProjectConstPtr Viewport::project(ProjectId in_id) const
  5952. +IProjectConstPtr Viewport::project(const ProjectId in_id) const
  5953. {
  5954. return impl_->project(in_id);
  5955. }
  5956. @@ -2271,12 +2270,22 @@ IProjectConstPtrContainer Viewport::visible_projects() const
  5957. return impl_->visible_const_projects();
  5958. }
  5959.  
  5960. -IViewportLayerProxyPtr Viewport::layer(ProjectId project_id, const std::string &name) const
  5961. +IProjectPtrContainer Viewport::projects_with_styles(const std::shared_ptr<Styles>& styles)
  5962. +{
  5963. + return impl_->projects_with_styles(styles);
  5964. +}
  5965. +
  5966. +IProjectConstPtrContainer Viewport::projects_with_styles(const std::shared_ptr<Styles>& styles) const
  5967. +{
  5968. + return impl_->const_projects_with_styles(styles);
  5969. +}
  5970. +
  5971. +IViewportLayerProxyPtr Viewport::layer(const ProjectId project_id, const std::string &name) const
  5972. {
  5973. return impl_->layer(project_id, name);
  5974. }
  5975.  
  5976. -IViewportLayerProxyPtr Viewport::layer(ProjectId project_id, LayerId layer_id) const
  5977. +IViewportLayerProxyPtr Viewport::layer(const ProjectId project_id, const LayerId layer_id) const
  5978. {
  5979. return impl_->layer(project_id, layer_id);
  5980. }
  5981. @@ -2288,7 +2297,7 @@ void Viewport::add_selection(
  5982. impl_->add_selection(selection, color);
  5983. }
  5984.  
  5985. -void Viewport::remove_selection(const ISelection * selection)
  5986. +void Viewport::remove_selection(const ISelection * const selection)
  5987. {
  5988. impl_->remove_selection(selection);
  5989. }
  5990. @@ -2303,7 +2312,7 @@ ViewportProjectionType Viewport::projection() const
  5991. return impl_->projection();
  5992. }
  5993.  
  5994. -void Viewport::set_projection(ViewportProjectionType type)
  5995. +void Viewport::set_projection(const ViewportProjectionType type)
  5996. {
  5997. impl_->set_projection(type);
  5998. }
  5999. @@ -2313,7 +2322,7 @@ float Viewport::field_of_view() const
  6000. return impl_->field_of_view();
  6001. }
  6002.  
  6003. -void Viewport::set_field_of_view(float in_field_of_view)
  6004. +void Viewport::set_field_of_view(const float in_field_of_view)
  6005. {
  6006. impl_->set_field_of_view(in_field_of_view);
  6007. }
  6008. @@ -2426,7 +2435,7 @@ AnimationType Viewport::animation_type() const
  6009. return impl_->animation_type();
  6010. }
  6011.  
  6012. -void Viewport::set_animation_type(AnimationType type)
  6013. +void Viewport::set_animation_type(const AnimationType type)
  6014. {
  6015. impl_->set_animation_type(type);
  6016. }
  6017. @@ -2436,17 +2445,17 @@ DrawingType Viewport::drawing_type() const
  6018. return impl_->drawing_type();
  6019. }
  6020.  
  6021. -void Viewport::set_drawing_type(DrawingType type)
  6022. +void Viewport::set_drawing_type(const DrawingType type)
  6023. {
  6024. impl_->set_drawing_type(type);
  6025. }
  6026.  
  6027. -HeavyOperationSettings Viewport::drawing_flags(DrawingType type) const
  6028. +HeavyOperationSettings Viewport::drawing_flags(const DrawingType type) const
  6029. {
  6030. return impl_->drawing_flags(type);
  6031. }
  6032.  
  6033. -void Viewport::set_drawing_flags(DrawingType type, HeavyOperationSettings flags)
  6034. +void Viewport::set_drawing_flags(const DrawingType type, const HeavyOperationSettings flags)
  6035. {
  6036. impl_->set_drawing_flags(type, flags);
  6037. }
  6038. @@ -2456,7 +2465,7 @@ LoadingType Viewport::loading_type() const
  6039. return impl_->loading_type();
  6040. }
  6041.  
  6042. -void Viewport::set_loading_type(LoadingType type)
  6043. +void Viewport::set_loading_type(const LoadingType type)
  6044. {
  6045. impl_->set_loading_type(type);
  6046. }
  6047. @@ -2466,7 +2475,7 @@ VisibilityType Viewport::models_visibility_type() const
  6048. return impl_->models_visibility_type();
  6049. }
  6050.  
  6051. -void Viewport::set_models_visibility_type(VisibilityType type)
  6052. +void Viewport::set_models_visibility_type(const VisibilityType type)
  6053. {
  6054. impl_->set_models_visibility_type(type);
  6055. }
  6056. @@ -2476,7 +2485,7 @@ LabelingMode Viewport::labeling_mode() const
  6057. return impl_->labeling_mode();
  6058. }
  6059.  
  6060. -void Viewport::set_labeling_mode(LabelingMode mode)
  6061. +void Viewport::set_labeling_mode(const LabelingMode mode)
  6062. {
  6063. impl_->set_labeling_mode(mode);
  6064. }
  6065. @@ -2491,38 +2500,52 @@ void Viewport::set_label_placement(const LabelPlacement placement)
  6066. impl_->view()->setLabelPlacement(placement);
  6067. }
  6068.  
  6069. -void Viewport::set_display_label_bound_box(bool display)
  6070. +void Viewport::set_display_label_bound_box(const bool display)
  6071. {
  6072. impl_->set_display_label_bound_box(display);
  6073. }
  6074.  
  6075. void Viewport::set_view_settings(
  6076. - ProjectId project_id,
  6077. + const ProjectId project_id,
  6078. const IViewSettingsPtr & in_view_settings,
  6079. - bool play_switch_animation)
  6080. + const bool play_switch_animation)
  6081. {
  6082. impl_->set_view_settings(project_id, in_view_settings, play_switch_animation);
  6083. }
  6084.  
  6085. -void Viewport::set_styles(
  6086. - ProjectId project_id,
  6087. - const UniFS::IDirPtr &style_folder,
  6088. - const std::string &style_file_name,
  6089. - bool play_switch_animation)
  6090. +
  6091. +void Viewport::free_styles(const std::shared_ptr<Styles>& styles)
  6092. {
  6093. - impl_->set_styles(
  6094. - project_id,
  6095. - style_folder,
  6096. - style_file_name,
  6097. - play_switch_animation);
  6098. + if (nullptr == styles)
  6099. + {
  6100. + UNILOG_ERROR << "can't free null styles";
  6101. + }
  6102. + else
  6103. + {
  6104. + impl_->free_styles(styles);
  6105. + }
  6106. +}
  6107. +
  6108. +std::shared_ptr<Styles> Viewport::set_styles(
  6109. + const ProjectId project_id,
  6110. + const std::shared_ptr<Styles>& styles,
  6111. + const bool play_switch_animation)
  6112. +{
  6113. + if (nullptr == styles)
  6114. + {
  6115. + UNILOG_ERROR << "can't apply null styles";
  6116. + return{};
  6117. + }
  6118. +
  6119. + return impl_->set_styles(project_id, styles, play_switch_animation);
  6120. }
  6121.  
  6122. -boost::optional<float> Viewport::max_3d_scale(ProjectId project_id) const
  6123. +boost::optional<float> Viewport::max_3d_scale(const ProjectId project_id) const
  6124. {
  6125. return impl_->max_3d_scale(project_id);
  6126. }
  6127.  
  6128. -IViewSettingsPtr Viewport::view_settings(ProjectId project_id) const
  6129. +IViewSettingsPtr Viewport::view_settings(const ProjectId project_id) const
  6130. {
  6131. return impl_->view_settings(project_id);
  6132. }
  6133. diff --git a/Projects/CartoQtTestAppLib/CartoWidget.hqt b/Projects/CartoQtTestAppLib/CartoWidget.hqt
  6134. index f8cee4c..f7b3819 100644
  6135. --- a/Projects/CartoQtTestAppLib/CartoWidget.hqt
  6136. +++ b/Projects/CartoQtTestAppLib/CartoWidget.hqt
  6137. @@ -149,6 +149,7 @@ public slots:
  6138. const QString & stable_id_source_path);
  6139. void closeProject(ProjectId project_id);
  6140. void closeProjects(bool emit_signal = true);
  6141. + void closeProjectsKeepViewport(const bool emit_signal = true);
  6142. void setViewSettingsPath(ProjectId project_id, const QString & view_settings_path);
  6143. void setViewSettingsPathForAll(const QString & view_settings_path);
  6144. void setStylesPath(ProjectId project_id, const QString & styles_path);
  6145. @@ -367,7 +368,7 @@ private:
  6146. boost::unordered_map<ProjectId, ProjectParameters> projects_;
  6147. ActivityContainer viewport_activities_;
  6148.  
  6149. - StylesDataConstPtr cached_styles_;
  6150. + std::shared_ptr<Styles> cached_styles_;
  6151.  
  6152. ICartoPtr carto_;
  6153. std::shared_ptr<RenderTimeScaled> render_time_;
  6154. diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  6155. index 503c94b..48c61c4 100644
  6156. --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  6157. +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  6158. @@ -134,7 +134,7 @@ UniFS::IDirPtr getModelSource(
  6159. converted_data))
  6160. {
  6161. QMessageBox::critical(
  6162. - 0,
  6163. + nullptr,
  6164. QObject::tr("Invalid model description"),
  6165. QObject::tr("Format validation error."));
  6166. return {};
  6167. @@ -822,6 +822,11 @@ ProjectId CartoWidget::openProjectWithGlobalSyle(const QString & file_name)
  6168. UNI_ASSERT(false == file_name.isEmpty());
  6169. UNI_ASSERT(nullptr != cached_styles_);
  6170.  
  6171. + if (nullptr == currentCartoWidget())
  6172. + {
  6173. + createWidget();
  6174. + }
  6175. +
  6176. ProjectParameters project_parameters;
  6177. project_parameters.map_path = file_name;
  6178. project_parameters.map_version_path = file_name;
  6179. @@ -853,7 +858,7 @@ ProjectId CartoWidget::openProjectWithGlobalSyle(const QString & file_name)
  6180. const auto view_settings = std::make_shared<ViewSettings>(project_to_be_opened, view_settings_block);
  6181. UNI_ASSERT(view_settings);
  6182.  
  6183. - viewport().add_project(project_to_be_opened, view_settings, *cached_styles_.get());
  6184. + viewport().add_project(project_to_be_opened, view_settings, cached_styles_);
  6185.  
  6186. projects_[project_id] = project_parameters;
  6187.  
  6188. @@ -888,7 +893,18 @@ void CartoWidget::loadGlobalStyles(const QString & file_name)
  6189. const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
  6190. const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
  6191.  
  6192. - cached_styles_ = viewport().prepare_project_styles_data(styles_folder, g_style_default, on_unknown_symbol);
  6193. + const auto old_styles = cached_styles_;
  6194. +
  6195. + cached_styles_ = viewport().prepare_styles(styles_folder, g_style_default, on_unknown_symbol);
  6196. +
  6197. + if (nullptr != old_styles)
  6198. + {
  6199. + for (const auto& project : viewport().projects_with_styles(old_styles))
  6200. + {
  6201. + viewport().set_styles(project->id(), cached_styles_);
  6202. + }
  6203. + viewport().free_styles(old_styles);
  6204. + }
  6205. }
  6206. catch (const std::exception& e)
  6207. {
  6208. @@ -948,7 +964,7 @@ ProjectId CartoWidget::addProject(
  6209. return addProjectByParams(project_param);
  6210. }
  6211.  
  6212. -void CartoWidget::closeProjects(const bool emit_signal)
  6213. +void CartoWidget::closeProjectsKeepViewport(const bool emit_signal)
  6214. {
  6215. UNI_ASSERT(!projects_.empty());
  6216.  
  6217. @@ -959,15 +975,42 @@ void CartoWidget::closeProjects(const bool emit_signal)
  6218. UNI_ASSERT(viewport().projects().empty());
  6219.  
  6220. projects_.clear();
  6221. +
  6222. + if (emit_signal)
  6223. + {
  6224. + emit allProjectsClosed();
  6225. + }
  6226. +}
  6227. +
  6228. +void CartoWidget::closeProjects(const bool emit_signal)
  6229. +{
  6230. + UNI_ASSERT(!projects_.empty());
  6231. +
  6232. + for (const auto & params : projects_)
  6233. + {
  6234. + const auto styles = viewport().remove_project(params.second.project_ptr);
  6235. +
  6236. + if (styles != cached_styles_)
  6237. + {
  6238. + viewport().free_styles(styles);
  6239. + }
  6240. + }
  6241. + UNI_ASSERT(viewport().projects().empty());
  6242. +
  6243. deinitWidget();
  6244.  
  6245. + projects_.clear();
  6246. +
  6247. + delete slave_viewport_;
  6248. + slave_viewport_ = nullptr;
  6249. +
  6250. if (emit_signal)
  6251. {
  6252. emit allProjectsClosed();
  6253. }
  6254. }
  6255.  
  6256. -void CartoWidget::closeProject(ProjectId project_id)
  6257. +void CartoWidget::closeProject(const ProjectId project_id)
  6258. {
  6259. UNI_ASSERT(currentWidget());
  6260.  
  6261. @@ -975,8 +1018,14 @@ void CartoWidget::closeProject(ProjectId project_id)
  6262.  
  6263. if (currentCartoWidget())
  6264. {
  6265. - viewport().remove_project(project_ptr);
  6266. + const auto styles = viewport().remove_project(project_ptr);
  6267. +
  6268. + if (viewport().projects_with_styles(styles).empty() && styles != cached_styles_)
  6269. + {
  6270. + viewport().free_styles(styles);
  6271. + }
  6272. }
  6273. +
  6274. deinitActivities(project_id);
  6275. deinitDynamicLayers(project_id);
  6276. projects_.erase(project_id);
  6277. @@ -1004,7 +1053,17 @@ void CartoWidget::setStylesPath(ProjectId project_id, const QString & styles_pat
  6278. params.styles_folder = new_styles_folder;
  6279. if (currentCartoWidget())
  6280. {
  6281. - viewport().set_styles(project_id, params.styles_folder, params.style_file_name);
  6282. + const auto styles = viewport().prepare_styles(
  6283. + params.styles_folder,
  6284. + params.style_file_name,
  6285. + std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  6286. +
  6287. + const auto old_styles = viewport().set_styles(project_id, styles);
  6288. +
  6289. + if (viewport().projects_with_styles(old_styles).empty() && cached_styles_ != old_styles)
  6290. + {
  6291. + viewport().free_styles(old_styles);
  6292. + }
  6293. }
  6294. emit stylesOpened(project_id);
  6295. }
  6296. @@ -1042,7 +1101,7 @@ void CartoWidget::setStableIdSourcePath(
  6297. // По идее не опасная операция
  6298. QString path_exception_message = path_exception.what();
  6299. QMessageBox::critical(
  6300. - 0,
  6301. + nullptr,
  6302. QObject::tr("Invalid file data"),
  6303. QObject::tr("Can't open models:\n") + path_exception_message);
  6304. }
  6305. @@ -1308,7 +1367,17 @@ void CartoWidget::setStyle(ProjectId project_id, const QString & style_file_name
  6306.  
  6307. if (currentCartoWidget())
  6308. {
  6309. - viewport().set_styles(project_id, params.styles_folder, params.style_file_name);
  6310. + const auto styles = viewport().prepare_styles(
  6311. + params.styles_folder,
  6312. + params.style_file_name,
  6313. + std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  6314. +
  6315. + const auto old_styles = viewport().set_styles(project_id, styles);
  6316. +
  6317. + if (viewport().projects_with_styles(old_styles).empty() && cached_styles_ != old_styles)
  6318. + {
  6319. + viewport().free_styles(old_styles);
  6320. + }
  6321. }
  6322. }
  6323. }
  6324. @@ -1541,7 +1610,7 @@ QWidget *CartoWidget::spawnSwCartoWidget(const ViewportSettings &settings)
  6325. carto_,
  6326. settings.device_type,
  6327. LoadingTypeAsynchronous,
  6328. - 0,
  6329. + nullptr,
  6330. CartoWidgetDrawingSpeedFunction(),
  6331. {}, {});
  6332.  
  6333. @@ -1589,7 +1658,7 @@ QWidget *CartoWidget::spawnGlCartoWidget(const ViewportSettings &settings)
  6334. carto_,
  6335. settings.device_type,
  6336. LoadingTypeAsynchronous,
  6337. - 0,
  6338. + nullptr,
  6339. CartoWidgetDrawingSpeedFunction(),
  6340. {},
  6341. {},
  6342. @@ -1622,12 +1691,15 @@ void CartoWidget::initSlaveCartoWidget(
  6343. {
  6344. try
  6345. {
  6346. + const auto styles = widget_viewport.prepare_styles(
  6347. + params.second.styles_folder,
  6348. + params.second.style_file_name,
  6349. + std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  6350. +
  6351. widget_viewport.add_project(
  6352. params.second.project_ptr,
  6353. reference_viewport.view_settings(params.second.project_ptr->id()),
  6354. - params.second.styles_folder,
  6355. - params.second.style_file_name,
  6356. - std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  6357. + styles);
  6358. }
  6359. catch (...)
  6360. {
  6361. @@ -1779,7 +1851,7 @@ void CartoWidget::windowChanged(QWindow * const new_window)
  6362. {
  6363. if (current_window_)
  6364. {
  6365. - disconnect(current_window_, 0, this, 0);
  6366. + disconnect(current_window_, nullptr, this, nullptr);
  6367. }
  6368. current_window_ = new_window;
  6369. if (current_window_)
  6370. @@ -1800,7 +1872,7 @@ void CartoWidget::screenChanged(QScreen *new_screen)
  6371. {
  6372. if (current_screen_)
  6373. {
  6374. - disconnect(current_screen_, 0, this, 0);
  6375. + disconnect(current_screen_, nullptr, this, nullptr);
  6376. }
  6377. current_screen_ = new_screen;
  6378. if (current_screen_)
  6379. @@ -1944,23 +2016,27 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
  6380. get_view_settings_block(project_param.view_settings_path.toUtf8().constData());
  6381. UNI_ASSERT(view_settings_block);
  6382.  
  6383. - const IViewSettingsPtr view_settings = std::make_shared<ViewSettings>(
  6384. + const auto view_settings = std::make_shared<ViewSettings>(
  6385. project_param.project_ptr,
  6386. view_settings_block);
  6387. UNI_ASSERT(view_settings);
  6388.  
  6389. - viewport().add_project(
  6390. - project_param.project_ptr,
  6391. - view_settings,
  6392. + const auto styles = viewport().prepare_styles(
  6393. project_param.styles_folder,
  6394. project_param.style_file_name,
  6395. std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  6396. + UNI_ASSERT(styles);
  6397. +
  6398. + viewport().add_project(
  6399. + project_param.project_ptr,
  6400. + view_settings,
  6401. + styles);
  6402. }
  6403. catch (::Map::IO::FileNotFoundException &path_exception)
  6404. {
  6405. QString path_exception_message = path_exception.what();
  6406. QMessageBox::critical(
  6407. - 0,
  6408. + nullptr,
  6409. QObject::tr("Invalid file data"),
  6410. QObject::tr("Can't open project:\n") + path_exception_message);
  6411. return false;
  6412. @@ -1968,7 +2044,7 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
  6413. catch (const ProjectWithoutProjectIndoLoadedException &)
  6414. {
  6415. QMessageBox::critical(
  6416. - 0,
  6417. + nullptr,
  6418. QObject::tr("Error adding project"),
  6419. QObject::tr("Project without project_info section has already been added in viewport"));
  6420. return false;
  6421. @@ -1976,7 +2052,7 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
  6422. catch (const ProjectIdDuplicatedException &)
  6423. {
  6424. QMessageBox::critical(
  6425. - 0,
  6426. + nullptr,
  6427. QObject::tr("Error adding project"),
  6428. QObject::tr("Can't add project with duplicated id (%1)").arg(project_param.project_ptr->id()));
  6429. return false;
  6430. @@ -1984,7 +2060,7 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
  6431. catch (const ListsOfPhasesDifferException &)
  6432. {
  6433. QMessageBox::critical(
  6434. - 0,
  6435. + nullptr,
  6436. QObject::tr("Error adding project"),
  6437. QObject::tr("Can't add project with different list of phases"));
  6438. return false;
  6439. @@ -2039,7 +2115,7 @@ void CartoWidget::createProject(ProjectParameters & params)
  6440. // По идее не опасная операция
  6441. QString path_exception_message = path_exception.what();
  6442. QMessageBox::critical(
  6443. - 0,
  6444. + nullptr,
  6445. QObject::tr("Invalid file data"),
  6446. QObject::tr("Can't open project:\n") + path_exception_message);
  6447. params.project_ptr.reset();
  6448. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  6449. index f5a64df..771963d 100644
  6450. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  6451. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.cpp
  6452. @@ -2285,7 +2285,7 @@ void MainWindowImpl::onOpenGlobalStylesProject2gisTriggered()
  6453. {
  6454. if (false == carto_widget_->projects().isEmpty())
  6455. {
  6456. - carto_widget_->closeProjects();
  6457. + carto_widget_->closeProjectsKeepViewport();
  6458. }
  6459.  
  6460. carto_widget_->openProjectWithGlobalSyle(file_name);
  6461. @@ -2300,13 +2300,20 @@ void MainWindowImpl::onOpenGlobalStylesProjectMap3dTriggered()
  6462. {
  6463. if (false == carto_widget_->projects().isEmpty())
  6464. {
  6465. - carto_widget_->closeProjects();
  6466. + carto_widget_->closeProjectsKeepViewport();
  6467. }
  6468.  
  6469. carto_widget_->openProjectWithGlobalSyle(directory_name);
  6470. }
  6471. }
  6472.  
  6473. +void MainWindowImpl::onCloseProjectsTriggered()
  6474. +{
  6475. + carto_widget_->closeProjects();
  6476. + open_project_with_global_styles_from_folder_menu_->setEnabled(false);
  6477. + open_project_with_global_styles_from_2gis_menu_->setEnabled(false);
  6478. +}
  6479. +
  6480. void MainWindowImpl::onOpenProjects2gisTriggered()
  6481. {
  6482. QStringList file_names = QFileDialog::getOpenFileNames(
  6483. @@ -4293,7 +4300,7 @@ void MainWindowImpl::createFileMenu()
  6484.  
  6485. close_project_menu_ = file->addMenu(tr("&Close project"));
  6486. connect(close_project_menu_, SIGNAL(aboutToShow()), this, SLOT(onCloseProjectMenuShow()));
  6487. - close_project_menu_->addAction(tr("&All"), carto_widget_, SLOT(closeProjects()), tr("Ctrl+W"));
  6488. + close_project_menu_->addAction(tr("&All"), this, SLOT(onCloseProjectsTriggered()), tr("Ctrl+W"));
  6489. close_project_menu_->addSeparator();
  6490.  
  6491. file->addSeparator();
  6492. diff --git a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  6493. index 077c20c..23622e9 100644
  6494. --- a/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  6495. +++ b/Projects/CartoQtTestAppLib/src/MainWindowImpl.hqt
  6496. @@ -139,6 +139,8 @@ private slots:
  6497. void onOpenGlobalStylesProject2gisTriggered();
  6498. void onOpenGlobalStylesProjectMap3dTriggered();
  6499.  
  6500. + void onCloseProjectsTriggered();
  6501. +
  6502. void onCopyMapPositionTriggered();
  6503. void onCopyGeoPositionTriggered();
  6504.  
  6505. --
  6506. 1.9.5.msysgit.1
  6507.  
  6508. From b2aca8874dba0986fc886722844d7fc5e12a34b6 Mon Sep 17 00:00:00 2001
  6509. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  6510. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  6511. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  6512. Date: Fri, 10 Jul 2015 15:43:29 +0600
  6513. Subject: [PATCH 20/24] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?=
  6514. =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8.?=
  6515. MIME-Version: 1.0
  6516. Content-Type: text/plain; charset=UTF-8
  6517. Content-Transfer-Encoding: 8bit
  6518.  
  6519. ---
  6520. Projects/Benchmark/src/Benchmark.cpp | 16 ++++++++--
  6521. Projects/MakeBinaryModels/src/MakeBinaryModels.cpp | 34 +++++++++++-----------
  6522. Projects/tmCore/ScopeGuard.h | 6 ++++
  6523. .../src/ColladaReaders/CColladaProvider.cpp | 13 +++++++--
  6524. 4 files changed, 46 insertions(+), 23 deletions(-)
  6525.  
  6526. diff --git a/Projects/Benchmark/src/Benchmark.cpp b/Projects/Benchmark/src/Benchmark.cpp
  6527. index 9b716fd..0d72fcd 100644
  6528. --- a/Projects/Benchmark/src/Benchmark.cpp
  6529. +++ b/Projects/Benchmark/src/Benchmark.cpp
  6530. @@ -4,6 +4,8 @@
  6531.  
  6532. #include <tmCore/Config.h>
  6533. #include <tmCore/Timer.h>
  6534. +#include <tmCore/ScopeGuard.h>
  6535. +
  6536. #include <tmRender/CSurfaceManager.h>
  6537. #include <tmRender/RenderCounters.inl>
  6538. #include <tmGL/COpenGLRender.h>
  6539. @@ -426,13 +428,21 @@ Result Benchmark::run(const Configuration &configuration)
  6540. std::placeholders::_3)
  6541. : Carto::PresentFunction());
  6542.  
  6543. - viewport->add_project(
  6544. - project,
  6545. - view_settings,
  6546. + const auto styles = viewport->prepare_styles(
  6547. style_folder,
  6548. "3d.style",
  6549. Carto::DataValidationErrorsFunction());
  6550.  
  6551. + const auto styles_deleter = tme::make_guard([&styles, &viewport]()
  6552. + {
  6553. + viewport->free_styles(styles);
  6554. + });
  6555. +
  6556. + viewport->add_project(
  6557. + project,
  6558. + view_settings,
  6559. + styles);
  6560. +
  6561. viewport->set_animation_type(Carto::AnimationTypeNone);
  6562. if (models_visibility_type)
  6563. {
  6564. diff --git a/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp b/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
  6565. index 13cfa88..51fdc4f 100644
  6566. --- a/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
  6567. +++ b/Projects/MakeBinaryModels/src/MakeBinaryModels.cpp
  6568. @@ -174,6 +174,23 @@ int main(const int argc, char ** const argv)
  6569. }
  6570.  
  6571. po::notify(params);
  6572. +
  6573. + const std::string input_folder_utf8 = params["input"].as<std::string>();
  6574. + const std::string output_folder_utf8 = params["output"].as<std::string>();
  6575. +
  6576. + const auto surface_manager = std::make_shared<tme::tmrender::CSurfaceManager>(
  6577. + nullptr,
  6578. + std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
  6579. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
  6580. + tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
  6581. +
  6582. + const auto input_folder_ptr = ::UniFS_StdFS::CreateDir(input_folder_utf8, "/");
  6583. + const auto output_folder_ptr = std::make_shared<FolderImpl>(UTF_Utils::UTF8ToWString(output_folder_utf8));
  6584. + tme::tmrender::ModelManager model_manager(input_folder_ptr);
  6585. + model_manager.setImageLoader(*surface_manager);
  6586. +
  6587. + tme::tmrender::CModelBinaryFormatWriter binary_writer;
  6588. + binary_writer.convertColladaToBinary(model_manager, output_folder_ptr);
  6589. }
  6590. catch (const std::exception &error)
  6591. {
  6592. @@ -182,22 +199,5 @@ int main(const int argc, char ** const argv)
  6593. return 1;
  6594. }
  6595.  
  6596. - const std::string input_folder_utf8 = params["input"].as<std::string>();
  6597. - const std::string output_folder_utf8 = params["output"].as<std::string>();
  6598. -
  6599. - const auto surface_manager = std::make_shared<tme::tmrender::CSurfaceManager>(
  6600. - nullptr,
  6601. - std::initializer_list<tme::tmrender::CSurfaceManager::Loader>{
  6602. - tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderTGA()),
  6603. - tme::tmrender::CSurfaceManager::Loader(new SurfaceLoader::CSurfaceLoaderPNG())});
  6604. -
  6605. - const auto input_folder_ptr = ::UniFS_StdFS::CreateDir(input_folder_utf8, "/");
  6606. - const auto output_folder_ptr = std::make_shared<FolderImpl>(UTF_Utils::UTF8ToWString(output_folder_utf8));
  6607. - tme::tmrender::ModelManager model_manager(input_folder_ptr);
  6608. - model_manager.setImageLoader(*surface_manager);
  6609. -
  6610. - tme::tmrender::CModelBinaryFormatWriter binary_writer;
  6611. - binary_writer.convertColladaToBinary(model_manager, output_folder_ptr);
  6612. -
  6613. return 0;
  6614. }
  6615. diff --git a/Projects/tmCore/ScopeGuard.h b/Projects/tmCore/ScopeGuard.h
  6616. index 762d946..6b59150 100644
  6617. --- a/Projects/tmCore/ScopeGuard.h
  6618. +++ b/Projects/tmCore/ScopeGuard.h
  6619. @@ -37,4 +37,10 @@ private:
  6620. T on_exit_;
  6621. };
  6622.  
  6623. +template<class P>
  6624. +inline ScopeGuard<P> make_guard(P on_exit)
  6625. +{
  6626. + return ScopeGuard<P>(on_exit);
  6627. +}
  6628. +
  6629. } // namespace tme
  6630. diff --git a/Projects/tmRender/src/ColladaReaders/CColladaProvider.cpp b/Projects/tmRender/src/ColladaReaders/CColladaProvider.cpp
  6631. index b4961f3..648a63f 100644
  6632. --- a/Projects/tmRender/src/ColladaReaders/CColladaProvider.cpp
  6633. +++ b/Projects/tmRender/src/ColladaReaders/CColladaProvider.cpp
  6634. @@ -52,9 +52,16 @@ ParsedModelData CColladaProvider::loadFromFile(
  6635.  
  6636. if (tinyxml2::XMLElement *collada_element = xml_reader.FirstChildElement(collada_.c_str()))
  6637. {
  6638. - collada::g_collada_tmp_polygon = new tm_size_type[COLLADA_TMP_POLYGON_CAPACITY];
  6639. - parser->read(collada_element);
  6640. - delete [] collada::g_collada_tmp_polygon;
  6641. + try
  6642. + {
  6643. + collada::g_collada_tmp_polygon = new tm_size_type[COLLADA_TMP_POLYGON_CAPACITY];
  6644. + parser->read(collada_element);
  6645. + }
  6646. + catch (...)
  6647. + {
  6648. + delete[] collada::g_collada_tmp_polygon;
  6649. + throw;
  6650. + }
  6651. }
  6652.  
  6653. return ParsedModelData(PModelScene(parser->buildModel(flags, color_type)), parser);
  6654. --
  6655. 1.9.5.msysgit.1
  6656.  
  6657. From f80af740f467ab10471960e77769e203db8a19e3 Mon Sep 17 00:00:00 2001
  6658. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  6659. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  6660. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  6661. Date: Mon, 13 Jul 2015 16:57:25 +0600
  6662. Subject: [PATCH 21/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?=
  6663. =?UTF-8?q?=D0=BE=20=D1=80=D1=83=D1=87=D0=BD=D0=BE=D0=B5=20=D0=BE=D1=81?=
  6664. =?UTF-8?q?=D0=B2=D0=BE=D0=B1=D0=BE=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20?=
  6665. =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9.?=
  6666. MIME-Version: 1.0
  6667. Content-Type: text/plain; charset=UTF-8
  6668. Content-Transfer-Encoding: 8bit
  6669.  
  6670. ---
  6671. Projects/Carto/Carto/Fwd.h | 2 +-
  6672. Projects/Carto/Carto/IViewport.h | 30 +---
  6673. Projects/Carto/Carto/Viewport.h | 24 ++-
  6674. Projects/Carto/src/Carto/StyleSetCache.cpp | 103 +++++++++---
  6675. Projects/Carto/src/Carto/StyleSetCache.h | 36 ++++-
  6676. Projects/Carto/src/Carto/Viewport.cpp | 211 +++++++++----------------
  6677. Projects/CartoQtTestAppLib/CartoWidget.hqt | 2 +-
  6678. Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 39 +----
  6679. 8 files changed, 214 insertions(+), 233 deletions(-)
  6680.  
  6681. diff --git a/Projects/Carto/Carto/Fwd.h b/Projects/Carto/Carto/Fwd.h
  6682. index 225574c..2bd9a0f 100644
  6683. --- a/Projects/Carto/Carto/Fwd.h
  6684. +++ b/Projects/Carto/Carto/Fwd.h
  6685. @@ -95,7 +95,7 @@ struct ProjectCoordinates;
  6686. struct ProjectInfo;
  6687. class ViewTrapezium;
  6688. struct ScreenPointPosition;
  6689. -struct Styles;
  6690. +class StylesProxy;
  6691.  
  6692. //! Тип необяЕательного диапаЕона масштабов.
  6693. typedef boost::optional<ScaleRange> OptionalScaleRange;
  6694. diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
  6695. index f8051a1..c8e6c21 100644
  6696. --- a/Projects/Carto/Carto/IViewport.h
  6697. +++ b/Projects/Carto/Carto/IViewport.h
  6698. @@ -81,7 +81,7 @@ public:
  6699. virtual void add_project(
  6700. const IProjectPtr &project,
  6701. const IViewSettingsPtr &view_settings,
  6702. - const std::shared_ptr<Styles> &styles) = 0;
  6703. + const std::shared_ptr<StylesProxy> &styles) = 0;
  6704.  
  6705. /*!
  6706. * Подготовка данных для добавления проекта в порт просмотра. Можно Еапускать в отдельной нити.
  6707. @@ -92,25 +92,13 @@ public:
  6708. * Еадании новой библиотеки стилей. Может выЕваться прямо иЕ конструктора. Можно укаЕать пустую функцию,
  6709. * тогда проверка не будет осуществляться.
  6710. */
  6711. - virtual std::shared_ptr<Styles> prepare_styles(
  6712. + virtual std::shared_ptr<StylesProxy> prepare_styles(
  6713. const UniFS::IDirPtr &style_folder,
  6714. const std::string &style_file_name,
  6715. const DataValidationErrorsFunction &data_validation_errors_callback) const = 0;
  6716.  
  6717. - /*!
  6718. - * Удалить все ссылки на стили иЕ внутренних структур данных. После выЕова этого метода стили не будут
  6719. - * восстанавливаться при смене контекста рендера. Данная функция никак не портит содержимое по переданному
  6720. - * укаЕателю и её действие можно отменить, к примеру, добавив проект с освобождёнными стилями. Для окончательной
  6721. - * выгруЕки всех данных, выЕывающей стороне так же необходимо освободить свою копию укаЕателя.
  6722. - *
  6723. - * \param styles стили, предварительно Еагруженные функцией 'prepare_styles'.
  6724. - */
  6725. - virtual void free_styles(
  6726. - const std::shared_ptr<Styles> &styles) = 0;
  6727. -
  6728. //! Удаление проекта иЕ порта просмотра.
  6729. - //! \return стили удалённого проекта.
  6730. - virtual std::shared_ptr<Styles> remove_project(const IProjectPtr &project) = 0;
  6731. + virtual void remove_project(const IProjectPtr &project) = 0;
  6732.  
  6733. /*!
  6734. * Получение карты, к которой привяЕана данная область просмотра.
  6735. @@ -141,13 +129,6 @@ public:
  6736. virtual IProjectConstPtrContainer visible_projects() const = 0;
  6737.  
  6738. /*!
  6739. - * Получение интерфейсов всех проектов, испольЕующих данные стили.
  6740. - * \return множество проектов.
  6741. - */
  6742. - virtual IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) = 0;
  6743. - virtual IProjectConstPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) const = 0;
  6744. -
  6745. - /*!
  6746. * Получение класса для управления отображением слоя по имени.
  6747. * \param project_id идентификатор проекта.
  6748. * \param name имя слоя.
  6749. @@ -435,11 +416,10 @@ public:
  6750. * \param project_id идентификатор проекта
  6751. * \param стили, предварительно Еагруженные функцией 'prepare_styles'.
  6752. * \param play_switch_animation флаг необходимости проигрывания анимации появления для уже Еагруженных объектов.
  6753. - * \return предыдущие настройки отображения для данного проекта.
  6754. */
  6755. - virtual std::shared_ptr<Styles> set_styles(
  6756. + virtual void set_styles(
  6757. ProjectId project_id,
  6758. - const std::shared_ptr<Styles> &styles,
  6759. + const std::shared_ptr<StylesProxy> &styles,
  6760. bool play_switch_animation = true) = 0;
  6761.  
  6762. /*!
  6763. diff --git a/Projects/Carto/Carto/Viewport.h b/Projects/Carto/Carto/Viewport.h
  6764. index 2109d1f..eb8c4f4 100644
  6765. --- a/Projects/Carto/Carto/Viewport.h
  6766. +++ b/Projects/Carto/Carto/Viewport.h
  6767. @@ -56,28 +56,24 @@ public:
  6768. public: // IViewport
  6769. virtual ViewportId id() const override;
  6770.  
  6771. - virtual void add_project(
  6772. - const IProjectPtr &project,
  6773. - const IViewSettingsPtr &view_settings,
  6774. - const std::shared_ptr<Styles> &styles) override;
  6775. -
  6776. - virtual std::shared_ptr<Styles> prepare_styles(
  6777. + virtual std::shared_ptr<StylesProxy> prepare_styles(
  6778. const UniFS::IDirPtr &style_folder,
  6779. const std::string &style_file_name,
  6780. const DataValidationErrorsFunction &data_validation_errors_callback) const override;
  6781.  
  6782. - virtual void free_styles(
  6783. - const std::shared_ptr<Styles> &styles) override;
  6784. -
  6785. - virtual std::shared_ptr<Styles> set_styles(
  6786. + virtual void add_project(
  6787. + const IProjectPtr &project,
  6788. + const IViewSettingsPtr &view_settings,
  6789. + const std::shared_ptr<StylesProxy> &styles) override;
  6790. +
  6791. + virtual void set_styles(
  6792. ProjectId project_id,
  6793. - const std::shared_ptr<Styles> &styles,
  6794. + const std::shared_ptr<StylesProxy> &styles,
  6795. bool play_switch_animation) override;
  6796.  
  6797. - virtual IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) override;
  6798. - virtual IProjectConstPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles) const override;
  6799. + virtual void remove_project(
  6800. + const IProjectPtr & project) override;
  6801.  
  6802. - virtual std::shared_ptr<Styles> remove_project(const IProjectPtr & project) override;
  6803. virtual ICartoPtr carto() const override;
  6804. virtual IProjectPtr project(ProjectId id) override;
  6805. virtual IProjectConstPtr project(ProjectId id) const override;
  6806. diff --git a/Projects/Carto/src/Carto/StyleSetCache.cpp b/Projects/Carto/src/Carto/StyleSetCache.cpp
  6807. index 21b8778..67cd483 100644
  6808. --- a/Projects/Carto/src/Carto/StyleSetCache.cpp
  6809. +++ b/Projects/Carto/src/Carto/StyleSetCache.cpp
  6810. @@ -26,6 +26,32 @@ std::shared_ptr<tme::CSymbolContainer> symbols_from_source(
  6811.  
  6812. } // namespace
  6813.  
  6814. +StylesProxy::StylesProxy(const std::shared_ptr<const StyleSetCache>& host, std::unique_ptr<Styles>&& styles)
  6815. + : host_(host)
  6816. + , styles_(std::move(styles))
  6817. +{
  6818. +}
  6819. +
  6820. +StylesProxy::~StylesProxy()
  6821. +{
  6822. + const auto cache = host_.lock();
  6823. +
  6824. + if (nullptr == cache)
  6825. + {
  6826. + UNILOG_ERROR << "cache has been deleted earlier than styles";
  6827. + }
  6828. + else
  6829. + {
  6830. + cache->schedule_styles_deletion(std::move(styles_));
  6831. + }
  6832. +}
  6833. +
  6834. +
  6835. +Styles& StylesProxy::get()
  6836. +{
  6837. + return *styles_.get();
  6838. +}
  6839. +
  6840. StylesLoadingData::StylesLoadingData(
  6841. UniFS::IDirPtr in_source_folder,
  6842. std::string in_source_file_name,
  6843. @@ -41,10 +67,11 @@ Styles::Styles(const StylesLoadingData& in_source)
  6844. {
  6845. }
  6846.  
  6847. -std::shared_ptr<Styles> StyleSetCache::prepare_styles(
  6848. +auto StyleSetCache::prepare_styles(
  6849. + const std::shared_ptr<const StyleSetCache>& host,
  6850. const ViewportId host_viewport_id,
  6851. const ISurfaceManagerPtr& reference_surface_manager,
  6852. - const StylesLoadingData& source)
  6853. + const StylesLoadingData& source) -> std::shared_ptr<StylesProxy>
  6854. {
  6855. UNI_ASSERT(nullptr != reference_surface_manager);
  6856.  
  6857. @@ -52,51 +79,91 @@ std::shared_ptr<Styles> StyleSetCache::prepare_styles(
  6858.  
  6859. const auto styles_storage = symbols_from_source(surface_manager, source);
  6860.  
  6861. - const auto new_styles_set = std::make_shared<Styles>(source);
  6862. + auto new_styles_set = std::make_unique<Styles>(source);
  6863.  
  6864. new_styles_set->viewport_id = host_viewport_id;
  6865. new_styles_set->storage = styles_storage;
  6866. new_styles_set->surface_manager = surface_manager;
  6867.  
  6868. - return new_styles_set;
  6869. + return std::make_shared<StylesProxy>(host, std::move(new_styles_set));
  6870. }
  6871.  
  6872. -void StyleSetCache::look_after(const std::shared_ptr<Styles>& target)
  6873. +void StyleSetCache::bind(const ProjectId project, const std::shared_ptr<StylesProxy>& styles)
  6874. {
  6875. - UNI_ASSERT(nullptr != target);
  6876. - style_sets_.insert(target);
  6877. + const auto found = bound_styles_.find(styles);
  6878. +
  6879. + if (found == bound_styles_.end())
  6880. + {
  6881. + bound_styles_.emplace(styles, std::set<ProjectId>{}).first->second.insert(project);
  6882. + }
  6883. + else
  6884. + {
  6885. + found->second.insert(project);
  6886. + }
  6887. }
  6888.  
  6889. -void StyleSetCache::adandon(const std::shared_ptr<Styles>& target)
  6890. +void StyleSetCache::unbind(const ProjectId project, const std::shared_ptr<StylesProxy>& styles)
  6891. {
  6892. - UNI_ASSERT(nullptr != target);
  6893. + const auto found = bound_styles_.find(styles);
  6894.  
  6895. - style_sets_.erase(target);
  6896. + if (found == bound_styles_.end())
  6897. + {
  6898. + UNILOG_WARNING << "projeect " << project << " has already been unbound";
  6899. + }
  6900. + else
  6901. + {
  6902. + auto& bound_projects = found->second;
  6903. +
  6904. + bound_projects.erase(project);
  6905. +
  6906. + if (bound_projects.empty())
  6907. + {
  6908. + bound_styles_.erase(found);
  6909. + }
  6910. + }
  6911. }
  6912.  
  6913. void StyleSetCache::external_render_context_lost()
  6914. {
  6915. - for (const auto& styles_set : style_sets_)
  6916. + for (const auto& item : bound_styles_)
  6917. {
  6918. - styles_set->storage.reset();
  6919. - styles_set->surface_manager->purge_uploaded_surfaces();
  6920. + auto& styles = item.first->get();
  6921. +
  6922. + styles.storage.reset();
  6923. + styles.surface_manager->purge_uploaded_surfaces();
  6924. }
  6925. }
  6926.  
  6927. void StyleSetCache::external_render_context_recreated()
  6928. {
  6929. - for (const auto& styles_set : style_sets_)
  6930. + for (const auto& item : bound_styles_)
  6931. {
  6932. - const auto new_styles_storage = symbols_from_source(styles_set->surface_manager, styles_set->source);
  6933. + auto& styles = item.first->get();
  6934. +
  6935. + const auto new_styles_storage = symbols_from_source(styles.surface_manager, styles.source);
  6936.  
  6937. - styles_set->storage = new_styles_storage;
  6938. + styles.storage = new_styles_storage;
  6939.  
  6940. const auto error_message = new_styles_storage->GetErrorString();
  6941. - if (nullptr != styles_set->source.data_validation_errors_callback && false == error_message.empty())
  6942. + const auto callback = styles.source.data_validation_errors_callback;
  6943. +
  6944. + if (nullptr != callback && false == error_message.empty())
  6945. {
  6946. - styles_set->source.data_validation_errors_callback(error_message);
  6947. + callback(error_message);
  6948. }
  6949. }
  6950. }
  6951.  
  6952. +void StyleSetCache::delete_scheduled_styles()
  6953. +{
  6954. + std::lock_guard<std::mutex> guard(deletion_queue_mutex_);
  6955. + to_be_deleted_.clear();
  6956. +}
  6957. +
  6958. +void StyleSetCache::schedule_styles_deletion(std::unique_ptr<Styles>&& styles) const
  6959. +{
  6960. + std::lock_guard<std::mutex> guard(deletion_queue_mutex_);
  6961. + to_be_deleted_.insert(std::move(styles));
  6962. +}
  6963. +
  6964. } // namespace Carto
  6965. diff --git a/Projects/Carto/src/Carto/StyleSetCache.h b/Projects/Carto/src/Carto/StyleSetCache.h
  6966. index 8aa6fb0..72fd261 100644
  6967. --- a/Projects/Carto/src/Carto/StyleSetCache.h
  6968. +++ b/Projects/Carto/src/Carto/StyleSetCache.h
  6969. @@ -7,6 +7,7 @@
  6970.  
  6971. #include <set>
  6972. #include <memory>
  6973. +#include <mutex>
  6974.  
  6975. namespace Carto
  6976. {
  6977. @@ -17,6 +18,7 @@ struct StylesLoadingData final
  6978. UniFS::IDirPtr source_folder,
  6979. std::string source_file_name,
  6980. DataValidationErrorsFunction data_validation_errors_callback);
  6981. + StylesLoadingData(const StylesLoadingData& other) = default;
  6982.  
  6983. const UniFS::IDirPtr folder;
  6984. const std::string file_name;
  6985. @@ -36,6 +38,25 @@ struct Styles final
  6986. const StylesLoadingData source;
  6987. };
  6988.  
  6989. +class StyleSetCache;
  6990. +
  6991. +class StylesProxy final
  6992. +{
  6993. +public:
  6994. +
  6995. + StylesProxy(const std::shared_ptr<const StyleSetCache>& host, std::unique_ptr<Styles>&& styles);
  6996. +
  6997. + ~StylesProxy();
  6998. +
  6999. + Styles& get();
  7000. +
  7001. +private:
  7002. +
  7003. + std::weak_ptr<const StyleSetCache> host_;
  7004. + std::unique_ptr<Styles> styles_;
  7005. +
  7006. +};
  7007. +
  7008. class StyleSetCache final
  7009. {
  7010. public:
  7011. @@ -45,20 +66,27 @@ public:
  7012. StyleSetCache(const StyleSetCache&) = delete;
  7013. StyleSetCache& operator=(const StyleSetCache&) = delete;
  7014.  
  7015. - static std::shared_ptr<Styles> prepare_styles(
  7016. + static std::shared_ptr<StylesProxy> prepare_styles(
  7017. + const std::shared_ptr<const StyleSetCache>& host,
  7018. ViewportId host_viewport_id,
  7019. const ISurfaceManagerPtr& surface_manager,
  7020. const StylesLoadingData& source);
  7021.  
  7022. - void look_after(const std::shared_ptr<Styles>& styles);
  7023. - void adandon(const std::shared_ptr<Styles>& styles);
  7024. + void bind(ProjectId user, const std::shared_ptr<StylesProxy>& styles);
  7025. + void unbind(ProjectId user, const std::shared_ptr<StylesProxy>& styles);
  7026. +
  7027. + void delete_scheduled_styles();
  7028. + void schedule_styles_deletion(std::unique_ptr<Styles>&& styles) const;
  7029.  
  7030. void external_render_context_lost();
  7031. void external_render_context_recreated();
  7032.  
  7033. private:
  7034.  
  7035. - std::set<const std::shared_ptr<Styles>> style_sets_;
  7036. + mutable std::mutex deletion_queue_mutex_;
  7037. + mutable std::set<std::unique_ptr<Styles>> to_be_deleted_;
  7038. +
  7039. + boost::unordered_map<const std::shared_ptr<StylesProxy>, std::set<ProjectId>> bound_styles_;
  7040.  
  7041. };
  7042.  
  7043. diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
  7044. index ed1b87c..890960c 100644
  7045. --- a/Projects/Carto/src/Carto/Viewport.cpp
  7046. +++ b/Projects/Carto/src/Carto/Viewport.cpp
  7047. @@ -296,29 +296,25 @@ public: // IViewportPrivate
  7048.  
  7049. public:
  7050. ViewportId id() const;
  7051. -
  7052. - void add_project(
  7053. - const IProjectPtr &project,
  7054. - const IViewSettingsPtr &view_settings,
  7055. - const std::shared_ptr<Styles> &project_view_data);
  7056.  
  7057. - std::shared_ptr<Styles> prepare_styles(
  7058. + std::shared_ptr<StylesProxy> prepare_styles(
  7059. const UniFS::IDirPtr &style_folder,
  7060. const std::string &style_file_name,
  7061. const DataValidationErrorsFunction &data_validation_errors_callback) const;
  7062.  
  7063. - std::shared_ptr<Styles> set_styles(
  7064. + void add_project(
  7065. + const IProjectPtr &project,
  7066. + const IViewSettingsPtr &view_settings,
  7067. + const std::shared_ptr<StylesProxy> &project_view_data);
  7068. +
  7069. + void set_styles(
  7070. ProjectId project_id,
  7071. - const std::shared_ptr<Styles> &styles,
  7072. + const std::shared_ptr<StylesProxy> &styles,
  7073. bool play_switch_animation);
  7074.  
  7075. - void free_styles(
  7076. - const std::shared_ptr<Styles> &styles);
  7077. + void remove_project(
  7078. + const IProjectPtr & project);
  7079.  
  7080. - IProjectPtrContainer projects_with_styles(const std::shared_ptr<Styles> &styles);
  7081. - IProjectConstPtrContainer const_projects_with_styles(const std::shared_ptr<Styles> &styles) const;
  7082. -
  7083. - std::shared_ptr<Styles> remove_project(const IProjectPtr & project);
  7084. ICartoPtr carto() const;
  7085. IProjectPtr project(ProjectId id);
  7086. IProjectPtrContainer projects();
  7087. @@ -485,7 +481,7 @@ private: // Types
  7088. const IProjectPtr& in_project,
  7089. const MapBox& in_bounding_box,
  7090. const IViewSettingsPtr& in_view_settings,
  7091. - std::shared_ptr<Styles> in_styles)
  7092. + std::shared_ptr<StylesProxy> in_styles)
  7093. : project(in_project)
  7094. , bounding_box(in_bounding_box)
  7095. , view_settings(in_view_settings)
  7096. @@ -497,7 +493,7 @@ private: // Types
  7097. IProjectPtr project;
  7098. MapBox bounding_box;
  7099. IViewSettingsPtr view_settings;
  7100. - std::shared_ptr<Styles> styles;
  7101. + std::shared_ptr<StylesProxy> styles;
  7102.  
  7103. /*
  7104. Флаг, который вЕводится для того, чтобы перевести состояние анимируемых объектов сцены сраЕу в финальное
  7105. @@ -520,7 +516,8 @@ private:
  7106. void camera_changed(const MapPosition &position);
  7107. void process_viewport_change(ViewportChangeType type);
  7108.  
  7109. - void process_dynamic_views(const std::function<void(IDynamicLayerView *)> &function);
  7110. + template<typename T>
  7111. + void process_dynamic_views(const T& function);
  7112.  
  7113. // Установка/восстановление параметров для ЕагруЕки всех объектов карты.
  7114. void begin_whole_map_scene_processing(
  7115. @@ -606,7 +603,7 @@ private:
  7116.  
  7117. std::unique_ptr<IndoorController> indoor_controller_;
  7118.  
  7119. - StyleSetCache style_set_cache_;
  7120. + std::shared_ptr<StyleSetCache> style_set_cache_;
  7121. };
  7122.  
  7123. Viewport::Impl::Impl(
  7124. @@ -658,6 +655,7 @@ Viewport::Impl::Impl(
  7125. , force_visible_layers_(force_visible_layers)
  7126. , force_invisible_layers_(force_invisible_layers)
  7127. , is_primary_viewport_(is_primary_viewport)
  7128. + , style_set_cache_(std::make_shared<StyleSetCache>())
  7129. {
  7130. UNI_ASSERT(carto_);
  7131. UNI_ASSERT(need_redraw_function_);
  7132. @@ -751,7 +749,10 @@ Viewport::Impl::Impl(
  7133. *this,
  7134. *view_,
  7135. *navigator_.get(),
  7136. - std::bind(&Viewport::Impl::prepare_frame_rendering, this, std::placeholders::_1),
  7137. + [this](tme::tmrender::AnimationContext& context)
  7138. + {
  7139. + return prepare_frame_rendering(context);
  7140. + },
  7141. need_redraw_function_,
  7142. #ifdef TM_USE_EXTERNAL_RENDER
  7143. render_,
  7144. @@ -806,9 +807,9 @@ ViewportId Viewport::Impl::id() const
  7145. return ViewportId(reinterpret_cast<boost::uintptr_t>(view_.get()));
  7146. }
  7147.  
  7148. -std::shared_ptr<Styles> Viewport::Impl::set_styles(
  7149. +void Viewport::Impl::set_styles(
  7150. const ProjectId project_id,
  7151. - const std::shared_ptr<Styles>& styles,
  7152. + const std::shared_ptr<StylesProxy>& styles,
  7153. const bool play_switch_animation)
  7154. {
  7155. UNI_ASSERT(nullptr != styles);
  7156. @@ -817,56 +818,36 @@ std::shared_ptr<Styles> Viewport::Impl::set_styles(
  7157.  
  7158. if (target_project != projects_.end())
  7159. {
  7160. - style_set_cache_.look_after(styles);
  7161. + style_set_cache_->unbind(project_id, target_project->second.styles);
  7162. + style_set_cache_->bind(project_id, styles);
  7163.  
  7164. - const auto old_styles = target_project->second.styles;
  7165. target_project->second.styles = styles;
  7166. target_project->second.finish_animation = !play_switch_animation;
  7167.  
  7168. carto_->private_interface().set_viewport_styles(
  7169. project_id,
  7170. id(),
  7171. - styles->storage,
  7172. + styles->get().storage,
  7173. nullptr);
  7174.  
  7175. process_dynamic_views(
  7176. - [&styles](IDynamicLayerView* const dynamic_layer_view)
  7177. - {
  7178. - dynamic_layer_view->set_styles(styles->storage);
  7179. - });
  7180. + [&styles](IDynamicLayerView& dynamic_layer_view)
  7181. + {
  7182. + dynamic_layer_view.set_styles(styles->get().storage);
  7183. + });
  7184.  
  7185. need_redraw_function_();
  7186. - return old_styles;
  7187. }
  7188.  
  7189. UNILOG_WARNING << "trying to set styles on a absent project with id " << project_id;
  7190. - return {};
  7191. -}
  7192. -
  7193. -void Viewport::Impl::free_styles(const std::shared_ptr<Styles>& styles)
  7194. -{
  7195. - UNI_ASSERT(nullptr != styles);
  7196. -
  7197. -#ifdef UNI_ASSERT_ENABLED
  7198. - for (const auto& item : projects_)
  7199. - {
  7200. - if (item.second.styles == styles)
  7201. - {
  7202. - UNILOG_WARNING << "freeing styles bound to a project";
  7203. - break;
  7204. - }
  7205. - }
  7206. -#endif // #ifdef UNI_ASSERT_ENABLED
  7207. -
  7208. - style_set_cache_.adandon(styles);
  7209. }
  7210.  
  7211. void Viewport::Impl::add_project(
  7212. const IProjectPtr& in_project,
  7213. const IViewSettingsPtr& in_view_settings,
  7214. - const std::shared_ptr<Styles>& in_styles)
  7215. + const std::shared_ptr<StylesProxy>& in_styles)
  7216. {
  7217. - UNI_ASSERT(in_styles->viewport_id == id());
  7218. + UNI_ASSERT(in_styles->get().viewport_id == id());
  7219.  
  7220. check_project_before_add(in_project, in_view_settings);
  7221.  
  7222. @@ -880,16 +861,16 @@ void Viewport::Impl::add_project(
  7223. in_styles
  7224. });
  7225.  
  7226. - auto error_string = get_styles_loading_errors(*in_styles);
  7227. + auto error_string = get_styles_loading_errors(in_styles->get());
  7228.  
  7229. - const auto data_validation_errors_callback = in_styles->source.data_validation_errors_callback;
  7230. + const auto data_validation_errors_callback = in_styles->get().source.data_validation_errors_callback;
  7231.  
  7232. // Регистрируем проект в Carto и ЕагруЕчике
  7233. carto_->private_interface().add_project(
  7234. in_project,
  7235. parent_,
  7236. in_view_settings,
  7237. - in_styles->storage,
  7238. + in_styles->get().storage,
  7239. models_visibility_type_,
  7240. data_validation_errors_callback ? &error_string : nullptr);
  7241.  
  7242. @@ -898,32 +879,33 @@ void Viewport::Impl::add_project(
  7243. data_validation_errors_callback(error_string);
  7244. }
  7245.  
  7246. - style_set_cache_.look_after(in_styles);
  7247. + style_set_cache_->bind(in_project->id(), in_styles);
  7248. }
  7249.  
  7250. -std::shared_ptr<Styles> Viewport::Impl::prepare_styles(
  7251. +std::shared_ptr<StylesProxy> Viewport::Impl::prepare_styles(
  7252. const UniFS::IDirPtr &style_folder,
  7253. const std::string &style_file_name,
  7254. const DataValidationErrorsFunction &data_validation_errors_callback) const
  7255. {
  7256. return StyleSetCache::prepare_styles(
  7257. + style_set_cache_,
  7258. id(),
  7259. surface_manager_,
  7260. { style_folder, style_file_name, data_validation_errors_callback });
  7261. }
  7262.  
  7263. -std::shared_ptr<Styles> Viewport::Impl::remove_project(const IProjectPtr &in_project)
  7264. +void Viewport::Impl::remove_project(const IProjectPtr &in_project)
  7265. {
  7266. carto_->private_interface().remove_project(in_project, parent_);
  7267.  
  7268. const auto project_view_iter = projects_.find(in_project->id());
  7269. - const auto styles = project_view_iter->second.styles;
  7270. UNI_ASSERT(project_view_iter != projects_.end());
  7271. +
  7272. + style_set_cache_->unbind(in_project->id(), project_view_iter->second.styles);
  7273. projects_.erase(project_view_iter);
  7274. + style_set_cache_->delete_scheduled_styles();
  7275.  
  7276. // GTODO: unregister screen coordinates ?
  7277. -
  7278. - return styles;
  7279. }
  7280.  
  7281. std::chrono::milliseconds Viewport::Impl::current_time() const
  7282. @@ -946,8 +928,10 @@ ISymbolContainerPtr Viewport::Impl::styles(const ProjectId project_id) const
  7283. const auto project_iter = projects_.find(project_id);
  7284. if (project_iter != projects_.end())
  7285. {
  7286. - UNI_ASSERT(project_iter->second.styles->storage);
  7287. - return project_iter->second.styles->storage;
  7288. + auto styles_set = project_iter->second.styles->get();
  7289. +
  7290. + UNI_ASSERT(styles_set.storage);
  7291. + return styles_set.storage;
  7292. }
  7293.  
  7294. return {};
  7295. @@ -1054,36 +1038,6 @@ IProjectConstPtrContainer Viewport::Impl::const_projects() const
  7296. return project_container;
  7297. }
  7298.  
  7299. -IProjectPtrContainer Viewport::Impl::projects_with_styles(const std::shared_ptr<Styles> &styles)
  7300. -{
  7301. - auto result = tme::make_vector_with_capacity<IProjectPtr>(projects_.size());
  7302. -
  7303. - for (const auto& item : projects_)
  7304. - {
  7305. - if (item.second.styles == styles)
  7306. - {
  7307. - result.push_back(item.second.project);
  7308. - }
  7309. - }
  7310. -
  7311. - return result;
  7312. -}
  7313. -
  7314. -IProjectConstPtrContainer Viewport::Impl::const_projects_with_styles(const std::shared_ptr<Styles> &styles) const
  7315. -{
  7316. - auto result = tme::make_vector_with_capacity<IProjectConstPtr>(projects_.size());
  7317. -
  7318. - for (const auto& item : projects_)
  7319. - {
  7320. - if (item.second.styles == styles)
  7321. - {
  7322. - result.push_back(item.second.project);
  7323. - }
  7324. - }
  7325. -
  7326. - return result;
  7327. -}
  7328. -
  7329. IProjectPtrContainer Viewport::Impl::visible_projects() const
  7330. {
  7331. if (projects_.empty())
  7332. @@ -1577,19 +1531,19 @@ void Viewport::Impl::set_view_settings(
  7333. const auto found_project = projects_.find(project_id);
  7334. if (found_project != projects_.end())
  7335. {
  7336. - const auto project_styles = found_project->second.styles;
  7337. + const auto& project_styles = found_project->second.styles->get();
  7338. found_project->second.project->private_interface().remove_viewport(parent_);
  7339.  
  7340. std::string error_string;
  7341. found_project->second.view_settings = in_view_settings;
  7342.  
  7343. - const auto styles_loading_errors_callback = project_styles->source.data_validation_errors_callback;
  7344. + const auto& styles_loading_errors_callback = project_styles.source.data_validation_errors_callback;
  7345.  
  7346. carto_->private_interface().set_viewport_view(
  7347. project_id,
  7348. id(),
  7349. in_view_settings,
  7350. - project_styles->storage,
  7351. + project_styles.storage,
  7352. styles_loading_errors_callback ? &error_string : nullptr);
  7353.  
  7354. found_project->second.project->private_interface().connect_viewport(parent_);
  7355. @@ -1657,7 +1611,7 @@ void Viewport::Impl::force_render_init()
  7356.  
  7357. void Viewport::Impl::external_render_context_lost()
  7358. {
  7359. - style_set_cache_.external_render_context_lost();
  7360. + style_set_cache_->external_render_context_lost();
  7361.  
  7362. for (auto& item : projects_)
  7363. {
  7364. @@ -1686,7 +1640,7 @@ void Viewport::Impl::external_render_context_recreated()
  7365. }
  7366. #endif // TM_USE_EXTERNAL_RENDER
  7367.  
  7368. - style_set_cache_.external_render_context_recreated();
  7369. + style_set_cache_->external_render_context_recreated();
  7370.  
  7371. for (const auto& item : projects_)
  7372. {
  7373. @@ -1694,7 +1648,7 @@ void Viewport::Impl::external_render_context_recreated()
  7374. item.second.project,
  7375. parent_,
  7376. item.second.view_settings,
  7377. - item.second.styles->storage,
  7378. + item.second.styles->get().storage,
  7379. models_visibility_type_,
  7380. nullptr);
  7381. }
  7382. @@ -1946,8 +1900,14 @@ bool Viewport::Impl::animate_projects(tme::tmrender::AnimationContext & context)
  7383.  
  7384. bool Viewport::Impl::prepare_frame_rendering(tme::tmrender::AnimationContext & context)
  7385. {
  7386. + style_set_cache_->delete_scheduled_styles();
  7387. +
  7388. // Подготавливаем данные динамических слоёв
  7389. - process_dynamic_views(std::bind(&IDynamicLayerView::prepare, std::placeholders::_1));
  7390. + process_dynamic_views(
  7391. + [](IDynamicLayerView& dynamic_layer_view)
  7392. + {
  7393. + dynamic_layer_view.prepare();
  7394. + });
  7395.  
  7396. // Анимируем объекты
  7397. const bool is_redraw_needed = animate_projects(context);
  7398. @@ -2010,18 +1970,21 @@ void Viewport::Impl::camera_changed(const MapPosition &)
  7399.  
  7400. void Viewport::Impl::process_viewport_change(ViewportChangeType type)
  7401. {
  7402. - process_dynamic_views(std::bind(&IDynamicLayerView::process_viewport_change, std::placeholders::_1, type));
  7403. + process_dynamic_views(
  7404. + [type](IDynamicLayerView& dynamic_layer_view)
  7405. + {
  7406. + dynamic_layer_view.process_viewport_change(type);
  7407. + });
  7408. }
  7409.  
  7410. -void Viewport::Impl::process_dynamic_views(const std::function<void(IDynamicLayerView *)> &function)
  7411. +template<typename T>
  7412. +void Viewport::Impl::process_dynamic_views(const T& function)
  7413. {
  7414. - UNI_ASSERT(function);
  7415. -
  7416. for (const LayerViewContainer::value_type &data : layer_views_)
  7417. {
  7418. if (data.view->is_dynamic())
  7419. {
  7420. - function(tme::checked_cast<IDynamicLayerView *>(data.view.get()));
  7421. + function(*tme::checked_cast<IDynamicLayerView*>(data.view.get()));
  7422. }
  7423. }
  7424. }
  7425. @@ -2214,12 +2177,12 @@ ViewportId Viewport::id() const
  7426. void Viewport::add_project(
  7427. const IProjectPtr &in_project,
  7428. const IViewSettingsPtr &in_view_settings,
  7429. - const std::shared_ptr<Styles> &styles)
  7430. + const std::shared_ptr<StylesProxy> &styles)
  7431. {
  7432. impl_->add_project(in_project, in_view_settings, styles);
  7433. }
  7434.  
  7435. -std::shared_ptr<Styles> Viewport::prepare_styles(
  7436. +std::shared_ptr<StylesProxy> Viewport::prepare_styles(
  7437. const UniFS::IDirPtr &style_folder,
  7438. const std::string &style_file_name,
  7439. const DataValidationErrorsFunction &data_validation_errors_callback) const
  7440. @@ -2230,9 +2193,9 @@ std::shared_ptr<Styles> Viewport::prepare_styles(
  7441. data_validation_errors_callback);
  7442. }
  7443.  
  7444. -std::shared_ptr<Styles> Viewport::remove_project(const IProjectPtr &in_project)
  7445. +void Viewport::remove_project(const IProjectPtr &in_project)
  7446. {
  7447. - return impl_->remove_project(in_project);
  7448. + impl_->remove_project(in_project);
  7449. }
  7450.  
  7451. ICartoPtr Viewport::carto() const
  7452. @@ -2270,16 +2233,6 @@ IProjectConstPtrContainer Viewport::visible_projects() const
  7453. return impl_->visible_const_projects();
  7454. }
  7455.  
  7456. -IProjectPtrContainer Viewport::projects_with_styles(const std::shared_ptr<Styles>& styles)
  7457. -{
  7458. - return impl_->projects_with_styles(styles);
  7459. -}
  7460. -
  7461. -IProjectConstPtrContainer Viewport::projects_with_styles(const std::shared_ptr<Styles>& styles) const
  7462. -{
  7463. - return impl_->const_projects_with_styles(styles);
  7464. -}
  7465. -
  7466. IViewportLayerProxyPtr Viewport::layer(const ProjectId project_id, const std::string &name) const
  7467. {
  7468. return impl_->layer(project_id, name);
  7469. @@ -2513,31 +2466,19 @@ void Viewport::set_view_settings(
  7470. impl_->set_view_settings(project_id, in_view_settings, play_switch_animation);
  7471. }
  7472.  
  7473. -
  7474. -void Viewport::free_styles(const std::shared_ptr<Styles>& styles)
  7475. -{
  7476. - if (nullptr == styles)
  7477. - {
  7478. - UNILOG_ERROR << "can't free null styles";
  7479. - }
  7480. - else
  7481. - {
  7482. - impl_->free_styles(styles);
  7483. - }
  7484. -}
  7485. -
  7486. -std::shared_ptr<Styles> Viewport::set_styles(
  7487. +void Viewport::set_styles(
  7488. const ProjectId project_id,
  7489. - const std::shared_ptr<Styles>& styles,
  7490. + const std::shared_ptr<StylesProxy>& styles,
  7491. const bool play_switch_animation)
  7492. {
  7493. if (nullptr == styles)
  7494. {
  7495. UNILOG_ERROR << "can't apply null styles";
  7496. - return{};
  7497. }
  7498. -
  7499. - return impl_->set_styles(project_id, styles, play_switch_animation);
  7500. + else
  7501. + {
  7502. + impl_->set_styles(project_id, styles, play_switch_animation);
  7503. + }
  7504. }
  7505.  
  7506. boost::optional<float> Viewport::max_3d_scale(const ProjectId project_id) const
  7507. diff --git a/Projects/CartoQtTestAppLib/CartoWidget.hqt b/Projects/CartoQtTestAppLib/CartoWidget.hqt
  7508. index f7b3819..9db959f 100644
  7509. --- a/Projects/CartoQtTestAppLib/CartoWidget.hqt
  7510. +++ b/Projects/CartoQtTestAppLib/CartoWidget.hqt
  7511. @@ -368,7 +368,7 @@ private:
  7512. boost::unordered_map<ProjectId, ProjectParameters> projects_;
  7513. ActivityContainer viewport_activities_;
  7514.  
  7515. - std::shared_ptr<Styles> cached_styles_;
  7516. + std::shared_ptr<StylesProxy> cached_styles_;
  7517.  
  7518. ICartoPtr carto_;
  7519. std::shared_ptr<RenderTimeScaled> render_time_;
  7520. diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7521. index 48c61c4..d55e1ae 100644
  7522. --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7523. +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7524. @@ -892,19 +892,8 @@ void CartoWidget::loadGlobalStyles(const QString & file_name)
  7525.  
  7526. const auto styles_folder = get_style_folder(file_name.toUtf8().constData());
  7527. const auto on_unknown_symbol = std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1);
  7528. -
  7529. - const auto old_styles = cached_styles_;
  7530.  
  7531. cached_styles_ = viewport().prepare_styles(styles_folder, g_style_default, on_unknown_symbol);
  7532. -
  7533. - if (nullptr != old_styles)
  7534. - {
  7535. - for (const auto& project : viewport().projects_with_styles(old_styles))
  7536. - {
  7537. - viewport().set_styles(project->id(), cached_styles_);
  7538. - }
  7539. - viewport().free_styles(old_styles);
  7540. - }
  7541. }
  7542. catch (const std::exception& e)
  7543. {
  7544. @@ -988,12 +977,7 @@ void CartoWidget::closeProjects(const bool emit_signal)
  7545.  
  7546. for (const auto & params : projects_)
  7547. {
  7548. - const auto styles = viewport().remove_project(params.second.project_ptr);
  7549. -
  7550. - if (styles != cached_styles_)
  7551. - {
  7552. - viewport().free_styles(styles);
  7553. - }
  7554. + viewport().remove_project(params.second.project_ptr);
  7555. }
  7556. UNI_ASSERT(viewport().projects().empty());
  7557.  
  7558. @@ -1018,12 +1002,7 @@ void CartoWidget::closeProject(const ProjectId project_id)
  7559.  
  7560. if (currentCartoWidget())
  7561. {
  7562. - const auto styles = viewport().remove_project(project_ptr);
  7563. -
  7564. - if (viewport().projects_with_styles(styles).empty() && styles != cached_styles_)
  7565. - {
  7566. - viewport().free_styles(styles);
  7567. - }
  7568. + viewport().remove_project(project_ptr);
  7569. }
  7570.  
  7571. deinitActivities(project_id);
  7572. @@ -1058,12 +1037,7 @@ void CartoWidget::setStylesPath(ProjectId project_id, const QString & styles_pat
  7573. params.style_file_name,
  7574. std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  7575.  
  7576. - const auto old_styles = viewport().set_styles(project_id, styles);
  7577. -
  7578. - if (viewport().projects_with_styles(old_styles).empty() && cached_styles_ != old_styles)
  7579. - {
  7580. - viewport().free_styles(old_styles);
  7581. - }
  7582. + viewport().set_styles(project_id, styles);
  7583. }
  7584. emit stylesOpened(project_id);
  7585. }
  7586. @@ -1372,12 +1346,7 @@ void CartoWidget::setStyle(ProjectId project_id, const QString & style_file_name
  7587. params.style_file_name,
  7588. std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  7589.  
  7590. - const auto old_styles = viewport().set_styles(project_id, styles);
  7591. -
  7592. - if (viewport().projects_with_styles(old_styles).empty() && cached_styles_ != old_styles)
  7593. - {
  7594. - viewport().free_styles(old_styles);
  7595. - }
  7596. + viewport().set_styles(project_id, styles);
  7597. }
  7598. }
  7599. }
  7600. --
  7601. 1.9.5.msysgit.1
  7602.  
  7603. From 82392920ff4314a1190a58bb2f742094b03249fa Mon Sep 17 00:00:00 2001
  7604. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  7605. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  7606. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  7607. Date: Mon, 13 Jul 2015 17:36:41 +0600
  7608. Subject: [PATCH 22/24] =?UTF-8?q?=D0=91=D0=B5=D0=BD=D1=87=D0=BC=D0=B0?=
  7609. =?UTF-8?q?=D1=80=D0=BA=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BA?=
  7610. =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D0=B8=D1=80=D1=83=D0=B5=D1=82?=
  7611. =?UTF-8?q?=D1=81=D1=8F.?=
  7612. MIME-Version: 1.0
  7613. Content-Type: text/plain; charset=UTF-8
  7614. Content-Transfer-Encoding: 8bit
  7615.  
  7616. ---
  7617. Projects/Benchmark/src/Benchmark.cpp | 5 -----
  7618. 1 file changed, 5 deletions(-)
  7619.  
  7620. diff --git a/Projects/Benchmark/src/Benchmark.cpp b/Projects/Benchmark/src/Benchmark.cpp
  7621. index 0d72fcd..80d9b10 100644
  7622. --- a/Projects/Benchmark/src/Benchmark.cpp
  7623. +++ b/Projects/Benchmark/src/Benchmark.cpp
  7624. @@ -433,11 +433,6 @@ Result Benchmark::run(const Configuration &configuration)
  7625. "3d.style",
  7626. Carto::DataValidationErrorsFunction());
  7627.  
  7628. - const auto styles_deleter = tme::make_guard([&styles, &viewport]()
  7629. - {
  7630. - viewport->free_styles(styles);
  7631. - });
  7632. -
  7633. viewport->add_project(
  7634. project,
  7635. view_settings,
  7636. --
  7637. 1.9.5.msysgit.1
  7638.  
  7639. From cd891496c96eeba20a3f1a8a9c305583091b2c7b Mon Sep 17 00:00:00 2001
  7640. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  7641. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  7642. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  7643. Date: Tue, 14 Jul 2015 10:01:18 +0600
  7644. Subject: [PATCH 23/24] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD?=
  7645. =?UTF-8?q?=D0=B8=D0=BB=20code=20review.?=
  7646. MIME-Version: 1.0
  7647. Content-Type: text/plain; charset=UTF-8
  7648. Content-Transfer-Encoding: 8bit
  7649.  
  7650. ---
  7651. Projects/Carto/Carto/IViewport.h | 2 +-
  7652. Projects/Carto/src/Carto/StyleSetCache.cpp | 36 +++++++++++++++++++-------
  7653. Projects/Carto/src/Carto/Viewport.cpp | 16 ++++++------
  7654. Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 6 ++---
  7655. 4 files changed, 38 insertions(+), 22 deletions(-)
  7656.  
  7657. diff --git a/Projects/Carto/Carto/IViewport.h b/Projects/Carto/Carto/IViewport.h
  7658. index c8e6c21..8e57e28 100644
  7659. --- a/Projects/Carto/Carto/IViewport.h
  7660. +++ b/Projects/Carto/Carto/IViewport.h
  7661. @@ -98,7 +98,7 @@ public:
  7662. const DataValidationErrorsFunction &data_validation_errors_callback) const = 0;
  7663.  
  7664. //! Удаление проекта иЕ порта просмотра.
  7665. - virtual void remove_project(const IProjectPtr &project) = 0;
  7666. + virtual void remove_project(const IProjectPtr & project) = 0;
  7667.  
  7668. /*!
  7669. * Получение карты, к которой привяЕана данная область просмотра.
  7670. diff --git a/Projects/Carto/src/Carto/StyleSetCache.cpp b/Projects/Carto/src/Carto/StyleSetCache.cpp
  7671. index 67cd483..7d89b0a 100644
  7672. --- a/Projects/Carto/src/Carto/StyleSetCache.cpp
  7673. +++ b/Projects/Carto/src/Carto/StyleSetCache.cpp
  7674. @@ -13,13 +13,11 @@ namespace
  7675. {
  7676.  
  7677. std::shared_ptr<tme::CSymbolContainer> symbols_from_source(
  7678. - const ISurfaceManagerPtr& surface_manager,
  7679. + tme::tmrender::ISurfaceManager& surface_manager,
  7680. const StylesLoadingData& source)
  7681. {
  7682. - UNI_ASSERT(nullptr != surface_manager);
  7683. -
  7684. return std::make_shared<tme::CSymbolContainer>(
  7685. - *surface_manager,
  7686. + surface_manager,
  7687. source.folder,
  7688. source.file_name);
  7689. }
  7690. @@ -46,7 +44,6 @@ StylesProxy::~StylesProxy()
  7691. }
  7692. }
  7693.  
  7694. -
  7695. Styles& StylesProxy::get()
  7696. {
  7697. return *styles_.get();
  7698. @@ -73,13 +70,17 @@ auto StyleSetCache::prepare_styles(
  7699. const ISurfaceManagerPtr& reference_surface_manager,
  7700. const StylesLoadingData& source) -> std::shared_ptr<StylesProxy>
  7701. {
  7702. - UNI_ASSERT(nullptr != reference_surface_manager);
  7703. + if (nullptr == reference_surface_manager)
  7704. + {
  7705. + UNILOG_ERROR << "surface manager is null";
  7706. + return {};
  7707. + }
  7708.  
  7709. const ISurfaceManagerPtr surface_manager(reference_surface_manager->clone(true));
  7710.  
  7711. - const auto styles_storage = symbols_from_source(surface_manager, source);
  7712. + const auto styles_storage = symbols_from_source(*surface_manager, source);
  7713.  
  7714. - auto new_styles_set = std::make_unique<Styles>(source);
  7715. + auto new_styles_set = std::unique_ptr<Styles>(new Styles(source));
  7716.  
  7717. new_styles_set->viewport_id = host_viewport_id;
  7718. new_styles_set->storage = styles_storage;
  7719. @@ -90,11 +91,24 @@ auto StyleSetCache::prepare_styles(
  7720.  
  7721. void StyleSetCache::bind(const ProjectId project, const std::shared_ptr<StylesProxy>& styles)
  7722. {
  7723. + if (nullptr == styles)
  7724. + {
  7725. + UNILOG_ERROR << "styles is null";
  7726. + return;
  7727. + }
  7728. +
  7729. + if (nullptr == styles->get().surface_manager)
  7730. + {
  7731. + UNILOG_ERROR << "styles without surface manager";
  7732. + return;
  7733. + }
  7734. +
  7735. const auto found = bound_styles_.find(styles);
  7736.  
  7737. if (found == bound_styles_.end())
  7738. {
  7739. - bound_styles_.emplace(styles, std::set<ProjectId>{}).first->second.insert(project);
  7740. + const auto new_binding = bound_styles_.emplace(styles, std::set<ProjectId>{});
  7741. + new_binding.first->second.insert(project);
  7742. }
  7743. else
  7744. {
  7745. @@ -128,6 +142,7 @@ void StyleSetCache::external_render_context_lost()
  7746. for (const auto& item : bound_styles_)
  7747. {
  7748. auto& styles = item.first->get();
  7749. + UNI_ASSERT(nullptr != styles.surface_manager);
  7750.  
  7751. styles.storage.reset();
  7752. styles.surface_manager->purge_uploaded_surfaces();
  7753. @@ -139,8 +154,9 @@ void StyleSetCache::external_render_context_recreated()
  7754. for (const auto& item : bound_styles_)
  7755. {
  7756. auto& styles = item.first->get();
  7757. + UNI_ASSERT(nullptr != styles.surface_manager);
  7758.  
  7759. - const auto new_styles_storage = symbols_from_source(styles.surface_manager, styles.source);
  7760. + const auto new_styles_storage = symbols_from_source(*styles.surface_manager, styles.source);
  7761.  
  7762. styles.storage = new_styles_storage;
  7763.  
  7764. diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
  7765. index 890960c..68cc7b3 100644
  7766. --- a/Projects/Carto/src/Carto/Viewport.cpp
  7767. +++ b/Projects/Carto/src/Carto/Viewport.cpp
  7768. @@ -809,37 +809,37 @@ ViewportId Viewport::Impl::id() const
  7769.  
  7770. void Viewport::Impl::set_styles(
  7771. const ProjectId project_id,
  7772. - const std::shared_ptr<StylesProxy>& styles,
  7773. + const std::shared_ptr<StylesProxy>& new_styles,
  7774. const bool play_switch_animation)
  7775. {
  7776. - UNI_ASSERT(nullptr != styles);
  7777. + UNI_ASSERT(nullptr != new_styles);
  7778.  
  7779. const auto target_project = projects_.find(project_id);
  7780.  
  7781. if (target_project != projects_.end())
  7782. {
  7783. style_set_cache_->unbind(project_id, target_project->second.styles);
  7784. - style_set_cache_->bind(project_id, styles);
  7785. + style_set_cache_->bind(project_id, new_styles);
  7786.  
  7787. - target_project->second.styles = styles;
  7788. + target_project->second.styles = new_styles;
  7789. target_project->second.finish_animation = !play_switch_animation;
  7790.  
  7791. carto_->private_interface().set_viewport_styles(
  7792. project_id,
  7793. id(),
  7794. - styles->get().storage,
  7795. + new_styles->get().storage,
  7796. nullptr);
  7797.  
  7798. process_dynamic_views(
  7799. - [&styles](IDynamicLayerView& dynamic_layer_view)
  7800. + [&new_styles](IDynamicLayerView& dynamic_layer_view)
  7801. {
  7802. - dynamic_layer_view.set_styles(styles->get().storage);
  7803. + dynamic_layer_view.set_styles(new_styles->get().storage);
  7804. });
  7805.  
  7806. need_redraw_function_();
  7807. }
  7808.  
  7809. - UNILOG_WARNING << "trying to set styles on a absent project with id " << project_id;
  7810. + UNILOG_WARNING << "trying to set styles on an absent project with id " << project_id;
  7811. }
  7812.  
  7813. void Viewport::Impl::add_project(
  7814. diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7815. index d55e1ae..492b2e4 100644
  7816. --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7817. +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7818. @@ -1990,16 +1990,16 @@ bool CartoWidget::addProjectToViewport(ProjectParameters & project_param)
  7819. view_settings_block);
  7820. UNI_ASSERT(view_settings);
  7821.  
  7822. - const auto styles = viewport().prepare_styles(
  7823. + const auto prepared_styles = viewport().prepare_styles(
  7824. project_param.styles_folder,
  7825. project_param.style_file_name,
  7826. std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  7827. - UNI_ASSERT(styles);
  7828. + UNI_ASSERT(prepared_styles);
  7829.  
  7830. viewport().add_project(
  7831. project_param.project_ptr,
  7832. view_settings,
  7833. - styles);
  7834. + prepared_styles);
  7835. }
  7836. catch (::Map::IO::FileNotFoundException &path_exception)
  7837. {
  7838. --
  7839. 1.9.5.msysgit.1
  7840.  
  7841. From caf8a489c51432de419379fc0694601a29e7133c Mon Sep 17 00:00:00 2001
  7842. From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=D0=B9=20=D0=94=D0=B5?=
  7843. =?UTF-8?q?=D0=BD=D0=B8=D1=81=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD?=
  7844. =?UTF-8?q?=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <d.gladkiy@2gis.ru>
  7845. Date: Tue, 14 Jul 2015 16:36:00 +0600
  7846. Subject: [PATCH 24/24] =?UTF-8?q?=D0=98=20=D0=B5=D1=89=D1=91=20=D0=B4?=
  7847. =?UTF-8?q?=D0=BE=D1=81=D1=8B=D0=BF=D0=B0=D0=BB=20=D0=BF=D1=80=D0=B0=D0=B2?=
  7848. =?UTF-8?q?=D0=BE=D0=BA=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?=
  7849. =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=20=D0=BE=D1=82=20=D0=BF=D0=BE?=
  7850. =?UTF-8?q?=D1=86=D0=BE=D0=BD=D0=BE=D0=B2=20=D0=B8=20=D0=BA=D0=BE=D0=BC?=
  7851. =?UTF-8?q?=D0=BF=D0=B8=D0=BB=D1=8F=D1=82=D0=BE=D1=80=D0=BE=D0=B2.?=
  7852. MIME-Version: 1.0
  7853. Content-Type: text/plain; charset=UTF-8
  7854. Content-Transfer-Encoding: 8bit
  7855.  
  7856. ---
  7857. Projects/AndroidTestApp/jni/AndroidTestApp.cpp | 9 ++++++---
  7858. Projects/Carto/src/Carto/StyleSetCache.cpp | 8 +++++---
  7859. Projects/Carto/src/Carto/Viewport.cpp | 9 +--------
  7860. Projects/CartoQtTestAppLib/src/CartoWidget.cpp | 12 ++++++------
  7861. 4 files changed, 18 insertions(+), 20 deletions(-)
  7862.  
  7863. diff --git a/Projects/AndroidTestApp/jni/AndroidTestApp.cpp b/Projects/AndroidTestApp/jni/AndroidTestApp.cpp
  7864. index 129dd1e..517f28c 100644
  7865. --- a/Projects/AndroidTestApp/jni/AndroidTestApp.cpp
  7866. +++ b/Projects/AndroidTestApp/jni/AndroidTestApp.cpp
  7867. @@ -92,12 +92,15 @@ int main(int, char *[])
  7868.  
  7869. const UniFS::IDirPtr style_folder = Carto::get_style_folder(map_path);
  7870.  
  7871. - window.viewport().add_project(
  7872. - project,
  7873. - view_settings,
  7874. + const auto new_styles = window.viewport().prepare_styles(
  7875. style_folder,
  7876. "3d.style",
  7877. Carto::DataValidationErrorsFunction());
  7878. +
  7879. + window.viewport().add_project(
  7880. + project,
  7881. + view_settings,
  7882. + new_styles);
  7883. }
  7884.  
  7885. window.viewport().navigator().set_position(window.viewport().navigator().full_map_position());
  7886. diff --git a/Projects/Carto/src/Carto/StyleSetCache.cpp b/Projects/Carto/src/Carto/StyleSetCache.cpp
  7887. index 7d89b0a..e88fe1f 100644
  7888. --- a/Projects/Carto/src/Carto/StyleSetCache.cpp
  7889. +++ b/Projects/Carto/src/Carto/StyleSetCache.cpp
  7890. @@ -1,10 +1,12 @@
  7891. #include "stable.h"
  7892.  
  7893. +#include "StyleSetCache.h"
  7894. +
  7895. #include <tmSymbol/CSymbolContainer.h>
  7896.  
  7897. #include <tmRender/ISurfaceManager.h>
  7898.  
  7899. -#include "StyleSetCache.h"
  7900. +#include <tmCore/make_unique.h>
  7901.  
  7902. namespace Carto
  7903. {
  7904. @@ -80,7 +82,7 @@ auto StyleSetCache::prepare_styles(
  7905.  
  7906. const auto styles_storage = symbols_from_source(*surface_manager, source);
  7907.  
  7908. - auto new_styles_set = std::unique_ptr<Styles>(new Styles(source));
  7909. + auto new_styles_set = tme::make_unique<Styles>(source);
  7910.  
  7911. new_styles_set->viewport_id = host_viewport_id;
  7912. new_styles_set->storage = styles_storage;
  7913. @@ -122,7 +124,7 @@ void StyleSetCache::unbind(const ProjectId project, const std::shared_ptr<Styles
  7914.  
  7915. if (found == bound_styles_.end())
  7916. {
  7917. - UNILOG_WARNING << "projeect " << project << " has already been unbound";
  7918. + UNILOG_WARNING << "project " << project << " has already been unbound";
  7919. }
  7920. else
  7921. {
  7922. diff --git a/Projects/Carto/src/Carto/Viewport.cpp b/Projects/Carto/src/Carto/Viewport.cpp
  7923. index 68cc7b3..9a773e5 100644
  7924. --- a/Projects/Carto/src/Carto/Viewport.cpp
  7925. +++ b/Projects/Carto/src/Carto/Viewport.cpp
  7926. @@ -2471,14 +2471,7 @@ void Viewport::set_styles(
  7927. const std::shared_ptr<StylesProxy>& styles,
  7928. const bool play_switch_animation)
  7929. {
  7930. - if (nullptr == styles)
  7931. - {
  7932. - UNILOG_ERROR << "can't apply null styles";
  7933. - }
  7934. - else
  7935. - {
  7936. - impl_->set_styles(project_id, styles, play_switch_animation);
  7937. - }
  7938. + impl_->set_styles(project_id, styles, play_switch_animation);
  7939. }
  7940.  
  7941. boost::optional<float> Viewport::max_3d_scale(const ProjectId project_id) const
  7942. diff --git a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7943. index 492b2e4..cc28579 100644
  7944. --- a/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7945. +++ b/Projects/CartoQtTestAppLib/src/CartoWidget.cpp
  7946. @@ -1032,12 +1032,12 @@ void CartoWidget::setStylesPath(ProjectId project_id, const QString & styles_pat
  7947. params.styles_folder = new_styles_folder;
  7948. if (currentCartoWidget())
  7949. {
  7950. - const auto styles = viewport().prepare_styles(
  7951. + const auto new_styles = viewport().prepare_styles(
  7952. params.styles_folder,
  7953. params.style_file_name,
  7954. std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  7955.  
  7956. - viewport().set_styles(project_id, styles);
  7957. + viewport().set_styles(project_id, new_styles);
  7958. }
  7959. emit stylesOpened(project_id);
  7960. }
  7961. @@ -1341,12 +1341,12 @@ void CartoWidget::setStyle(ProjectId project_id, const QString & style_file_name
  7962.  
  7963. if (currentCartoWidget())
  7964. {
  7965. - const auto styles = viewport().prepare_styles(
  7966. + const auto new_styles = viewport().prepare_styles(
  7967. params.styles_folder,
  7968. params.style_file_name,
  7969. std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  7970.  
  7971. - viewport().set_styles(project_id, styles);
  7972. + viewport().set_styles(project_id, new_styles);
  7973. }
  7974. }
  7975. }
  7976. @@ -1660,7 +1660,7 @@ void CartoWidget::initSlaveCartoWidget(
  7977. {
  7978. try
  7979. {
  7980. - const auto styles = widget_viewport.prepare_styles(
  7981. + const auto new_styles = widget_viewport.prepare_styles(
  7982. params.second.styles_folder,
  7983. params.second.style_file_name,
  7984. std::bind(&CartoWidget::signalUnknownSymbols, this, std::placeholders::_1));
  7985. @@ -1668,7 +1668,7 @@ void CartoWidget::initSlaveCartoWidget(
  7986. widget_viewport.add_project(
  7987. params.second.project_ptr,
  7988. reference_viewport.view_settings(params.second.project_ptr->id()),
  7989. - styles);
  7990. + new_styles);
  7991. }
  7992. catch (...)
  7993. {
  7994. --
  7995. 1.9.5.msysgit.1
Add Comment
Please, Sign In to add comment