MeshLib C++ Docs
Loading...
Searching...
No Matches
MRSceneCache.h
Go to the documentation of this file.
1#pragma once
2#include "MRMesh/MRMeshFwd.h"
5#include "exports.h"
6#include <unordered_map>
7#include <typeindex>
8
9namespace MR
10{
13
14
16class MRVIEWER_CLASS SceneCache
17{
18public:
21 MRVIEWER_API static void invalidateAll();
22
23 template <typename ObjectType>
24 using ObjectList = std::vector<std::shared_ptr<ObjectType>>;
27 template <typename ObjectType, ObjectSelectivityType SelectivityType>
29
32 template <typename ObjectType, ObjectSelectivityType SelectivityType>
34
35private:
36 MRVIEWER_API static SceneCache& instance_();
37 SceneCache() = default;
38
39 struct MRVIEWER_CLASS BasicVectorHolder
40 {
41 BasicVectorHolder() = default;
44 virtual ~BasicVectorHolder() = default;
45 };
46 template <typename ObjectType, ObjectSelectivityType SelectivityType>
47 struct MRVIEWER_CLASS VectorHolder : BasicVectorHolder
48 {
50 };
52 template <typename ObjectType, ObjectSelectivityType SelectivityType>
53 struct MRVIEWER_CLASS TopmostVectorHolder : BasicVectorHolder
54 {
56 };
57 std::unordered_map<std::type_index, std::shared_ptr<BasicVectorHolder>> cachedData_;
58};
59
60template <typename ObjectType, ObjectSelectivityType SelectivityType>
62{
63 using ResultType = VectorHolder<ObjectType, SelectivityType>;
64 const auto typeIndex = std::type_index( typeid( ResultType ) );
65 auto& cachedData = instance_().cachedData_;
66 auto& cachedVec = cachedData[typeIndex];
67 if ( !cachedVec )
68 {
69 auto dataList = std::make_shared<ResultType>();
70 dataList->value = getAllObjectsInTree<ObjectType>( &SceneRoot::get(), SelectivityType );
71 cachedVec = dataList;
72 }
73 assert( cachedVec );
74 auto resPtr = dynamic_pointer_cast< ResultType >( cachedVec );
75 assert( resPtr );
76 return resPtr->value;
77}
78
79template <typename ObjectType, ObjectSelectivityType SelectivityType>
81{
82 using ResultType = TopmostVectorHolder<ObjectType, SelectivityType>;
83 const auto typeIndex = std::type_index( typeid( ResultType ) );
84 auto& cachedData = instance_().cachedData_;
85 auto& cachedVec = cachedData[typeIndex];
86 if ( !cachedVec )
87 {
88 auto dataList = std::make_shared<ResultType>();
89 dataList->value = getTopmostObjects<ObjectType>( &SceneRoot::get(), SelectivityType );
90 cachedVec = dataList;
91 }
92 assert( cachedVec );
93 auto resPtr = dynamic_pointer_cast< ResultType >( cachedVec );
94 assert( resPtr );
95 return resPtr->value;
96}
97
98}
virtual ~BasicVectorHolder()=default
ObjectList< ObjectType > value
Definition MRSceneCache.h:49
static const ObjectList< ObjectType > & getAllTopmostObjects()
Definition MRSceneCache.h:80
static SceneRootObject & get()
ObjectList< ObjectType > value
Definition MRSceneCache.h:55
std::vector< std::shared_ptr< ObjectT > > getAllObjectsInTree(Object *root, const ObjectSelectivityType &type=ObjectSelectivityType::Selectable)
std::vector< std::shared_ptr< ObjectType > > ObjectList
Definition MRSceneCache.h:24
static void invalidateAll()
BasicVectorHolder(BasicVectorHolder &&)=default
std::vector< std::shared_ptr< ObjectT > > getTopmostObjects(Object *root, const ObjectSelectivityType &type=ObjectSelectivityType::Selectable, bool visibilityCheck=false)
Returns all topmost objects of given type (if an object is returned, its children are not) excluding ...
BasicVectorHolder(const BasicVectorHolder &)=default
static const ObjectList< ObjectType > & getAllObjects()
Definition MRSceneCache.h:61
only for bindings generation
Definition MRCameraOrientationPlugin.h:8