MDAL
mdal_memory_data_model.hpp
1 /*
2  MDAL - Mesh Data Abstraction Library (MIT License)
3  Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com)
4 */
5 
6 #ifndef MDAL_MEMORY_DATA_MODEL_HPP
7 #define MDAL_MEMORY_DATA_MODEL_HPP
8 
9 #include <stddef.h>
10 #include <assert.h>
11 #include <vector>
12 #include <memory>
13 #include <map>
14 #include <string>
15 #include "mdal.h"
16 #include "mdal_data_model.hpp"
17 
18 namespace MDAL
19 {
20  class MemoryMesh;
21 
22  typedef struct VertexType
23  {
24  double x = std::numeric_limits<double>::quiet_NaN();
25  double y = std::numeric_limits<double>::quiet_NaN();
26  double z = 0.0; // Bed elevation
27 
28  } Vertex;
29 
30  typedef struct
31  {
32  size_t startVertex;
33  size_t endVertex;
34  } Edge;
35 
36  typedef std::vector<size_t> Face;
37  typedef std::vector<Vertex> Vertices;
38  typedef std::vector<Edge> Edges;
39  typedef std::vector<Face> Faces;
40 
44  class MemoryDataset2D: public Dataset2D
45  {
46  public:
47  MemoryDataset2D( DatasetGroup *grp, bool hasActiveFlag = false );
48  ~MemoryDataset2D() override;
49 
50  size_t scalarData( size_t indexStart, size_t count, double *buffer ) override;
51  size_t vectorData( size_t indexStart, size_t count, double *buffer ) override;
52 
54  size_t activeData( size_t indexStart, size_t count, int *buffer ) override;
55 
60  void activateFaces( MDAL::MemoryMesh *mesh );
61 
70  void setActive( size_t index, int stat )
71  {
72  assert( supportsActiveFlag() );
73  assert( mActive.size() > index );
74  mActive[index] = stat;
75  }
76 
77  void setActive( const int *activeBuffer );
78 
79  int active( size_t index ) const
80  {
81  assert( supportsActiveFlag() );
82  assert( mActive.size() > index );
83  return mActive[index];
84  }
85 
86  void setScalarValue( size_t index, double value )
87  {
88  assert( mValues.size() > index );
89  assert( group()->isScalar() );
90  mValues[index] = value;
91  }
92 
93  void setVectorValue( size_t index, double x, double y )
94  {
95  assert( mValues.size() > 2 * index + 1 );
96  assert( !group()->isScalar() );
97  mValues[2 * index] = x;
98  mValues[2 * index + 1] = y;
99  }
100 
101  void setValueX( size_t index, double x )
102  {
103  assert( mValues.size() > 2 * index );
104  assert( !group()->isScalar() );
105 
106  mValues[2 * index] = x;
107  }
108 
109  void setValueY( size_t index, double x )
110  {
111  assert( mValues.size() > 2 * index + 1 );
112  assert( !group()->isScalar() );
113  mValues[2 * index + 1] = x;
114  }
115 
116  double valueX( size_t index ) const
117  {
118  assert( mValues.size() > 2 * index + 1 );
119  assert( !group()->isScalar() );
120  return mValues[2 * index];
121  }
122 
123  double valueY( size_t index ) const
124  {
125  assert( mValues.size() > 2 * index + 1 );
126  assert( !group()->isScalar() );
127  return mValues[2 * index + 1];
128  }
129 
130  double scalarValue( size_t index ) const
131  {
132  assert( mValues.size() > index );
133  assert( group()->isScalar() );
134  return mValues[index];
135  }
136 
142  double *values()
143  {
144  return mValues.data();
145  }
146 
147  private:
161  std::vector<double> mValues;
162 
170  std::vector<int> mActive;
171  };
172 
174  {
175  public:
176 
178  DatasetGroup *grp,
179  size_t volumes,
180  size_t maxVerticalLevelCount,
181  const int *verticalLevelCounts,
182  const double *verticalExtrusions
183  );
184 
185  ~MemoryDataset3D() override;
186 
187 
188  void setScalarValue( size_t index, double value )
189  {
190  assert( mValues.size() > index );
191  assert( group()->isScalar() );
192  mValues[index] = value;
193  }
194 
195  void setVectorValue( size_t index, double x, double y )
196  {
197  assert( mValues.size() > 2 * index + 1 );
198  assert( !group()->isScalar() );
199  mValues[2 * index] = x;
200  mValues[2 * index + 1] = y;
201  }
202 
203  void setValueX( size_t index, double x )
204  {
205  assert( mValues.size() > 2 * index );
206  assert( !group()->isScalar() );
207 
208  mValues[2 * index] = x;
209  }
210 
211  void setValueY( size_t index, double x )
212  {
213  assert( mValues.size() > 2 * index + 1 );
214  assert( !group()->isScalar() );
215  mValues[2 * index + 1] = x;
216  }
217 
218  double valueX( size_t index ) const
219  {
220  assert( mValues.size() > 2 * index + 1 );
221  assert( !group()->isScalar() );
222  return mValues[2 * index];
223  }
224 
225  double valueY( size_t index ) const
226  {
227  assert( mValues.size() > 2 * index + 1 );
228  assert( !group()->isScalar() );
229  return mValues[2 * index + 1];
230  }
231 
232  double scalarValue( size_t index ) const
233  {
234  assert( mValues.size() > index );
235  assert( group()->isScalar() );
236  return mValues[index];
237  }
238 
239  void updateIndices();
240 
246  double *values()
247  {
248  return mValues.data();
249  }
250 
251  size_t verticalLevelCountData( size_t indexStart, size_t count, int *buffer ) override;
252  size_t verticalLevelData( size_t indexStart, size_t count, double *buffer ) override;
253  size_t faceToVolumeData( size_t indexStart, size_t count, int *buffer ) override;
254  size_t scalarVolumesData( size_t indexStart, size_t count, double *buffer ) override;
255  size_t vectorVolumesData( size_t indexStart, size_t count, double *buffer ) override;
256 
257  private:
266  std::vector<double> mValues;
267 
273  std::vector<int> mFaceToVolume;
274 
280  std::vector<int> mVerticalLevelCounts;
281 
287  std::vector<double> mVerticalExtrusions;
288  };
289 
290  class MemoryMesh: public Mesh
291  {
292  public:
294  MemoryMesh( const std::string &driverName,
295  size_t faceVerticesMaximumCount,
296  const std::string &uri );
297 
298  ~MemoryMesh() override;
299 
300  std::unique_ptr<MDAL::MeshVertexIterator> readVertices() override;
301  std::unique_ptr<MDAL::MeshEdgeIterator> readEdges() override;
302  std::unique_ptr<MDAL::MeshFaceIterator> readFaces() override;
303 
304  const Vertices &vertices() const {return mVertices;}
305  const Faces &faces() const {return mFaces;}
306  const Edges &edges() const {return mEdges;}
307 
309  void setVertices( Vertices vertices );
310 
312  void setFaces( Faces faces );
313 
315  void setEdges( Edges edges );
316 
317  size_t verticesCount() const override {return mVertices.size();}
318  size_t edgesCount() const override {return mEdges.size();}
319  size_t facesCount() const override {return mFaces.size();}
320  BBox extent() const override;
321  void addVertices( size_t vertexCount, double *coordinates ) override;
322  void addFaces( size_t faceCount, size_t driverMaxVerticesPerFace, int *faceSizes, int *vertexIndices ) override;
323  void addEdges( size_t edgeCount, int *startVertexIndices, int *endVertexIndices ) override;
324 
325  bool isEditable() const override {return true;}
326 
327  private:
328  BBox mExtent;
329  Vertices mVertices;
330  Faces mFaces;
331  Edges mEdges;
332  };
333 
335  {
336  public:
337  MemoryMeshVertexIterator( const MemoryMesh *mesh );
338  ~MemoryMeshVertexIterator() override;
339 
340  size_t next( size_t vertexCount, double *coordinates ) override;
341 
342  const MemoryMesh *mMemoryMesh;
343  size_t mLastVertexIndex = 0;
344  };
345 
347  {
348  public:
349  MemoryMeshEdgeIterator( const MemoryMesh *mesh );
350  ~MemoryMeshEdgeIterator() override;
351 
352  size_t next( size_t edgeCount,
353  int *startVertexIndices,
354  int *endVertexIndices ) override;
355 
356  const MemoryMesh *mMemoryMesh;
357  size_t mLastEdgeIndex = 0;
358  };
359 
361  {
362  public:
363  MemoryMeshFaceIterator( const MemoryMesh *mesh );
364  ~MemoryMeshFaceIterator() override;
365 
366  size_t next( size_t faceOffsetsBufferLen,
367  int *faceOffsetsBuffer,
368  size_t vertexIndicesBufferLen,
369  int *vertexIndicesBuffer ) override;
370 
371  const MemoryMesh *mMemoryMesh;
372  size_t mLastFaceIndex = 0;
373  };
374 } // namespace MDAL
375 #endif //MDAL_MEMORY_DATA_MODEL_HPP
Definition: mdal_data_model.hpp:97
Definition: mdal_data_model.hpp:113
Definition: mdal_data_model.hpp:137
The MemoryDataset stores all the data in the memory.
Definition: mdal_memory_data_model.hpp:45
void activateFaces(MDAL::MemoryMesh *mesh)
Loop through all faces and activate those which has all 4 values on vertices valid Dataset must suppo...
Definition: mdal_memory_data_model.cpp:44
size_t scalarData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_memory_data_model.cpp:92
double * values()
Returns pointer to internal buffer with values Never null, already allocated for vector datasets in f...
Definition: mdal_memory_data_model.hpp:142
size_t activeData(size_t indexStart, size_t count, int *buffer) override
Returns 0 for datasets that does not support active flags.
Definition: mdal_memory_data_model.cpp:31
size_t vectorData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_memory_data_model.cpp:106
void setActive(size_t index, int stat)
Sets active flag for index.
Definition: mdal_memory_data_model.hpp:70
Definition: mdal_memory_data_model.hpp:174
size_t vectorVolumesData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_memory_data_model.cpp:206
double * values()
Returns pointer to internal buffer with values Never null, already allocated for vector datasets in f...
Definition: mdal_memory_data_model.hpp:246
size_t faceToVolumeData(size_t indexStart, size_t count, int *buffer) override
For DataOnVolumes.
Definition: mdal_memory_data_model.cpp:179
size_t scalarVolumesData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_memory_data_model.cpp:192
size_t verticalLevelCountData(size_t indexStart, size_t count, int *buffer) override
For DataOnVolumes.
Definition: mdal_memory_data_model.cpp:153
size_t verticalLevelData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_memory_data_model.cpp:166
Definition: mdal_memory_data_model.hpp:347
Definition: mdal_memory_data_model.hpp:361
Definition: mdal_memory_data_model.hpp:335
Definition: mdal_memory_data_model.hpp:291
void setFaces(Faces faces)
Sets all faces using std::move if possible.
Definition: mdal_memory_data_model.cpp:252
void setVertices(Vertices vertices)
Sets all vertices using std::move if possible.
Definition: mdal_memory_data_model.cpp:246
MemoryMesh(const std::string &driverName, size_t faceVerticesMaximumCount, const std::string &uri)
Constructs an empty mesh.
Definition: mdal_memory_data_model.cpp:220
void setEdges(Edges edges)
Sets all edges using std::move if possible.
Definition: mdal_memory_data_model.cpp:257
Definition: mdal_data_model.hpp:217
Definition: mdal_data_model.hpp:227
Definition: mdal_data_model.hpp:209
Definition: mdal_data_model.hpp:238
Definition: mdal_data_model.hpp:24
Definition: mdal_memory_data_model.hpp:31
Definition: mdal_memory_data_model.hpp:23