1 /*
2  MDAL - Mesh Data Abstraction Library (MIT License)
3  Copyright (C) 2020 Vincent Cloarec (vcloarec at gmail dot com)
4 */
5 
6 
7 #ifndef MDAL_DYNAMIC_DRIVER_H
8 #define MDAL_DYNAMIC_DRIVER_H
9 
10 #include "mdal_driver.hpp"
11 #include "mdal_utils.hpp"
12 #include "mdal.h"
13 
14 #include <functional>
15 #include <set>
16 
17 namespace MDAL
18 {
19   class DriverDynamic: public Driver
20   {
21 
22     public:
23       ~DriverDynamic() = default;
24 
25       Driver *create() override;
26       bool canReadMesh( const std::string &uri ) override;
27       std::unique_ptr<Mesh> load( const std::string &uri, const std::string &meshName ) override;
28 
29       //! Creates a dynamic driver from a library file
30       static Driver *create( const std::string &libFile );
31 
32     private:
33 
34       DriverDynamic( const std::string &name,
35                      const std::string &longName,
36                      const std::string &filters,
37                      int capabilityFlags,
38                      int maxVertexPerFace,
39                      const Library &lib );
40 
41       bool loadSymbols();
42       Library mLibrary;
43       int mCapabilityFlags = 0;
44       int mMaxVertexPerFace = std::numeric_limits<int>::max();
45 
46       std::set<int> mMeshIds;
47 
48       //************************************
49       std::function<bool ( const char * )> mCanReadMeshFunction;
50       std::function<int ( const char *, const char * )> mOpenMeshFunction;
51   };
52 
53   class MeshDynamicDriver;
54 
55   class MeshVertexIteratorDynamicDriver: public MeshVertexIterator
56   {
57     public:
58       MeshVertexIteratorDynamicDriver( const Library &library, int meshId );
59 
60       size_t next( size_t vertexCount, double *coordinates ) override;
61     private:
62       Library mLibrary;
63       int mMeshId;
64       int mPosition = 0;
65 
66       //************************************
67       std::function<int ( int, int, int, double * )> mVerticesFunction;
68   };
69 
70   class MeshFaceIteratorDynamicDriver: public MeshFaceIterator
71   {
72     public:
73       MeshFaceIteratorDynamicDriver( const Library &library, int meshId );
74 
75       size_t next( size_t faceOffsetsBufferLen,
76                    int *faceOffsetsBuffer,
77                    size_t vertexIndicesBufferLen,
78                    int *vertexIndicesBuffer ) override;
79     private:
80       Library mLibrary;
81       int mMeshId;
82       int mPosition = 0;
83 
84       //************************************
85       std::function<int ( int, int, int, int *, int, int * )> mFacesFunction;
86   };
87 
88   class MeshEdgeIteratorDynamicDriver: public MeshEdgeIterator
89   {
90     public:
91       MeshEdgeIteratorDynamicDriver( const Library &library, int meshId );
92 
93       size_t next( size_t edgeCount,
94                    int *startVertexIndices,
95                    int *endVertexIndices );
96     private:
97       Library mLibrary;
98       int mMeshId;
99       int mPosition = 0;
100 
101       //************************************
102       std::function<int ( int, int, int, int *, int * )> mEdgesFunction;
103   };
104 
105 
106   class DatasetDynamicDriver
107   {
108     public:
109       DatasetDynamicDriver( int meshId,
110                             int groupIndex,
111                             int datasetIndex,
112                             const Library &library );
113       virtual ~DatasetDynamicDriver();
114 
115       virtual bool loadSymbol();
116 
117       //! Removes stored data in memory (for drivers that support lazy loading)
118       void unloadData();
119 
120     protected:
121       int mMeshId = -1;
122       int mGroupIndex = -1;
123       int mDatasetIndex = -1;
124       Library mLibrary;
125 
126       //************************************
127       std::function<int ( int, int, int, int, int, double * )> mDataFunction;
128       std::function<void( int, int, int )> mUnloadFunction;
129   };
130 
131   class DatasetDynamicDriver2D: public Dataset2D, public DatasetDynamicDriver
132   {
133     public:
134       DatasetDynamicDriver2D( DatasetGroup *parentGroup,
135                               int meshId,
136                               int groupIndex,
137                               int datasetIndex,
138                               const Library &library );
139       ~DatasetDynamicDriver2D() override;
140 
141       bool loadSymbol() override;
142 
143       size_t scalarData( size_t indexStart, size_t count, double *buffer ) override;
144       size_t vectorData( size_t indexStart, size_t count, double *buffer ) override;
145       size_t activeData( size_t indexStart, size_t count, int *buffer ) override;
146 
147     private:
148 
149       std::function<int ( int, int, int, int, int, int * )> mActiveFlagsFunction;
150   };
151 
152   class DatasetDynamicDriver3D: public Dataset3D, public DatasetDynamicDriver
153   {
154     public:
155       DatasetDynamicDriver3D( DatasetGroup *parentGroup,
156                               int meshId,
157                               int groupIndex,
158                               int datasetIndex,
159                               size_t volumes,
160                               size_t maxVerticalLevelCount,
161                               const Library &library );
162       ~DatasetDynamicDriver3D() override;
163       bool loadSymbol() override;
164 
165       size_t verticalLevelCountData( size_t indexStart, size_t count, int *buffer ) override;
166       size_t verticalLevelData( size_t indexStart, size_t count, double *buffer ) override;
167       size_t faceToVolumeData( size_t indexStart, size_t count, int *buffer ) override;
168       size_t scalarVolumesData( size_t indexStart, size_t count, double *buffer ) override;
169       size_t vectorVolumesData( size_t indexStart, size_t count, double *buffer ) override;
170 
171     private:
172 
173       std::function<int ( int, int, int, int, int, int * )> mVerticalLevelCountDataFunction;
174       std::function<int ( int, int, int, int, int, double * )> mVerticalLevelDataFunction;
175       std::function<int ( int, int, int, int, int, int * )> mFaceToVolumeDataFunction;
176 
177   };
178 
179   class MeshDynamicDriver: public Mesh
180   {
181     public:
182       MeshDynamicDriver( const std::string &driverName,
183                          size_t faceVerticesMaximumCount,
184                          const std::string &uri,
185                          const Library &library,
186                          int meshId );
187       ~MeshDynamicDriver();
188 
189       std::unique_ptr<MeshVertexIterator> readVertices() override;
190       std::unique_ptr<MeshEdgeIterator> readEdges() override;
191       std::unique_ptr<MeshFaceIterator> readFaces() override;
192       size_t verticesCount() const override;
193       size_t edgesCount() const override;
194       size_t facesCount() const override;
195       BBox extent() const override;
196 
197       //! Set the projection from the source
198       void setProjection();
199 
200       bool populateDatasetGroups();
201 
202       //! Returns whether all the symbols have been loaded
203       bool loadSymbol();
204 
205     private:
206       Library mLibrary;
207       int mId = -1;
208 
209       //************************************
210       std::function<int ( int )> mMeshVertexCountFunction;
211       std::function<int ( int )> mMeshFaceCountFunction;
212       std::function<int ( int )> mMeshEdgeCountFunction;
213       std::function<void ( int, double *, double *, double *, double * )> mMeshExtentFunction;
214       std::function<const char *( int )> mMeshProjectionFunction;
215       std::function<int ( int )> mMeshDatasetGroupsCountFunction;
216 
217       std::function<const char *( int, int )> mDatasetgroupNameFunction;
218       std::function<const char *( int, int )> mDatasetGroupReferencetimeFunction;
219       std::function<int ( int, int )> mDatasetGroupMetadataCountFunction;
220       std::function<const char *( int, int, int )> mDatasetGroupMetadataKeyFunction;
221       std::function<const char *( int, int, int )> mDatasetGroupMetadataValueFunction;
222       std::function < bool ( int, int, bool *, int *, int * )> mDatasetDescriptionFunction;
223       std::function < double( int, int, int, bool * )> mDatasetTimeFunction;
224       std::function<bool ( int, int, int )> mDatasetSupportActiveFlagFunction;
225       std::function<int ( int, int, int )> mDataset3DMaximumVerticalLevelCount;
226       std::function<int ( int, int, int )> mDataset3DVolumeCount;
227 
228       std::function<void ( int )> mCloseMeshFunction;
229   };
230 }
231 
232 
233 #endif // MDAL_DYNAMIC_DRIVER_H
234