浏览代码

Merge remote-tracking branch 'upstream/master'

Former-commit-id: 1881f075468c0281f2263fa96b738bd4ce0d871a
Qingnan Zhou 7 年之前
父节点
当前提交
f4fcd9b351
共有 100 个文件被更改,包括 2154 次插入1729 次删除
  1. 2 1
      .appveyor.yml
  2. 3 3
      .gitmodules
  3. 4 3
      .travis.yml
  4. 0 7
      LICENSE
  5. 40 0
      LICENSE.md
  6. 2 4
      README.md
  7. 1 1
      RELEASE_HISTORY.md
  8. 2 2
      file-formats/dmat.html
  9. 2 2
      file-formats/index.html
  10. 1 1
      file-formats/tgf.html
  11. 1 1
      file-formats/xml.html
  12. 63 56
      include/igl/AABB.cpp
  13. 130 0
      include/igl/AtA_cached.cpp
  14. 70 0
      include/igl/AtA_cached.h
  15. 1 1
      include/igl/Camera.h
  16. 1 1
      include/igl/REDRUM.h
  17. 1 1
      include/igl/SortableRow.h
  18. 3 3
      include/igl/WindingNumberTree.h
  19. 4 3
      include/igl/adjacency_matrix.cpp
  20. 3 3
      include/igl/arap_dof.cpp
  21. 1 1
      include/igl/arap_dof.h
  22. 4 0
      include/igl/barycenter.cpp
  23. 1 1
      include/igl/bbw.h
  24. 4 4
      include/igl/bijective_composite_harmonic_mapping.h
  25. 1 1
      include/igl/boundary_conditions.cpp
  26. 1 1
      include/igl/cat.h
  27. 1 0
      include/igl/colon.cpp
  28. 1368 1396
      include/igl/colormap.cpp
  29. 32 33
      include/igl/colormap.h
  30. 32 2
      include/igl/combine.cpp
  31. 19 2
      include/igl/combine.h
  32. 1 1
      include/igl/connect_boundary_to_infinity.h
  33. 4 4
      include/igl/copyleft/cgal/CGAL_includes.hpp
  34. 1 1
      include/igl/copyleft/cgal/SelfIntersectMesh.h
  35. 4 0
      include/igl/copyleft/cgal/assign.cpp
  36. 35 0
      include/igl/copyleft/cgal/assign_scalar.cpp
  37. 14 0
      include/igl/copyleft/cgal/assign_scalar.h
  38. 3 0
      include/igl/copyleft/cgal/cell_adjacency.cpp
  39. 1 1
      include/igl/copyleft/cgal/cell_adjacency.h
  40. 2 1
      include/igl/copyleft/cgal/closest_facet.cpp
  41. 5 0
      include/igl/copyleft/cgal/extract_cells.cpp
  42. 2 0
      include/igl/copyleft/cgal/half_space_box.cpp
  43. 13 13
      include/igl/copyleft/cgal/insert_into_cdt.cpp
  44. 8 7
      include/igl/copyleft/cgal/insert_into_cdt.h
  45. 0 7
      include/igl/copyleft/cgal/intersect_other.h
  46. 4 0
      include/igl/copyleft/cgal/intersect_with_half_space.cpp
  47. 13 27
      include/igl/copyleft/cgal/mesh_boolean.cpp
  48. 11 0
      include/igl/copyleft/cgal/order_facets_around_edge.cpp
  49. 2 2
      include/igl/copyleft/cgal/order_facets_around_edge.h
  50. 11 0
      include/igl/copyleft/cgal/outer_element.cpp
  51. 5 0
      include/igl/copyleft/cgal/outer_facet.cpp
  52. 1 1
      include/igl/copyleft/cgal/outer_facet.h
  53. 1 1
      include/igl/copyleft/cgal/point_mesh_squared_distance.cpp
  54. 1 1
      include/igl/copyleft/cgal/points_inside_component.cpp
  55. 12 8
      include/igl/copyleft/cgal/projected_cdt.cpp
  56. 6 5
      include/igl/copyleft/cgal/projected_cdt.h
  57. 8 3
      include/igl/copyleft/cgal/propagate_winding_numbers.cpp
  58. 22 12
      include/igl/copyleft/cgal/remesh_intersections.cpp
  59. 1 1
      include/igl/copyleft/cgal/remesh_intersections.h
  60. 4 0
      include/igl/copyleft/cgal/remesh_self_intersections.cpp
  61. 1 1
      include/igl/copyleft/cgal/trim_with_solid.cpp
  62. 42 8
      include/igl/copyleft/cgal/wire_mesh.cpp
  63. 35 16
      include/igl/copyleft/cgal/wire_mesh.h
  64. 1 1
      include/igl/copyleft/comiso/miq.h
  65. 1 1
      include/igl/copyleft/comiso/nrosy.h
  66. 3 0
      include/igl/copyleft/marching_cubes.cpp
  67. 4 11
      include/igl/copyleft/offset_surface.cpp
  68. 2 3
      include/igl/copyleft/offset_surface.h
  69. 1 1
      include/igl/copyleft/opengl2/render_to_tga.cpp
  70. 2 2
      include/igl/copyleft/opengl2/render_to_tga.h
  71. 0 0
      include/igl/copyleft/opengl2/texture_from_tga.cpp
  72. 2 2
      include/igl/copyleft/opengl2/texture_from_tga.h
  73. 1 1
      include/igl/copyleft/opengl2/tga.cpp
  74. 2 2
      include/igl/copyleft/opengl2/tga.h
  75. 1 1
      include/igl/copyleft/tetgen/cdt.h
  76. 2 2
      include/igl/copyleft/tetgen/read_into_tetgenio.h
  77. 1 1
      include/igl/cotmatrix.h
  78. 2 2
      include/igl/cotmatrix_entries.cpp
  79. 1 1
      include/igl/crouzeix_raviart_cotmatrix.cpp
  80. 1 1
      include/igl/crouzeix_raviart_massmatrix.cpp
  81. 4 0
      include/igl/cumsum.cpp
  82. 3 3
      include/igl/cut_mesh.cpp
  83. 1 1
      include/igl/directed_edge_parents.h
  84. 1 0
      include/igl/edges.cpp
  85. 4 4
      include/igl/embree/EmbreeIntersector.h
  86. 1 1
      include/igl/exterior_edges.cpp
  87. 1 1
      include/igl/exterior_edges.h
  88. 4 3
      include/igl/extract_manifold_patches.cpp
  89. 2 2
      include/igl/facet_components.h
  90. 2 0
      include/igl/flood_fill.cpp
  91. 4 2
      include/igl/grid.cpp
  92. 1 1
      include/igl/hausdorff.h
  93. 6 6
      include/igl/hessian.cpp
  94. 8 8
      include/igl/hessian_energy.cpp
  95. 1 1
      include/igl/histc.h
  96. 3 0
      include/igl/integrable_polyvector_fields.cpp
  97. 2 2
      include/igl/integrable_polyvector_fields.h
  98. 4 4
      include/igl/is_boundary_edge.cpp
  99. 1 1
      include/igl/is_planar.h
  100. 3 2
      include/igl/is_stl.cpp

+ 2 - 1
.appveyor.yml

@@ -6,6 +6,7 @@ branches:
   only:
     - master
     - alecjacobson
+    - cmake
 install:
   - git submodule update --init --recursive
   - cinstall: python
@@ -14,7 +15,7 @@ build_script:
   - cd c:\projects\libigl\tutorial
   - mkdir 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" ../
   - set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
 #  - set MSBuildOptions=/v:m /p:Configuration=Release /logger:%MSBuildLogger%

+ 3 - 3
.gitmodules

@@ -1,8 +1,8 @@
 [submodule "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"]
 	path = external/embree
 	url = https://github.com/embree/embree.git

+ 4 - 3
.travis.yml

@@ -1,5 +1,6 @@
 language: cpp
 sudo: false
+dist: precise
 matrix:
   include:
     - 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 ../
         - make -j 2
         - 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 tutorial
         - mkdir 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
       addons:
         apt:
@@ -62,5 +63,5 @@ matrix:
         - cd tutorial
         - mkdir build
         - cd build
-        - cmake -DLIBIGL_USE_STATIC_LIBRARY=ON ../
+        - cmake -DLIBIGL_USE_STATIC_LIBRARY=ON -DLIBIGL_WITH_NANOGUI=ON ../
         - 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.

+ 2 - 4
README.md

@@ -193,7 +193,7 @@ BibTeX entry:
   title = {{libigl}: A simple {C++} geometry processing library},
   author = {Alec Jacobson and Daniele Panozzo and others},
   note = {http://libigl.github.io/libigl/},
-  year = {2016},
+  year = {2017},
 }
 ```
 
@@ -262,8 +262,6 @@ If you find bugs or have problems please use our [github issue tracking
 page](https://github.com/libigl/libigl/issues).
 
 ## 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.

+ 1 - 1
RELEASE_HISTORY.md

@@ -37,7 +37,7 @@ Version | Short description
 0.3.1   | Linearly dependent constraints in min_quad_with_fixed, SparseQR buggy
 0.3.0   | Better active set method support
 0.2.3   | More explicits, active set method, opengl/anttweakbar guards
-0.2.2   | More explicit instanciations, faster sorts and uniques
+0.2.2   | More explicit instantiations, faster sorts and uniques
 0.2.1   | Bug fixes in barycenter and doublearea found by Martin Bisson
 0.2.0   | XML serializer more stable and fixed bug in remove_duplicate_vertices
 0.1.8   | Embree and xml (windows only) extras

+ 2 - 2
file-formats/dmat.html

@@ -12,7 +12,7 @@
     <p>
 A .dmat file contains a dense matrix in column major order. It can contain
 ASCII or binary data. Note that it is uncompressed so binary only reduces the
-file size by 50%. But writing and reading binary is usualy faster. In MATLAB,
+file size by 50%. But writing and reading binary is usually faster. In MATLAB,
 binary is almost 100x faster.
     </p>
     <h2>ASCII</h2>
@@ -33,7 +33,7 @@ Then there should be another header containing the size of the binary part:
     </p>
     <pre><code>[#cols] [#rows]</code></pre>
     <p>
-Then coefficents are written in column-major order in Little-endian 8-byte
+Then coefficients are written in column-major order in Little-endian 8-byte
 double precision IEEE floating point format.
     </p>
     <p><strong>Note:</strong> Line endings must be <code>'\n'</code> aka char(10) aka line feeds.</p>

+ 2 - 2
file-formats/index.html

@@ -20,7 +20,7 @@
     <li><a href=http://tetgen.berlios.de/fformats.face.html
     class=missing>.face</a> TetGen's file format for simplicial facets.</li>
     <li><a href="http://www.ann.jussieu.fr/frey/publications/RT-0253.pdf#page=33">.mesh</a> Medit's triangle surface mesh + tetrahedral volume mesh file format, see page 33, section 7.2.1</li>
-    <li><i>.node</i> List of points (vertices). Described indentically (upto
+    <li><i>.node</i> List of points (vertices). Described identically (upto
         accepted dimensions, use of attributes and boundary markers) by <a
     href="https://www.cs.cmu.edu/~quake/triangle.node.html">Triangle</a>, <a
     href=http://tetgen.berlios.de/fformats.node.html>TetGen</a>, and <a
@@ -37,7 +37,7 @@
     href=https://en.wikipedia.org/wiki/Portable_Network_Graphics>.png</a>
     Portable Network Graphics image file. IGLLIB (in the libiglpng extra)
   supports png image files via the <a href=https://github.com/yig/yimg>yimg</a>
-  library. Alpha channels and compression are suppported.</li>
+  library. Alpha channels and compression are supported.</li>
     <li><i>.poly</i> Piecewise-linear complex. This format comes in many similar but importantly different flavors: 
       <a href="https://www.cs.cmu.edu/~quake/triangle.poly.html">triangle's</a>, <a href="http://tetgen.berlios.de/fformats.poly.html">tetgen's</a>, <a href="http://sparse-meshing.com/svr/0.2.1/format-poly.html">pyramid/SVR's</a></li>
     <li><a href=./rbr.html>.rbr</a> ASCII files for saving state of ReAntTweakBar</li>

+ 1 - 1
file-formats/tgf.html

@@ -11,7 +11,7 @@
     <hr>
     <p>
 A .tgf file contains a graph of describing a set of control handles/structures:
-point controls, bones of a skelton and cages made of "cage edges".
+point controls, bones of a skeleton and cages made of "cage edges".
     </p>
     <p>
 The first part of the file consists of lines regarding each vertex of the graph. Each line reads:

+ 1 - 1
file-formats/xml.html

@@ -31,7 +31,7 @@ STL containers: <b>std::array, std::vector, std::pair</b><br/>
 Eigen types: <b>Eigen::Matrix, Eigen::SparseMatrix</b><br/>
 User defined types: <b>XMLSerializable*.</b><br/>
 <br/>
-There can also be a hierachical structure like vector&lt;int&gt;, this will result in the following serialization:
+There can also be a hierarchical structure like vector&lt;int&gt;, this will result in the following serialization:
     </p>
     <pre><code>&lt;group&gt;
   &lt;vector size="3"&gt;

+ 63 - 56
include/igl/AABB.cpp

@@ -15,6 +15,7 @@
 #include "sort.h"
 #include "volume.h"
 #include "ray_box_intersect.h"
+#include "parallel_for.h"
 #include "ray_mesh_intersect.h"
 #include <iostream>
 #include <iomanip>
@@ -27,7 +28,7 @@ template <typename DerivedV, int DIM>
 template <typename DerivedEle, typename Derivedbb_mins, typename Derivedbb_maxs, typename Derivedelements>
 IGL_INLINE void igl::AABB<DerivedV,DIM>::init(
     const Eigen::MatrixBase<DerivedV> & V,
-    const Eigen::MatrixBase<DerivedEle> & Ele, 
+    const Eigen::MatrixBase<DerivedEle> & Ele,
     const Eigen::MatrixBase<Derivedbb_mins> & bb_mins,
     const Eigen::MatrixBase<Derivedbb_maxs> & bb_maxs,
     const Eigen::MatrixBase<Derivedelements> & elements,
@@ -106,7 +107,7 @@ template <
   typename DerivedI>
 IGL_INLINE void igl::AABB<DerivedV,DIM>::init(
     const Eigen::MatrixBase<DerivedV> & V,
-    const Eigen::MatrixBase<DerivedEle> & Ele, 
+    const Eigen::MatrixBase<DerivedEle> & Ele,
     const Eigen::MatrixBase<DerivedSI> & SI,
     const Eigen::MatrixBase<DerivedI> & I)
 {
@@ -204,15 +205,15 @@ template <typename DerivedV, int DIM>
 template <typename DerivedEle, typename Derivedq>
 IGL_INLINE std::vector<int> igl::AABB<DerivedV,DIM>::find(
     const Eigen::MatrixBase<DerivedV> & V,
-    const Eigen::MatrixBase<DerivedEle> & Ele, 
+    const Eigen::MatrixBase<DerivedEle> & Ele,
     const Eigen::MatrixBase<Derivedq> & q,
     const bool first) const
 {
   using namespace std;
   using namespace Eigen;
-  assert(q.size() == DIM && 
+  assert(q.size() == DIM &&
       "Query dimension should match aabb dimension");
-  assert(Ele.cols() == V.cols()+1 && 
+  assert(Ele.cols() == V.cols()+1 &&
       "AABB::find only makes sense for (d+1)-simplices");
   const Scalar epsilon = igl::EPS<Scalar>();
   // Check if outside bounding box
@@ -250,7 +251,7 @@ IGL_INLINE std::vector<int> igl::AABB<DerivedV,DIM>::find(
           const Vector2S V2 = V.row(Ele(m_primitive,1));
           const Vector2S V3 = V.row(Ele(m_primitive,2));
           // Hack for now to keep templates simple. If becomes bottleneck
-          // consider using std::enable_if_t 
+          // consider using std::enable_if_t
           const Vector2S q2 = q.head(2);
           a1 = doublearea_single(V1,V2,q2);
           a2 = doublearea_single(V2,V3,q2);
@@ -266,9 +267,9 @@ IGL_INLINE std::vector<int> igl::AABB<DerivedV,DIM>::find(
     a3 /= sum;
     a4 /= sum;
     if(
-        a1>=-epsilon && 
-        a2>=-epsilon && 
-        a3>=-epsilon && 
+        a1>=-epsilon &&
+        a2>=-epsilon &&
+        a3>=-epsilon &&
         a4>=-epsilon)
     {
       return std::vector<int>(1,m_primitive);
@@ -345,10 +346,10 @@ IGL_INLINE void igl::AABB<DerivedV,DIM>::serialize(
 
 template <typename DerivedV, int DIM>
 template <typename DerivedEle>
-IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar 
+IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar
 igl::AABB<DerivedV,DIM>::squared_distance(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const RowVectorDIMS & p,
   int & i,
   Eigen::PlainObjectBase<RowVectorDIMS> & c) const
@@ -359,10 +360,10 @@ igl::AABB<DerivedV,DIM>::squared_distance(
 
 template <typename DerivedV, int DIM>
 template <typename DerivedEle>
-IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar 
+IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar
 igl::AABB<DerivedV,DIM>::squared_distance(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const RowVectorDIMS & p,
   Scalar low_sqr_d,
   Scalar up_sqr_d,
@@ -393,7 +394,7 @@ igl::AABB<DerivedV,DIM>::squared_distance(
     {
       int i_left;
       RowVectorDIMS c_left = c;
-      Scalar sqr_d_left = 
+      Scalar sqr_d_left =
         m_left->squared_distance(V,Ele,p,low_sqr_d,sqr_d,i_left,c_left);
       this->set_min(p,sqr_d_left,i_left,c_left,sqr_d,i,c);
       looked_left = true;
@@ -402,7 +403,7 @@ igl::AABB<DerivedV,DIM>::squared_distance(
     {
       int i_right;
       RowVectorDIMS c_right = c;
-      Scalar sqr_d_right = 
+      Scalar sqr_d_right =
         m_right->squared_distance(V,Ele,p,low_sqr_d,sqr_d,i_right,c_right);
       this->set_min(p,sqr_d_right,i_right,c_right,sqr_d,i,c);
       looked_right = true;
@@ -418,9 +419,9 @@ igl::AABB<DerivedV,DIM>::squared_distance(
       look_right();
     }
     // if haven't looked left and could be less than current min, then look
-    Scalar left_up_sqr_d = 
+    Scalar left_up_sqr_d =
       m_left->m_box.squaredExteriorDistance(p.transpose());
-    Scalar right_up_sqr_d = 
+    Scalar right_up_sqr_d =
       m_right->m_box.squaredExteriorDistance(p.transpose());
     if(left_up_sqr_d < right_up_sqr_d)
     {
@@ -449,10 +450,10 @@ igl::AABB<DerivedV,DIM>::squared_distance(
 
 template <typename DerivedV, int DIM>
 template <typename DerivedEle>
-IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar 
+IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar
 igl::AABB<DerivedV,DIM>::squared_distance(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const RowVectorDIMS & p,
   Scalar up_sqr_d,
   int & i,
@@ -464,13 +465,13 @@ igl::AABB<DerivedV,DIM>::squared_distance(
 template <typename DerivedV, int DIM>
 template <
   typename DerivedEle,
-  typename DerivedP, 
-  typename DerivedsqrD, 
-  typename DerivedI, 
+  typename DerivedP,
+  typename DerivedsqrD,
+  typename DerivedI,
   typename DerivedC>
 IGL_INLINE void igl::AABB<DerivedV,DIM>::squared_distance(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const Eigen::MatrixBase<DerivedP> & P,
   Eigen::PlainObjectBase<DerivedsqrD> & sqrD,
   Eigen::PlainObjectBase<DerivedI> & I,
@@ -482,35 +483,37 @@ IGL_INLINE void igl::AABB<DerivedV,DIM>::squared_distance(
   C.resizeLike(P);
   // O( #P * log #Ele ), where log #Ele is really the depth of this AABB
   // hierarchy
-  for(int p = 0;p<P.rows();p++)
-  {
-    RowVectorDIMS Pp = P.row(p), c;
-    int Ip;
-    sqrD(p) = squared_distance(V,Ele,Pp,Ip,c);
-    I(p) = Ip;
-    C.row(p).head(DIM) = c;
-  }
+  //for(int p = 0;p<P.rows();p++)
+  igl::parallel_for(P.rows(),[&](int p)
+    {
+      RowVectorDIMS Pp = P.row(p), c;
+      int Ip;
+      sqrD(p) = squared_distance(V,Ele,Pp,Ip,c);
+      I(p) = Ip;
+      C.row(p).head(DIM) = c;
+    },
+    10000);
 }
 
 template <typename DerivedV, int DIM>
-template < 
+template <
   typename DerivedEle,
   typename Derivedother_V,
   typename Derivedother_Ele,
-  typename DerivedsqrD, 
-  typename DerivedI, 
+  typename DerivedsqrD,
+  typename DerivedI,
   typename DerivedC>
 IGL_INLINE void igl::AABB<DerivedV,DIM>::squared_distance(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const AABB<Derivedother_V,DIM> & other,
   const Eigen::MatrixBase<Derivedother_V> & other_V,
-  const Eigen::MatrixBase<Derivedother_Ele> & other_Ele, 
+  const Eigen::MatrixBase<Derivedother_Ele> & other_Ele,
   Eigen::PlainObjectBase<DerivedsqrD> & sqrD,
   Eigen::PlainObjectBase<DerivedI> & I,
   Eigen::PlainObjectBase<DerivedC> & C) const
 {
-  assert(other_Ele.cols() == 1 && 
+  assert(other_Ele.cols() == 1 &&
     "Only implemented for other as list of points");
   assert(other_V.cols() == V.cols() && "other must match this dimension");
   sqrD.setConstant(other_Ele.rows(),1,std::numeric_limits<double>::infinity());
@@ -528,20 +531,20 @@ IGL_INLINE void igl::AABB<DerivedV,DIM>::squared_distance(
 }
 
 template <typename DerivedV, int DIM>
-template < 
+template <
   typename DerivedEle,
   typename Derivedother_V,
   typename Derivedother_Ele,
-  typename DerivedsqrD, 
-  typename DerivedI, 
+  typename DerivedsqrD,
+  typename DerivedI,
   typename DerivedC>
-IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar 
+IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar
   igl::AABB<DerivedV,DIM>::squared_distance_helper(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const AABB<Derivedother_V,DIM> * other,
   const Eigen::MatrixBase<Derivedother_V> & other_V,
-  const Eigen::MatrixBase<Derivedother_Ele> & other_Ele, 
+  const Eigen::MatrixBase<Derivedother_Ele> & other_Ele,
   const Scalar /*up_sqr_d*/,
   Eigen::PlainObjectBase<DerivedsqrD> & sqrD,
   Eigen::PlainObjectBase<DerivedI> & I,
@@ -584,7 +587,7 @@ IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar
     return sqr_d;
   }
 
-  //// Exact minimum squared distance between arbitary primitives inside this and
+  //// Exact minimum squared distance between arbitrary primitives inside this and
   //// othre's bounding boxes
   //const auto & min_squared_distance = [&](
   //  const AABB<DerivedV,DIM> * A,
@@ -731,9 +734,9 @@ IGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar
       //assert(mc == mm);
       // Only look left/right in this_list if can possible decrease somebody's
       // distance in this_tree.
-      const Scalar min_this_other = min_squared_distance(this_tree,other_tree); 
+      const Scalar min_this_other = min_squared_distance(this_tree,other_tree);
       if(
-          min_this_other < sqr_d && 
+          min_this_other < sqr_d &&
           min_this_other < other_tree->m_low_sqr_d)
       {
         //cout<<"before: "<<other_low_sqr_d(child)<<endl;
@@ -764,7 +767,7 @@ template <typename DerivedV, int DIM>
 template <typename DerivedEle>
 IGL_INLINE void igl::AABB<DerivedV,DIM>::leaf_squared_distance(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const RowVectorDIMS & p,
   const Scalar low_sqr_d,
   Scalar & sqr_d,
@@ -789,7 +792,7 @@ template <typename DerivedV, int DIM>
 template <typename DerivedEle>
 IGL_INLINE void igl::AABB<DerivedV,DIM>::leaf_squared_distance(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const RowVectorDIMS & p,
   Scalar & sqr_d,
   int & i,
@@ -801,7 +804,7 @@ IGL_INLINE void igl::AABB<DerivedV,DIM>::leaf_squared_distance(
 
 template <typename DerivedV, int DIM>
 IGL_INLINE void igl::AABB<DerivedV,DIM>::set_min(
-  const RowVectorDIMS & 
+  const RowVectorDIMS &
 #ifndef NDEBUG
   p
 #endif
@@ -831,10 +834,10 @@ IGL_INLINE void igl::AABB<DerivedV,DIM>::set_min(
 
 template <typename DerivedV, int DIM>
 template <typename DerivedEle>
-IGL_INLINE bool 
+IGL_INLINE bool
 igl::AABB<DerivedV,DIM>::intersect_ray(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const RowVectorDIMS & origin,
   const RowVectorDIMS & dir,
   std::vector<igl::Hit> & hits) const
@@ -874,10 +877,10 @@ igl::AABB<DerivedV,DIM>::intersect_ray(
 
 template <typename DerivedV, int DIM>
 template <typename DerivedEle>
-IGL_INLINE bool 
+IGL_INLINE bool
 igl::AABB<DerivedV,DIM>::intersect_ray(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const RowVectorDIMS & origin,
   const RowVectorDIMS & dir,
   igl::Hit & hit) const
@@ -932,10 +935,10 @@ igl::AABB<DerivedV,DIM>::intersect_ray(
 
 template <typename DerivedV, int DIM>
 template <typename DerivedEle>
-IGL_INLINE bool 
+IGL_INLINE bool
 igl::AABB<DerivedV,DIM>::intersect_ray(
   const Eigen::MatrixBase<DerivedV> & V,
-  const Eigen::MatrixBase<DerivedEle> & Ele, 
+  const Eigen::MatrixBase<DerivedEle> & Ele,
   const RowVectorDIMS & origin,
   const RowVectorDIMS & dir,
   const Scalar _min_t,
@@ -1001,7 +1004,7 @@ igl::AABB<DerivedV,DIM>::intersect_ray(
 
 // This is a bullshit template because AABB annoyingly needs templates for bad
 // combinations of 3D V with DIM=2 AABB
-// 
+//
 // _Define_ as a no-op rather than monkeying around with the proper code above
 //
 // Meanwhile, GCC seems to have a bug. Let's see if GCC likes using explicit
@@ -1022,6 +1025,10 @@ namespace igl
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template double igl::AABB<Eigen::Matrix<double, -1, 3, 1, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, double, double, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&) const;
+// generated by autoexplicit.sh
+template void igl::AABB<Eigen::Matrix<double, -1, 3, 1, -1, 3>, 3>::init<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&);
+// generated by autoexplicit.sh
 // generated by autoexplicit.sh
 template float igl::AABB<Eigen::Matrix<float, -1, 3, 0, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<float, 1, 3, 1, 1, 3> const&, float, float, int&, Eigen::PlainObjectBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> >&) const;
 // generated by autoexplicit.sh

+ 130 - 0
include/igl/AtA_cached.cpp

@@ -0,0 +1,130 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 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 "AtA_cached.h"
+
+#include <iostream>
+#include <vector>
+#include <utility>
+
+template <typename Scalar>
+IGL_INLINE void igl::AtA_cached_precompute(
+    const Eigen::SparseMatrix<Scalar>& A,
+    igl::AtA_cached_data& data,
+    Eigen::SparseMatrix<Scalar>& AtA)
+{
+  // 1 Compute At (this could be avoided, but performance-wise it will not make a difference)
+  std::vector<std::vector<int> > Col_RowPtr;
+  std::vector<std::vector<int> > Col_IndexPtr;
+
+  Col_RowPtr.resize(A.cols());
+  Col_IndexPtr.resize(A.cols());
+
+  for (unsigned k=0; k<A.outerSize(); ++k)
+  {
+    unsigned outer_index = *(A.outerIndexPtr()+k);
+    unsigned next_outer_index = (k+1 == A.outerSize()) ? A.nonZeros() : *(A.outerIndexPtr()+k+1); 
+    
+    for (unsigned l=outer_index; l<next_outer_index; ++l)
+    {
+      int col = k;
+      int row = *(A.innerIndexPtr()+l);
+      int value_index = l;
+      assert(col < A.cols());
+      assert(col >= 0);
+      assert(row < A.rows());
+      assert(row >= 0);
+      assert(value_index >= 0);
+      assert(value_index < A.nonZeros());
+
+      Col_RowPtr[col].push_back(row);
+      Col_IndexPtr[col].push_back(value_index);
+    }
+  }
+
+  Eigen::SparseMatrix<Scalar> At = A.transpose();
+  At.makeCompressed();
+  AtA = At * A;
+  AtA.makeCompressed();
+
+  assert(AtA.isCompressed());
+
+  // If weights are not provided, use 1
+  if (data.W.size() == 0)
+    data.W = Eigen::VectorXd::Ones(A.rows());
+  assert(data.W.size() == A.rows());
+
+  data.I_outer.reserve(AtA.outerSize());
+  data.I_row.reserve(2*AtA.nonZeros());
+  data.I_col.reserve(2*AtA.nonZeros());
+  data.I_w.reserve(2*AtA.nonZeros());
+
+  // 2 Construct the rules
+  for (unsigned k=0; k<AtA.outerSize(); ++k)
+  {
+    unsigned outer_index = *(AtA.outerIndexPtr()+k);
+    unsigned next_outer_index = (k+1 == AtA.outerSize()) ? AtA.nonZeros() : *(AtA.outerIndexPtr()+k+1); 
+    
+    for (unsigned l=outer_index; l<next_outer_index; ++l)
+    {
+      int col = k;
+      int row = *(AtA.innerIndexPtr()+l);
+      int value_index = l;
+      assert(col < AtA.cols());
+      assert(col >= 0);
+      assert(row < AtA.rows());
+      assert(row >= 0);
+      assert(value_index >= 0);
+      assert(value_index < AtA.nonZeros());
+
+      data.I_outer.push_back(data.I_row.size());
+
+      // Find correspondences
+      unsigned i=0;
+      unsigned j=0;
+      while (i<Col_RowPtr[row].size() && j<Col_RowPtr[col].size())
+      {
+          if (Col_RowPtr[row][i] == Col_RowPtr[col][j])
+          {
+            data.I_row.push_back(Col_IndexPtr[row][i]);
+            data.I_col.push_back(Col_IndexPtr[col][j]);
+            data.I_w.push_back(Col_RowPtr[col][j]);
+            ++i;
+            ++j;
+          } else 
+          if (Col_RowPtr[row][i] > Col_RowPtr[col][j])
+            ++j;
+          else
+            ++i;
+
+      }
+    }
+  }
+  data.I_outer.push_back(data.I_row.size()); // makes it more efficient to iterate later on
+
+  igl::AtA_cached(A,data,AtA);
+}
+
+template <typename Scalar>
+IGL_INLINE void igl::AtA_cached(
+    const Eigen::SparseMatrix<Scalar>& A,
+    const igl::AtA_cached_data& data,
+    Eigen::SparseMatrix<Scalar>& AtA)
+{
+  for (unsigned i=0; i<data.I_outer.size()-1; ++i)
+  {
+    *(AtA.valuePtr() + i) = 0;
+    for (unsigned j=data.I_outer[i]; j<data.I_outer[i+1]; ++j)
+      *(AtA.valuePtr() + i) += *(A.valuePtr() + data.I_row[j]) * data.W[data.I_w[j]] * *(A.valuePtr() + data.I_col[j]);
+  }
+}
+
+
+#ifdef IGL_STATIC_LIBRARY
+template void igl::AtA_cached<double>(Eigen::SparseMatrix<double, 0, int> const&, igl::AtA_cached_data const&, Eigen::SparseMatrix<double, 0, int>&);
+template void igl::AtA_cached_precompute<double>(Eigen::SparseMatrix<double, 0, int> const&, igl::AtA_cached_data&, Eigen::SparseMatrix<double, 0, int>&);
+#endif

+ 70 - 0
include/igl/AtA_cached.h

@@ -0,0 +1,70 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+// 
+// Copyright (C) 2017 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/.
+#ifndef IGL_ATA_CACHED_H
+#define IGL_ATA_CACHED_H
+#include "igl_inline.h"
+#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET
+#include <Eigen/Dense>
+#include <Eigen/Sparse>
+namespace igl
+{  
+  struct AtA_cached_data
+  {
+    // Weights
+    Eigen::VectorXd W;
+
+    // Flatten composition rules
+    std::vector<int> I_row;
+    std::vector<int> I_col;
+    std::vector<int> I_w;
+
+    // For each entry of AtA, points to the beginning
+    // of the composition rules
+    std::vector<int> I_outer;
+  };
+
+  // Computes At * W * A, where A is sparse and W is diagonal. Divides the 
+  // construction in two phases, one
+  // for fixing the sparsity pattern, and one to populate it with values. Compared to
+  // evaluating it directly, this version is slower for the first time (since it requires a
+  // precomputation), but faster to the subsequent evaluations.
+  //
+  // Input:
+  //   A m x n sparse matrix
+  //   data stores the precomputed sparsity pattern, data.W contains the optional diagonal weights (stored as a dense vector). If W is not provided, it is replaced by the identity.
+  // Outputs:
+  //   AtA  m by m matrix computed as AtA * W * A
+  //
+  // Example:
+  // AtA_data = igl::AtA_cached_data();
+  // AtA_data.W = W;
+  // if (s.AtA.rows() == 0)
+  //   igl::AtA_cached_precompute(s.A,s.AtA_data,s.AtA);
+  // else
+  //   igl::AtA_cached(s.A,s.AtA_data,s.AtA);
+  template <typename Scalar>
+  IGL_INLINE void AtA_cached_precompute(
+    const Eigen::SparseMatrix<Scalar>& A,
+    AtA_cached_data& data,
+    Eigen::SparseMatrix<Scalar>& AtA
+    );
+
+  template <typename Scalar>
+  IGL_INLINE void AtA_cached(
+    const Eigen::SparseMatrix<Scalar>& A,
+    const AtA_cached_data& data,
+    Eigen::SparseMatrix<Scalar>& AtA
+    );
+  
+}
+
+#ifndef IGL_STATIC_LIBRARY
+#  include "AtA_cached.cpp"
+#endif
+
+#endif

+ 1 - 1
include/igl/Camera.h

@@ -23,7 +23,7 @@ namespace igl
 
   // A simple camera class. The camera stores projection parameters (field of
   // view angle, aspect ratio, near and far clips) as well as a rigid
-  // tranformation *of the camera as if it were also a scene object*. Thus, the
+  // transformation *of the camera as if it were also a scene object*. Thus, the
   // **inverse** of this rigid transformation is the modelview transformation.
   class Camera
   {

+ 1 - 1
include/igl/REDRUM.h

@@ -13,7 +13,7 @@
 // A: I guess the right way is to not use a macro but a proper function with
 // streams as input and output.
 
-// ANSI color codes for formating iostream style output
+// ANSI color codes for formatting iostream style output
 
 #ifdef IGL_REDRUM_NOOP
 

+ 1 - 1
include/igl/SortableRow.h

@@ -15,7 +15,7 @@
 namespace igl
 {
   // Templates:
-  //   T  should be a matrix that implments .size(), and operator(int i)
+  //   T  should be a matrix that implements .size(), and operator(int i)
   template <typename T>
   class SortableRow
   {

+ 3 - 3
include/igl/WindingNumberTree.h

@@ -52,7 +52,7 @@ namespace igl
       MatrixXS SV;
       // Facets in this bounding volume
       MatrixXF F;
-      // Tesselated boundary curve
+      // Tessellated boundary curve
       MatrixXF cap;
       // Upper Bound on radius of enclosing ball
       typename DerivedV::Scalar radius;
@@ -97,7 +97,7 @@ namespace igl
       // Same as above, but always computes winding number using exact method
       // (sum over every facet)
       inline typename DerivedV::Scalar winding_number_all(const Point & p) const;
-      // Same as above, but always computes using sum over tesslated boundary
+      // Same as above, but always computes using sum over tessllated boundary
       inline typename DerivedV::Scalar winding_number_boundary(const Point & p) const;
       //// Same as winding_number above, but if max_simple_abs_winding_number is
       //// less than some threshold min_max_w just return 0 (colloquially the "fast
@@ -493,7 +493,7 @@ igl::WindingNumberTree<Point,DerivedV,DerivedF>::cached_winding_number(
   return 0;
 }
 
-// Explicit instanciation of static variable
+// Explicit instantiation of static variable
 template <
   typename Point,
   typename DerivedV, 

+ 4 - 3
include/igl/adjacency_matrix.cpp

@@ -23,15 +23,16 @@ IGL_INLINE void igl::adjacency_matrix(
   typedef Triplet<T> IJV;
   vector<IJV > ijv;
   ijv.reserve(F.size()*2);
-  // Loop over faces
+  // Loop over **simplex** (i.e., **not quad**)
   for(int i = 0;i<F.rows();i++)
   {
-    // Loop over this face
+    // Loop over this **simplex**
     for(int j = 0;j<F.cols();j++)
+    for(int k = j+1;k<F.cols();k++)
     {
       // Get indices of edge: s --> d
       Index s = F(i,j);
-      Index d = F(i,(j+1)%F.cols());
+      Index d = F(i,k);
       ijv.push_back(IJV(s,d,1));
       ijv.push_back(IJV(d,s,1));
     }

+ 3 - 3
include/igl/arap_dof.cpp

@@ -34,7 +34,7 @@
 // defined if no early exit is supported, i.e., always take a fixed number of iterations
 #define IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT
 
-// A carefull derivation of this implementation is given in the corresponding
+// A careful derivation of this implementation is given in the corresponding
 // matlab function arap_dof.m
 template <typename LbsMatrixType, typename SSCALAR>
 IGL_INLINE bool igl::arap_dof_precomputation(
@@ -339,7 +339,7 @@ namespace igl
   }
   
   // converts CSM_M_SSCALAR[0], CSM_M_SSCALAR[1], CSM_M_SSCALAR[2] into one
-  // "condensed" matrix CSM while checking we're not loosing any information by
+  // "condensed" matrix CSM while checking we're not losing any information by
   // this process; specifically, returns maximal difference from scaled 3x3
   // identity blocks, which should be pretty small number
   template <typename MatrixXS>
@@ -449,7 +449,7 @@ namespace igl
   }
   
   // converts "Solve1" the "rotations" part of FullSolve matrix (the first part)
-  // into one "condensed" matrix CSolve1 while checking we're not loosing any
+  // into one "condensed" matrix CSolve1 while checking we're not losing any
   // information by this process; specifically, returns maximal difference from
   // scaled 3x3 identity blocks, which should be pretty small number
   template <typename MatrixXS>

+ 1 - 1
include/igl/arap_dof.h

@@ -127,7 +127,7 @@ namespace igl
   //   L0  #handles * dim * dim+1 list of initial guess transformation entries,
   //     also holds fixed transformation entries for fixed handles
   //   max_iters  maximum number of iterations
-  //   tol  stopping critera parameter. If variables (linear transformation
+  //   tol  stopping criteria parameter. If variables (linear transformation
   //     matrix entries) change by less than 'tol' the optimization terminates,
   //       0.75 (weak tolerance)
   //       0.0 (extreme tolerance)

+ 4 - 0
include/igl/barycenter.cpp

@@ -34,6 +34,10 @@ IGL_INLINE void igl::barycenter(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template void igl::barycenter<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);
+// generated by autoexplicit.sh
+template void igl::barycenter<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
 template void igl::barycenter<Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);
 // generated by autoexplicit.sh
 template void igl::barycenter<Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);

+ 1 - 1
include/igl/bbw.h

@@ -49,7 +49,7 @@ namespace igl
   //   Ele  #Elements by simplex-size list of element indices
   //   b  #b boundary indices into V
   //   bc #b by #W list of boundary values
-  //   data  object containing options, intial guess --> solution and results
+  //   data  object containing options, initial guess --> solution and results
   // Outputs:
   //   W  #V by #W list of *unnormalized* weights to normalize use
   //    igl::normalize_row_sums(W,W);

+ 4 - 4
include/igl/bijective_composite_harmonic_mapping.h

@@ -29,7 +29,7 @@ namespace igl
   //   bc  #b by 2 list of boundary conditions corresponding to b
   // Outputs:
   //   U  #V by 2 list of output mesh vertex locations
-  // Returns true if and only if U contains a successfull bijectie mapping
+  // Returns true if and only if U contains a successful bijectie mapping
   //
   // 
   template <
@@ -46,12 +46,12 @@ namespace igl
     Eigen::PlainObjectBase<DerivedU> & U);
   //
   // Inputs:
-  //   min_steps  mininum number of steps to take from V(b,:) to bc
-  //   max_steps  mininum number of steps to take from V(b,:) to bc (if
+  //   min_steps  minimum number of steps to take from V(b,:) to bc
+  //   max_steps  minimum number of steps to take from V(b,:) to bc (if
   //     max_steps == min_steps then no further number of steps will be tried)
   //   num_inner_iters  number of iterations of harmonic solves to run after
   //     for each morph step (to try to push flips back in)
-  //   test_for_flips  wether to check if flips occured (and trigger more
+  //   test_for_flips  whether to check if flips occurred (and trigger more
   //     steps). if test_for_flips = false then this function always returns
   //     true
   // 

+ 1 - 1
include/igl/boundary_conditions.cpp

@@ -146,7 +146,7 @@ IGL_INLINE bool igl::boundary_conditions(
     bc(bim[bci[i]],bcj[i]) = bcv[i];
   }
 
-  // Normalize accross rows so that conditions sum to one
+  // Normalize across rows so that conditions sum to one
   for(i = 0;i<bc.rows();i++)
   {
     double sum = bc.row(i).sum();

+ 1 - 1
include/igl/cat.h

@@ -25,7 +25,7 @@ namespace igl
   // Template:
   //   Scalar  scalar data type for sparse matrices like double or int
   //   Mat  matrix type for all matrices (e.g. MatrixXd, SparseMatrix)
-  //   MatC  matrix type for ouput matrix (e.g. MatrixXd) needs to support
+  //   MatC  matrix type for output matrix (e.g. MatrixXd) needs to support
   //     resize
   // Inputs:
   //   A  first input matrix

+ 1 - 0
include/igl/colon.cpp

@@ -61,5 +61,6 @@ template void igl::colon<double, double, double, double>(double, double, double,
 template void igl::colon<int, int, long>(int, int, Eigen::Matrix<long, -1, 1, 0, -1, 1>&);
 #ifdef WIN32
 template void igl::colon<int, long long,long>(int, long long, class Eigen::Matrix<long,-1,1,0,-1,1> &);
+template void igl::colon<int, __int64, __int64>(int, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> &);
 #endif
 #endif

+ 1368 - 1396
include/igl/colormap.cpp

@@ -6,1457 +6,1429 @@
 // 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 }
+  { 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 }
+  { 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 }
+  { 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 }
+  { 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 }
+  { 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>
-static IGL_INLINE void cm_jet(const T x_in, T & r, T & g, T & b)
-{
-	// Only important if the number of colors is small. In which case the rest is
-	// still wrong anyway
-	// x = linspace(0,1,jj)' * (1-1/jj) + 1/jj;
-	//
-	const double rone = 0.8;
-	const double gone = 1.0;
-	const double bone = 1.0;
-	T x = x_in;
-	x = (x_in<0 ? 0 : (x>1 ? 1 : x));
-
-	if (x<1. / 8.)
-	{
-		r = 0;
-		g = 0;
-		b = bone*(0.5 + (x) / (1. / 8.)*0.5);
-	} else if (x<3. / 8.)
-	{
-		r = 0;
-		g = gone*(x - 1. / 8.) / (3. / 8. - 1. / 8.);
-		b = bone;
-	} else if (x<5. / 8.)
-	{
-		r = rone*(x - 3. / 8.) / (5. / 8. - 3. / 8.);
-		g = gone;
-		b = (bone - (x - 3. / 8.) / (5. / 8. - 3. / 8.));
-	} else if (x<7. / 8.)
-	{
-		r = rone;
-		g = (gone - (x - 5. / 8.) / (7. / 8. - 5. / 8.));
-		b = 0;
-	} else
-	{
-		r = (rone - (x - 7. / 8.) / (1. - 7. / 8.)*0.5);
-		g = 0;
-		b = 0;
-	}
 }
 
 template <typename T>
-static IGL_INLINE void color_from_palette(const T x_in, T & r, T & g, T & b, double palette[256][3])
+IGL_INLINE void igl::colormap(const ColorMapType cm, const T x, T * rgb)
 {
-	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]));
+  return colormap(cm,x,rgb[0],rgb[1],rgb[2]);
 }
 
 template <typename T>
-IGL_INLINE void igl::colormap(const T x, T * rgb, ColorMapType cm)
+IGL_INLINE void igl::colormap(
+  const ColorMapType cm, const T x_in, T & r, T & g, T & b)
 {
-  return colormap(x,rgb[0],rgb[1],rgb[2],cm);
+  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 T x_in, T & r, T & g, T & b, ColorMapType cm)
+IGL_INLINE void igl::colormap(
+  const double palette[256][3], const T x_in, T & r, T & g, T & b)
 {
-	switch (cm) {
-		case CM_INFERNO: {
-			color_from_palette(x_in, r, g, b, inferno_cm);
-			break;
-		}
-		case CM_JET: {
-			cm_jet(x_in, r, g, b);
-			break;
-		}
-		case CM_MAGMA: {
-			color_from_palette(x_in, r, g, b, magma_cm);
-			break;
-		}
-		case CM_PARULA: {
-			color_from_palette(x_in, r, g, b, parula_cm);
-			break;
-		}
-		case CM_PLASMA: {
-			color_from_palette(x_in, r, g, b, plasma_cm);
-			break;
-		}
-		case CM_VIRIDIS: {
-			color_from_palette(x_in, r, g, b, viridis_cm);
-			break;
-		}
-		default: {
-			throw std::invalid_argument("igl::colormap(): Selected colormap is unsupported!");
-			break;
-		}
-	}
+  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 Eigen::PlainObjectBase<DerivedZ> & Z,
+  const ColorMapType cm,
+  const Eigen::MatrixBase<DerivedZ> & Z,
   const bool normalize,
-  Eigen::PlainObjectBase<DerivedC> & C,
-  ColorMapType cm)
+  Eigen::PlainObjectBase<DerivedC> & C)
 {
   const double min_z = normalize ? Z.minCoeff() : 0;
-  const double max_z = normalize ? Z.maxCoeff() : -1;
-  return colormap(Z, min_z, max_z, C, cm);
+  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 Eigen::PlainObjectBase<DerivedZ> & Z,
+  const ColorMapType cm,
+  const Eigen::MatrixBase<DerivedZ> & Z,
   const double min_z,
   const double max_z,
-  Eigen::PlainObjectBase<DerivedC> & C,
-  ColorMapType cm)
+  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(
+  colormap(
+      cm,
       (typename DerivedC::Scalar)((-min_z + Z(r,0)) / denom),
       C(r,0),
       C(r,1),
-      C(r,2),
-	  cm);
+      C(r,2));
   }
 }
 
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
-template void igl::colormap<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> >&, ColorMapType cm);
-template void igl::colormap<double>(double, double*, ColorMapType cm);
-template void igl::colormap<double>(double, double&, double&, double&, ColorMapType cm);
-template void igl::colormap<float>(float, float*, ColorMapType cm);
-template void igl::colormap<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> >&, ColorMapType cm);
-template void igl::colormap<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> >&, ColorMapType cm);
-template void igl::colormap<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> >&, ColorMapType cm);
-template void igl::colormap<float>(float, float&, float&, float&, ColorMapType cm);
-template void igl::colormap<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> >&, ColorMapType cm);
-template void igl::colormap<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> >&, ColorMapType cm);
-template void igl::colormap<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> >&, ColorMapType cm);
-template void igl::colormap<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> >&, ColorMapType cm);
-template void igl::colormap<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> >&, ColorMapType cm);
+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> >&);
+
+template void igl::colormap<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);
 #endif

+ 32 - 33
include/igl/colormap.h

@@ -13,61 +13,60 @@
 #include <Eigen/Dense>
 
 namespace igl {
-  // Colormap selector -- an interface to supported colormaps within igl
-  //
-  // Inputs:
-  //   m  number of colors 
-  //   cm colormap enum
-  // Outputs:
-  //   J  m by list of RGB colors between 0 and 1
-  //
-  // Wrapper for directly computing [r,g,b] values of the selected colormap for a given factor f between
-  // 0 and 1
+
+  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:
-  //   f  factor determining color value as if 0 was min and 1 was max
   //   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
-
-  enum ColorMapType
-  {
-	CM_INFERNO = 0,
-	CM_JET = 1,
-	CM_MAGMA = 2,
-	CM_PARULA = 3,
-	CM_PLASMA = 4,
-	CM_VIRIDIS = 5
-  };
-
   template <typename T>
-  IGL_INLINE void colormap(const T f, T * rgb, ColorMapType cm);
+  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 T f, T & r, T & g, T & b, ColorMapType cm);
+  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]
-  //   cm selected colormap palette to interpolate from
   // Outputs:
   //   C  #C by 3 list of rgb colors
   template <typename DerivedZ, typename DerivedC>
   IGL_INLINE void colormap(
-    const Eigen::PlainObjectBase<DerivedZ> & Z,
+    const ColorMapType cm,
+    const Eigen::MatrixBase<DerivedZ> & Z,
     const bool normalize,
-    Eigen::PlainObjectBase<DerivedC> & C,
-	ColorMapType cm);
+    Eigen::PlainObjectBase<DerivedC> & C);
   // Inputs:
-  //   min_z  value at black
-  //   max_z  value at yellow
+  //   min_z  value at "0"
+  //   max_z  value at "1"
   template <typename DerivedZ, typename DerivedC>
   IGL_INLINE void colormap(
-    const Eigen::PlainObjectBase<DerivedZ> & Z,
+    const ColorMapType cm,
+    const Eigen::MatrixBase<DerivedZ> & Z,
     const double min_Z,
     const double max_Z,
-    Eigen::PlainObjectBase<DerivedC> & C,
-	ColorMapType cm);
+    Eigen::PlainObjectBase<DerivedC> & C);
 };
 
 #ifndef IGL_STATIC_LIBRARY

+ 32 - 2
include/igl/combine.cpp

@@ -7,19 +7,26 @@
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "combine.h"
 #include <cassert>
+
 template <
   typename DerivedVV, 
   typename DerivedFF, 
   typename DerivedV, 
-  typename DerivedF>
+  typename DerivedF,
+  typename DerivedVsizes,
+  typename DerivedFsizes>
 IGL_INLINE void igl::combine(
   const std::vector<DerivedVV> & VV,
   const std::vector<DerivedFF> & FF,
   Eigen::PlainObjectBase<DerivedV> & V,
-  Eigen::PlainObjectBase<DerivedF> & F)
+  Eigen::PlainObjectBase<DerivedF> & F,
+  Eigen::PlainObjectBase<DerivedVsizes> & Vsizes,
+  Eigen::PlainObjectBase<DerivedFsizes> & Fsizes)
 {
   assert(VV.size() == FF.size() && 
     "Lists of verex lists and face lists should be same size");
+  Vsizes.resize(VV.size());
+  Fsizes.resize(FF.size());
   // Dimension of vertex positions
   const int dim = VV.size() > 0 ? VV[0].cols() : 0;
   // Simplex/element size
@@ -30,8 +37,10 @@ IGL_INLINE void igl::combine(
   {
     const auto & Vi = VV[i];
     const auto & Fi = FF[i];
+    Vsizes(i) = Vi.rows();
     n+=Vi.rows();
     assert(dim == Vi.cols() && "All vertex lists should have same #columns");
+    Fsizes(i) = Fi.rows();
     m+=Fi.rows();
     assert(ss == Fi.cols() && "All face lists should have same #columns");
   }
@@ -55,3 +64,24 @@ IGL_INLINE void igl::combine(
     assert(kf == F.rows());
   }
 }
+
+template <
+  typename DerivedVV, 
+  typename DerivedFF, 
+  typename DerivedV, 
+  typename DerivedF>
+IGL_INLINE void igl::combine(
+  const std::vector<DerivedVV> & VV,
+  const std::vector<DerivedFF> & FF,
+  Eigen::PlainObjectBase<DerivedV> & V,
+  Eigen::PlainObjectBase<DerivedF> & F)
+{
+  Eigen::VectorXi Vsizes,Fsizes;
+  return igl::combine(VV,FF,V,F,Vsizes,Fsizes);
+}
+
+#ifdef IGL_STATIC_LIBRARY
+// Explicit template instantiation
+template void igl::combine<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1>, Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1> >(std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, std::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<int, -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<unsigned long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1> >&);
+template void igl::combine<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(std::vector<Eigen::Matrix<double, -1, 3, 1, -1, 3>, std::allocator<Eigen::Matrix<double, -1, 3, 1, -1, 3> > > const&, std::vector<Eigen::Matrix<int, -1, 3, 1, -1, 3>, std::allocator<Eigen::Matrix<int, -1, 3, 1, -1, 3> > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);
+#endif

+ 19 - 2
include/igl/combine.h

@@ -14,8 +14,8 @@
 
 namespace igl
 {
-  // Combine k meshes into a single >=k connected component mesh with a single
-  // vertex list and face list. Similar to Maya's Combine operation.
+  // Concatenate k meshes into a single >=k connected component mesh with a
+  // single vertex list and face list. Similar to Maya's Combine operation. 
   //
   // Inputs:
   //   VV  k-long list of lists of mesh vertex positions
@@ -26,10 +26,27 @@ namespace igl
   //     vertex positions
   //   F   FF[0].rows()+...+FF[k-1].rows() by FF[0].cols() list of mesh faces
   //     indices into V
+  //   Vsizes  k list so that Vsizes(i) is the #vertices in the ith input
+  //   Fsizes  k list so that Fsizes(i) is the #faces in the ith input
   // Example:
   //   // Suppose you have mesh A (VA,FA) and mesh B (VB,FB)
   //   igl::combine<Eigen::MatrixXd,Eigen::MatrixXi>({VA,VB},{FA,FB},V,F);
   //
+  //
+  template <
+    typename DerivedVV, 
+    typename DerivedFF, 
+    typename DerivedV, 
+    typename DerivedF,
+    typename DerivedVsizes,
+    typename DerivedFsizes>
+  IGL_INLINE void combine(
+    const std::vector<DerivedVV> & VV,
+    const std::vector<DerivedFF> & FF,
+    Eigen::PlainObjectBase<DerivedV> & V,
+    Eigen::PlainObjectBase<DerivedF> & F,
+    Eigen::PlainObjectBase<DerivedVsizes> & Vsizes,
+    Eigen::PlainObjectBase<DerivedFsizes> & Fsizes);
   template <
     typename DerivedVV, 
     typename DerivedFF, 

+ 1 - 1
include/igl/connect_boundary_to_infinity.h

@@ -11,7 +11,7 @@
 #include <Eigen/Core>
 namespace igl
 {
-  // Connect all boundary edges to a ficticious point at infinity.
+  // Connect all boundary edges to a fictitious point at infinity.
   //
   // Inputs:
   //   F  #F by 3 list of face indices into some V

+ 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.
-// 
+//
 // 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/.
 #ifndef IGL_CGAL_INCLUDES_H
 #define IGL_CGAL_INCLUDES_H

+ 1 - 1
include/igl/copyleft/cgal/SelfIntersectMesh.h

@@ -236,7 +236,7 @@ namespace igl
 // a 2-manifold.
 // A: But! It seems we could use CGAL::Triangulation_3. Though it won't be easy
 // to take advantage of functions like insert_in_facet because we want to
-// constrain segments. Hmmm. Actualy Triangulation_3 doesn't look right...
+// constrain segments. Hmmm. Actually Triangulation_3 doesn't look right...
 
 // CGAL's box_self_intersection_d uses C-style function callbacks without
 // userdata. This is a leapfrog method for calling a member function. It should

+ 4 - 0
include/igl/copyleft/cgal/assign.cpp

@@ -49,6 +49,10 @@ igl::copyleft::cgal::assign(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);
+// generated by autoexplicit.sh
+template void igl::copyleft::cgal::assign<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> >&);
+// generated by autoexplicit.sh
 template void igl::copyleft::cgal::assign<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> >&);
 // generated by autoexplicit.sh
 template void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>,  Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&,   Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);

+ 35 - 0
include/igl/copyleft/cgal/assign_scalar.cpp

@@ -97,3 +97,38 @@ IGL_INLINE void igl::copyleft::cgal::assign_scalar(
       d = next;
   } while (d < float(interval.second));
 }
+
+
+IGL_INLINE void igl::copyleft::cgal::assign_scalar(
+  const CGAL::Simple_cartesian<mpq_class>::FT & cgal,
+  CGAL::Simple_cartesian<mpq_class>::FT & d)
+{
+  d = cgal;
+}
+
+IGL_INLINE void igl::copyleft::cgal::assign_scalar(
+  const CGAL::Simple_cartesian<mpq_class>::FT & cgal,
+  double & d)
+{
+  const auto interval = CGAL::to_interval(cgal);
+  d = interval.first;
+  do {
+      const double next = nextafter(d, interval.second);
+      if (CGAL::abs(cgal-d) < CGAL::abs(cgal-next)) break;
+      d = next;
+  } while (d < interval.second);
+}
+
+IGL_INLINE void igl::copyleft::cgal::assign_scalar(
+  const CGAL::Simple_cartesian<mpq_class>::FT & cgal,
+  float& d)
+{
+  const auto interval = CGAL::to_interval(cgal);
+  d = interval.first;
+  do {
+      const float next = nextafter(d, float(interval.second));
+      if (CGAL::abs(cgal-d) < CGAL::abs(cgal-next)) break;
+      d = next;
+  } while (d < float(interval.second));
+}
+

+ 14 - 0
include/igl/copyleft/cgal/assign_scalar.h

@@ -10,6 +10,8 @@
 #include "../../igl_inline.h"
 #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
 #include <CGAL/Exact_predicates_exact_constructions_kernel_with_sqrt.h>
+#include <CGAL/gmpxx.h>
+
 namespace igl
 {
   namespace copyleft
@@ -38,6 +40,7 @@ namespace igl
       IGL_INLINE void assign_scalar(
         const float& c,
         double& d);
+
       IGL_INLINE void assign_scalar(
         const CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt::FT & cgal,
         CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt::FT & d);
@@ -47,6 +50,17 @@ namespace igl
       IGL_INLINE void assign_scalar(
         const CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt::FT & cgal,
         float& d);
+
+      IGL_INLINE void assign_scalar(
+        const CGAL::Simple_cartesian<mpq_class>::FT & cgal,
+        CGAL::Simple_cartesian<mpq_class>::FT & d);
+      IGL_INLINE void assign_scalar(
+        const CGAL::Simple_cartesian<mpq_class>::FT & cgal,
+        double & d);
+      IGL_INLINE void assign_scalar(
+        const CGAL::Simple_cartesian<mpq_class>::FT & cgal,
+        float& d);
+
     }
   }
 }

+ 3 - 0
include/igl/copyleft/cgal/cell_adjacency.cpp

@@ -28,4 +28,7 @@ IGL_INLINE void igl::copyleft::cgal::cell_adjacency(
 
 #ifdef IGL_STATIC_LIBRARY
 template void igl::copyleft::cgal::cell_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, unsigned long, std::vector<std::set<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long>, std::less<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long> >, std::allocator<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long> > >, std::allocator<std::set<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long>, std::less<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long> >, std::allocator<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long> > > > >&);
+#ifdef WIN32
+template void igl::copyleft::cgal::cell_adjacency<class Eigen::Matrix<int, -1, -1, 0, -1, -1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, unsigned __int64, class std::vector<class std::set<class std::tuple<int, bool, unsigned __int64>, struct std::less<class std::tuple<int, bool, unsigned __int64>>, class std::allocator<class std::tuple<int, bool, unsigned __int64>>>, class std::allocator<class std::set<class std::tuple<int, bool, unsigned __int64>, struct std::less<class std::tuple<int, bool, unsigned __int64>>, class std::allocator<class std::tuple<int, bool, unsigned __int64>>>>> &);
+#endif
 #endif

+ 1 - 1
include/igl/copyleft/cgal/cell_adjacency.h

@@ -27,7 +27,7 @@ namespace igl
       //   num_cells        number of cells.
       //
       // Outputs:
-      //   adjacency_list  #C array of list of adjcent cell informations.  If
+      //   adjacency_list  #C array of list of adjcent cell information.  If
       //                   cell i and cell j are adjacent via patch x, where i
       //                   is on the positive side of x, and j is on the
       //                   negative side.  Then,

文件差异内容过多而无法显示
+ 2 - 1
include/igl/copyleft/cgal/closest_facet.cpp


+ 5 - 0
include/igl/copyleft/cgal/extract_cells.cpp

@@ -539,4 +539,9 @@ template unsigned long igl::copyleft::cgal::extract_cells<Eigen::Matrix<CGAL::La
 #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
 template unsigned long igl::copyleft::cgal::extract_cells<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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::Matrix<int, -1, -1, 0, -1, -1>, unsigned long, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
 template unsigned long igl::copyleft::cgal::extract_cells<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
+#ifdef WIN32
+template unsigned __int64 igl::copyleft::cgal::extract_cells<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned __int64, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>, class std::allocator<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &);
+template unsigned __int64 igl::copyleft::cgal::extract_cells<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned __int64, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>, class std::allocator<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &);
+template unsigned __int64 igl::copyleft::cgal::extract_cells<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, 3, 1, -1, 3>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned __int64, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 1, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>, class std::allocator<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &);
+#endif
 #endif

+ 2 - 0
include/igl/copyleft/cgal/half_space_box.cpp

@@ -113,6 +113,8 @@ IGL_INLINE void igl::copyleft::cgal::half_space_box(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template void igl::copyleft::cgal::half_space_box<Eigen::Matrix<double, -1, 3, 1, -1, 3> >(CGAL::Plane_3<CGAL::Epeck> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>&, Eigen::Matrix<int, 12, 3, 0, 12, 3>&);
+// generated by autoexplicit.sh
 template void igl::copyleft::cgal::half_space_box<Eigen::Matrix<float, -1, 3, 1, -1, 3> >(CGAL::Plane_3<CGAL::Epeck> const&, Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>&, Eigen::Matrix<int, 12, 3, 0, 12, 3>&);
 template void igl::copyleft::cgal::half_space_box<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4> > const&, Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>&, Eigen::Matrix<int, 12, 3, 0, 12, 3>&);
 template void igl::copyleft::cgal::half_space_box<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4> > const&, Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> > const&, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>&, Eigen::Matrix<int, 12, 3, 0, 12, 3>&);

+ 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.
-// 
+//
 // 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/.
 #include "insert_into_cdt.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::Exact_intersections_tag
-    > 
-  > 
+    >
+  >
   & cdt)
 {
   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
     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
     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
     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(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 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.
-// 
+//
 // 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/.
 #ifndef IGL_COPYLEFT_CGAL_INSERT_INTO_CDT_H
 #define IGL_COPYLEFT_CGAL_INSERT_INTO_CDT_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/Constrained_Delaunay_triangulation_2.h>
 #include <CGAL/Constrained_triangulation_plus_2.h>
@@ -33,7 +34,7 @@ namespace igl
       //   cdt  current CDT, see output
       // Outputs:
       //   cdt  CDT updated to contain constraints for the given object
-      // 
+      //
       template <typename Kernel>
       IGL_INLINE void insert_into_cdt(
         const CGAL::Object & obj,
@@ -46,8 +47,8 @@ namespace igl
               CGAL::Constrained_triangulation_face_base_2< Kernel>
             >,
             CGAL::Exact_intersections_tag
-          > 
-        > 
+          >
+        >
         & cdt);
     }
   }

+ 0 - 7
include/igl/copyleft/cgal/intersect_other.h

@@ -12,13 +12,6 @@
 
 #include <Eigen/Dense>
 
-#ifdef MEX
-#  include <mex.h>
-#  include <cassert>
-#  undef assert
-#  define assert( isOK ) ( (isOK) ? (void)0 : (void) mexErrMsgTxt(C_STR(__FILE__<<":"<<__LINE__<<": failed assertion `"<<#isOK<<"'"<<std::endl) ) )
-#endif
-
 namespace igl
 {
   namespace copyleft

+ 4 - 0
include/igl/copyleft/cgal/intersect_with_half_space.cpp

@@ -78,6 +78,10 @@ IGL_INLINE bool igl::copyleft::cgal::intersect_with_half_space(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template bool igl::copyleft::cgal::intersect_with_half_space<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -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 bool igl::copyleft::cgal::intersect_with_half_space<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<double>, Eigen::Matrix<double, 1, 3, 1, 1, 3> const>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<double>, Eigen::Matrix<double, 1, 3, 1, 1, 3> const> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -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 bool igl::copyleft::cgal::intersect_with_half_space<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, 1, 3, 1, 1, 3>, Eigen::Matrix<float, 1, 3, 1, 1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -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 bool igl::copyleft::cgal::intersect_with_half_space<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, 1, 3, 1, 1, 3>, Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<float>, Eigen::Matrix<float, 1, 3, 1, 1, 3> const>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<float>, Eigen::Matrix<float, 1, 3, 1, 1, 3> const> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);

+ 13 - 27
include/igl/copyleft/cgal/mesh_boolean.cpp

@@ -15,6 +15,7 @@
 #include "relabel_small_immersed_cells.h"
 #include "remesh_self_intersections.h"
 #include "string_to_mesh_boolean_type.h"
+#include "../../combine.h"
 #include "../../cumsum.h"
 #include "../../extract_manifold_patches.h"
 #include "../../get_seconds.h"
@@ -137,33 +138,11 @@ IGL_INLINE bool igl::copyleft::cgal::mesh_boolean(
     Eigen::PlainObjectBase<DerivedFC > & FC,
     Eigen::PlainObjectBase<DerivedJ > & J)
 {
-  assert(Flist.size() == Vlist.size() && "#Vlist and #Flist should match");
-  const size_t num_inputs = Vlist.size();
-  // Gather sizes
-  Eigen::Matrix<size_t,Eigen::Dynamic,1> sizes(num_inputs);
-  int numf = 0;
-  int numv = 0;
-  for(int i = 0;i<num_inputs;i++)
-  {
-    sizes(i) = Flist[i].rows();
-    numf += Flist[i].rows();
-    numv += Vlist[i].rows();
-  }
-  // Combined mesh
-  DerivedV VV(numv,3);
-  DerivedF FF(numf,3);
-  {
-    int fk = 0;
-    int vk = 0;
-    for(int i = 0;i<num_inputs;i++)
-    {
-      FF.block(fk,0,Flist[i].rows(),3) = Flist[i].array() + vk;
-      fk += Flist[i].rows();
-      VV.block(vk,0,Vlist[i].rows(),3) = Vlist[i];
-      vk += Vlist[i].rows();
-    }
-  }
-  return mesh_boolean(VV,FF,sizes,wind_num_op,keep,VC,FC,J);
+  DerivedV VV;
+  DerivedF FF;
+  Eigen::Matrix<size_t,Eigen::Dynamic,1> Vsizes,Fsizes;
+  igl::combine(Vlist,Flist,VV,FF,Vsizes,Fsizes);
+  return mesh_boolean(VV,FF,Fsizes,wind_num_op,keep,VC,FC,J);
 }
 
 template <
@@ -432,6 +411,10 @@ IGL_INLINE bool igl::copyleft::cgal::mesh_boolean(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -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 bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
+// generated by autoexplicit.sh
 template bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 // generated by autoexplicit.sh
 template bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
@@ -452,4 +435,7 @@ template bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_n
 template bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -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::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType 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 bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -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::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType 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 bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -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> >(std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, std::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1> > > const&, std::function<int (Eigen::Matrix<int, 1, -1, 1, 1, -1>)> const&, std::function<int (int, int)> 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> >&);
+#ifdef WIN32
+template bool igl::copyleft::cgal::mesh_boolean<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> const &, class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::MatrixBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> const &, class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, enum igl::MeshBooleanType const &, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+#endif
 #endif

+ 11 - 0
include/igl/copyleft/cgal/order_facets_around_edge.cpp

@@ -414,4 +414,15 @@ template void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<CGAL::
 template void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::copyleft::cgal::order_facets_around_edge<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::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
+#ifdef WIN32
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &, bool);
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &, bool);
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, 3, 1, -1, 3>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 1, -1, 3>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, 3, 1, -1, 3>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 1, -1, 3>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &, bool);
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 0, -1, 3>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<double, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<double, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<double, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::order_facets_around_edge<class Eigen::Matrix<double, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<double, -1, 3, 0, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 0, -1, 3>> const &, unsigned __int64, unsigned __int64, class std::vector<int, class std::allocator<int>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<double, -1, 3, 0, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+#endif
 #endif

+ 2 - 2
include/igl/copyleft/cgal/order_facets_around_edge.h

@@ -31,7 +31,7 @@ namespace igl
       //   V  #V by 3 list of vertices.
       //   F  #F by 3 list of faces
       //   s  Index of source vertex.
-      //   d  Index of desination vertex.
+      //   d  Index of destination vertex.
       //   adj_faces  List of adjacent face signed indices.
       // Output:
       //   order  List of face indices that orders adjacent faces around edge
@@ -50,7 +50,7 @@ namespace igl
           Eigen::PlainObjectBase<DerivedI>& order,
           bool debug=false);
 
-      // This funciton is a wrapper around the one above.  Since the ordering
+      // This function is a wrapper around the one above.  Since the ordering
       // is circular, the pivot point is used to define a starting point.  So
       // order[0] is the index into adj_face that is immediately after the
       // pivot face (s, d, pivot point) in clockwise order.

+ 11 - 0
include/igl/copyleft/cgal/outer_element.cpp

@@ -218,4 +218,15 @@ template void igl::copyleft::cgal::outer_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<
 template void igl::copyleft::cgal::outer_edge<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);
 template void igl::copyleft::cgal::outer_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);
 template void igl::copyleft::cgal::outer_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);
+#ifdef WIN32
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<long, -1, 1, 0, -1, 1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<long, -1, 1, 0, -1, 1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, 3, 1, -1, 3>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 1, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 3, 0, -1, 3>, class Eigen::Matrix<long, -1, 1, 0, -1, 1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 0, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<long, -1, 1, 0, -1, 1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<double, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<double, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<double, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<double, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<double, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, -1, 1, -1, -1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<double, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 1, -1, -1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::outer_edge<class Eigen::Matrix<double, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 3, 0, -1, 3>, class Eigen::Matrix<long, -1, 1, 0, -1, 1>, __int64, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<double, -1, 3, 0, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 0, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<long, -1, 1, 0, -1, 1>> const &, __int64 &, __int64 &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &);
+#endif
 #endif

+ 5 - 0
include/igl/copyleft/cgal/outer_facet.cpp

@@ -172,4 +172,9 @@ template void igl::copyleft::cgal::outer_facet<Eigen::Matrix<CGAL::Lazy_exact_nt
 template void igl::copyleft::cgal::outer_facet<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);
 template void igl::copyleft::cgal::outer_facet<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int&, bool&);
 template void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -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<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int&, bool&);
+#ifdef WIN32
+template void igl::copyleft::cgal::outer_facet<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned __int64>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, unsigned __int64 &, bool &);
+template void igl::copyleft::cgal::outer_facet<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned __int64>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, unsigned __int64 &, bool &);
+template void igl::copyleft::cgal::outer_facet<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, 3, 1, -1, 3>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned __int64>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 1, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, unsigned __int64 &, bool &);
+#endif
 #endif

+ 1 - 1
include/igl/copyleft/cgal/outer_facet.h

@@ -26,7 +26,7 @@ namespace igl
         // See cgal::remesh_self_intersections.h for how to obtain such input.
         //
         // This function differ from igl::outer_facet() in the fact this
-        // funciton is more robust because it does not rely on facet normals.
+        // function is more robust because it does not rely on facet normals.
         //
         // Inputs:
         //   V  #V by 3 list of vertex positions

+ 1 - 1
include/igl/copyleft/cgal/point_mesh_squared_distance.cpp

@@ -81,7 +81,7 @@ IGL_INLINE void igl::copyleft::cgal::point_mesh_squared_distance_precompute(
   // accelerate_distance_queries doesn't seem actually to do _all_ of the
   // precomputation. the tree (despite being const) will still do more
   // precomputation and reorganizing on the first call of `closest_point` or
-  // `closest_point_and_primitive`. Therefor, call it once here.
+  // `closest_point_and_primitive`. Therefore, call it once here.
   tree.closest_point_and_primitive(Point_3(0,0,0));
 }
 

+ 1 - 1
include/igl/copyleft/cgal/points_inside_component.cpp

@@ -321,7 +321,7 @@ IGL_INLINE void igl::copyleft::cgal::points_inside_component(
                 inside(i,0) = determine_point_face_orientation(V, F, I, query, fid);
                 break;
             default:
-                throw "Unknow closest element type!";
+                throw "Unknown closest element type!";
         }
     }
 }

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

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // 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/.
 #include "projected_cdt.h"
 #include "insert_into_cdt.h"
@@ -29,8 +29,8 @@ IGL_INLINE void igl::copyleft::cgal::projected_cdt(
   size_t count=0;
   for (
     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()));
     v2i[itr] = count;
@@ -39,10 +39,10 @@ IGL_INLINE void igl::copyleft::cgal::projected_cdt(
   // Read off faces and store index triples
   for (
     auto itr = cdt.finite_faces_begin();
-    itr != cdt.finite_faces_end(); 
+    itr != cdt.finite_faces_end();
     itr++)
   {
-    faces.push_back( 
+    faces.push_back(
       { v2i[itr->vertex(0)], v2i[itr->vertex(1)], v2i[itr->vertex(2)] });
   }
 }
@@ -75,4 +75,8 @@ template void igl::copyleft::cgal::projected_cdt<CGAL::Epick, long>(std::vector<
 // generated by autoexplicit.sh
 template void igl::copyleft::cgal::projected_cdt<CGAL::Epeck, long>(std::vector<CGAL::Object, std::allocator<CGAL::Object> > const&, CGAL::Plane_3<CGAL::Epeck> const&, std::vector<CGAL::Point_3<CGAL::Epeck>, std::allocator<CGAL::Point_3<CGAL::Epeck> > >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);
 #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
+#ifdef WIN32
+template void igl::copyleft::cgal::projected_cdt<class CGAL::Epeck, __int64>(class std::vector<class CGAL::Object, class std::allocator<class CGAL::Object>> const &, class CGAL::Plane_3<class CGAL::Epeck> const &, class std::vector<class CGAL::Point_3<class CGAL::Epeck>, class std::allocator<class CGAL::Point_3<class CGAL::Epeck>>> &, class std::vector<class std::vector<__int64, class std::allocator<__int64>>, class std::allocator<class std::vector<__int64, class std::allocator<__int64>>>> &);
+template void igl::copyleft::cgal::projected_cdt<class CGAL::Epick, __int64>(class std::vector<class CGAL::Object, class std::allocator<class CGAL::Object>> const &, class CGAL::Plane_3<class CGAL::Epick> const &, class std::vector<class CGAL::Point_3<class CGAL::Epick>, class std::allocator<class CGAL::Point_3<class CGAL::Epick>>> &, class std::vector<class std::vector<__int64, class std::allocator<__int64>>, class std::allocator<class std::vector<__int64, class std::allocator<__int64>>>> &);
+#endif
 #endif

+ 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.
-// 
+//
 // 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/.
 #ifndef IGL_COPYLEFT_CGAL_PROJECTED_CDT_H
 #define IGL_COPYLEFT_CGAL_PROJECTED_CDT_H
@@ -11,6 +11,7 @@
 #include <Eigen/Core>
 #include <CGAL/Plane_3.h>
 #include <CGAL/Point_3.h>
+#include <CGAL/Object.h>
 #include <vector>
 namespace igl
 {
@@ -32,7 +33,7 @@ namespace igl
       // Outputs:
       //   vertices  list of vertices of the CDT mesh _back on the 3D plane_
       //   faces  list of list of triangle indices into vertices
-      //   
+      //
       template <typename Kernel, typename Index>
       IGL_INLINE void projected_cdt(
         const std::vector<CGAL::Object> & objects,

+ 8 - 3
include/igl/copyleft/cgal/propagate_winding_numbers.cpp

@@ -118,10 +118,11 @@ IGL_INLINE bool igl::copyleft::cgal::propagate_winding_numbers(
 #endif
 
   bool valid = true;
-  if (!piecewise_constant_winding_number(F, uE, uE2E)) 
+  // https://github.com/libigl/libigl/issues/674
+  if (!igl::piecewise_constant_winding_number(F, uE, uE2E)) 
   {
-    assert(false && "Input mesh is not orientable");
-    std::cerr << "Input mesh is not orientable!" << std::endl;
+    assert(false && "Input mesh is not PWN");
+    std::cerr << "Input mesh is not PWN!" << std::endl;
     valid = false;
   }
 
@@ -316,4 +317,8 @@ template bool igl::copyleft::cgal::propagate_winding_numbers<Eigen::Matrix<CGAL:
 // generated by autoexplicit.sh
 template bool igl::copyleft::cgal::propagate_winding_numbers<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned long, 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::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, unsigned long, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, unsigned long, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
 template bool igl::copyleft::cgal::propagate_winding_numbers<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
+#ifdef WIN32
+template bool igl::copyleft::cgal::propagate_winding_numbers<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned __int64, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>, class std::allocator<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>>> const &, unsigned __int64, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, unsigned __int64, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &);
+template bool igl::copyleft::cgal::propagate_winding_numbers<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>, class Eigen::Matrix<int, -1, 3, 1, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned __int64, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 1, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 1, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>, class std::allocator<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>>> const &, unsigned __int64, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, unsigned __int64, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &);
+#endif
 #endif

+ 22 - 12
include/igl/copyleft/cgal/remesh_intersections.cpp

@@ -10,6 +10,7 @@
 #include "assign_scalar.h"
 #include "projected_cdt.h"
 #include "../../get_seconds.h"
+#include "../../parallel_for.h"
 #include "../../LinSpaced.h"
 #include "../../unique_rows.h"
 
@@ -375,18 +376,21 @@ IGL_INLINE void igl::copyleft::cgal::remesh_intersections(
     std::vector<std::vector<Point_3> > cdt_vertices(num_cdts);
     std::vector<std::vector<std::vector<Index> > > cdt_faces(num_cdts);
 
-    const auto cdt = [&](const size_t first, const size_t last) 
+    //// Not clear whether this is safe because of reference counting on Point_3
+    //// objects...
+    //// 
+    //// I tried it and got random segfaults (via MATLAB). Seems this is not
+    //// safe.
+    //igl::parallel_for(num_cdts,[&](int i)
+    for (size_t i=0; i<num_cdts; i++) 
     {
-      for (size_t i=first; i<last; i++) 
-      {
-        auto& vertices = cdt_vertices[i];
-        auto& faces = cdt_faces[i];
-        const auto& P = cdt_inputs[i].first;
-        const auto& involved_faces = cdt_inputs[i].second;
-        delaunay_triangulation(P, involved_faces, vertices, faces);
-      }
-    };
-    cdt(0, num_cdts);
+      auto& vertices = cdt_vertices[i];
+      auto& faces = cdt_faces[i];
+      const auto& P = cdt_inputs[i].first;
+      const auto& involved_faces = cdt_inputs[i].second;
+      delaunay_triangulation(P, involved_faces, vertices, faces);
+    }
+    //,1000);
 #ifdef REMESH_INTERSECTIONS_TIMING
     log_time("cdt");
 #endif
@@ -449,7 +453,7 @@ IGL_INLINE void igl::copyleft::cgal::remesh_intersections(
           FF.data(), [&vv_to_unique](const typename DerivedFF::Scalar& a)
           { return vv_to_unique[a]; });
       IM.resize(unique_vv.rows());
-      // Have to use << instead of = becasue Eigen's PlainObjectBase is annoying
+      // Have to use << instead of = because Eigen's PlainObjectBase is annoying
       IM << igl::LinSpaced<
         Eigen::Matrix<typename DerivedIM::Scalar, Eigen::Dynamic,1 >
         >(unique_vv.rows(), 0, unique_vv.rows()-1);
@@ -511,4 +515,10 @@ template void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy
 template void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1,   0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck,   Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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> >(Eigen::MatrixBase<Eigen::Matrix<double,   -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0,   -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>,   std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&,   std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index,   std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index,   CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1,   0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1,   -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int,   -1, -1, 0, -1, -1>::Index const,   std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index,   CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1,   0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool,   Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3,   0, -1, 3> >&, 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> >&);
+#ifdef WIN32
+template void igl::copyleft::cgal::remesh_intersections<class Eigen::Matrix<double, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class CGAL::Epeck, class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<double, -1, 3, 0, -1, 3>> const &, class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class CGAL::Triangle_3<class CGAL::Epeck>, class std::allocator<class CGAL::Triangle_3<class CGAL::Epeck>>> const &, class std::map<__int64, class std::vector<struct std::pair<__int64, class CGAL::Object>, class std::allocator<struct std::pair<__int64, class CGAL::Object>>>, struct std::less<__int64>, class std::allocator<struct std::pair<__int64 const, class std::vector<struct std::pair<__int64, class CGAL::Object>, class std::allocator<struct std::pair<__int64, class CGAL::Object>>>>>> const &, bool, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::remesh_intersections<class Eigen::Matrix<double, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class CGAL::Epick, class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<double, -1, 3, 0, -1, 3>> const &, class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class CGAL::Triangle_3<class CGAL::Epick>, class std::allocator<class CGAL::Triangle_3<class CGAL::Epick>>> const &, class std::map<__int64, class std::vector<struct std::pair<__int64, class CGAL::Object>, class std::allocator<struct std::pair<__int64, class CGAL::Object>>>, struct std::less<__int64>, class std::allocator<struct std::pair<__int64 const, class std::vector<struct std::pair<__int64, class CGAL::Object>, class std::allocator<struct std::pair<__int64, class CGAL::Object>>>>>> const &, bool, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::remesh_intersections<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class CGAL::Epeck, class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> const &, class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class CGAL::Triangle_3<class CGAL::Epeck>, class std::allocator<class CGAL::Triangle_3<class CGAL::Epeck>>> const &, class std::map<__int64, class std::vector<struct std::pair<__int64, class CGAL::Object>, class std::allocator<struct std::pair<__int64, class CGAL::Object>>>, struct std::less<__int64>, class std::allocator<struct std::pair<__int64 const, class std::vector<struct std::pair<__int64, class CGAL::Object>, class std::allocator<struct std::pair<__int64, class CGAL::Object>>>>>> const &, bool, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::remesh_intersections<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class CGAL::Epick, class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> const &, class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class std::vector<class CGAL::Triangle_3<class CGAL::Epick>, class std::allocator<class CGAL::Triangle_3<class CGAL::Epick>>> const &, class std::map<__int64, class std::vector<struct std::pair<__int64, class CGAL::Object>, class std::allocator<struct std::pair<__int64, class CGAL::Object>>>, struct std::less<__int64>, class std::allocator<struct std::pair<__int64 const, class std::vector<struct std::pair<__int64, class CGAL::Object>, class std::allocator<struct std::pair<__int64, class CGAL::Object>>>>>> const &, bool, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+#endif
 #endif

+ 1 - 1
include/igl/copyleft/cgal/remesh_intersections.h

@@ -30,7 +30,7 @@ namespace igl
       //   offending #offending map taking face indices into F to pairs of order
       //     of first finding and list of intersection objects from all
       //     intersections
-      //   stitch_all  if true, merge all vertices with thte same coordiante.
+      //   stitch_all  if true, merge all vertices with the same coordinate.
       // Outputs:
       //   VV  #VV by 3 list of vertex positions, if stitch_all = false then
       //     first #V vertices will always be V

+ 4 - 0
include/igl/copyleft/cgal/remesh_self_intersections.cpp

@@ -101,4 +101,8 @@ template void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<CGAL:
 template void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -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> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
+#ifdef WIN32
+template void igl::copyleft::cgal::remesh_self_intersections<class Eigen::Matrix<double, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<double, -1, 3, 0, -1, 3>> const &, class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, struct igl::copyleft::cgal::RemeshSelfIntersectionsParam const &, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template void igl::copyleft::cgal::remesh_self_intersections<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, 3, 0, -1, 3>> const &, class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, struct igl::copyleft::cgal::RemeshSelfIntersectionsParam const &, class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>> &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+#endif
 #endif

+ 1 - 1
include/igl/copyleft/cgal/trim_with_solid.cpp

@@ -56,7 +56,7 @@ IGL_INLINE void igl::copyleft::cgal::trim_with_solid(
   igl::slice_mask(Eigen::MatrixXi(F),A,1,F);
   igl::slice_mask(Eigen::VectorXi(P),A,1,P);
   igl::slice_mask(Eigen::VectorXi(J),A,1,J);
-  // Agregate representative query points for each patch
+  // Aggregate representative query points for each patch
   std::vector<bool> flag(num_patches);
   std::vector<std::vector<CGAL::Epeck::FT> > vQ;
   Eigen::VectorXi P2Q(num_patches);

+ 42 - 8
include/igl/copyleft/cgal/wire_mesh.cpp

@@ -18,6 +18,7 @@ IGL_INLINE void igl::copyleft::cgal::wire_mesh(
   const Eigen::MatrixBase<DerivedWE> & WE,
   const double th,
   const int poly_size,
+  const bool solid,
   Eigen::PlainObjectBase<DerivedV> & V,
   Eigen::PlainObjectBase<DerivedF> & F,
   Eigen::PlainObjectBase<DerivedJ> & J)
@@ -68,6 +69,8 @@ IGL_INLINE void igl::copyleft::cgal::wire_mesh(
     A[WE(e,1)].emplace_back(e,1);
     typedef Eigen::Matrix<Scalar,1,3> RowVector3S;
     const RowVector3S ev = WV.row(WE(e,1))-WV.row(WE(e,0));
+    const Scalar len = ev.norm();
+    // Unit edge vector
     const RowVector3S uv = ev.normalized();
     Eigen::Quaternion<Scalar> q;
     q = q.FromTwoVectors(RowVector3S(0,0,1),uv);
@@ -78,9 +81,16 @@ IGL_INLINE void igl::copyleft::cgal::wire_mesh(
       // loop over endpoints
       for(int c = 0;c<2;c++)
       {
-        // Move to endpoint, offset by factor of thickness
+        // Direction moving along edge vector
+        const Scalar dir = c==0?1:-1;
+        // Amount (distance) to move along edge vector
+        // Start with factor of thickness;
+        // Max out amount at 1/3 of edge length so that there's always some
+        // amount of edge
+        Scalar dist = std::min(1.*th,len/3.0);
+        // Move to endpoint, offset by amount
         V.row(index(e,c,p)) = 
-          qp+WV.row(WE(e,c)) + 1.*th*Scalar(1-2*c)*uv;
+          qp+WV.row(WE(e,c)) + dist*dir*uv;
       }
     }
   }
@@ -166,12 +176,36 @@ IGL_INLINE void igl::copyleft::cgal::wire_mesh(
   }
 
   list_to_matrix(vF,F);
-  // Self-union to clean up 
-  igl::copyleft::cgal::mesh_boolean(
-    Eigen::MatrixXd(V),Eigen::MatrixXi(F),Eigen::MatrixXd(),Eigen::MatrixXi(),
-    "union",
-    V,F,J);
-  for(int j=0;j<J.size();j++) J(j) = vJ[J(j)];
+  if(solid)
+  {
+    // Self-union to clean up 
+    igl::copyleft::cgal::mesh_boolean(
+      Eigen::MatrixXd(V),Eigen::MatrixXi(F),Eigen::MatrixXd(),Eigen::MatrixXi(),
+      "union",
+      V,F,J);
+    for(int j=0;j<J.size();j++) J(j) = vJ[J(j)];
+  }else
+  {
+    list_to_matrix(vJ,J);
+  }
+}
+
+template <
+  typename DerivedWV,
+  typename DerivedWE,
+  typename DerivedV,
+  typename DerivedF,
+  typename DerivedJ>
+IGL_INLINE void igl::copyleft::cgal::wire_mesh(
+  const Eigen::MatrixBase<DerivedWV> & WV,
+  const Eigen::MatrixBase<DerivedWE> & WE,
+  const double th,
+  const int poly_size,
+  Eigen::PlainObjectBase<DerivedV> & V,
+  Eigen::PlainObjectBase<DerivedF> & F,
+  Eigen::PlainObjectBase<DerivedJ> & J)
+{
+  return wire_mesh(WV,WE,th,poly_size,true,V,F,J);
 }
 
 #ifdef IGL_STATIC_LIBRARY

+ 35 - 16
include/igl/copyleft/cgal/wire_mesh.h

@@ -6,24 +6,26 @@ namespace igl
 {
   namespace copyleft
   {
-    // Construct a "wire" or "wireframe" or "strut" surface mesh, given a
-    // one-dimensional network of straight edges.
-    //
-    // Inputs:
-    //   WV  #WV by 3 list of vertex positions
-    //   WE  #WE by 2 list of edge indices into WV
-    //   th  diameter thickness of wire 
-    //   poly_size  number of sides on each wire (e.g., 4 would produce wires by
-    //     connecting rectangular prisms).
-    // Outputs:
-    //   V  #V by 3 list of output vertices
-    //   F  #F by 3 list of output triangle indices into V
-    //   J  #F list of indices into [0,#WV+#WE) revealing "birth simplex" of
-    //     output faces J(j) < #WV means the face corresponds to the J(j)th
-    //     vertex in WV. J(j) >= #WV means the face corresponds to the
-    //     (J(j)-#WV)th edge in WE.
     namespace cgal
     {
+      // Construct a "wire" or "wireframe" or "strut" surface mesh, given a
+      // one-dimensional network of straight edges.
+      //
+      // Inputs:
+      //   WV  #WV by 3 list of vertex positions
+      //   WE  #WE by 2 list of edge indices into WV
+      //   th  diameter thickness of wire 
+      //   poly_size  number of sides on each wire (e.g., 4 would produce wires by
+      //     connecting rectangular prisms).
+      //   solid  whether to resolve self-intersections to
+      //     create a "solid" output mesh (cf., [Zhou et al. 2016]
+      // Outputs:
+      //   V  #V by 3 list of output vertices
+      //   F  #F by 3 list of output triangle indices into V
+      //   J  #F list of indices into [0,#WV+#WE) revealing "birth simplex" of
+      //     output faces J(j) < #WV means the face corresponds to the J(j)th
+      //     vertex in WV. J(j) >= #WV means the face corresponds to the
+      //     (J(j)-#WV)th edge in WE.
       template <
         typename DerivedWV,
         typename DerivedWE,
@@ -35,9 +37,26 @@ namespace igl
         const Eigen::MatrixBase<DerivedWE> & WE,
         const double th,
         const int poly_size,
+        const bool solid,
         Eigen::PlainObjectBase<DerivedV> & V,
         Eigen::PlainObjectBase<DerivedF> & F,
         Eigen::PlainObjectBase<DerivedJ> & J);
+      // Default with solid=true
+      template <
+        typename DerivedWV,
+        typename DerivedWE,
+        typename DerivedV,
+        typename DerivedF,
+        typename DerivedJ>
+      IGL_INLINE void wire_mesh(
+        const Eigen::MatrixBase<DerivedWV> & WV,
+        const Eigen::MatrixBase<DerivedWE> & WE,
+        const double th,
+        const int poly_size,
+        Eigen::PlainObjectBase<DerivedV> & V,
+        Eigen::PlainObjectBase<DerivedF> & F,
+        Eigen::PlainObjectBase<DerivedJ> & J);
+
     }
   }
 }

+ 1 - 1
include/igl/copyleft/comiso/miq.h

@@ -43,7 +43,7 @@ namespace igl
     //   UV             #UV by 2 list of vertices in 2D
     //   FUV            #FUV by 3 list of face indices in UV
     //
-    // TODO: rename the parameters name in the cpp consistenly
+    // TODO: rename the parameters name in the cpp consistently
     //       improve the handling of hard_features, right now it might fail in difficult cases
 
     template <typename DerivedV, typename DerivedF, typename DerivedU>

+ 1 - 1
include/igl/copyleft/comiso/nrosy.h

@@ -32,7 +32,7 @@ namespace igl
     //   w_soft  #S by 1 weight for the soft constraints (0-1)
     //   bc_soft #S by 3 bc for soft constraints
     //   N       the degree of the N-RoSy vector field
-    //   soft    the strenght of the soft contraints w.r.t. smoothness
+    //   soft    the strength of the soft constraints w.r.t. smoothness
     //           (0 -> smoothness only, 1->constraints only)
     // Outputs:
     //   R       #F by 3 the representative vectors of the interpolated field

+ 3 - 0
include/igl/copyleft/marching_cubes.cpp

@@ -211,6 +211,7 @@ public:
     if (num_vertices > vertices.rows())
       vertices.conservativeResize(vertices.rows()+10000, Eigen::NoChange);
 
+    // Linear interpolation based on linearly interpolating values
     vertices.row(num_vertices-1)  = ((1.0f-t)*p0 + t*p1).template cast<typename Derivedvertices::Scalar>();
     edge2vertex[EdgeKey(i0, i1)] = num_vertices-1;
 
@@ -244,6 +245,8 @@ IGL_INLINE void igl::copyleft::marching_cubes(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template void igl::copyleft::marching_cubes<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, unsigned int, unsigned int, unsigned int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);
+// generated by autoexplicit.sh
 template void igl::copyleft::marching_cubes<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, unsigned int, unsigned int, unsigned int, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);
 // generated by autoexplicit.sh
 template void igl::copyleft::marching_cubes<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, unsigned int, unsigned int, unsigned int, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);

+ 4 - 11
include/igl/copyleft/offset_surface.cpp

@@ -4,13 +4,11 @@
 #include "../signed_distance.h"
 #include "../flood_fill.h"
 #include <cassert>
-#include <iostream>
 
 template <
   typename DerivedV,
   typename DerivedF,
   typename isolevelType,
-  typename sType,
   typename DerivedSV,
   typename DerivedSF,
   typename DerivedGV,
@@ -20,7 +18,7 @@ void igl::copyleft::offset_surface(
   const Eigen::MatrixBase<DerivedV> & V,
   const Eigen::MatrixBase<DerivedF> & F,
   const isolevelType isolevel,
-  const sType s,
+  const typename Derivedside::Scalar s,
   const SignedDistanceType & signed_distance_type,
   Eigen::PlainObjectBase<DerivedSV> & SV,
   Eigen::PlainObjectBase<DerivedSF> & SF,
@@ -60,12 +58,7 @@ void igl::copyleft::offset_surface(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
-template void igl::copyleft::offset_surface<Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, float, int, Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, 3, 1, 0, 3, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, float, int, igl::SignedDistanceType const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 3, 1, 0, 3, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);
-// generated by autoexplicit.sh
-template void igl::copyleft::offset_surface<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, float, int, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, 3, 1, 0, 3, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, float, int, igl::SignedDistanceType const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 3, 1, 0, 3, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);
-// generated by autoexplicit.sh
-template void igl::copyleft::offset_surface<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, 3, 1, 0, 3, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double, int, igl::SignedDistanceType 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<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 3, 1, 0, 3, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
-// generated by autoexplicit.sh
-template void igl::copyleft::offset_surface<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, float, int, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<float, 1, 3, 1, 1, 3>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, float, int, igl::SignedDistanceType const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);
-template void igl::copyleft::offset_surface<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double, int, igl::SignedDistanceType 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<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
+template void igl::copyleft::offset_surface<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, double, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, double, Eigen::Matrix<int, 1, 3, 1, 1, 3>::Scalar, igl::SignedDistanceType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
+template void igl::copyleft::offset_surface<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, float, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, float, Eigen::Matrix<int, 1, 3, 1, 1, 3>::Scalar, igl::SignedDistanceType const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);
+template void igl::copyleft::offset_surface<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double, Eigen::Matrix<int, 1, 3, 1, 1, 3>::Scalar, igl::SignedDistanceType 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<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
 #endif

+ 2 - 3
include/igl/copyleft/offset_surface.h

@@ -8,7 +8,7 @@ namespace igl
 {
   namespace copyleft
   {
-    // Compute a triangulated offset surface using maching cubes on a gride of
+    // Compute a triangulated offset surface using matching cubes on a grid of
     // signed distance values from the input triangle mesh.
     //
     // Inputs:
@@ -30,7 +30,6 @@ namespace igl
       typename DerivedV,
       typename DerivedF,
       typename isolevelType,
-      typename sType,
       typename DerivedSV,
       typename DerivedSF,
       typename DerivedGV,
@@ -40,7 +39,7 @@ namespace igl
       const Eigen::MatrixBase<DerivedV> & V,
       const Eigen::MatrixBase<DerivedF> & F,
       const isolevelType isolevel,
-      const sType s,
+      const typename Derivedside::Scalar s,
       const SignedDistanceType & signed_distance_type,
       Eigen::PlainObjectBase<DerivedSV> & SV,
       Eigen::PlainObjectBase<DerivedSF> & SF,

+ 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 "tga.h"
 
-#include "gl.h"
+#include "../../opengl2/gl.h"
 
 #include <cstdlib>
 

+ 2 - 2
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/.
 #ifndef IGL_OPENGL_RENDER_TO_TGA_H
 #define IGL_OPENGL_RENDER_TO_TGA_H
-#include "../igl_inline.h"
+#include "../../igl_inline.h"
 #include <string>
 
 namespace igl
@@ -20,7 +20,7 @@ namespace igl
     //   width  width of scene and resulting image
     //   height height of scene and resulting image
     ///  alpha  whether to include alpha channel
-    // Returns true only if no errors occured
+    // Returns true only if no errors occurred
     //
     // See also: png/render_to_png which is slower but writes .png files
     IGL_INLINE bool render_to_tga(

+ 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/.
 #ifndef 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>
 
 namespace igl

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

@@ -41,7 +41,7 @@
  */
 
 #include "tga.h"
-#include "glext.h"
+#include "../../opengl2/glext.h"
 #include <stdio.h>
 #include <stdlib.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/.
 #ifndef 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
 /* tga.h - interface for TrueVision (TGA) image file loader */
 #include <stdio.h>

+ 1 - 1
include/igl/copyleft/tetgen/cdt.h

@@ -34,7 +34,7 @@ namespace igl
         // Flags to tetgen. Do not include the "c" flag here! {"Y"}
         std::string flags = "Y";
       };
-      // Create a constrained delaunay tesselation containing convex hull of the
+      // Create a constrained delaunay tessellation containing convex hull of the
       // given **non-selfintersecting** mesh.
       //
       // Inputs:

+ 2 - 2
include/igl/copyleft/tetgen/read_into_tetgenio.h

@@ -30,8 +30,8 @@ namespace igl
       //   .medit
       //   .vtk
       //   etc.
-      // Noteably it does not support .obj which is loaded by hand here (also
-      // demonstrating how to load points/faces programatically)
+      // Notably it does not support .obj which is loaded by hand here (also
+      // demonstrating how to load points/faces programmatically)
       //
       // If the file extension is not recognized the filename is assumed to be
       // the basename of a collection describe a tetmesh, (of which at least

+ 1 - 1
include/igl/cotmatrix.h

@@ -16,7 +16,7 @@
 //  Used const references rather than copying the entire mesh 
 //    Alec 9 October 2011
 //  removed cotan (uniform weights) optional parameter it was building a buggy
-//    half of the uniform laplacian, please see adjacency_matrix istead 
+//    half of the uniform laplacian, please see adjacency_matrix instead 
 //    Alec 9 October 2011
 
 namespace igl 

+ 2 - 2
include/igl/cotmatrix_entries.cpp

@@ -35,10 +35,10 @@ IGL_INLINE void igl::cotmatrix_entries(
     case 3:
     {
       // Triangles
-      //Compute Squared Edge lenghts 
+      //Compute Squared Edge lengths 
       Matrix<typename DerivedC::Scalar,Dynamic,3> l2;
       igl::squared_edge_lengths(V,F,l2);
-      //Compute Edge lenghts 
+      //Compute Edge lengths 
       Matrix<typename DerivedC::Scalar,Dynamic,3> l;
       l = l2.array().sqrt();
       

+ 1 - 1
include/igl/crouzeix_raviart_cotmatrix.cpp

@@ -19,7 +19,7 @@ void igl::crouzeix_raviart_cotmatrix(
   Eigen::PlainObjectBase<DerivedE> & E,
   Eigen::PlainObjectBase<DerivedEMAP> & EMAP)
 {
-  // All occurances of directed "facets"
+  // All occurrences of directed "facets"
   Eigen::MatrixXi allE;
   oriented_facets(F,allE);
   Eigen::VectorXi _1;

+ 1 - 1
include/igl/crouzeix_raviart_massmatrix.cpp

@@ -24,7 +24,7 @@ void igl::crouzeix_raviart_massmatrix(
     Eigen::PlainObjectBase<DerivedE> & E,
     Eigen::PlainObjectBase<DerivedEMAP> & EMAP)
 {
-  // All occurances of directed "facets"
+  // All occurrences of directed "facets"
   Eigen::MatrixXi allE;
   oriented_facets(F,allE);
   Eigen::VectorXi _1;

+ 4 - 0
include/igl/cumsum.cpp

@@ -64,4 +64,8 @@ template void igl::cumsum<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<
 template void igl::cumsum<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);
 template void igl::cumsum<Eigen::Matrix<unsigned long, 2, 1, 0, 2, 1>, Eigen::Matrix<unsigned long, 2, 1, 0, 2, 1> >(Eigen::MatrixBase<Eigen::Matrix<unsigned long, 2, 1, 0, 2, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<unsigned long, 2, 1, 0, 2, 1> >&);
 template void igl::cumsum<Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1>, Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1> >&);
+#ifdef WIN32
+template void igl::cumsum<class Eigen::Matrix<unsigned __int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<unsigned __int64, -1, 1, 0, -1, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<unsigned __int64, -1, 1, 0, -1, 1>> const &, int, class Eigen::PlainObjectBase<class Eigen::Matrix<unsigned __int64, -1, 1, 0, -1, 1>> &);
+template void igl::cumsum<class Eigen::Matrix<unsigned __int64, 2, 1, 0, 2, 1>, class Eigen::Matrix<unsigned __int64, 2, 1, 0, 2, 1>>(class Eigen::MatrixBase<class Eigen::Matrix<unsigned __int64, 2, 1, 0, 2, 1>> const &, int, class Eigen::PlainObjectBase<class Eigen::Matrix<unsigned __int64, 2, 1, 0, 2, 1>> &);
+#endif
 #endif

+ 3 - 3
include/igl/cut_mesh.cpp

@@ -70,11 +70,11 @@ namespace igl {
     IGL_INLINE void FindInitialPos(const int vert, int &edge, int &face);
 
 
-    // intialize the mapping given an initial pos
+    // initialize the mapping given an initial pos
     // whih must be initialized with FindInitialPos
     IGL_INLINE void MapIndexes(const int  vert, const int edge_init, const int f_init);
 
-    // intialize the mapping for a given vertex
+    // initialize the mapping for a given vertex
     IGL_INLINE void InitMappingSeam(const int vert);
 
   };
@@ -187,7 +187,7 @@ FindInitialPos(const int vert,
 
 
 
-///intialize the mapping given an initial pos
+///initialize the mapping given an initial pos
 ///whih must be initialized with FindInitialPos
 template <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>
 IGL_INLINE void igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::

+ 1 - 1
include/igl/directed_edge_parents.h

@@ -13,7 +13,7 @@
 
 namespace igl
 {
-  // Recover "parents" (preceeding edges) in a tree given just directed edges.
+  // Recover "parents" (preceding edges) in a tree given just directed edges.
   //
   // Inputs:
   //   E  #E by 2 list of directed edges

+ 1 - 0
include/igl/edges.cpp

@@ -7,6 +7,7 @@
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "edges.h"
 #include "adjacency_matrix.h"
+#include <iostream>
 
 template <typename DerivedF, typename DerivedE>
 IGL_INLINE void igl::edges(

+ 4 - 4
include/igl/embree/EmbreeIntersector.h

@@ -209,7 +209,7 @@ inline void igl::embree::EmbreeIntersector::global_init()
   {
     rtcInit();
     if(rtcGetError() != RTC_NO_ERROR)
-      std::cerr << "Embree: An error occured while initialiting embree core!" << std::endl;
+      std::cerr << "Embree: An error occurred while initializing embree core!" << std::endl;
 #ifdef IGL_VERBOSE
     else
       std::cerr << "Embree: core initialized." << std::endl;
@@ -324,7 +324,7 @@ inline void igl::embree::EmbreeIntersector::init(
   rtcCommit(scene);
 
   if(rtcGetError() != RTC_NO_ERROR)
-      std::cerr << "Embree: An error occured while initializing the provided geometry!" << endl;
+      std::cerr << "Embree: An error occurred while initializing the provided geometry!" << endl;
 #ifdef IGL_VERBOSE
   else
     std::cerr << "Embree: geometry added." << endl;
@@ -348,7 +348,7 @@ void igl::embree::EmbreeIntersector::deinit()
 
     if(rtcGetError() != RTC_NO_ERROR)
     {
-        std::cerr << "Embree: An error occured while resetting!" << std::endl;
+        std::cerr << "Embree: An error occurred while resetting!" << std::endl;
     }
 #ifdef IGL_VERBOSE
     else
@@ -374,7 +374,7 @@ inline bool igl::embree::EmbreeIntersector::intersectRay(
   rtcIntersect(scene,ray);
 #ifdef IGL_VERBOSE
   if(rtcGetError() != RTC_NO_ERROR)
-      std::cerr << "Embree: An error occured while resetting!" << std::endl;
+      std::cerr << "Embree: An error occurred while resetting!" << std::endl;
 #endif
 
   if((unsigned)ray.geomID != RTC_INVALID_GEOMETRY_ID)

+ 1 - 1
include/igl/exterior_edges.cpp

@@ -67,7 +67,7 @@ IGL_INLINE void igl::exterior_edges(
   {
     int e = 0;
     const size_t nue = uE.rows();
-    // Append each unique edge with a non-zero amount of signed occurances
+    // Append each unique edge with a non-zero amount of signed occurrences
     for(size_t ue = 0; ue<nue; ue++)
     {
       const int count = counts(ue);

+ 1 - 1
include/igl/exterior_edges.h

@@ -12,7 +12,7 @@
 namespace igl
 {
   // EXTERIOR_EDGES Determines boundary "edges" and also edges with an
-  // odd number of occurances where seeing edge (i,j) counts as +1 and seeing
+  // odd number of occurrences where seeing edge (i,j) counts as +1 and seeing
   // the opposite edge (j,i) counts as -1
   //
   // Inputs:

+ 4 - 3
include/igl/extract_manifold_patches.cpp

@@ -93,10 +93,11 @@ IGL_INLINE size_t igl::extract_manifold_patches(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
-template unsigned long igl::extract_manifold_patches<Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
-// generated by autoexplicit.sh
 template unsigned long igl::extract_manifold_patches<Eigen::Matrix<int, -1, -1, 0, -1, -1>,   Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
-#ifndef WIN32
 template size_t igl::extract_manifold_patches<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
+template unsigned long igl::extract_manifold_patches<Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&); 
+#ifdef WIN32
+template unsigned __int64 igl::extract_manifold_patches<class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned __int64, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class std::vector<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>, class std::allocator<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
+template unsigned __int64 igl::extract_manifold_patches<class Eigen::Matrix<int, -1, 3, 1, -1, 3>, class Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned __int64, class Eigen::Matrix<int, -1, 1, 0, -1, 1>>(class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 1, -1, 3>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> const &, class std::vector<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>, class std::allocator<class std::vector<unsigned __int64, class std::allocator<unsigned __int64>>>> const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 1, 0, -1, 1>> &);
 #endif
 #endif

+ 2 - 2
include/igl/facet_components.h

@@ -16,7 +16,7 @@ namespace igl
   //
   // Inputs:
   //   F  #F by 3 list of triangle indices
-  // Ouputs:
+  // Outputs:
   //   C  #F list of connected component ids
   template <typename DerivedF, typename DerivedC>
   IGL_INLINE void facet_components(
@@ -25,7 +25,7 @@ namespace igl
   // Inputs:
   //   TT  #TT by 3 list of list of adjacency triangles (see
   //   triangle_triangle_adjacency.h)
-  // Ouputs:
+  // Outputs:
   //   C  #F list of connected component ids
   //   counts #C list of number of facets in each components
   template <

+ 2 - 0
include/igl/flood_fill.cpp

@@ -92,6 +92,8 @@ IGL_INLINE void igl::flood_fill(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template void igl::flood_fill<Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);
+// generated by autoexplicit.sh
 template void igl::flood_fill<Eigen::Matrix<int, 3, 1, 0, 3, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);
 // generated by autoexplicit.sh
 template void igl::flood_fill<Eigen::Matrix<int, 3, 1, 0, 3, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);

+ 4 - 2
include/igl/grid.cpp

@@ -28,7 +28,8 @@ IGL_INLINE void igl::grid(
       for(int xi = 0;xi<res(0);xi++)
       {
         const Scalar x = lerp(xi,0);
-        GV.row(xi+res(0)*(yi + res(1)*zi)) = 
+        const int gi = xi+res(0)*(yi + res(1)*zi);
+        GV.row(gi) = 
           Eigen::Matrix<Scalar,1,3>(x,y,z);
       }
     }
@@ -39,11 +40,12 @@ IGL_INLINE void igl::grid(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 // generated by autoexplicit.sh
+template void igl::grid<Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);
+// generated by autoexplicit.sh
 template void igl::grid<Eigen::Matrix<int, 3, 1, 0, 3, 1>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<int, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);
 // generated by autoexplicit.sh
 template void igl::grid<Eigen::Matrix<int, 3, 1, 0, 3, 1>, Eigen::Matrix<float, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<int, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);
 // generated by autoexplicit.sh
 template void igl::grid<Eigen::Matrix<int, 3, 1, 0, 3, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
-template void igl::grid<Eigen::Matrix<float, 1, 3, 1, 1, 3>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);
 template void igl::grid<Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 #endif

+ 1 - 1
include/igl/hausdorff.h

@@ -59,7 +59,7 @@ namespace igl
   //   V   3 by 3 list of corner positions so that V.row(i) is the position of the
   //     ith corner
   //   dist_to_B  function taking the x,y,z coordinate of a query position and
-  //     outputing the closest-point distance to some point-set B
+  //     outputting the closest-point distance to some point-set B
   // Outputs:
   //   l  lower bound on Hausdorff distance 
   //   u  upper bound on Hausdorff distance

+ 6 - 6
include/igl/hessian.cpp

@@ -27,15 +27,15 @@ IGL_INLINE void igl::hessian(
     typedef typename Eigen::SparseMatrix<Scalar> SparseMat;
     typedef typename Eigen::DiagonalMatrix
                        <Scalar, Eigen::Dynamic, Eigen::Dynamic> DiagMat;
-    
+
     int dim = V.cols();
     assert((dim==2 || dim==3) &&
            "The dimension of the vertices should be 2 or 3");
-    
+
     //Construct the combined gradient matric
     SparseMat G;
-    igl::grad(Eigen::PlainObjectBase<DerivedV>(V),
-              Eigen::PlainObjectBase<DerivedF>(F),
+    igl::grad(DerivedV(V),
+              DerivedF(F),
               G, false);
     SparseMat GG(F.rows(), dim*V.rows());
     GG.reserve(G.nonZeros());
@@ -43,12 +43,12 @@ IGL_INLINE void igl::hessian(
         GG.middleCols(i*G.cols(),G.cols()) = G.middleRows(i*F.rows(),F.rows());
     SparseMat D;
     igl::repdiag(GG,dim,D);
-    
+
     //Compute area matrix
     VecXd areas;
     igl::doublearea(V, F, areas);
     DiagMat A = (0.5*areas).replicate(dim,1).asDiagonal();
-    
+
     //Compute FEM Hessian
     H = D.transpose()*A*G;
 }

+ 8 - 8
include/igl/hessian_energy.cpp

@@ -25,35 +25,35 @@ IGL_INLINE void igl::hessian_energy(
     typedef typename Eigen::SparseMatrix<Scalar> SparseMat;
     typedef typename Eigen::DiagonalMatrix
                        <Scalar, Eigen::Dynamic, Eigen::Dynamic> DiagMat;
-    
+
     int dim = V.cols();
     assert((dim==2 || dim==3) &&
            "The dimension of the vertices should be 2 or 3");
-    
+
     SparseMat M;
     igl::massmatrix(V,F,igl::MASSMATRIX_TYPE_VORONOI,M);
-    
+
     //Kill non-interior DOFs
     VecXd Mint = M.diagonal();
     std::vector<std::vector<int> > bdryLoop;
-    igl::boundary_loop(Eigen::PlainObjectBase<DerivedF>(F),bdryLoop);
+    igl::boundary_loop(DerivedF(F),bdryLoop);
     for(const std::vector<int>& loop : bdryLoop)
         for(const int& bdryVert : loop)
             Mint(bdryVert) = 0.;
-    
+
     //Invert Mint
     for(int i=0; i<Mint.rows(); ++i)
         if(Mint(i) > 0)
             Mint(i) = 1./Mint(i);
-    
+
     //Repeat Mint to form diaginal matrix
     DiagMat stackedMinv = Mint.replicate(dim*dim,1).asDiagonal();
-    
+
     //Compute squared Hessian
     SparseMat H;
     igl::hessian(V,F,H);
     Q = H.transpose()*stackedMinv*H;
-    
+
 }
 
 

+ 1 - 1
include/igl/histc.h

@@ -13,7 +13,7 @@
 
 namespace igl
 {
-  // Like matlab's histc. Count occurances of values in X between consecutive
+  // Like matlab's histc. Count occurrences of values in X between consecutive
   // entries in E
   //
   // Inputs:

+ 3 - 0
include/igl/integrable_polyvector_fields.cpp

@@ -47,6 +47,9 @@ namespace igl {
                                     const double &s,
                                     Eigen::VectorXd &residuals,
                                     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);
     IGL_INLINE void rj_polycurl_edge(const Eigen::RowVectorXd &vec2D_a,
                                      const Eigen::RowVector2d &ea,

+ 2 - 2
include/igl/integrable_polyvector_fields.h

@@ -15,7 +15,7 @@
 
 namespace igl {
   // Compute a curl-free frame field from user constraints, optionally starting
-  // from a gived frame field (assumed to be interpolating the constraints).
+  // from a given frame field (assumed to be interpolating the constraints).
   // Implementation of the paper "Integrable PolyVector Fields", SIGGRAPH 2015.
 
   // Set of parameters used during solve
@@ -51,7 +51,7 @@ namespace igl {
                                                     igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC> &data);
 
 
-  // Given the current estimate of the field, performes one round of optimization
+  // Given the current estimate of the field, performs one round of optimization
   // iterations and updates the current estimate. The intermediate data is saved
   // and returned for the next iteration.
   // Inputs:

+ 4 - 4
include/igl/is_boundary_edge.cpp

@@ -47,14 +47,14 @@ void igl::is_boundary_edge(
   MatrixXi uE;
   VectorXi EMAP;
   unique_rows(sorted_EallE,uE,_,EMAP);
-  // Counts of occurances
+  // Counts of occurrences
   VectorXi N = VectorXi::Zero(uE.rows());
   for(int e = 0;e<EMAP.rows();e++)
   {
     N(EMAP(e))++;
   }
   B.resize(E.rows());
-  // Look of occurances of 2: one for original and another for boundary
+  // Look of occurrences of 2: one for original and another for boundary
   for(int e = 0;e<E.rows();e++)
   {
     B(e) = (N(EMAP(e)) == 2);
@@ -97,14 +97,14 @@ void igl::is_boundary_edge(
   sort(allE,2,true,sorted_allE,_);
   // Determine unique undirected edges E and map to directed edges EMAP
   unique_rows(sorted_allE,E,_,EMAP);
-  // Counts of occurances
+  // Counts of occurrences
   VectorXi N = VectorXi::Zero(E.rows());
   for(int e = 0;e<EMAP.rows();e++)
   {
     N(EMAP(e))++;
   }
   B.resize(E.rows());
-  // Look of occurances of 1
+  // Look of occurrences of 1
   for(int e = 0;e<E.rows();e++)
   {
     B(e) = N(e) == 1;

+ 1 - 1
include/igl/is_planar.h

@@ -13,7 +13,7 @@
 
 namespace igl
 {
-  // Determin if a set of points lies on the XY plane
+  // Determine if a set of points lies on the XY plane
   //
   // Inputs:
   //   V  #V by dim list of vertex positions

+ 3 - 2
include/igl/is_stl.cpp

@@ -12,7 +12,7 @@ IGL_INLINE bool igl::is_stl(FILE * stl_file, bool & is_ascii)
   //
   const auto perfect_size = [](FILE * stl_file)->bool
   {
-    stl_file = freopen(NULL,"rb",stl_file);
+    //stl_file = freopen(NULL,"rb",stl_file);
     // Read 80 header
     char header[80];
     if(fread(header,sizeof(char),80,stl_file)!=80)
@@ -27,7 +27,8 @@ IGL_INLINE bool igl::is_stl(FILE * stl_file, bool & is_ascii)
     }
     fseek(stl_file,0,SEEK_END);
     int file_size = ftell(stl_file);
-    stl_file = freopen(NULL,"r",stl_file);
+    fseek(stl_file,0,SEEK_SET);
+    //stl_file = freopen(NULL,"r",stl_file);
     return (file_size == 80 + 4 + (4*12 + 2) * num_tri);
   };
   // Specifically 80 character header

部分文件因为文件数量过多而无法显示