Browse Source

mostly template instantiations

Former-commit-id: b8152ee1f947daca2dc4c87f94fb65535293be28
Olga Diamanti 10 years ago
parent
commit
5db529c861

+ 3 - 1
build/Makefile.conf

@@ -109,7 +109,7 @@ ifeq ($(IGL_USERNAME),daniele)
 	IGL_WITH_XML=1
 	AFLAGS=-m64
 	GG=g++-4.8 -Wfatal-errors
-	EIGEN3_INC=-I/usr/local/include/eigen3
+	EIGEN3_INC=-I/opt/local/include/eigen3
 endif
 
 ifeq ($(IGL_USERNAME),olkido)
@@ -122,7 +122,9 @@ ifeq ($(IGL_USERNAME),olkido)
     IGL_WITH_EMBREE=1
     IGL_WITH_PNG=1
 		IGL_WITH_VIEWER=1
+		IGL_WITH_SVD3X3=1
 		MATLAB=/Applications/MATLAB_R2014b.app/
+		EIGEN3_INC=-I/opt/local/include/eigen3
 endif
 
 ifeq ($(IGL_USERNAME),chrsch)

+ 4 - 3
build/Makefile_embree

@@ -18,7 +18,7 @@ OBJ_FILES=$(addprefix obj/,$(notdir $(CPP_FILES:.cpp=.o)))
 # include igl headers
 INC+=-I../include/
 
-# EXPECTS THAT CFLAGS IS ALREADY SET APPROPRIATELY 
+# EXPECTS THAT CFLAGS IS ALREADY SET APPROPRIATELY
 
 # Eigen dependency
 EIGEN3_INC=-I$(DEFAULT_PREFIX)/include/eigen3 -I$(DEFAULT_PREFIX)/include/eigen3/unsupported
@@ -28,11 +28,12 @@ INC+=$(EIGEN3_INC)
 #EMBREE=../external/embree
 #EMBREE_INC=-I$(EMBREE)/common -I$(EMBREE)/rtcore/
 EMBREE=../external/embree/
-EMBREE_INC=-I$(EMBREE)/ -I$(EMBREE)/embree
+#EMBREE_INC=-I$(EMBREE)/ -I$(EMBREE)/embree
+EMBREE_INC=-I$(EMBREE)/include
 #EMBREE_LIB=-L$(EMBREE)/bin -lrtcore -lsys
 INC+=$(EMBREE_INC)
 
-obj: 
+obj:
 	mkdir -p obj
 
 ../lib/libiglembree.a: $(OBJ_FILES)

+ 7 - 3
build/Makefile_png

@@ -1,5 +1,5 @@
 include Makefile.conf
-all: CFLAGS += -O3 -DNDEBUG 
+all: CFLAGS += -O3 -DNDEBUG
 debug: CFLAGS += -g -Wall -Werror
 
 .PHONY: all
@@ -16,7 +16,7 @@ OBJ_FILES=$(addprefix obj/,$(notdir $(CPP_FILES:.cpp=.o)))
 # include igl headers
 INC+=-I../include/
 
-# EXPECTS THAT CFLAGS IS ALREADY SET APPROPRIATELY 
+# EXPECTS THAT CFLAGS IS ALREADY SET APPROPRIATELY
 
 # YIMG dependency
 YIMG=../external/yimg
@@ -27,7 +27,11 @@ YIMG_STATIC_LIB=$(YIMG)/libyimg.a
 # BOOST dependency
 INC+=-I/opt/local/include/
 
-obj: 
+# Eigen dependency
+EIGEN3_INC=-I$(DEFAULT_PREFIX)/include/eigen3 -I$(DEFAULT_PREFIX)/include/eigen3/unsupported
+INC+=$(EIGEN3_INC)
+
+obj:
 	mkdir -p obj
 
 ../lib/libiglpng.a: $(OBJ_FILES)

+ 7 - 6
include/igl/average_onto_vertices.cpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2013 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/.
 #include "average_onto_vertices.h"
 
@@ -13,7 +13,7 @@ IGL_INLINE void igl::average_onto_vertices(const Eigen::Matrix<T, Eigen::Dynamic
             const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &S,
             Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &SV)
 {
-  
+
   SV = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>::Zero(V.rows(),S.cols());
   Eigen::Matrix<T, Eigen::Dynamic, 1> COUNT = Eigen::Matrix<T, Eigen::Dynamic, 1>::Zero(V.rows());
   for (int i = 0; i <F.rows(); ++i)
@@ -26,9 +26,10 @@ IGL_INLINE void igl::average_onto_vertices(const Eigen::Matrix<T, Eigen::Dynamic
   }
   for (int i = 0; i <V.rows(); ++i)
     SV.row(i) /= COUNT[i];
-  
+
 };
 
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template specialization
+template void igl::average_onto_vertices<double, int>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);
 #endif

+ 11 - 7
include/igl/barycentric_to_global.cpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2013 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 
+//
+// 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 "barycentric_to_global.h"
 
@@ -15,8 +15,8 @@ namespace igl
 {
   template <typename Scalar, typename Index>
   IGL_INLINE Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> barycentric_to_global(
-    const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & V, 
-    const Eigen::Matrix<Index,Eigen::Dynamic,Eigen::Dynamic>  & F, 
+    const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & V,
+    const Eigen::Matrix<Index,Eigen::Dynamic,Eigen::Dynamic>  & F,
     const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & bc)
   {
     Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> R;
@@ -25,7 +25,7 @@ namespace igl
     for (unsigned i=0; i<R.rows(); ++i)
     {
       unsigned id = round(bc(i,0));
-      double u   = bc(i,1);  
+      double u   = bc(i,1);
       double v   = bc(i,2);
 
       if (id != -1)
@@ -38,3 +38,7 @@ namespace igl
     return R;
   }
 }
+
+#ifdef IGL_STATIC_LIBRARY
+template Eigen::Matrix<double, -1, -1, 0, -1, -1> igl::barycentric_to_global<double, int>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&);
+#endif

+ 1 - 0
include/igl/doublearea.cpp

@@ -194,4 +194,5 @@ template void igl::doublearea<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::M
 template void igl::doublearea<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -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&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
 template Eigen::Matrix<double, 2, 1, 0, 2, 1>::Scalar igl::doublearea_single<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&);
 template void igl::doublearea<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -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&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::doublearea<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::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<double, -1, -1, 0, -1, -1> >&);
 #endif

+ 37 - 32
include/igl/embree/EmbreeIntersector.h

@@ -1,10 +1,10 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>
 //               2014 Christian Schüller <schuellchr@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/.
 // igl function interface for Embree2.2
 //
@@ -12,6 +12,8 @@
 // * Use igl:Hit instead of embree:Hit (where id0 -> id)
 // * For Embree2.2
 // * Uncomment #define __USE_RAY_MASK__ in platform.h to enable masking
+//
+// TODO: Check for NANs in the input
 
 #ifndef IGL_EMBREE_INTERSECTOR_H
 #define IGL_EMBREE_INTERSECTOR_H
@@ -42,7 +44,7 @@ namespace igl
   public:
     typedef Eigen::Matrix<float,Eigen::Dynamic,3> PointMatrixType;
     typedef Eigen::Matrix<int,Eigen::Dynamic,3> FaceMatrixType;
-  public: 
+  public:
     inline EmbreeIntersector();
   private:
     // Copying and assignment are not allowed.
@@ -50,7 +52,7 @@ namespace igl
     inline EmbreeIntersector & operator=(const EmbreeIntersector &);
   public:
     virtual inline ~EmbreeIntersector();
-    
+
     // Initialize with a given mesh.
     //
     // Inputs:
@@ -79,9 +81,9 @@ namespace igl
     // destruction: no need to call if you just want to init() once and
     // destroy.
     inline void deinit();
-  
+
     // Given a ray find the first hit
-    // 
+    //
     // Inputs:
     //   origin     3d origin point of ray
     //   direction  3d (not necessarily normalized) direction vector of ray
@@ -92,7 +94,7 @@ namespace igl
     //   hit        information about hit
     // Returns true if and only if there was a hit
     inline bool intersectRay(
-      const Eigen::RowVector3f& origin, 
+      const Eigen::RowVector3f& origin,
       const Eigen::RowVector3f& direction,
       Hit& hit,
       float tnear = 0,
@@ -102,7 +104,7 @@ namespace igl
     // Given a ray find the first hit
     // This is a conservative hit test where multiple rays within a small radius
     // will be tested and only the closesest hit is returned.
-    // 
+    //
     // Inputs:
     //   origin     3d origin point of ray
     //   direction  3d (not necessarily normalized) direction vector of ray
@@ -125,7 +127,7 @@ namespace igl
       bool closestHit = true) const;
 
     // Given a ray find all hits in order
-    // 
+    //
     // Inputs:
     //   origin     3d origin point of ray
     //   direction  3d (not necessarily normalized) direction vector of ray
@@ -146,7 +148,7 @@ namespace igl
       int mask = 0xFFFFFFFF) const;
 
     // Given a ray find the first hit
-    // 
+    //
     // Inputs:
     //   a    3d first end point of segment
     //   ab   3d vector from a to other endpoint b
@@ -158,7 +160,7 @@ namespace igl
       const Eigen::RowVector3f& ab,
       Hit &hit,
       int mask = 0xFFFFFFFF) const;
-    
+
   private:
 
     struct Vertex   {float x,y,z,a;};
@@ -262,10 +264,10 @@ inline void igl::EmbreeIntersector::init(
   const std::vector<const FaceMatrixType*>& F,
   const std::vector<int>& masks)
 {
-  
+
   if(initialized)
     deinit();
-  
+
   using namespace std;
   global_init();
 
@@ -274,7 +276,7 @@ inline void igl::EmbreeIntersector::init(
     std::cerr << "Embree: No geometry specified!";
     return;
   }
-  
+
   // create a scene
   scene = rtcNewScene(RTC_SCENE_ROBUST | RTC_SCENE_HIGH_QUALITY,RTC_INTERSECT1);
 
@@ -307,7 +309,7 @@ inline void igl::EmbreeIntersector::init(
   }
 
   rtcCommit(scene);
-  
+
   if(rtcGetError() != RTC_NO_ERROR)
       std::cerr << "Embree: An error occured while initializing the provided geometry!" << endl;
 #ifdef IGL_VERBOSE
@@ -347,14 +349,14 @@ inline bool igl::EmbreeIntersector::intersectRay(
 {
   RTCRay ray;
   createRay(ray, origin,direction,tnear,std::numeric_limits<float>::infinity(),mask);
-  
+
   // shot ray
   rtcIntersect(scene,ray);
 #ifdef IGL_VERBOSE
   if(rtcGetError() != RTC_NO_ERROR)
       std::cerr << "Embree: An error occured while resetting!" << std::endl;
 #endif
-  
+
   if(ray.geomID != RTC_INVALID_GEOMETRY_ID)
   {
     hit.id = ray.primID;
@@ -369,7 +371,7 @@ inline bool igl::EmbreeIntersector::intersectRay(
 }
 
 inline bool igl::EmbreeIntersector::intersectBeam(
-      const Eigen::RowVector3f& origin, 
+      const Eigen::RowVector3f& origin,
       const Eigen::RowVector3f& direction,
       Hit& hit,
       float tnear,
@@ -386,18 +388,21 @@ inline bool igl::EmbreeIntersector::intersectBeam(
   else
     bestHit.t = 0;
 
-  if(hasHit = (intersectRay(origin,direction,hit,tnear,tfar,mask) && (hit.gid == geoId || geoId == -1)))
+  hasHit = (intersectRay(origin,direction,hit,tnear,tfar,mask) && (hit.gid == geoId || geoId == -1));
+  if(hasHit)
     bestHit = hit;
-  
+
   // sample points around actual ray (conservative hitcheck)
   float eps= 1e-5;
   int density = 4;
-        
-  Eigen::RowVector3f up(0,1,0);
+
+  Eigen::RowVector3f up; up.setRandom(1,3);
+  while (fabs(direction.cross(up).norm()) < 1e-5)
+    up.setRandom(1,3);
   Eigen::RowVector3f offset = direction.cross(up).normalized();
 
   Eigen::Matrix3f rot = Eigen::AngleAxis<float>(2*3.14159265358979/density,direction).toRotationMatrix();
-        
+
   for(int r=0;r<density;r++)
   {
     if(intersectRay(origin+offset*eps,direction,hit,tnear,tfar,mask) && ((closestHit && (hit.t < bestHit.t)) || (!closestHit && (hit.t > bestHit.t))) && (hit.gid == geoId || geoId == -1))
@@ -412,10 +417,10 @@ inline bool igl::EmbreeIntersector::intersectBeam(
   return hasHit;
 }
 
-inline bool 
+inline bool
 igl::EmbreeIntersector
 ::intersectRay(
-  const Eigen::RowVector3f& origin, 
+  const Eigen::RowVector3f& origin,
   const Eigen::RowVector3f& direction,
   std::vector<Hit > &hits,
   int& num_rays,
@@ -484,7 +489,7 @@ igl::EmbreeIntersector
     }
     else
       break; // no more hits
-    
+
     if(hits.size()>1000 && !large_hits_warned)
     {
       std::cout<<"Warning: Large number of hits..."<<endl;
@@ -493,10 +498,10 @@ igl::EmbreeIntersector
       {
         std::cout<<(hit->id+1)<<" ";
       }
-      
+
       std::cout.precision(std::numeric_limits< double >::digits10);
       std::cout<<"[ ";
-      
+
       for(vector<Hit>::iterator hit = hits.begin(); hit != hits.end(); hit++)
       {
         std::cout<<(hit->t)<<endl;;
@@ -512,13 +517,13 @@ igl::EmbreeIntersector
   return hits.empty();
 }
 
-inline bool 
+inline bool
 igl::EmbreeIntersector
 ::intersectSegment(const Eigen::RowVector3f& a, const Eigen::RowVector3f& ab, Hit &hit, int mask) const
 {
   RTCRay ray;
   createRay(ray,a,ab,0,1.0,mask);
-  
+
   rtcIntersect(scene,ray);
 
   if(ray.geomID != RTC_INVALID_GEOMETRY_ID)

+ 20 - 17
include/igl/embree/line_mesh_intersection.cpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2013 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 
+//
+// 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 "line_mesh_intersection.h"
 
@@ -40,14 +40,14 @@ IGL_INLINE ScalarMatrix igl::line_mesh_intersection
 {
 
   double tol = 0.00001;
-  
+
   Eigen::MatrixXd ray_pos = V_source;
   Eigen::MatrixXd ray_dir = N_source;
 
   // Allocate matrix for the result
   ScalarMatrix R;
   R.resize(V_source.rows(), 3);
-  
+
   // Initialize embree
   igl::EmbreeIntersector embree;
   embree.init(V_target.template cast<float>(),F_target.template cast<int>());
@@ -56,28 +56,28 @@ IGL_INLINE ScalarMatrix igl::line_mesh_intersection
   for (unsigned i=0; i<ray_pos.rows(); ++i)
   {
     igl::Hit A,B;
-    
+
     // Shoot ray A
     Eigen::RowVector3d A_pos = ray_pos.row(i) + tol * ray_dir.row(i);
     Eigen::RowVector3d A_dir = -ray_dir.row(i);
-    
-    bool A_hit = embree.intersectRay(A_pos.cast<float>(), A_dir.cast<float>(),A);
-    
+
+    bool A_hit = embree.intersectBeam(A_pos.cast<float>(), A_dir.cast<float>(),A);
+
     Eigen::RowVector3d B_pos = ray_pos.row(i) - tol * ray_dir.row(i);
     Eigen::RowVector3d B_dir = ray_dir.row(i);
-    
-    bool B_hit = embree.intersectRay(B_pos.cast<float>(), B_dir.cast<float>(),B);
-    
-    
+
+    bool B_hit = embree.intersectBeam(B_pos.cast<float>(), B_dir.cast<float>(),B);
+
+
     int choice = -1;
-    
+
     if (A_hit && ! B_hit)
       choice = 0;
     else if (!A_hit && B_hit)
       choice = 1;
     else if (A_hit && B_hit)
       choice = A.t > B.t;
-    
+
     Eigen::RowVector3d temp;
 
     if (choice == -1)
@@ -88,10 +88,13 @@ IGL_INLINE ScalarMatrix igl::line_mesh_intersection
       temp << B.id, B.u, B.v;
 
     R.row(i) = temp;
-    
+
   }
 
   return R;
 
 }
 
+#ifdef IGL_STATIC_LIBRARY
+template Eigen::Matrix<double, -1, -1, 0, -1, -1> igl::line_mesh_intersection<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&);
+#endif

+ 3 - 0
include/igl/frustum.cpp

@@ -19,3 +19,6 @@ IGL_INLINE void igl::frustum(
   P(2,3) = -(2.0 * farVal * nearVal) / (farVal - nearVal);
 }
 
+#ifdef IGL_STATIC_LIBRARY
+template void igl::frustum<Eigen::Matrix<float, 4, 4, 0, 4, 4> >(Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >&);
+#endif

+ 1 - 0
include/igl/is_border_vertex.cpp

@@ -32,4 +32,5 @@ IGL_INLINE std::vector<bool> igl::is_border_vertex(const Eigen::PlainObjectBase<
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template specialization
 template std::vector<bool, std::allocator<bool> > igl::is_border_vertex<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);
+template std::__1::vector<bool, std::__1::allocator<bool> > igl::is_border_vertex<Eigen::Matrix<double, -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&);
 #endif

+ 4 - 0
include/igl/look_at.cpp

@@ -29,3 +29,7 @@ IGL_INLINE void igl::look_at(
   R(1,3) =-u.transpose() * eye;
   R(2,3) = f.transpose() * eye;
 }
+
+#ifdef IGL_STATIC_LIBRARY
+template void igl::look_at<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 4, 4, 0, 4, 4> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >&);
+#endif

+ 2 - 0
include/igl/matlab_format.cpp

@@ -127,4 +127,6 @@ template Eigen::WithFormat<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const igl::mat
 template Eigen::WithFormat<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const igl::matlab_format<Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
 template Eigen::WithFormat<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const igl::matlab_format<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
 template Eigen::WithFormat<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const igl::matlab_format<Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
+template Eigen::WithFormat<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const igl::matlab_format<Eigen::Matrix<double, 2, 3, 0, 2, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >);
+template Eigen::WithFormat<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const igl::matlab_format<Eigen::Matrix<double, 3, 2, 0, 3, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >);
 #endif

+ 4 - 0
include/igl/ortho.cpp

@@ -18,3 +18,7 @@ IGL_INLINE void igl::ortho(
   P(1,3) = - (top + bottom) / (top - bottom);
   P(2,3) = - (farVal + nearVal) / (farVal - nearVal);
 }
+
+#ifdef IGL_STATIC_LIBRARY
+template void igl::ortho<Eigen::Matrix<float, 4, 4, 0, 4, 4> >(Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >&);
+#endif

+ 7 - 4
include/igl/per_vertex_attribute_smoothing.cpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2013 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/.
 #include "per_vertex_attribute_smoothing.h"
 #include <vector>
@@ -28,3 +28,6 @@ IGL_INLINE void igl::per_vertex_attribute_smoothing(
         Aout.row(i) /= denominator[i];
 }
 
+#ifdef IGL_STATIC_LIBRARY
+template void igl::per_vertex_attribute_smoothing<Eigen::Matrix<double, -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&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+#endif

+ 1 - 0
include/igl/png/texture_from_png.h

@@ -9,6 +9,7 @@
 #define IGL_TEXTURE_FROM_PNG_H
 #include "../igl_inline.h"
 #include <string>
+#include <Eigen/Core>
 
 #ifndef IGL_NO_OPENGL
 #include "../OpenGL_convenience.h"

+ 5 - 4
include/igl/polar_dec.cpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2013 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/.
 #include "polar_dec.h"
 #include "polar_svd.h"
@@ -92,4 +92,5 @@ IGL_INLINE void igl::polar_dec(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instanciation
 template  void igl::polar_dec<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 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&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::polar_dec<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 #endif

+ 5 - 4
include/igl/polar_svd.cpp

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2013 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/.
 #include "polar_svd.h"
 #include <Eigen/SVD>
@@ -70,4 +70,5 @@ template void igl::polar_svd<Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix
 template void igl::polar_svd<Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> >&);
 template void igl::polar_svd<Eigen::Matrix<float, 2, 2, 0, 2, 2>, Eigen::Matrix<float, 2, 2, 0, 2, 2>, Eigen::Matrix<float, 2, 2, 0, 2, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> >&);
 template void igl::polar_svd<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&);
+template void igl::polar_svd<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 #endif

+ 30 - 26
include/igl/procrustes.cpp

@@ -1,19 +1,19 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2014 Stefan Brugger <stefanbrugger@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/.
 #include "procrustes.h"
 #include "polar_svd.h"
 #include "polar_dec.h"
- 
+
 template <
-  typename DerivedX, 
-  typename DerivedY, 
-  typename Scalar, 
-  typename DerivedR, 
+  typename DerivedX,
+  typename DerivedY,
+  typename Scalar,
+  typename DerivedR,
   typename DerivedT>
 IGL_INLINE void igl::procrustes(
     const Eigen::PlainObjectBase<DerivedX>& X,
@@ -29,8 +29,8 @@ IGL_INLINE void igl::procrustes(
   assert(X.cols() == Y.cols() && "Points have same dimensions");
 
   // Center data
-  const VectorXd Xmean = X.colwise().mean();      
-  const VectorXd Ymean = Y.colwise().mean();      
+  const VectorXd Xmean = X.colwise().mean();
+  const VectorXd Ymean = Y.colwise().mean();
   MatrixXd XC = X.rowwise() - Xmean.transpose();
   MatrixXd YC = Y.rowwise() - Ymean.transpose();
 
@@ -45,8 +45,8 @@ IGL_INLINE void igl::procrustes(
      assert (abs(XC.norm() / XC.rows() - scaleY) < 1e-8);
   }
 
-  // Rotation 
-  MatrixXd S = XC.transpose() * YC; 
+  // Rotation
+  MatrixXd S = XC.transpose() * YC;
   MatrixXd T;
   if (includeReflections)
   {
@@ -63,10 +63,10 @@ IGL_INLINE void igl::procrustes(
 
 
 template <
-  typename DerivedX, 
-  typename DerivedY, 
-  typename Scalar, 
-  int DIM, 
+  typename DerivedX,
+  typename DerivedY,
+  typename Scalar,
+  int DIM,
   int TType>
 IGL_INLINE void igl::procrustes(
     const Eigen::PlainObjectBase<DerivedX>& X,
@@ -86,9 +86,9 @@ IGL_INLINE void igl::procrustes(
 }
 
 template <
-  typename DerivedX, 
-  typename DerivedY, 
-  typename DerivedR, 
+  typename DerivedX,
+  typename DerivedY,
+  typename DerivedR,
   typename DerivedT>
 IGL_INLINE void igl::procrustes(
     const Eigen::PlainObjectBase<DerivedX>& X,
@@ -104,9 +104,9 @@ IGL_INLINE void igl::procrustes(
 }
 
 template <
-  typename DerivedX, 
-  typename DerivedY, 
-  typename DerivedR, 
+  typename DerivedX,
+  typename DerivedY,
+  typename DerivedR,
   typename DerivedT>
 IGL_INLINE void igl::procrustes(
     const Eigen::PlainObjectBase<DerivedX>& X,
@@ -118,9 +118,9 @@ IGL_INLINE void igl::procrustes(
 }
 
 template <
-  typename DerivedX, 
-  typename DerivedY, 
-  typename Scalar, 
+  typename DerivedX,
+  typename DerivedY,
+  typename Scalar,
   typename DerivedT>
 IGL_INLINE void igl::procrustes(
     const Eigen::PlainObjectBase<DerivedX>& X,
@@ -134,3 +134,7 @@ IGL_INLINE void igl::procrustes(
   procrustes(X,Y,false,false,Rmat,t);
   R.fromRotationMatrix(Rmat);
 }
+
+#ifdef IGL_STATIC_LIBRARY
+template void igl::procrustes<Eigen::Matrix<double, 3, 2, 0, 3, 2>, Eigen::Matrix<double, 3, 2, 0, 3, 2>, double, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const&, bool, bool, double&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >&);
+#endif

+ 2 - 0
include/igl/project.cpp

@@ -154,6 +154,8 @@ template Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > igl::proj
 template Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > igl::project<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&);
 #endif
 template Eigen::Matrix<double, 3, 1, 0, 3, 1> igl::project<double>(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&);
+template Eigen::Matrix<float, 3, 1, 0, 3, 1> igl::project<float>(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&);
+// template int igl::project(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&);
 #endif
 
 #endif

+ 8 - 1
include/igl/rotation_matrix_from_directions.cpp

@@ -8,6 +8,7 @@
 
 #include "rotation_matrix_from_directions.h"
 #include <Eigen/Geometry>
+#include <iostream>
 
 template <typename Scalar>
 IGL_INLINE Eigen::Matrix<Scalar, 3, 3> igl::rotation_matrix_from_directions(const Eigen::Matrix<Scalar, 3, 1> v0,
@@ -29,7 +30,13 @@ IGL_INLINE Eigen::Matrix<Scalar, 3, 3> igl::rotation_matrix_from_directions(cons
     rotM = Eigen::Matrix<Scalar, 3, 3>::Identity();
     return rotM;
   }
-
+  if ((v0+v1).norm()<epsilon)
+  {
+    rotM = -Eigen::Matrix<Scalar, 3, 3>::Identity();
+    rotM(0,0) = 1.;
+    std::cerr<<"igl::rotation_matrix_from_directions: rotating around x axis by 180o"<<std::endl;
+    return rotM;
+  }
   ///find the axis of rotation
   Eigen::Matrix<Scalar, 3, 1> axis;
   axis=v0.cross(v1);

+ 21 - 0
include/igl/serialize.cpp

@@ -773,3 +773,24 @@ namespace igl
     }
   }
 }
+
+#ifdef IGL_STATIC_LIBRARY
+template bool igl::deserialize<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::Matrix<double, -1, 1, 0, -1, 1>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::deserialize<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::deserialize<Eigen::Matrix<unsigned char, -1, -1, 0, -1, -1> >(Eigen::Matrix<unsigned char, -1, -1, 0, -1, -1>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::deserialize<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::deserialize<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::Matrix<int, -1, -1, 0, -1, -1>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::deserialize<std::__1::vector<bool, std::__1::allocator<bool> > >(std::__1::vector<bool, std::__1::allocator<bool> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::deserialize<bool>(bool&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::deserialize<double>(double&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::deserialize<int>(int&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&);
+template bool igl::serialize<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+template bool igl::serialize<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+template bool igl::serialize<Eigen::Matrix<unsigned char, -1, -1, 0, -1, -1> >(Eigen::Matrix<unsigned char, -1, -1, 0, -1, -1> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+template bool igl::serialize<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+template bool igl::serialize<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+template bool igl::serialize<std::__1::vector<bool, std::__1::allocator<bool> > >(std::__1::vector<bool, std::__1::allocator<bool> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+template bool igl::serialize<bool>(bool const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+template bool igl::serialize<double>(double const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+template bool igl::serialize<int>(int const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool);
+#endif

+ 1 - 0
include/igl/triangle_triangle_adjacency.cpp

@@ -210,4 +210,5 @@ template void igl::triangle_triangle_adjacency<Eigen::Matrix<double, -1, -1, 0,
 template void igl::triangle_triangle_adjacency<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);
 template void igl::triangle_triangle_adjacency<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);
 template void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1>, long, long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >, std::allocator<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > > >&, std::vector<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >, std::allocator<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > > >&);
+template void igl::triangle_triangle_adjacency<Eigen::Matrix<double, -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&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
 #endif

+ 1 - 0
include/igl/unproject.cpp

@@ -93,6 +93,7 @@ template void igl::unproject<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix
 template Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > igl::unproject<Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&);
 #endif
 template Eigen::Matrix<double, 3, 1, 0, 3, 1> igl::unproject<double>(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&);
+template Eigen::Matrix<float, 3, 1, 0, 3, 1> igl::unproject<float>(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&);
 #endif
 
 #endif