Skip to content

Releases: educelab/OpenABF

Version 2.0.0

14 Oct 17:50

Choose a tag to compare

This version represents a major overhaul of the HalfEdgeMesh class with new features and methods for surface traversal and modification. Ultimately, we intend for this library to support easy flattening of multiple connected components stored in a single mesh, and this lays the foundation for that to happen.

While most of the API has stayed the same, or simply expanded in functionality, the biggest breaking change is the need to finalize the mesh structure after adding all of the faces. Previously, one simply added vertices and faces to the mesh:

// add vertices
mesh->insert_vertex(0, 0, 0);
mesh->insert_vertex(1, 0, 0);
mesh->insert_vertex(0, 1, 0);
mesh->insert_vertex(1, 1, 0);

// add faces
mesh->insert_face(0, 2, 1);
mesh->insert_face(1, 2, 3);

In this new version, you must additionally call HalfEdgeMesh::update_boundary() after adding all of the faces. This method checks for a variety of mesh construction errors which are now difficult to detect/correct at face insertion time. It also updates the mesh structure to make it easily possible to traverse both interior and boundary edges:

// add vertices
mesh->insert_vertex(0, 0, 0);
mesh->insert_vertex(1, 0, 0);
mesh->insert_vertex(0, 1, 0);
mesh->insert_vertex(1, 1, 0);

// add faces
mesh->insert_face(0, 2, 1);
mesh->insert_face(1, 2, 3);
mesh->update_boundary();   // NEW: Call when you're done adding faces

Alternatively, you can use the new insert_vertices() and insert_faces() methods to simplify this whole process:

// add vertices
mesh->insert_vertices({
  Vec3f{0, 0, 0},
  Vec3f{1, 0, 0},
  Vec3f{0, 1, 0},
  Vec3f{1, 1, 0}
});

// add faces
mesh->insert_faces({{0, 2, 1}, {1, 2, 3}});   // NEW: Automatically calls update_boundary()

Because of this change, a properly constructed HalfEdgeMesh no longer supports non-manifold surfaces or faces with inconsistent winding orders. These issues are now detected (and where possible, corrected) at mesh construction time rather than the user needing to call IsManifold before running one of the flattening algorithms.

Major changes

  • The project now requires C++17
  • HalfEdgeMesh
    • Add FindEdgePath for finding the shortest path between two vertices.
    • Add type member typedef for accessing the underlying type of the mesh's vertex elements.
    • Vertex: Add property function normal().
    • Edge: Add properties magnitude() and prev for previous edge in the triangle.
    • Face: Add properties area(), barycenter(), and normal().
    • Add clone() member function for cloning a mesh's structure.
    • Add insert_vertices() functions for adding many vertices at once.
    • Add update_boundary() function for finalizing the mesh structure once all faces have been added. This is now required when using insert_face().
    • Add insert_faces(), a convenience function for adding many faces at once and updating the mesh structure in a single step.
    • Add vertex, edge, and face getter functions.
    • Add various property functions for traversing the mesh structure: boundary_edge(), boundaries(), num_connected_components(), connected_components(), incoming_edges(), outgoing_edges().
    • Add split_edge() and split_path() functions for inserting seams in the mesh.
  • MeshIO - New module for reading and writing simple mesh files. Currently supports basic OBJ and PLY files.
  • Parameterization - Add support for conjugate gradient and other Eigen solvers.
  • Added new examples and renamed some of the old ones.
  • Lots of test and documentation updates.

See the following MRs for more details: !14, !17

Full Changelog: v1.1.1...v2.0.0

Version 1.1.1

28 Feb 18:53

Choose a tag to compare

Patch release to fix compilation on gcc

Version 1.1

28 Feb 16:01

Choose a tag to compare

  • Improve detection of degenerate edge constructions
  • Fix the Vec fold expression on C++17
  • Add standalone functions for detecting unreferenced vertices in a mesh
  • Various documentation improvements and bug fixes

Version 1.0

31 Jan 18:34

Choose a tag to compare

The initial release of OpenABF. Provides implementations of ABF, ABF++, and Angle-based LSCM.