Frame Fields: Anisotropic and Non-Orthogonal Cross Fields




  • Paper topic: Geometry
  • Software type: Code
  • Able to run a replicability test: True
  • Replicability score: 3
  • Software language: C/C++
  • License: unspecified
  • Build mechanism: None
  • Dependencies: libigl / comiso / eigen / glad / glfw /
  • Documentation score {0,1,2}: 1
  • Reviewer: Nicolas Bonneel <>
  • Time spent for the test (build->first run, timeout at 100min): 100min

Source code information


The code provided on the project website consists in a single downloadable main.cpp file. It is unclear if the core implementation is in libigl (mentioned in the includes) or in the main.cpp. To make the main compile, it has to be updated since it relies on a very old libigl :
- replace #include <igl/viewer/Viewer.h> by #include <igl/opengl/glfw/Viewer.h>
- replace #include <igl/comiso/nrosy.h>,  <igl/comiso/miq.h> and <igl/comiso/frame_field.h> by #include <igl/copyleft/comiso/nrosy.h>,  <igl/copyleft/comiso/miq.h>, and <igl/copyleft/comiso/frame_field.h>
- replace igl::Viewer& viewer by igl::opengl::glfw::Viewer& viewer in key_down(..)
- replace igl::Viewer viewer; by igl::opengl::glfw::Viewer viewer; in main()
- replace all by (24 times)
- replace viewer.core.show_lines by 
- replace viewer.core.show_texture by
- replace igl::nrosy, igl::miq and igl::frame_field  by igl::copyleft::comiso::nrosy, igl::copyleft::comiso::miq and igl::copyleft::comiso::frame_field
- replace Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic> texture_R, texture_G, texture_B; by Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic> texture_R, texture_G, texture_B; (otherwise you get an YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY error in Eigen) ; you similarly need to change the parameters of line_texture by replacing char with unsigned char.
- add #include <igl/local_basis.h> and #include <igl/rotate_vectors.h>
- *** IGL bug *** : in igl/grad.cpp, in lines 226 and 228, grad_tri and grad_tet should be replaced by igl::grad_tri and igl::grad_tet since they are outside of the namespace.
Since no CMakeList is given, you need to add the following preprocessor directives (tested on Visual Studio 2017) :
- EIGEN_NO_DEPRECATED_WARNING; since Eigen::DynamicSparseMatrix is deprecated (and might just not work in the near future)
- the blas shipped with Eigen should be compiled and linked to the project (it compiles smoothly with the provided CMakeList).
- my list of linked libraries looks like: igl_opengl_glfw.lib;igl_opengl.lib;igl.lib;comiso.lib;igl_comiso.lib;eigen_blas_static.lib;glad.lib;glfw3.lib
- I had to compile it in Multithread (MT), not the default Multithread DLL, due to the way igl is compiled by default (it seems).
Ultimately, I managed to run the provided example. The data is shipped with the IGL tutorial data. This is the only object provided with constraints stored as a dmat file (how can I generate one ?). All the figure results are provided in a separate archive, but without the constraint file, I cannot test whether it works.
I also couldn't get the cross frame to render like in the paper : part of the shape show cross frames over a red mesh (by pressing '1'), but part of the shape remains white with no frames. This might be due to the char -> unsigned char bug fix (?).

If you want to contribute with another review, please follow these instructions.

Please consider to cut/paste/edit the raw JSON data attached to this paper.