remesh_intersections.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. // This file is part of libigl, a simple c++ geometry processing library.
  2. //
  3. // Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public License
  6. // v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. // obtain one at http://mozilla.org/MPL/2.0/.
  8. #include "remesh_intersections.h"
  9. #include "SelfIntersectMesh.h"
  10. #include "assign_scalar.h"
  11. #include "projected_delaunay.h"
  12. #include <iostream>
  13. #include <cassert>
  14. template <
  15. typename DerivedV,
  16. typename DerivedF,
  17. typename Kernel,
  18. typename DerivedVV,
  19. typename DerivedFF,
  20. typename DerivedJ,
  21. typename DerivedIM>
  22. IGL_INLINE void igl::cgal::remesh_intersections(
  23. const Eigen::PlainObjectBase<DerivedV> & V,
  24. const Eigen::PlainObjectBase<DerivedF> & F,
  25. const std::vector<CGAL::Triangle_3<Kernel> > & T,
  26. const std::map<
  27. typename DerivedF::Index,
  28. std::pair<typename DerivedF::Index,
  29. std::vector<CGAL::Object> > > & offending,
  30. const std::map<
  31. std::pair<typename DerivedF::Index,typename DerivedF::Index>,
  32. std::vector<typename DerivedF::Index> > & edge2faces,
  33. Eigen::PlainObjectBase<DerivedVV> & VV,
  34. Eigen::PlainObjectBase<DerivedFF> & FF,
  35. Eigen::PlainObjectBase<DerivedJ> & J,
  36. Eigen::PlainObjectBase<DerivedIM> & IM)
  37. {
  38. using namespace std;
  39. using namespace Eigen;
  40. typedef typename DerivedF::Index Index;
  41. typedef CGAL::Point_3<Kernel> Point_3;
  42. //typedef CGAL::Segment_3<Kernel> Segment_3;
  43. //typedef CGAL::Triangle_3<Kernel> Triangle_3;
  44. typedef CGAL::Plane_3<Kernel> Plane_3;
  45. //typedef CGAL::Point_2<Kernel> Point_2;
  46. //typedef CGAL::Segment_2<Kernel> Segment_2;
  47. //typedef CGAL::Triangle_2<Kernel> Triangle_2;
  48. typedef CGAL::Triangulation_vertex_base_2<Kernel> TVB_2;
  49. typedef CGAL::Constrained_triangulation_face_base_2<Kernel> CTFB_2;
  50. typedef CGAL::Triangulation_data_structure_2<TVB_2,CTFB_2> TDS_2;
  51. typedef CGAL::Exact_intersections_tag Itag;
  52. typedef CGAL::Constrained_Delaunay_triangulation_2<Kernel,TDS_2,Itag>
  53. CDT_2;
  54. typedef CGAL::Constrained_triangulation_plus_2<CDT_2> CDT_plus_2;
  55. typedef std::pair<Index,Index> EMK;
  56. typedef std::vector<Index> EMV;
  57. //typedef std::map<EMK,EMV> EdgeMap;
  58. typedef std::pair<Index,Index> EMK;
  59. //typedef std::vector<CGAL::Object> ObjectList;
  60. typedef std::vector<Index> IndexList;
  61. int NF_count = 0;
  62. // list of new faces, we'll fix F later
  63. vector<
  64. typename Eigen::Matrix<typename DerivedFF::Scalar,Dynamic,Dynamic>
  65. > NF(offending.size());
  66. // list of new vertices
  67. typedef vector<Point_3> Point_3List;
  68. Point_3List NV;
  69. Index NV_count = 0;
  70. vector<CDT_plus_2> cdt(offending.size());
  71. vector<Plane_3> P(offending.size());
  72. // Use map for *all* faces
  73. map<typename CDT_plus_2::Vertex_handle,Index> v2i;
  74. #ifdef IGL_SELFINTERSECTMESH_DEBUG
  75. double t_proj_del = 0;
  76. #endif
  77. // Unfortunately it looks like CGAL has trouble allocating memory when
  78. // multiple openmp threads are running. Crashes durring CDT...
  79. //// Loop over offending triangles
  80. //const size_t noff = offending.size();
  81. //# pragma omp parallel for if (noff>1000)
  82. for(const auto & okv : offending)
  83. {
  84. // index in F
  85. const Index f = okv.first;
  86. const Index o = okv.second.first;
  87. {
  88. #ifdef IGL_SELFINTERSECTMESH_DEBUG
  89. const double t_before = get_seconds();
  90. #endif
  91. CDT_plus_2 cdt_o;
  92. projected_delaunay(T[f],okv.second.second,cdt_o);
  93. cdt[o] = cdt_o;
  94. #ifdef IGL_SELFINTERSECTMESH_DEBUG
  95. t_proj_del += (get_seconds()-t_before);
  96. #endif
  97. }
  98. // Q: Is this also delaunay in 3D?
  99. // A: No, because the projection is affine and delaunay is not affine
  100. // invariant.
  101. // Q: Then, can't we first get the 2D delaunay triangulation, then lift it
  102. // to 3D and flip any offending edges?
  103. // Plane of projection (also used by projected_delaunay)
  104. P[o] = Plane_3(T[f].vertex(0),T[f].vertex(1),T[f].vertex(2));
  105. // Build index map
  106. {
  107. Index i=0;
  108. for(
  109. typename CDT_plus_2::Finite_vertices_iterator vit = cdt[o].finite_vertices_begin();
  110. vit != cdt[o].finite_vertices_end();
  111. ++vit)
  112. {
  113. if(i<3)
  114. {
  115. //cout<<T[f].vertex(i)<<
  116. // (T[f].vertex(i) == P[o].to_3d(vit->point())?" == ":" != ")<<
  117. // P[o].to_3d(vit->point())<<endl;
  118. #ifndef NDEBUG
  119. // I want to be sure that the original corners really show up as the
  120. // original corners of the CDT. I.e. I don't trust CGAL to maintain
  121. // the order
  122. assert(T[f].vertex(i) == P[o].to_3d(vit->point()));
  123. #endif
  124. // For first three, use original index in F
  125. //# pragma omp critical
  126. v2i[vit] = F(f,i);
  127. }else
  128. {
  129. const Point_3 vit_point_3 = P[o].to_3d(vit->point());
  130. // First look up each edge's neighbors to see if exact point has
  131. // already been added (This makes everything a bit quadratic)
  132. bool found = false;
  133. for(int e = 0; e<3 && !found;e++)
  134. {
  135. // Index of F's eth edge in V
  136. Index i = F(f,(e+1)%3);
  137. Index j = F(f,(e+2)%3);
  138. // Be sure that i<j
  139. if(i>j)
  140. {
  141. swap(i,j);
  142. }
  143. assert(edge2faces.count(EMK(i,j))==1);
  144. const EMV & facesij = edge2faces.find(EMK(i,j))->second;
  145. // loop over neighbors
  146. for(
  147. typename IndexList::const_iterator nit = facesij.begin();
  148. nit != facesij.end() && !found;
  149. nit++)
  150. {
  151. // don't consider self
  152. if(*nit == f)
  153. {
  154. continue;
  155. }
  156. // index of neighbor in offending (to find its cdt)
  157. assert(offending.count(*nit) == 1);
  158. Index no = offending.find(*nit)->second.first;
  159. // Loop over vertices of that neighbor's cdt (might not have been
  160. // processed yet, but then it's OK because it'll just be empty)
  161. for(
  162. typename CDT_plus_2::Finite_vertices_iterator uit = cdt[no].finite_vertices_begin();
  163. uit != cdt[no].finite_vertices_end() && !found;
  164. ++uit)
  165. {
  166. if(vit_point_3 == P[no].to_3d(uit->point()))
  167. {
  168. assert(v2i.count(uit) == 1);
  169. //# pragma omp critical
  170. v2i[vit] = v2i[uit];
  171. found = true;
  172. }
  173. }
  174. }
  175. }
  176. if(!found)
  177. {
  178. //# pragma omp critical
  179. {
  180. v2i[vit] = V.rows()+NV_count;
  181. NV.push_back(vit_point_3);
  182. NV_count++;
  183. }
  184. }
  185. }
  186. i++;
  187. }
  188. }
  189. {
  190. Index i = 0;
  191. // Resize to fit new number of triangles
  192. NF[o].resize(cdt[o].number_of_faces(),3);
  193. //# pragma omp atomic
  194. NF_count+=NF[o].rows();
  195. // Append new faces to NF
  196. for(
  197. typename CDT_plus_2::Finite_faces_iterator fit = cdt[o].finite_faces_begin();
  198. fit != cdt[o].finite_faces_end();
  199. ++fit)
  200. {
  201. NF[o](i,0) = v2i[fit->vertex(0)];
  202. NF[o](i,1) = v2i[fit->vertex(1)];
  203. NF[o](i,2) = v2i[fit->vertex(2)];
  204. i++;
  205. }
  206. }
  207. }
  208. #ifdef IGL_SELFINTERSECTMESH_DEBUG
  209. cout<<"CDT: "<<tictoc()<<" "<<t_proj_del<<endl;
  210. #endif
  211. assert(NV_count == (Index)NV.size());
  212. // Build output
  213. #ifndef NDEBUG
  214. //{
  215. // Index off_count = 0;
  216. // for(Index f = 0;f<F.rows();f++)
  217. // {
  218. // off_count+= (offensive[f]?1:0);
  219. // }
  220. // assert(off_count==(Index)offending.size());
  221. //}
  222. #endif
  223. // Append faces
  224. FF.resize(F.rows()-offending.size()+NF_count,3);
  225. J.resize(FF.rows());
  226. // First append non-offending original faces
  227. // There's an Eigen way to do this in one line but I forget
  228. Index off = 0;
  229. for(Index f = 0;f<F.rows();f++)
  230. {
  231. if(!offending.count(f))
  232. {
  233. FF.row(off) = F.row(f);
  234. J(off) = f;
  235. off++;
  236. }
  237. }
  238. assert(off == (Index)(F.rows()-offending.size()));
  239. // Now append replacement faces for offending faces
  240. for(const auto & okv : offending)
  241. {
  242. // index in F
  243. const Index f = okv.first;
  244. const Index o = okv.second.first;
  245. FF.block(off,0,NF[o].rows(),3) = NF[o];
  246. J.block(off,0,NF[o].rows(),1).setConstant(f);
  247. off += NF[o].rows();
  248. }
  249. // Append vertices
  250. VV.resize(V.rows()+NV_count,3);
  251. VV.block(0,0,V.rows(),3) = V.template cast<typename DerivedVV::Scalar>();
  252. {
  253. Index i = 0;
  254. for(
  255. typename Point_3List::const_iterator nvit = NV.begin();
  256. nvit != NV.end();
  257. nvit++)
  258. {
  259. for(Index d = 0;d<3;d++)
  260. {
  261. const Point_3 & p = *nvit;
  262. // Don't convert via double if output type is same as Kernel
  263. assign_scalar(p[d], VV(V.rows()+i,d));
  264. }
  265. i++;
  266. }
  267. }
  268. IM.resize(VV.rows(),1);
  269. map<Point_3,Index> vv2i;
  270. // Safe to check for duplicates using double for original vertices: if
  271. // incoming reps are different then the points are unique.
  272. for(Index v = 0;v<V.rows();v++)
  273. {
  274. typename Kernel::FT p0,p1,p2;
  275. assign_scalar(V(v,0),p0);
  276. assign_scalar(V(v,1),p1);
  277. assign_scalar(V(v,2),p2);
  278. const Point_3 p(p0,p1,p2);
  279. if(vv2i.count(p)==0)
  280. {
  281. vv2i[p] = v;
  282. }
  283. assert(vv2i.count(p) == 1);
  284. IM(v) = vv2i[p];
  285. }
  286. // Must check for duplicates of new vertices using exact.
  287. {
  288. Index v = V.rows();
  289. for(
  290. typename Point_3List::const_iterator nvit = NV.begin();
  291. nvit != NV.end();
  292. nvit++)
  293. {
  294. const Point_3 & p = *nvit;
  295. if(vv2i.count(p)==0)
  296. {
  297. vv2i[p] = v;
  298. }
  299. assert(vv2i.count(p) == 1);
  300. IM(v) = vv2i[p];
  301. v++;
  302. }
  303. }
  304. #ifdef IGL_SELFINTERSECTMESH_DEBUG
  305. cout<<"Output + dupes: "<<tictoc()<<endl;
  306. #endif
  307. }
  308. #ifdef IGL_STATIC_LIBRARY
  309. // Explicit template specialization
  310. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::__1::vector<CGAL::Triangle_3<CGAL::Epeck>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -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> >&);
  311. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, 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&, std::__1::vector<CGAL::Triangle_3<CGAL::Epeck>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
  312. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, 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::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&, std::__1::vector<CGAL::Triangle_3<CGAL::Epeck>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -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> >&);
  313. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, 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&, std::__1::vector<CGAL::Triangle_3<CGAL::Epeck>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
  314. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::__1::vector<CGAL::Triangle_3<CGAL::Epick>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -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> >&);
  315. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, 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&, std::__1::vector<CGAL::Triangle_3<CGAL::Epick>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
  316. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, 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::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&, std::__1::vector<CGAL::Triangle_3<CGAL::Epick>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -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> >&);
  317. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, 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&, std::__1::vector<CGAL::Triangle_3<CGAL::Epick>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
  318. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, 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::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&, std::__1::vector<CGAL::Triangle_3<CGAL::Epeck>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::__1::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::__1::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index> > > > > 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> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
  319. template void igl::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, 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::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&, std::__1::vector<CGAL::Triangle_3<CGAL::Epick>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::__1::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::__1::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::__1::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index> > > > > 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> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
  320. template void igl::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::__1::vector<CGAL::Triangle_3<CGAL::Epeck>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
  321. template void igl::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::__1::vector<CGAL::Triangle_3<CGAL::Epick>, std::__1::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::__1::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > >, std::__1::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::allocator<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::vector<CGAL::Object, std::__1::allocator<CGAL::Object> > > > > > const&, std::__1::map<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::less<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> >, std::__1::allocator<std::__1::pair<std::__1::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> const, std::__1::vector<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::__1::allocator<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index> > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
  322. #endif