@@ -502,12 +502,18 @@ public System.Collections.IEnumerable EdgeIndices() {
502
502
503
503
// queries
504
504
505
- int FindEdge ( int vA , int vB ) {
505
+ // linear search through edges of vA
506
+ public int FindEdge ( int vA , int vB ) {
506
507
return find_edge ( vA , vB ) ;
507
508
}
508
509
510
+ // faster than FindEdge
511
+ public int FindEdgeFromTri ( int vA , int vB , int t ) {
512
+ return find_edge_from_tri ( vA , vB , t ) ;
513
+ }
514
+
509
515
// [RMS] this does more work than necessary, see
510
- Index2i GetEdgeOpposingV ( int eID )
516
+ public Index2i GetEdgeOpposingV ( int eID )
511
517
{
512
518
int i = 4 * eID ;
513
519
int a = edges [ i ] , b = edges [ i + 1 ] ;
@@ -761,6 +767,18 @@ int find_edge(int vA, int vB)
761
767
return ( idx == - 1 ) ? InvalidID : e0 [ idx ] ;
762
768
}
763
769
770
+ int find_edge_from_tri ( int vA , int vB , int tID )
771
+ {
772
+ int i = 3 * tID ;
773
+ if ( IndexUtil . same_pair_unordered ( vA , vB , triangles [ i ] , triangles [ i + 1 ] ) )
774
+ return triangle_edges [ i ] ;
775
+ if ( IndexUtil . same_pair_unordered ( vA , vB , triangles [ i + 1 ] , triangles [ i + 2 ] ) )
776
+ return triangle_edges [ i + 1 ] ;
777
+ if ( IndexUtil . same_pair_unordered ( vA , vB , triangles [ i + 2 ] , triangles [ i ] ) )
778
+ return triangle_edges [ i + 2 ] ;
779
+ return InvalidID ;
780
+ }
781
+
764
782
void set_edge_vertices ( int eID , int a , int b ) {
765
783
int i = 4 * eID ;
766
784
edges [ i ] = Math . Min ( a , b ) ;
@@ -1116,7 +1134,12 @@ void check_edge(int e) {
1116
1134
public struct EdgeCollapseInfo {
1117
1135
public int vKept ;
1118
1136
public int vRemoved ;
1119
- public bool bIsBoundary ;
1137
+ public bool bIsBoundary ;
1138
+
1139
+ public int eCollapsed ; // edge we collapsed
1140
+ public int tRemoved0 , tRemoved1 ; // tris we removed (second may be invalid)
1141
+ public int eRemoved0 , eRemoved1 ; // edges we removed (second may be invalid)
1142
+ public int eKept0 , eKept1 ; // edges we kept (second may be invalid)
1120
1143
}
1121
1144
public MeshResult CollapseEdge ( int vKeep , int vRemove , out EdgeCollapseInfo collapse )
1122
1145
{
@@ -1243,6 +1266,7 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
1243
1266
}
1244
1267
}
1245
1268
1269
+ int ebc = InvalidID , ebd = InvalidID ;
1246
1270
if ( bIsBoundaryEdge == false ) {
1247
1271
1248
1272
// remove all edges from vtx a, then remove vtx a
@@ -1269,8 +1293,8 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
1269
1293
Debug . Assert ( edges_refcount . isValid ( eac ) == false ) ;
1270
1294
1271
1295
// replace t0 and t1 in edges ebd and ebc that we kept
1272
- int ebd = find_edge ( b , d ) ;
1273
- int ebc = find_edge ( b , c ) ;
1296
+ ebd = find_edge ( b , d ) ;
1297
+ ebc = find_edge ( b , c ) ;
1274
1298
1275
1299
if ( replace_edge_triangle ( ebd , t1 , tad ) == - 1 )
1276
1300
debug_fail ( "isboundary=false branch, ebd replace triangle" ) ;
@@ -1290,7 +1314,7 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
1290
1314
1291
1315
} else {
1292
1316
1293
- // this is basically same code as above, just not referencing t0 /d
1317
+ // this is basically same code as above, just not referencing t1 /d
1294
1318
1295
1319
// remove all edges from vtx a, then remove vtx a
1296
1320
edges_a . Clear ( ) ;
@@ -1311,7 +1335,7 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
1311
1335
Debug . Assert ( edges_refcount . isValid ( eac ) == false ) ;
1312
1336
1313
1337
// replace t0 in edge ebc that we kept
1314
- int ebc = find_edge ( b , c ) ;
1338
+ ebc = find_edge ( b , c ) ;
1315
1339
if ( replace_edge_triangle ( ebc , t0 , tac ) == - 1 )
1316
1340
debug_fail ( "isboundary=false branch, ebc replace triangle" ) ;
1317
1341
@@ -1325,6 +1349,10 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
1325
1349
collapse . vKept = vKeep ;
1326
1350
collapse . vRemoved = vRemove ;
1327
1351
collapse . bIsBoundary = bIsBoundaryEdge ;
1352
+ collapse . eCollapsed = eab ;
1353
+ collapse . tRemoved0 = t0 ; collapse . tRemoved1 = t1 ;
1354
+ collapse . eRemoved0 = eac ; collapse . eRemoved1 = ead ;
1355
+ collapse . eKept0 = ebc ; collapse . eKept1 = ebd ;
1328
1356
1329
1357
updateTimeStamp ( ) ;
1330
1358
return MeshResult . Ok ;
@@ -1340,6 +1368,50 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
1340
1368
1341
1369
// queries
1342
1370
1371
+
1372
+ public bool IsGroupBoundaryEdge ( int eID )
1373
+ {
1374
+ if ( IsEdge ( eID ) == false )
1375
+ throw new Exception ( "DMesh3.IsGroupBoundaryEdge: " + eID + " is not a valid edge" ) ;
1376
+ int et1 = edges [ 4 * eID + 3 ] ;
1377
+ if ( et1 == InvalidID )
1378
+ return false ;
1379
+ int g1 = triangle_groups [ et1 ] ;
1380
+ int et0 = edges [ 4 * eID + 2 ] ;
1381
+ int g0 = triangle_groups [ et0 ] ;
1382
+ return g1 != g0 ;
1383
+ }
1384
+
1385
+
1386
+ // returns true if vertex has more than two tri groups in its tri nbrhood
1387
+ public bool IsGroupBoundaryVertex ( int vID )
1388
+ {
1389
+ if ( IsVertex ( vID ) == false )
1390
+ throw new Exception ( "DMesh3.IsGroupBoundaryVertex: " + vID + " is not a valid vertex" ) ;
1391
+ if ( triangle_groups == null )
1392
+ return false ;
1393
+ List < int > vedges = vertex_edges [ vID ] ;
1394
+ int group_id = int . MinValue ;
1395
+ foreach ( int eID in vedges ) {
1396
+ int et0 = edges [ 4 * eID + 2 ] ;
1397
+ int g0 = triangle_groups [ et0 ] ;
1398
+ if ( group_id != g0 ) {
1399
+ if ( group_id == int . MinValue )
1400
+ group_id = g0 ;
1401
+ else
1402
+ return true ; // saw multiple group IDs
1403
+ }
1404
+ int et1 = edges [ 4 * eID + 3 ] ;
1405
+ if ( et1 != InvalidID ) {
1406
+ int g1 = triangle_groups [ et1 ] ;
1407
+ if ( group_id != g1 )
1408
+ return true ; // saw multiple group IDs
1409
+ }
1410
+ }
1411
+ return false ;
1412
+ }
1413
+
1414
+
1343
1415
// compute vertex bounding box
1344
1416
public AxisAlignedBox3d GetBounds ( )
1345
1417
{
@@ -1350,7 +1422,7 @@ public AxisAlignedBox3d GetBounds()
1350
1422
}
1351
1423
double minx = x , maxx = x , miny = y , maxy = y , minz = z , maxz = z ;
1352
1424
foreach ( int vi in vertices_refcount ) {
1353
- x = vertices [ vi ] ; y = vertices [ vi + 1 ] ; z = vertices [ vi + 2 ] ;
1425
+ x = vertices [ 3 * vi ] ; y = vertices [ 3 * vi + 1 ] ; z = vertices [ 3 * vi + 2 ] ;
1354
1426
if ( x < minx ) minx = x ; else if ( x > maxx ) maxx = x ;
1355
1427
if ( y < miny ) miny = y ; else if ( y > maxy ) maxy = y ;
1356
1428
if ( z < minz ) minz = z ; else if ( z > maxz ) maxz = z ;
@@ -1445,6 +1517,7 @@ public bool CheckValidity() {
1445
1517
e [ j ] = FindEdge ( a , b ) ;
1446
1518
DMESH_CHECK_OR_FAIL ( e [ j ] != InvalidID ) ;
1447
1519
DMESH_CHECK_OR_FAIL ( edge_has_t ( e [ j ] , tID ) ) ;
1520
+ DMESH_CHECK_OR_FAIL ( e [ j ] == FindEdgeFromTri ( a , b , tID ) ) ;
1448
1521
}
1449
1522
DMESH_CHECK_OR_FAIL ( e [ 0 ] != e [ 1 ] && e [ 0 ] != e [ 2 ] && e [ 1 ] != e [ 2 ] ) ;
1450
1523
0 commit comments