For now, if you want an overview of that Geogram does, the following link gives a description of several sets of functionalities: https://github.com/BrunoLevy/geogram/wiki#mini-tutorials-and...
Amazing analogy that really helps me understand these algorithms better. Thanks for that.
However, software engineering and API design could have been much better. That’s not quite a library IMO, it’s a large OO-based framework. Geogram implements stuff like logging, multi-threading, reference counting, class factories, memory management, asserts, Boolean type, atomics, and more. This makes it relatively hard to integrate, especially for Windows OS where the OS kernel is very different from all others.
I'd be interested to know what is a true "showstopper" for you, do not hesitate to post issues here: https://github.com/BrunoLevy/geogram/issues
Also, Open3D is looking very cool, good pointer.
- CGAL is fully generic and makes an extensive use of modern C++ / generic programming / templates.
- Geogram is targeted towards several specific scenarii, with no compromise regarding efficiency and memory consumption. For instance, Geogram's data structures are based on contiguous arrays of values and indices, compact in memory, with fully parallel code, whereas CGAL uses for instance "property maps", that are more "generic" but that introduce a log(n) penalty for each individual access.
TL;DR: CGAL is configurable/generic/has many tuning buttons. Geogram is highly optimized in terms of memory usage and speed for some specific applications. Which one is best for you ? Depends on what you want to do !
https://brunolevy.github.io/geogram/geogram_design.html
CGAL offers exact algorithms:
https://doc.cgal.org/latest/Kernel_23/index.html#Chapter_2D_...
TL;DR: if you need a generalist library, use CGAL or libigl, if you have very specific needs of performance / compactness of the code / low memory consumption for specific functionalities, then you may need Geogram.
1) comparison between geogram and other libraries (CGAL, libigl)
Is is very difficult to compare different "swiss army knives" that have a completely different set of blades. Geogram specificities are:
- focusing on a small set of algorithms and use cases, and optimizing them (whereas the other libraries are more general-use). This includes:
- Delaunay/Voronoi/Power diagrams in 2D and 3D, with optional periodic conditions. For instance, it is used in my research on cosmology, that has diagrams of astronomical size, with hundred millions points (the other libraries no longer fit in memory). The price to pay: geogram does not support vertex suppression (if you need that, you can use CGAL).
- Mesh parameterization and segmentation, texture generation
- Baking (transfer attributes between textured meshes / generate normal maps)
- Mesh repair
- Remeshing
- Restricted Voronoi diagrams for surfaces and volumes embedded in space of arbitrary dimension. Not everybody will need that, but it is used internally by the surface remesher (that works in dimension 6)
- Semi-discrete optimal transport
Some features are presented here: https://github.com/BrunoLevy/geogram/wiki#mini-tutorials-and... It does not have mesh deformation (you can use libIGL if you need them)
It also has lower-level components:
- sparse linear solver OpenNL CPU/GPU
- easy-to-use 3D graphics API on top of OpenGL3
- minimalist framework around Dear ImGui to develop applications with GUIs
- focusing on portability and ease of compilation Geogram works on Linux/Mac/Windows/Emscripten/Android
You can run some demos in your browser (thanks to Emscripten): https://github.com/BrunoLevy/geogram/wiki/compiling_Emscript...
- programming API and design choices
Geogram has nearly no dependency. Geogram does not use Boost (that I don't like, I find it too heavy, that's personal choice). Geogram is not a "header only" library and moderately uses modern C++ constructs. Design choices are explained in this presentation: https://fr.slideshare.net/BrunoLevy4/the-joy-of-computer-gra...
In the end, the compiled library is very small (a few megabytes) and can be easily embedded in other applications (a list here of usages in industry and academy: https://github.com/BrunoLevy/geogram/wiki/Publications)
- It has an interactive application here: https://github.com/BrunoLevy/GraphiteThree (you can load your meshes, repair them, remesh them etc...)
2) Does it support exact geometric computations ?
Of course ! It has exact predicates and exact geometric constructs. They are implemented using arithmetic expansions (https://brunolevy.github.io/geogram/multi__precision_8h.html) (that uses array of doubles internally), and it is fast. It has its tool to automatically generate exact geometric predicates from their formulas.
3) Boolean operations ?
They are on their way (https://twitter.com/BrunoLevy01/status/1623347815307960321). Current version is here: https://github.com/BrunoLevy/Experiment (Graphite plugin). Most models from Thingy10K are OK, currently focussing on a couple of "monsters" that push the limit.
4) I want to only use a subset of the library
Geogram has a system to extract "pluggable software modules", that is, a .h/.cpp pair with a single functionality. There are PSMs for:
- exact arithmetics and predicates https://github.com/BrunoLevy/geogram.psm.Predicates
- Delaunay triangulations https://github.com/BrunoLevy/geogram.psm.Delaunay
- OpenNL linear solver (CPU and GPU) https://github.com/BrunoLevy/geogram.psm.OpenNL
An example is logging. Geogram includes a logger implementation which uses console streams. GUI apps don't have these streams, they sometimes even deadlock, when an app prints too many characters no one is reading on the other end of the pipe. Geogram includes another file logging implementation in FileLogger class. It uses std::string for path, which doesn’t work on Windows because Windows paths are using UTF-16 encoding.
Also, many parts of Geogram are bypassing the logger API, they directly printing text into std::cerr.
Here’s a possible example of an API which allows to inject custom loggers into DLL libraries:
// Log level for messages
enum struct eLogLevel : uint8_t
{
Error = 0, Warning = 1, Info = 2, Debug = 3
};
// C function pointer to receive log messages from the library. The messages are encoded in UTF-8.
using pfnLoggerSink = void( __cdecl* )( void* context, eLogLevel lvl, const char* message );Please note that the Logger mechanism can be redirected to a GUI, it is used for instance in the GUI applications made with Geogram (https://github.com/BrunoLevy/geogram/wiki/Applications) and in Graphite (https://github.com/BrunoLevy/GraphiteThree)
About using std::string as path under Windows, I understand that it may cause some problems with users who use general characters in their directories, but it does not prevent the application from running and from loading/writing files. In the future, when std::filesystem is well standardized, I plan to get read of my FileSystem implementation.
Mesh analysis (how many manifolds, how many holes, self-Intersection detection, flipped triangles, etc)
Mesh healing algorithms to fix above artifacts
Boolean operations
Laplacian Deformation / smoothing
Offset calculation
Sewing meshes together
Mesh tagging to guide certain operations
Mesh matching
Convex Hull computation
- Mesh reconstruction from 3D pointsets
- Mesh analysis
- Mesh repair
- Anisotropic remeshing
- Texture atlas generation
- Texture baking, normal map generation, ambient occlusion map
- Tetrahedral meshing (with tetgen)
- Boolean operations (upcoming)
- Delaunay, Voronoi, Laguerre diagrams, convex hulls in 2D and 3D. Highly optimized parallel implementation (used e.g. in cosmological simulations)
- Manifold Harmonics (Laplacian Eigenvalues)
- Parallel linear solver (CPU and GPU)
See the following link for examples: https://github.com/BrunoLevy/geogram/wiki#mini-tutorials-and...
- Geogram is used in several projects and libraries, see the list here: https://github.com/BrunoLevy/geogram/wiki/Publications
- Seeing some comments, I understand that some global objects in Geogram (Logger, Bibliography manager) are annoying for some use cases. I will add some options to deactivate them in the next release. Feel free to create issues here: https://github.com/BrunoLevy/geogram/issues
The good thing about that library is the permissive license. Here’s a project where I managed to reuse substantial parts of that library by copy-pasting and reworking the code: https://github.com/Const-me/fTetWild/tree/master/MeshRepair/...
It wasn’t pretty https://github.com/Const-me/fTetWild/blob/master/MeshRepair/... but it worked fine for the use case I had at that time.