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{
11
12// class to cached scene objects data
13class MRVIEWER_CLASS SceneCache
14{
15public:
16 // invalidate all cached data
17 // call it in the beginning each frame
18 MRVIEWER_API static void invalidateAll();
19
20 template <typename ObjectType>
21 using ObjectList = std::vector<std::shared_ptr<ObjectType>>;
22 // analog getAllObjectsInTree<ObjectType>( &SceneRoot::get(), SelectivityType ) but use cached data
23 // reference copy is valid until invalidateAll() is called
24 template <typename ObjectType, ObjectSelectivityType SelectivityType>
25 static const ObjectList<ObjectType>& getAllObjects();
26
27private:
28 MRVIEWER_API static SceneCache& instance_();
29 SceneCache() = default;
30
31 struct MRVIEWER_CLASS BasicVectorHolder
32 {
33 BasicVectorHolder() = default;
34 BasicVectorHolder( const BasicVectorHolder& ) = default;
35 BasicVectorHolder( BasicVectorHolder&& ) = default;
36 virtual ~BasicVectorHolder() = default;
37 };
38 template <typename ObjectType, ObjectSelectivityType SelectivityType>
39 struct MRVIEWER_CLASS VectorHolder : BasicVectorHolder
40 {
41 ObjectList<ObjectType> value;
42 };
43 std::unordered_map<std::type_index, std::shared_ptr<BasicVectorHolder>> cachedData_;
44};
45
46template <typename ObjectType, ObjectSelectivityType SelectivityType>
48{
49 using ResultType = VectorHolder<ObjectType, SelectivityType>;
50 const auto typeIndex = std::type_index( typeid( ResultType ) );
51 auto& cachedData = instance_().cachedData_;
52 auto& cachedVec = cachedData[typeIndex];
53 if ( !cachedVec )
54 {
55 auto dataList = std::make_shared<ResultType>();
56 dataList->value = getAllObjectsInTree<ObjectType>( &SceneRoot::get(), SelectivityType );
57 cachedVec = dataList;
58 }
59 assert( cachedVec );
60 auto resPtr = dynamic_pointer_cast< ResultType >( cachedVec );
61 assert( resPtr );
62 return resPtr->value;
63}
64
65}
Definition MRSceneCache.h:14
std::vector< std::shared_ptr< ObjectType > > ObjectList
Definition MRSceneCache.h:21
static MRVIEWER_API void invalidateAll()
static const ObjectList< ObjectType > & getAllObjects()
Definition MRSceneCache.h:47
static MRMESH_API SceneRootObject & get()
Definition MRCameraOrientationPlugin.h:8
std::vector< std::shared_ptr< ObjectT > > getAllObjectsInTree(Object *root, const ObjectSelectivityType &type=ObjectSelectivityType::Selectable)