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