Skip to content

Commit

Permalink
Fix GetTriangles
Browse files Browse the repository at this point in the history
  • Loading branch information
cartesian-theatrics committed Dec 26, 2024
1 parent 926909d commit 58f4963
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 8 deletions.
2 changes: 1 addition & 1 deletion bindings/java/version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.0.2
2.0.3
29 changes: 23 additions & 6 deletions src/manifold.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1053,13 +1053,30 @@ std::vector<float> Manifold::GetVertices() const {

std::vector<int> Manifold::GetTriangles() const {
const Impl& impl = *GetCsgLeafNode().GetImpl();
const Vec<ivec3> triVerts = impl.meshRelation_.triProperties;
Vec<ivec3> triVerts = impl.meshRelation_.triProperties;
int numTri = impl.NumTri();
std::vector<int> ret;
ret.reserve(triVerts.size() * 3);
for (auto& triVert: triVerts) {
ret.push_back(triVert[0]);
ret.push_back(triVert[1]);
ret.push_back(triVert[2]);
ret.reserve(numTri);
std::vector<int> triNew2Old(numTri);

std::iota(triNew2Old.begin(), triNew2Old.end(), 0);
const bool isOriginal = impl.meshRelation_.originalID >= 0;
VecView<const TriRef> triRef = impl.meshRelation_.triRef;
// Don't sort originals - keep them in order
if (!isOriginal) {
std::sort(triNew2Old.begin(), triNew2Old.end(), [triRef](int a, int b) {
return triRef[a].originalID == triRef[b].originalID
? triRef[a].meshID < triRef[b].meshID
: triRef[a].originalID < triRef[b].originalID;
});
}


for (int tri = 0; tri < numTri; ++tri) {
const int oldTri = triNew2Old[tri];
for (const int i : {0, 1, 2})
ret.push_back(impl.halfedge_[3 * oldTri + i].startVert);

}
return ret;

Expand Down
9 changes: 8 additions & 1 deletion test/manifold_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,13 @@ TEST(Manifold, Slices) {
}
#endif

TEST(Manifold, GetTriangles) {
Manifold man = Manifold::Cube();
std::vector<int> triangles = man.GetTriangles();
EXPECT_EQ(man.NumTri(), 12);
EXPECT_EQ(triangles.size(), 12*3);
}

TEST(Manifold, MeshRelation) {
MeshGL gyroidMeshGL = WithPositionColors(Gyroid()).AsOriginal().GetMeshGL();
Manifold gyroid(gyroidMeshGL);
Expand Down Expand Up @@ -1007,4 +1014,4 @@ TEST(Manifold, MergeRefine) {
manifold = manifold.RefineToLength(1.0);
EXPECT_NEAR(manifold.Volume(), 31.21, 0.01);
}
#endif
#endif

0 comments on commit 58f4963

Please sign in to comment.