1
1
/*
2
2
MDAL - Mesh Data Abstraction Library (MIT License)
3
- Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com)
3
+ Copyright (C) 2018 Lutra Consulting Ltd.
4
4
*/
5
5
6
6
#include < stddef.h>
@@ -22,38 +22,38 @@ MDAL::Loader2dm::Loader2dm( const std::string &meshFile ):
22
22
{
23
23
}
24
24
25
- MDAL::Mesh * MDAL::Loader2dm::load ( MDAL_Status *status )
25
+ std::unique_ptr< MDAL::Mesh> MDAL::Loader2dm::load ( MDAL_Status *status )
26
26
{
27
27
if ( status ) *status = MDAL_Status::None;
28
28
29
29
if ( !MDAL::fileExists ( mMeshFile ) )
30
30
{
31
31
if ( status ) *status = MDAL_Status::Err_FileNotFound;
32
- return 0 ;
32
+ return nullptr ;
33
33
}
34
34
35
35
std::ifstream in ( mMeshFile , std::ifstream::in );
36
36
std::string line;
37
37
if ( !std::getline ( in, line ) || !startsWith ( line, " MESH2D" ) )
38
38
{
39
39
if ( status ) *status = MDAL_Status::Err_UnknownFormat;
40
- return 0 ;
40
+ return nullptr ;
41
41
}
42
42
43
- size_t elemCount = 0 ;
44
- size_t nodeCount = 0 ;
43
+ size_t faceCount = 0 ;
44
+ size_t vertexCount = 0 ;
45
45
46
46
// Find out how many nodes and elements are contained in the .2dm mesh file
47
47
while ( std::getline ( in, line ) )
48
48
{
49
49
if ( startsWith ( line, " E4Q" ) ||
50
50
startsWith ( line, " E3T" ) )
51
51
{
52
- elemCount ++;
52
+ faceCount ++;
53
53
}
54
54
else if ( startsWith ( line, " ND" ) )
55
55
{
56
- nodeCount ++;
56
+ vertexCount ++;
57
57
}
58
58
else if ( startsWith ( line, " E2L" ) ||
59
59
startsWith ( line, " E3L" ) ||
@@ -62,71 +62,71 @@ MDAL::Mesh *MDAL::Loader2dm::load( MDAL_Status *status )
62
62
startsWith ( line, " E9Q" ) )
63
63
{
64
64
if ( status ) *status = MDAL_Status::Warn_UnsupportedElement;
65
- elemCount += 1 ; // We still count them as elements
65
+ faceCount += 1 ; // We still count them as elements
66
66
}
67
67
}
68
68
69
69
// Allocate memory
70
- std::vector<Vertex> vertices ( nodeCount );
71
- std::vector<Face> faces ( elemCount );
70
+ std::vector<Vertex> vertices ( vertexCount );
71
+ std::vector<Face> faces ( faceCount );
72
72
73
73
in.clear ();
74
74
in.seekg ( 0 , std::ios::beg );
75
75
76
76
std::vector<std::string> chunks;
77
77
78
- size_t elemIndex = 0 ;
79
- size_t nodeIndex = 0 ;
80
- std::map<size_t , size_t > elemIDtoIndex ;
81
- std::map<size_t , size_t > nodeIDtoIndex ;
78
+ size_t faceIndex = 0 ;
79
+ size_t vertexIndex = 0 ;
80
+ std::map<size_t , size_t > faceIDtoIndex ;
81
+ std::map<size_t , size_t > vertexIDtoIndex ;
82
82
83
83
while ( std::getline ( in, line ) )
84
84
{
85
85
if ( startsWith ( line, " E4Q" ) )
86
86
{
87
87
chunks = split ( line, " " , SplitBehaviour::SkipEmptyParts );
88
- assert ( elemIndex < elemCount );
88
+ assert ( faceIndex < faceCount );
89
89
90
90
size_t elemID = toSizeT ( chunks[1 ] );
91
91
92
- std::map<size_t , size_t >::iterator search = elemIDtoIndex .find ( elemID );
93
- if ( search != elemIDtoIndex .end () )
92
+ std::map<size_t , size_t >::iterator search = faceIDtoIndex .find ( elemID );
93
+ if ( search != faceIDtoIndex .end () )
94
94
{
95
95
if ( status ) *status = MDAL_Status::Warn_ElementNotUnique;
96
96
continue ;
97
97
}
98
- elemIDtoIndex [elemID] = elemIndex ;
99
- Face &face = faces[elemIndex ];
98
+ faceIDtoIndex [elemID] = faceIndex ;
99
+ Face &face = faces[faceIndex ];
100
100
face.resize ( 4 );
101
101
// Right now we just store node IDs here - we will convert them to node indices afterwards
102
102
for ( size_t i = 0 ; i < 4 ; ++i )
103
103
face[i] = toSizeT ( chunks[i + 2 ] );
104
104
105
- elemIndex ++;
105
+ faceIndex ++;
106
106
}
107
107
else if ( startsWith ( line, " E3T" ) )
108
108
{
109
109
chunks = split ( line, " " , SplitBehaviour::SkipEmptyParts );
110
- assert ( elemIndex < elemCount );
110
+ assert ( faceIndex < faceCount );
111
111
112
112
size_t elemID = toSizeT ( chunks[1 ] );
113
113
114
- std::map<size_t , size_t >::iterator search = elemIDtoIndex .find ( elemID );
115
- if ( search != elemIDtoIndex .end () )
114
+ std::map<size_t , size_t >::iterator search = faceIDtoIndex .find ( elemID );
115
+ if ( search != faceIDtoIndex .end () )
116
116
{
117
117
if ( status ) *status = MDAL_Status::Warn_ElementNotUnique;
118
118
continue ;
119
119
}
120
- elemIDtoIndex [elemID] = elemIndex ;
121
- Face &face = faces[elemIndex ];
120
+ faceIDtoIndex [elemID] = faceIndex ;
121
+ Face &face = faces[faceIndex ];
122
122
face.resize ( 3 );
123
123
// Right now we just store node IDs here - we will convert them to node indices afterwards
124
124
for ( size_t i = 0 ; i < 3 ; ++i )
125
125
{
126
126
face[i] = toSizeT ( chunks[i + 2 ] );
127
127
}
128
128
129
- elemIndex ++;
129
+ faceIndex ++;
130
130
}
131
131
else if ( startsWith ( line, " E2L" ) ||
132
132
startsWith ( line, " E3L" ) ||
@@ -136,39 +136,39 @@ MDAL::Mesh *MDAL::Loader2dm::load( MDAL_Status *status )
136
136
{
137
137
// We do not yet support these elements
138
138
chunks = split ( line, " " , SplitBehaviour::SkipEmptyParts );
139
- assert ( elemIndex < elemCount );
139
+ assert ( faceIndex < faceCount );
140
140
141
141
size_t elemID = toSizeT ( chunks[1 ] );
142
142
143
- std::map<size_t , size_t >::iterator search = elemIDtoIndex .find ( elemID );
144
- if ( search != elemIDtoIndex .end () )
143
+ std::map<size_t , size_t >::iterator search = faceIDtoIndex .find ( elemID );
144
+ if ( search != faceIDtoIndex .end () )
145
145
{
146
146
if ( status ) *status = MDAL_Status::Warn_ElementNotUnique;
147
147
continue ;
148
148
}
149
- elemIDtoIndex [elemID] = elemIndex ;
149
+ faceIDtoIndex [elemID] = faceIndex ;
150
150
assert ( false ); // TODO mark element as unusable
151
151
152
- elemIndex ++;
152
+ faceIndex ++;
153
153
}
154
154
else if ( startsWith ( line, " ND" ) )
155
155
{
156
156
chunks = split ( line, " " , SplitBehaviour::SkipEmptyParts );
157
157
size_t nodeID = toSizeT ( chunks[1 ] );
158
158
159
- std::map<size_t , size_t >::iterator search = nodeIDtoIndex .find ( nodeID );
160
- if ( search != nodeIDtoIndex .end () )
159
+ std::map<size_t , size_t >::iterator search = vertexIDtoIndex .find ( nodeID );
160
+ if ( search != vertexIDtoIndex .end () )
161
161
{
162
162
if ( status ) *status = MDAL_Status::Warn_NodeNotUnique;
163
163
continue ;
164
164
}
165
- nodeIDtoIndex [nodeID] = nodeIndex ;
166
- assert ( nodeIndex < nodeCount );
167
- Vertex &vertex = vertices[nodeIndex ];
165
+ vertexIDtoIndex [nodeID] = vertexIndex ;
166
+ assert ( vertexIndex < vertexCount );
167
+ Vertex &vertex = vertices[vertexIndex ];
168
168
vertex.x = toDouble ( chunks[2 ] );
169
169
vertex.y = toDouble ( chunks[3 ] );
170
170
171
- nodeIndex ++;
171
+ vertexIndex ++;
172
172
}
173
173
}
174
174
@@ -179,8 +179,8 @@ MDAL::Mesh *MDAL::Loader2dm::load( MDAL_Status *status )
179
179
{
180
180
size_t nodeID = face[nd];
181
181
182
- std::map<size_t , size_t >::iterator ni2i = nodeIDtoIndex .find ( nodeID );
183
- if ( ni2i != nodeIDtoIndex .end () )
182
+ std::map<size_t , size_t >::iterator ni2i = vertexIDtoIndex .find ( nodeID );
183
+ if ( ni2i != vertexIDtoIndex .end () )
184
184
{
185
185
face[nd] = ni2i->second ; // convert from ID to index
186
186
}
@@ -196,9 +196,12 @@ MDAL::Mesh *MDAL::Loader2dm::load( MDAL_Status *status )
196
196
// check that we have distinct nodes
197
197
}
198
198
199
- Mesh *mesh = new Mesh;
199
+ std::unique_ptr< Mesh > mesh ( new Mesh );
200
+ mesh->uri = mMeshFile ;
200
201
mesh->faces = faces;
201
202
mesh->vertices = vertices;
203
+ mesh->faceIDtoIndex = faceIDtoIndex;
204
+ mesh->vertexIDtoIndex = vertexIDtoIndex;
202
205
203
206
return mesh;
204
207
}
0 commit comments