瀏覽代碼

merge

Former-commit-id: ad39f28f04c63ec9524618a766144632b6f41241
Alec Jacobson 7 年之前
父節點
當前提交
082d6db96a
共有 100 個文件被更改,包括 2253 次插入639 次删除
  1. 2 1
      .appveyor.yml
  2. 3 3
      .gitmodules
  3. 4 3
      .travis.yml
  4. 0 7
      LICENSE
  5. 40 0
      LICENSE.md
  6. 1 3
      README.md
  7. 1432 0
      include/igl/colormap.cpp
  8. 76 0
      include/igl/colormap.h
  9. 4 4
      include/igl/copyleft/cgal/CGAL_includes.hpp
  10. 13 13
      include/igl/copyleft/cgal/insert_into_cdt.cpp
  11. 8 7
      include/igl/copyleft/cgal/insert_into_cdt.h
  12. 8 8
      include/igl/copyleft/cgal/projected_cdt.cpp
  13. 6 5
      include/igl/copyleft/cgal/projected_cdt.h
  14. 1 1
      include/igl/copyleft/opengl2/render_to_tga.cpp
  15. 1 1
      include/igl/copyleft/opengl2/render_to_tga.h
  16. 0 0
      include/igl/copyleft/opengl2/texture_from_tga.cpp
  17. 2 2
      include/igl/copyleft/opengl2/texture_from_tga.h
  18. 1 1
      include/igl/copyleft/opengl2/tga.cpp
  19. 2 2
      include/igl/copyleft/opengl2/tga.h
  20. 3 0
      include/igl/integrable_polyvector_fields.cpp
  21. 25 81
      include/igl/jet.cpp
  22. 2 2
      include/igl/jet.h
  23. 12 38
      include/igl/parula.cpp
  24. 3 262
      include/igl/parula.h
  25. 2 2
      include/igl/png/readPNG.cpp
  26. 2 2
      include/igl/png/render_to_png.cpp
  27. 2 2
      include/igl/png/render_to_png_async.cpp
  28. 6 6
      include/igl/png/texture_from_png.cpp
  29. 2 2
      include/igl/png/writePNG.cpp
  30. 1 0
      include/igl/sortrows.cpp
  31. 13 13
      include/igl/unique_edge_map.cpp
  32. 1 1
      include/igl/unique_edge_map.h
  33. 1 5
      include/igl/unique_rows.cpp
  34. 40 40
      include/igl/xml/XMLSerializable.h
  35. 18 18
      include/igl/xml/serialize_xml.h
  36. 3 3
      include/igl/xml/writeDAE.cpp
  37. 72 101
      python/CMakeLists.txt
  38. 7 0
      python/iglhelpers.py
  39. 7 0
      python/modules/copyleft/py_igl_cgal.cpp
  40. 7 0
      python/modules/copyleft/py_igl_comiso.cpp
  41. 7 0
      python/modules/copyleft/py_igl_copyleft.cpp
  42. 7 0
      python/modules/copyleft/py_igl_tetgen.cpp
  43. 7 0
      python/modules/py_igl_embree.cpp
  44. 7 0
      python/modules/py_igl_png.cpp
  45. 7 0
      python/modules/py_igl_triangle.cpp
  46. 7 0
      python/modules/py_igl_viewer.cpp
  47. 7 0
      python/modules/py_typedefs.cpp
  48. 7 0
      python/modules/py_typedefs.h
  49. 7 0
      python/modules/py_vector.cpp
  50. 7 0
      python/py_doc.cpp
  51. 7 0
      python/py_doc.h
  52. 7 0
      python/py_igl.cpp
  53. 7 0
      python/py_igl/copyleft/cgal/py_RemeshSelfIntersectionsParam.cpp
  54. 7 0
      python/py_igl/copyleft/cgal/py_mesh_boolean.cpp
  55. 7 0
      python/py_igl/copyleft/cgal/py_remesh_self_intersections.cpp
  56. 7 0
      python/py_igl/copyleft/comiso/py_miq.cpp
  57. 7 0
      python/py_igl/copyleft/comiso/py_nrosy.cpp
  58. 7 0
      python/py_igl/copyleft/py_marching_cubes.cpp
  59. 7 0
      python/py_igl/copyleft/py_swept_volume.cpp
  60. 7 0
      python/py_igl/copyleft/tetgen/py_tetrahedralize.cpp
  61. 7 0
      python/py_igl/embree/py_ambient_occlusion.cpp
  62. 7 0
      python/py_igl/embree/py_line_mesh_intersection.cpp
  63. 7 0
      python/py_igl/embree/py_reorient_facets_raycast.cpp
  64. 7 0
      python/py_igl/png/py_readPNG.cpp
  65. 7 0
      python/py_igl/png/py_writePNG.cpp
  66. 7 0
      python/py_igl/py_AABB.cpp
  67. 7 0
      python/py_igl/py_ARAPEnergyType.cpp
  68. 7 0
      python/py_igl/py_MeshBooleanType.cpp
  69. 7 0
      python/py_igl/py_SolverStatus.cpp
  70. 7 0
      python/py_igl/py_active_set.cpp
  71. 7 0
      python/py_igl/py_adjacency_list.cpp
  72. 7 0
      python/py_igl/py_arap.cpp
  73. 7 0
      python/py_igl/py_avg_edge_length.cpp
  74. 7 0
      python/py_igl/py_barycenter.cpp
  75. 7 0
      python/py_igl/py_barycentric_coordinates.cpp
  76. 7 0
      python/py_igl/py_barycentric_to_global.cpp
  77. 7 0
      python/py_igl/py_bbw.cpp
  78. 7 0
      python/py_igl/py_boundary_conditions.cpp
  79. 7 0
      python/py_igl/py_boundary_facets.cpp
  80. 7 0
      python/py_igl/py_boundary_loop.cpp
  81. 7 0
      python/py_igl/py_cat.cpp
  82. 7 0
      python/py_igl/py_collapse_edge.cpp
  83. 7 0
      python/py_igl/py_colon.cpp
  84. 7 0
      python/py_igl/py_column_to_quats.cpp
  85. 7 0
      python/py_igl/py_comb_cross_field.cpp
  86. 7 0
      python/py_igl/py_comb_frame_field.cpp
  87. 7 0
      python/py_igl/py_compute_frame_field_bisectors.cpp
  88. 7 0
      python/py_igl/py_cotmatrix.cpp
  89. 7 0
      python/py_igl/py_covariance_scatter_matrix.cpp
  90. 7 0
      python/py_igl/py_cross_field_missmatch.cpp
  91. 7 0
      python/py_igl/py_cut_mesh_from_singularities.cpp
  92. 7 0
      python/py_igl/py_deform_skeleton.cpp
  93. 7 0
      python/py_igl/py_directed_edge_orientations.cpp
  94. 7 0
      python/py_igl/py_directed_edge_parents.cpp
  95. 7 0
      python/py_igl/py_doublearea.cpp
  96. 7 0
      python/py_igl/py_dqs.cpp
  97. 7 0
      python/py_igl/py_edge_lengths.cpp
  98. 7 0
      python/py_igl/py_edge_topology.cpp
  99. 7 0
      python/py_igl/py_eigs.cpp
  100. 7 0
      python/py_igl/py_find_cross_field_singularities.cpp

+ 2 - 1
.appveyor.yml

@@ -6,6 +6,7 @@ branches:
   only:
   only:
     - master
     - master
     - alecjacobson
     - alecjacobson
+    - cmake
 install:
 install:
   - git submodule update --init --recursive
   - git submodule update --init --recursive
   - cinstall: python
   - cinstall: python
@@ -14,7 +15,7 @@ build_script:
   - cd c:\projects\libigl\tutorial
   - cd c:\projects\libigl\tutorial
   - mkdir build
   - mkdir build
   - cd build
   - cd build
-  - cmake -D "LIBIGL_USE_STATIC_LIBRARY=ON" -G "Visual Studio 14 2015 Win64" ../
+  - cmake -D "LIBIGL_USE_STATIC_LIBRARY=ON" -D "LIBIGL_WITH_ANTTWEAKBAR=OFF" -G "Visual Studio 14 2015 Win64" ../
 #  - cmake -G "Visual Studio 14 2015 Win64" ../
 #  - cmake -G "Visual Studio 14 2015 Win64" ../
   - set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
   - set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
 #  - set MSBuildOptions=/v:m /p:Configuration=Release /logger:%MSBuildLogger%
 #  - set MSBuildOptions=/v:m /p:Configuration=Release /logger:%MSBuildLogger%

+ 3 - 3
.gitmodules

@@ -1,8 +1,8 @@
 [submodule "external/nanogui"]
 [submodule "external/nanogui"]
 	path = external/nanogui
 	path = external/nanogui
-url=https://github.com/libigl/nanogui.git
-        fetchRecursiveSubmodules = true
-        ignore = dirty
+	url=https://github.com/libigl/nanogui.git
+	fetchRecursiveSubmodules = true
+	ignore = dirty
 [submodule "external/embree"]
 [submodule "external/embree"]
 	path = external/embree
 	path = external/embree
 	url = https://github.com/embree/embree.git
 	url = https://github.com/embree/embree.git

+ 4 - 3
.travis.yml

@@ -1,5 +1,6 @@
 language: cpp
 language: cpp
 sudo: false
 sudo: false
+dist: precise
 matrix:
 matrix:
   include:
   include:
     - os: linux
     - os: linux
@@ -14,12 +15,12 @@ matrix:
         - cmake -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 -DLIBIGL_WITH_EMBREE=OFF -DLIBIGL_USE_STATIC_LIBRARY=ON ../
         - cmake -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 -DLIBIGL_WITH_EMBREE=OFF -DLIBIGL_USE_STATIC_LIBRARY=ON ../
         - make -j 2
         - make -j 2
         - cd ../tutorial
         - cd ../tutorial
-        - python 101_FileIO.py || { cd ../; mkdir build2; cd build2; cmake -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 -DLIBIGL_WITH_EMBREE=OFF -DLIBIGL_USE_STATIC_LIBRARY=ON - DCHECK_UNDEFINED=ON; make -j 2; }
+        - python3 101_FileIO.py || { cd ../; mkdir build2; cd build2; cmake -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 -DLIBIGL_WITH_EMBREE=OFF -DLIBIGL_USE_STATIC_LIBRARY=ON - DCHECK_UNDEFINED=ON ../; make -j 2; }
         - cd ../../
         - cd ../../
         - cd tutorial
         - cd tutorial
         - mkdir build
         - mkdir build
         - cd build
         - cd build
-        - cmake -DLIBIGL_USE_STATIC_LIBRARY=ON -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 ../
+        - cmake -DLIBIGL_USE_STATIC_LIBRARY=ON  -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 -DLIBIGL_WITH_EMBREE=OFF ../
         - make -j 2
         - make -j 2
       addons:
       addons:
         apt:
         apt:
@@ -62,5 +63,5 @@ matrix:
         - cd tutorial
         - cd tutorial
         - mkdir build
         - mkdir build
         - cd build
         - cd build
-        - cmake -DLIBIGL_USE_STATIC_LIBRARY=ON ../
+        - cmake -DLIBIGL_USE_STATIC_LIBRARY=ON -DLIBIGL_WITH_NANOGUI=ON ../
         - make -j 2
         - make -j 2

+ 0 - 7
LICENSE

@@ -1,7 +0,0 @@
-Libigl is primarily licensed under MPL2
-  - http://www.mozilla.org/MPL/2.0/
-  - http://www.mozilla.org/MPL/2.0/FAQ.html
-
-Some files contain third-party code under other licenses:
-
-  - tga.h/tga.cpp GNU GPL

+ 40 - 0
LICENSE.md

@@ -0,0 +1,40 @@
+Libigl is primarily licensed under MPL2
+  - http://www.mozilla.org/MPL/2.0/
+  - http://www.mozilla.org/MPL/2.0/FAQ.html
+
+All `.h` and `.cpp` _files_ directly in `include/igl` (but not necessarily in
+sub-directories) are subject only to the terms of the MPL2; they should not
+include any code that is covered by other/less-permissive licenses.
+
+The `.h` and `.cpp` _files_ in sub-directories of `include/igl` allow libigl to
+integrate with external third-party libraries (e.g., those in `external/`) and
+are subject to the MPL2, _**and**_ also the terms of licenses of the
+corresponding external library.  The licenses used by these libraries fall under
+three categories:
+
+- common "free, non-copyleft licenses" (such as zlib, BSD, MIT, and public
+  domain)
+  - `include/igl/anttweakbar`
+  - `include/igl/embree`
+  - `include/igl/opengl`
+  - `include/igl/opengl/glfw`
+  - `include/igl/opengl2`
+  - `include/igl/png`
+  - `include/igl/viewer`
+  - `include/igl/xml`
+- common "copyleft" licences (such as GPL, LGPL, and AGPL)
+  - `include/igl/copyleft`
+  - `include/igl/copyleft/cgal`
+  - `include/igl/copyleft/comiso`
+  - `include/igl/copyleft/cork`
+  - `include/igl/copyleft/tetgen`
+- other "uncommon" licenses or commercial software
+  - `include/igl/lim`
+  - `include/igl/matlab`
+  - `include/igl/mosek`
+  - `include/igl/triangle`
+
+The Libigl code that interfaces with "copyleft" libraries is in
+`include/igl/copyleft`.  Only include these headers if you are accept the
+licensing terms of the corresponding external library.  For example, using
+`include/igl/copyleft/tetgen` requires that you accept the terms of the AGPLv3.

+ 1 - 3
README.md

@@ -262,8 +262,6 @@ If you find bugs or have problems please use our [github issue tracking
 page](https://github.com/libigl/libigl/issues).
 page](https://github.com/libigl/libigl/issues).
 
 
 ## Copyright
 ## Copyright
-2017 Alec Jacobson, Daniele Panozzo, Christian Schüller, Olga Diamanti, Qingnan
-Zhou, Sebastian Koch, Amir Vaxman, Nico Pietroni, Stefan Brugger, Kenshi Takayama, Wenzel Jakob, Nikolas De
-Giorgis, Luigi Rocca, Leonardo Sacht, Kevin Walliman, Olga Sorkine-Hornung, and others.
+2017 Alec Jacobson, Daniele Panozzo, Christian Schüller, Olga Diamanti, Qingnan Zhou, Sebastian Koch, Jeremie Dumas, Amir Vaxman, Nico Pietroni, Stefan Brugger, Kenshi Takayama, Wenzel Jakob, Nikolas De Giorgis, Luigi Rocca, Leonardo Sacht, Kevin Walliman, Olga Sorkine-Hornung, and others.
 
 
 Please see individual files for appropriate copyright notices.
 Please see individual files for appropriate copyright notices.

+ 1432 - 0
include/igl/colormap.cpp

@@ -0,0 +1,1432 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Joe Graus <jgraus@gmu.edu>, Alec Jacobson <alecjacobson@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
+#include "colormap.h"
+#include "jet.h"
+#include <algorithm>
+
+// One of the new matplotlib colormaps by Nathaniel J.Smith, Stefan van der Walt, and (in the case of viridis) Eric Firing.
+// Released under the CC0 license / public domain dedication
+
+namespace igl
+{
+static double inferno_cm[256][3] = {
+  { 0.001462, 0.000466, 0.013866 },
+  { 0.002267, 0.001270, 0.018570 },
+  { 0.003299, 0.002249, 0.024239 },
+  { 0.004547, 0.003392, 0.030909 },
+  { 0.006006, 0.004692, 0.038558 },
+  { 0.007676, 0.006136, 0.046836 },
+  { 0.009561, 0.007713, 0.055143 },
+  { 0.011663, 0.009417, 0.063460 },
+  { 0.013995, 0.011225, 0.071862 },
+  { 0.016561, 0.013136, 0.080282 },
+  { 0.019373, 0.015133, 0.088767 },
+  { 0.022447, 0.017199, 0.097327 },
+  { 0.025793, 0.019331, 0.105930 },
+  { 0.029432, 0.021503, 0.114621 },
+  { 0.033385, 0.023702, 0.123397 },
+  { 0.037668, 0.025921, 0.132232 },
+  { 0.042253, 0.028139, 0.141141 },
+  { 0.046915, 0.030324, 0.150164 },
+  { 0.051644, 0.032474, 0.159254 },
+  { 0.056449, 0.034569, 0.168414 },
+  { 0.061340, 0.036590, 0.177642 },
+  { 0.066331, 0.038504, 0.186962 },
+  { 0.071429, 0.040294, 0.196354 },
+  { 0.076637, 0.041905, 0.205799 },
+  { 0.081962, 0.043328, 0.215289 },
+  { 0.087411, 0.044556, 0.224813 },
+  { 0.092990, 0.045583, 0.234358 },
+  { 0.098702, 0.046402, 0.243904 },
+  { 0.104551, 0.047008, 0.253430 },
+  { 0.110536, 0.047399, 0.262912 },
+  { 0.116656, 0.047574, 0.272321 },
+  { 0.122908, 0.047536, 0.281624 },
+  { 0.129285, 0.047293, 0.290788 },
+  { 0.135778, 0.046856, 0.299776 },
+  { 0.142378, 0.046242, 0.308553 },
+  { 0.149073, 0.045468, 0.317085 },
+  { 0.155850, 0.044559, 0.325338 },
+  { 0.162689, 0.043554, 0.333277 },
+  { 0.169575, 0.042489, 0.340874 },
+  { 0.176493, 0.041402, 0.348111 },
+  { 0.183429, 0.040329, 0.354971 },
+  { 0.190367, 0.039309, 0.361447 },
+  { 0.197297, 0.038400, 0.367535 },
+  { 0.204209, 0.037632, 0.373238 },
+  { 0.211095, 0.037030, 0.378563 },
+  { 0.217949, 0.036615, 0.383522 },
+  { 0.224763, 0.036405, 0.388129 },
+  { 0.231538, 0.036405, 0.392400 },
+  { 0.238273, 0.036621, 0.396353 },
+  { 0.244967, 0.037055, 0.400007 },
+  { 0.251620, 0.037705, 0.403378 },
+  { 0.258234, 0.038571, 0.406485 },
+  { 0.264810, 0.039647, 0.409345 },
+  { 0.271347, 0.040922, 0.411976 },
+  { 0.277850, 0.042353, 0.414392 },
+  { 0.284321, 0.043933, 0.416608 },
+  { 0.290763, 0.045644, 0.418637 },
+  { 0.297178, 0.047470, 0.420491 },
+  { 0.303568, 0.049396, 0.422182 },
+  { 0.309935, 0.051407, 0.423721 },
+  { 0.316282, 0.053490, 0.425116 },
+  { 0.322610, 0.055634, 0.426377 },
+  { 0.328921, 0.057827, 0.427511 },
+  { 0.335217, 0.060060, 0.428524 },
+  { 0.341500, 0.062325, 0.429425 },
+  { 0.347771, 0.064616, 0.430217 },
+  { 0.354032, 0.066925, 0.430906 },
+  { 0.360284, 0.069247, 0.431497 },
+  { 0.366529, 0.071579, 0.431994 },
+  { 0.372768, 0.073915, 0.432400 },
+  { 0.379001, 0.076253, 0.432719 },
+  { 0.385228, 0.078591, 0.432955 },
+  { 0.391453, 0.080927, 0.433109 },
+  { 0.397674, 0.083257, 0.433183 },
+  { 0.403894, 0.085580, 0.433179 },
+  { 0.410113, 0.087896, 0.433098 },
+  { 0.416331, 0.090203, 0.432943 },
+  { 0.422549, 0.092501, 0.432714 },
+  { 0.428768, 0.094790, 0.432412 },
+  { 0.434987, 0.097069, 0.432039 },
+  { 0.441207, 0.099338, 0.431594 },
+  { 0.447428, 0.101597, 0.431080 },
+  { 0.453651, 0.103848, 0.430498 },
+  { 0.459875, 0.106089, 0.429846 },
+  { 0.466100, 0.108322, 0.429125 },
+  { 0.472328, 0.110547, 0.428334 },
+  { 0.478558, 0.112764, 0.427475 },
+  { 0.484789, 0.114974, 0.426548 },
+  { 0.491022, 0.117179, 0.425552 },
+  { 0.497257, 0.119379, 0.424488 },
+  { 0.503493, 0.121575, 0.423356 },
+  { 0.509730, 0.123769, 0.422156 },
+  { 0.515967, 0.125960, 0.420887 },
+  { 0.522206, 0.128150, 0.419549 },
+  { 0.528444, 0.130341, 0.418142 },
+  { 0.534683, 0.132534, 0.416667 },
+  { 0.540920, 0.134729, 0.415123 },
+  { 0.547157, 0.136929, 0.413511 },
+  { 0.553392, 0.139134, 0.411829 },
+  { 0.559624, 0.141346, 0.410078 },
+  { 0.565854, 0.143567, 0.408258 },
+  { 0.572081, 0.145797, 0.406369 },
+  { 0.578304, 0.148039, 0.404411 },
+  { 0.584521, 0.150294, 0.402385 },
+  { 0.590734, 0.152563, 0.400290 },
+  { 0.596940, 0.154848, 0.398125 },
+  { 0.603139, 0.157151, 0.395891 },
+  { 0.609330, 0.159474, 0.393589 },
+  { 0.615513, 0.161817, 0.391219 },
+  { 0.621685, 0.164184, 0.388781 },
+  { 0.627847, 0.166575, 0.386276 },
+  { 0.633998, 0.168992, 0.383704 },
+  { 0.640135, 0.171438, 0.381065 },
+  { 0.646260, 0.173914, 0.378359 },
+  { 0.652369, 0.176421, 0.375586 },
+  { 0.658463, 0.178962, 0.372748 },
+  { 0.664540, 0.181539, 0.369846 },
+  { 0.670599, 0.184153, 0.366879 },
+  { 0.676638, 0.186807, 0.363849 },
+  { 0.682656, 0.189501, 0.360757 },
+  { 0.688653, 0.192239, 0.357603 },
+  { 0.694627, 0.195021, 0.354388 },
+  { 0.700576, 0.197851, 0.351113 },
+  { 0.706500, 0.200728, 0.347777 },
+  { 0.712396, 0.203656, 0.344383 },
+  { 0.718264, 0.206636, 0.340931 },
+  { 0.724103, 0.209670, 0.337424 },
+  { 0.729909, 0.212759, 0.333861 },
+  { 0.735683, 0.215906, 0.330245 },
+  { 0.741423, 0.219112, 0.326576 },
+  { 0.747127, 0.222378, 0.322856 },
+  { 0.752794, 0.225706, 0.319085 },
+  { 0.758422, 0.229097, 0.315266 },
+  { 0.764010, 0.232554, 0.311399 },
+  { 0.769556, 0.236077, 0.307485 },
+  { 0.775059, 0.239667, 0.303526 },
+  { 0.780517, 0.243327, 0.299523 },
+  { 0.785929, 0.247056, 0.295477 },
+  { 0.791293, 0.250856, 0.291390 },
+  { 0.796607, 0.254728, 0.287264 },
+  { 0.801871, 0.258674, 0.283099 },
+  { 0.807082, 0.262692, 0.278898 },
+  { 0.812239, 0.266786, 0.274661 },
+  { 0.817341, 0.270954, 0.270390 },
+  { 0.822386, 0.275197, 0.266085 },
+  { 0.827372, 0.279517, 0.261750 },
+  { 0.832299, 0.283913, 0.257383 },
+  { 0.837165, 0.288385, 0.252988 },
+  { 0.841969, 0.292933, 0.248564 },
+  { 0.846709, 0.297559, 0.244113 },
+  { 0.851384, 0.302260, 0.239636 },
+  { 0.855992, 0.307038, 0.235133 },
+  { 0.860533, 0.311892, 0.230606 },
+  { 0.865006, 0.316822, 0.226055 },
+  { 0.869409, 0.321827, 0.221482 },
+  { 0.873741, 0.326906, 0.216886 },
+  { 0.878001, 0.332060, 0.212268 },
+  { 0.882188, 0.337287, 0.207628 },
+  { 0.886302, 0.342586, 0.202968 },
+  { 0.890341, 0.347957, 0.198286 },
+  { 0.894305, 0.353399, 0.193584 },
+  { 0.898192, 0.358911, 0.188860 },
+  { 0.902003, 0.364492, 0.184116 },
+  { 0.905735, 0.370140, 0.179350 },
+  { 0.909390, 0.375856, 0.174563 },
+  { 0.912966, 0.381636, 0.169755 },
+  { 0.916462, 0.387481, 0.164924 },
+  { 0.919879, 0.393389, 0.160070 },
+  { 0.923215, 0.399359, 0.155193 },
+  { 0.926470, 0.405389, 0.150292 },
+  { 0.929644, 0.411479, 0.145367 },
+  { 0.932737, 0.417627, 0.140417 },
+  { 0.935747, 0.423831, 0.135440 },
+  { 0.938675, 0.430091, 0.130438 },
+  { 0.941521, 0.436405, 0.125409 },
+  { 0.944285, 0.442772, 0.120354 },
+  { 0.946965, 0.449191, 0.115272 },
+  { 0.949562, 0.455660, 0.110164 },
+  { 0.952075, 0.462178, 0.105031 },
+  { 0.954506, 0.468744, 0.099874 },
+  { 0.956852, 0.475356, 0.094695 },
+  { 0.959114, 0.482014, 0.089499 },
+  { 0.961293, 0.488716, 0.084289 },
+  { 0.963387, 0.495462, 0.079073 },
+  { 0.965397, 0.502249, 0.073859 },
+  { 0.967322, 0.509078, 0.068659 },
+  { 0.969163, 0.515946, 0.063488 },
+  { 0.970919, 0.522853, 0.058367 },
+  { 0.972590, 0.529798, 0.053324 },
+  { 0.974176, 0.536780, 0.048392 },
+  { 0.975677, 0.543798, 0.043618 },
+  { 0.977092, 0.550850, 0.039050 },
+  { 0.978422, 0.557937, 0.034931 },
+  { 0.979666, 0.565057, 0.031409 },
+  { 0.980824, 0.572209, 0.028508 },
+  { 0.981895, 0.579392, 0.026250 },
+  { 0.982881, 0.586606, 0.024661 },
+  { 0.983779, 0.593849, 0.023770 },
+  { 0.984591, 0.601122, 0.023606 },
+  { 0.985315, 0.608422, 0.024202 },
+  { 0.985952, 0.615750, 0.025592 },
+  { 0.986502, 0.623105, 0.027814 },
+  { 0.986964, 0.630485, 0.030908 },
+  { 0.987337, 0.637890, 0.034916 },
+  { 0.987622, 0.645320, 0.039886 },
+  { 0.987819, 0.652773, 0.045581 },
+  { 0.987926, 0.660250, 0.051750 },
+  { 0.987945, 0.667748, 0.058329 },
+  { 0.987874, 0.675267, 0.065257 },
+  { 0.987714, 0.682807, 0.072489 },
+  { 0.987464, 0.690366, 0.079990 },
+  { 0.987124, 0.697944, 0.087731 },
+  { 0.986694, 0.705540, 0.095694 },
+  { 0.986175, 0.713153, 0.103863 },
+  { 0.985566, 0.720782, 0.112229 },
+  { 0.984865, 0.728427, 0.120785 },
+  { 0.984075, 0.736087, 0.129527 },
+  { 0.983196, 0.743758, 0.138453 },
+  { 0.982228, 0.751442, 0.147565 },
+  { 0.981173, 0.759135, 0.156863 },
+  { 0.980032, 0.766837, 0.166353 },
+  { 0.978806, 0.774545, 0.176037 },
+  { 0.977497, 0.782258, 0.185923 },
+  { 0.976108, 0.789974, 0.196018 },
+  { 0.974638, 0.797692, 0.206332 },
+  { 0.973088, 0.805409, 0.216877 },
+  { 0.971468, 0.813122, 0.227658 },
+  { 0.969783, 0.820825, 0.238686 },
+  { 0.968041, 0.828515, 0.249972 },
+  { 0.966243, 0.836191, 0.261534 },
+  { 0.964394, 0.843848, 0.273391 },
+  { 0.962517, 0.851476, 0.285546 },
+  { 0.960626, 0.859069, 0.298010 },
+  { 0.958720, 0.866624, 0.310820 },
+  { 0.956834, 0.874129, 0.323974 },
+  { 0.954997, 0.881569, 0.337475 },
+  { 0.953215, 0.888942, 0.351369 },
+  { 0.951546, 0.896226, 0.365627 },
+  { 0.950018, 0.903409, 0.380271 },
+  { 0.948683, 0.910473, 0.395289 },
+  { 0.947594, 0.917399, 0.410665 },
+  { 0.946809, 0.924168, 0.426373 },
+  { 0.946392, 0.930761, 0.442367 },
+  { 0.946403, 0.937159, 0.458592 },
+  { 0.946903, 0.943348, 0.474970 },
+  { 0.947937, 0.949318, 0.491426 },
+  { 0.949545, 0.955063, 0.507860 },
+  { 0.951740, 0.960587, 0.524203 },
+  { 0.954529, 0.965896, 0.540361 },
+  { 0.957896, 0.971003, 0.556275 },
+  { 0.961812, 0.975924, 0.571925 },
+  { 0.966249, 0.980678, 0.587206 },
+  { 0.971162, 0.985282, 0.602154 },
+  { 0.976511, 0.989753, 0.616760 },
+  { 0.982257, 0.994109, 0.631017 },
+  { 0.988362, 0.998364, 0.644924 }
+};
+
+static double magma_cm[256][3] = {
+  { 0.001462, 0.000466, 0.013866 },
+  { 0.002258, 0.001295, 0.018331 },
+  { 0.003279, 0.002305, 0.023708 },
+  { 0.004512, 0.003490, 0.029965 },
+  { 0.005950, 0.004843, 0.037130 },
+  { 0.007588, 0.006356, 0.044973 },
+  { 0.009426, 0.008022, 0.052844 },
+  { 0.011465, 0.009828, 0.060750 },
+  { 0.013708, 0.011771, 0.068667 },
+  { 0.016156, 0.013840, 0.076603 },
+  { 0.018815, 0.016026, 0.084584 },
+  { 0.021692, 0.018320, 0.092610 },
+  { 0.024792, 0.020715, 0.100676 },
+  { 0.028123, 0.023201, 0.108787 },
+  { 0.031696, 0.025765, 0.116965 },
+  { 0.035520, 0.028397, 0.125209 },
+  { 0.039608, 0.031090, 0.133515 },
+  { 0.043830, 0.033830, 0.141886 },
+  { 0.048062, 0.036607, 0.150327 },
+  { 0.052320, 0.039407, 0.158841 },
+  { 0.056615, 0.042160, 0.167446 },
+  { 0.060949, 0.044794, 0.176129 },
+  { 0.065330, 0.047318, 0.184892 },
+  { 0.069764, 0.049726, 0.193735 },
+  { 0.074257, 0.052017, 0.202660 },
+  { 0.078815, 0.054184, 0.211667 },
+  { 0.083446, 0.056225, 0.220755 },
+  { 0.088155, 0.058133, 0.229922 },
+  { 0.092949, 0.059904, 0.239164 },
+  { 0.097833, 0.061531, 0.248477 },
+  { 0.102815, 0.063010, 0.257854 },
+  { 0.107899, 0.064335, 0.267289 },
+  { 0.113094, 0.065492, 0.276784 },
+  { 0.118405, 0.066479, 0.286321 },
+  { 0.123833, 0.067295, 0.295879 },
+  { 0.129380, 0.067935, 0.305443 },
+  { 0.135053, 0.068391, 0.315000 },
+  { 0.140858, 0.068654, 0.324538 },
+  { 0.146785, 0.068738, 0.334011 },
+  { 0.152839, 0.068637, 0.343404 },
+  { 0.159018, 0.068354, 0.352688 },
+  { 0.165308, 0.067911, 0.361816 },
+  { 0.171713, 0.067305, 0.370771 },
+  { 0.178212, 0.066576, 0.379497 },
+  { 0.184801, 0.065732, 0.387973 },
+  { 0.191460, 0.064818, 0.396152 },
+  { 0.198177, 0.063862, 0.404009 },
+  { 0.204935, 0.062907, 0.411514 },
+  { 0.211718, 0.061992, 0.418647 },
+  { 0.218512, 0.061158, 0.425392 },
+  { 0.225302, 0.060445, 0.431742 },
+  { 0.232077, 0.059889, 0.437695 },
+  { 0.238826, 0.059517, 0.443256 },
+  { 0.245543, 0.059352, 0.448436 },
+  { 0.252220, 0.059415, 0.453248 },
+  { 0.258857, 0.059706, 0.457710 },
+  { 0.265447, 0.060237, 0.461840 },
+  { 0.271994, 0.060994, 0.465660 },
+  { 0.278493, 0.061978, 0.469190 },
+  { 0.284951, 0.063168, 0.472451 },
+  { 0.291366, 0.064553, 0.475462 },
+  { 0.297740, 0.066117, 0.478243 },
+  { 0.304081, 0.067835, 0.480812 },
+  { 0.310382, 0.069702, 0.483186 },
+  { 0.316654, 0.071690, 0.485380 },
+  { 0.322899, 0.073782, 0.487408 },
+  { 0.329114, 0.075972, 0.489287 },
+  { 0.335308, 0.078236, 0.491024 },
+  { 0.341482, 0.080564, 0.492631 },
+  { 0.347636, 0.082946, 0.494121 },
+  { 0.353773, 0.085373, 0.495501 },
+  { 0.359898, 0.087831, 0.496778 },
+  { 0.366012, 0.090314, 0.497960 },
+  { 0.372116, 0.092816, 0.499053 },
+  { 0.378211, 0.095332, 0.500067 },
+  { 0.384299, 0.097855, 0.501002 },
+  { 0.390384, 0.100379, 0.501864 },
+  { 0.396467, 0.102902, 0.502658 },
+  { 0.402548, 0.105420, 0.503386 },
+  { 0.408629, 0.107930, 0.504052 },
+  { 0.414709, 0.110431, 0.504662 },
+  { 0.420791, 0.112920, 0.505215 },
+  { 0.426877, 0.115395, 0.505714 },
+  { 0.432967, 0.117855, 0.506160 },
+  { 0.439062, 0.120298, 0.506555 },
+  { 0.445163, 0.122724, 0.506901 },
+  { 0.451271, 0.125132, 0.507198 },
+  { 0.457386, 0.127522, 0.507448 },
+  { 0.463508, 0.129893, 0.507652 },
+  { 0.469640, 0.132245, 0.507809 },
+  { 0.475780, 0.134577, 0.507921 },
+  { 0.481929, 0.136891, 0.507989 },
+  { 0.488088, 0.139186, 0.508011 },
+  { 0.494258, 0.141462, 0.507988 },
+  { 0.500438, 0.143719, 0.507920 },
+  { 0.506629, 0.145958, 0.507806 },
+  { 0.512831, 0.148179, 0.507648 },
+  { 0.519045, 0.150383, 0.507443 },
+  { 0.525270, 0.152569, 0.507192 },
+  { 0.531507, 0.154739, 0.506895 },
+  { 0.537755, 0.156894, 0.506551 },
+  { 0.544015, 0.159033, 0.506159 },
+  { 0.550287, 0.161158, 0.505719 },
+  { 0.556571, 0.163269, 0.505230 },
+  { 0.562866, 0.165368, 0.504692 },
+  { 0.569172, 0.167454, 0.504105 },
+  { 0.575490, 0.169530, 0.503466 },
+  { 0.581819, 0.171596, 0.502777 },
+  { 0.588158, 0.173652, 0.502035 },
+  { 0.594508, 0.175701, 0.501241 },
+  { 0.600868, 0.177743, 0.500394 },
+  { 0.607238, 0.179779, 0.499492 },
+  { 0.613617, 0.181811, 0.498536 },
+  { 0.620005, 0.183840, 0.497524 },
+  { 0.626401, 0.185867, 0.496456 },
+  { 0.632805, 0.187893, 0.495332 },
+  { 0.639216, 0.189921, 0.494150 },
+  { 0.645633, 0.191952, 0.492910 },
+  { 0.652056, 0.193986, 0.491611 },
+  { 0.658483, 0.196027, 0.490253 },
+  { 0.664915, 0.198075, 0.488836 },
+  { 0.671349, 0.200133, 0.487358 },
+  { 0.677786, 0.202203, 0.485819 },
+  { 0.684224, 0.204286, 0.484219 },
+  { 0.690661, 0.206384, 0.482558 },
+  { 0.697098, 0.208501, 0.480835 },
+  { 0.703532, 0.210638, 0.479049 },
+  { 0.709962, 0.212797, 0.477201 },
+  { 0.716387, 0.214982, 0.475290 },
+  { 0.722805, 0.217194, 0.473316 },
+  { 0.729216, 0.219437, 0.471279 },
+  { 0.735616, 0.221713, 0.469180 },
+  { 0.742004, 0.224025, 0.467018 },
+  { 0.748378, 0.226377, 0.464794 },
+  { 0.754737, 0.228772, 0.462509 },
+  { 0.761077, 0.231214, 0.460162 },
+  { 0.767398, 0.233705, 0.457755 },
+  { 0.773695, 0.236249, 0.455289 },
+  { 0.779968, 0.238851, 0.452765 },
+  { 0.786212, 0.241514, 0.450184 },
+  { 0.792427, 0.244242, 0.447543 },
+  { 0.798608, 0.247040, 0.444848 },
+  { 0.804752, 0.249911, 0.442102 },
+  { 0.810855, 0.252861, 0.439305 },
+  { 0.816914, 0.255895, 0.436461 },
+  { 0.822926, 0.259016, 0.433573 },
+  { 0.828886, 0.262229, 0.430644 },
+  { 0.834791, 0.265540, 0.427671 },
+  { 0.840636, 0.268953, 0.424666 },
+  { 0.846416, 0.272473, 0.421631 },
+  { 0.852126, 0.276106, 0.418573 },
+  { 0.857763, 0.279857, 0.415496 },
+  { 0.863320, 0.283729, 0.412403 },
+  { 0.868793, 0.287728, 0.409303 },
+  { 0.874176, 0.291859, 0.406205 },
+  { 0.879464, 0.296125, 0.403118 },
+  { 0.884651, 0.300530, 0.400047 },
+  { 0.889731, 0.305079, 0.397002 },
+  { 0.894700, 0.309773, 0.393995 },
+  { 0.899552, 0.314616, 0.391037 },
+  { 0.904281, 0.319610, 0.388137 },
+  { 0.908884, 0.324755, 0.385308 },
+  { 0.913354, 0.330052, 0.382563 },
+  { 0.917689, 0.335500, 0.379915 },
+  { 0.921884, 0.341098, 0.377376 },
+  { 0.925937, 0.346844, 0.374959 },
+  { 0.929845, 0.352734, 0.372677 },
+  { 0.933606, 0.358764, 0.370541 },
+  { 0.937221, 0.364929, 0.368567 },
+  { 0.940687, 0.371224, 0.366762 },
+  { 0.944006, 0.377643, 0.365136 },
+  { 0.947180, 0.384178, 0.363701 },
+  { 0.950210, 0.390820, 0.362468 },
+  { 0.953099, 0.397563, 0.361438 },
+  { 0.955849, 0.404400, 0.360619 },
+  { 0.958464, 0.411324, 0.360014 },
+  { 0.960949, 0.418323, 0.359630 },
+  { 0.963310, 0.425390, 0.359469 },
+  { 0.965549, 0.432519, 0.359529 },
+  { 0.967671, 0.439703, 0.359810 },
+  { 0.969680, 0.446936, 0.360311 },
+  { 0.971582, 0.454210, 0.361030 },
+  { 0.973381, 0.461520, 0.361965 },
+  { 0.975082, 0.468861, 0.363111 },
+  { 0.976690, 0.476226, 0.364466 },
+  { 0.978210, 0.483612, 0.366025 },
+  { 0.979645, 0.491014, 0.367783 },
+  { 0.981000, 0.498428, 0.369734 },
+  { 0.982279, 0.505851, 0.371874 },
+  { 0.983485, 0.513280, 0.374198 },
+  { 0.984622, 0.520713, 0.376698 },
+  { 0.985693, 0.528148, 0.379371 },
+  { 0.986700, 0.535582, 0.382210 },
+  { 0.987646, 0.543015, 0.385210 },
+  { 0.988533, 0.550446, 0.388365 },
+  { 0.989363, 0.557873, 0.391671 },
+  { 0.990138, 0.565296, 0.395122 },
+  { 0.990871, 0.572706, 0.398714 },
+  { 0.991558, 0.580107, 0.402441 },
+  { 0.992196, 0.587502, 0.406299 },
+  { 0.992785, 0.594891, 0.410283 },
+  { 0.993326, 0.602275, 0.414390 },
+  { 0.993834, 0.609644, 0.418613 },
+  { 0.994309, 0.616999, 0.422950 },
+  { 0.994738, 0.624350, 0.427397 },
+  { 0.995122, 0.631696, 0.431951 },
+  { 0.995480, 0.639027, 0.436607 },
+  { 0.995810, 0.646344, 0.441361 },
+  { 0.996096, 0.653659, 0.446213 },
+  { 0.996341, 0.660969, 0.451160 },
+  { 0.996580, 0.668256, 0.456192 },
+  { 0.996775, 0.675541, 0.461314 },
+  { 0.996925, 0.682828, 0.466526 },
+  { 0.997077, 0.690088, 0.471811 },
+  { 0.997186, 0.697349, 0.477182 },
+  { 0.997254, 0.704611, 0.482635 },
+  { 0.997325, 0.711848, 0.488154 },
+  { 0.997351, 0.719089, 0.493755 },
+  { 0.997351, 0.726324, 0.499428 },
+  { 0.997341, 0.733545, 0.505167 },
+  { 0.997285, 0.740772, 0.510983 },
+  { 0.997228, 0.747981, 0.516859 },
+  { 0.997138, 0.755190, 0.522806 },
+  { 0.997019, 0.762398, 0.528821 },
+  { 0.996898, 0.769591, 0.534892 },
+  { 0.996727, 0.776795, 0.541039 },
+  { 0.996571, 0.783977, 0.547233 },
+  { 0.996369, 0.791167, 0.553499 },
+  { 0.996162, 0.798348, 0.559820 },
+  { 0.995932, 0.805527, 0.566202 },
+  { 0.995680, 0.812706, 0.572645 },
+  { 0.995424, 0.819875, 0.579140 },
+  { 0.995131, 0.827052, 0.585701 },
+  { 0.994851, 0.834213, 0.592307 },
+  { 0.994524, 0.841387, 0.598983 },
+  { 0.994222, 0.848540, 0.605696 },
+  { 0.993866, 0.855711, 0.612482 },
+  { 0.993545, 0.862859, 0.619299 },
+  { 0.993170, 0.870024, 0.626189 },
+  { 0.992831, 0.877168, 0.633109 },
+  { 0.992440, 0.884330, 0.640099 },
+  { 0.992089, 0.891470, 0.647116 },
+  { 0.991688, 0.898627, 0.654202 },
+  { 0.991332, 0.905763, 0.661309 },
+  { 0.990930, 0.912915, 0.668481 },
+  { 0.990570, 0.920049, 0.675675 },
+  { 0.990175, 0.927196, 0.682926 },
+  { 0.989815, 0.934329, 0.690198 },
+  { 0.989434, 0.941470, 0.697519 },
+  { 0.989077, 0.948604, 0.704863 },
+  { 0.988717, 0.955742, 0.712242 },
+  { 0.988367, 0.962878, 0.719649 },
+  { 0.988033, 0.970012, 0.727077 },
+  { 0.987691, 0.977154, 0.734536 },
+  { 0.987387, 0.984288, 0.742002 },
+  { 0.987053, 0.991438, 0.749504 }
+};
+
+static double plasma_cm[256][3] = {
+  { 0.050383, 0.029803, 0.527975 },
+  { 0.063536, 0.028426, 0.533124 },
+  { 0.075353, 0.027206, 0.538007 },
+  { 0.086222, 0.026125, 0.542658 },
+  { 0.096379, 0.025165, 0.547103 },
+  { 0.105980, 0.024309, 0.551368 },
+  { 0.115124, 0.023556, 0.555468 },
+  { 0.123903, 0.022878, 0.559423 },
+  { 0.132381, 0.022258, 0.563250 },
+  { 0.140603, 0.021687, 0.566959 },
+  { 0.148607, 0.021154, 0.570562 },
+  { 0.156421, 0.020651, 0.574065 },
+  { 0.164070, 0.020171, 0.577478 },
+  { 0.171574, 0.019706, 0.580806 },
+  { 0.178950, 0.019252, 0.584054 },
+  { 0.186213, 0.018803, 0.587228 },
+  { 0.193374, 0.018354, 0.590330 },
+  { 0.200445, 0.017902, 0.593364 },
+  { 0.207435, 0.017442, 0.596333 },
+  { 0.214350, 0.016973, 0.599239 },
+  { 0.221197, 0.016497, 0.602083 },
+  { 0.227983, 0.016007, 0.604867 },
+  { 0.234715, 0.015502, 0.607592 },
+  { 0.241396, 0.014979, 0.610259 },
+  { 0.248032, 0.014439, 0.612868 },
+  { 0.254627, 0.013882, 0.615419 },
+  { 0.261183, 0.013308, 0.617911 },
+  { 0.267703, 0.012716, 0.620346 },
+  { 0.274191, 0.012109, 0.622722 },
+  { 0.280648, 0.011488, 0.625038 },
+  { 0.287076, 0.010855, 0.627295 },
+  { 0.293478, 0.010213, 0.629490 },
+  { 0.299855, 0.009561, 0.631624 },
+  { 0.306210, 0.008902, 0.633694 },
+  { 0.312543, 0.008239, 0.635700 },
+  { 0.318856, 0.007576, 0.637640 },
+  { 0.325150, 0.006915, 0.639512 },
+  { 0.331426, 0.006261, 0.641316 },
+  { 0.337683, 0.005618, 0.643049 },
+  { 0.343925, 0.004991, 0.644710 },
+  { 0.350150, 0.004382, 0.646298 },
+  { 0.356359, 0.003798, 0.647810 },
+  { 0.362553, 0.003243, 0.649245 },
+  { 0.368733, 0.002724, 0.650601 },
+  { 0.374897, 0.002245, 0.651876 },
+  { 0.381047, 0.001814, 0.653068 },
+  { 0.387183, 0.001434, 0.654177 },
+  { 0.393304, 0.001114, 0.655199 },
+  { 0.399411, 0.000859, 0.656133 },
+  { 0.405503, 0.000678, 0.656977 },
+  { 0.411580, 0.000577, 0.657730 },
+  { 0.417642, 0.000564, 0.658390 },
+  { 0.423689, 0.000646, 0.658956 },
+  { 0.429719, 0.000831, 0.659425 },
+  { 0.435734, 0.001127, 0.659797 },
+  { 0.441732, 0.001540, 0.660069 },
+  { 0.447714, 0.002080, 0.660240 },
+  { 0.453677, 0.002755, 0.660310 },
+  { 0.459623, 0.003574, 0.660277 },
+  { 0.465550, 0.004545, 0.660139 },
+  { 0.471457, 0.005678, 0.659897 },
+  { 0.477344, 0.006980, 0.659549 },
+  { 0.483210, 0.008460, 0.659095 },
+  { 0.489055, 0.010127, 0.658534 },
+  { 0.494877, 0.011990, 0.657865 },
+  { 0.500678, 0.014055, 0.657088 },
+  { 0.506454, 0.016333, 0.656202 },
+  { 0.512206, 0.018833, 0.655209 },
+  { 0.517933, 0.021563, 0.654109 },
+  { 0.523633, 0.024532, 0.652901 },
+  { 0.529306, 0.027747, 0.651586 },
+  { 0.534952, 0.031217, 0.650165 },
+  { 0.540570, 0.034950, 0.648640 },
+  { 0.546157, 0.038954, 0.647010 },
+  { 0.551715, 0.043136, 0.645277 },
+  { 0.557243, 0.047331, 0.643443 },
+  { 0.562738, 0.051545, 0.641509 },
+  { 0.568201, 0.055778, 0.639477 },
+  { 0.573632, 0.060028, 0.637349 },
+  { 0.579029, 0.064296, 0.635126 },
+  { 0.584391, 0.068579, 0.632812 },
+  { 0.589719, 0.072878, 0.630408 },
+  { 0.595011, 0.077190, 0.627917 },
+  { 0.600266, 0.081516, 0.625342 },
+  { 0.605485, 0.085854, 0.622686 },
+  { 0.610667, 0.090204, 0.619951 },
+  { 0.615812, 0.094564, 0.617140 },
+  { 0.620919, 0.098934, 0.614257 },
+  { 0.625987, 0.103312, 0.611305 },
+  { 0.631017, 0.107699, 0.608287 },
+  { 0.636008, 0.112092, 0.605205 },
+  { 0.640959, 0.116492, 0.602065 },
+  { 0.645872, 0.120898, 0.598867 },
+  { 0.650746, 0.125309, 0.595617 },
+  { 0.655580, 0.129725, 0.592317 },
+  { 0.660374, 0.134144, 0.588971 },
+  { 0.665129, 0.138566, 0.585582 },
+  { 0.669845, 0.142992, 0.582154 },
+  { 0.674522, 0.147419, 0.578688 },
+  { 0.679160, 0.151848, 0.575189 },
+  { 0.683758, 0.156278, 0.571660 },
+  { 0.688318, 0.160709, 0.568103 },
+  { 0.692840, 0.165141, 0.564522 },
+  { 0.697324, 0.169573, 0.560919 },
+  { 0.701769, 0.174005, 0.557296 },
+  { 0.706178, 0.178437, 0.553657 },
+  { 0.710549, 0.182868, 0.550004 },
+  { 0.714883, 0.187299, 0.546338 },
+  { 0.719181, 0.191729, 0.542663 },
+  { 0.723444, 0.196158, 0.538981 },
+  { 0.727670, 0.200586, 0.535293 },
+  { 0.731862, 0.205013, 0.531601 },
+  { 0.736019, 0.209439, 0.527908 },
+  { 0.740143, 0.213864, 0.524216 },
+  { 0.744232, 0.218288, 0.520524 },
+  { 0.748289, 0.222711, 0.516834 },
+  { 0.752312, 0.227133, 0.513149 },
+  { 0.756304, 0.231555, 0.509468 },
+  { 0.760264, 0.235976, 0.505794 },
+  { 0.764193, 0.240396, 0.502126 },
+  { 0.768090, 0.244817, 0.498465 },
+  { 0.771958, 0.249237, 0.494813 },
+  { 0.775796, 0.253658, 0.491171 },
+  { 0.779604, 0.258078, 0.487539 },
+  { 0.783383, 0.262500, 0.483918 },
+  { 0.787133, 0.266922, 0.480307 },
+  { 0.790855, 0.271345, 0.476706 },
+  { 0.794549, 0.275770, 0.473117 },
+  { 0.798216, 0.280197, 0.469538 },
+  { 0.801855, 0.284626, 0.465971 },
+  { 0.805467, 0.289057, 0.462415 },
+  { 0.809052, 0.293491, 0.458870 },
+  { 0.812612, 0.297928, 0.455338 },
+  { 0.816144, 0.302368, 0.451816 },
+  { 0.819651, 0.306812, 0.448306 },
+  { 0.823132, 0.311261, 0.444806 },
+  { 0.826588, 0.315714, 0.441316 },
+  { 0.830018, 0.320172, 0.437836 },
+  { 0.833422, 0.324635, 0.434366 },
+  { 0.836801, 0.329105, 0.430905 },
+  { 0.840155, 0.333580, 0.427455 },
+  { 0.843484, 0.338062, 0.424013 },
+  { 0.846788, 0.342551, 0.420579 },
+  { 0.850066, 0.347048, 0.417153 },
+  { 0.853319, 0.351553, 0.413734 },
+  { 0.856547, 0.356066, 0.410322 },
+  { 0.859750, 0.360588, 0.406917 },
+  { 0.862927, 0.365119, 0.403519 },
+  { 0.866078, 0.369660, 0.400126 },
+  { 0.869203, 0.374212, 0.396738 },
+  { 0.872303, 0.378774, 0.393355 },
+  { 0.875376, 0.383347, 0.389976 },
+  { 0.878423, 0.387932, 0.386600 },
+  { 0.881443, 0.392529, 0.383229 },
+  { 0.884436, 0.397139, 0.379860 },
+  { 0.887402, 0.401762, 0.376494 },
+  { 0.890340, 0.406398, 0.373130 },
+  { 0.893250, 0.411048, 0.369768 },
+  { 0.896131, 0.415712, 0.366407 },
+  { 0.898984, 0.420392, 0.363047 },
+  { 0.901807, 0.425087, 0.359688 },
+  { 0.904601, 0.429797, 0.356329 },
+  { 0.907365, 0.434524, 0.352970 },
+  { 0.910098, 0.439268, 0.349610 },
+  { 0.912800, 0.444029, 0.346251 },
+  { 0.915471, 0.448807, 0.342890 },
+  { 0.918109, 0.453603, 0.339529 },
+  { 0.920714, 0.458417, 0.336166 },
+  { 0.923287, 0.463251, 0.332801 },
+  { 0.925825, 0.468103, 0.329435 },
+  { 0.928329, 0.472975, 0.326067 },
+  { 0.930798, 0.477867, 0.322697 },
+  { 0.933232, 0.482780, 0.319325 },
+  { 0.935630, 0.487712, 0.315952 },
+  { 0.937990, 0.492667, 0.312575 },
+  { 0.940313, 0.497642, 0.309197 },
+  { 0.942598, 0.502639, 0.305816 },
+  { 0.944844, 0.507658, 0.302433 },
+  { 0.947051, 0.512699, 0.299049 },
+  { 0.949217, 0.517763, 0.295662 },
+  { 0.951344, 0.522850, 0.292275 },
+  { 0.953428, 0.527960, 0.288883 },
+  { 0.955470, 0.533093, 0.285490 },
+  { 0.957469, 0.538250, 0.282096 },
+  { 0.959424, 0.543431, 0.278701 },
+  { 0.961336, 0.548636, 0.275305 },
+  { 0.963203, 0.553865, 0.271909 },
+  { 0.965024, 0.559118, 0.268513 },
+  { 0.966798, 0.564396, 0.265118 },
+  { 0.968526, 0.569700, 0.261721 },
+  { 0.970205, 0.575028, 0.258325 },
+  { 0.971835, 0.580382, 0.254931 },
+  { 0.973416, 0.585761, 0.251540 },
+  { 0.974947, 0.591165, 0.248151 },
+  { 0.976428, 0.596595, 0.244767 },
+  { 0.977856, 0.602051, 0.241387 },
+  { 0.979233, 0.607532, 0.238013 },
+  { 0.980556, 0.613039, 0.234646 },
+  { 0.981826, 0.618572, 0.231287 },
+  { 0.983041, 0.624131, 0.227937 },
+  { 0.984199, 0.629718, 0.224595 },
+  { 0.985301, 0.635330, 0.221265 },
+  { 0.986345, 0.640969, 0.217948 },
+  { 0.987332, 0.646633, 0.214648 },
+  { 0.988260, 0.652325, 0.211364 },
+  { 0.989128, 0.658043, 0.208100 },
+  { 0.989935, 0.663787, 0.204859 },
+  { 0.990681, 0.669558, 0.201642 },
+  { 0.991365, 0.675355, 0.198453 },
+  { 0.991985, 0.681179, 0.195295 },
+  { 0.992541, 0.687030, 0.192170 },
+  { 0.993032, 0.692907, 0.189084 },
+  { 0.993456, 0.698810, 0.186041 },
+  { 0.993814, 0.704741, 0.183043 },
+  { 0.994103, 0.710698, 0.180097 },
+  { 0.994324, 0.716681, 0.177208 },
+  { 0.994474, 0.722691, 0.174381 },
+  { 0.994553, 0.728728, 0.171622 },
+  { 0.994561, 0.734791, 0.168938 },
+  { 0.994495, 0.740880, 0.166335 },
+  { 0.994355, 0.746995, 0.163821 },
+  { 0.994141, 0.753137, 0.161404 },
+  { 0.993851, 0.759304, 0.159092 },
+  { 0.993482, 0.765499, 0.156891 },
+  { 0.993033, 0.771720, 0.154808 },
+  { 0.992505, 0.777967, 0.152855 },
+  { 0.991897, 0.784239, 0.151042 },
+  { 0.991209, 0.790537, 0.149377 },
+  { 0.990439, 0.796859, 0.147870 },
+  { 0.989587, 0.803205, 0.146529 },
+  { 0.988648, 0.809579, 0.145357 },
+  { 0.987621, 0.815978, 0.144363 },
+  { 0.986509, 0.822401, 0.143557 },
+  { 0.985314, 0.828846, 0.142945 },
+  { 0.984031, 0.835315, 0.142528 },
+  { 0.982653, 0.841812, 0.142303 },
+  { 0.981190, 0.848329, 0.142279 },
+  { 0.979644, 0.854866, 0.142453 },
+  { 0.977995, 0.861432, 0.142808 },
+  { 0.976265, 0.868016, 0.143351 },
+  { 0.974443, 0.874622, 0.144061 },
+  { 0.972530, 0.881250, 0.144923 },
+  { 0.970533, 0.887896, 0.145919 },
+  { 0.968443, 0.894564, 0.147014 },
+  { 0.966271, 0.901249, 0.148180 },
+  { 0.964021, 0.907950, 0.149370 },
+  { 0.961681, 0.914672, 0.150520 },
+  { 0.959276, 0.921407, 0.151566 },
+  { 0.956808, 0.928152, 0.152409 },
+  { 0.954287, 0.934908, 0.152921 },
+  { 0.951726, 0.941671, 0.152925 },
+  { 0.949151, 0.948435, 0.152178 },
+  { 0.946602, 0.955190, 0.150328 },
+  { 0.944152, 0.961916, 0.146861 },
+  { 0.941896, 0.968590, 0.140956 },
+  { 0.940015, 0.975158, 0.131326 }
+};
+
+static double viridis_cm[256][3] = {
+  { 0.267004, 0.004874, 0.329415 },
+  { 0.268510, 0.009605, 0.335427 },
+  { 0.269944, 0.014625, 0.341379 },
+  { 0.271305, 0.019942, 0.347269 },
+  { 0.272594, 0.025563, 0.353093 },
+  { 0.273809, 0.031497, 0.358853 },
+  { 0.274952, 0.037752, 0.364543 },
+  { 0.276022, 0.044167, 0.370164 },
+  { 0.277018, 0.050344, 0.375715 },
+  { 0.277941, 0.056324, 0.381191 },
+  { 0.278791, 0.062145, 0.386592 },
+  { 0.279566, 0.067836, 0.391917 },
+  { 0.280267, 0.073417, 0.397163 },
+  { 0.280894, 0.078907, 0.402329 },
+  { 0.281446, 0.084320, 0.407414 },
+  { 0.281924, 0.089666, 0.412415 },
+  { 0.282327, 0.094955, 0.417331 },
+  { 0.282656, 0.100196, 0.422160 },
+  { 0.282910, 0.105393, 0.426902 },
+  { 0.283091, 0.110553, 0.431554 },
+  { 0.283197, 0.115680, 0.436115 },
+  { 0.283229, 0.120777, 0.440584 },
+  { 0.283187, 0.125848, 0.444960 },
+  { 0.283072, 0.130895, 0.449241 },
+  { 0.282884, 0.135920, 0.453427 },
+  { 0.282623, 0.140926, 0.457517 },
+  { 0.282290, 0.145912, 0.461510 },
+  { 0.281887, 0.150881, 0.465405 },
+  { 0.281412, 0.155834, 0.469201 },
+  { 0.280868, 0.160771, 0.472899 },
+  { 0.280255, 0.165693, 0.476498 },
+  { 0.279574, 0.170599, 0.479997 },
+  { 0.278826, 0.175490, 0.483397 },
+  { 0.278012, 0.180367, 0.486697 },
+  { 0.277134, 0.185228, 0.489898 },
+  { 0.276194, 0.190074, 0.493001 },
+  { 0.275191, 0.194905, 0.496005 },
+  { 0.274128, 0.199721, 0.498911 },
+  { 0.273006, 0.204520, 0.501721 },
+  { 0.271828, 0.209303, 0.504434 },
+  { 0.270595, 0.214069, 0.507052 },
+  { 0.269308, 0.218818, 0.509577 },
+  { 0.267968, 0.223549, 0.512008 },
+  { 0.266580, 0.228262, 0.514349 },
+  { 0.265145, 0.232956, 0.516599 },
+  { 0.263663, 0.237631, 0.518762 },
+  { 0.262138, 0.242286, 0.520837 },
+  { 0.260571, 0.246922, 0.522828 },
+  { 0.258965, 0.251537, 0.524736 },
+  { 0.257322, 0.256130, 0.526563 },
+  { 0.255645, 0.260703, 0.528312 },
+  { 0.253935, 0.265254, 0.529983 },
+  { 0.252194, 0.269783, 0.531579 },
+  { 0.250425, 0.274290, 0.533103 },
+  { 0.248629, 0.278775, 0.534556 },
+  { 0.246811, 0.283237, 0.535941 },
+  { 0.244972, 0.287675, 0.537260 },
+  { 0.243113, 0.292092, 0.538516 },
+  { 0.241237, 0.296485, 0.539709 },
+  { 0.239346, 0.300855, 0.540844 },
+  { 0.237441, 0.305202, 0.541921 },
+  { 0.235526, 0.309527, 0.542944 },
+  { 0.233603, 0.313828, 0.543914 },
+  { 0.231674, 0.318106, 0.544834 },
+  { 0.229739, 0.322361, 0.545706 },
+  { 0.227802, 0.326594, 0.546532 },
+  { 0.225863, 0.330805, 0.547314 },
+  { 0.223925, 0.334994, 0.548053 },
+  { 0.221989, 0.339161, 0.548752 },
+  { 0.220057, 0.343307, 0.549413 },
+  { 0.218130, 0.347432, 0.550038 },
+  { 0.216210, 0.351535, 0.550627 },
+  { 0.214298, 0.355619, 0.551184 },
+  { 0.212395, 0.359683, 0.551710 },
+  { 0.210503, 0.363727, 0.552206 },
+  { 0.208623, 0.367752, 0.552675 },
+  { 0.206756, 0.371758, 0.553117 },
+  { 0.204903, 0.375746, 0.553533 },
+  { 0.203063, 0.379716, 0.553925 },
+  { 0.201239, 0.383670, 0.554294 },
+  { 0.199430, 0.387607, 0.554642 },
+  { 0.197636, 0.391528, 0.554969 },
+  { 0.195860, 0.395433, 0.555276 },
+  { 0.194100, 0.399323, 0.555565 },
+  { 0.192357, 0.403199, 0.555836 },
+  { 0.190631, 0.407061, 0.556089 },
+  { 0.188923, 0.410910, 0.556326 },
+  { 0.187231, 0.414746, 0.556547 },
+  { 0.185556, 0.418570, 0.556753 },
+  { 0.183898, 0.422383, 0.556944 },
+  { 0.182256, 0.426184, 0.557120 },
+  { 0.180629, 0.429975, 0.557282 },
+  { 0.179019, 0.433756, 0.557430 },
+  { 0.177423, 0.437527, 0.557565 },
+  { 0.175841, 0.441290, 0.557685 },
+  { 0.174274, 0.445044, 0.557792 },
+  { 0.172719, 0.448791, 0.557885 },
+  { 0.171176, 0.452530, 0.557965 },
+  { 0.169646, 0.456262, 0.558030 },
+  { 0.168126, 0.459988, 0.558082 },
+  { 0.166617, 0.463708, 0.558119 },
+  { 0.165117, 0.467423, 0.558141 },
+  { 0.163625, 0.471133, 0.558148 },
+  { 0.162142, 0.474838, 0.558140 },
+  { 0.160665, 0.478540, 0.558115 },
+  { 0.159194, 0.482237, 0.558073 },
+  { 0.157729, 0.485932, 0.558013 },
+  { 0.156270, 0.489624, 0.557936 },
+  { 0.154815, 0.493313, 0.557840 },
+  { 0.153364, 0.497000, 0.557724 },
+  { 0.151918, 0.500685, 0.557587 },
+  { 0.150476, 0.504369, 0.557430 },
+  { 0.149039, 0.508051, 0.557250 },
+  { 0.147607, 0.511733, 0.557049 },
+  { 0.146180, 0.515413, 0.556823 },
+  { 0.144759, 0.519093, 0.556572 },
+  { 0.143343, 0.522773, 0.556295 },
+  { 0.141935, 0.526453, 0.555991 },
+  { 0.140536, 0.530132, 0.555659 },
+  { 0.139147, 0.533812, 0.555298 },
+  { 0.137770, 0.537492, 0.554906 },
+  { 0.136408, 0.541173, 0.554483 },
+  { 0.135066, 0.544853, 0.554029 },
+  { 0.133743, 0.548535, 0.553541 },
+  { 0.132444, 0.552216, 0.553018 },
+  { 0.131172, 0.555899, 0.552459 },
+  { 0.129933, 0.559582, 0.551864 },
+  { 0.128729, 0.563265, 0.551229 },
+  { 0.127568, 0.566949, 0.550556 },
+  { 0.126453, 0.570633, 0.549841 },
+  { 0.125394, 0.574318, 0.549086 },
+  { 0.124395, 0.578002, 0.548287 },
+  { 0.123463, 0.581687, 0.547445 },
+  { 0.122606, 0.585371, 0.546557 },
+  { 0.121831, 0.589055, 0.545623 },
+  { 0.121148, 0.592739, 0.544641 },
+  { 0.120565, 0.596422, 0.543611 },
+  { 0.120092, 0.600104, 0.542530 },
+  { 0.119738, 0.603785, 0.541400 },
+  { 0.119512, 0.607464, 0.540218 },
+  { 0.119423, 0.611141, 0.538982 },
+  { 0.119483, 0.614817, 0.537692 },
+  { 0.119699, 0.618490, 0.536347 },
+  { 0.120081, 0.622161, 0.534946 },
+  { 0.120638, 0.625828, 0.533488 },
+  { 0.121380, 0.629492, 0.531973 },
+  { 0.122312, 0.633153, 0.530398 },
+  { 0.123444, 0.636809, 0.528763 },
+  { 0.124780, 0.640461, 0.527068 },
+  { 0.126326, 0.644107, 0.525311 },
+  { 0.128087, 0.647749, 0.523491 },
+  { 0.130067, 0.651384, 0.521608 },
+  { 0.132268, 0.655014, 0.519661 },
+  { 0.134692, 0.658636, 0.517649 },
+  { 0.137339, 0.662252, 0.515571 },
+  { 0.140210, 0.665859, 0.513427 },
+  { 0.143303, 0.669459, 0.511215 },
+  { 0.146616, 0.673050, 0.508936 },
+  { 0.150148, 0.676631, 0.506589 },
+  { 0.153894, 0.680203, 0.504172 },
+  { 0.157851, 0.683765, 0.501686 },
+  { 0.162016, 0.687316, 0.499129 },
+  { 0.166383, 0.690856, 0.496502 },
+  { 0.170948, 0.694384, 0.493803 },
+  { 0.175707, 0.697900, 0.491033 },
+  { 0.180653, 0.701402, 0.488189 },
+  { 0.185783, 0.704891, 0.485273 },
+  { 0.191090, 0.708366, 0.482284 },
+  { 0.196571, 0.711827, 0.479221 },
+  { 0.202219, 0.715272, 0.476084 },
+  { 0.208030, 0.718701, 0.472873 },
+  { 0.214000, 0.722114, 0.469588 },
+  { 0.220124, 0.725509, 0.466226 },
+  { 0.226397, 0.728888, 0.462789 },
+  { 0.232815, 0.732247, 0.459277 },
+  { 0.239374, 0.735588, 0.455688 },
+  { 0.246070, 0.738910, 0.452024 },
+  { 0.252899, 0.742211, 0.448284 },
+  { 0.259857, 0.745492, 0.444467 },
+  { 0.266941, 0.748751, 0.440573 },
+  { 0.274149, 0.751988, 0.436601 },
+  { 0.281477, 0.755203, 0.432552 },
+  { 0.288921, 0.758394, 0.428426 },
+  { 0.296479, 0.761561, 0.424223 },
+  { 0.304148, 0.764704, 0.419943 },
+  { 0.311925, 0.767822, 0.415586 },
+  { 0.319809, 0.770914, 0.411152 },
+  { 0.327796, 0.773980, 0.406640 },
+  { 0.335885, 0.777018, 0.402049 },
+  { 0.344074, 0.780029, 0.397381 },
+  { 0.352360, 0.783011, 0.392636 },
+  { 0.360741, 0.785964, 0.387814 },
+  { 0.369214, 0.788888, 0.382914 },
+  { 0.377779, 0.791781, 0.377939 },
+  { 0.386433, 0.794644, 0.372886 },
+  { 0.395174, 0.797475, 0.367757 },
+  { 0.404001, 0.800275, 0.362552 },
+  { 0.412913, 0.803041, 0.357269 },
+  { 0.421908, 0.805774, 0.351910 },
+  { 0.430983, 0.808473, 0.346476 },
+  { 0.440137, 0.811138, 0.340967 },
+  { 0.449368, 0.813768, 0.335384 },
+  { 0.458674, 0.816363, 0.329727 },
+  { 0.468053, 0.818921, 0.323998 },
+  { 0.477504, 0.821444, 0.318195 },
+  { 0.487026, 0.823929, 0.312321 },
+  { 0.496615, 0.826376, 0.306377 },
+  { 0.506271, 0.828786, 0.300362 },
+  { 0.515992, 0.831158, 0.294279 },
+  { 0.525776, 0.833491, 0.288127 },
+  { 0.535621, 0.835785, 0.281908 },
+  { 0.545524, 0.838039, 0.275626 },
+  { 0.555484, 0.840254, 0.269281 },
+  { 0.565498, 0.842430, 0.262877 },
+  { 0.575563, 0.844566, 0.256415 },
+  { 0.585678, 0.846661, 0.249897 },
+  { 0.595839, 0.848717, 0.243329 },
+  { 0.606045, 0.850733, 0.236712 },
+  { 0.616293, 0.852709, 0.230052 },
+  { 0.626579, 0.854645, 0.223353 },
+  { 0.636902, 0.856542, 0.216620 },
+  { 0.647257, 0.858400, 0.209861 },
+  { 0.657642, 0.860219, 0.203082 },
+  { 0.668054, 0.861999, 0.196293 },
+  { 0.678489, 0.863742, 0.189503 },
+  { 0.688944, 0.865448, 0.182725 },
+  { 0.699415, 0.867117, 0.175971 },
+  { 0.709898, 0.868751, 0.169257 },
+  { 0.720391, 0.870350, 0.162603 },
+  { 0.730889, 0.871916, 0.156029 },
+  { 0.741388, 0.873449, 0.149561 },
+  { 0.751884, 0.874951, 0.143228 },
+  { 0.762373, 0.876424, 0.137064 },
+  { 0.772852, 0.877868, 0.131109 },
+  { 0.783315, 0.879285, 0.125405 },
+  { 0.793760, 0.880678, 0.120005 },
+  { 0.804182, 0.882046, 0.114965 },
+  { 0.814576, 0.883393, 0.110347 },
+  { 0.824940, 0.884720, 0.106217 },
+  { 0.835270, 0.886029, 0.102646 },
+  { 0.845561, 0.887322, 0.099702 },
+  { 0.855810, 0.888601, 0.097452 },
+  { 0.866013, 0.889868, 0.095953 },
+  { 0.876168, 0.891125, 0.095250 },
+  { 0.886271, 0.892374, 0.095374 },
+  { 0.896320, 0.893616, 0.096335 },
+  { 0.906311, 0.894855, 0.098125 },
+  { 0.916242, 0.896091, 0.100717 },
+  { 0.926106, 0.897330, 0.104071 },
+  { 0.935904, 0.898570, 0.108131 },
+  { 0.945636, 0.899815, 0.112838 },
+  { 0.955300, 0.901065, 0.118128 },
+  { 0.964894, 0.902323, 0.123941 },
+  { 0.974417, 0.903590, 0.130215 },
+  { 0.983868, 0.904867, 0.136897 },
+  { 0.993248, 0.906157, 0.143936 }
+};
+
+static double parula_cm[256][3] = {
+  { 0.2081, 0.1663, 0.5292 },
+  { 0.2091, 0.1721, 0.5411 },
+  { 0.2101, 0.1779, 0.553   },
+  { 0.2109, 0.1837, 0.565   },
+  { 0.2116, 0.1895, 0.5771 },
+  { 0.2121, 0.1954, 0.5892 },
+  { 0.2124, 0.2013, 0.6013 },
+  { 0.2125, 0.2072, 0.6135 },
+  { 0.2123, 0.2132, 0.6258 },
+  { 0.2118, 0.2192, 0.6381 },
+  { 0.2111, 0.2253, 0.6505 },
+  { 0.2099, 0.2315, 0.6629 },
+  { 0.2084, 0.2377, 0.6753 },
+  { 0.2063, 0.244, 0.6878   },
+  { 0.2038, 0.2503, 0.7003 },
+  { 0.2006, 0.2568, 0.7129 },
+  { 0.1968, 0.2632, 0.7255 },
+  { 0.1921, 0.2698, 0.7381 },
+  { 0.1867, 0.2764, 0.7507 },
+  { 0.1802, 0.2832, 0.7634 },
+  { 0.1728, 0.2902, 0.7762 },
+  { 0.1641, 0.2975, 0.789   },
+  { 0.1541, 0.3052, 0.8017 },
+  { 0.1427, 0.3132, 0.8145 },
+  { 0.1295, 0.3217, 0.8269 },
+  { 0.1147, 0.3306, 0.8387 },
+  { 0.0986, 0.3397, 0.8495 },
+  { 0.0816, 0.3486, 0.8588 },
+  { 0.0646, 0.3572, 0.8664 },
+  { 0.0482, 0.3651, 0.8722 },
+  { 0.0329, 0.3724, 0.8765 },
+  { 0.0213, 0.3792, 0.8796 },
+  { 0.0136, 0.3853, 0.8815 },
+  { 0.0086, 0.3911, 0.8827 },
+  { 0.006,  0.3965, 0.8833 },
+  { 0.0051, 0.4017, 0.8834 },
+  { 0.0054, 0.4066, 0.8831 },
+  { 0.0067, 0.4113, 0.8825 },
+  { 0.0089, 0.4159, 0.8816 },
+  { 0.0116, 0.4203, 0.8805 },
+  { 0.0148, 0.4246, 0.8793 },
+  { 0.0184, 0.4288, 0.8779 },
+  { 0.0223, 0.4329, 0.8763 },
+  { 0.0264, 0.437, 0.8747   },
+  { 0.0306, 0.441, 0.8729   },
+  { 0.0349, 0.4449, 0.8711 },
+  { 0.0394, 0.4488, 0.8692 },
+  { 0.0437, 0.4526, 0.8672 },
+  { 0.0477, 0.4564, 0.8652 },
+  { 0.0514, 0.4602, 0.8632 },
+  { 0.0549, 0.464, 0.8611   },
+  { 0.0582, 0.4677, 0.8589 },
+  { 0.0612, 0.4714, 0.8568 },
+  { 0.064,  0.4751, 0.8546 },
+  { 0.0666, 0.4788, 0.8525 },
+  { 0.0689, 0.4825, 0.8503 },
+  { 0.071,  0.4862, 0.8481 },
+  { 0.0729, 0.4899, 0.846   },
+  { 0.0746, 0.4937, 0.8439 },
+  { 0.0761, 0.4974, 0.8418 },
+  { 0.0773, 0.5012, 0.8398 },
+  { 0.0782, 0.5051, 0.8378 },
+  { 0.0789, 0.5089, 0.8359 },
+  { 0.0794, 0.5129, 0.8341 },
+  { 0.0795, 0.5169, 0.8324 },
+  { 0.0793, 0.521, 0.8308   },
+  { 0.0788, 0.5251, 0.8293 },
+  { 0.0778, 0.5295, 0.828   },
+  { 0.0764, 0.5339, 0.827   },
+  { 0.0746, 0.5384, 0.8261 },
+  { 0.0724, 0.5431, 0.8253 },
+  { 0.0698, 0.5479, 0.8247 },
+  { 0.0668, 0.5527, 0.8243 },
+  { 0.0636, 0.5577, 0.8239 },
+  { 0.06,   0.5627, 0.8237 },
+  { 0.0562, 0.5677, 0.8234 },
+  { 0.0523, 0.5727, 0.8231 },
+  { 0.0484, 0.5777, 0.8228 },
+  { 0.0445, 0.5826, 0.8223 },
+  { 0.0408, 0.5874, 0.8217 },
+  { 0.0372, 0.5922, 0.8209 },
+  { 0.0342, 0.5968, 0.8198 },
+  { 0.0317, 0.6012, 0.8186 },
+  { 0.0296, 0.6055, 0.8171 },
+  { 0.0279, 0.6097, 0.8154 },
+  { 0.0265, 0.6137, 0.8135 },
+  { 0.0255, 0.6176, 0.8114 },
+  { 0.0248, 0.6214, 0.8091 },
+  { 0.0243, 0.625, 0.8066   },
+  { 0.0239, 0.6285, 0.8039 },
+  { 0.0237, 0.6319, 0.801   },
+  { 0.0235, 0.6352, 0.798   },
+  { 0.0233, 0.6384, 0.7948 },
+  { 0.0231, 0.6415, 0.7916 },
+  { 0.023,  0.6445, 0.7881 },
+  { 0.0229, 0.6474, 0.7846 },
+  { 0.0227, 0.6503, 0.781, },
+  { 0.0227, 0.6531, 0.7773 },
+  { 0.0232, 0.6558, 0.7735 },
+  { 0.0238, 0.6585, 0.7696 },
+  { 0.0246, 0.6611, 0.7656 },
+  { 0.0263, 0.6637, 0.7615 },
+  { 0.0282, 0.6663, 0.7574 },
+  { 0.0306, 0.6688, 0.7532 },
+  { 0.0338, 0.6712, 0.749   },
+  { 0.0373, 0.6737, 0.7446 },
+  { 0.0418, 0.6761, 0.7402 },
+  { 0.0467, 0.6784, 0.7358 },
+  { 0.0516, 0.6808, 0.7313 },
+  { 0.0574, 0.6831, 0.7267 },
+  { 0.0629, 0.6854, 0.7221 },
+  { 0.0692, 0.6877, 0.7173 },
+  { 0.0755, 0.6899, 0.7126 },
+  { 0.082,  0.6921, 0.7078 },
+  { 0.0889, 0.6943, 0.7029 },
+  { 0.0956, 0.6965, 0.6979 },
+  { 0.1031, 0.6986, 0.6929 },
+  { 0.1104, 0.7007, 0.6878 },
+  { 0.118,  0.7028, 0.6827 },
+  { 0.1258, 0.7049, 0.6775 },
+  { 0.1335, 0.7069, 0.6723 },
+  { 0.1418, 0.7089, 0.6669 },
+  { 0.1499, 0.7109, 0.6616 },
+  { 0.1585, 0.7129, 0.6561 },
+  { 0.1671, 0.7148, 0.6507 },
+  { 0.1758, 0.7168, 0.6451 },
+  { 0.1849, 0.7186, 0.6395 },
+  { 0.1938, 0.7205, 0.6338 },
+  { 0.2033, 0.7223, 0.6281 },
+  { 0.2128, 0.7241, 0.6223 },
+  { 0.2224, 0.7259, 0.6165 },
+  { 0.2324, 0.7275, 0.6107 },
+  { 0.2423, 0.7292, 0.6048 },
+  { 0.2527, 0.7308, 0.5988 },
+  { 0.2631, 0.7324, 0.5929 },
+  { 0.2735, 0.7339, 0.5869 },
+  { 0.2845, 0.7354, 0.5809 },
+  { 0.2953, 0.7368, 0.5749 },
+  { 0.3064, 0.7381, 0.5689 },
+  { 0.3177, 0.7394, 0.563   },
+  { 0.3289, 0.7406, 0.557   },
+  { 0.3405, 0.7417, 0.5512 },
+  { 0.352,  0.7428, 0.5453 },
+  { 0.3635, 0.7438, 0.5396 },
+  { 0.3753, 0.7446, 0.5339 },
+  { 0.3869, 0.7454, 0.5283 },
+  { 0.3986, 0.7461, 0.5229 },
+  { 0.4103, 0.7467, 0.5175 },
+  { 0.4218, 0.7473, 0.5123 },
+  { 0.4334, 0.7477, 0.5072 },
+  { 0.4447, 0.7482, 0.5021 },
+  { 0.4561, 0.7485, 0.4972 },
+  { 0.4672, 0.7487, 0.4924 },
+  { 0.4783, 0.7489, 0.4877 },
+  { 0.4892, 0.7491, 0.4831 },
+  { 0.5,    0.7491, 0.4786 },
+  { 0.5106, 0.7492, 0.4741 },
+  { 0.5212, 0.7492, 0.4698 },
+  { 0.5315, 0.7491, 0.4655 },
+  { 0.5418, 0.749, 0.4613   },
+  { 0.5519, 0.7489, 0.4571 },
+  { 0.5619, 0.7487, 0.4531 },
+  { 0.5718, 0.7485, 0.449   },
+  { 0.5816, 0.7482, 0.4451 },
+  { 0.5913, 0.7479, 0.4412 },
+  { 0.6009, 0.7476, 0.4374 },
+  { 0.6103, 0.7473, 0.4335 },
+  { 0.6197, 0.7469, 0.4298 },
+  { 0.629,  0.7465, 0.4261 },
+  { 0.6382, 0.746, 0.4224   },
+  { 0.6473, 0.7456, 0.4188 },
+  { 0.6564, 0.7451, 0.4152 },
+  { 0.6653, 0.7446, 0.4116 },
+  { 0.6742, 0.7441, 0.4081 },
+  { 0.683,  0.7435, 0.4046 },
+  { 0.6918, 0.743, 0.4011   },
+  { 0.7004, 0.7424, 0.3976 },
+  { 0.7091, 0.7418, 0.3942 },
+  { 0.7176, 0.7412, 0.3908 },
+  { 0.7261, 0.7405, 0.3874 },
+  { 0.7346, 0.7399, 0.384   },
+  { 0.743,  0.7392, 0.3806 },
+  { 0.7513, 0.7385, 0.3773 },
+  { 0.7596, 0.7378, 0.3739 },
+  { 0.7679, 0.7372, 0.3706 },
+  { 0.7761, 0.7364, 0.3673 },
+  { 0.7843, 0.7357, 0.3639 },
+  { 0.7924, 0.735, 0.3606   },
+  { 0.8005, 0.7343, 0.3573 },
+  { 0.8085, 0.7336, 0.3539 },
+  { 0.8166, 0.7329, 0.3506 },
+  { 0.8246, 0.7322, 0.3472 },
+  { 0.8325, 0.7315, 0.3438 },
+  { 0.8405, 0.7308, 0.3404 },
+  { 0.8484, 0.7301, 0.337   },
+  { 0.8563, 0.7294, 0.3336 },
+  { 0.8642, 0.7288, 0.33    },
+  { 0.872,  0.7282, 0.3265 },
+  { 0.8798, 0.7276, 0.3229 },
+  { 0.8877, 0.7271, 0.3193 },
+  { 0.8954, 0.7266, 0.3156 },
+  { 0.9032, 0.7262, 0.3117 },
+  { 0.911,  0.7259, 0.3078 },
+  { 0.9187, 0.7256, 0.3038 },
+  { 0.9264, 0.7256, 0.2996 },
+  { 0.9341, 0.7256, 0.2953 },
+  { 0.9417, 0.7259, 0.2907 },
+  { 0.9493, 0.7264, 0.2859 },
+  { 0.9567, 0.7273, 0.2808 },
+  { 0.9639, 0.7285, 0.2754 },
+  { 0.9708, 0.7303, 0.2696 },
+  { 0.9773, 0.7326, 0.2634 },
+  { 0.9831, 0.7355, 0.257   },
+  { 0.9882, 0.739, 0.2504   },
+  { 0.9922, 0.7431, 0.2437 },
+  { 0.9952, 0.7476, 0.2373 },
+  { 0.9973, 0.7524, 0.231   },
+  { 0.9986, 0.7573, 0.2251 },
+  { 0.9991, 0.7624, 0.2195 },
+  { 0.999,  0.7675, 0.2141 },
+  { 0.9985, 0.7726, 0.209   },
+  { 0.9976, 0.7778, 0.2042 },
+  { 0.9964, 0.7829, 0.1995 },
+  { 0.995,  0.788, 0.1949   },
+  { 0.9933, 0.7931, 0.1905 },
+  { 0.9914, 0.7981, 0.1863 },
+  { 0.9894, 0.8032, 0.1821 },
+  { 0.9873, 0.8083, 0.178   },
+  { 0.9851, 0.8133, 0.174   },
+  { 0.9828, 0.8184, 0.17    },
+  { 0.9805, 0.8235, 0.1661 },
+  { 0.9782, 0.8286, 0.1622 },
+  { 0.9759, 0.8337, 0.1583 },
+  { 0.9736, 0.8389, 0.1544 },
+  { 0.9713, 0.8441, 0.1505 },
+  { 0.9692, 0.8494, 0.1465 },
+  { 0.9672, 0.8548, 0.1425 },
+  { 0.9654, 0.8603, 0.1385 },
+  { 0.9638, 0.8659, 0.1343 },
+  { 0.9623, 0.8716, 0.1301 },
+  { 0.9611, 0.8774, 0.1258 },
+  { 0.96,   0.8834, 0.1215 },
+  { 0.9593, 0.8895, 0.1171 },
+  { 0.9588, 0.8958, 0.1126 },
+  { 0.9586, 0.9022, 0.1082 },
+  { 0.9587, 0.9088, 0.1036 },
+  { 0.9591, 0.9155, 0.099   },
+  { 0.9599, 0.9225, 0.0944 },
+  { 0.961,  0.9296, 0.0897 },
+  { 0.9624, 0.9368, 0.085   },
+  { 0.9641, 0.9443, 0.0802 },
+  { 0.9662, 0.9518, 0.0753 },
+  { 0.9685, 0.9595, 0.0703 },
+  { 0.971,  0.9673, 0.0651 },
+  { 0.9736, 0.9752, 0.0597 },
+  { 0.9763, 0.9831, 0.0538 }
+};
+}
+
+template <typename T>
+IGL_INLINE void igl::colormap(const ColorMapType cm, const T x, T * rgb)
+{
+  return colormap(cm,x,rgb[0],rgb[1],rgb[2]);
+}
+
+template <typename T>
+IGL_INLINE void igl::colormap(
+  const ColorMapType cm, const T x_in, T & r, T & g, T & b)
+{
+  switch (cm) 
+  {
+    case COLOR_MAP_TYPE_INFERNO:
+      colormap(inferno_cm, x_in, r, g, b);
+      break;
+    case COLOR_MAP_TYPE_JET:
+      jet(x_in, r, g, b);
+      break;
+    case COLOR_MAP_TYPE_MAGMA:
+      colormap(magma_cm, x_in, r, g, b);
+      break;
+    case COLOR_MAP_TYPE_PARULA:
+      colormap(parula_cm, x_in, r, g, b);
+      break;
+    case COLOR_MAP_TYPE_PLASMA:
+      colormap(plasma_cm, x_in, r, g, b);
+      break;
+    case COLOR_MAP_TYPE_VIRIDIS:
+      colormap(viridis_cm, x_in, r, g, b);
+      break;
+    default: 
+      throw std::invalid_argument("igl::colormap(): Selected colormap is unsupported!");
+      break;
+  }
+}
+
+template <typename T>
+IGL_INLINE void igl::colormap(
+  const double palette[256][3], const T x_in, T & r, T & g, T & b)
+{
+  static const unsigned int pal = 256;
+  const T zero = 0.0;
+  const T one = 1.0;
+  T x_in_clamped = static_cast<T>(std::max(zero, std::min(one, x_in)));
+
+  // simple rgb lerp from palette
+  unsigned int least = std::floor(x_in_clamped * static_cast<T>(pal - 1));
+  unsigned int most = std::ceil(x_in_clamped * static_cast<T>(pal - 1));
+
+  T _r[2] = { static_cast<T>(palette[least][0]), static_cast<T>(palette[most][0]) };
+  T _g[2] = { static_cast<T>(palette[least][1]), static_cast<T>(palette[most][1]) };
+  T _b[2] = { static_cast<T>(palette[least][2]), static_cast<T>(palette[most][2]) };
+
+  T t = std::max(zero, std::min(one, static_cast<T>(fmod(x_in_clamped * static_cast<T>(pal), one))));
+
+  r = std::max(zero, std::min(one, (one - t) * _r[0] + t * _r[1]));
+  g = std::max(zero, std::min(one, (one - t) * _g[0] + t * _g[1]));
+  b = std::max(zero, std::min(one, (one - t) * _b[0] + t * _b[1]));
+}
+
+template <typename DerivedZ, typename DerivedC>
+IGL_INLINE void igl::colormap(
+  const ColorMapType cm,
+  const Eigen::MatrixBase<DerivedZ> & Z,
+  const bool normalize,
+  Eigen::PlainObjectBase<DerivedC> & C)
+{
+  const double min_z = normalize ? Z.minCoeff() : 0;
+  const double max_z = normalize ? Z.maxCoeff() : -1;
+  return colormap(cm, Z, min_z, max_z, C);
+}
+
+template <typename DerivedZ, typename DerivedC>
+IGL_INLINE void igl::colormap(
+  const ColorMapType cm,
+  const Eigen::MatrixBase<DerivedZ> & Z,
+  const double min_z,
+  const double max_z,
+  Eigen::PlainObjectBase<DerivedC> & C)
+{
+  C.resize(Z.rows(),3);
+  double denom = (max_z - min_z);
+  denom = (denom == 0) ? 1 : denom;
+  for(int r = 0; r < Z.rows(); ++r) {
+  colormap(
+      cm,
+      (typename DerivedC::Scalar)((-min_z + Z(r,0)) / denom),
+      C(r,0),
+      C(r,1),
+      C(r,2));
+  }
+}
+
+#ifdef IGL_STATIC_LIBRARY
+// Explicit template instantiation
+// generated by autoexplicit.sh
+template void igl::colormap<float>(igl::ColorMapType, float, float*);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Array<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Array<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
+template void igl::colormap<double>(igl::ColorMapType, double, double&, double&, double&);
+// generated by autoexplicit.sh
+template void igl::colormap<double>(igl::ColorMapType, double, double*);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
+template void igl::colormap<Eigen::Array<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Array<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+#endif

+ 76 - 0
include/igl/colormap.h

@@ -0,0 +1,76 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+// 
+// Copyright (C) 2017 Joe Graus <jgraus@gmu.edu>, Alec Jacobson <alecjacobson@gmail.com>
+// 
+// This Source Code Form is subject to the terms of the Mozilla Public License 
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+// obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef IGL_COLORMAP_H
+#define IGL_COLORMAP_H
+#include "igl_inline.h"
+
+#include <Eigen/Dense>
+
+namespace igl {
+
+  enum ColorMapType
+  {
+    COLOR_MAP_TYPE_INFERNO = 0,
+    COLOR_MAP_TYPE_JET = 1,
+    COLOR_MAP_TYPE_MAGMA = 2,
+    COLOR_MAP_TYPE_PARULA = 3,
+    COLOR_MAP_TYPE_PLASMA = 4,
+    COLOR_MAP_TYPE_VIRIDIS = 5,
+    NUM_COLOR_MAP_TYPES = 6
+  };
+  // Comput [r,g,b] values of the selected colormap for
+  // a given factor f between 0 and 1
+  //
+  // Inputs:
+  //   c  colormap enum
+  //   f  factor determining color value as if 0 was min and 1 was max
+  // Outputs:
+  //   rgb  red, green, blue value
+  template <typename T>
+  IGL_INLINE void colormap(const ColorMapType cm, const T f, T * rgb);
+  // Outputs:
+  //   r  red value
+  //   g  green value
+  //   b  blue value
+  template <typename T>
+  IGL_INLINE void colormap(const ColorMapType cm, const T f, T & r, T & g, T & b);
+  // Inputs:
+  //    palette  256 by 3 array of color values
+  template <typename T>
+  IGL_INLINE void colormap(
+    const double palette[256][3], const T x_in, T & r, T & g, T & b);
+  // Inputs:
+  //   cm selected colormap palette to interpolate from
+  //   Z  #Z list of factors
+  //   normalize  whether to normalize Z to be tightly between [0,1]
+  // Outputs:
+  //   C  #C by 3 list of rgb colors
+  template <typename DerivedZ, typename DerivedC>
+  IGL_INLINE void colormap(
+    const ColorMapType cm,
+    const Eigen::MatrixBase<DerivedZ> & Z,
+    const bool normalize,
+    Eigen::PlainObjectBase<DerivedC> & C);
+  // Inputs:
+  //   min_z  value at "0"
+  //   max_z  value at "1"
+  template <typename DerivedZ, typename DerivedC>
+  IGL_INLINE void colormap(
+    const ColorMapType cm,
+    const Eigen::MatrixBase<DerivedZ> & Z,
+    const double min_Z,
+    const double max_Z,
+    Eigen::PlainObjectBase<DerivedC> & C);
+};
+
+#ifndef IGL_STATIC_LIBRARY
+#  include "colormap.cpp"
+#endif
+
+#endif

+ 4 - 4
include/igl/copyleft/cgal/CGAL_includes.hpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>
 // Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>
-// 
-// This Source Code Form is subject to the terms of the Mozilla Public License 
-// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #ifndef IGL_CGAL_INCLUDES_H
 #ifndef IGL_CGAL_INCLUDES_H
 #define IGL_CGAL_INCLUDES_H
 #define IGL_CGAL_INCLUDES_H

+ 13 - 13
include/igl/copyleft/cgal/insert_into_cdt.cpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2016 Alec Jacobson
 // Copyright (C) 2016 Alec Jacobson
-// 
-// This Source Code Form is subject to the terms of the Mozilla Public License 
-// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "insert_into_cdt.h"
 #include "insert_into_cdt.h"
 #include <CGAL/Point_3.h>
 #include <CGAL/Point_3.h>
@@ -22,30 +22,30 @@ IGL_INLINE void igl::copyleft::cgal::insert_into_cdt(
         CGAL::Constrained_triangulation_face_base_2< Kernel>
         CGAL::Constrained_triangulation_face_base_2< Kernel>
       >,
       >,
       CGAL::Exact_intersections_tag
       CGAL::Exact_intersections_tag
-    > 
-  > 
+    >
+  >
   & cdt)
   & cdt)
 {
 {
   typedef CGAL::Point_3<Kernel>    Point_3;
   typedef CGAL::Point_3<Kernel>    Point_3;
-  typedef CGAL::Segment_3<Kernel>  Segment_3; 
-  typedef CGAL::Triangle_3<Kernel> Triangle_3; 
+  typedef CGAL::Segment_3<Kernel>  Segment_3;
+  typedef CGAL::Triangle_3<Kernel> Triangle_3;
 
 
-  if(const Segment_3 *iseg = CGAL::object_cast<Segment_3 >(&obj)) 
+  if(const Segment_3 *iseg = CGAL::object_cast<Segment_3 >(&obj))
   {
   {
     // Add segment constraint
     // Add segment constraint
     cdt.insert_constraint( P.to_2d(iseg->vertex(0)),P.to_2d(iseg->vertex(1)));
     cdt.insert_constraint( P.to_2d(iseg->vertex(0)),P.to_2d(iseg->vertex(1)));
-  }else if(const Point_3 *ipoint = CGAL::object_cast<Point_3 >(&obj)) 
+  }else if(const Point_3 *ipoint = CGAL::object_cast<Point_3 >(&obj))
   {
   {
     // Add point
     // Add point
     cdt.insert(P.to_2d(*ipoint));
     cdt.insert(P.to_2d(*ipoint));
-  } else if(const Triangle_3 *itri = CGAL::object_cast<Triangle_3 >(&obj)) 
+  } else if(const Triangle_3 *itri = CGAL::object_cast<Triangle_3 >(&obj))
   {
   {
     // Add 3 segment constraints
     // Add 3 segment constraints
     cdt.insert_constraint( P.to_2d(itri->vertex(0)),P.to_2d(itri->vertex(1)));
     cdt.insert_constraint( P.to_2d(itri->vertex(0)),P.to_2d(itri->vertex(1)));
     cdt.insert_constraint( P.to_2d(itri->vertex(1)),P.to_2d(itri->vertex(2)));
     cdt.insert_constraint( P.to_2d(itri->vertex(1)),P.to_2d(itri->vertex(2)));
     cdt.insert_constraint( P.to_2d(itri->vertex(2)),P.to_2d(itri->vertex(0)));
     cdt.insert_constraint( P.to_2d(itri->vertex(2)),P.to_2d(itri->vertex(0)));
-  } else if(const std::vector<Point_3 > *polyp = 
-      CGAL::object_cast< std::vector<Point_3 > >(&obj)) 
+  } else if(const std::vector<Point_3 > *polyp =
+      CGAL::object_cast< std::vector<Point_3 > >(&obj))
   {
   {
     const std::vector<Point_3 > & poly = *polyp;
     const std::vector<Point_3 > & poly = *polyp;
     const size_t m = poly.size();
     const size_t m = poly.size();

+ 8 - 7
include/igl/copyleft/cgal/insert_into_cdt.h

@@ -1,14 +1,15 @@
 // This file is part of libigl, a simple c++ geometry processing library.
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2016 Alec Jacobson
 // Copyright (C) 2016 Alec Jacobson
-// 
-// This Source Code Form is subject to the terms of the Mozilla Public License 
-// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #ifndef IGL_COPYLEFT_CGAL_INSERT_INTO_CDT_H
 #ifndef IGL_COPYLEFT_CGAL_INSERT_INTO_CDT_H
 #define IGL_COPYLEFT_CGAL_INSERT_INTO_CDT_H
 #define IGL_COPYLEFT_CGAL_INSERT_INTO_CDT_H
 #include "../../igl_inline.h"
 #include "../../igl_inline.h"
 
 
+#include <CGAL/double.h> // Workaround https://github.com/CGAL/cgal/issues/2182 with CGAL 4.10-1
 #include <CGAL/Plane_3.h>
 #include <CGAL/Plane_3.h>
 #include <CGAL/Constrained_Delaunay_triangulation_2.h>
 #include <CGAL/Constrained_Delaunay_triangulation_2.h>
 #include <CGAL/Constrained_triangulation_plus_2.h>
 #include <CGAL/Constrained_triangulation_plus_2.h>
@@ -33,7 +34,7 @@ namespace igl
       //   cdt  current CDT, see output
       //   cdt  current CDT, see output
       // Outputs:
       // Outputs:
       //   cdt  CDT updated to contain constraints for the given object
       //   cdt  CDT updated to contain constraints for the given object
-      // 
+      //
       template <typename Kernel>
       template <typename Kernel>
       IGL_INLINE void insert_into_cdt(
       IGL_INLINE void insert_into_cdt(
         const CGAL::Object & obj,
         const CGAL::Object & obj,
@@ -46,8 +47,8 @@ namespace igl
               CGAL::Constrained_triangulation_face_base_2< Kernel>
               CGAL::Constrained_triangulation_face_base_2< Kernel>
             >,
             >,
             CGAL::Exact_intersections_tag
             CGAL::Exact_intersections_tag
-          > 
-        > 
+          >
+        >
         & cdt);
         & cdt);
     }
     }
   }
   }

+ 8 - 8
include/igl/copyleft/cgal/projected_cdt.cpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2016 Alec Jacobson
 // Copyright (C) 2016 Alec Jacobson
-// 
-// This Source Code Form is subject to the terms of the Mozilla Public License 
-// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "projected_cdt.h"
 #include "projected_cdt.h"
 #include "insert_into_cdt.h"
 #include "insert_into_cdt.h"
@@ -29,8 +29,8 @@ IGL_INLINE void igl::copyleft::cgal::projected_cdt(
   size_t count=0;
   size_t count=0;
   for (
   for (
     auto itr = cdt.finite_vertices_begin();
     auto itr = cdt.finite_vertices_begin();
-    itr != cdt.finite_vertices_end(); 
-    itr++) 
+    itr != cdt.finite_vertices_end();
+    itr++)
   {
   {
     vertices.push_back(P.to_3d(itr->point()));
     vertices.push_back(P.to_3d(itr->point()));
     v2i[itr] = count;
     v2i[itr] = count;
@@ -39,10 +39,10 @@ IGL_INLINE void igl::copyleft::cgal::projected_cdt(
   // Read off faces and store index triples
   // Read off faces and store index triples
   for (
   for (
     auto itr = cdt.finite_faces_begin();
     auto itr = cdt.finite_faces_begin();
-    itr != cdt.finite_faces_end(); 
+    itr != cdt.finite_faces_end();
     itr++)
     itr++)
   {
   {
-    faces.push_back( 
+    faces.push_back(
       { v2i[itr->vertex(0)], v2i[itr->vertex(1)], v2i[itr->vertex(2)] });
       { v2i[itr->vertex(0)], v2i[itr->vertex(1)], v2i[itr->vertex(2)] });
   }
   }
 }
 }

+ 6 - 5
include/igl/copyleft/cgal/projected_cdt.h

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2016 Alec Jacobson
 // Copyright (C) 2016 Alec Jacobson
-// 
-// This Source Code Form is subject to the terms of the Mozilla Public License 
-// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #ifndef IGL_COPYLEFT_CGAL_PROJECTED_CDT_H
 #ifndef IGL_COPYLEFT_CGAL_PROJECTED_CDT_H
 #define IGL_COPYLEFT_CGAL_PROJECTED_CDT_H
 #define IGL_COPYLEFT_CGAL_PROJECTED_CDT_H
@@ -11,6 +11,7 @@
 #include <Eigen/Core>
 #include <Eigen/Core>
 #include <CGAL/Plane_3.h>
 #include <CGAL/Plane_3.h>
 #include <CGAL/Point_3.h>
 #include <CGAL/Point_3.h>
+#include <CGAL/Object.h>
 #include <vector>
 #include <vector>
 namespace igl
 namespace igl
 {
 {
@@ -32,7 +33,7 @@ namespace igl
       // Outputs:
       // Outputs:
       //   vertices  list of vertices of the CDT mesh _back on the 3D plane_
       //   vertices  list of vertices of the CDT mesh _back on the 3D plane_
       //   faces  list of list of triangle indices into vertices
       //   faces  list of list of triangle indices into vertices
-      //   
+      //
       template <typename Kernel, typename Index>
       template <typename Kernel, typename Index>
       IGL_INLINE void projected_cdt(
       IGL_INLINE void projected_cdt(
         const std::vector<CGAL::Object> & objects,
         const std::vector<CGAL::Object> & objects,

+ 1 - 1
include/igl/opengl2/render_to_tga.cpp → include/igl/copyleft/opengl2/render_to_tga.cpp

@@ -8,7 +8,7 @@
 #include "render_to_tga.h"
 #include "render_to_tga.h"
 #include "tga.h"
 #include "tga.h"
 
 
-#include "gl.h"
+#include "../../opengl2/gl.h"
 
 
 #include <cstdlib>
 #include <cstdlib>
 
 

+ 1 - 1
include/igl/opengl2/render_to_tga.h → include/igl/copyleft/opengl2/render_to_tga.h

@@ -7,7 +7,7 @@
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #ifndef IGL_OPENGL_RENDER_TO_TGA_H
 #ifndef IGL_OPENGL_RENDER_TO_TGA_H
 #define IGL_OPENGL_RENDER_TO_TGA_H
 #define IGL_OPENGL_RENDER_TO_TGA_H
-#include "../igl_inline.h"
+#include "../../igl_inline.h"
 #include <string>
 #include <string>
 
 
 namespace igl
 namespace igl

+ 0 - 0
include/igl/opengl2/texture_from_tga.cpp → include/igl/copyleft/opengl2/texture_from_tga.cpp


+ 2 - 2
include/igl/opengl2/texture_from_tga.h → include/igl/copyleft/opengl2/texture_from_tga.h

@@ -7,8 +7,8 @@
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #ifndef IGL_OPENGL_TEXTURE_FROM_TGA_H
 #ifndef IGL_OPENGL_TEXTURE_FROM_TGA_H
 #define IGL_OPENGL_TEXTURE_FROM_TGA_H
 #define IGL_OPENGL_TEXTURE_FROM_TGA_H
-#include "../igl_inline.h"
-#include "gl.h"
+#include "../../igl_inline.h"
+#include "../../opengl2/gl.h"
 #include <string>
 #include <string>
 
 
 namespace igl
 namespace igl

+ 1 - 1
include/igl/opengl2/tga.cpp → include/igl/copyleft/opengl2/tga.cpp

@@ -41,7 +41,7 @@
  */
  */
 
 
 #include "tga.h"
 #include "tga.h"
-#include "glext.h"
+#include "../../opengl2/glext.h"
 #include <stdio.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>

+ 2 - 2
include/igl/opengl2/tga.h → include/igl/copyleft/opengl2/tga.h

@@ -7,9 +7,9 @@
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #ifndef IGL_OPENGL_TGA_H
 #ifndef IGL_OPENGL_TGA_H
 #define IGL_OPENGL_TGA_H
 #define IGL_OPENGL_TGA_H
-#include "../igl_inline.h"
+#include "../../igl_inline.h"
 
 
-#include "gl.h"
+#include "../../opengl2/gl.h"
 // See license in tga.cpp
 // See license in tga.cpp
 /* tga.h - interface for TrueVision (TGA) image file loader */
 /* tga.h - interface for TrueVision (TGA) image file loader */
 #include <stdio.h>
 #include <stdio.h>

+ 3 - 0
include/igl/integrable_polyvector_fields.cpp

@@ -47,6 +47,9 @@ namespace igl {
                                     const double &s,
                                     const double &s,
                                     Eigen::VectorXd &residuals,
                                     Eigen::VectorXd &residuals,
                                     bool do_jac = false,
                                     bool do_jac = false,
+                                    // Alec: why use a reference if it can
+                                    // point some undefined junk? This is asking
+                                    // for trouble...
                                     Eigen::MatrixXd &J = *(Eigen::MatrixXd*)NULL);
                                     Eigen::MatrixXd &J = *(Eigen::MatrixXd*)NULL);
     IGL_INLINE void rj_polycurl_edge(const Eigen::RowVectorXd &vec2D_a,
     IGL_INLINE void rj_polycurl_edge(const Eigen::RowVectorXd &vec2D_a,
                                      const Eigen::RowVector2d &ea,
                                      const Eigen::RowVector2d &ea,

+ 25 - 81
include/igl/jet.cpp

@@ -6,56 +6,12 @@
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "jet.h"
 #include "jet.h"
-#include "colon.h"
-
-#ifndef IGL_NO_EIGEN
-//void igl::jet(const int m, Eigen::MatrixXd & J)
-//{
-//  using namespace Eigen;
-//  // Applications/MATLAB_R2012b.app/toolbox/matlab/graph3d/jet.m
-//  const int n = ceil(m/4);
-//  // resize output
-//  J.resize(m,3);
-//  // u = [(1:1:n)/n ones(1,n-1) (n:-1:1)/n]';
-//  VectorXd u(n*3-1);
-//  u.block(0,0,n-1,1) = colon(1,n)/double(n);
-//  VectorXd g;
-//  colon(0,n*3-1-1,g);
-//  g.array() = g.array() + ceil(n/2) - int((m%4)==1);
-//  VectorXd r = (g.array() + n).eval().matrix();
-//  VectorXd b = (g.array() - n).eval().matrix();
-//  int ri = 0;
-//  int gi = 0;
-//  int sb = 0;
-//  // count number of indices in b
-//  for(int j = 0;j<g.rows();j++)
-//  {
-//    sb += b(j)<m;
-//  }
-//
-//  for(int j = 0;j<g.rows();j++)
-//  {
-//    if(r(j)<m)
-//    {
-//      J(r(j),0) = u(ri++);
-//    }
-//    if(g(j)<m)
-//    {
-//      J(g(j),1) = u(gi++);
-//    }
-//    if(b(j)<m)
-//    {
-//      //J(b(j),2) = u(m- --sb);
-//    }
-//  }
-//}
-#endif
-
+#include "colormap.h"
 
 
 template <typename T>
 template <typename T>
 IGL_INLINE void igl::jet(const T x, T * rgb)
 IGL_INLINE void igl::jet(const T x, T * rgb)
 {
 {
-  return jet(x,rgb[0],rgb[1],rgb[2]);
+  igl::colormap(igl::COLOR_MAP_TYPE_JET, x, rgb);
 }
 }
 
 
 template <typename T>
 template <typename T>
@@ -69,31 +25,31 @@ IGL_INLINE void igl::jet(const T x_in, T & r, T & g, T & b)
   const double gone = 1.0;
   const double gone = 1.0;
   const double bone = 1.0;
   const double bone = 1.0;
   T x = x_in;
   T x = x_in;
-  x = (x_in<0?0:(x>1?1:x));
+  x = (x_in<0 ? 0 : (x>1 ? 1 : x));
 
 
-  if(x<1./8.)
+  if (x<1. / 8.)
   {
   {
     r = 0;
     r = 0;
     g = 0;
     g = 0;
-    b = bone*(0.5+(x)/(1./8.)*0.5);
-  }else if(x<3./8.)
+    b = bone*(0.5 + (x) / (1. / 8.)*0.5);
+  } else if (x<3. / 8.)
   {
   {
     r = 0;
     r = 0;
-    g = gone*(x-1./8.)/(3./8.-1./8.);
+    g = gone*(x - 1. / 8.) / (3. / 8. - 1. / 8.);
     b = bone;
     b = bone;
-  }else if(x<5./8.)
+  } else if (x<5. / 8.)
   {
   {
-    r = rone*(x-3./8.)/(5./8.-3./8.);
+    r = rone*(x - 3. / 8.) / (5. / 8. - 3. / 8.);
     g = gone;
     g = gone;
-    b = (bone-(x-3./8.)/(5./8.-3./8.));
-  }else if(x<7./8.)
+    b = (bone - (x - 3. / 8.) / (5. / 8. - 3. / 8.));
+  } else if (x<7. / 8.)
   {
   {
     r = rone;
     r = rone;
-    g = (gone-(x-5./8.)/(7./8.-5./8.));
+    g = (gone - (x - 5. / 8.) / (7. / 8. - 5. / 8.));
     b = 0;
     b = 0;
-  }else
+  } else
   {
   {
-    r = (rone-(x-7./8.)/(1.-7./8.)*0.5);
+    r = (rone - (x - 7. / 8.) / (1. - 7. / 8.)*0.5);
     g = 0;
     g = 0;
     b = 0;
     b = 0;
   }
   }
@@ -101,47 +57,35 @@ IGL_INLINE void igl::jet(const T x_in, T & r, T & g, T & b)
 
 
 template <typename DerivedZ, typename DerivedC>
 template <typename DerivedZ, typename DerivedC>
 IGL_INLINE void igl::jet(
 IGL_INLINE void igl::jet(
-  const Eigen::PlainObjectBase<DerivedZ> & Z,
+  const Eigen::MatrixBase<DerivedZ> & Z,
   const bool normalize,
   const bool normalize,
   Eigen::PlainObjectBase<DerivedC> & C)
   Eigen::PlainObjectBase<DerivedC> & C)
 {
 {
-  const double min_z = (normalize?Z.minCoeff():0);
-  const double max_z = (normalize?Z.maxCoeff():-1);
-  return jet(Z,min_z,max_z,C);
+  igl::colormap(igl::COLOR_MAP_TYPE_JET,Z, normalize, C);
 }
 }
 
 
 template <typename DerivedZ, typename DerivedC>
 template <typename DerivedZ, typename DerivedC>
 IGL_INLINE void igl::jet(
 IGL_INLINE void igl::jet(
-  const Eigen::PlainObjectBase<DerivedZ> & Z,
+  const Eigen::MatrixBase<DerivedZ> & Z,
   const double min_z,
   const double min_z,
   const double max_z,
   const double max_z,
   Eigen::PlainObjectBase<DerivedC> & C)
   Eigen::PlainObjectBase<DerivedC> & C)
 {
 {
-  C.resize(Z.rows(),3);
-  double denom = (max_z-min_z);
-  denom = denom==0?1:denom;
-  for(int r = 0;r<Z.rows();r++)
-  {
-    jet(
-      (typename DerivedC::Scalar)((-min_z+Z(r,0))/denom),
-      C(r,0),
-      C(r,1),
-      C(r,2));
-  }
+  igl::colormap(igl::COLOR_MAP_TYPE_JET, Z, min_z, max_z, C);
 }
 }
 
 
 #ifdef IGL_STATIC_LIBRARY
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // Explicit template instantiation
 // generated by autoexplicit.sh
 // generated by autoexplicit.sh
-template void igl::jet<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::jet<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 template void igl::jet<double>(double, double*);
 template void igl::jet<double>(double, double*);
 template void igl::jet<double>(double, double&, double&, double&);
 template void igl::jet<double>(double, double&, double&, double&);
 template void igl::jet<float>(float, float*);
 template void igl::jet<float>(float, float*);
-template void igl::jet<Eigen::Array<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Array<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
-template void igl::jet<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
-template void igl::jet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::jet<Eigen::Array<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Array<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::jet<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::jet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 template void igl::jet<float>(float, float&, float&, float&);
 template void igl::jet<float>(float, float&, float&, float&);
-template void igl::jet<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
-template void igl::jet<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
-template void igl::jet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::jet<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::jet<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::jet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 #endif
 #endif

+ 2 - 2
include/igl/jet.h

@@ -43,7 +43,7 @@ namespace igl
   //   C  #C by 3 list of rgb colors
   //   C  #C by 3 list of rgb colors
   template <typename DerivedZ, typename DerivedC>
   template <typename DerivedZ, typename DerivedC>
   IGL_INLINE void jet(
   IGL_INLINE void jet(
-    const Eigen::PlainObjectBase<DerivedZ> & Z,
+    const Eigen::MatrixBase<DerivedZ> & Z,
     const bool normalize,
     const bool normalize,
     Eigen::PlainObjectBase<DerivedC> & C);
     Eigen::PlainObjectBase<DerivedC> & C);
   // Inputs:
   // Inputs:
@@ -51,7 +51,7 @@ namespace igl
   //   max_z  value at red
   //   max_z  value at red
   template <typename DerivedZ, typename DerivedC>
   template <typename DerivedZ, typename DerivedC>
   IGL_INLINE void jet(
   IGL_INLINE void jet(
-    const Eigen::PlainObjectBase<DerivedZ> & Z,
+    const Eigen::MatrixBase<DerivedZ> & Z,
     const double min_Z,
     const double min_Z,
     const double max_Z,
     const double max_Z,
     Eigen::PlainObjectBase<DerivedC> & C);
     Eigen::PlainObjectBase<DerivedC> & C);

+ 12 - 38
include/igl/parula.cpp

@@ -6,74 +6,48 @@
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "parula.h"
 #include "parula.h"
-
+#include "colormap.h"
 
 
 template <typename T>
 template <typename T>
 IGL_INLINE void igl::parula(const T x, T * rgb)
 IGL_INLINE void igl::parula(const T x, T * rgb)
 {
 {
-  return parula(x,rgb[0],rgb[1],rgb[2]);
+  igl::colormap(igl::COLOR_MAP_TYPE_PARULA,x, rgb);
 }
 }
 
 
 template <typename T>
 template <typename T>
 IGL_INLINE void igl::parula(const T f, T & r, T & g, T & b)
 IGL_INLINE void igl::parula(const T f, T & r, T & g, T & b)
 {
 {
-  // clamp to (0,1)
-  const float eff_f = (f>=1.?1.:(f<=0.?0.:f));
-  // continuous index into array
-  const float ff = eff_f*(PARULA_COLOR_MAP.rows()-1);
-  size_t s = std::floor(ff);
-  size_t d = std::ceil(ff);
-  const float t = (s==d ? 0. : (ff-s)/float(d-s));
-
-  assert(t>=0 && t<=1);
-  const auto rgb_s = PARULA_COLOR_MAP.row(s);
-  const auto rgb_d = PARULA_COLOR_MAP.row(d);
-  const auto rgb = rgb_s + t*(rgb_d-rgb_s);
-  r = rgb(0);
-  g = rgb(1);
-  b = rgb(2);
+  igl::colormap(igl::COLOR_MAP_TYPE_PARULA, f, r, g, b);
 }
 }
 
 
 
 
 template <typename DerivedZ, typename DerivedC>
 template <typename DerivedZ, typename DerivedC>
 IGL_INLINE void igl::parula(
 IGL_INLINE void igl::parula(
-  const Eigen::PlainObjectBase<DerivedZ> & Z,
+  const Eigen::MatrixBase<DerivedZ> & Z,
   const bool normalize,
   const bool normalize,
   Eigen::PlainObjectBase<DerivedC> & C)
   Eigen::PlainObjectBase<DerivedC> & C)
 {
 {
-  const double min_z = (normalize?Z.minCoeff():0);
-  const double max_z = (normalize?Z.maxCoeff():1);
-  return parula(Z,min_z,max_z,C);
+  igl::colormap(igl::COLOR_MAP_TYPE_PARULA, Z, normalize, C);
 }
 }
 template <typename DerivedZ, typename DerivedC>
 template <typename DerivedZ, typename DerivedC>
 IGL_INLINE void igl::parula(
 IGL_INLINE void igl::parula(
-  const Eigen::PlainObjectBase<DerivedZ> & Z,
+  const Eigen::MatrixBase<DerivedZ> & Z,
   const double min_z,
   const double min_z,
   const double max_z,
   const double max_z,
   Eigen::PlainObjectBase<DerivedC> & C)
   Eigen::PlainObjectBase<DerivedC> & C)
 {
 {
-  C.resize(Z.rows(),3);
-  double denom = (max_z-min_z);
-  denom = denom==0?1:denom;
-  for(int r = 0;r<Z.rows();r++)
-  {
-    parula(
-      (typename DerivedC::Scalar)((-min_z+Z(r,0))/denom),
-      C(r,0),
-      C(r,1),
-      C(r,2));
-  }
+  igl::colormap(igl::COLOR_MAP_TYPE_PARULA, Z, min_z, max_z, C);
 }
 }
 
 
 #ifdef IGL_STATIC_LIBRARY
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // Explicit template instantiation
 // generated by autoexplicit.sh
 // generated by autoexplicit.sh
-template void igl::parula<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::parula<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 // generated by autoexplicit.sh
 // generated by autoexplicit.sh
-template void igl::parula<Eigen::Array<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Array<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::parula<Eigen::Array<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Array<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 template void igl::parula<double>(double, double*);
 template void igl::parula<double>(double, double*);
 template void igl::parula<double>(double, double&, double&, double&);
 template void igl::parula<double>(double, double&, double&, double&);
-template void igl::parula<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
-template void igl::parula<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
-template void igl::parula<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::parula<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::parula<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::parula<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 #endif
 #endif

+ 3 - 262
include/igl/parula.h

@@ -40,7 +40,7 @@ namespace igl
   //   C  #C by 3 list of rgb colors
   //   C  #C by 3 list of rgb colors
   template <typename DerivedZ, typename DerivedC>
   template <typename DerivedZ, typename DerivedC>
   IGL_INLINE void parula(
   IGL_INLINE void parula(
-    const Eigen::PlainObjectBase<DerivedZ> & Z,
+    const Eigen::MatrixBase<DerivedZ> & Z,
     const bool normalize,
     const bool normalize,
     Eigen::PlainObjectBase<DerivedC> & C);
     Eigen::PlainObjectBase<DerivedC> & C);
   // Inputs:
   // Inputs:
@@ -48,271 +48,12 @@ namespace igl
   //   max_Z  value at red
   //   max_Z  value at red
   template <typename DerivedZ, typename DerivedC>
   template <typename DerivedZ, typename DerivedC>
   IGL_INLINE void parula(
   IGL_INLINE void parula(
-    const Eigen::PlainObjectBase<DerivedZ> & Z,
+    const Eigen::MatrixBase<DerivedZ> & Z,
     const double min_Z,
     const double min_Z,
     const double max_Z,
     const double max_Z,
     Eigen::PlainObjectBase<DerivedC> & C);
     Eigen::PlainObjectBase<DerivedC> & C);
-  // adapted from parula.m
-  const Eigen::Matrix<float,256,4> PARULA_COLOR_MAP = 
-    (Eigen::Matrix<float,256,4>()<<
-      0.2081,0.1663,0.5292,1,
-      0.2091,0.1721,0.5411,1,
-      0.2101,0.1779,0.553,1,
-      0.2109,0.1837,0.565,1,
-      0.2116,0.1895,0.5771,1,
-      0.2121,0.1954,0.5892,1,
-      0.2124,0.2013,0.6013,1,
-      0.2125,0.2072,0.6135,1,
-      0.2123,0.2132,0.6258,1,
-      0.2118,0.2192,0.6381,1,
-      0.2111,0.2253,0.6505,1,
-      0.2099,0.2315,0.6629,1,
-      0.2084,0.2377,0.6753,1,
-      0.2063,0.244,0.6878,1,
-      0.2038,0.2503,0.7003,1,
-      0.2006,0.2568,0.7129,1,
-      0.1968,0.2632,0.7255,1,
-      0.1921,0.2698,0.7381,1,
-      0.1867,0.2764,0.7507,1,
-      0.1802,0.2832,0.7634,1,
-      0.1728,0.2902,0.7762,1,
-      0.1641,0.2975,0.789,1,
-      0.1541,0.3052,0.8017,1,
-      0.1427,0.3132,0.8145,1,
-      0.1295,0.3217,0.8269,1,
-      0.1147,0.3306,0.8387,1,
-      0.0986,0.3397,0.8495,1,
-      0.0816,0.3486,0.8588,1,
-      0.0646,0.3572,0.8664,1,
-      0.0482,0.3651,0.8722,1,
-      0.0329,0.3724,0.8765,1,
-      0.0213,0.3792,0.8796,1,
-      0.0136,0.3853,0.8815,1,
-      0.0086,0.3911,0.8827,1,
-      0.006,0.3965,0.8833,1,
-      0.0051,0.4017,0.8834,1,
-      0.0054,0.4066,0.8831,1,
-      0.0067,0.4113,0.8825,1,
-      0.0089,0.4159,0.8816,1,
-      0.0116,0.4203,0.8805,1,
-      0.0148,0.4246,0.8793,1,
-      0.0184,0.4288,0.8779,1,
-      0.0223,0.4329,0.8763,1,
-      0.0264,0.437,0.8747,1,
-      0.0306,0.441,0.8729,1,
-      0.0349,0.4449,0.8711,1,
-      0.0394,0.4488,0.8692,1,
-      0.0437,0.4526,0.8672,1,
-      0.0477,0.4564,0.8652,1,
-      0.0514,0.4602,0.8632,1,
-      0.0549,0.464,0.8611,1,
-      0.0582,0.4677,0.8589,1,
-      0.0612,0.4714,0.8568,1,
-      0.064,0.4751,0.8546,1,
-      0.0666,0.4788,0.8525,1,
-      0.0689,0.4825,0.8503,1,
-      0.071,0.4862,0.8481,1,
-      0.0729,0.4899,0.846,1,
-      0.0746,0.4937,0.8439,1,
-      0.0761,0.4974,0.8418,1,
-      0.0773,0.5012,0.8398,1,
-      0.0782,0.5051,0.8378,1,
-      0.0789,0.5089,0.8359,1,
-      0.0794,0.5129,0.8341,1,
-      0.0795,0.5169,0.8324,1,
-      0.0793,0.521,0.8308,1,
-      0.0788,0.5251,0.8293,1,
-      0.0778,0.5295,0.828,1,
-      0.0764,0.5339,0.827,1,
-      0.0746,0.5384,0.8261,1,
-      0.0724,0.5431,0.8253,1,
-      0.0698,0.5479,0.8247,1,
-      0.0668,0.5527,0.8243,1,
-      0.0636,0.5577,0.8239,1,
-      0.06,0.5627,0.8237,1,
-      0.0562,0.5677,0.8234,1,
-      0.0523,0.5727,0.8231,1,
-      0.0484,0.5777,0.8228,1,
-      0.0445,0.5826,0.8223,1,
-      0.0408,0.5874,0.8217,1,
-      0.0372,0.5922,0.8209,1,
-      0.0342,0.5968,0.8198,1,
-      0.0317,0.6012,0.8186,1,
-      0.0296,0.6055,0.8171,1,
-      0.0279,0.6097,0.8154,1,
-      0.0265,0.6137,0.8135,1,
-      0.0255,0.6176,0.8114,1,
-      0.0248,0.6214,0.8091,1,
-      0.0243,0.625,0.8066,1,
-      0.0239,0.6285,0.8039,1,
-      0.0237,0.6319,0.801,1,
-      0.0235,0.6352,0.798,1,
-      0.0233,0.6384,0.7948,1,
-      0.0231,0.6415,0.7916,1,
-      0.023,0.6445,0.7881,1,
-      0.0229,0.6474,0.7846,1,
-      0.0227,0.6503,0.781,1,
-      0.0227,0.6531,0.7773,1,
-      0.0232,0.6558,0.7735,1,
-      0.0238,0.6585,0.7696,1,
-      0.0246,0.6611,0.7656,1,
-      0.0263,0.6637,0.7615,1,
-      0.0282,0.6663,0.7574,1,
-      0.0306,0.6688,0.7532,1,
-      0.0338,0.6712,0.749,1,
-      0.0373,0.6737,0.7446,1,
-      0.0418,0.6761,0.7402,1,
-      0.0467,0.6784,0.7358,1,
-      0.0516,0.6808,0.7313,1,
-      0.0574,0.6831,0.7267,1,
-      0.0629,0.6854,0.7221,1,
-      0.0692,0.6877,0.7173,1,
-      0.0755,0.6899,0.7126,1,
-      0.082,0.6921,0.7078,1,
-      0.0889,0.6943,0.7029,1,
-      0.0956,0.6965,0.6979,1,
-      0.1031,0.6986,0.6929,1,
-      0.1104,0.7007,0.6878,1,
-      0.118,0.7028,0.6827,1,
-      0.1258,0.7049,0.6775,1,
-      0.1335,0.7069,0.6723,1,
-      0.1418,0.7089,0.6669,1,
-      0.1499,0.7109,0.6616,1,
-      0.1585,0.7129,0.6561,1,
-      0.1671,0.7148,0.6507,1,
-      0.1758,0.7168,0.6451,1,
-      0.1849,0.7186,0.6395,1,
-      0.1938,0.7205,0.6338,1,
-      0.2033,0.7223,0.6281,1,
-      0.2128,0.7241,0.6223,1,
-      0.2224,0.7259,0.6165,1,
-      0.2324,0.7275,0.6107,1,
-      0.2423,0.7292,0.6048,1,
-      0.2527,0.7308,0.5988,1,
-      0.2631,0.7324,0.5929,1,
-      0.2735,0.7339,0.5869,1,
-      0.2845,0.7354,0.5809,1,
-      0.2953,0.7368,0.5749,1,
-      0.3064,0.7381,0.5689,1,
-      0.3177,0.7394,0.563,1,
-      0.3289,0.7406,0.557,1,
-      0.3405,0.7417,0.5512,1,
-      0.352,0.7428,0.5453,1,
-      0.3635,0.7438,0.5396,1,
-      0.3753,0.7446,0.5339,1,
-      0.3869,0.7454,0.5283,1,
-      0.3986,0.7461,0.5229,1,
-      0.4103,0.7467,0.5175,1,
-      0.4218,0.7473,0.5123,1,
-      0.4334,0.7477,0.5072,1,
-      0.4447,0.7482,0.5021,1,
-      0.4561,0.7485,0.4972,1,
-      0.4672,0.7487,0.4924,1,
-      0.4783,0.7489,0.4877,1,
-      0.4892,0.7491,0.4831,1,
-      0.5,0.7491,0.4786,1,
-      0.5106,0.7492,0.4741,1,
-      0.5212,0.7492,0.4698,1,
-      0.5315,0.7491,0.4655,1,
-      0.5418,0.749,0.4613,1,
-      0.5519,0.7489,0.4571,1,
-      0.5619,0.7487,0.4531,1,
-      0.5718,0.7485,0.449,1,
-      0.5816,0.7482,0.4451,1,
-      0.5913,0.7479,0.4412,1,
-      0.6009,0.7476,0.4374,1,
-      0.6103,0.7473,0.4335,1,
-      0.6197,0.7469,0.4298,1,
-      0.629,0.7465,0.4261,1,
-      0.6382,0.746,0.4224,1,
-      0.6473,0.7456,0.4188,1,
-      0.6564,0.7451,0.4152,1,
-      0.6653,0.7446,0.4116,1,
-      0.6742,0.7441,0.4081,1,
-      0.683,0.7435,0.4046,1,
-      0.6918,0.743,0.4011,1,
-      0.7004,0.7424,0.3976,1,
-      0.7091,0.7418,0.3942,1,
-      0.7176,0.7412,0.3908,1,
-      0.7261,0.7405,0.3874,1,
-      0.7346,0.7399,0.384,1,
-      0.743,0.7392,0.3806,1,
-      0.7513,0.7385,0.3773,1,
-      0.7596,0.7378,0.3739,1,
-      0.7679,0.7372,0.3706,1,
-      0.7761,0.7364,0.3673,1,
-      0.7843,0.7357,0.3639,1,
-      0.7924,0.735,0.3606,1,
-      0.8005,0.7343,0.3573,1,
-      0.8085,0.7336,0.3539,1,
-      0.8166,0.7329,0.3506,1,
-      0.8246,0.7322,0.3472,1,
-      0.8325,0.7315,0.3438,1,
-      0.8405,0.7308,0.3404,1,
-      0.8484,0.7301,0.337,1,
-      0.8563,0.7294,0.3336,1,
-      0.8642,0.7288,0.33,1,
-      0.872,0.7282,0.3265,1,
-      0.8798,0.7276,0.3229,1,
-      0.8877,0.7271,0.3193,1,
-      0.8954,0.7266,0.3156,1,
-      0.9032,0.7262,0.3117,1,
-      0.911,0.7259,0.3078,1,
-      0.9187,0.7256,0.3038,1,
-      0.9264,0.7256,0.2996,1,
-      0.9341,0.7256,0.2953,1,
-      0.9417,0.7259,0.2907,1,
-      0.9493,0.7264,0.2859,1,
-      0.9567,0.7273,0.2808,1,
-      0.9639,0.7285,0.2754,1,
-      0.9708,0.7303,0.2696,1,
-      0.9773,0.7326,0.2634,1,
-      0.9831,0.7355,0.257,1,
-      0.9882,0.739,0.2504,1,
-      0.9922,0.7431,0.2437,1,
-      0.9952,0.7476,0.2373,1,
-      0.9973,0.7524,0.231,1,
-      0.9986,0.7573,0.2251,1,
-      0.9991,0.7624,0.2195,1,
-      0.999,0.7675,0.2141,1,
-      0.9985,0.7726,0.209,1,
-      0.9976,0.7778,0.2042,1,
-      0.9964,0.7829,0.1995,1,
-      0.995,0.788,0.1949,1,
-      0.9933,0.7931,0.1905,1,
-      0.9914,0.7981,0.1863,1,
-      0.9894,0.8032,0.1821,1,
-      0.9873,0.8083,0.178,1,
-      0.9851,0.8133,0.174,1,
-      0.9828,0.8184,0.17,1,
-      0.9805,0.8235,0.1661,1,
-      0.9782,0.8286,0.1622,1,
-      0.9759,0.8337,0.1583,1,
-      0.9736,0.8389,0.1544,1,
-      0.9713,0.8441,0.1505,1,
-      0.9692,0.8494,0.1465,1,
-      0.9672,0.8548,0.1425,1,
-      0.9654,0.8603,0.1385,1,
-      0.9638,0.8659,0.1343,1,
-      0.9623,0.8716,0.1301,1,
-      0.9611,0.8774,0.1258,1,
-      0.96,0.8834,0.1215,1,
-      0.9593,0.8895,0.1171,1,
-      0.9588,0.8958,0.1126,1,
-      0.9586,0.9022,0.1082,1,
-      0.9587,0.9088,0.1036,1,
-      0.9591,0.9155,0.099,1,
-      0.9599,0.9225,0.0944,1,
-      0.961,0.9296,0.0897,1,
-      0.9624,0.9368,0.085,1,
-      0.9641,0.9443,0.0802,1,
-      0.9662,0.9518,0.0753,1,
-      0.9685,0.9595,0.0703,1,
-      0.971,0.9673,0.0651,1,
-      0.9736,0.9752,0.0597,1,
-      0.9763,0.9831,0.0538,1).finished();
 };
 };
-
+  
 #ifndef IGL_STATIC_LIBRARY
 #ifndef IGL_STATIC_LIBRARY
 #  include "parula.cpp"
 #  include "parula.cpp"
 #endif
 #endif

+ 2 - 2
include/igl/png/readPNG.cpp

@@ -6,7 +6,7 @@
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "readPNG.h"
 #include "readPNG.h"
-#include <stb_image.h>
+#include <igl_stb_image.h>
 
 
 IGL_INLINE bool igl::png::readPNG(
 IGL_INLINE bool igl::png::readPNG(
   const std::string png_file,
   const std::string png_file,
@@ -36,7 +36,7 @@ IGL_INLINE bool igl::png::readPNG(
     }
     }
   }
   }
 
 
-  stbi_image_free(data);
+  igl::stbi_image_free(data);
 
 
   return true;
   return true;
 }
 }

+ 2 - 2
include/igl/png/render_to_png.cpp

@@ -6,7 +6,7 @@
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "render_to_png.h"
 #include "render_to_png.h"
-#include <stb_image_write.h>
+#include <igl_stb_image.h>
 
 
 #include "../opengl/gl.h"
 #include "../opengl/gl.h"
 
 
@@ -35,7 +35,7 @@ IGL_INLINE bool igl::png::render_to_png(
       data[4*(i+j*width)+3] = 255;
       data[4*(i+j*width)+3] = 255;
     }
     }
   }
   }
-  bool ret = stbi_write_png(png_file.c_str(), width, height, 4, data, 4*width*sizeof(unsigned char));
+  bool ret = igl::stbi_write_png(png_file.c_str(), width, height, 4, data, 4*width*sizeof(unsigned char));
   delete [] data;
   delete [] data;
   return ret;
   return ret;
 }
 }

+ 2 - 2
include/igl/png/render_to_png_async.cpp

@@ -7,7 +7,7 @@
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "render_to_png_async.h"
 #include "render_to_png_async.h"
 #include "../opengl/gl.h"
 #include "../opengl/gl.h"
-#include <stb_image_write.h>
+#include <igl_stb_image.h>
 
 
 static IGL_INLINE bool render_to_png_async_helper(
 static IGL_INLINE bool render_to_png_async_helper(
   unsigned char * img, int width, int height,
   unsigned char * img, int width, int height,
@@ -25,7 +25,7 @@ static IGL_INLINE bool render_to_png_async_helper(
     }
     }
   }
   }
 
 
-  bool ret = stbi_write_png(png_file.c_str(), width, height, 4, img, width*sizeof(unsigned char));
+  bool ret = igl::stbi_write_png(png_file.c_str(), width, height, 4, img, width*sizeof(unsigned char));
   delete [] img;
   delete [] img;
   return ret;
   return ret;
 }
 }

+ 6 - 6
include/igl/png/texture_from_png.cpp

@@ -8,12 +8,12 @@
 #include "texture_from_png.h"
 #include "texture_from_png.h"
 
 
 #include "../opengl/report_gl_error.h"
 #include "../opengl/report_gl_error.h"
-#include <stb_image.h>
+#include <igl_stb_image.h>
 
 
 IGL_INLINE bool igl::png::texture_from_png(const std::string png_file, const bool flip, GLuint & id)
 IGL_INLINE bool igl::png::texture_from_png(const std::string png_file, const bool flip, GLuint & id)
 {
 {
   int width,height,n;
   int width,height,n;
-  unsigned char *data = stbi_load(png_file.c_str(), &width, &height, &n, 4);
+  unsigned char *data = igl::stbi_load(png_file.c_str(), &width, &height, &n, 4);
   if(data == NULL) {
   if(data == NULL) {
     return false;
     return false;
   }
   }
@@ -23,7 +23,7 @@ IGL_INLINE bool igl::png::texture_from_png(const std::string png_file, const boo
   {
   {
     yimg.flip();
     yimg.flip();
   }*/
   }*/
-  
+
   glGenTextures(1, &id);
   glGenTextures(1, &id);
   glBindTexture(GL_TEXTURE_2D, id);
   glBindTexture(GL_TEXTURE_2D, id);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -35,7 +35,7 @@ IGL_INLINE bool igl::png::texture_from_png(const std::string png_file, const boo
     width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
     width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
   glBindTexture(GL_TEXTURE_2D, 0);
   glBindTexture(GL_TEXTURE_2D, 0);
 
 
-  stbi_image_free(data);
+  igl::stbi_image_free(data);
 
 
   return true;
   return true;
 }
 }
@@ -55,7 +55,7 @@ IGL_INLINE bool igl::png::texture_from_png(
 )
 )
 {
 {
   int width,height,n;
   int width,height,n;
-  unsigned char *data = stbi_load(png_file.c_str(), &width, &height, &n, 4);
+  unsigned char *data = igl::stbi_load(png_file.c_str(), &width, &height, &n, 4);
   if(data == NULL) {
   if(data == NULL) {
     return false;
     return false;
   }
   }
@@ -77,7 +77,7 @@ IGL_INLINE bool igl::png::texture_from_png(
     }
     }
   }
   }
 
 
-  stbi_image_free(data);
+  igl::stbi_image_free(data);
 
 
   return true;
   return true;
 }
 }

+ 2 - 2
include/igl/png/writePNG.cpp

@@ -6,7 +6,7 @@
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "writePNG.h"
 #include "writePNG.h"
-#include <stb_image_write.h>
+#include <igl_stb_image.h>
 #include <vector>
 #include <vector>
 
 
 IGL_INLINE bool igl::png::writePNG(
 IGL_INLINE bool igl::png::writePNG(
@@ -35,7 +35,7 @@ IGL_INLINE bool igl::png::writePNG(
     }
     }
   }
   }
 
 
-  stbi_write_png(png_file.c_str(), R.rows(), R.cols(), comp, data.data(), stride_in_bytes);
+  igl::stbi_write_png(png_file.c_str(), R.rows(), R.cols(), comp, data.data(), stride_in_bytes);
 
 
   return true;
   return true;
 }
 }

+ 1 - 0
include/igl/sortrows.cpp

@@ -107,6 +107,7 @@ IGL_INLINE void igl::sortrows(
 
 
 #ifdef IGL_STATIC_LIBRARY
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // Explicit template instantiation
+template void igl::sortrows<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 // generated by autoexplicit.sh
 // generated by autoexplicit.sh
 template void igl::sortrows<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::sortrows<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 // generated by autoexplicit.sh
 // generated by autoexplicit.sh

+ 13 - 13
include/igl/unique_edge_map.cpp

@@ -17,7 +17,7 @@ template <
   typename DerivedEMAP,
   typename DerivedEMAP,
   typename uE2EType>
   typename uE2EType>
 IGL_INLINE void igl::unique_edge_map(
 IGL_INLINE void igl::unique_edge_map(
-  const Eigen::PlainObjectBase<DerivedF> & F,
+  const Eigen::MatrixBase<DerivedF> & F,
   Eigen::PlainObjectBase<DerivedE> & E,
   Eigen::PlainObjectBase<DerivedE> & E,
   Eigen::PlainObjectBase<DeriveduE> & uE,
   Eigen::PlainObjectBase<DeriveduE> & uE,
   Eigen::PlainObjectBase<DerivedEMAP> & EMAP,
   Eigen::PlainObjectBase<DerivedEMAP> & EMAP,
@@ -46,22 +46,22 @@ IGL_INLINE void igl::unique_edge_map(
 #ifdef IGL_STATIC_LIBRARY
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // Explicit template instantiation
 // generated by autoexplicit.sh
 // generated by autoexplicit.sh
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long>(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);
 // generated by autoexplicit.sh
 // generated by autoexplicit.sh
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
 // generated by autoexplicit.sh
 // generated by autoexplicit.sh
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
-template void igl::unique_edge_map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
-template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned long>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
+template void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);
 
 
 #ifdef WIN32
 #ifdef WIN32
-template void __cdecl igl::unique_edge_map<class Eigen::Matrix<int, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 2, 0, -1, 2>, class Eigen::Matrix<int, -1, 2, 0, -1, 2>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, __int64>(class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 0, -1, 3> > const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 2, 0, -1, 2> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 2, 0, -1, 2> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> > &, class std::vector<class std::vector<__int64, class std::allocator<__int64> >, class std::allocator<class std::vector<__int64, class std::allocator<__int64> > > > &);
-template void __cdecl igl::unique_edge_map<class Eigen::Matrix<int,-1,-1,0,-1,-1>,class Eigen::Matrix<int,-1,2,0,-1,2>,class Eigen::Matrix<int,-1,2,0,-1,2>,class Eigen::Matrix<__int64,-1,1,0,-1,1>,__int64>(class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<__int64,-1,1,0,-1,1> > &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > &);
+template void __cdecl igl::unique_edge_map<class Eigen::Matrix<int, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 2, 0, -1, 2>, class Eigen::Matrix<int, -1, 2, 0, -1, 2>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, __int64>(class Eigen::MatrixBase<class Eigen::Matrix<int, -1, 3, 0, -1, 3> > const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 2, 0, -1, 2> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 2, 0, -1, 2> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> > &, class std::vector<class std::vector<__int64, class std::allocator<__int64> >, class std::allocator<class std::vector<__int64, class std::allocator<__int64> > > > &);
+template void __cdecl igl::unique_edge_map<class Eigen::Matrix<int,-1,-1,0,-1,-1>,class Eigen::Matrix<int,-1,2,0,-1,2>,class Eigen::Matrix<int,-1,2,0,-1,2>,class Eigen::Matrix<__int64,-1,1,0,-1,1>,__int64>(class Eigen::MatrixBase<class Eigen::Matrix<int,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<__int64,-1,1,0,-1,1> > &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > &);
 #endif
 #endif
 
 
 #endif 
 #endif 

+ 1 - 1
include/igl/unique_edge_map.h

@@ -30,7 +30,7 @@ namespace igl
     typename DerivedEMAP,
     typename DerivedEMAP,
     typename uE2EType>
     typename uE2EType>
   IGL_INLINE void unique_edge_map(
   IGL_INLINE void unique_edge_map(
-    const Eigen::PlainObjectBase<DerivedF> & F,
+    const Eigen::MatrixBase<DerivedF> & F,
     Eigen::PlainObjectBase<DerivedE> & E,
     Eigen::PlainObjectBase<DerivedE> & E,
     Eigen::PlainObjectBase<DeriveduE> & uE,
     Eigen::PlainObjectBase<DeriveduE> & uE,
     Eigen::PlainObjectBase<DerivedEMAP> & EMAP,
     Eigen::PlainObjectBase<DerivedEMAP> & EMAP,

+ 1 - 5
include/igl/unique_rows.cpp

@@ -74,15 +74,11 @@ IGL_INLINE void igl::unique_rows(
 
 
 #ifdef IGL_STATIC_LIBRARY
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // Explicit template instantiation
-// generated by autoexplicit.sh
 template void igl::unique_rows<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::unique_rows<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
-// generated by autoexplicit.sh
 template void igl::unique_rows<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::unique_rows<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
-// generated by autoexplicit.sh
 template void igl::unique_rows<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
 template void igl::unique_rows<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
-// generated by autoexplicit.sh
 template void igl::unique_rows<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
 template void igl::unique_rows<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
-// generated by autoexplicit.sh
+template void igl::unique_rows<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::unique_rows<Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<int,-1,-1,0,-1,-1>,Eigen::Matrix<int,-1,-1,0,-1,-1> >(Eigen::DenseBase<Eigen::Matrix<double,-1,-1,0,-1,-1> > const&,Eigen::PlainObjectBase<Eigen::Matrix<double,-1,-1,0,-1,-1> >&,Eigen::PlainObjectBase<Eigen::Matrix<int,-1,-1,0,-1,-1> >&,Eigen::PlainObjectBase<Eigen::Matrix<int,-1,-1,0,-1,-1> >&);
 template void igl::unique_rows<Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<int,-1,-1,0,-1,-1>,Eigen::Matrix<int,-1,-1,0,-1,-1> >(Eigen::DenseBase<Eigen::Matrix<double,-1,-1,0,-1,-1> > const&,Eigen::PlainObjectBase<Eigen::Matrix<double,-1,-1,0,-1,-1> >&,Eigen::PlainObjectBase<Eigen::Matrix<int,-1,-1,0,-1,-1> >&,Eigen::PlainObjectBase<Eigen::Matrix<int,-1,-1,0,-1,-1> >&);
 template void igl::unique_rows<Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<int,-1,1,0,-1,1>,Eigen::Matrix<int,-1,1,0,-1,1> >(Eigen::DenseBase<Eigen::Matrix<double,-1,-1,0,-1,-1> > const&,Eigen::PlainObjectBase<Eigen::Matrix<double,-1,-1,0,-1,-1> >&,Eigen::PlainObjectBase<Eigen::Matrix<int,-1,1,0,-1,1> >&,Eigen::PlainObjectBase<Eigen::Matrix<int,-1,1,0,-1,1> >&);
 template void igl::unique_rows<Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<int,-1,1,0,-1,1>,Eigen::Matrix<int,-1,1,0,-1,1> >(Eigen::DenseBase<Eigen::Matrix<double,-1,-1,0,-1,-1> > const&,Eigen::PlainObjectBase<Eigen::Matrix<double,-1,-1,0,-1,-1> >&,Eigen::PlainObjectBase<Eigen::Matrix<int,-1,1,0,-1,1> >&,Eigen::PlainObjectBase<Eigen::Matrix<int,-1,1,0,-1,1> >&);
 template void igl::unique_rows<Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<long,-1,1,0,-1,1>,Eigen::Matrix<long,-1,1,0,-1,1> >(Eigen::DenseBase<Eigen::Matrix<double,-1,-1,0,-1,-1> > const&,Eigen::PlainObjectBase<Eigen::Matrix<double,-1,-1,0,-1,-1> >&,Eigen::PlainObjectBase<Eigen::Matrix<long,-1,1,0,-1,1> >&,Eigen::PlainObjectBase<Eigen::Matrix<long,-1,1,0,-1,1> >&);
 template void igl::unique_rows<Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<double,-1,-1,0,-1,-1>,Eigen::Matrix<long,-1,1,0,-1,1>,Eigen::Matrix<long,-1,1,0,-1,1> >(Eigen::DenseBase<Eigen::Matrix<double,-1,-1,0,-1,-1> > const&,Eigen::PlainObjectBase<Eigen::Matrix<double,-1,-1,0,-1,-1> >&,Eigen::PlainObjectBase<Eigen::Matrix<long,-1,1,0,-1,1> >&,Eigen::PlainObjectBase<Eigen::Matrix<long,-1,1,0,-1,1> >&);

+ 40 - 40
include/igl/xml/XMLSerializable.h

@@ -11,7 +11,7 @@
 // Interface for xml-serializable class see serialize_xml.h
 // Interface for xml-serializable class see serialize_xml.h
 
 
 // Pretty sure all of these IGL_INLINE should be inline
 // Pretty sure all of these IGL_INLINE should be inline
- 
+
 namespace igl
 namespace igl
 {
 {
   namespace xml
   namespace xml
@@ -29,83 +29,83 @@ namespace igl
     class XMLSerializable: public XMLSerializableBase
     class XMLSerializable: public XMLSerializableBase
     {
     {
     private:
     private:
-  
+
       template <typename T>
       template <typename T>
       struct XMLSerializationObject: public XMLSerializableBase
       struct XMLSerializationObject: public XMLSerializableBase
       {
       {
         bool Binary;
         bool Binary;
         std::string Name;
         std::string Name;
         T* Object;
         T* Object;
-  
+
         void Serialize(std::vector<char>& buffer) const {
         void Serialize(std::vector<char>& buffer) const {
           serialize(*Object,Name,buffer);
           serialize(*Object,Name,buffer);
         }
         }
-  
+
         void Deserialize(const std::vector<char>& buffer) {
         void Deserialize(const std::vector<char>& buffer) {
           deserialize(*Object,Name,buffer);
           deserialize(*Object,Name,buffer);
         }
         }
-  
+
         void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const {
         void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const {
           serialize_xml(*Object,Name,doc,element,Binary);
           serialize_xml(*Object,Name,doc,element,Binary);
         }
         }
-  
+
         void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) {
         void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) {
           deserialize_xml(*Object,Name,doc,element);
           deserialize_xml(*Object,Name,doc,element);
         }
         }
       };
       };
-  
+
       mutable bool initialized;
       mutable bool initialized;
       mutable std::vector<XMLSerializableBase*> objects;
       mutable std::vector<XMLSerializableBase*> objects;
-  
+
     public:
     public:
-  
+
       // Override this function to add your member variables which should be serialized
       // Override this function to add your member variables which should be serialized
       IGL_INLINE virtual void InitSerialization() = 0;
       IGL_INLINE virtual void InitSerialization() = 0;
-  
+
       // Following functions can be overridden to handle the specific events.
       // Following functions can be overridden to handle the specific events.
       // Return false to prevent the de-/serialization of an object.
       // Return false to prevent the de-/serialization of an object.
       IGL_INLINE virtual bool PreSerialization() const;
       IGL_INLINE virtual bool PreSerialization() const;
       IGL_INLINE virtual void PostSerialization() const;
       IGL_INLINE virtual void PostSerialization() const;
       IGL_INLINE virtual bool PreDeserialization();
       IGL_INLINE virtual bool PreDeserialization();
       IGL_INLINE virtual void PostDeserialization();
       IGL_INLINE virtual void PostDeserialization();
-  
+
       // Default implementation of XMLSerializableBase interface
       // Default implementation of XMLSerializableBase interface
       IGL_INLINE void Serialize(std::vector<char>& buffer) const;
       IGL_INLINE void Serialize(std::vector<char>& buffer) const;
       IGL_INLINE void Deserialize(const std::vector<char>& buffer);
       IGL_INLINE void Deserialize(const std::vector<char>& buffer);
       IGL_INLINE void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const;
       IGL_INLINE void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const;
       IGL_INLINE void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element);
       IGL_INLINE void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element);
-  
+
       // Default constructor, destructor, assignment and copy constructor
       // Default constructor, destructor, assignment and copy constructor
       IGL_INLINE XMLSerializable();
       IGL_INLINE XMLSerializable();
       IGL_INLINE XMLSerializable(const XMLSerializable& obj);
       IGL_INLINE XMLSerializable(const XMLSerializable& obj);
       IGL_INLINE ~XMLSerializable();
       IGL_INLINE ~XMLSerializable();
       IGL_INLINE XMLSerializable& operator=(const XMLSerializable& obj);
       IGL_INLINE XMLSerializable& operator=(const XMLSerializable& obj);
-  
+
       // Use this function to add your variables which should be serialized
       // Use this function to add your variables which should be serialized
       template <typename T>
       template <typename T>
       IGL_INLINE void Add(T& obj,std::string name,bool binary = false);
       IGL_INLINE void Add(T& obj,std::string name,bool binary = false);
     };
     };
- 
+
     // IMPLEMENTATION
     // IMPLEMENTATION
 
 
     IGL_INLINE bool XMLSerializable::PreSerialization() const
     IGL_INLINE bool XMLSerializable::PreSerialization() const
-    { 
+    {
       return true;
       return true;
     }
     }
-    
+
     IGL_INLINE void XMLSerializable::PostSerialization() const
     IGL_INLINE void XMLSerializable::PostSerialization() const
     {
     {
     }
     }
-    
+
     IGL_INLINE bool XMLSerializable::PreDeserialization()
     IGL_INLINE bool XMLSerializable::PreDeserialization()
-    { 
+    {
       return true;
       return true;
     }
     }
-  
-    IGL_INLINE void XMLSerializable::PostDeserialization() 
+
+    IGL_INLINE void XMLSerializable::PostDeserialization()
     {
     {
     }
     }
-  
+
     IGL_INLINE void XMLSerializable::Serialize(std::vector<char>& buffer) const
     IGL_INLINE void XMLSerializable::Serialize(std::vector<char>& buffer) const
     {
     {
       if(this->PreSerialization())
       if(this->PreSerialization())
@@ -116,14 +116,14 @@ namespace igl
           (const_cast<XMLSerializable*>(this))->InitSerialization();
           (const_cast<XMLSerializable*>(this))->InitSerialization();
           initialized = true;
           initialized = true;
         }
         }
-  
+
         for(unsigned int i=0;i<objects.size();i++)
         for(unsigned int i=0;i<objects.size();i++)
           objects[i]->Serialize(buffer);
           objects[i]->Serialize(buffer);
-  
+
         this->PostSerialization();
         this->PostSerialization();
       }
       }
     }
     }
-  
+
     IGL_INLINE void XMLSerializable::Deserialize(const std::vector<char>& buffer)
     IGL_INLINE void XMLSerializable::Deserialize(const std::vector<char>& buffer)
     {
     {
       if(this->PreDeserialization())
       if(this->PreDeserialization())
@@ -134,14 +134,14 @@ namespace igl
           (const_cast<XMLSerializable*>(this))->InitSerialization();
           (const_cast<XMLSerializable*>(this))->InitSerialization();
           initialized = true;
           initialized = true;
         }
         }
-  
+
         for(unsigned int i=0;i<objects.size();i++)
         for(unsigned int i=0;i<objects.size();i++)
           objects[i]->Deserialize(buffer);
           objects[i]->Deserialize(buffer);
-  
+
         this->PostDeserialization();
         this->PostDeserialization();
       }
       }
     }
     }
-  
+
     IGL_INLINE void XMLSerializable::Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const
     IGL_INLINE void XMLSerializable::Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const
     {
     {
       if(this->PreSerialization())
       if(this->PreSerialization())
@@ -152,14 +152,14 @@ namespace igl
           (const_cast<XMLSerializable*>(this))->InitSerialization();
           (const_cast<XMLSerializable*>(this))->InitSerialization();
           initialized = true;
           initialized = true;
         }
         }
-  
+
         for(unsigned int i=0;i<objects.size();i++)
         for(unsigned int i=0;i<objects.size();i++)
           objects[i]->Serialize(doc,element);
           objects[i]->Serialize(doc,element);
-  
+
         this->PostSerialization();
         this->PostSerialization();
       }
       }
     }
     }
-  
+
     IGL_INLINE void XMLSerializable::Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element)
     IGL_INLINE void XMLSerializable::Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element)
     {
     {
       if(this->PreDeserialization())
       if(this->PreDeserialization())
@@ -170,32 +170,32 @@ namespace igl
           (const_cast<XMLSerializable*>(this))->InitSerialization();
           (const_cast<XMLSerializable*>(this))->InitSerialization();
           initialized = true;
           initialized = true;
         }
         }
-  
+
         for(unsigned int i=0;i<objects.size();i++)
         for(unsigned int i=0;i<objects.size();i++)
           objects[i]->Deserialize(doc,element);
           objects[i]->Deserialize(doc,element);
-  
+
         this->PostDeserialization();
         this->PostDeserialization();
       }
       }
     }
     }
-  
+
     IGL_INLINE XMLSerializable::XMLSerializable()
     IGL_INLINE XMLSerializable::XMLSerializable()
     {
     {
       initialized = false;
       initialized = false;
     }
     }
-  
+
     IGL_INLINE XMLSerializable::XMLSerializable(const XMLSerializable& obj)
     IGL_INLINE XMLSerializable::XMLSerializable(const XMLSerializable& obj)
     {
     {
       initialized = false;
       initialized = false;
       objects.clear();
       objects.clear();
     }
     }
-  
+
     IGL_INLINE XMLSerializable::~XMLSerializable()
     IGL_INLINE XMLSerializable::~XMLSerializable()
     {
     {
       initialized = false;
       initialized = false;
       objects.clear();
       objects.clear();
     }
     }
-  
-  
+
+
     IGL_INLINE XMLSerializable& XMLSerializable::operator=(const XMLSerializable& obj)
     IGL_INLINE XMLSerializable& XMLSerializable::operator=(const XMLSerializable& obj)
     {
     {
       if(this != &obj)
       if(this != &obj)
@@ -208,7 +208,7 @@ namespace igl
       }
       }
       return *this;
       return *this;
     }
     }
-  
+
     template <typename T>
     template <typename T>
     IGL_INLINE void XMLSerializable::Add(T& obj,std::string name,bool binary)
     IGL_INLINE void XMLSerializable::Add(T& obj,std::string name,bool binary)
     {
     {
@@ -216,10 +216,10 @@ namespace igl
       object->Binary = binary;
       object->Binary = binary;
       object->Name = name;
       object->Name = name;
       object->Object = &obj;
       object->Object = &obj;
-  
+
       objects.push_back(object);
       objects.push_back(object);
     }
     }
-    
+
   }
   }
 }
 }
 #endif
 #endif

+ 18 - 18
include/igl/xml/serialize_xml.h

@@ -58,7 +58,7 @@ namespace igl
     IGL_INLINE void serialize_xml(
     IGL_INLINE void serialize_xml(
       const T& obj,
       const T& obj,
       const std::string& objectName,
       const std::string& objectName,
-      const std::string& filename, 
+      const std::string& filename,
       bool binary = false,
       bool binary = false,
       bool overwrite = false);
       bool overwrite = false);
     template <typename T>
     template <typename T>
@@ -68,7 +68,7 @@ namespace igl
       tinyxml2::XMLDocument* doc,
       tinyxml2::XMLDocument* doc,
       tinyxml2::XMLElement* element,
       tinyxml2::XMLElement* element,
       bool binary = false);
       bool binary = false);
-  
+
     // deserializes the given data from a xml file or doc data back to the provided object
     // deserializes the given data from a xml file or doc data back to the provided object
     //
     //
     // Templates:
     // Templates:
@@ -90,7 +90,7 @@ namespace igl
     IGL_INLINE void deserialize_xml(T& obj,const std::string& objectName,const std::string& filename);
     IGL_INLINE void deserialize_xml(T& obj,const std::string& objectName,const std::string& filename);
     template <typename T>
     template <typename T>
     IGL_INLINE void deserialize_xml(T& obj,const std::string& objectName,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element);
     IGL_INLINE void deserialize_xml(T& obj,const std::string& objectName,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element);
-  
+
     // internal functions
     // internal functions
     namespace serialization_xml
     namespace serialization_xml
     {
     {
@@ -99,38 +99,38 @@ namespace igl
       IGL_INLINE typename std::enable_if<std::is_fundamental<T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE typename std::enable_if<std::is_fundamental<T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       template <typename T>
       template <typename T>
       IGL_INLINE typename std::enable_if<std::is_fundamental<T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE typename std::enable_if<std::is_fundamental<T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       // std::string
       // std::string
       IGL_INLINE void serialize(const std::string& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void serialize(const std::string& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void deserialize(std::string& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void deserialize(std::string& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       // XMLSerializableBase
       // XMLSerializableBase
       template <typename T>
       template <typename T>
       IGL_INLINE typename std::enable_if<std::is_base_of<XMLSerializableBase,T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE typename std::enable_if<std::is_base_of<XMLSerializableBase,T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       template <typename T>
       template <typename T>
       IGL_INLINE typename std::enable_if<std::is_base_of<XMLSerializableBase,T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE typename std::enable_if<std::is_base_of<XMLSerializableBase,T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       // STL containers
       // STL containers
       template <typename T1, typename T2>
       template <typename T1, typename T2>
       IGL_INLINE void serialize(const std::pair<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void serialize(const std::pair<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       template <typename T1,typename T2>
       template <typename T1,typename T2>
       IGL_INLINE void deserialize(std::pair<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void deserialize(std::pair<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       template <typename T1,typename T2>
       template <typename T1,typename T2>
       IGL_INLINE void serialize(const std::vector<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void serialize(const std::vector<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       template <typename T1,typename T2>
       template <typename T1,typename T2>
       IGL_INLINE void deserialize(std::vector<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void deserialize(std::vector<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       template <typename T>
       template <typename T>
       IGL_INLINE void serialize(const std::set<T>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void serialize(const std::set<T>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       template <typename T>
       template <typename T>
       IGL_INLINE void deserialize(std::set<T>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void deserialize(std::set<T>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       template <typename T1,typename T2>
       template <typename T1,typename T2>
       IGL_INLINE void serialize(const std::map<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void serialize(const std::map<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       template <typename T1,typename T2>
       template <typename T1,typename T2>
       IGL_INLINE void deserialize(std::map<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void deserialize(std::map<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       // Eigen types
       // Eigen types
 
 
       // Serialize a Dense Eigen Matrix to xml (in the matrix= attribute,
       // Serialize a Dense Eigen Matrix to xml (in the matrix= attribute,
@@ -143,7 +143,7 @@ namespace igl
       // Outputs:
       // Outputs:
       //   doc  pointer to xml document
       //   doc  pointer to xml document
       //   element  pointer to xml element
       //   element  pointer to xml element
-      //   
+      //
       template<typename T,int R,int C,int P,int MR,int MC>
       template<typename T,int R,int C,int P,int MR,int MC>
       IGL_INLINE void serialize(
       IGL_INLINE void serialize(
         const Eigen::Matrix<T,R,C,P,MR,MC>& obj,
         const Eigen::Matrix<T,R,C,P,MR,MC>& obj,
@@ -168,7 +168,7 @@ namespace igl
         const std::string& name,
         const std::string& name,
         const std::function<void(const std::string &,T &)> & from_string,
         const std::function<void(const std::string &,T &)> & from_string,
         Eigen::Matrix<T,R,C,P,MR,MC>& obj);
         Eigen::Matrix<T,R,C,P,MR,MC>& obj);
-  
+
       // Legacy APIs
       // Legacy APIs
       template<typename T,int R,int C,int P,int MR,int MC>
       template<typename T,int R,int C,int P,int MR,int MC>
       IGL_INLINE void serialize(
       IGL_INLINE void serialize(
@@ -182,18 +182,18 @@ namespace igl
         const tinyxml2::XMLDocument* doc,
         const tinyxml2::XMLDocument* doc,
         const tinyxml2::XMLElement* element,
         const tinyxml2::XMLElement* element,
         const std::string& name);
         const std::string& name);
-  
+
       template<typename T,int P,typename I>
       template<typename T,int P,typename I>
       IGL_INLINE void serialize(const Eigen::SparseMatrix<T,P,I>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void serialize(const Eigen::SparseMatrix<T,P,I>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       template<typename T,int P,typename I>
       template<typename T,int P,typename I>
       IGL_INLINE void deserialize(Eigen::SparseMatrix<T,P,I>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void deserialize(Eigen::SparseMatrix<T,P,I>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       // raw pointers
       // raw pointers
       template <typename T>
       template <typename T>
       IGL_INLINE typename std::enable_if<std::is_pointer<T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE typename std::enable_if<std::is_pointer<T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       template <typename T>
       template <typename T>
       IGL_INLINE typename std::enable_if<std::is_pointer<T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE typename std::enable_if<std::is_pointer<T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);
-  
+
       // helper functions
       // helper functions
       tinyxml2::XMLElement* getElement(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       tinyxml2::XMLElement* getElement(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);
       IGL_INLINE void getAttribute(const char* src,bool& dest);
       IGL_INLINE void getAttribute(const char* src,bool& dest);
@@ -210,7 +210,7 @@ namespace igl
       IGL_INLINE void decodeXMLElementName(std::string& name);
       IGL_INLINE void decodeXMLElementName(std::string& name);
       IGL_INLINE std::string base64_encode(unsigned char const* bytes_to_encode,unsigned int in_len);
       IGL_INLINE std::string base64_encode(unsigned char const* bytes_to_encode,unsigned int in_len);
       IGL_INLINE std::string base64_decode(std::string const& encoded_string);
       IGL_INLINE std::string base64_decode(std::string const& encoded_string);
-  
+
       // compile time type serializable check
       // compile time type serializable check
       template <typename T>
       template <typename T>
       struct is_stl_container { static const bool value = false; };
       struct is_stl_container { static const bool value = false; };
@@ -222,14 +222,14 @@ namespace igl
       struct is_stl_container<std::set<T> > { static const bool value = true; };
       struct is_stl_container<std::set<T> > { static const bool value = true; };
       template <typename T1,typename T2>
       template <typename T1,typename T2>
       struct is_stl_container<std::map<T1,T2> > { static const bool value = true; };
       struct is_stl_container<std::map<T1,T2> > { static const bool value = true; };
-  
+
       template <typename T>
       template <typename T>
       struct is_eigen_type { static const bool value = false; };
       struct is_eigen_type { static const bool value = false; };
       template <typename T,int R,int C,int P,int MR,int MC>
       template <typename T,int R,int C,int P,int MR,int MC>
       struct is_eigen_type<Eigen::Matrix<T,R,C,P,MR,MC> > { static const bool value = true; };
       struct is_eigen_type<Eigen::Matrix<T,R,C,P,MR,MC> > { static const bool value = true; };
       template <typename T,int P,typename I>
       template <typename T,int P,typename I>
       struct is_eigen_type<Eigen::SparseMatrix<T,P,I> > { static const bool value = true; };
       struct is_eigen_type<Eigen::SparseMatrix<T,P,I> > { static const bool value = true; };
-  
+
       template <typename T>
       template <typename T>
       struct is_serializable {
       struct is_serializable {
         using T0 = typename  std::remove_pointer<T>::type;
         using T0 = typename  std::remove_pointer<T>::type;

+ 3 - 3
include/igl/xml/writeDAE.cpp

@@ -25,12 +25,12 @@ IGL_INLINE bool igl::xml::writeDAE(
 
 
   const auto & ele = [&doc](
   const auto & ele = [&doc](
     const std::string tag,
     const std::string tag,
-    // Can't just use `{}` as the default arguement because of a clang-bug 
+    // Can't just use `{}` as the default arguement because of a clang-bug
     // http://stackoverflow.com/questions/17264067/
     // http://stackoverflow.com/questions/17264067/
-    const std::map<std::string,std::string> attribs = 
+    const std::map<std::string,std::string> attribs =
       std::map<std::string,std::string>(),
       std::map<std::string,std::string>(),
     const std::string text="",
     const std::string text="",
-    const std::list<XMLElement *> children = 
+    const std::list<XMLElement *> children =
        std::list<XMLElement *>()
        std::list<XMLElement *>()
     )->XMLElement *
     )->XMLElement *
   {
   {

+ 72 - 101
python/CMakeLists.txt

@@ -1,55 +1,29 @@
 cmake_minimum_required(VERSION 2.8.12)
 cmake_minimum_required(VERSION 2.8.12)
-project(pybind)
-
-### Compilation flags: adapt to your needs ###
-if(MSVC)
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /bigobj /w") ### Enable parallel compilation
-  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR} )
-  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR} )
-else()
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") #### Libigl requires a modern C++ compiler that supports c++11
-  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../" )
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations -Wno-unused-parameter -Wno-deprecated-register -Wno-return-type-c-linkage")
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations -Wno-unused-parameter -Wno-deprecated-register -Wno-return-type-c-linkage")
-endif()
+project(pyigl)
 
 
 # Force a specific python version
 # Force a specific python version
-# SET(PYTHON_LIBRARIES "D:/Python34/libs/python34.lib")
-# SET(PYTHON_INCLUDE_DIR "D:/Python34/include")
+# set(PYTHON_LIBRARIES "D:/Python34/libs/python34.lib")
+# set(PYTHON_INCLUDE_DIR "D:/Python34/include")
 
 
 # Force a specific python version
 # Force a specific python version
-# SET(PYTHON_LIBRARIES "/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/lib/libpython3.5m.dylib")
-# SET(PYTHON_INCLUDE_DIR "/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/include/python3.5m")
+# set(PYTHON_LIBRARIES "/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/lib/libpython3.5m.dylib")
+# set(PYTHON_INCLUDE_DIR "/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/include/python3.5m")
 
 
 set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6)
 set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6)
 find_package(PythonLibs REQUIRED)
 find_package(PythonLibs REQUIRED)
 find_package(PythonInterp REQUIRED)
 find_package(PythonInterp REQUIRED)
 
 
 string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
 string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
-if (UNIX)
+if(UNIX)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
-  if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
+  if(NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -flto")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -flto")
   endif()
   endif()
 endif()
 endif()
 
 
-# Compile with compiler warnings turned on
-# if(MSVC)
-#   if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
-#     string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-#   else()
-#     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
-#   endif()
-# else()
-#   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
-# endif()
-
-include_directories(${PYTHON_INCLUDE_DIR} include)
-
 ## include pybind
 ## include pybind
-set(PYBIND11_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/../external/nanogui/ext/pybind11/include CACHE PATH "Path to pybind11/include")
-include_directories(${PYBIND11_INCLUDE_DIR})
+add_subdirectory(${PROJECT_SOURCE_DIR}/../external/nanogui/ext/pybind11 pybind11)
 
 
 ## include libigl
 ## include libigl
 option(LIBIGL_USE_STATIC_LIBRARY "Use LibIGL as static library" OFF)
 option(LIBIGL_USE_STATIC_LIBRARY "Use LibIGL as static library" OFF)
@@ -71,83 +45,80 @@ option(LIBIGL_WITH_XML              "Use XML"            ON)
 option(LIBIGL_WITH_PYTHON           "Use Python"         ON)
 option(LIBIGL_WITH_PYTHON           "Use Python"         ON)
 option(LIBIGL_WITH_COPYLEFT         "Use Copyleft"       ON)
 option(LIBIGL_WITH_COPYLEFT         "Use Copyleft"       ON)
 
 
-
-if(LIBIGL_WITH_CGAL) # Do not remove or move this block, cgal strange build system fails without it
-  find_package(CGAL REQUIRED)
-  set(CGAL_DONT_OVERRIDE_CMAKE_FLAGS TRUE CACHE BOOL "CGAL's CMAKE Setup is super annoying ")
-  include(${CGAL_USE_FILE})
+## libigl
+if(NOT TARGET igl::core)
+  list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/../shared/cmake")
+  include(libigl)
 endif()
 endif()
 
 
-add_subdirectory("${PROJECT_SOURCE_DIR}/../shared/cmake" "libigl")
-
-
-### Prepare the build environment
-
-include_directories(${LIBIGL_INCLUDE_DIRS})
-add_definitions(${LIBIGL_DEFINITIONS})
-
-## Optional modules
-if (LIBIGL_WITH_VIEWER)
-  add_definitions(-DPY_VIEWER)
-  list(APPEND SHARED_SOURCES "modules/py_igl_viewer.cpp")
-endif ()
-
-if (LIBIGL_WITH_COMISO)
-  add_definitions(-DPY_COMISO)
-  list(APPEND SHARED_SOURCES "modules/copyleft/py_igl_comiso.cpp")
-endif ()
-
-if (LIBIGL_WITH_TETGEN)
-  add_definitions(-DPY_TETGEN)
-  list(APPEND SHARED_SOURCES "modules/copyleft/py_igl_tetgen.cpp")
-endif ()
-
-if (LIBIGL_WITH_EMBREE)
-  add_definitions(-DPY_EMBREE)
-  list(APPEND SHARED_SOURCES "modules/py_igl_embree.cpp")
-endif ()
-
-if (LIBIGL_WITH_TRIANGLE)
-  add_definitions(-DPY_TRIANGLE)
-  list(APPEND SHARED_SOURCES "modules/py_igl_triangle.cpp")
-endif ()
-
-if (LIBIGL_WITH_CGAL)
-  add_definitions(-DPY_CGAL)
-  list(APPEND SHARED_SOURCES "modules/copyleft/py_igl_cgal.cpp")
-endif ()
-
-if (LIBIGL_WITH_COPYLEFT)
-  add_definitions(-DPY_COPYLEFT)
-  list(APPEND SHARED_SOURCES "modules/copyleft/py_igl_copyleft.cpp")
-endif ()
-
-if (LIBIGL_WITH_PNG)
-  add_definitions(-DPY_PNG)
-  list(APPEND SHARED_SOURCES "modules/py_igl_png.cpp")
-endif ()
-
-#----
 ## Prepare the python library
 ## Prepare the python library
-add_library(pyigl SHARED
+pybind11_add_module(pyigl
   python_shared.cpp
   python_shared.cpp
   modules/py_vector.cpp
   modules/py_vector.cpp
   py_igl.cpp
   py_igl.cpp
   py_doc.cpp
   py_doc.cpp
-  ${SHARED_SOURCES}
 )
 )
 
 
+## Add dependencies
+target_include_directories(pyigl PUBLIC igl::core)
+
+## Optional modules
+if(LIBIGL_WITH_VIEWER)
+  target_sources(pyigl PRIVATE "modules/py_igl_viewer.cpp")
+  target_compile_definitions(pyigl PUBLIC -DPY_VIEWER)
+  target_link_libraries(pyigl PUBLIC igl::viewer)
+endif()
+
+if(LIBIGL_WITH_COMISO)
+  target_sources(pyigl PRIVATE "modules/copyleft/py_igl_comiso.cpp")
+  target_compile_definitions(pyigl PUBLIC -DPY_COMISO)
+  target_link_libraries(pyigl PUBLIC igl::comiso)
+endif()
+
+if(LIBIGL_WITH_TETGEN)
+  target_sources(pyigl PRIVATE "modules/copyleft/py_igl_tetgen.cpp")
+  target_compile_definitions(pyigl PUBLIC -DPY_TETGEN)
+  target_link_libraries(pyigl PUBLIC igl::tetgen)
+endif()
+
+if(LIBIGL_WITH_EMBREE)
+  target_sources(pyigl PRIVATE "modules/py_igl_embree.cpp")
+  target_compile_definitions(pyigl PUBLIC -DPY_EMBREE)
+  target_link_libraries(pyigl PUBLIC igl::embree)
+endif()
+
+if(LIBIGL_WITH_TRIANGLE)
+  target_sources(pyigl PRIVATE "modules/py_igl_triangle.cpp")
+  target_compile_definitions(pyigl PUBLIC -DPY_TRIANGLE)
+  target_link_libraries(pyigl PUBLIC igl::triangle)
+endif()
+
+if(LIBIGL_WITH_CGAL)
+  target_sources(pyigl PRIVATE "modules/copyleft/py_igl_cgal.cpp")
+  target_compile_definitions(pyigl PUBLIC -DPY_CGAL)
+  target_link_libraries(pyigl PUBLIC igl::cgal)
+endif()
+
+if(LIBIGL_WITH_COPYLEFT)
+  target_sources(pyigl PRIVATE "modules/copyleft/py_igl_copyleft.cpp")
+  target_compile_definitions(pyigl PUBLIC -DPY_COPYLEFT)
+endif()
+
+if(LIBIGL_WITH_PNG)
+  target_sources(pyigl PRIVATE "modules/py_igl_png.cpp")
+  target_compile_definitions(pyigl PUBLIC -DPY_PNG)
+  target_link_libraries(pyigl PUBLIC igl::png)
+endif()
+
 set_target_properties(pyigl PROPERTIES PREFIX "")
 set_target_properties(pyigl PROPERTIES PREFIX "")
 set_target_properties(pyigl PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})
 set_target_properties(pyigl PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})
 
 
-target_link_libraries(pyigl ${LIBIGL_LIBRARIES} ${LIBIGL_EXTRA_LIBRARIES})
-
 # Copy the nanogui bindings
 # Copy the nanogui bindings
 #get_target_property(NANOGUI_LIB nanogui_python LOCATION)
 #get_target_property(NANOGUI_LIB nanogui_python LOCATION)
 #file(COPY ${NANOGUI_LIB} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/../)
 #file(COPY ${NANOGUI_LIB} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/../)
 
 
-if (WIN32)
-  if (MSVC)
+if(WIN32)
+  if(MSVC)
     # Enforce size-based optimization and link time code generation on MSVC (~30% smaller binaries in experiments)
     # Enforce size-based optimization and link time code generation on MSVC (~30% smaller binaries in experiments)
     set_target_properties(pyigl PROPERTIES COMPILE_FLAGS "/Os /GL")
     set_target_properties(pyigl PROPERTIES COMPILE_FLAGS "/Os /GL")
     set_target_properties(pyigl PROPERTIES LINK_FLAGS "/LTCG")
     set_target_properties(pyigl PROPERTIES LINK_FLAGS "/LTCG")
@@ -161,7 +132,7 @@ if (WIN32)
   # target_link_libraries(igl ${PYTHON_LIBRARY})
   # target_link_libraries(igl ${PYTHON_LIBRARY})
   target_link_libraries(pyigl ${PYTHON_LIBRARIES})
   target_link_libraries(pyigl ${PYTHON_LIBRARIES})
 
 
-elseif (UNIX)
+elseif(UNIX)
   # It's quite common to have multiple copies of the same Python version
   # It's quite common to have multiple copies of the same Python version
   # installed on one's system. E.g.: one copy from the OS and another copy
   # installed on one's system. E.g.: one copy from the OS and another copy
   # that's statically linked into an application like Blender or Maya.
   # that's statically linked into an application like Blender or Maya.
@@ -184,27 +155,27 @@ elseif (UNIX)
   if(APPLE)
   if(APPLE)
     set_target_properties(pyigl PROPERTIES MACOSX_RPATH ".")
     set_target_properties(pyigl PROPERTIES MACOSX_RPATH ".")
 
 
-    if (NOT CHECK_UNDEFINED)
+    if(NOT CHECK_UNDEFINED)
       set_target_properties(pyigl PROPERTIES LINK_FLAGS "-undefined dynamic_lookup -dead_strip")
       set_target_properties(pyigl PROPERTIES LINK_FLAGS "-undefined dynamic_lookup -dead_strip")
     endif()
     endif()
 
 
-    if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
+    if(NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
       add_custom_command(TARGET pyigl POST_BUILD COMMAND strip -u -r ${PROJECT_SOURCE_DIR}/pyigl.so)
       add_custom_command(TARGET pyigl POST_BUILD COMMAND strip -u -r ${PROJECT_SOURCE_DIR}/pyigl.so)
     endif()
     endif()
   else()
   else()
 
 
-    if (CHECK_UNDEFINED)
+    if(CHECK_UNDEFINED)
       target_link_libraries(pyigl ${PYTHON_LIBRARIES})
       target_link_libraries(pyigl ${PYTHON_LIBRARIES})
       set_target_properties(pyigl PROPERTIES LINK_FLAGS "-Wl,--no-undefined")
       set_target_properties(pyigl PROPERTIES LINK_FLAGS "-Wl,--no-undefined")
     endif()
     endif()
 
 
-    if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
+    if(NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
       add_custom_command(TARGET pyigl POST_BUILD COMMAND strip ${PROJECT_SOURCE_DIR}/pyigl.so)
       add_custom_command(TARGET pyigl POST_BUILD COMMAND strip ${PROJECT_SOURCE_DIR}/pyigl.so)
     endif()
     endif()
   endif()
   endif()
 endif()
 endif()
 
 
-if (LIBIGL_WITH_PYTHON AND LIBIGL_WITH_NANOGUI)
+if(LIBIGL_WITH_PYTHON AND LIBIGL_WITH_NANOGUI)
   # Copy the nanogui python lib after compilation
   # Copy the nanogui python lib after compilation
   get_target_property(NANOGUI_LIB nanogui-python LOCATION)
   get_target_property(NANOGUI_LIB nanogui-python LOCATION)
   add_custom_target(copy ALL)
   add_custom_target(copy ALL)

+ 7 - 0
python/iglhelpers.py

@@ -1,3 +1,10 @@
+# This file is part of libigl, a simple c++ geometry processing library.
+#
+# Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+#
+# This Source Code Form is subject to the terms of the Mozilla Public License
+# v. 2.0. If a copy of the MPL was not distributed with this file, You can
+# obtain one at http://mozilla.org/MPL/2.0/.
 import numpy as np
 import numpy as np
 import scipy.sparse as sparse
 import scipy.sparse as sparse
 import pyigl as igl
 import pyigl as igl

+ 7 - 0
python/modules/copyleft/py_igl_cgal.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 //#include <Eigen/Geometry>
 //#include <Eigen/Geometry>
 //#include <Eigen/Dense>
 //#include <Eigen/Dense>
 //#include <Eigen/Sparse>
 //#include <Eigen/Sparse>

+ 7 - 0
python/modules/copyleft/py_igl_comiso.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 #include <Eigen/Geometry>
 #include <Eigen/Geometry>
 #include <Eigen/Dense>
 #include <Eigen/Dense>
 #include <Eigen/Sparse>
 #include <Eigen/Sparse>

+ 7 - 0
python/modules/copyleft/py_igl_copyleft.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 //#include <Eigen/Geometry>
 //#include <Eigen/Geometry>
 //#include <Eigen/Dense>
 //#include <Eigen/Dense>
 //#include <Eigen/Sparse>
 //#include <Eigen/Sparse>

+ 7 - 0
python/modules/copyleft/py_igl_tetgen.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 //#include <Eigen/Geometry>
 //#include <Eigen/Geometry>
 //#include <Eigen/Dense>
 //#include <Eigen/Dense>
 //#include <Eigen/Sparse>
 //#include <Eigen/Sparse>

+ 7 - 0
python/modules/py_igl_embree.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 //#include <Eigen/Geometry>
 //#include <Eigen/Geometry>
 //#include <Eigen/Dense>
 //#include <Eigen/Dense>
 //#include <Eigen/Sparse>
 //#include <Eigen/Sparse>

+ 7 - 0
python/modules/py_igl_png.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 #include "../python_shared.h"
 #include "../python_shared.h"
 
 

+ 7 - 0
python/modules/py_igl_triangle.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 //#include <Eigen/Geometry>
 //#include <Eigen/Geometry>
 //#include <Eigen/Dense>
 //#include <Eigen/Dense>
 //#include <Eigen/Sparse>
 //#include <Eigen/Sparse>

+ 7 - 0
python/modules/py_igl_viewer.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 #include <Eigen/Dense>
 #include <Eigen/Dense>
 #include <Eigen/Sparse>
 #include <Eigen/Sparse>
 
 

+ 7 - 0
python/modules/py_typedefs.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 py::class_<RotationList>(m, "RotationList")
 py::class_<RotationList>(m, "RotationList")
     .def(py::init<>())
     .def(py::init<>())
     .def(py::init<size_t>())
     .def(py::init<size_t>())

+ 7 - 0
python/modules/py_typedefs.h

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 #include <pybind11/pybind11.h>
 #include <pybind11/pybind11.h>
 #include <pybind11/stl_bind.h>
 #include <pybind11/stl_bind.h>
 
 

+ 7 - 0
python/modules/py_vector.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 #include <Eigen/Geometry>
 #include <Eigen/Geometry>
 #include <Eigen/Dense>
 #include <Eigen/Dense>
 #include <Eigen/Sparse>
 #include <Eigen/Sparse>

+ 7 - 0
python/py_doc.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 const char *__doc_igl_active_set = R"igl_Qu8mg5v7(// Known Bugs: rows of [Aeq;Aieq] **must** be linearly independent. Should be
 const char *__doc_igl_active_set = R"igl_Qu8mg5v7(// Known Bugs: rows of [Aeq;Aieq] **must** be linearly independent. Should be
   // using QR decomposition otherwise:
   // using QR decomposition otherwise:
   //   http://www.okstate.edu/sas/v8/sashtml/ormp/chap5/sect32.htm
   //   http://www.okstate.edu/sas/v8/sashtml/ormp/chap5/sect32.htm

+ 7 - 0
python/py_doc.h

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 extern const char *__doc_igl_active_set;
 extern const char *__doc_igl_active_set;
 extern const char *__doc_igl_adjacency_list;
 extern const char *__doc_igl_adjacency_list;
 extern const char *__doc_igl_arap_precomputation;
 extern const char *__doc_igl_arap_precomputation;

+ 7 - 0
python/py_igl.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 #include <Eigen/Dense>
 #include <Eigen/Dense>
 
 
 #include "python_shared.h"
 #include "python_shared.h"

+ 7 - 0
python/py_igl/copyleft/cgal/py_RemeshSelfIntersectionsParam.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 py::class_<igl::copyleft::cgal::RemeshSelfIntersectionsParam > RemeshSelfIntersectionsParam(m, "RemeshSelfIntersectionsParam");
 py::class_<igl::copyleft::cgal::RemeshSelfIntersectionsParam > RemeshSelfIntersectionsParam(m, "RemeshSelfIntersectionsParam");
 
 
 RemeshSelfIntersectionsParam
 RemeshSelfIntersectionsParam

+ 7 - 0
python/py_igl/copyleft/cgal/py_mesh_boolean.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 // COMPLETE BINDINGS ========================
 // COMPLETE BINDINGS ========================
 
 
 m.def("mesh_boolean", []
 m.def("mesh_boolean", []

+ 7 - 0
python/py_igl/copyleft/cgal/py_remesh_self_intersections.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("remesh_self_intersections", []
 m.def("remesh_self_intersections", []
 (
 (
 	const Eigen::MatrixXd& V,	
 	const Eigen::MatrixXd& V,	

+ 7 - 0
python/py_igl/copyleft/comiso/py_miq.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("miq", []
 m.def("miq", []
 (
 (
   const Eigen::MatrixXd &V,
   const Eigen::MatrixXd &V,

+ 7 - 0
python/py_igl/copyleft/comiso/py_nrosy.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("nrosy", []
 m.def("nrosy", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/copyleft/py_marching_cubes.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("marching_cubes", []
 m.def("marching_cubes", []

+ 7 - 0
python/py_igl/copyleft/py_swept_volume.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 m.def("swept_volume", []
 m.def("swept_volume", []
 (
 (

+ 7 - 0
python/py_igl/copyleft/tetgen/py_tetrahedralize.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 m.def("tetrahedralize", []
 m.def("tetrahedralize", []
 (
 (

+ 7 - 0
python/py_igl/embree/py_ambient_occlusion.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("ambient_occlusion", []
 m.def("ambient_occlusion", []

+ 7 - 0
python/py_igl/embree/py_line_mesh_intersection.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("line_mesh_intersection", []
 m.def("line_mesh_intersection", []

+ 7 - 0
python/py_igl/embree/py_reorient_facets_raycast.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("reorient_facets_raycast", []
 m.def("reorient_facets_raycast", []

+ 7 - 0
python/py_igl/png/py_readPNG.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 m.def("readPNG", []
 m.def("readPNG", []
 (
 (

+ 7 - 0
python/py_igl/png/py_writePNG.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("writePNG", []
 m.def("writePNG", []

+ 7 - 0
python/py_igl/py_AABB.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 py::class_<igl::AABB<Eigen::MatrixXd,3> > AABB(m, "AABB");
 py::class_<igl::AABB<Eigen::MatrixXd,3> > AABB(m, "AABB");
 
 
 AABB
 AABB

+ 7 - 0
python/py_igl/py_ARAPEnergyType.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 py::enum_<igl::ARAPEnergyType>(m, "ARAPEnergyType")
 py::enum_<igl::ARAPEnergyType>(m, "ARAPEnergyType")
     .value("ARAP_ENERGY_TYPE_SPOKES", igl::ARAP_ENERGY_TYPE_SPOKES)
     .value("ARAP_ENERGY_TYPE_SPOKES", igl::ARAP_ENERGY_TYPE_SPOKES)
     .value("ARAP_ENERGY_TYPE_SPOKES_AND_RIMS", igl::ARAP_ENERGY_TYPE_SPOKES_AND_RIMS)
     .value("ARAP_ENERGY_TYPE_SPOKES_AND_RIMS", igl::ARAP_ENERGY_TYPE_SPOKES_AND_RIMS)

+ 7 - 0
python/py_igl/py_MeshBooleanType.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 py::enum_<igl::MeshBooleanType>(m, "MeshBooleanType")
 py::enum_<igl::MeshBooleanType>(m, "MeshBooleanType")
     .value("MESH_BOOLEAN_TYPE_UNION", igl::MESH_BOOLEAN_TYPE_UNION)
     .value("MESH_BOOLEAN_TYPE_UNION", igl::MESH_BOOLEAN_TYPE_UNION)
     .value("MESH_BOOLEAN_TYPE_INTERSECT", igl::MESH_BOOLEAN_TYPE_INTERSECT)
     .value("MESH_BOOLEAN_TYPE_INTERSECT", igl::MESH_BOOLEAN_TYPE_INTERSECT)

+ 7 - 0
python/py_igl/py_SolverStatus.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 py::enum_<igl::SolverStatus>(m, "SolverStatus")
 py::enum_<igl::SolverStatus>(m, "SolverStatus")
     .value("SOLVER_STATUS_CONVERGED", igl::SOLVER_STATUS_CONVERGED)
     .value("SOLVER_STATUS_CONVERGED", igl::SOLVER_STATUS_CONVERGED)
     .value("SOLVER_STATUS_MAX_ITER", igl::SOLVER_STATUS_MAX_ITER)
     .value("SOLVER_STATUS_MAX_ITER", igl::SOLVER_STATUS_MAX_ITER)

+ 7 - 0
python/py_igl/py_active_set.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 // Wrap the params struct
 // Wrap the params struct
 py::class_<igl::active_set_params > active_set_params(m, "active_set_params");
 py::class_<igl::active_set_params > active_set_params(m, "active_set_params");
 
 

+ 7 - 0
python/py_igl/py_adjacency_list.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("adjacency_list", [](const Eigen::MatrixXi& F, std::vector<std::vector<int>>& A, bool sorted) {
 m.def("adjacency_list", [](const Eigen::MatrixXi& F, std::vector<std::vector<int>>& A, bool sorted) {
     igl::adjacency_list(F, A, sorted);
     igl::adjacency_list(F, A, sorted);
 }, py::arg("F"), py::arg("A"), py::arg("sorted")=false);
 }, py::arg("F"), py::arg("A"), py::arg("sorted")=false);

+ 7 - 0
python/py_igl/py_arap.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 py::class_<igl::ARAPData> ARAPData(m, "ARAPData");
 py::class_<igl::ARAPData> ARAPData(m, "ARAPData");
 
 
 ARAPData
 ARAPData

+ 7 - 0
python/py_igl/py_avg_edge_length.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("avg_edge_length", []
 m.def("avg_edge_length", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/py_barycenter.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("barycenter", []
 m.def("barycenter", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/py_barycentric_coordinates.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("barycentric_coordinates", []
 m.def("barycentric_coordinates", []

+ 7 - 0
python/py_igl/py_barycentric_to_global.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("barycentric_to_global", []
 m.def("barycentric_to_global", []

+ 7 - 0
python/py_igl/py_bbw.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 // Wrap the BBWData class
 // Wrap the BBWData class
 py::class_<igl::BBWData > BBWData(m, "BBWData");
 py::class_<igl::BBWData > BBWData(m, "BBWData");
 
 

+ 7 - 0
python/py_igl/py_boundary_conditions.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("boundary_conditions", []
 m.def("boundary_conditions", []

+ 7 - 0
python/py_igl/py_boundary_facets.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("boundary_facets", []
 m.def("boundary_facets", []
 (
 (
   const Eigen::MatrixXi& T,
   const Eigen::MatrixXi& T,

+ 7 - 0
python/py_igl/py_boundary_loop.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("boundary_loop", []
 m.def("boundary_loop", []
 (
 (
   const Eigen::MatrixXi& F,
   const Eigen::MatrixXi& F,

+ 7 - 0
python/py_igl/py_cat.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("cat", []
 m.def("cat", []
 (
 (
   const int dim,
   const int dim,

+ 7 - 0
python/py_igl/py_collapse_edge.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 // COMPLETE BINDINGS ========================
 // COMPLETE BINDINGS ========================
 
 
 
 

+ 7 - 0
python/py_igl/py_colon.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("colon", []
 m.def("colon", []
 (
 (
   const double low,
   const double low,

+ 7 - 0
python/py_igl/py_column_to_quats.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("column_to_quats", []
 m.def("column_to_quats", []
 (
 (
   const Eigen::MatrixXd& Q,
   const Eigen::MatrixXd& Q,

+ 7 - 0
python/py_igl/py_comb_cross_field.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("comb_cross_field", []
 m.def("comb_cross_field", []
 (
 (
   const Eigen::MatrixXd &V,
   const Eigen::MatrixXd &V,

+ 7 - 0
python/py_igl/py_comb_frame_field.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("comb_frame_field", []
 m.def("comb_frame_field", []
 (
 (
   const Eigen::MatrixXd &V,
   const Eigen::MatrixXd &V,

+ 7 - 0
python/py_igl/py_compute_frame_field_bisectors.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("compute_frame_field_bisectors", []
 m.def("compute_frame_field_bisectors", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/py_cotmatrix.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("cotmatrix", []
 m.def("cotmatrix", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/py_covariance_scatter_matrix.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("covariance_scatter_matrix", []
 m.def("covariance_scatter_matrix", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/py_cross_field_missmatch.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("cross_field_missmatch", []
 m.def("cross_field_missmatch", []
 (
 (
   const Eigen::MatrixXd &V,
   const Eigen::MatrixXd &V,

+ 7 - 0
python/py_igl/py_cut_mesh_from_singularities.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("cut_mesh_from_singularities", []
 m.def("cut_mesh_from_singularities", []
 (
 (
   const Eigen::MatrixXd &V,
   const Eigen::MatrixXd &V,

+ 7 - 0
python/py_igl/py_deform_skeleton.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 // COMPLETE BINDINGS ========================
 // COMPLETE BINDINGS ========================
 
 
 
 

+ 7 - 0
python/py_igl/py_directed_edge_orientations.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 m.def("directed_edge_orientations", []
 m.def("directed_edge_orientations", []
 (
 (

+ 7 - 0
python/py_igl/py_directed_edge_parents.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("directed_edge_parents", []
 m.def("directed_edge_parents", []

+ 7 - 0
python/py_igl/py_doublearea.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("doublearea", []
 m.def("doublearea", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/py_dqs.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 
 
 
 
 m.def("dqs", []
 m.def("dqs", []

+ 7 - 0
python/py_igl/py_edge_lengths.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("edge_lengths", []
 m.def("edge_lengths", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/py_edge_topology.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("edge_topology", []
 m.def("edge_topology", []
 (
 (
   const Eigen::MatrixXd& V,
   const Eigen::MatrixXd& V,

+ 7 - 0
python/py_igl/py_eigs.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 py::enum_<igl::EigsType>(m, "EigsType")
 py::enum_<igl::EigsType>(m, "EigsType")
     .value("EIGS_TYPE_SM", igl::EIGS_TYPE_SM)
     .value("EIGS_TYPE_SM", igl::EIGS_TYPE_SM)
     .value("EIGS_TYPE_LM", igl::EIGS_TYPE_LM)
     .value("EIGS_TYPE_LM", igl::EIGS_TYPE_LM)

+ 7 - 0
python/py_igl/py_find_cross_field_singularities.cpp

@@ -1,3 +1,10 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
 m.def("find_cross_field_singularities", []
 m.def("find_cross_field_singularities", []
 (
 (
   const Eigen::MatrixXd &V,
   const Eigen::MatrixXd &V,

部分文件因文件數量過多而無法顯示