Эх сурвалжийг харах

Enable out of source tutorial build

Use CMake's "configure_file" functionality to store path to the tutorial
shared directory, enabling tutorial executables build out of source to
correctly find the data files.


Former-commit-id: a0eed05e8ba789d92156603531949010a644683e
Daniel Crispell 9 жил өмнө
parent
commit
c861c711a0
49 өөрчлөгдсөн 156 нэмэгдсэн , 67 устгасан
  1. 2 1
      tutorial/101_FileIO/main.cpp
  2. 2 1
      tutorial/102_DrawMesh/main.cpp
  3. 3 2
      tutorial/103_Events/main.cpp
  4. 2 1
      tutorial/104_Colors/main.cpp
  5. 2 1
      tutorial/105_Overlays/main.cpp
  6. 2 1
      tutorial/106_ViewerMenu/main.cpp
  7. 2 1
      tutorial/201_Normals/main.cpp
  8. 2 1
      tutorial/202_GaussianCurvature/main.cpp
  9. 2 1
      tutorial/203_CurvatureDirections/main.cpp
  10. 3 2
      tutorial/204_Gradient/main.cpp
  11. 2 1
      tutorial/205_Laplacian/main.cpp
  12. 2 1
      tutorial/301_Slice/main.cpp
  13. 2 1
      tutorial/302_Sort/main.cpp
  14. 3 1
      tutorial/303_LaplaceEquation/main.cpp
  15. 3 1
      tutorial/304_LinearEqualityConstraints/main.cpp
  16. 2 2
      tutorial/305_QuadraticProgramming/main.cpp
  17. 2 1
      tutorial/306_EigenDecomposition/main.cpp
  18. 3 2
      tutorial/401_BiharmonicDeformation/main.cpp
  19. 2 1
      tutorial/402_PolyharmonicDeformation/main.cpp
  20. 5 3
      tutorial/403_BoundedBiharmonicWeights/main.cpp
  21. 5 3
      tutorial/404_DualQuaternionSkinning/main.cpp
  22. 4 2
      tutorial/405_AsRigidAsPossible/main.cpp
  23. 4 2
      tutorial/406_FastAutomaticSkinningTransformations/main.cpp
  24. 4 2
      tutorial/407_BiharmonicCoordinates/main.cpp
  25. 3 1
      tutorial/501_HarmonicParam/main.cpp
  26. 3 1
      tutorial/502_LSCMParam/main.cpp
  27. 3 1
      tutorial/503_ARAPParam/main.cpp
  28. 2 1
      tutorial/504_NRosyDesign/main.cpp
  29. 3 1
      tutorial/505_MIQ/main.cpp
  30. 4 2
      tutorial/506_FrameField/main.cpp
  31. 4 2
      tutorial/507_PolyVectorField/main.cpp
  32. 4 3
      tutorial/508_ConjugateField/main.cpp
  33. 3 1
      tutorial/509_Planarization/main.cpp
  34. 4 1
      tutorial/510_Integrable/main.cpp
  35. 3 1
      tutorial/601_Serialization/main.cpp
  36. 3 1
      tutorial/602_Matlab/main.cpp
  37. 3 1
      tutorial/605_Tetgen/main.cpp
  38. 2 1
      tutorial/606_AmbientOcclusion/main.cpp
  39. 3 1
      tutorial/607_Picking/main.cpp
  40. 2 1
      tutorial/608_LIM/main.cpp
  41. 4 2
      tutorial/609_Boolean/main.cpp
  42. 7 5
      tutorial/610_CSGTree/main.cpp
  43. 3 1
      tutorial/701_Statistics/main.cpp
  44. 3 1
      tutorial/702_WindingNumber/main.cpp
  45. 3 1
      tutorial/703_Decimation/main.cpp
  46. 3 1
      tutorial/704_SignedDistance/main.cpp
  47. 3 1
      tutorial/705_MarchingCubes/main.cpp
  48. 6 0
      tutorial/CMakeLists.txt
  49. 10 0
      tutorial/tutorial_shared_path.h.in

+ 2 - 1
tutorial/101_FileIO/main.cpp

@@ -1,6 +1,7 @@
 #include <igl/readOFF.h>
 #include <igl/writeOBJ.h>
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -8,7 +9,7 @@ Eigen::MatrixXi F;
 int main(int argc, char *argv[])
 {
   // Load a mesh in OFF format
-  igl::readOFF("../shared/cube.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/cube.off", V, F);
 
   // Print the vertices and faces matrices
   std::cout << "Vertices: " << std::endl << V << std::endl;

+ 2 - 1
tutorial/102_DrawMesh/main.cpp

@@ -1,5 +1,6 @@
 #include <igl/readOFF.h>
 #include <igl/viewer/Viewer.h>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -7,7 +8,7 @@ Eigen::MatrixXi F;
 int main(int argc, char *argv[])
 {
   // Load a mesh in OFF format
-  igl::readOFF("../shared/bunny.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/bunny.off", V, F);
 
   // Plot the mesh
   igl::viewer::Viewer viewer;

+ 3 - 2
tutorial/103_Events/main.cpp

@@ -1,6 +1,7 @@
 #include <igl/readOFF.h>
 #include <igl/viewer/Viewer.h>
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V1,V2;
 Eigen::MatrixXi F1,F2;
@@ -33,8 +34,8 @@ bool key_down(igl::viewer::Viewer& viewer, unsigned char key, int modifier)
 int main(int argc, char *argv[])
 {
   // Load two meshes
-  igl::readOFF("../shared/bumpy.off", V1, F1);
-  igl::readOFF("../shared/fertility.off", V2, F2);
+  igl::readOFF(tutorial_shared_path + "/bumpy.off", V1, F1);
+  igl::readOFF(tutorial_shared_path + "/fertility.off", V2, F2);
   std::cout<<R"(
 1 Switch to bump mesh
 2 Switch to fertility mesh

+ 2 - 1
tutorial/104_Colors/main.cpp

@@ -1,6 +1,7 @@
 #include <igl/readOFF.h>
 #include <igl/viewer/Viewer.h>
 #include <igl/jet.h>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -9,7 +10,7 @@ Eigen::MatrixXd C;
 int main(int argc, char *argv[])
 {
   // Load a mesh in OFF format
-  igl::readOFF("../shared/screwdriver.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/screwdriver.off", V, F);
 
   // Plot the mesh
   igl::viewer::Viewer viewer;

+ 2 - 1
tutorial/105_Overlays/main.cpp

@@ -1,6 +1,7 @@
 #include <igl/readOFF.h>
 #include <igl/viewer/Viewer.h>
 #include <sstream>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -8,7 +9,7 @@ Eigen::MatrixXi F;
 int main(int argc, char *argv[])
 {
   // Load a mesh in OFF format
-  igl::readOFF("../shared/bunny.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/bunny.off", V, F);
 
   // Find the bounding box
   Eigen::Vector3d m = V.colwise().minCoeff();

+ 2 - 1
tutorial/106_ViewerMenu/main.cpp

@@ -3,6 +3,7 @@
 #include <nanogui/formhelper.h>
 #include <nanogui/screen.h>
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -13,7 +14,7 @@ float floatVariable = 0.1f;
 int main(int argc, char *argv[])
 {
   // Load a mesh in OFF format
-  igl::readOFF("../shared/bunny.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/bunny.off", V, F);
 
   // Init the viewer
   igl::viewer::Viewer viewer;

+ 2 - 1
tutorial/201_Normals/main.cpp

@@ -4,6 +4,7 @@
 #include <igl/per_face_normals.h>
 #include <igl/per_corner_normals.h>
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -35,7 +36,7 @@ bool key_down(igl::viewer::Viewer& viewer, unsigned char key, int modifier)
 int main(int argc, char *argv[])
 {
   // Load a mesh in OFF format
-  igl::readOFF("../shared/fandisk.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/fandisk.off", V, F);
 
   // Compute per-face normals
   igl::per_face_normals(V,F,N_faces);

+ 2 - 1
tutorial/202_GaussianCurvature/main.cpp

@@ -2,6 +2,7 @@
 #include <igl/readOFF.h>
 #include <igl/viewer/Viewer.h>
 #include <igl/jet.h>
+#include "tutorial_shared_path.h"
 
 int main(int argc, char *argv[])
 {
@@ -9,7 +10,7 @@ int main(int argc, char *argv[])
   using namespace std;
   MatrixXd V;
   MatrixXi F;
-  igl::readOFF("../shared/bumpy.off",V,F);
+  igl::readOFF(tutorial_shared_path + "/bumpy.off",V,F);
 
   VectorXd K;
   igl::gaussian_curvature(V,F,K);

+ 2 - 1
tutorial/203_CurvatureDirections/main.cpp

@@ -9,6 +9,7 @@
 #include <igl/principal_curvature.h>
 #include <igl/read_triangle_mesh.h>
 #include <igl/viewer/Viewer.h>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -16,7 +17,7 @@ Eigen::MatrixXi F;
 int main(int argc, char *argv[])
 {
   using namespace Eigen;
-  std::string filename = "../shared/fertility.off";
+  std::string filename = tutorial_shared_path + "/fertility.off";
   if(argc>1)
   {
     filename = argv[1];

+ 3 - 2
tutorial/204_Gradient/main.cpp

@@ -7,6 +7,7 @@
 #include <igl/viewer/Viewer.h>
 
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 int main(int argc, char *argv[])
 {
@@ -16,11 +17,11 @@ int main(int argc, char *argv[])
   MatrixXi F;
 
   // Load a mesh in OFF format
-  igl::readOFF("../shared/cheburashka.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/cheburashka.off", V, F);
 
   // Read scalar function values from a file, U: #V by 1
   VectorXd U;
-  igl::readDMAT("../shared/cheburashka-scalar.dmat",U);
+  igl::readDMAT(tutorial_shared_path + "/cheburashka-scalar.dmat",U);
 
   // Compute gradient operator: #F*3 by #V
   SparseMatrix<double> G;

+ 2 - 1
tutorial/205_Laplacian/main.cpp

@@ -11,6 +11,7 @@
 #include <igl/viewer/Viewer.h>
 
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V,U;
 Eigen::MatrixXi F;
@@ -23,7 +24,7 @@ int main(int argc, char *argv[])
   using namespace std;
 
   // Load a mesh in OFF format
-  igl::readOFF("../shared/cow.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/cow.off", V, F);
 
   // Compute Laplace-Beltrami operator: #V by #V
   igl::cotmatrix(V,F,L);

+ 2 - 1
tutorial/301_Slice/main.cpp

@@ -4,6 +4,7 @@
 #include <igl/slice_into.h>
 #include <igl/viewer/Viewer.h>
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 int main(int argc, char *argv[])
 {
@@ -11,7 +12,7 @@ int main(int argc, char *argv[])
   using namespace std;
   MatrixXd V;
   MatrixXi F;
-  igl::readOFF("../shared/decimated-knight.off",V,F);
+  igl::readOFF(tutorial_shared_path + "/decimated-knight.off",V,F);
 
   // 100 random indicies into rows of F
   VectorXi I;

+ 2 - 1
tutorial/302_Sort/main.cpp

@@ -6,6 +6,7 @@
 #include <igl/sortrows.h>
 #include <igl/viewer/Viewer.h>
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 int main(int argc, char *argv[])
 {
@@ -13,7 +14,7 @@ int main(int argc, char *argv[])
   using namespace std;
   MatrixXd V;
   MatrixXi F;
-  igl::readOFF("../shared/decimated-knight.off",V,F);
+  igl::readOFF(tutorial_shared_path + "/decimated-knight.off",V,F);
 
   // Sort barycenters lexicographically
   MatrixXd BC,sorted_BC;

+ 3 - 1
tutorial/303_LaplaceEquation/main.cpp

@@ -11,13 +11,15 @@
 #include <igl/viewer/Viewer.h>
 #include <Eigen/Sparse>
 #include <iostream>
+#include "tutorial_shared_path.h"
+
 int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
   MatrixXd V;
   MatrixXi F;
-  igl::readOFF("../shared/camelhead.off",V,F);
+  igl::readOFF(tutorial_shared_path + "/camelhead.off",V,F);
   // Find boundary edges
   MatrixXi E;
   igl::boundary_facets(F,E);

+ 3 - 1
tutorial/304_LinearEqualityConstraints/main.cpp

@@ -8,13 +8,15 @@
 #include <igl/viewer/Viewer.h>
 #include <Eigen/Sparse>
 #include <iostream>
+#include "tutorial_shared_path.h"
+
 int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
   MatrixXd V;
   MatrixXi F;
-  igl::readOFF("../shared/cheburashka.off",V,F);
+  igl::readOFF(tutorial_shared_path + "/cheburashka.off",V,F);
 
   // Two fixed points
   VectorXi b(2,1);

+ 2 - 2
tutorial/305_QuadraticProgramming/main.cpp

@@ -8,7 +8,7 @@
 #include <igl/viewer/Viewer.h>
 #include <Eigen/Sparse>
 #include <iostream>
-
+#include "tutorial_shared_path.h"
   
 Eigen::VectorXi b;
 Eigen::VectorXd B,bc,lx,ux,Beq,Bieq,Z;
@@ -53,7 +53,7 @@ int main(int argc, char *argv[])
   using namespace std;
   MatrixXd V;
   MatrixXi F;
-  igl::readOFF("../shared/cheburashka.off",V,F);
+  igl::readOFF(tutorial_shared_path + "/cheburashka.off",V,F);
 
   // Plot the mesh
   igl::viewer::Viewer viewer;

+ 2 - 1
tutorial/306_EigenDecomposition/main.cpp

@@ -7,6 +7,7 @@
 #include <Eigen/Sparse>
 #include <iostream>
 #include <queue>
+#include "tutorial_shared_path.h"
 
 Eigen::MatrixXd V,U;
 Eigen::MatrixXi F;
@@ -19,7 +20,7 @@ int main(int argc, char * argv[])
   using namespace std;
   using namespace igl;
   VectorXd D;
-  if(!read_triangle_mesh("../shared/beetle.off",V,F))
+  if(!read_triangle_mesh(tutorial_shared_path + "/beetle.off",V,F))
   {
     cout<<"failed to load mesh"<<endl;
   }

+ 3 - 2
tutorial/401_BiharmonicDeformation/main.cpp

@@ -5,6 +5,7 @@
 #include <igl/viewer/Viewer.h>
 #include <algorithm>
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 double bc_frac = 1.0;
 double bc_dir = -0.03;
@@ -59,11 +60,11 @@ int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
-  igl::readOBJ("../shared/decimated-max.obj",V,F);
+  igl::readOBJ(tutorial_shared_path + "/decimated-max.obj",V,F);
   U=V;
   // S(i) = j: j<0 (vertex i not in handle), j >= 0 (vertex i in handle j)
   VectorXi S;
-  igl::readDMAT("../shared/decimated-max-selection.dmat",S);
+  igl::readDMAT(tutorial_shared_path + "/decimated-max-selection.dmat",S);
   igl::colon<int>(0,V.rows()-1,b);
   b.conservativeResize(stable_partition( b.data(), b.data()+b.size(), 
    [&S](int i)->bool{return S(i)>=0;})-b.data());

+ 2 - 1
tutorial/402_PolyharmonicDeformation/main.cpp

@@ -4,6 +4,7 @@
 #include <igl/viewer/Viewer.h>
 #include <algorithm>
 #include <iostream>
+#include "tutorial_shared_path.h"
 
 double z_max = 1.0;
 double z_dir = -0.03;
@@ -59,7 +60,7 @@ int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
-  igl::readOBJ("../shared/bump-domain.obj",V,F);
+  igl::readOBJ(tutorial_shared_path + "/bump-domain.obj",V,F);
   U=V;
   // Find boundary vertices outside annulus
   typedef Matrix<bool,Dynamic,1> VectorXb;

+ 5 - 3
tutorial/403_BoundedBiharmonicWeights/main.cpp

@@ -30,6 +30,8 @@
 #include <algorithm>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 typedef 
   std::vector<Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> >
   RotationList;
@@ -118,15 +120,15 @@ int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
-  igl::readMESH("../shared/hand.mesh",V,T,F);
+  igl::readMESH(tutorial_shared_path + "/hand.mesh",V,T,F);
   U=V;
-  igl::readTGF("../shared/hand.tgf",C,BE);
+  igl::readTGF(tutorial_shared_path + "/hand.tgf",C,BE);
   // retrieve parents for forward kinematics
   igl::directed_edge_parents(BE,P);
 
   // Read pose as matrix of quaternions per row
   MatrixXd Q;
-  igl::readDMAT("../shared/hand-pose.dmat",Q);
+  igl::readDMAT(tutorial_shared_path + "/hand-pose.dmat",Q);
   igl::column_to_quats(Q,pose);
   assert(pose.size() == BE.rows());
 

+ 5 - 3
tutorial/404_DualQuaternionSkinning/main.cpp

@@ -16,6 +16,8 @@
 #include <algorithm>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 typedef 
   std::vector<Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> >
   RotationList;
@@ -110,9 +112,9 @@ int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
-  igl::readOBJ("../shared/arm.obj",V,F);
+  igl::readOBJ(tutorial_shared_path + "/arm.obj",V,F);
   U=V;
-  igl::readTGF("../shared/arm.tgf",C,BE);
+  igl::readTGF(tutorial_shared_path + "/arm.tgf",C,BE);
   // retrieve parents for forward kinematics
   igl::directed_edge_parents(BE,P);
   RotationList rest_pose;
@@ -124,7 +126,7 @@ int main(int argc, char *argv[])
   const Quaterniond bend(AngleAxisd(-igl::PI*0.7,Vector3d(0,0,1)));
   poses[3][2] = rest_pose[2]*bend*rest_pose[2].conjugate();
 
-  igl::readDMAT("../shared/arm-weights.dmat",W);
+  igl::readDMAT(tutorial_shared_path + "/arm-weights.dmat",W);
   igl::lbs_matrix(V,W,M);
 
   // Plot the mesh with pseudocolors

+ 4 - 2
tutorial/405_AsRigidAsPossible/main.cpp

@@ -17,6 +17,8 @@
 #include <algorithm>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 typedef 
   std::vector<Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> >
   RotationList;
@@ -90,9 +92,9 @@ int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
-  igl::readOFF("../shared/decimated-knight.off",V,F);
+  igl::readOFF(tutorial_shared_path + "/decimated-knight.off",V,F);
   U=V;
-  igl::readDMAT("../shared/decimated-knight-selection.dmat",S);
+  igl::readDMAT(tutorial_shared_path + "/decimated-knight-selection.dmat",S);
 
   // vertices in selection
   igl::colon<int>(0,V.rows()-1,b);

+ 4 - 2
tutorial/406_FastAutomaticSkinningTransformations/main.cpp

@@ -23,6 +23,8 @@
 #include <algorithm>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 typedef 
   std::vector<Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> >
   RotationList;
@@ -142,10 +144,10 @@ int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
-  igl::readOBJ("../shared/armadillo.obj",V,F);
+  igl::readOBJ(tutorial_shared_path + "/armadillo.obj",V,F);
   U=V;
   MatrixXd W;
-  igl::readDMAT("../shared/armadillo-weights.dmat",W);
+  igl::readDMAT(tutorial_shared_path + "/armadillo-weights.dmat",W);
   igl::lbs_matrix_column(V,W,M);
 
   // Cluster according to weights

+ 4 - 2
tutorial/407_BiharmonicCoordinates/main.cpp

@@ -16,6 +16,8 @@
 #include <iostream>
 #include <queue>
 
+#include "tutorial_shared_path.h"
+
 struct Mesh
 {
   Eigen::MatrixXd V,U;
@@ -30,11 +32,11 @@ int main(int argc, char * argv[])
   using namespace Eigen;
   using namespace std;
   using namespace igl;
-  if(!readMESH("../shared/octopus-low.mesh",low.V,low.T,low.F))
+  if(!readMESH(tutorial_shared_path + "/octopus-low.mesh",low.V,low.T,low.F))
   {
     cout<<"failed to load mesh"<<endl;
   }
-  if(!readMESH("../shared/octopus-high.mesh",high.V,high.T,high.F))
+  if(!readMESH(tutorial_shared_path + "/octopus-high.mesh",high.V,high.T,high.F))
   {
     cout<<"failed to load mesh"<<endl;
   }

+ 3 - 1
tutorial/501_HarmonicParam/main.cpp

@@ -4,6 +4,8 @@
 #include <igl/readOFF.h>
 #include <igl/viewer/Viewer.h>
 
+#include "tutorial_shared_path.h"
+
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
 Eigen::MatrixXd V_uv;
@@ -31,7 +33,7 @@ bool key_down(igl::viewer::Viewer& viewer, unsigned char key, int modifier)
 int main(int argc, char *argv[])
 {
   // Load a mesh in OFF format
-  igl::readOFF("../shared/camelhead.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/camelhead.off", V, F);
 
   // Find the open boundary
   Eigen::VectorXi bnd;

+ 3 - 1
tutorial/502_LSCMParam/main.cpp

@@ -4,6 +4,8 @@
 
 #include <igl/lscm.h>
 
+#include "tutorial_shared_path.h"
+
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
 Eigen::MatrixXd V_uv;
@@ -35,7 +37,7 @@ int main(int argc, char *argv[])
   using namespace std;
 
   // Load a mesh in OFF format
-  igl::readOFF("../shared/camelhead.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/camelhead.off", V, F);
 
   // Fix two points on the boundary
   VectorXi bnd,b(2,1);

+ 3 - 1
tutorial/503_ARAPParam/main.cpp

@@ -5,6 +5,8 @@
 #include <igl/readOFF.h>
 #include <igl/viewer/Viewer.h>
 
+#include "tutorial_shared_path.h"
+
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
 Eigen::MatrixXd V_uv;
@@ -42,7 +44,7 @@ int main(int argc, char *argv[])
 {
   using namespace std;
   // Load a mesh in OFF format
-  igl::readOFF("../shared/camelhead.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/camelhead.off", V, F);
 
   // Compute the initial solution for ARAP (harmonic parametrization)
   Eigen::VectorXi bnd;

+ 2 - 1
tutorial/504_NRosyDesign/main.cpp

@@ -5,6 +5,7 @@
 #include <igl/comiso/nrosy.h>
 #include <igl/viewer/Viewer.h>
 
+#include "tutorial_shared_path.h"
 
 // Mesh
 Eigen::MatrixXd V;
@@ -122,7 +123,7 @@ int main(int argc, char *argv[])
   using namespace Eigen;
 
   // Load a mesh in OFF format
-  igl::readOFF("../shared/bumpy.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/bumpy.off", V, F);
 
   // Threshold faces with high anisotropy
   b.resize(1);

+ 3 - 1
tutorial/505_MIQ/main.cpp

@@ -14,6 +14,8 @@
 #include <igl/viewer/Viewer.h>
 #include <sstream>
 
+#include "tutorial_shared_path.h"
+
 // Input mesh
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -230,7 +232,7 @@ int main(int argc, char *argv[])
   using namespace Eigen;
 
   // Load a mesh in OFF format
-  igl::readOFF("../shared/3holes.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/3holes.off", V, F);
 
   // Compute face barycenters
   igl::barycenter(V, F, B);

+ 4 - 2
tutorial/506_FrameField/main.cpp

@@ -12,6 +12,8 @@
 #include <igl/comiso/frame_field.h>
 #include <igl/viewer/Viewer.h>
 
+#include "tutorial_shared_path.h"
+
 // Input mesh
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -177,7 +179,7 @@ int main(int argc, char *argv[])
   using namespace Eigen;
 
   // Load a mesh in OBJ format
-  igl::readOBJ("../shared/bumpy-cube.obj", V, F);
+  igl::readOBJ(tutorial_shared_path + "/bumpy-cube.obj", V, F);
 
   // Compute face barycenters
   igl::barycenter(V, F, B);
@@ -187,7 +189,7 @@ int main(int argc, char *argv[])
 
   // Load constraints
   MatrixXd temp;
-  igl::readDMAT("../shared/bumpy-cube.dmat",temp);
+  igl::readDMAT(tutorial_shared_path + "/bumpy-cube.dmat",temp);
 
   b   = temp.block(0,0,temp.rows(),1).cast<int>();
   bc1 = temp.block(0,1,temp.rows(),3);

+ 4 - 2
tutorial/507_PolyVectorField/main.cpp

@@ -10,6 +10,8 @@
 #include <iostream>
 #include <vector>
 
+#include "tutorial_shared_path.h"
+
 // Input mesh
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -127,8 +129,8 @@ int main(int argc, char *argv[])
   using namespace Eigen;
   using namespace std;
   // Load a mesh in OBJ format
-  igl::readOBJ("../shared/lilium.obj", V, F);
-  readSamples("../shared/lilium.samples.0.2", samples);
+  igl::readOBJ(tutorial_shared_path + "/lilium.obj", V, F);
+  readSamples(tutorial_shared_path + "/lilium.samples.0.2", samples);
 
   // Compute local basis for faces
   igl::local_basis(V,F,B1,B2,B3);

+ 4 - 3
tutorial/508_ConjugateField/main.cpp

@@ -12,6 +12,7 @@
 #include <vector>
 #include <cstdlib>
 
+#include "tutorial_shared_path.h"
 
 // Input mesh
 Eigen::MatrixXd V;
@@ -123,7 +124,7 @@ int main(int argc, char *argv[])
   using namespace std;
 
   // Load a mesh in OBJ format
-  igl::readOBJ("../shared/inspired_mesh.obj", V, F);
+  igl::readOBJ(tutorial_shared_path + "/inspired_mesh.obj", V, F);
   // Compute face barycenters
   igl::barycenter(V, F, B);
 
@@ -135,8 +136,8 @@ int main(int argc, char *argv[])
   global_scale =  .4*igl::avg_edge_length(V, F);
 
   // Load constraints
-  igl::readDMAT("../shared/inspired_mesh_b.dmat",b);
-  igl::readDMAT("../shared/inspired_mesh_bc.dmat",bc);
+  igl::readDMAT(tutorial_shared_path + "/inspired_mesh_b.dmat",b);
+  igl::readDMAT(tutorial_shared_path + "/inspired_mesh_bc.dmat",bc);
 
   // Interpolate to get a smooth field
   igl::n_polyvector(V, F, b, bc, smooth_pvf);

+ 3 - 1
tutorial/509_Planarization/main.cpp

@@ -10,6 +10,8 @@
 #include <vector>
 #include <cstdlib>
 
+#include "tutorial_shared_path.h"
+
 // Quad mesh generated from conjugate field
 Eigen::MatrixXd VQC;
 Eigen::MatrixXi FQC;
@@ -84,7 +86,7 @@ int main(int argc, char *argv[])
   using namespace std;
 
   // Load a quad mesh generated by a conjugate field
-  igl::readOFF("../shared/inspired_mesh_quads_Conjugate.off", VQC, FQC);
+  igl::readOFF(tutorial_shared_path + "/inspired_mesh_quads_Conjugate.off", VQC, FQC);
 
   // Convert it in a triangle mesh
   FQCtri.resize(2*FQC.rows(), 3);

+ 4 - 1
tutorial/510_Integrable/main.cpp

@@ -24,6 +24,9 @@
 #include <iostream>
 #include <fstream>
 #include <igl/matlab_format.h>
+
+#include "tutorial_shared_path.h"
+
 using namespace std;
 
 // Input mesh
@@ -624,7 +627,7 @@ int main(int argc, char *argv[])
 {
 
   // Load a mesh
-  igl::readOBJ("../shared/inspired_mesh.obj", V, F);
+  igl::readOBJ(tutorial_shared_path + "/inspired_mesh.obj", V, F);
 
   printf("--Initialization--\n");
   V_border = igl::is_border_vertex(V,F);

+ 3 - 1
tutorial/601_Serialization/main.cpp

@@ -3,6 +3,8 @@
 #include <igl/xml/serialize_xml.h>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
 
@@ -62,7 +64,7 @@ int main(int argc, char *argv[])
   State stateIn, stateOut;
 
   // Load a mesh in OFF format
-  igl::readOFF("../shared/2triangles.off",stateIn.V,stateIn.F);
+  igl::readOFF(tutorial_shared_path + "/2triangles.off",stateIn.V,stateIn.F);
 
   // Save some integers in a vector
   stateIn.ids.push_back(6);

+ 3 - 1
tutorial/602_Matlab/main.cpp

@@ -5,6 +5,8 @@
 #include <igl/viewer/Viewer.h>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 // Base mesh
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -45,7 +47,7 @@ bool key_down(igl::viewer::Viewer& viewer, unsigned char key, int modifier)
 int main(int argc, char *argv[])
 {
   // Load a mesh in OFF format
-  igl::readOFF("../shared/3holes.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/3holes.off", V, F);
 
   // Launch MATLAB
   igl::matlab::mlinit(&engine);

+ 3 - 1
tutorial/605_Tetgen/main.cpp

@@ -3,6 +3,8 @@
 #include <igl/readOFF.h>
 #include <igl/barycenter.h>
 
+#include "tutorial_shared_path.h"
+
 // Input polygon
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -62,7 +64,7 @@ int main(int argc, char *argv[])
   using namespace std;
 
   // Load a surface mesh
-  igl::readOFF("../shared/fertility.off",V,F);
+  igl::readOFF(tutorial_shared_path + "/fertility.off",V,F);
 
   // Tetrahedralize the interior
   igl::tetgen::tetrahedralize(V,F,"pq1.414Y", TV,TT,TF);

+ 2 - 1
tutorial/606_AmbientOcclusion/main.cpp

@@ -5,6 +5,7 @@
 #include <igl/viewer/Viewer.h>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
 
 // Mesh
 Eigen::MatrixXd V;
@@ -58,7 +59,7 @@ int main(int argc, char *argv[])
     "Press , to turn down lighting"<<endl;
 
   // Load a mesh in OFF format
-  igl::readOFF("../shared/fertility.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/fertility.off", V, F);
 
   MatrixXd N;
   igl::per_vertex_normals(V,F,N);

+ 3 - 1
tutorial/607_Picking/main.cpp

@@ -5,6 +5,8 @@
 
 #include <algorithm>
 
+#include "tutorial_shared_path.h"
+
 // Mesh
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
@@ -54,7 +56,7 @@ int main(int argc, char *argv[])
   using namespace Eigen;
   using namespace std;
   // Load a mesh in OFF format
-  igl::readOFF("../shared/fertility.off", V, F);
+  igl::readOFF(tutorial_shared_path + "/fertility.off", V, F);
 
   // Create a BVH for raycasting
   ei = new igl::embree::EmbreeIntersector();

+ 2 - 1
tutorial/608_LIM/main.cpp

@@ -5,6 +5,7 @@
 #include <igl/viewer/Viewer.h>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
 
 // Mesh
 Eigen::MatrixX3d V0;
@@ -65,7 +66,7 @@ int main(int argc, char *argv[])
   barriersEnabled = true;
 
   // load a mesh in OFF format
-  igl::readOFF("../shared/grid.off",V0,F);
+  igl::readOFF(tutorial_shared_path + "/grid.off",V0,F);
   V1 = V0;
 
   // find bottom and left boundary vertices

+ 4 - 2
tutorial/609_Boolean/main.cpp

@@ -7,6 +7,8 @@
 #include <Eigen/Core>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 Eigen::MatrixXd VA,VB,VC;
 Eigen::VectorXi J,I;
 Eigen::MatrixXi FA,FB,FC;
@@ -75,8 +77,8 @@ int main(int argc, char *argv[])
 {
   using namespace Eigen;
   using namespace std;
-  igl::readOFF("../shared/cheburashka.off",VA,FA);
-  igl::readOFF("../shared/decimated-knight.off",VB,FB);
+  igl::readOFF(tutorial_shared_path + "/cheburashka.off",VA,FA);
+  igl::readOFF(tutorial_shared_path + "/decimated-knight.off",VB,FB);
   // Plot the mesh with pseudocolors
   igl::viewer::Viewer viewer;
 

+ 7 - 5
tutorial/610_CSGTree/main.cpp

@@ -4,6 +4,8 @@
 #include <igl/jet.h>
 #include <Eigen/Core>
 
+#include "tutorial_shared_path.h"
+
 int main(int argc, char * argv[])
 {
   using namespace Eigen;
@@ -13,11 +15,11 @@ int main(int argc, char * argv[])
   MatrixXi FA,FB,FC,FD,FE;
   MatrixXd VA,VB,VC,VD,VE;
   // Read in inputs as double precision floating point meshes
-  read_triangle_mesh("../shared/cube.obj"     ,VA,FA);
-  read_triangle_mesh("../shared/sphere.obj"   ,VB,FB);
-  read_triangle_mesh("../shared/xcylinder.obj",VC,FC);
-  read_triangle_mesh("../shared/ycylinder.obj",VD,FD);
-  read_triangle_mesh("../shared/zcylinder.obj",VE,FE);
+  read_triangle_mesh(tutorial_shared_path + "/cube.obj"     ,VA,FA);
+  read_triangle_mesh(tutorial_shared_path + "/sphere.obj"   ,VB,FB);
+  read_triangle_mesh(tutorial_shared_path + "/xcylinder.obj",VC,FC);
+  read_triangle_mesh(tutorial_shared_path + "/ycylinder.obj",VD,FD);
+  read_triangle_mesh(tutorial_shared_path + "/zcylinder.obj",VE,FE);
   igl::viewer::Viewer viewer;
 
   int num_views = 5+4;

+ 3 - 1
tutorial/701_Statistics/main.cpp

@@ -5,6 +5,8 @@
 #include <Eigen/Core>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 int main(int argc, char *argv[])
 {
   using namespace Eigen;
@@ -13,7 +15,7 @@ int main(int argc, char *argv[])
   MatrixXd V;
   MatrixXi F;
 
-  igl::readOBJ("../shared/horse_quad.obj",V,F);
+  igl::readOBJ(tutorial_shared_path + "/horse_quad.obj",V,F);
 
   // Count the number of irregular vertices, the border is ignored
   vector<bool> irregular = igl::is_irregular_vertex(V,F);

+ 3 - 1
tutorial/702_WindingNumber/main.cpp

@@ -9,6 +9,8 @@
 #include <Eigen/Sparse>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 Eigen::MatrixXd V,BC;
 Eigen::VectorXd W;
 Eigen::MatrixXi T,F,G;
@@ -101,7 +103,7 @@ int main(int argc, char *argv[])
 
   // Load mesh: (V,T) tet-mesh of convex hull, F contains facets of input
   // surface mesh _after_ self-intersection resolution
-  igl::readMESH("../shared/big-sigcat.mesh",V,T,F);
+  igl::readMESH(tutorial_shared_path + "/big-sigcat.mesh",V,T,F);
 
   // Compute barycenters of all tets
   igl::barycenter(V,T,BC);

+ 3 - 1
tutorial/703_Decimation/main.cpp

@@ -7,6 +7,8 @@
 #include <iostream>
 #include <set>
 
+#include "tutorial_shared_path.h"
+
 int main(int argc, char * argv[])
 {
   using namespace std;
@@ -16,7 +18,7 @@ int main(int argc, char * argv[])
   cout<<"  [space]  toggle animation."<<endl;
   cout<<"  'r'  reset."<<endl;
   // Load a closed manifold mesh
-  string filename("../shared/fertility.off");
+  string filename(tutorial_shared_path + "/fertility.off");
   if(argc>=2)
   {
     filename = argv[1];

+ 3 - 1
tutorial/704_SignedDistance/main.cpp

@@ -14,6 +14,8 @@
 #include <Eigen/Sparse>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 Eigen::MatrixXd V;
 Eigen::MatrixXi T,F;
 igl::AABB<Eigen::MatrixXd,3> tree;
@@ -127,7 +129,7 @@ int main(int argc, char *argv[])
 
   // Load mesh: (V,T) tet-mesh of convex hull, F contains original surface
   // triangles
-  igl::readMESH("../shared/bunny.mesh",V,T,F);
+  igl::readMESH(tutorial_shared_path + "/bunny.mesh",V,T,F);
 
 
   // Encapsulated call to point_mesh_squared_distance to determine bounds

+ 3 - 1
tutorial/705_MarchingCubes/main.cpp

@@ -5,6 +5,8 @@
 #include <Eigen/Core>
 #include <iostream>
 
+#include "tutorial_shared_path.h"
+
 int main(int argc, char * argv[])
 {
   using namespace Eigen;
@@ -14,7 +16,7 @@ int main(int argc, char * argv[])
   MatrixXd V;
   // Read in inputs as double precision floating point meshes
   read_triangle_mesh(
-      "../shared/armadillo.obj",V,F);
+      tutorial_shared_path + "/armadillo.obj",V,F);
   // number of vertices on the largest side
   const int s = 50;
   const RowVector3d Vmin = V.colwise().minCoeff();

+ 6 - 0
tutorial/CMakeLists.txt

@@ -134,6 +134,12 @@ endif(UNIX AND NOT APPLE)
 
 #message(FATAL_ERROR ${SHARED_LIBRARIES})
 
+# Store location of tutorial/shared directory 
+set(TUTORIAL_SHARED_PATH ${CMAKE_CURRENT_SOURCE_DIR}/shared)
+message("tutorial_shared_path = ${TUTORIAL_SHARED_PATH}")
+configure_file(tutorial_shared_path.h.in "${CMAKE_BINARY_DIR}/tutorial_shared_path.h")
+include_directories(${CMAKE_BINARY_DIR})
+
 # Chapter 1
 add_subdirectory("101_FileIO")
 add_subdirectory("102_DrawMesh")

+ 10 - 0
tutorial/tutorial_shared_path.h.in

@@ -0,0 +1,10 @@
+#ifndef tutorial_shared_path_h_included
+#define tutorial_shared_path_h_included
+
+#include <string>
+
+const std::string tutorial_shared_path("@TUTORIAL_SHARED_PATH@");
+
+#endif
+
+