Polygon Mesh Processing Library
No Matches
Version 2.0 Released

Aug 14, 2022

We are pleased to announce version 2.0 of the Polygon Mesh Processing Library! This is a major release containing several additions and improvements as well as a few breaking changes to the API. Highlights include:

  • Support for texture seams in pmp::SurfaceSimplification
  • A new quad/triangle subdivision scheme
  • A new pmp::SurfaceFactory class for generating basic shapes
  • Error reporting using exceptions
  • Improved compatibility with the STL and CGAL
  • Additional rendering capabilities
  • Switch to C++14

See the changelog for a full summary of changes.

The API changes in this release are relatively minor. Upgrading existing code from previous versions should be straightforward. We encourage all users to upgrade to 2.0. After this release, we will likely do some more invasive changes.

Seam-aware Mesh Simplification

Seam-aware mesh simplification: Textured mesh with seams, simplified mesh with preserved seams

The pmp::SurfaceSimplification class has been extended to be aware of texture seams, thereby effectively allowing the same texture to be used for different resolutions of a mesh. Additional parameters control the maximum deviation allowed during simplification and a threshold to detect texture seams. Thanks to Timo Menzel from TU Dortmund for his contribution!

Quad/Triangle Subdivision

Quad/Triangle Subdivision

The pmp::SurfaceSubdivision class has a new quad/triangle subdivision scheme that allows for smooth subdivision of mixed element quad and triangle meshes. The scheme is a generalization of the Catmull-Clark and Loop subdivision algorithms. See the original paper [22] for details. Thanks to Hendrik Meyer for his contribution.

Generating Basic Shapes

Platonic Solids

The new pmp::SurfaceFactory class provides convenience methods to generate basic shapes such as Platonic solids, spheres, planes, cylinders, cones, or torii. This comes in handy for unit testing but also for testing your algorithm against shapes with well-defined properties.

Using Exceptions

We adopted exceptions as our main mechanism for reporting errors. Specific exception types are defined in pmp/Exceptions.h. So far, we distinguish between the following types of errors:

A simple example to check for invalid input passed to an algorithm looks like this:

try {
} catch (const InvalidInputException &e) {
std::cerr << e.what() << std::endl;

We changed public functions that used to return bool values to indicate success or failure accordingly.

Breaking Changes

  • Removed SurfaceMesh::triangulate()
  • Removed SurfaceSubdivision::sqrt3()
  • Removed PMP_SHOW macro
  • Removed Version class and Version.h header
  • Removed pmp::TriangleKdTree::NearestNeighbor::tests member
  • Report errors using exceptions
  • Make pmp::SurfaceTriangulation::Objective a scoped enum
  • pmp::SurfaceFeatures now returns the number of boundary / feature edges detected.

Obtaining the pmp-library

Get your own copy by cloning:

git clone --recursive https://github.com/pmp-library/pmp-library.git

Checkout the 2.0 release tag:

cd pmp-library && git checkout 2.0.0

Configure and build:

mkdir build && cd build && cmake .. && make

Run the mesh processing app

./mpview ../external/pmp-data/off/bunny.off

Reporting Bugs or Problems

If you encounter any glitches or problems please report the issue on GitHub.