#include #include #include #include #include #include int main(int argc, char *argv[]) { using namespace igl; IGL_TICTOC_LAMBDA; Eigen::MatrixXd VA, VB; Eigen::MatrixXi FA, FB; // Load a hot mess of a mesh igl::read_triangle_mesh(argc>1?argv[1]:TUTORIAL_SHARED_PATH "/truck.obj", VA, FA); // Load a solid mesh igl::read_triangle_mesh(argc>2?argv[2]:TUTORIAL_SHARED_PATH "/bunny.off", VB, FB); if(argc<2) { // resize bunny VB.rowwise() -= VB.colwise().mean(); VB /= (VB.colwise().maxCoeff()-VB.colwise().minCoeff()).maxCoeff(); VB *= 1.15; VB.rowwise() += VA.colwise().mean(); } Eigen::VectorXi J; Eigen::MatrixXd VC; Eigen::MatrixXi FC; Eigen::Array D; using namespace igl::copyleft::cgal; tictoc(); // More patches, less intersection handling igl::copyleft::cgal::trim_with_solid(VA, FA, VB, FB, CHECK_EACH_PATCH, VC, FC, D, J); printf("CHECK_EACH_PATCH: %g secs, |FC| = %d, |D| = %d\n", tictoc(),FC.rows(),D.count()); // More intersection handling, fewer patches igl::copyleft::cgal::trim_with_solid(VA, FA, VB, FB, RESOLVE_BOTH_AND_RESTORE_THEN_CHECK_EACH_PATCH, VC, FC, D, J); printf("RESOLVE_BOTH_...: %g secs, |FC| = %d, |D| = %d\n", tictoc(),FC.rows(),D.count()); igl::opengl::glfw::Viewer vr; vr.data().set_mesh(VC, FC); // Turn on double sided lighting vr.data().double_sided = true; vr.data().set_face_based(true); vr.data().set_data(D.cast()); Eigen::MatrixXd CM = (Eigen::MatrixXd(2,3)<< 1,1,1, GOLD_DIFFUSE[0],GOLD_DIFFUSE[1],GOLD_DIFFUSE[2] ).finished(); vr.data().set_colormap(CM); vr.append_mesh(); vr.data().set_mesh(VB, FB); vr.data().show_lines = false; // Make a semi-transparent orange matcap { Eigen::Matrix R(256,256), G(256,256), B(256,256), A(256,256); for(int i = 0;i