Skip to content

Commit fa1c31e

Browse files
committed
DMesh3: fixed bug in BoundingBox, added FindEdgeFromTri (faster than FindEdge?), more info in EdgeCollapseInfo, IsGroupBoundaryEdge, IsGroupBoundaryVertex,
1 parent 8b48cd0 commit fa1c31e

File tree

1 file changed

+81
-8
lines changed

1 file changed

+81
-8
lines changed

mesh/DMesh3.cs

Lines changed: 81 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -502,12 +502,18 @@ public System.Collections.IEnumerable EdgeIndices() {
502502

503503
// queries
504504

505-
int FindEdge(int vA, int vB) {
505+
// linear search through edges of vA
506+
public int FindEdge(int vA, int vB) {
506507
return find_edge(vA, vB);
507508
}
508509

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+
509515
// [RMS] this does more work than necessary, see
510-
Index2i GetEdgeOpposingV(int eID)
516+
public Index2i GetEdgeOpposingV(int eID)
511517
{
512518
int i = 4*eID;
513519
int a = edges[i], b = edges[i + 1];
@@ -761,6 +767,18 @@ int find_edge(int vA, int vB)
761767
return (idx == -1) ? InvalidID : e0[idx];
762768
}
763769

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+
764782
void set_edge_vertices(int eID, int a, int b) {
765783
int i = 4*eID;
766784
edges[i] = Math.Min(a,b);
@@ -1116,7 +1134,12 @@ void check_edge(int e) {
11161134
public struct EdgeCollapseInfo {
11171135
public int vKept;
11181136
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)
11201143
}
11211144
public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo collapse)
11221145
{
@@ -1243,6 +1266,7 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
12431266
}
12441267
}
12451268

1269+
int ebc = InvalidID, ebd = InvalidID;
12461270
if (bIsBoundaryEdge == false) {
12471271

12481272
// remove all edges from vtx a, then remove vtx a
@@ -1269,8 +1293,8 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
12691293
Debug.Assert( edges_refcount.isValid( eac ) == false );
12701294

12711295
// 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 );
12741298

12751299
if( replace_edge_triangle(ebd, t1, tad ) == -1 )
12761300
debug_fail("isboundary=false branch, ebd replace triangle");
@@ -1290,7 +1314,7 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
12901314

12911315
} else {
12921316

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
12941318

12951319
// remove all edges from vtx a, then remove vtx a
12961320
edges_a.Clear();
@@ -1311,7 +1335,7 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
13111335
Debug.Assert( edges_refcount.isValid( eac ) == false );
13121336

13131337
// replace t0 in edge ebc that we kept
1314-
int ebc = find_edge( b, c );
1338+
ebc = find_edge( b, c );
13151339
if ( replace_edge_triangle(ebc, t0, tac ) == -1 )
13161340
debug_fail("isboundary=false branch, ebc replace triangle");
13171341

@@ -1325,6 +1349,10 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
13251349
collapse.vKept = vKeep;
13261350
collapse.vRemoved = vRemove;
13271351
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;
13281356

13291357
updateTimeStamp();
13301358
return MeshResult.Ok;
@@ -1340,6 +1368,50 @@ public MeshResult CollapseEdge(int vKeep, int vRemove, out EdgeCollapseInfo coll
13401368

13411369
// queries
13421370

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+
13431415
// compute vertex bounding box
13441416
public AxisAlignedBox3d GetBounds()
13451417
{
@@ -1350,7 +1422,7 @@ public AxisAlignedBox3d GetBounds()
13501422
}
13511423
double minx = x, maxx = x, miny = y, maxy = y, minz = z, maxz = z;
13521424
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];
13541426
if (x < minx) minx = x; else if (x > maxx) maxx = x;
13551427
if (y < miny) miny = y; else if (y > maxy) maxy = y;
13561428
if (z < minz) minz = z; else if (z > maxz) maxz = z;
@@ -1445,6 +1517,7 @@ public bool CheckValidity() {
14451517
e[j] = FindEdge(a, b);
14461518
DMESH_CHECK_OR_FAIL(e[j] != InvalidID);
14471519
DMESH_CHECK_OR_FAIL(edge_has_t(e[j], tID));
1520+
DMESH_CHECK_OR_FAIL(e[j] == FindEdgeFromTri(a, b, tID));
14481521
}
14491522
DMESH_CHECK_OR_FAIL(e[0] != e[1] && e[0] != e[2] && e[1] != e[2]);
14501523

0 commit comments

Comments
 (0)