Conscience Core
Csc3dElementModelsRepository.h
Go to the documentation of this file.
1 #ifndef Csc3dElementModelsRepository_h
2 #define Csc3dElementModelsRepository_h
3 
6 #include "CscCommon.h"
7 
9 using std::lock_guard;
11 class CscEntityModelsRepository;
12 }
13 
15 
17 
18 class CscObjectModelsRepository;
19 class CscPlaceModelsRepository;
20 
21 class Csc3dElementModelResolverOffline;
22 
24  string id;
25  string name;
26  string provider;
30  string type = "";
31 
32  string toString() const;
33 };
34 
43 
44 public:
48  bool isOffline();
49 
53  void setOnlineLibraryServiceEnabled(bool enabled);
54 
55  inline static const string EntityModelFileNamePrefix = "Conscience_";
56  inline static const string PlaceModelFileNamePrefix = "Conscience_";
57  inline static const string ObjectModelFileNamePrefix = "Conscience_Object_";
58 
59  static fs::path get3dElementModelsDaeDirectoryPath(Csc3dElementType elementType);
60  static fs::path get3dElementModelsglTFDirectoryPath(Csc3dElementType elementType);
61  static fs::path get3dElementModelsObjDirectoryPath(Csc3dElementType elementType);
62  static fs::path get3dElementModelsLogoDirectoryPath(Csc3dElementType elementType);
66  static fs::path get3dElementModelSourceDirectoryPath(Csc3dElementType elementType, CscWorldElementModelFormat format);
67 
68  static fs::path get3dElementModelsLocalRepositoryPath(Csc3dElementType elementType);
69 
70  static void set3dElementModelsLocalRepositoryPath(Csc3dElementType elementType, fs::path directoryPath);
71 
72  static CscObjectModelsRepository *getObjectRepositoryInstance();
73  static CscPlaceModelsRepository *getPlaceRepositoryInstance();
74  static CscEntityModelsRepository *getEntityRepositoryInstance();
75 
79  Csc3dElementModelsRepository() = default;
80  virtual ~Csc3dElementModelsRepository() = default;
81 
86  void setResolver(ptr<Csc3dElementModelResolver>);
87 
91  virtual ptr<const Csc3dElementModel> getModel(const string &modelId);
92 
97 
102  virtual optional<CscWorldElementModelSourceSpec> getModelSource(const string &modelId, optional<CscWorldElementModelFormat> requestedFormat = {}, optional<OnProgressCallback> onProgress = {});
103 
107  vector<string> getAllAvailableIds();
108 
113  vector<ptr<const Csc3dElementModel>> getAllAvailableModels(optional<CscWorldElementModelFormat> requestedFormat = {});
114 
120  void importLocalModelFile(const fs::path &filePath, const Csc3dElementModelImportData &importData);
121 
122 protected:
123  Csc3dElementModelsRepository(Csc3dElementType elementType);
124  unique_ptr<CscLogger> logger = CscLogger::getForCategory("Csc3dElementModelsRepository");
125  void recheckOnlineMode();
127 
129 
130  inline static optional<fs::path> ConscienceEntitiesRessourceLocalRepositoryPath = {};
131  inline static optional<fs::path> ConsciencePlacesRessourceLocalRepositoryPath = {};
132  inline static optional<fs::path> ConscienceObjectsRessourceLocalRepositoryPath = {};
133 
134  bool onlineModeAllowed = false;
135  const ptr<Csc3dElementModelResolverOffline> resolverOffline = nullptr;
136 
141  unsigned long long lastOnlineCheckTimeMillis = 0;
142 
143  ptr<Csc3dElementModelResolver> resolver = nullptr;
144  map<string, ptr<const Csc3dElementModel>> modelsCache;
145  mutex cacheMutex;
146 
147  inline static CscObjectModelsRepository *objectRepositoryInstance = nullptr;
148  inline static CscPlaceModelsRepository *placeRepositoryInstance = nullptr;
149 
150  template <class TModel>
152  {
153  const lock_guard<mutex> lock(cacheMutex);
154  map<string, ptr<const Csc3dElementModel>>::iterator match = modelsCache.find(id);
155  if (match != modelsCache.end()) {
156  LOGGER_TRACE("getModel(" + id + ") - get from cache");
157  return newptr<const TModel>(*match->second);
158  }
159  }
160 
161  LOGGER_TRACE("getModel(" + id + ") - cache miss, delegate to resolver");
162  recheckOnlineMode();
163  ptr<const TModel> model = nullptr;
164  {
165  const lock_guard<mutex> lock(resolverOnlineCheckMutex);
166  auto modelPtr = resolver->resolve(id);
167  if (modelPtr) {
168  model = newptr<TModel>(*modelPtr);
169  }
170  }
171 
172  if (model != nullptr) {
173  cacheMutex.lock();
174  modelsCache[id] = model;
175  cacheMutex.unlock();
176  }
177  return model;
178  }
179 
183  virtual string buildFilename(const Csc3dElementModelImportData &data);
184 
185  fs::path getModelSourceDirectoryPath(CscWorldElementModelFormat format);
186 };
187 
189 public:
190  static constexpr int MODEL_ID_FIRE = 777;
191  static constexpr int MODEL_ID_PERSON = 10;
192  static constexpr int MODEL_ID_UNCONSCIOUS_PERSON = 49;
193  static constexpr int MODEL_ID_ARROW_BLUE = 0;
194  static constexpr int MODEL_ID_TENNIS_BALL = 1;
195  static constexpr int MODEL_ID_CUBE = 3;
196  static constexpr int MODEL_ID_CAR = 2;
197  static constexpr int MODEL_ID_BED = 161;
198  static constexpr int MODEL_ID_CHAIR = 17;
199  static constexpr int MODEL_ID_PERSON_STANDING = 160;
200  static constexpr int MODEL_ID_PERSON_NURSE = 189;
201 
203  CscObjectModel(const Csc3dElementType &elementType,
204  const string &id,
205  const string &name,
206  const optional<string> &type,
207  const optional<string> &provider,
208  unsigned long long lastModificationTimeMillis)
209  : Csc3dElementModel(elementType, id, name, type, provider, lastModificationTimeMillis) {
210  }
212  : Csc3dElementModel(other) {
213  }
214 };
215 
216 #define PLACE_MODEL_NAME_CHECKERBOARD "checkerboard"
217 #define PLACE_MODEL_OWNER_CHECKERBOARD "Conscience"
219 public:
220  static constexpr int MODEL_ID_CHECKERBOARD = 32;
221 
223  CscPlaceModel(const Csc3dElementType &elementType,
224  const string &id,
225  const string &name,
226  const optional<string> &type,
227  const optional<string> &provider,
228  unsigned long long lastModificationTimeMillis)
229  : Csc3dElementModel(elementType, id, name, type, provider, lastModificationTimeMillis) {
230  }
232  : Csc3dElementModel(other) {
233  }
234 };
235 
237 
238 public:
240  }
242  }
243 
244  ptr<const CscObjectModel> getObjectModel(const string &modelId);
245  string buildFilename(const Csc3dElementModelImportData &data) override;
246 };
247 
249 
250 public:
252  }
254  }
255 
256  ptr<const CscPlaceModel> getPlaceModel(const string &modelId);
257  string buildFilename(const Csc3dElementModelImportData &data) override;
258 };
259 
260 }
261 
262 #endif
conscience_core::core_objects::element_3d::Csc3dElementModelImportData::provider
string provider
Definition: Csc3dElementModelsRepository.h:26
CscResourceSpec.h
conscience_core::core_objects::element_3d::CscObjectModelsRepository::CscObjectModelsRepository
CscObjectModelsRepository()
Definition: Csc3dElementModelsRepository.h:239
conscience_core::core_objects::element_3d::CscObjectModel::CscObjectModel
CscObjectModel(const Csc3dElementType &elementType, const string &id, const string &name, const optional< string > &type, const optional< string > &provider, unsigned long long lastModificationTimeMillis)
Definition: Csc3dElementModelsRepository.h:203
conscience_core::core_objects::element_3d::ELEMENT_OBJECT
@ ELEMENT_OBJECT
Definition: Csc3dElementModelResolver.h:16
conscience_core::core_objects::element_3d::Csc3dElementModel
Definition: Csc3dElementModelResolver.h:20
conscience_core::core_objects::element_3d::Csc3dElementModelsRepository
Definition: Csc3dElementModelsRepository.h:42
conscience_core::core_objects::element_3d::CscObjectModel::CscObjectModel
CscObjectModel()
Definition: Csc3dElementModelsRepository.h:202
conscience_core::core_objects::resources
Definition: CscLocalFileResourceSpec.h:18
conscience_core::core_objects::element_3d::CscPlaceModel::CscPlaceModel
CscPlaceModel()
Definition: Csc3dElementModelsRepository.h:222
conscience_core::core_objects::element_3d::CscPlaceModel::CscPlaceModel
CscPlaceModel(const Csc3dElementModel &other)
Definition: Csc3dElementModelsRepository.h:231
conscience_core::core_objects::element_3d::Csc3dElementModelsRepository::cacheMutex
mutex cacheMutex
Definition: Csc3dElementModelsRepository.h:145
conscience_core::core_objects::element_3d::ELEMENT_PLACE
@ ELEMENT_PLACE
Definition: Csc3dElementModelResolver.h:17
Csc3dElementModelResolver.h
conscience_core::core_objects::element_3d::Csc3dElementModelImportData::id
string id
Definition: Csc3dElementModelsRepository.h:24
conscience_core::core_objects::element_3d::CscObjectModel
Definition: Csc3dElementModelsRepository.h:188
conscience_core::core_objects::element_3d::CscObjectModelsRepository::~CscObjectModelsRepository
~CscObjectModelsRepository() override
Definition: Csc3dElementModelsRepository.h:241
conscience_core::core_objects::element_3d::CscPlaceModel
Definition: Csc3dElementModelsRepository.h:218
conscience_core::core_objects::element_3d::Csc3dElementModelsRepository::modelsCache
map< string, ptr< const Csc3dElementModel > > modelsCache
Definition: Csc3dElementModelsRepository.h:144
conscience_core::core_objects::element_3d::CscObjectModel::CscObjectModel
CscObjectModel(const Csc3dElementModel &other)
Definition: Csc3dElementModelsRepository.h:211
conscience_core::core_objects::element_3d::Csc3dElementType
Csc3dElementType
Definition: Csc3dElementModelResolver.h:14
conscience_core::core_objects::element_3d::Csc3dElementModelsRepository::elementType
Csc3dElementType elementType
Definition: Csc3dElementModelsRepository.h:128
conscience_core::core_objects::element_3d
Definition: CommandParseContext.h:19
conscience_core::core_objects::element_3d::Csc3dElementModelsRepository::getModelInstance
ptr< const TModel > getModelInstance(const string &id)
Definition: Csc3dElementModelsRepository.h:151
logger
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
conscience_core::core_objects::element_3d::CscPlaceModel::CscPlaceModel
CscPlaceModel(const Csc3dElementType &elementType, const string &id, const string &name, const optional< string > &type, const optional< string > &provider, unsigned long long lastModificationTimeMillis)
Definition: Csc3dElementModelsRepository.h:223
conscience_core::core_objects::element_3d::CscPlaceModelsRepository::CscPlaceModelsRepository
CscPlaceModelsRepository()
Definition: Csc3dElementModelsRepository.h:251
conscience_core::core_objects::entities
Definition: CscRealEntityMessageHandler.cpp:19
LOGGER_TRACE
#define LOGGER_TRACE(message)
Definition: conscience_log.h:197
CscCommon.h
jwt::json::type
type
Generic JSON types used in JWTs.
Definition: jwt.h:1794
conscience_core::core_objects::element_3d::CscPlaceModelsRepository
Definition: Csc3dElementModelsRepository.h:248
conscience_core::core_objects::entities::CscEntityModelsRepository
Definition: CscEntityModelsRepository.h:27
conscience_core::core_objects::element_3d::Csc3dElementModelsRepository::resolverOnlineCheckMutex
mutex resolverOnlineCheckMutex
Definition: Csc3dElementModelsRepository.h:126
conscience_core::core_objects::element_3d::CscObjectModelsRepository
Definition: Csc3dElementModelsRepository.h:236
conscience_core::core_objects::element_3d::Csc3dElementModelImportData::name
string name
Definition: Csc3dElementModelsRepository.h:25
onProgress
optional< function< void(float progressRatio)> > onProgress
Definition: CscHttpClient.cpp:77
conscience_core::core_objects::element_3d::CscPlaceModelsRepository::~CscPlaceModelsRepository
~CscPlaceModelsRepository() override
Definition: Csc3dElementModelsRepository.h:253
conscience_core::core_objects::element_3d::Csc3dElementModelImportData
Definition: Csc3dElementModelsRepository.h:23
conscience_core::bridging::commands::environment_objects::optional< string >
const ptr< CscObjectModel > const string const CscPoint3d const CscPoint3d optional< string >
Definition: environmentObjectsCommands.h:373
ptr
std::shared_ptr< T > ptr
Definition: CscCommon.h:29