Browse Source

support rowmajor (#2246) [ci skip]

Alec Jacobson 2 years ago
parent
commit
8d940367bf
3 changed files with 102 additions and 75 deletions
  1. 51 39
      include/igl/readMSH.cpp
  2. 31 26
      include/igl/readMSH.h
  3. 20 10
      tests/include/igl/readMSH.cpp

+ 51 - 39
include/igl/readMSH.cpp

@@ -10,18 +10,19 @@
 #include "MshLoader.h"
 #include "MshLoader.h"
 #include <iostream>
 #include <iostream>
 
 
-IGL_INLINE  bool  igl::readMSH(const std::string &msh,
-            Eigen::MatrixXd &X,
-            Eigen::MatrixXi &Tri,
-            Eigen::MatrixXi &Tet,
-            Eigen::VectorXi &TriTag,
-            Eigen::VectorXi &TetTag,
-            std::vector<std::string>     &XFields,
-            std::vector<Eigen::MatrixXd> &XF,
-            std::vector<std::string>     &EFields,
-            std::vector<Eigen::MatrixXd> &TriF,
-            std::vector<Eigen::MatrixXd> &TetF
-            )
+template <int EigenMatrixOptions>
+IGL_INLINE  bool  igl::readMSH(
+  const std::string &msh,
+  Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &X,
+  Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tri,
+  Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tet,
+  Eigen::VectorXi &TriTag,
+  Eigen::VectorXi &TetTag,
+  std::vector<std::string>     &XFields,
+  std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> &XF,
+  std::vector<std::string>     &EFields,
+  std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> &TriF,
+  std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> &TetF)
 {
 {
     try 
     try 
     {
     {
@@ -158,54 +159,65 @@ IGL_INLINE  bool  igl::readMSH(const std::string &msh,
     return true;
     return true;
 }
 }
 
 
-IGL_INLINE bool igl::readMSH(const std::string &msh,
-                Eigen::MatrixXd &X,
-                Eigen::MatrixXi &Tri,
-                Eigen::MatrixXi &Tet,
-                Eigen::VectorXi &TriTag,
-                Eigen::VectorXi &TetTag
-                )
+template <int EigenMatrixOptions>
+IGL_INLINE bool igl::readMSH(
+  const std::string &msh,
+  Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &X,
+  Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tri,
+  Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tet,
+  Eigen::VectorXi &TriTag,
+  Eigen::VectorXi &TetTag)
 {
 {
     std::vector<std::string>     XFields;
     std::vector<std::string>     XFields;
-    std::vector<Eigen::MatrixXd> XF;
     std::vector<std::string>     EFields;
     std::vector<std::string>     EFields;
-    std::vector<Eigen::MatrixXd> TriF;
-    std::vector<Eigen::MatrixXd> TetF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> XF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> TriF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> TetF;
     return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF);
     return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF);
 }
 }
 
 
-IGL_INLINE bool igl::readMSH(const std::string &msh,
-                Eigen::MatrixXd &X,
-                Eigen::MatrixXi &Tri,
-                Eigen::VectorXi &TriTag
-                )
+template <int EigenMatrixOptions>
+IGL_INLINE bool igl::readMSH(
+  const std::string &msh,
+  Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &X,
+  Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tri,
+  Eigen::VectorXi &TriTag)
 {
 {
-    Eigen::MatrixXi Tet;
+    Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> Tet;
     Eigen::VectorXi TetTag;
     Eigen::VectorXi TetTag;
 
 
     std::vector<std::string>     XFields;
     std::vector<std::string>     XFields;
-    std::vector<Eigen::MatrixXd> XF;
     std::vector<std::string>     EFields;
     std::vector<std::string>     EFields;
-    std::vector<Eigen::MatrixXd> TriF;
-    std::vector<Eigen::MatrixXd> TetF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> XF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> TriF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> TetF;
 
 
     return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF);
     return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF);
 }
 }
 
 
-IGL_INLINE bool igl::readMSH(const std::string &msh,
-                Eigen::MatrixXd &X,
-                Eigen::MatrixXi &Tri
-                )
+template <int EigenMatrixOptions>
+IGL_INLINE bool igl::readMSH(
+  const std::string &msh,
+  Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &X,
+  Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tri)
 {
 {
-    Eigen::MatrixXi Tet;
+    Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> Tet;
     Eigen::VectorXi TetTag;
     Eigen::VectorXi TetTag;
     Eigen::VectorXi TriTag;
     Eigen::VectorXi TriTag;
 
 
     std::vector<std::string>     XFields;
     std::vector<std::string>     XFields;
-    std::vector<Eigen::MatrixXd> XF;
     std::vector<std::string>     EFields;
     std::vector<std::string>     EFields;
-    std::vector<Eigen::MatrixXd> TriF;
-    std::vector<Eigen::MatrixXd> TetF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> XF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> TriF;
+    std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> TetF;
 
 
     return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF);
     return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF);
 }
 }
+
+#ifdef IGL_STATIC_LIBRARY
+// Explicit template instantiation
+template bool igl::readMSH<1>(std::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, Eigen::Matrix<double, -1, -1, 1, -1, -1>&, Eigen::Matrix<int, -1, -1, 1, -1, -1>&, Eigen::Matrix<int, -1, -1, 1, -1, -1>&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>&, std::vector<Eigen::Matrix<double, -1, -1, 1, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 1, -1, -1>>>&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>&, std::vector<Eigen::Matrix<double, -1, -1, 1, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 1, -1, -1>>>&, std::vector<Eigen::Matrix<double, -1, -1, 1, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 1, -1, -1>>>&);
+template bool igl::readMSH<0>(std::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, 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::Matrix<int, -1, 1, 0, -1, 1>&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1>>>&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -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>>>&);
+template bool igl::readMSH<1>(std::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, Eigen::Matrix<double, -1, -1, 1, -1, -1>&, Eigen::Matrix<int, -1, -1, 1, -1, -1>&, Eigen::Matrix<int, -1, -1, 1, -1, -1>&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);
+template bool igl::readMSH<0>(std::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, 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::Matrix<int, -1, 1, 0, -1, 1>&);
+#endif

+ 31 - 26
include/igl/readMSH.h

@@ -18,6 +18,8 @@ namespace igl
 {
 {
     /// read triangle surface mesh and tetrahedral volume mesh from .msh file
     /// read triangle surface mesh and tetrahedral volume mesh from .msh file
     ///
     ///
+    /// @tparam EigenMatrixOptions  matrix options of output matrices (e.g.,
+    /// Eigen::ColMajor, Eigen::RowMajor)
     /// @param[in] msh - file name
     /// @param[in] msh - file name
     /// @param[out] X  eigen double matrix of vertex positions  #X by 3
     /// @param[out] X  eigen double matrix of vertex positions  #X by 3
     /// @param[out] Tri  #Tri eigen integer matrix of triangular faces indices into vertex positions
     /// @param[out] Tri  #Tri eigen integer matrix of triangular faces indices into vertex positions
@@ -35,38 +37,41 @@ namespace igl
     /// \bug only 3D information is supported
     /// \bug only 3D information is supported
     /// \bug only the 1st tag per element is returned (physical) 
     /// \bug only the 1st tag per element is returned (physical) 
     /// \bug same element fields are expected to be associated with surface elements and volumetric elements
     /// \bug same element fields are expected to be associated with surface elements and volumetric elements
+    template <int EigenMatrixOptions>
     IGL_INLINE bool readMSH(
     IGL_INLINE bool readMSH(
       const std::string &msh,
       const std::string &msh,
-      Eigen::MatrixXd &X,
-      Eigen::MatrixXi &Tri,
-      Eigen::MatrixXi &Tet,
+      Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &X,
+      Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tri,
+      Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tet,
       Eigen::VectorXi &TriTag,
       Eigen::VectorXi &TriTag,
       Eigen::VectorXi &TetTag,
       Eigen::VectorXi &TetTag,
-      std::vector<std::string> &XFields,
-      std::vector<Eigen::MatrixXd> &XF,
-      std::vector<std::string> &EFields,
-      std::vector<Eigen::MatrixXd> &TriF,
-      std::vector<Eigen::MatrixXd> &TetF
-      );
+      std::vector<std::string>     &XFields,
+      std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> &XF,
+      std::vector<std::string>     &EFields,
+      std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> &TriF,
+      std::vector<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions>> &TetF);
     /// \overload
     /// \overload
-    IGL_INLINE bool readMSH(const std::string &msh,
-                Eigen::MatrixXd &X,
-                Eigen::MatrixXi &Tri,
-                Eigen::MatrixXi &Tet,
-                Eigen::VectorXi &TriTag,
-                Eigen::VectorXi &TetTag
-                );
+    template <int EigenMatrixOptions>
+    IGL_INLINE bool readMSH(
+      const std::string &msh,
+      Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &X,
+      Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tri,
+      Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tet,
+      Eigen::VectorXi &TriTag,
+      Eigen::VectorXi &TetTag);
     /// \overload
     /// \overload
-    IGL_INLINE bool readMSH(const std::string &msh,
-                Eigen::MatrixXd &X,
-                Eigen::MatrixXi &Tri,
-                Eigen::VectorXi &TriTag
-                );
+    template <int EigenMatrixOptions>
+    IGL_INLINE bool readMSH(
+      const std::string &msh,
+      Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &X,
+      Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tri,
+      Eigen::VectorXi &TriTag);
     /// \overload
     /// \overload
-    IGL_INLINE bool readMSH(const std::string &msh,
-                Eigen::MatrixXd &X,
-                Eigen::MatrixXi &Tri
-                );
+    template <int EigenMatrixOptions>
+    IGL_INLINE bool readMSH(
+      const std::string &msh,
+      Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &X,
+      Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,EigenMatrixOptions> &Tri);
 
 
 }
 }
 
 
@@ -75,4 +80,4 @@ namespace igl
 #  include "readMSH.cpp"
 #  include "readMSH.cpp"
 #endif
 #endif
 
 
-#endif //IGL_READ_MSH_H
+#endif

+ 20 - 10
tests/include/igl/readMSH.cpp

@@ -6,21 +6,21 @@
 
 
 #include <set>
 #include <set>
 
 
-
-TEST_CASE("readMSH","[igl]")
+template <typename MatD, typename MatI, typename VecI>
+void test()
 {
 {
-    Eigen::MatrixXd X;
-    Eigen::MatrixXi Tri;
-    Eigen::MatrixXi Tet;
-    Eigen::VectorXi TriTag;
-    Eigen::VectorXi TetTag;
+    MatD X;
+    MatI Tri;
+    MatI Tet;
+    VecI TriTag;
+    VecI TetTag;
 
 
     std::vector<std::string> XFields;
     std::vector<std::string> XFields;
     std::vector<std::string> EFields;
     std::vector<std::string> EFields;
 
 
-    std::vector<Eigen::MatrixXd> XF;
-    std::vector<Eigen::MatrixXd> TriF;
-    std::vector<Eigen::MatrixXd> TetF;
+    std::vector<MatD> XF;
+    std::vector<MatD> TriF;
+    std::vector<MatD> TetF;
 
 
     REQUIRE(igl::readMSH(test_common::data_path("sphere_lowres_TMS_1-0001_Magstim_70mm_Fig8_nii_scalar.msh"), 
     REQUIRE(igl::readMSH(test_common::data_path("sphere_lowres_TMS_1-0001_Magstim_70mm_Fig8_nii_scalar.msh"), 
         X, Tri, Tet, TriTag, TetTag, XFields, XF, EFields, TriF, TetF));
         X, Tri, Tet, TriTag, TetTag, XFields, XF, EFields, TriF, TetF));
@@ -70,3 +70,13 @@ TEST_CASE("readMSH","[igl]")
     REQUIRE(TetF[0].rows()==25937);
     REQUIRE(TetF[0].rows()==25937);
 }
 }
 
 
+TEST_CASE("readMSH","[igl]")
+{
+  test<Eigen::MatrixXd,Eigen::MatrixXi,Eigen::VectorXi>();
+  test<
+    Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor>,
+    Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor>,
+    Eigen::VectorXi>();
+}
+
+