@@ -78,141 +78,7 @@ namespace CSG_Adapter
78
78
vertex.v .z = round ( vertex.v .z *1000000.0 ) * 0.000001 ;
79
79
}
80
80
}
81
- inline void mergeAlignedEdges ( shared_ptr<meshset_t >& meshset, carve::mesh::MeshSimplifier& simplifier )
82
- {
83
- if ( !meshset )
84
- {
85
- return ;
86
- }
87
-
88
- std::map<face_t *, std::vector<carve::mesh::Edge<3 >*> > map_omit_face_edges;
89
- for ( size_t i_mesh = 0 ; i_mesh < meshset->meshes .size (); ++i_mesh )
90
- {
91
- carve::mesh::Mesh<3 >* mesh = meshset->meshes [i_mesh];
92
-
93
- const std::vector<carve::mesh::Edge<3 >*>& vec_closed_edges = mesh->closed_edges ;
94
- bool mesh_dirty = false ;
95
- for ( size_t closed_edge_i = 0 ; closed_edge_i < vec_closed_edges.size (); ++closed_edge_i )
96
- {
97
- carve::mesh::Edge<3 >* edge_i = vec_closed_edges[closed_edge_i];
98
- carve::mesh::Edge<3 >* edge_next = edge_i->next ;
99
- if ( !edge_next )
100
- {
101
- continue ;
102
- }
103
-
104
- if ( !edge_i )
105
- {
106
- #ifdef _DEBUG
107
- std::cout << __FUNC__ << " : !edge_i" << std::endl;
108
- #endif
109
- continue ;
110
- }
111
-
112
- if ( !edge_next )
113
- {
114
- #ifdef _DEBUG
115
- std::cout << __FUNC__ << " : !edge_next" << std::endl;
116
- #endif
117
- continue ;
118
- }
119
-
120
- if ( !edge_next->rev )
121
- {
122
- #ifdef _DEBUG
123
- std::cout << __FUNC__ << " : !edge_j->rev" << std::endl;
124
- #endif
125
- continue ;
126
- }
127
-
128
- if ( edge_next->rev ->next == edge_i->rev )
129
- {
130
- // ----------->(v3)---> --->o--->
131
- // |^ |^
132
- // edge_next->rev||edge_next(remove) ||
133
- // v| ||
134
- // (v2) ||
135
- // |^ ||
136
- // (remove)||edge_i ||edge_i
137
- // v| v|
138
- // <----------(v1)<--- <---o<---
139
-
140
- const carve::mesh::Vertex<3 >* v1 = edge_i->v1 ();
141
- const carve::mesh::Vertex<3 >* v2 = edge_i->v2 ();
142
- const carve::mesh::Vertex<3 >* v3 = edge_next->v2 ();
143
-
144
- const vec3& v1vec = v1->v ;
145
- const vec3& v2vec = v2->v ;
146
- const vec3& v3vec = v3->v ;
147
- vec3 sement12 = v2vec - v1vec;
148
- vec3 sement23 = v3vec - v2vec;
149
- #ifdef _DEBUG
150
- double sement12_length2 = sement12.length2 ();
151
- double sement23_length2 = sement23.length2 ();
152
- if ( std::abs ( edge_i->length2 () - sement12_length2 ) > 0.00001 )
153
- {
154
- std::cout << __FUNC__ << " : abs( edge_i->length2() - sement12_length2 ) > 0.00001" << std::endl;
155
- }
156
-
157
- if ( std::abs ( edge_next->length2 () - sement23_length2 ) > 0.00001 )
158
- {
159
- std::cout << __FUNC__ << " : abs( edge_next->length2() - sement23_length2 ) > 0.00001" << std::endl;
160
- }
161
- #endif
162
-
163
- // check angle between edges
164
- sement12.normalize ();
165
- sement23.normalize ();
166
- double dot_angle = dot ( sement12, sement23 );
167
- if ( std::abs ( std::abs ( dot_angle ) - 1.0 ) < 0.001 )
168
- {
169
- // edges are in line
170
- if ( v1 == v3 )
171
- {
172
- #ifdef _DEBUG
173
- std::cout << __FUNC__ << " : edge loop with only 2 edges" << std::endl;
174
- #endif
175
- // edge_i->rev == edge_next
176
- edge_i->removeEdge (); // also removes edge_i->rev
177
- }
178
- else
179
- {
180
- // this links previous and next edges and deletes edge_j and reverse of edge_i:
181
- edge_i->rev ->removeHalfEdge ();
182
- edge_i->rev = edge_next->rev ;
183
-
184
- edge_next->rev ->rev = edge_i;
185
- edge_next->removeHalfEdge ();
186
- mesh_dirty = true ;
187
- }
188
-
189
- // the vertex is kept in the vertex storage, no need to delete here
190
- }
191
- else
192
- {
193
- // edges are not in line, so faces should be in a plane
194
- #ifdef _DEBUG
195
- const vec3& normal_face_i = edge_i->face ->plane .N ;
196
- const vec3& normal_face_i_rev = edge_i->rev ->face ->plane .N ;
197
-
198
-
199
- double dot_face_angle = dot ( normal_face_i, normal_face_i_rev );
200
- if ( std::abs ( dot_face_angle - 1.0 ) > 0.001 )
201
- {
202
- std::cout << __FUNC__ << " : abs( dot_face_angle - 1.0 ) > 0.001" << std::endl;
203
- }
204
- #endif
205
- }
206
- }
207
- }
208
-
209
- if (mesh_dirty)
210
- {
211
- // clears closed_edges and rebuilds it from faces
212
- mesh->cacheEdges ();
213
- }
214
- }
215
- }
81
+
216
82
inline bool checkMeshSetNonNegativeAndClosed ( const shared_ptr<meshset_t > mesh_set )
217
83
{
218
84
bool meshes_closed = true ;
@@ -577,11 +443,6 @@ namespace CSG_Adapter
577
443
++i_vert;
578
444
} while ( edge != face->edge );
579
445
580
- // std::vector<carve::mesh::Vertex<3>* > verts;
581
- // face->getVertices( verts );
582
-
583
- // TODO: merge coplanar faces and re-triangulate
584
-
585
446
for ( size_t i = 0 ; i != triangulated.size (); ++i )
586
447
{
587
448
const carve::triangulate::tri_idx& triangle = triangulated[i];
@@ -626,32 +487,9 @@ namespace CSG_Adapter
626
487
meshset.reset ();
627
488
meshset = shared_ptr<meshset_t >( poly_cache.m_poly_data ->createMesh ( carve::input::opts () ) );
628
489
}
490
+
629
491
inline void simplifyMesh ( shared_ptr<meshset_t >& meshset, bool triangulate, StatusCallback* report_callback, BuildingEntity* entity )
630
492
{
631
- carve::mesh::MeshSimplifier simplifier;
632
- // double min_colinearity = m_geom_settings->m_min_colinearity;
633
- // double min_delta_v = m_geom_settings->m_min_delta_v;
634
- // double min_normal_angle = m_geom_settings->m_min_normal_angle;
635
- // double min_length = 0.0001;//m_geom_settings->m_min_length;
636
-
637
- // try
638
- // {
639
- // simplifier.removeFins(meshset.get());
640
- // //simplifier.cleanFaceEdges( meshset.get() );
641
- // //simplifier.removeRemnantFaces( meshset.get() );
642
- // //simplifier.mergeCoplanarFaces( meshset.get(), 0.0 );
643
- // //simplifier.eliminateShortEdges( meshset.get(), min_length );
644
- // //simplifier.removeFins(meshset.get());
645
- // simplifier.simplify( meshset.get(), min_colinearity, min_delta_v, min_normal_angle, min_length );
646
- // simplifier.removeFins(meshset.get());
647
- // //simplifier.removeLowVolumeManifolds(meshset, 0.01);
648
- // simplifier.improveMesh( meshset.get(), m_geom_settings->m_min_colinearity, m_geom_settings->m_min_delta_v, m_geom_settings->m_min_normal_angle );
649
- // }
650
- // catch(...)
651
- // {
652
- // std::cout << "simplifier.eliminateShortEdges failed." << std::endl;
653
- // }
654
-
655
493
if ( !meshset )
656
494
{
657
495
return ;
@@ -671,48 +509,22 @@ namespace CSG_Adapter
671
509
#endif
672
510
return ;
673
511
}
512
+
674
513
shared_ptr<meshset_t > meshset_copy ( meshset->clone () );
514
+ carve::mesh::MeshSimplifier simplifier;
675
515
simplifier.removeLowVolumeManifolds ( meshset.get (), 0.000000001 );
676
516
677
517
if ( meshset->meshes .size () < 1 )
678
518
{
679
519
return ;
680
520
}
681
521
682
- // size_t num_faces = getNumFaces( meshset.get() );
683
- // merge faces if their normals have a difference less than 10^-5 rad
684
- /* size_t modifications_coplanar = simplifier.mergeCoplanarFaces( meshset.get(), 0.00001 );
685
- if( modifications_coplanar > 0 )
686
- {
687
- int num_faces_post_merge = getNumFaces( meshset.get() );
688
- if( num_faces_post_merge + modifications_coplanar != num_faces )
689
- {
690
- #ifdef _DEBUG
691
- std::cout << "num_faces_post_merge + modifications_coplanar != num_faces" << std::endl;
692
- #endif
693
- }
694
- }*/
695
-
696
522
bool faces_ok = checkFaceIntegrity ( meshset );
697
523
if ( !faces_ok )
698
524
{
699
525
meshset = meshset_copy;
700
526
#ifdef _DEBUG
701
- std::cout << " Error in simplifier.mergeCoplanarFaces" << std::endl;
702
- #endif
703
- return ;
704
- }
705
-
706
- meshset_copy = shared_ptr<meshset_t >( meshset->clone () );
707
- // mergeAlignedEdges( meshset, simplifier );
708
- meshset->collectVertices (); // removes unreferenced Vertices
709
-
710
- faces_ok = checkFaceIntegrity ( meshset );
711
- if ( !faces_ok )
712
- {
713
- meshset = meshset_copy;
714
- #ifdef _DEBUG
715
- std::cout << " Error in mergeAlignedEdges" << std::endl;
527
+ std::cout << " Error in checkFaceIntegrity" << std::endl;
716
528
#endif
717
529
return ;
718
530
}
0 commit comments