diff --git a/CMakeLists.txt b/CMakeLists.txt index b2fc12c480..ba264c8c36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,8 +89,6 @@ enable_testing () # Enable C++11 language standard. set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_C_STANDARD 11) -set(CMAKE_C_STANDARD_REQUIRED ON) if(NOT WIN32) # Add DEBUG flags to debug builds. @@ -172,7 +170,7 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STRE add_compile_options(-Werror=return-type) #removes LOTS of extraneous Eigen warnings - add_compile_options(-Wno-ignored-attributes) + # add_compile_options(-Wno-ignored-attributes) # Tamas: Eigen include dirs are marked as SYSTEM if (SLIC3R_ASAN) add_compile_options(-fsanitize=address -fno-omit-frame-pointer) @@ -314,7 +312,7 @@ if (NOT Eigen3_FOUND) set(Eigen3_FOUND 1) set(EIGEN3_INCLUDE_DIR ${LIBDIR}/eigen/) endif () -include_directories(${EIGEN3_INCLUDE_DIR}) +include_directories(BEFORE SYSTEM ${EIGEN3_INCLUDE_DIR}) # Find expat or use bundled version # Always use the system libexpat on Linux. diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index ca4e63fbc1..5bc33c896d 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -36,6 +36,11 @@ set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination direct option(DEP_DEBUG "Build debug variants (only applicable on Windows)" ON) option(DEP_WX_STABLE "Build against wxWidgets stable 3.0 as opposed to default 3.1 (Linux only)" OFF) +# IGL static library in release mode produces 50MB binary. On the build server, it should be +# disabled and used in header-only mode. On developer machines, it can be enabled to speed +# up conpilation and suppress warnings coming from IGL. +option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors and increase binary size." OFF) + message(STATUS "PrusaSlicer deps DESTDIR: ${DESTDIR}") message(STATUS "PrusaSlicer deps debug build: ${DEP_DEBUG}") @@ -99,6 +104,7 @@ else() dep_gtest dep_nlopt dep_qhull + dep_libigl ) endif() diff --git a/deps/deps-unix-common.cmake b/deps/deps-unix-common.cmake index d6a92efcb3..c44a6ec205 100644 --- a/deps/deps-unix-common.cmake +++ b/deps/deps-unix-common.cmake @@ -32,7 +32,6 @@ ExternalProject_Add(dep_nlopt -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local ${DEP_CMAKE_OPTS} ) - find_package(Git REQUIRED) ExternalProject_Add(dep_qhull @@ -45,3 +44,32 @@ ExternalProject_Add(dep_qhull ${DEP_CMAKE_OPTS} PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/qhull-mods.patch ) + +ExternalProject_Add(dep_libigl + EXCLUDE_FROM_ALL 1 + URL "https://github.com/libigl/libigl/archive/v2.0.0.tar.gz" + URL_HASH SHA256=42518e6b106c7209c73435fd260ed5d34edeb254852495b4c95dce2d95401328 + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local + -DLIBIGL_BUILD_PYTHON=OFF + -DLIBIGL_BUILD_TESTS=OFF + -DLIBIGL_BUILD_TUTORIALS=OFF + -DLIBIGL_USE_STATIC_LIBRARY=${DEP_BUILD_IGL_STATIC} + -DLIBIGL_WITHOUT_COPYLEFT=OFF + -DLIBIGL_WITH_CGAL=OFF + -DLIBIGL_WITH_COMISO=OFF + -DLIBIGL_WITH_CORK=OFF + -DLIBIGL_WITH_EMBREE=OFF + -DLIBIGL_WITH_MATLAB=OFF + -DLIBIGL_WITH_MOSEK=OFF + -DLIBIGL_WITH_OPENGL=OFF + -DLIBIGL_WITH_OPENGL_GLFW=OFF + -DLIBIGL_WITH_OPENGL_GLFW_IMGUI=OFF + -DLIBIGL_WITH_PNG=OFF + -DLIBIGL_WITH_PYTHON=OFF + -DLIBIGL_WITH_TETGEN=OFF + -DLIBIGL_WITH_TRIANGLE=OFF + -DLIBIGL_WITH_XML=OFF + PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/igl-fixes.patch +) + diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 041160f407..d7daf84253 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -252,6 +252,51 @@ else () set(DEP_WXWIDGETS_LIBDIR "vc_x64_lib") endif () +find_package(Git REQUIRED) + +ExternalProject_Add(dep_libigl + EXCLUDE_FROM_ALL 1 + URL "https://github.com/libigl/libigl/archive/v2.0.0.tar.gz" + URL_HASH SHA256=42518e6b106c7209c73435fd260ed5d34edeb254852495b4c95dce2d95401328 + CMAKE_GENERATOR "${DEP_MSVC_GEN}" + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local + -DLIBIGL_BUILD_PYTHON=OFF + -DLIBIGL_BUILD_TESTS=OFF + -DLIBIGL_BUILD_TUTORIALS=OFF + -DLIBIGL_USE_STATIC_LIBRARY=${DEP_BUILD_IGL_STATIC} + -DLIBIGL_WITHOUT_COPYLEFT=OFF + -DLIBIGL_WITH_CGAL=OFF + -DLIBIGL_WITH_COMISO=OFF + -DLIBIGL_WITH_CORK=OFF + -DLIBIGL_WITH_EMBREE=OFF + -DLIBIGL_WITH_MATLAB=OFF + -DLIBIGL_WITH_MOSEK=OFF + -DLIBIGL_WITH_OPENGL=OFF + -DLIBIGL_WITH_OPENGL_GLFW=OFF + -DLIBIGL_WITH_OPENGL_GLFW_IMGUI=OFF + -DLIBIGL_WITH_PNG=OFF + -DLIBIGL_WITH_PYTHON=OFF + -DLIBIGL_WITH_TETGEN=OFF + -DLIBIGL_WITH_TRIANGLE=OFF + -DLIBIGL_WITH_XML=OFF + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_DEBUG_POSTFIX=d + PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/igl-fixes.patch + BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj + INSTALL_COMMAND "" +) + +if (${DEP_DEBUG}) + ExternalProject_Get_Property(dep_libigl BINARY_DIR) + ExternalProject_Add_Step(dep_libigl build_debug + DEPENDEES build + DEPENDERS install + COMMAND msbuild /m /P:Configuration=Debug INSTALL.vcxproj + WORKING_DIRECTORY "${BINARY_DIR}" + ) +endif () + ExternalProject_Add(dep_wxwidgets EXCLUDE_FROM_ALL 1 GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets" diff --git a/deps/igl-fixes.patch b/deps/igl-fixes.patch new file mode 100644 index 0000000000..b0ff9205d0 --- /dev/null +++ b/deps/igl-fixes.patch @@ -0,0 +1,128 @@ +diff --git a/cmake/libigl-config.cmake.in b/cmake/libigl-config.cmake.in +index 317c745c..f9808e1e 100644 +--- a/cmake/libigl-config.cmake.in ++++ b/cmake/libigl-config.cmake.in +@@ -2,28 +2,28 @@ + + include(${CMAKE_CURRENT_LIST_DIR}/libigl-export.cmake) + +-if (TARGET igl::core) +- if (NOT TARGET Eigen3::Eigen) +- find_package(Eigen3 QUIET) +- if (NOT Eigen3_FOUND) +- # try with PkgCOnfig +- find_package(PkgConfig REQUIRED) +- pkg_check_modules(Eigen3 QUIET IMPORTED_TARGET eigen3) +- endif() +- +- if (NOT Eigen3_FOUND) +- message(FATAL_ERROR "Could not find required dependency Eigen3") +- set(libigl_core_FOUND FALSE) +- else() +- target_link_libraries(igl::core INTERFACE PkgConfig::Eigen3) +- set(libigl_core_FOUND TRUE) +- endif() +- else() +- target_link_libraries(igl::core INTERFACE Eigen3::Eigen) +- set(libigl_core_FOUND TRUE) +- endif() +- +-endif() ++# if (TARGET igl::core) ++# if (NOT TARGET Eigen3::Eigen) ++# find_package(Eigen3 QUIET) ++# if (NOT Eigen3_FOUND) ++# # try with PkgCOnfig ++# find_package(PkgConfig REQUIRED) ++# pkg_check_modules(Eigen3 QUIET IMPORTED_TARGET eigen3) ++# endif() ++# ++# if (NOT Eigen3_FOUND) ++# message(FATAL_ERROR "Could not find required dependency Eigen3") ++# set(libigl_core_FOUND FALSE) ++# else() ++# target_link_libraries(igl::core INTERFACE PkgConfig::Eigen3) ++# set(libigl_core_FOUND TRUE) ++# endif() ++# else() ++# target_link_libraries(igl::core INTERFACE Eigen3::Eigen) ++# set(libigl_core_FOUND TRUE) ++# endif() ++# ++# endif() + + check_required_components(libigl) + +diff --git a/cmake/libigl.cmake b/cmake/libigl.cmake +index 4b11007a..47e6c395 100644 +--- a/cmake/libigl.cmake ++++ b/cmake/libigl.cmake +@@ -445,6 +445,7 @@ function(install_dir_files dir_name) + if(NOT LIBIGL_USE_STATIC_LIBRARY) + file(GLOB public_sources + ${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.c + ) + endif() + list(APPEND files_to_install ${public_sources}) +diff --git a/include/igl/AABB.cpp b/include/igl/AABB.cpp +index 09537335..92e90cb7 100644 +--- a/include/igl/AABB.cpp ++++ b/include/igl/AABB.cpp +@@ -1071,5 +1071,11 @@ template void igl::AABB, 3>::init, 2>::init >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&); + template double igl::AABB, 3>::squared_distance >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, double, int&, Eigen::PlainObjectBase >&) const; ++template float igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::squared_distance const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Matrix const&, int&, Eigen::PlainObjectBase >&) const; + template bool igl::AABB, 3>::intersect_ray >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, igl::Hit&) const; ++template bool igl::AABB, 3>::intersect_ray >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, std::vector&) const; ++ ++template void igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::init const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&); ++ ++template bool igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::intersect_ray const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Matrix const&, Eigen::Matrix const&, std::vector >&) const; + #endif +diff --git a/include/igl/barycenter.cpp b/include/igl/barycenter.cpp +index 065f82aa..ec2d96cd 100644 +--- a/include/igl/barycenter.cpp ++++ b/include/igl/barycenter.cpp +@@ -54,4 +54,6 @@ template void igl::barycenter, Eigen::M + template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); + template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); + template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); ++ ++template void igl::barycenter const, 0, Eigen::Stride<0, 0> >, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Matrix >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::PlainObjectBase >&); + #endif +diff --git a/include/igl/point_simplex_squared_distance.cpp b/include/igl/point_simplex_squared_distance.cpp +index 2b98bd28..c66d9ae1 100644 +--- a/include/igl/point_simplex_squared_distance.cpp ++++ b/include/igl/point_simplex_squared_distance.cpp +@@ -178,4 +178,6 @@ template void igl::point_simplex_squared_distance<3, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); + template void igl::point_simplex_squared_distance<2, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); + template void igl::point_simplex_squared_distance<2, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); ++ ++template void igl::point_simplex_squared_distance<3, Eigen::Matrix, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Map const, 0, Eigen::Stride<0, 0> >, float, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Map const, 0, Eigen::Stride<0, 0> >::Index, float&, Eigen::MatrixBase >&); + #endif +diff --git a/include/igl/ray_box_intersect.cpp b/include/igl/ray_box_intersect.cpp +index 4a88b89e..b547f8f8 100644 +--- a/include/igl/ray_box_intersect.cpp ++++ b/include/igl/ray_box_intersect.cpp +@@ -147,4 +147,6 @@ IGL_INLINE bool igl::ray_box_intersect( + #ifdef IGL_STATIC_LIBRARY + // Explicit template instantiation + template bool igl::ray_box_intersect, Eigen::Matrix, double>(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::AlignedBox const&, double const&, double const&, double&, double&); ++ ++template bool igl::ray_box_intersect, Eigen::Matrix, float>(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::AlignedBox const&, float const&, float const&, float&, float&); + #endif +diff --git a/include/igl/ray_mesh_intersect.cpp b/include/igl/ray_mesh_intersect.cpp +index 9a70a22b..4233e722 100644 +--- a/include/igl/ray_mesh_intersect.cpp ++++ b/include/igl/ray_mesh_intersect.cpp +@@ -83,4 +83,7 @@ IGL_INLINE bool igl::ray_mesh_intersect( + template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, std::vector >&); + template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, igl::Hit&); + template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Block const, 1, -1, false> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 1, -1, false> > const&, igl::Hit&); ++template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Block const, 1, -1, false> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 1, -1, false> > const&, std::vector >&); ++ ++template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Block const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> > const&, std::vector >&); + #endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7240634668..61faa05710 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,6 +12,7 @@ add_subdirectory(poly2tri) add_subdirectory(qhull) add_subdirectory(Shiny) add_subdirectory(semver) +add_subdirectory(libigl) # Adding libnest2d project for bin packing... set(LIBNEST2D_UNITTESTS ON CACHE BOOL "Force generating unittests for libnest2d") diff --git a/src/libigl/CMakeLists.txt b/src/libigl/CMakeLists.txt new file mode 100644 index 0000000000..0852fad729 --- /dev/null +++ b/src/libigl/CMakeLists.txt @@ -0,0 +1,14 @@ +project(libigl) +cmake_minimum_required(VERSION 3.0) + +add_library(libigl INTERFACE) + +find_package(libigl QUIET) + +if(libigl_FOUND) + message(STATUS "IGL found, using system version...") + target_link_libraries(libigl INTERFACE igl::core) +else() + message(STATUS "IGL NOT found, using bundled version...") + target_include_directories(libigl INTERFACE SYSTEM ${LIBDIR}/libigl) +endif() diff --git a/src/igl/AABB.cpp b/src/libigl/igl/AABB.cpp similarity index 100% rename from src/igl/AABB.cpp rename to src/libigl/igl/AABB.cpp diff --git a/src/igl/AABB.h b/src/libigl/igl/AABB.h similarity index 100% rename from src/igl/AABB.h rename to src/libigl/igl/AABB.h diff --git a/src/igl/ARAPEnergyType.h b/src/libigl/igl/ARAPEnergyType.h similarity index 100% rename from src/igl/ARAPEnergyType.h rename to src/libigl/igl/ARAPEnergyType.h diff --git a/src/igl/AtA_cached.cpp b/src/libigl/igl/AtA_cached.cpp similarity index 100% rename from src/igl/AtA_cached.cpp rename to src/libigl/igl/AtA_cached.cpp diff --git a/src/igl/AtA_cached.h b/src/libigl/igl/AtA_cached.h similarity index 100% rename from src/igl/AtA_cached.h rename to src/libigl/igl/AtA_cached.h diff --git a/src/igl/C_STR.h b/src/libigl/igl/C_STR.h similarity index 100% rename from src/igl/C_STR.h rename to src/libigl/igl/C_STR.h diff --git a/src/igl/Camera.h b/src/libigl/igl/Camera.h similarity index 100% rename from src/igl/Camera.h rename to src/libigl/igl/Camera.h diff --git a/src/igl/EPS.cpp b/src/libigl/igl/EPS.cpp similarity index 100% rename from src/igl/EPS.cpp rename to src/libigl/igl/EPS.cpp diff --git a/src/igl/EPS.h b/src/libigl/igl/EPS.h similarity index 100% rename from src/igl/EPS.h rename to src/libigl/igl/EPS.h diff --git a/src/igl/HalfEdgeIterator.cpp b/src/libigl/igl/HalfEdgeIterator.cpp similarity index 100% rename from src/igl/HalfEdgeIterator.cpp rename to src/libigl/igl/HalfEdgeIterator.cpp diff --git a/src/igl/HalfEdgeIterator.h b/src/libigl/igl/HalfEdgeIterator.h similarity index 100% rename from src/igl/HalfEdgeIterator.h rename to src/libigl/igl/HalfEdgeIterator.h diff --git a/src/igl/Hit.h b/src/libigl/igl/Hit.h similarity index 100% rename from src/igl/Hit.h rename to src/libigl/igl/Hit.h diff --git a/src/igl/IO b/src/libigl/igl/IO similarity index 100% rename from src/igl/IO rename to src/libigl/igl/IO diff --git a/src/igl/IndexComparison.h b/src/libigl/igl/IndexComparison.h similarity index 100% rename from src/igl/IndexComparison.h rename to src/libigl/igl/IndexComparison.h diff --git a/src/igl/LinSpaced.h b/src/libigl/igl/LinSpaced.h similarity index 100% rename from src/igl/LinSpaced.h rename to src/libigl/igl/LinSpaced.h diff --git a/src/igl/MeshBooleanType.h b/src/libigl/igl/MeshBooleanType.h similarity index 100% rename from src/igl/MeshBooleanType.h rename to src/libigl/igl/MeshBooleanType.h diff --git a/src/igl/NormalType.h b/src/libigl/igl/NormalType.h similarity index 100% rename from src/igl/NormalType.h rename to src/libigl/igl/NormalType.h diff --git a/src/igl/ONE.h b/src/libigl/igl/ONE.h similarity index 100% rename from src/igl/ONE.h rename to src/libigl/igl/ONE.h diff --git a/src/igl/PI.h b/src/libigl/igl/PI.h similarity index 100% rename from src/igl/PI.h rename to src/libigl/igl/PI.h diff --git a/src/igl/REDRUM.h b/src/libigl/igl/REDRUM.h similarity index 100% rename from src/igl/REDRUM.h rename to src/libigl/igl/REDRUM.h diff --git a/src/igl/STR.h b/src/libigl/igl/STR.h similarity index 100% rename from src/igl/STR.h rename to src/libigl/igl/STR.h diff --git a/src/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp b/src/libigl/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp diff --git a/src/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp b/src/libigl/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp diff --git a/src/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp b/src/libigl/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp diff --git a/src/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp b/src/libigl/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp diff --git a/src/igl/Singular_Value_Decomposition_Preamble.hpp b/src/libigl/igl/Singular_Value_Decomposition_Preamble.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Preamble.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Preamble.hpp diff --git a/src/igl/SolverStatus.h b/src/libigl/igl/SolverStatus.h similarity index 100% rename from src/igl/SolverStatus.h rename to src/libigl/igl/SolverStatus.h diff --git a/src/igl/SortableRow.h b/src/libigl/igl/SortableRow.h similarity index 100% rename from src/igl/SortableRow.h rename to src/libigl/igl/SortableRow.h diff --git a/src/igl/Timer.h b/src/libigl/igl/Timer.h similarity index 100% rename from src/igl/Timer.h rename to src/libigl/igl/Timer.h diff --git a/src/igl/Viewport.h b/src/libigl/igl/Viewport.h similarity index 100% rename from src/igl/Viewport.h rename to src/libigl/igl/Viewport.h diff --git a/src/igl/WindingNumberAABB.h b/src/libigl/igl/WindingNumberAABB.h similarity index 100% rename from src/igl/WindingNumberAABB.h rename to src/libigl/igl/WindingNumberAABB.h diff --git a/src/igl/WindingNumberMethod.h b/src/libigl/igl/WindingNumberMethod.h similarity index 100% rename from src/igl/WindingNumberMethod.h rename to src/libigl/igl/WindingNumberMethod.h diff --git a/src/igl/WindingNumberTree.h b/src/libigl/igl/WindingNumberTree.h similarity index 100% rename from src/igl/WindingNumberTree.h rename to src/libigl/igl/WindingNumberTree.h diff --git a/src/igl/ZERO.h b/src/libigl/igl/ZERO.h similarity index 100% rename from src/igl/ZERO.h rename to src/libigl/igl/ZERO.h diff --git a/src/igl/active_set.cpp b/src/libigl/igl/active_set.cpp similarity index 100% rename from src/igl/active_set.cpp rename to src/libigl/igl/active_set.cpp diff --git a/src/igl/active_set.h b/src/libigl/igl/active_set.h similarity index 100% rename from src/igl/active_set.h rename to src/libigl/igl/active_set.h diff --git a/src/igl/adjacency_list.cpp b/src/libigl/igl/adjacency_list.cpp similarity index 100% rename from src/igl/adjacency_list.cpp rename to src/libigl/igl/adjacency_list.cpp diff --git a/src/igl/adjacency_list.h b/src/libigl/igl/adjacency_list.h similarity index 100% rename from src/igl/adjacency_list.h rename to src/libigl/igl/adjacency_list.h diff --git a/src/igl/adjacency_matrix.cpp b/src/libigl/igl/adjacency_matrix.cpp similarity index 100% rename from src/igl/adjacency_matrix.cpp rename to src/libigl/igl/adjacency_matrix.cpp diff --git a/src/igl/adjacency_matrix.h b/src/libigl/igl/adjacency_matrix.h similarity index 100% rename from src/igl/adjacency_matrix.h rename to src/libigl/igl/adjacency_matrix.h diff --git a/src/igl/all.cpp b/src/libigl/igl/all.cpp similarity index 100% rename from src/igl/all.cpp rename to src/libigl/igl/all.cpp diff --git a/src/igl/all.h b/src/libigl/igl/all.h similarity index 100% rename from src/igl/all.h rename to src/libigl/igl/all.h diff --git a/src/igl/all_edges.cpp b/src/libigl/igl/all_edges.cpp similarity index 100% rename from src/igl/all_edges.cpp rename to src/libigl/igl/all_edges.cpp diff --git a/src/igl/all_edges.h b/src/libigl/igl/all_edges.h similarity index 100% rename from src/igl/all_edges.h rename to src/libigl/igl/all_edges.h diff --git a/src/igl/all_pairs_distances.cpp b/src/libigl/igl/all_pairs_distances.cpp similarity index 100% rename from src/igl/all_pairs_distances.cpp rename to src/libigl/igl/all_pairs_distances.cpp diff --git a/src/igl/all_pairs_distances.h b/src/libigl/igl/all_pairs_distances.h similarity index 100% rename from src/igl/all_pairs_distances.h rename to src/libigl/igl/all_pairs_distances.h diff --git a/src/igl/ambient_occlusion.cpp b/src/libigl/igl/ambient_occlusion.cpp similarity index 100% rename from src/igl/ambient_occlusion.cpp rename to src/libigl/igl/ambient_occlusion.cpp diff --git a/src/igl/ambient_occlusion.h b/src/libigl/igl/ambient_occlusion.h similarity index 100% rename from src/igl/ambient_occlusion.h rename to src/libigl/igl/ambient_occlusion.h diff --git a/src/igl/angular_distance.cpp b/src/libigl/igl/angular_distance.cpp similarity index 100% rename from src/igl/angular_distance.cpp rename to src/libigl/igl/angular_distance.cpp diff --git a/src/igl/angular_distance.h b/src/libigl/igl/angular_distance.h similarity index 100% rename from src/igl/angular_distance.h rename to src/libigl/igl/angular_distance.h diff --git a/src/igl/anttweakbar/ReAntTweakBar.cpp b/src/libigl/igl/anttweakbar/ReAntTweakBar.cpp similarity index 100% rename from src/igl/anttweakbar/ReAntTweakBar.cpp rename to src/libigl/igl/anttweakbar/ReAntTweakBar.cpp diff --git a/src/igl/anttweakbar/ReAntTweakBar.h b/src/libigl/igl/anttweakbar/ReAntTweakBar.h similarity index 100% rename from src/igl/anttweakbar/ReAntTweakBar.h rename to src/libigl/igl/anttweakbar/ReAntTweakBar.h diff --git a/src/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp b/src/libigl/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp similarity index 100% rename from src/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp rename to src/libigl/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp diff --git a/src/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h b/src/libigl/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h similarity index 100% rename from src/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h rename to src/libigl/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h diff --git a/src/igl/any.cpp b/src/libigl/igl/any.cpp similarity index 100% rename from src/igl/any.cpp rename to src/libigl/igl/any.cpp diff --git a/src/igl/any.h b/src/libigl/igl/any.h similarity index 100% rename from src/igl/any.h rename to src/libigl/igl/any.h diff --git a/src/igl/any_of.cpp b/src/libigl/igl/any_of.cpp similarity index 100% rename from src/igl/any_of.cpp rename to src/libigl/igl/any_of.cpp diff --git a/src/igl/any_of.h b/src/libigl/igl/any_of.h similarity index 100% rename from src/igl/any_of.h rename to src/libigl/igl/any_of.h diff --git a/src/igl/arap.cpp b/src/libigl/igl/arap.cpp similarity index 100% rename from src/igl/arap.cpp rename to src/libigl/igl/arap.cpp diff --git a/src/igl/arap.h b/src/libigl/igl/arap.h similarity index 100% rename from src/igl/arap.h rename to src/libigl/igl/arap.h diff --git a/src/igl/arap_dof.cpp b/src/libigl/igl/arap_dof.cpp similarity index 100% rename from src/igl/arap_dof.cpp rename to src/libigl/igl/arap_dof.cpp diff --git a/src/igl/arap_dof.h b/src/libigl/igl/arap_dof.h similarity index 100% rename from src/igl/arap_dof.h rename to src/libigl/igl/arap_dof.h diff --git a/src/igl/arap_linear_block.cpp b/src/libigl/igl/arap_linear_block.cpp similarity index 100% rename from src/igl/arap_linear_block.cpp rename to src/libigl/igl/arap_linear_block.cpp diff --git a/src/igl/arap_linear_block.h b/src/libigl/igl/arap_linear_block.h similarity index 100% rename from src/igl/arap_linear_block.h rename to src/libigl/igl/arap_linear_block.h diff --git a/src/igl/arap_rhs.cpp b/src/libigl/igl/arap_rhs.cpp similarity index 100% rename from src/igl/arap_rhs.cpp rename to src/libigl/igl/arap_rhs.cpp diff --git a/src/igl/arap_rhs.h b/src/libigl/igl/arap_rhs.h similarity index 100% rename from src/igl/arap_rhs.h rename to src/libigl/igl/arap_rhs.h diff --git a/src/igl/average_onto_faces.cpp b/src/libigl/igl/average_onto_faces.cpp similarity index 100% rename from src/igl/average_onto_faces.cpp rename to src/libigl/igl/average_onto_faces.cpp diff --git a/src/igl/average_onto_faces.h b/src/libigl/igl/average_onto_faces.h similarity index 100% rename from src/igl/average_onto_faces.h rename to src/libigl/igl/average_onto_faces.h diff --git a/src/igl/average_onto_vertices.cpp b/src/libigl/igl/average_onto_vertices.cpp similarity index 100% rename from src/igl/average_onto_vertices.cpp rename to src/libigl/igl/average_onto_vertices.cpp diff --git a/src/igl/average_onto_vertices.h b/src/libigl/igl/average_onto_vertices.h similarity index 100% rename from src/igl/average_onto_vertices.h rename to src/libigl/igl/average_onto_vertices.h diff --git a/src/igl/avg_edge_length.cpp b/src/libigl/igl/avg_edge_length.cpp similarity index 100% rename from src/igl/avg_edge_length.cpp rename to src/libigl/igl/avg_edge_length.cpp diff --git a/src/igl/avg_edge_length.h b/src/libigl/igl/avg_edge_length.h similarity index 100% rename from src/igl/avg_edge_length.h rename to src/libigl/igl/avg_edge_length.h diff --git a/src/igl/axis_angle_to_quat.cpp b/src/libigl/igl/axis_angle_to_quat.cpp similarity index 100% rename from src/igl/axis_angle_to_quat.cpp rename to src/libigl/igl/axis_angle_to_quat.cpp diff --git a/src/igl/axis_angle_to_quat.h b/src/libigl/igl/axis_angle_to_quat.h similarity index 100% rename from src/igl/axis_angle_to_quat.h rename to src/libigl/igl/axis_angle_to_quat.h diff --git a/src/igl/barycenter.cpp b/src/libigl/igl/barycenter.cpp similarity index 100% rename from src/igl/barycenter.cpp rename to src/libigl/igl/barycenter.cpp diff --git a/src/igl/barycenter.h b/src/libigl/igl/barycenter.h similarity index 100% rename from src/igl/barycenter.h rename to src/libigl/igl/barycenter.h diff --git a/src/igl/barycentric_coordinates.cpp b/src/libigl/igl/barycentric_coordinates.cpp similarity index 100% rename from src/igl/barycentric_coordinates.cpp rename to src/libigl/igl/barycentric_coordinates.cpp diff --git a/src/igl/barycentric_coordinates.h b/src/libigl/igl/barycentric_coordinates.h similarity index 100% rename from src/igl/barycentric_coordinates.h rename to src/libigl/igl/barycentric_coordinates.h diff --git a/src/igl/barycentric_to_global.cpp b/src/libigl/igl/barycentric_to_global.cpp similarity index 100% rename from src/igl/barycentric_to_global.cpp rename to src/libigl/igl/barycentric_to_global.cpp diff --git a/src/igl/barycentric_to_global.h b/src/libigl/igl/barycentric_to_global.h similarity index 100% rename from src/igl/barycentric_to_global.h rename to src/libigl/igl/barycentric_to_global.h diff --git a/src/igl/basename.cpp b/src/libigl/igl/basename.cpp similarity index 100% rename from src/igl/basename.cpp rename to src/libigl/igl/basename.cpp diff --git a/src/igl/basename.h b/src/libigl/igl/basename.h similarity index 100% rename from src/igl/basename.h rename to src/libigl/igl/basename.h diff --git a/src/igl/bbw.cpp b/src/libigl/igl/bbw.cpp similarity index 100% rename from src/igl/bbw.cpp rename to src/libigl/igl/bbw.cpp diff --git a/src/igl/bbw.h b/src/libigl/igl/bbw.h similarity index 100% rename from src/igl/bbw.h rename to src/libigl/igl/bbw.h diff --git a/src/igl/bfs.cpp b/src/libigl/igl/bfs.cpp similarity index 100% rename from src/igl/bfs.cpp rename to src/libigl/igl/bfs.cpp diff --git a/src/igl/bfs.h b/src/libigl/igl/bfs.h similarity index 100% rename from src/igl/bfs.h rename to src/libigl/igl/bfs.h diff --git a/src/igl/bfs_orient.cpp b/src/libigl/igl/bfs_orient.cpp similarity index 100% rename from src/igl/bfs_orient.cpp rename to src/libigl/igl/bfs_orient.cpp diff --git a/src/igl/bfs_orient.h b/src/libigl/igl/bfs_orient.h similarity index 100% rename from src/igl/bfs_orient.h rename to src/libigl/igl/bfs_orient.h diff --git a/src/igl/biharmonic_coordinates.cpp b/src/libigl/igl/biharmonic_coordinates.cpp similarity index 100% rename from src/igl/biharmonic_coordinates.cpp rename to src/libigl/igl/biharmonic_coordinates.cpp diff --git a/src/igl/biharmonic_coordinates.h b/src/libigl/igl/biharmonic_coordinates.h similarity index 100% rename from src/igl/biharmonic_coordinates.h rename to src/libigl/igl/biharmonic_coordinates.h diff --git a/src/igl/bijective_composite_harmonic_mapping.cpp b/src/libigl/igl/bijective_composite_harmonic_mapping.cpp similarity index 100% rename from src/igl/bijective_composite_harmonic_mapping.cpp rename to src/libigl/igl/bijective_composite_harmonic_mapping.cpp diff --git a/src/igl/bijective_composite_harmonic_mapping.h b/src/libigl/igl/bijective_composite_harmonic_mapping.h similarity index 100% rename from src/igl/bijective_composite_harmonic_mapping.h rename to src/libigl/igl/bijective_composite_harmonic_mapping.h diff --git a/src/igl/bone_parents.cpp b/src/libigl/igl/bone_parents.cpp similarity index 100% rename from src/igl/bone_parents.cpp rename to src/libigl/igl/bone_parents.cpp diff --git a/src/igl/bone_parents.h b/src/libigl/igl/bone_parents.h similarity index 100% rename from src/igl/bone_parents.h rename to src/libigl/igl/bone_parents.h diff --git a/src/igl/boundary_conditions.cpp b/src/libigl/igl/boundary_conditions.cpp similarity index 100% rename from src/igl/boundary_conditions.cpp rename to src/libigl/igl/boundary_conditions.cpp diff --git a/src/igl/boundary_conditions.h b/src/libigl/igl/boundary_conditions.h similarity index 100% rename from src/igl/boundary_conditions.h rename to src/libigl/igl/boundary_conditions.h diff --git a/src/igl/boundary_facets.cpp b/src/libigl/igl/boundary_facets.cpp similarity index 100% rename from src/igl/boundary_facets.cpp rename to src/libigl/igl/boundary_facets.cpp diff --git a/src/igl/boundary_facets.h b/src/libigl/igl/boundary_facets.h similarity index 100% rename from src/igl/boundary_facets.h rename to src/libigl/igl/boundary_facets.h diff --git a/src/igl/boundary_loop.cpp b/src/libigl/igl/boundary_loop.cpp similarity index 100% rename from src/igl/boundary_loop.cpp rename to src/libigl/igl/boundary_loop.cpp diff --git a/src/igl/boundary_loop.h b/src/libigl/igl/boundary_loop.h similarity index 100% rename from src/igl/boundary_loop.h rename to src/libigl/igl/boundary_loop.h diff --git a/src/igl/bounding_box.cpp b/src/libigl/igl/bounding_box.cpp similarity index 100% rename from src/igl/bounding_box.cpp rename to src/libigl/igl/bounding_box.cpp diff --git a/src/igl/bounding_box.h b/src/libigl/igl/bounding_box.h similarity index 100% rename from src/igl/bounding_box.h rename to src/libigl/igl/bounding_box.h diff --git a/src/igl/bounding_box_diagonal.cpp b/src/libigl/igl/bounding_box_diagonal.cpp similarity index 100% rename from src/igl/bounding_box_diagonal.cpp rename to src/libigl/igl/bounding_box_diagonal.cpp diff --git a/src/igl/bounding_box_diagonal.h b/src/libigl/igl/bounding_box_diagonal.h similarity index 100% rename from src/igl/bounding_box_diagonal.h rename to src/libigl/igl/bounding_box_diagonal.h diff --git a/src/igl/canonical_quaternions.cpp b/src/libigl/igl/canonical_quaternions.cpp similarity index 100% rename from src/igl/canonical_quaternions.cpp rename to src/libigl/igl/canonical_quaternions.cpp diff --git a/src/igl/canonical_quaternions.h b/src/libigl/igl/canonical_quaternions.h similarity index 100% rename from src/igl/canonical_quaternions.h rename to src/libigl/igl/canonical_quaternions.h diff --git a/src/igl/cat.cpp b/src/libigl/igl/cat.cpp similarity index 100% rename from src/igl/cat.cpp rename to src/libigl/igl/cat.cpp diff --git a/src/igl/cat.h b/src/libigl/igl/cat.h similarity index 100% rename from src/igl/cat.h rename to src/libigl/igl/cat.h diff --git a/src/igl/ceil.cpp b/src/libigl/igl/ceil.cpp similarity index 100% rename from src/igl/ceil.cpp rename to src/libigl/igl/ceil.cpp diff --git a/src/igl/ceil.h b/src/libigl/igl/ceil.h similarity index 100% rename from src/igl/ceil.h rename to src/libigl/igl/ceil.h diff --git a/src/igl/centroid.cpp b/src/libigl/igl/centroid.cpp similarity index 100% rename from src/igl/centroid.cpp rename to src/libigl/igl/centroid.cpp diff --git a/src/igl/centroid.h b/src/libigl/igl/centroid.h similarity index 100% rename from src/igl/centroid.h rename to src/libigl/igl/centroid.h diff --git a/src/igl/circulation.cpp b/src/libigl/igl/circulation.cpp similarity index 100% rename from src/igl/circulation.cpp rename to src/libigl/igl/circulation.cpp diff --git a/src/igl/circulation.h b/src/libigl/igl/circulation.h similarity index 100% rename from src/igl/circulation.h rename to src/libigl/igl/circulation.h diff --git a/src/igl/circumradius.cpp b/src/libigl/igl/circumradius.cpp similarity index 100% rename from src/igl/circumradius.cpp rename to src/libigl/igl/circumradius.cpp diff --git a/src/igl/circumradius.h b/src/libigl/igl/circumradius.h similarity index 100% rename from src/igl/circumradius.h rename to src/libigl/igl/circumradius.h diff --git a/src/igl/collapse_edge.cpp b/src/libigl/igl/collapse_edge.cpp similarity index 100% rename from src/igl/collapse_edge.cpp rename to src/libigl/igl/collapse_edge.cpp diff --git a/src/igl/collapse_edge.h b/src/libigl/igl/collapse_edge.h similarity index 100% rename from src/igl/collapse_edge.h rename to src/libigl/igl/collapse_edge.h diff --git a/src/igl/collapse_small_triangles.cpp b/src/libigl/igl/collapse_small_triangles.cpp similarity index 100% rename from src/igl/collapse_small_triangles.cpp rename to src/libigl/igl/collapse_small_triangles.cpp diff --git a/src/igl/collapse_small_triangles.h b/src/libigl/igl/collapse_small_triangles.h similarity index 100% rename from src/igl/collapse_small_triangles.h rename to src/libigl/igl/collapse_small_triangles.h diff --git a/src/igl/colon.cpp b/src/libigl/igl/colon.cpp similarity index 100% rename from src/igl/colon.cpp rename to src/libigl/igl/colon.cpp diff --git a/src/igl/colon.h b/src/libigl/igl/colon.h similarity index 100% rename from src/igl/colon.h rename to src/libigl/igl/colon.h diff --git a/src/igl/colormap.cpp b/src/libigl/igl/colormap.cpp similarity index 100% rename from src/igl/colormap.cpp rename to src/libigl/igl/colormap.cpp diff --git a/src/igl/colormap.h b/src/libigl/igl/colormap.h similarity index 100% rename from src/igl/colormap.h rename to src/libigl/igl/colormap.h diff --git a/src/igl/column_to_quats.cpp b/src/libigl/igl/column_to_quats.cpp similarity index 100% rename from src/igl/column_to_quats.cpp rename to src/libigl/igl/column_to_quats.cpp diff --git a/src/igl/column_to_quats.h b/src/libigl/igl/column_to_quats.h similarity index 100% rename from src/igl/column_to_quats.h rename to src/libigl/igl/column_to_quats.h diff --git a/src/igl/columnize.cpp b/src/libigl/igl/columnize.cpp similarity index 100% rename from src/igl/columnize.cpp rename to src/libigl/igl/columnize.cpp diff --git a/src/igl/columnize.h b/src/libigl/igl/columnize.h similarity index 100% rename from src/igl/columnize.h rename to src/libigl/igl/columnize.h diff --git a/src/igl/comb_cross_field.cpp b/src/libigl/igl/comb_cross_field.cpp similarity index 100% rename from src/igl/comb_cross_field.cpp rename to src/libigl/igl/comb_cross_field.cpp diff --git a/src/igl/comb_cross_field.h b/src/libigl/igl/comb_cross_field.h similarity index 100% rename from src/igl/comb_cross_field.h rename to src/libigl/igl/comb_cross_field.h diff --git a/src/igl/comb_frame_field.cpp b/src/libigl/igl/comb_frame_field.cpp similarity index 100% rename from src/igl/comb_frame_field.cpp rename to src/libigl/igl/comb_frame_field.cpp diff --git a/src/igl/comb_frame_field.h b/src/libigl/igl/comb_frame_field.h similarity index 100% rename from src/igl/comb_frame_field.h rename to src/libigl/igl/comb_frame_field.h diff --git a/src/igl/comb_line_field.cpp b/src/libigl/igl/comb_line_field.cpp similarity index 100% rename from src/igl/comb_line_field.cpp rename to src/libigl/igl/comb_line_field.cpp diff --git a/src/igl/comb_line_field.h b/src/libigl/igl/comb_line_field.h similarity index 100% rename from src/igl/comb_line_field.h rename to src/libigl/igl/comb_line_field.h diff --git a/src/igl/combine.cpp b/src/libigl/igl/combine.cpp similarity index 100% rename from src/igl/combine.cpp rename to src/libigl/igl/combine.cpp diff --git a/src/igl/combine.h b/src/libigl/igl/combine.h similarity index 100% rename from src/igl/combine.h rename to src/libigl/igl/combine.h diff --git a/src/igl/components.cpp b/src/libigl/igl/components.cpp similarity index 100% rename from src/igl/components.cpp rename to src/libigl/igl/components.cpp diff --git a/src/igl/components.h b/src/libigl/igl/components.h similarity index 100% rename from src/igl/components.h rename to src/libigl/igl/components.h diff --git a/src/igl/compute_frame_field_bisectors.cpp b/src/libigl/igl/compute_frame_field_bisectors.cpp similarity index 100% rename from src/igl/compute_frame_field_bisectors.cpp rename to src/libigl/igl/compute_frame_field_bisectors.cpp diff --git a/src/igl/compute_frame_field_bisectors.h b/src/libigl/igl/compute_frame_field_bisectors.h similarity index 100% rename from src/igl/compute_frame_field_bisectors.h rename to src/libigl/igl/compute_frame_field_bisectors.h diff --git a/src/igl/connect_boundary_to_infinity.cpp b/src/libigl/igl/connect_boundary_to_infinity.cpp similarity index 100% rename from src/igl/connect_boundary_to_infinity.cpp rename to src/libigl/igl/connect_boundary_to_infinity.cpp diff --git a/src/igl/connect_boundary_to_infinity.h b/src/libigl/igl/connect_boundary_to_infinity.h similarity index 100% rename from src/igl/connect_boundary_to_infinity.h rename to src/libigl/igl/connect_boundary_to_infinity.h diff --git a/src/igl/copyleft/README.md b/src/libigl/igl/copyleft/README.md similarity index 100% rename from src/igl/copyleft/README.md rename to src/libigl/igl/copyleft/README.md diff --git a/src/igl/copyleft/cgal/BinaryWindingNumberOperations.h b/src/libigl/igl/copyleft/cgal/BinaryWindingNumberOperations.h similarity index 100% rename from src/igl/copyleft/cgal/BinaryWindingNumberOperations.h rename to src/libigl/igl/copyleft/cgal/BinaryWindingNumberOperations.h diff --git a/src/igl/copyleft/cgal/CGAL_includes.hpp b/src/libigl/igl/copyleft/cgal/CGAL_includes.hpp similarity index 100% rename from src/igl/copyleft/cgal/CGAL_includes.hpp rename to src/libigl/igl/copyleft/cgal/CGAL_includes.hpp diff --git a/src/igl/copyleft/cgal/CSGTree.h b/src/libigl/igl/copyleft/cgal/CSGTree.h similarity index 100% rename from src/igl/copyleft/cgal/CSGTree.h rename to src/libigl/igl/copyleft/cgal/CSGTree.h diff --git a/src/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h b/src/libigl/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h similarity index 100% rename from src/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h rename to src/libigl/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h diff --git a/src/igl/copyleft/cgal/SelfIntersectMesh.h b/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h similarity index 100% rename from src/igl/copyleft/cgal/SelfIntersectMesh.h rename to src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h diff --git a/src/igl/copyleft/cgal/assign.cpp b/src/libigl/igl/copyleft/cgal/assign.cpp similarity index 100% rename from src/igl/copyleft/cgal/assign.cpp rename to src/libigl/igl/copyleft/cgal/assign.cpp diff --git a/src/igl/copyleft/cgal/assign.h b/src/libigl/igl/copyleft/cgal/assign.h similarity index 100% rename from src/igl/copyleft/cgal/assign.h rename to src/libigl/igl/copyleft/cgal/assign.h diff --git a/src/igl/copyleft/cgal/assign_scalar.cpp b/src/libigl/igl/copyleft/cgal/assign_scalar.cpp similarity index 100% rename from src/igl/copyleft/cgal/assign_scalar.cpp rename to src/libigl/igl/copyleft/cgal/assign_scalar.cpp diff --git a/src/igl/copyleft/cgal/assign_scalar.h b/src/libigl/igl/copyleft/cgal/assign_scalar.h similarity index 100% rename from src/igl/copyleft/cgal/assign_scalar.h rename to src/libigl/igl/copyleft/cgal/assign_scalar.h diff --git a/src/igl/copyleft/cgal/barycenter.cpp b/src/libigl/igl/copyleft/cgal/barycenter.cpp similarity index 100% rename from src/igl/copyleft/cgal/barycenter.cpp rename to src/libigl/igl/copyleft/cgal/barycenter.cpp diff --git a/src/igl/copyleft/cgal/cell_adjacency.cpp b/src/libigl/igl/copyleft/cgal/cell_adjacency.cpp similarity index 100% rename from src/igl/copyleft/cgal/cell_adjacency.cpp rename to src/libigl/igl/copyleft/cgal/cell_adjacency.cpp diff --git a/src/igl/copyleft/cgal/cell_adjacency.h b/src/libigl/igl/copyleft/cgal/cell_adjacency.h similarity index 100% rename from src/igl/copyleft/cgal/cell_adjacency.h rename to src/libigl/igl/copyleft/cgal/cell_adjacency.h diff --git a/src/igl/copyleft/cgal/closest_facet.cpp b/src/libigl/igl/copyleft/cgal/closest_facet.cpp similarity index 100% rename from src/igl/copyleft/cgal/closest_facet.cpp rename to src/libigl/igl/copyleft/cgal/closest_facet.cpp diff --git a/src/igl/copyleft/cgal/closest_facet.h b/src/libigl/igl/copyleft/cgal/closest_facet.h similarity index 100% rename from src/igl/copyleft/cgal/closest_facet.h rename to src/libigl/igl/copyleft/cgal/closest_facet.h diff --git a/src/igl/copyleft/cgal/complex_to_mesh.cpp b/src/libigl/igl/copyleft/cgal/complex_to_mesh.cpp similarity index 100% rename from src/igl/copyleft/cgal/complex_to_mesh.cpp rename to src/libigl/igl/copyleft/cgal/complex_to_mesh.cpp diff --git a/src/igl/copyleft/cgal/complex_to_mesh.h b/src/libigl/igl/copyleft/cgal/complex_to_mesh.h similarity index 100% rename from src/igl/copyleft/cgal/complex_to_mesh.h rename to src/libigl/igl/copyleft/cgal/complex_to_mesh.h diff --git a/src/igl/copyleft/cgal/component_inside_component.cpp b/src/libigl/igl/copyleft/cgal/component_inside_component.cpp similarity index 100% rename from src/igl/copyleft/cgal/component_inside_component.cpp rename to src/libigl/igl/copyleft/cgal/component_inside_component.cpp diff --git a/src/igl/copyleft/cgal/component_inside_component.h b/src/libigl/igl/copyleft/cgal/component_inside_component.h similarity index 100% rename from src/igl/copyleft/cgal/component_inside_component.h rename to src/libigl/igl/copyleft/cgal/component_inside_component.h diff --git a/src/igl/copyleft/cgal/convex_hull.cpp b/src/libigl/igl/copyleft/cgal/convex_hull.cpp similarity index 100% rename from src/igl/copyleft/cgal/convex_hull.cpp rename to src/libigl/igl/copyleft/cgal/convex_hull.cpp diff --git a/src/igl/copyleft/cgal/convex_hull.h b/src/libigl/igl/copyleft/cgal/convex_hull.h similarity index 100% rename from src/igl/copyleft/cgal/convex_hull.h rename to src/libigl/igl/copyleft/cgal/convex_hull.h diff --git a/src/igl/copyleft/cgal/delaunay_triangulation.cpp b/src/libigl/igl/copyleft/cgal/delaunay_triangulation.cpp similarity index 100% rename from src/igl/copyleft/cgal/delaunay_triangulation.cpp rename to src/libigl/igl/copyleft/cgal/delaunay_triangulation.cpp diff --git a/src/igl/copyleft/cgal/delaunay_triangulation.h b/src/libigl/igl/copyleft/cgal/delaunay_triangulation.h similarity index 100% rename from src/igl/copyleft/cgal/delaunay_triangulation.h rename to src/libigl/igl/copyleft/cgal/delaunay_triangulation.h diff --git a/src/igl/copyleft/cgal/extract_cells.cpp b/src/libigl/igl/copyleft/cgal/extract_cells.cpp similarity index 100% rename from src/igl/copyleft/cgal/extract_cells.cpp rename to src/libigl/igl/copyleft/cgal/extract_cells.cpp diff --git a/src/igl/copyleft/cgal/extract_cells.h b/src/libigl/igl/copyleft/cgal/extract_cells.h similarity index 100% rename from src/igl/copyleft/cgal/extract_cells.h rename to src/libigl/igl/copyleft/cgal/extract_cells.h diff --git a/src/igl/copyleft/cgal/extract_feature.cpp b/src/libigl/igl/copyleft/cgal/extract_feature.cpp similarity index 100% rename from src/igl/copyleft/cgal/extract_feature.cpp rename to src/libigl/igl/copyleft/cgal/extract_feature.cpp diff --git a/src/igl/copyleft/cgal/extract_feature.h b/src/libigl/igl/copyleft/cgal/extract_feature.h similarity index 100% rename from src/igl/copyleft/cgal/extract_feature.h rename to src/libigl/igl/copyleft/cgal/extract_feature.h diff --git a/src/igl/copyleft/cgal/fast_winding_number.cpp b/src/libigl/igl/copyleft/cgal/fast_winding_number.cpp similarity index 100% rename from src/igl/copyleft/cgal/fast_winding_number.cpp rename to src/libigl/igl/copyleft/cgal/fast_winding_number.cpp diff --git a/src/igl/copyleft/cgal/fast_winding_number.h b/src/libigl/igl/copyleft/cgal/fast_winding_number.h similarity index 100% rename from src/igl/copyleft/cgal/fast_winding_number.h rename to src/libigl/igl/copyleft/cgal/fast_winding_number.h diff --git a/src/igl/copyleft/cgal/half_space_box.cpp b/src/libigl/igl/copyleft/cgal/half_space_box.cpp similarity index 100% rename from src/igl/copyleft/cgal/half_space_box.cpp rename to src/libigl/igl/copyleft/cgal/half_space_box.cpp diff --git a/src/igl/copyleft/cgal/half_space_box.h b/src/libigl/igl/copyleft/cgal/half_space_box.h similarity index 100% rename from src/igl/copyleft/cgal/half_space_box.h rename to src/libigl/igl/copyleft/cgal/half_space_box.h diff --git a/src/igl/copyleft/cgal/hausdorff.cpp b/src/libigl/igl/copyleft/cgal/hausdorff.cpp similarity index 100% rename from src/igl/copyleft/cgal/hausdorff.cpp rename to src/libigl/igl/copyleft/cgal/hausdorff.cpp diff --git a/src/igl/copyleft/cgal/hausdorff.h b/src/libigl/igl/copyleft/cgal/hausdorff.h similarity index 100% rename from src/igl/copyleft/cgal/hausdorff.h rename to src/libigl/igl/copyleft/cgal/hausdorff.h diff --git a/src/igl/copyleft/cgal/incircle.cpp b/src/libigl/igl/copyleft/cgal/incircle.cpp similarity index 100% rename from src/igl/copyleft/cgal/incircle.cpp rename to src/libigl/igl/copyleft/cgal/incircle.cpp diff --git a/src/igl/copyleft/cgal/incircle.h b/src/libigl/igl/copyleft/cgal/incircle.h similarity index 100% rename from src/igl/copyleft/cgal/incircle.h rename to src/libigl/igl/copyleft/cgal/incircle.h diff --git a/src/igl/copyleft/cgal/insert_into_cdt.cpp b/src/libigl/igl/copyleft/cgal/insert_into_cdt.cpp similarity index 100% rename from src/igl/copyleft/cgal/insert_into_cdt.cpp rename to src/libigl/igl/copyleft/cgal/insert_into_cdt.cpp diff --git a/src/igl/copyleft/cgal/insert_into_cdt.h b/src/libigl/igl/copyleft/cgal/insert_into_cdt.h similarity index 100% rename from src/igl/copyleft/cgal/insert_into_cdt.h rename to src/libigl/igl/copyleft/cgal/insert_into_cdt.h diff --git a/src/igl/copyleft/cgal/insphere.cpp b/src/libigl/igl/copyleft/cgal/insphere.cpp similarity index 100% rename from src/igl/copyleft/cgal/insphere.cpp rename to src/libigl/igl/copyleft/cgal/insphere.cpp diff --git a/src/igl/copyleft/cgal/insphere.h b/src/libigl/igl/copyleft/cgal/insphere.h similarity index 100% rename from src/igl/copyleft/cgal/insphere.h rename to src/libigl/igl/copyleft/cgal/insphere.h diff --git a/src/igl/copyleft/cgal/intersect_other.cpp b/src/libigl/igl/copyleft/cgal/intersect_other.cpp similarity index 100% rename from src/igl/copyleft/cgal/intersect_other.cpp rename to src/libigl/igl/copyleft/cgal/intersect_other.cpp diff --git a/src/igl/copyleft/cgal/intersect_other.h b/src/libigl/igl/copyleft/cgal/intersect_other.h similarity index 100% rename from src/igl/copyleft/cgal/intersect_other.h rename to src/libigl/igl/copyleft/cgal/intersect_other.h diff --git a/src/igl/copyleft/cgal/intersect_with_half_space.cpp b/src/libigl/igl/copyleft/cgal/intersect_with_half_space.cpp similarity index 100% rename from src/igl/copyleft/cgal/intersect_with_half_space.cpp rename to src/libigl/igl/copyleft/cgal/intersect_with_half_space.cpp diff --git a/src/igl/copyleft/cgal/intersect_with_half_space.h b/src/libigl/igl/copyleft/cgal/intersect_with_half_space.h similarity index 100% rename from src/igl/copyleft/cgal/intersect_with_half_space.h rename to src/libigl/igl/copyleft/cgal/intersect_with_half_space.h diff --git a/src/igl/copyleft/cgal/lexicographic_triangulation.cpp b/src/libigl/igl/copyleft/cgal/lexicographic_triangulation.cpp similarity index 100% rename from src/igl/copyleft/cgal/lexicographic_triangulation.cpp rename to src/libigl/igl/copyleft/cgal/lexicographic_triangulation.cpp diff --git a/src/igl/copyleft/cgal/lexicographic_triangulation.h b/src/libigl/igl/copyleft/cgal/lexicographic_triangulation.h similarity index 100% rename from src/igl/copyleft/cgal/lexicographic_triangulation.h rename to src/libigl/igl/copyleft/cgal/lexicographic_triangulation.h diff --git a/src/igl/copyleft/cgal/list_to_matrix.cpp b/src/libigl/igl/copyleft/cgal/list_to_matrix.cpp similarity index 100% rename from src/igl/copyleft/cgal/list_to_matrix.cpp rename to src/libigl/igl/copyleft/cgal/list_to_matrix.cpp diff --git a/src/igl/copyleft/cgal/mesh_boolean.cpp b/src/libigl/igl/copyleft/cgal/mesh_boolean.cpp similarity index 100% rename from src/igl/copyleft/cgal/mesh_boolean.cpp rename to src/libigl/igl/copyleft/cgal/mesh_boolean.cpp diff --git a/src/igl/copyleft/cgal/mesh_boolean.h b/src/libigl/igl/copyleft/cgal/mesh_boolean.h similarity index 100% rename from src/igl/copyleft/cgal/mesh_boolean.h rename to src/libigl/igl/copyleft/cgal/mesh_boolean.h diff --git a/src/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp b/src/libigl/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp similarity index 100% rename from src/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp rename to src/libigl/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp diff --git a/src/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h b/src/libigl/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h similarity index 100% rename from src/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h rename to src/libigl/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h diff --git a/src/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp b/src/libigl/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp similarity index 100% rename from src/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp rename to src/libigl/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp diff --git a/src/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h b/src/libigl/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h similarity index 100% rename from src/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h rename to src/libigl/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h diff --git a/src/igl/copyleft/cgal/mesh_to_polyhedron.cpp b/src/libigl/igl/copyleft/cgal/mesh_to_polyhedron.cpp similarity index 100% rename from src/igl/copyleft/cgal/mesh_to_polyhedron.cpp rename to src/libigl/igl/copyleft/cgal/mesh_to_polyhedron.cpp diff --git a/src/igl/copyleft/cgal/mesh_to_polyhedron.h b/src/libigl/igl/copyleft/cgal/mesh_to_polyhedron.h similarity index 100% rename from src/igl/copyleft/cgal/mesh_to_polyhedron.h rename to src/libigl/igl/copyleft/cgal/mesh_to_polyhedron.h diff --git a/src/igl/copyleft/cgal/minkowski_sum.cpp b/src/libigl/igl/copyleft/cgal/minkowski_sum.cpp similarity index 100% rename from src/igl/copyleft/cgal/minkowski_sum.cpp rename to src/libigl/igl/copyleft/cgal/minkowski_sum.cpp diff --git a/src/igl/copyleft/cgal/minkowski_sum.h b/src/libigl/igl/copyleft/cgal/minkowski_sum.h similarity index 100% rename from src/igl/copyleft/cgal/minkowski_sum.h rename to src/libigl/igl/copyleft/cgal/minkowski_sum.h diff --git a/src/igl/copyleft/cgal/order_facets_around_edge.cpp b/src/libigl/igl/copyleft/cgal/order_facets_around_edge.cpp similarity index 100% rename from src/igl/copyleft/cgal/order_facets_around_edge.cpp rename to src/libigl/igl/copyleft/cgal/order_facets_around_edge.cpp diff --git a/src/igl/copyleft/cgal/order_facets_around_edge.h b/src/libigl/igl/copyleft/cgal/order_facets_around_edge.h similarity index 100% rename from src/igl/copyleft/cgal/order_facets_around_edge.h rename to src/libigl/igl/copyleft/cgal/order_facets_around_edge.h diff --git a/src/igl/copyleft/cgal/order_facets_around_edges.cpp b/src/libigl/igl/copyleft/cgal/order_facets_around_edges.cpp similarity index 100% rename from src/igl/copyleft/cgal/order_facets_around_edges.cpp rename to src/libigl/igl/copyleft/cgal/order_facets_around_edges.cpp diff --git a/src/igl/copyleft/cgal/order_facets_around_edges.h b/src/libigl/igl/copyleft/cgal/order_facets_around_edges.h similarity index 100% rename from src/igl/copyleft/cgal/order_facets_around_edges.h rename to src/libigl/igl/copyleft/cgal/order_facets_around_edges.h diff --git a/src/igl/copyleft/cgal/orient2D.cpp b/src/libigl/igl/copyleft/cgal/orient2D.cpp similarity index 100% rename from src/igl/copyleft/cgal/orient2D.cpp rename to src/libigl/igl/copyleft/cgal/orient2D.cpp diff --git a/src/igl/copyleft/cgal/orient2D.h b/src/libigl/igl/copyleft/cgal/orient2D.h similarity index 100% rename from src/igl/copyleft/cgal/orient2D.h rename to src/libigl/igl/copyleft/cgal/orient2D.h diff --git a/src/igl/copyleft/cgal/orient3D.cpp b/src/libigl/igl/copyleft/cgal/orient3D.cpp similarity index 100% rename from src/igl/copyleft/cgal/orient3D.cpp rename to src/libigl/igl/copyleft/cgal/orient3D.cpp diff --git a/src/igl/copyleft/cgal/orient3D.h b/src/libigl/igl/copyleft/cgal/orient3D.h similarity index 100% rename from src/igl/copyleft/cgal/orient3D.h rename to src/libigl/igl/copyleft/cgal/orient3D.h diff --git a/src/igl/copyleft/cgal/outer_element.cpp b/src/libigl/igl/copyleft/cgal/outer_element.cpp similarity index 100% rename from src/igl/copyleft/cgal/outer_element.cpp rename to src/libigl/igl/copyleft/cgal/outer_element.cpp diff --git a/src/igl/copyleft/cgal/outer_element.h b/src/libigl/igl/copyleft/cgal/outer_element.h similarity index 100% rename from src/igl/copyleft/cgal/outer_element.h rename to src/libigl/igl/copyleft/cgal/outer_element.h diff --git a/src/igl/copyleft/cgal/outer_facet.cpp b/src/libigl/igl/copyleft/cgal/outer_facet.cpp similarity index 100% rename from src/igl/copyleft/cgal/outer_facet.cpp rename to src/libigl/igl/copyleft/cgal/outer_facet.cpp diff --git a/src/igl/copyleft/cgal/outer_facet.h b/src/libigl/igl/copyleft/cgal/outer_facet.h similarity index 100% rename from src/igl/copyleft/cgal/outer_facet.h rename to src/libigl/igl/copyleft/cgal/outer_facet.h diff --git a/src/igl/copyleft/cgal/outer_hull.cpp b/src/libigl/igl/copyleft/cgal/outer_hull.cpp similarity index 100% rename from src/igl/copyleft/cgal/outer_hull.cpp rename to src/libigl/igl/copyleft/cgal/outer_hull.cpp diff --git a/src/igl/copyleft/cgal/outer_hull.h b/src/libigl/igl/copyleft/cgal/outer_hull.h similarity index 100% rename from src/igl/copyleft/cgal/outer_hull.h rename to src/libigl/igl/copyleft/cgal/outer_hull.h diff --git a/src/igl/copyleft/cgal/peel_outer_hull_layers.cpp b/src/libigl/igl/copyleft/cgal/peel_outer_hull_layers.cpp similarity index 100% rename from src/igl/copyleft/cgal/peel_outer_hull_layers.cpp rename to src/libigl/igl/copyleft/cgal/peel_outer_hull_layers.cpp diff --git a/src/igl/copyleft/cgal/peel_outer_hull_layers.h b/src/libigl/igl/copyleft/cgal/peel_outer_hull_layers.h similarity index 100% rename from src/igl/copyleft/cgal/peel_outer_hull_layers.h rename to src/libigl/igl/copyleft/cgal/peel_outer_hull_layers.h diff --git a/src/igl/copyleft/cgal/peel_winding_number_layers.cpp b/src/libigl/igl/copyleft/cgal/peel_winding_number_layers.cpp similarity index 100% rename from src/igl/copyleft/cgal/peel_winding_number_layers.cpp rename to src/libigl/igl/copyleft/cgal/peel_winding_number_layers.cpp diff --git a/src/igl/copyleft/cgal/peel_winding_number_layers.h b/src/libigl/igl/copyleft/cgal/peel_winding_number_layers.h similarity index 100% rename from src/igl/copyleft/cgal/peel_winding_number_layers.h rename to src/libigl/igl/copyleft/cgal/peel_winding_number_layers.h diff --git a/src/igl/copyleft/cgal/piecewise_constant_winding_number.cpp b/src/libigl/igl/copyleft/cgal/piecewise_constant_winding_number.cpp similarity index 100% rename from src/igl/copyleft/cgal/piecewise_constant_winding_number.cpp rename to src/libigl/igl/copyleft/cgal/piecewise_constant_winding_number.cpp diff --git a/src/igl/copyleft/cgal/piecewise_constant_winding_number.h b/src/libigl/igl/copyleft/cgal/piecewise_constant_winding_number.h similarity index 100% rename from src/igl/copyleft/cgal/piecewise_constant_winding_number.h rename to src/libigl/igl/copyleft/cgal/piecewise_constant_winding_number.h diff --git a/src/igl/copyleft/cgal/point_areas.cpp b/src/libigl/igl/copyleft/cgal/point_areas.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_areas.cpp rename to src/libigl/igl/copyleft/cgal/point_areas.cpp diff --git a/src/igl/copyleft/cgal/point_areas.h b/src/libigl/igl/copyleft/cgal/point_areas.h similarity index 100% rename from src/igl/copyleft/cgal/point_areas.h rename to src/libigl/igl/copyleft/cgal/point_areas.h diff --git a/src/igl/copyleft/cgal/point_mesh_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/point_mesh_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_mesh_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/point_mesh_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/point_mesh_squared_distance.h b/src/libigl/igl/copyleft/cgal/point_mesh_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/point_mesh_squared_distance.h rename to src/libigl/igl/copyleft/cgal/point_mesh_squared_distance.h diff --git a/src/igl/copyleft/cgal/point_segment_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/point_segment_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_segment_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/point_segment_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/point_segment_squared_distance.h b/src/libigl/igl/copyleft/cgal/point_segment_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/point_segment_squared_distance.h rename to src/libigl/igl/copyleft/cgal/point_segment_squared_distance.h diff --git a/src/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/point_solid_signed_squared_distance.h b/src/libigl/igl/copyleft/cgal/point_solid_signed_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/point_solid_signed_squared_distance.h rename to src/libigl/igl/copyleft/cgal/point_solid_signed_squared_distance.h diff --git a/src/igl/copyleft/cgal/point_triangle_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/point_triangle_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_triangle_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/point_triangle_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/point_triangle_squared_distance.h b/src/libigl/igl/copyleft/cgal/point_triangle_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/point_triangle_squared_distance.h rename to src/libigl/igl/copyleft/cgal/point_triangle_squared_distance.h diff --git a/src/igl/copyleft/cgal/points_inside_component.cpp b/src/libigl/igl/copyleft/cgal/points_inside_component.cpp similarity index 100% rename from src/igl/copyleft/cgal/points_inside_component.cpp rename to src/libigl/igl/copyleft/cgal/points_inside_component.cpp diff --git a/src/igl/copyleft/cgal/points_inside_component.h b/src/libigl/igl/copyleft/cgal/points_inside_component.h similarity index 100% rename from src/igl/copyleft/cgal/points_inside_component.h rename to src/libigl/igl/copyleft/cgal/points_inside_component.h diff --git a/src/igl/copyleft/cgal/polyhedron_to_mesh.cpp b/src/libigl/igl/copyleft/cgal/polyhedron_to_mesh.cpp similarity index 100% rename from src/igl/copyleft/cgal/polyhedron_to_mesh.cpp rename to src/libigl/igl/copyleft/cgal/polyhedron_to_mesh.cpp diff --git a/src/igl/copyleft/cgal/polyhedron_to_mesh.h b/src/libigl/igl/copyleft/cgal/polyhedron_to_mesh.h similarity index 100% rename from src/igl/copyleft/cgal/polyhedron_to_mesh.h rename to src/libigl/igl/copyleft/cgal/polyhedron_to_mesh.h diff --git a/src/igl/copyleft/cgal/projected_cdt.cpp b/src/libigl/igl/copyleft/cgal/projected_cdt.cpp similarity index 100% rename from src/igl/copyleft/cgal/projected_cdt.cpp rename to src/libigl/igl/copyleft/cgal/projected_cdt.cpp diff --git a/src/igl/copyleft/cgal/projected_cdt.h b/src/libigl/igl/copyleft/cgal/projected_cdt.h similarity index 100% rename from src/igl/copyleft/cgal/projected_cdt.h rename to src/libigl/igl/copyleft/cgal/projected_cdt.h diff --git a/src/igl/copyleft/cgal/projected_delaunay.cpp b/src/libigl/igl/copyleft/cgal/projected_delaunay.cpp similarity index 100% rename from src/igl/copyleft/cgal/projected_delaunay.cpp rename to src/libigl/igl/copyleft/cgal/projected_delaunay.cpp diff --git a/src/igl/copyleft/cgal/projected_delaunay.h b/src/libigl/igl/copyleft/cgal/projected_delaunay.h similarity index 100% rename from src/igl/copyleft/cgal/projected_delaunay.h rename to src/libigl/igl/copyleft/cgal/projected_delaunay.h diff --git a/src/igl/copyleft/cgal/propagate_winding_numbers.cpp b/src/libigl/igl/copyleft/cgal/propagate_winding_numbers.cpp similarity index 100% rename from src/igl/copyleft/cgal/propagate_winding_numbers.cpp rename to src/libigl/igl/copyleft/cgal/propagate_winding_numbers.cpp diff --git a/src/igl/copyleft/cgal/propagate_winding_numbers.h b/src/libigl/igl/copyleft/cgal/propagate_winding_numbers.h similarity index 100% rename from src/igl/copyleft/cgal/propagate_winding_numbers.h rename to src/libigl/igl/copyleft/cgal/propagate_winding_numbers.h diff --git a/src/igl/copyleft/cgal/read_triangle_mesh.cpp b/src/libigl/igl/copyleft/cgal/read_triangle_mesh.cpp similarity index 100% rename from src/igl/copyleft/cgal/read_triangle_mesh.cpp rename to src/libigl/igl/copyleft/cgal/read_triangle_mesh.cpp diff --git a/src/igl/copyleft/cgal/read_triangle_mesh.h b/src/libigl/igl/copyleft/cgal/read_triangle_mesh.h similarity index 100% rename from src/igl/copyleft/cgal/read_triangle_mesh.h rename to src/libigl/igl/copyleft/cgal/read_triangle_mesh.h diff --git a/src/igl/copyleft/cgal/relabel_small_immersed_cells.cpp b/src/libigl/igl/copyleft/cgal/relabel_small_immersed_cells.cpp similarity index 100% rename from src/igl/copyleft/cgal/relabel_small_immersed_cells.cpp rename to src/libigl/igl/copyleft/cgal/relabel_small_immersed_cells.cpp diff --git a/src/igl/copyleft/cgal/relabel_small_immersed_cells.h b/src/libigl/igl/copyleft/cgal/relabel_small_immersed_cells.h similarity index 100% rename from src/igl/copyleft/cgal/relabel_small_immersed_cells.h rename to src/libigl/igl/copyleft/cgal/relabel_small_immersed_cells.h diff --git a/src/igl/copyleft/cgal/remesh_intersections.cpp b/src/libigl/igl/copyleft/cgal/remesh_intersections.cpp similarity index 100% rename from src/igl/copyleft/cgal/remesh_intersections.cpp rename to src/libigl/igl/copyleft/cgal/remesh_intersections.cpp diff --git a/src/igl/copyleft/cgal/remesh_intersections.h b/src/libigl/igl/copyleft/cgal/remesh_intersections.h similarity index 100% rename from src/igl/copyleft/cgal/remesh_intersections.h rename to src/libigl/igl/copyleft/cgal/remesh_intersections.h diff --git a/src/igl/copyleft/cgal/remesh_self_intersections.cpp b/src/libigl/igl/copyleft/cgal/remesh_self_intersections.cpp similarity index 100% rename from src/igl/copyleft/cgal/remesh_self_intersections.cpp rename to src/libigl/igl/copyleft/cgal/remesh_self_intersections.cpp diff --git a/src/igl/copyleft/cgal/remesh_self_intersections.h b/src/libigl/igl/copyleft/cgal/remesh_self_intersections.h similarity index 100% rename from src/igl/copyleft/cgal/remesh_self_intersections.h rename to src/libigl/igl/copyleft/cgal/remesh_self_intersections.h diff --git a/src/igl/copyleft/cgal/remove_unreferenced.cpp b/src/libigl/igl/copyleft/cgal/remove_unreferenced.cpp similarity index 100% rename from src/igl/copyleft/cgal/remove_unreferenced.cpp rename to src/libigl/igl/copyleft/cgal/remove_unreferenced.cpp diff --git a/src/igl/copyleft/cgal/resolve_intersections.cpp b/src/libigl/igl/copyleft/cgal/resolve_intersections.cpp similarity index 100% rename from src/igl/copyleft/cgal/resolve_intersections.cpp rename to src/libigl/igl/copyleft/cgal/resolve_intersections.cpp diff --git a/src/igl/copyleft/cgal/resolve_intersections.h b/src/libigl/igl/copyleft/cgal/resolve_intersections.h similarity index 100% rename from src/igl/copyleft/cgal/resolve_intersections.h rename to src/libigl/igl/copyleft/cgal/resolve_intersections.h diff --git a/src/igl/copyleft/cgal/row_to_point.cpp b/src/libigl/igl/copyleft/cgal/row_to_point.cpp similarity index 100% rename from src/igl/copyleft/cgal/row_to_point.cpp rename to src/libigl/igl/copyleft/cgal/row_to_point.cpp diff --git a/src/igl/copyleft/cgal/row_to_point.h b/src/libigl/igl/copyleft/cgal/row_to_point.h similarity index 100% rename from src/igl/copyleft/cgal/row_to_point.h rename to src/libigl/igl/copyleft/cgal/row_to_point.h diff --git a/src/igl/copyleft/cgal/segment_segment_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/segment_segment_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/segment_segment_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/segment_segment_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/segment_segment_squared_distance.h b/src/libigl/igl/copyleft/cgal/segment_segment_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/segment_segment_squared_distance.h rename to src/libigl/igl/copyleft/cgal/segment_segment_squared_distance.h diff --git a/src/igl/copyleft/cgal/signed_distance_isosurface.cpp b/src/libigl/igl/copyleft/cgal/signed_distance_isosurface.cpp similarity index 100% rename from src/igl/copyleft/cgal/signed_distance_isosurface.cpp rename to src/libigl/igl/copyleft/cgal/signed_distance_isosurface.cpp diff --git a/src/igl/copyleft/cgal/signed_distance_isosurface.h b/src/libigl/igl/copyleft/cgal/signed_distance_isosurface.h similarity index 100% rename from src/igl/copyleft/cgal/signed_distance_isosurface.h rename to src/libigl/igl/copyleft/cgal/signed_distance_isosurface.h diff --git a/src/igl/copyleft/cgal/slice.cpp b/src/libigl/igl/copyleft/cgal/slice.cpp similarity index 100% rename from src/igl/copyleft/cgal/slice.cpp rename to src/libigl/igl/copyleft/cgal/slice.cpp diff --git a/src/igl/copyleft/cgal/slice_mask.cpp b/src/libigl/igl/copyleft/cgal/slice_mask.cpp similarity index 100% rename from src/igl/copyleft/cgal/slice_mask.cpp rename to src/libigl/igl/copyleft/cgal/slice_mask.cpp diff --git a/src/igl/copyleft/cgal/snap_rounding.cpp b/src/libigl/igl/copyleft/cgal/snap_rounding.cpp similarity index 100% rename from src/igl/copyleft/cgal/snap_rounding.cpp rename to src/libigl/igl/copyleft/cgal/snap_rounding.cpp diff --git a/src/igl/copyleft/cgal/snap_rounding.h b/src/libigl/igl/copyleft/cgal/snap_rounding.h similarity index 100% rename from src/igl/copyleft/cgal/snap_rounding.h rename to src/libigl/igl/copyleft/cgal/snap_rounding.h diff --git a/src/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp b/src/libigl/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp similarity index 100% rename from src/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp rename to src/libigl/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp diff --git a/src/igl/copyleft/cgal/string_to_mesh_boolean_type.h b/src/libigl/igl/copyleft/cgal/string_to_mesh_boolean_type.h similarity index 100% rename from src/igl/copyleft/cgal/string_to_mesh_boolean_type.h rename to src/libigl/igl/copyleft/cgal/string_to_mesh_boolean_type.h diff --git a/src/igl/copyleft/cgal/subdivide_segments.cpp b/src/libigl/igl/copyleft/cgal/subdivide_segments.cpp similarity index 100% rename from src/igl/copyleft/cgal/subdivide_segments.cpp rename to src/libigl/igl/copyleft/cgal/subdivide_segments.cpp diff --git a/src/igl/copyleft/cgal/subdivide_segments.h b/src/libigl/igl/copyleft/cgal/subdivide_segments.h similarity index 100% rename from src/igl/copyleft/cgal/subdivide_segments.h rename to src/libigl/igl/copyleft/cgal/subdivide_segments.h diff --git a/src/igl/copyleft/cgal/submesh_aabb_tree.cpp b/src/libigl/igl/copyleft/cgal/submesh_aabb_tree.cpp similarity index 100% rename from src/igl/copyleft/cgal/submesh_aabb_tree.cpp rename to src/libigl/igl/copyleft/cgal/submesh_aabb_tree.cpp diff --git a/src/igl/copyleft/cgal/submesh_aabb_tree.h b/src/libigl/igl/copyleft/cgal/submesh_aabb_tree.h similarity index 100% rename from src/igl/copyleft/cgal/submesh_aabb_tree.h rename to src/libigl/igl/copyleft/cgal/submesh_aabb_tree.h diff --git a/src/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/triangle_triangle_squared_distance.h b/src/libigl/igl/copyleft/cgal/triangle_triangle_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/triangle_triangle_squared_distance.h rename to src/libigl/igl/copyleft/cgal/triangle_triangle_squared_distance.h diff --git a/src/igl/copyleft/cgal/trim_with_solid.cpp b/src/libigl/igl/copyleft/cgal/trim_with_solid.cpp similarity index 100% rename from src/igl/copyleft/cgal/trim_with_solid.cpp rename to src/libigl/igl/copyleft/cgal/trim_with_solid.cpp diff --git a/src/igl/copyleft/cgal/trim_with_solid.h b/src/libigl/igl/copyleft/cgal/trim_with_solid.h similarity index 100% rename from src/igl/copyleft/cgal/trim_with_solid.h rename to src/libigl/igl/copyleft/cgal/trim_with_solid.h diff --git a/src/igl/copyleft/cgal/unique.cpp b/src/libigl/igl/copyleft/cgal/unique.cpp similarity index 100% rename from src/igl/copyleft/cgal/unique.cpp rename to src/libigl/igl/copyleft/cgal/unique.cpp diff --git a/src/igl/copyleft/cgal/unique_rows.cpp b/src/libigl/igl/copyleft/cgal/unique_rows.cpp similarity index 100% rename from src/igl/copyleft/cgal/unique_rows.cpp rename to src/libigl/igl/copyleft/cgal/unique_rows.cpp diff --git a/src/igl/copyleft/cgal/wire_mesh.cpp b/src/libigl/igl/copyleft/cgal/wire_mesh.cpp similarity index 100% rename from src/igl/copyleft/cgal/wire_mesh.cpp rename to src/libigl/igl/copyleft/cgal/wire_mesh.cpp diff --git a/src/igl/copyleft/cgal/wire_mesh.h b/src/libigl/igl/copyleft/cgal/wire_mesh.h similarity index 100% rename from src/igl/copyleft/cgal/wire_mesh.h rename to src/libigl/igl/copyleft/cgal/wire_mesh.h diff --git a/src/igl/copyleft/comiso/frame_field.cpp b/src/libigl/igl/copyleft/comiso/frame_field.cpp similarity index 100% rename from src/igl/copyleft/comiso/frame_field.cpp rename to src/libigl/igl/copyleft/comiso/frame_field.cpp diff --git a/src/igl/copyleft/comiso/frame_field.h b/src/libigl/igl/copyleft/comiso/frame_field.h similarity index 100% rename from src/igl/copyleft/comiso/frame_field.h rename to src/libigl/igl/copyleft/comiso/frame_field.h diff --git a/src/igl/copyleft/comiso/miq.cpp b/src/libigl/igl/copyleft/comiso/miq.cpp similarity index 100% rename from src/igl/copyleft/comiso/miq.cpp rename to src/libigl/igl/copyleft/comiso/miq.cpp diff --git a/src/igl/copyleft/comiso/miq.h b/src/libigl/igl/copyleft/comiso/miq.h similarity index 100% rename from src/igl/copyleft/comiso/miq.h rename to src/libigl/igl/copyleft/comiso/miq.h diff --git a/src/igl/copyleft/comiso/nrosy.cpp b/src/libigl/igl/copyleft/comiso/nrosy.cpp similarity index 100% rename from src/igl/copyleft/comiso/nrosy.cpp rename to src/libigl/igl/copyleft/comiso/nrosy.cpp diff --git a/src/igl/copyleft/comiso/nrosy.h b/src/libigl/igl/copyleft/comiso/nrosy.h similarity index 100% rename from src/igl/copyleft/comiso/nrosy.h rename to src/libigl/igl/copyleft/comiso/nrosy.h diff --git a/src/igl/copyleft/cork/from_cork_mesh.cpp b/src/libigl/igl/copyleft/cork/from_cork_mesh.cpp similarity index 100% rename from src/igl/copyleft/cork/from_cork_mesh.cpp rename to src/libigl/igl/copyleft/cork/from_cork_mesh.cpp diff --git a/src/igl/copyleft/cork/from_cork_mesh.h b/src/libigl/igl/copyleft/cork/from_cork_mesh.h similarity index 100% rename from src/igl/copyleft/cork/from_cork_mesh.h rename to src/libigl/igl/copyleft/cork/from_cork_mesh.h diff --git a/src/igl/copyleft/cork/mesh_boolean.cpp b/src/libigl/igl/copyleft/cork/mesh_boolean.cpp similarity index 100% rename from src/igl/copyleft/cork/mesh_boolean.cpp rename to src/libigl/igl/copyleft/cork/mesh_boolean.cpp diff --git a/src/igl/copyleft/cork/mesh_boolean.h b/src/libigl/igl/copyleft/cork/mesh_boolean.h similarity index 100% rename from src/igl/copyleft/cork/mesh_boolean.h rename to src/libigl/igl/copyleft/cork/mesh_boolean.h diff --git a/src/igl/copyleft/cork/to_cork_mesh.cpp b/src/libigl/igl/copyleft/cork/to_cork_mesh.cpp similarity index 100% rename from src/igl/copyleft/cork/to_cork_mesh.cpp rename to src/libigl/igl/copyleft/cork/to_cork_mesh.cpp diff --git a/src/igl/copyleft/cork/to_cork_mesh.h b/src/libigl/igl/copyleft/cork/to_cork_mesh.h similarity index 100% rename from src/igl/copyleft/cork/to_cork_mesh.h rename to src/libigl/igl/copyleft/cork/to_cork_mesh.h diff --git a/src/igl/copyleft/marching_cubes.cpp b/src/libigl/igl/copyleft/marching_cubes.cpp similarity index 100% rename from src/igl/copyleft/marching_cubes.cpp rename to src/libigl/igl/copyleft/marching_cubes.cpp diff --git a/src/igl/copyleft/marching_cubes.h b/src/libigl/igl/copyleft/marching_cubes.h similarity index 100% rename from src/igl/copyleft/marching_cubes.h rename to src/libigl/igl/copyleft/marching_cubes.h diff --git a/src/igl/copyleft/marching_cubes_tables.h b/src/libigl/igl/copyleft/marching_cubes_tables.h similarity index 100% rename from src/igl/copyleft/marching_cubes_tables.h rename to src/libigl/igl/copyleft/marching_cubes_tables.h diff --git a/src/igl/copyleft/offset_surface.cpp b/src/libigl/igl/copyleft/offset_surface.cpp similarity index 100% rename from src/igl/copyleft/offset_surface.cpp rename to src/libigl/igl/copyleft/offset_surface.cpp diff --git a/src/igl/copyleft/offset_surface.h b/src/libigl/igl/copyleft/offset_surface.h similarity index 100% rename from src/igl/copyleft/offset_surface.h rename to src/libigl/igl/copyleft/offset_surface.h diff --git a/src/igl/copyleft/opengl2/render_to_tga.cpp b/src/libigl/igl/copyleft/opengl2/render_to_tga.cpp similarity index 100% rename from src/igl/copyleft/opengl2/render_to_tga.cpp rename to src/libigl/igl/copyleft/opengl2/render_to_tga.cpp diff --git a/src/igl/copyleft/opengl2/render_to_tga.h b/src/libigl/igl/copyleft/opengl2/render_to_tga.h similarity index 100% rename from src/igl/copyleft/opengl2/render_to_tga.h rename to src/libigl/igl/copyleft/opengl2/render_to_tga.h diff --git a/src/igl/copyleft/opengl2/texture_from_tga.cpp b/src/libigl/igl/copyleft/opengl2/texture_from_tga.cpp similarity index 100% rename from src/igl/copyleft/opengl2/texture_from_tga.cpp rename to src/libigl/igl/copyleft/opengl2/texture_from_tga.cpp diff --git a/src/igl/copyleft/opengl2/texture_from_tga.h b/src/libigl/igl/copyleft/opengl2/texture_from_tga.h similarity index 100% rename from src/igl/copyleft/opengl2/texture_from_tga.h rename to src/libigl/igl/copyleft/opengl2/texture_from_tga.h diff --git a/src/igl/copyleft/opengl2/tga.cpp b/src/libigl/igl/copyleft/opengl2/tga.cpp similarity index 100% rename from src/igl/copyleft/opengl2/tga.cpp rename to src/libigl/igl/copyleft/opengl2/tga.cpp diff --git a/src/igl/copyleft/opengl2/tga.h b/src/libigl/igl/copyleft/opengl2/tga.h similarity index 100% rename from src/igl/copyleft/opengl2/tga.h rename to src/libigl/igl/copyleft/opengl2/tga.h diff --git a/src/igl/copyleft/progressive_hulls.cpp b/src/libigl/igl/copyleft/progressive_hulls.cpp similarity index 100% rename from src/igl/copyleft/progressive_hulls.cpp rename to src/libigl/igl/copyleft/progressive_hulls.cpp diff --git a/src/igl/copyleft/progressive_hulls.h b/src/libigl/igl/copyleft/progressive_hulls.h similarity index 100% rename from src/igl/copyleft/progressive_hulls.h rename to src/libigl/igl/copyleft/progressive_hulls.h diff --git a/src/igl/copyleft/progressive_hulls_cost_and_placement.cpp b/src/libigl/igl/copyleft/progressive_hulls_cost_and_placement.cpp similarity index 100% rename from src/igl/copyleft/progressive_hulls_cost_and_placement.cpp rename to src/libigl/igl/copyleft/progressive_hulls_cost_and_placement.cpp diff --git a/src/igl/copyleft/progressive_hulls_cost_and_placement.h b/src/libigl/igl/copyleft/progressive_hulls_cost_and_placement.h similarity index 100% rename from src/igl/copyleft/progressive_hulls_cost_and_placement.h rename to src/libigl/igl/copyleft/progressive_hulls_cost_and_placement.h diff --git a/src/igl/copyleft/quadprog.cpp b/src/libigl/igl/copyleft/quadprog.cpp similarity index 100% rename from src/igl/copyleft/quadprog.cpp rename to src/libigl/igl/copyleft/quadprog.cpp diff --git a/src/igl/copyleft/quadprog.h b/src/libigl/igl/copyleft/quadprog.h similarity index 100% rename from src/igl/copyleft/quadprog.h rename to src/libigl/igl/copyleft/quadprog.h diff --git a/src/igl/copyleft/swept_volume.cpp b/src/libigl/igl/copyleft/swept_volume.cpp similarity index 100% rename from src/igl/copyleft/swept_volume.cpp rename to src/libigl/igl/copyleft/swept_volume.cpp diff --git a/src/igl/copyleft/swept_volume.h b/src/libigl/igl/copyleft/swept_volume.h similarity index 100% rename from src/igl/copyleft/swept_volume.h rename to src/libigl/igl/copyleft/swept_volume.h diff --git a/src/igl/copyleft/tetgen/README b/src/libigl/igl/copyleft/tetgen/README similarity index 100% rename from src/igl/copyleft/tetgen/README rename to src/libigl/igl/copyleft/tetgen/README diff --git a/src/igl/copyleft/tetgen/cdt.cpp b/src/libigl/igl/copyleft/tetgen/cdt.cpp similarity index 100% rename from src/igl/copyleft/tetgen/cdt.cpp rename to src/libigl/igl/copyleft/tetgen/cdt.cpp diff --git a/src/igl/copyleft/tetgen/cdt.h b/src/libigl/igl/copyleft/tetgen/cdt.h similarity index 100% rename from src/igl/copyleft/tetgen/cdt.h rename to src/libigl/igl/copyleft/tetgen/cdt.h diff --git a/src/igl/copyleft/tetgen/mesh_to_tetgenio.cpp b/src/libigl/igl/copyleft/tetgen/mesh_to_tetgenio.cpp similarity index 100% rename from src/igl/copyleft/tetgen/mesh_to_tetgenio.cpp rename to src/libigl/igl/copyleft/tetgen/mesh_to_tetgenio.cpp diff --git a/src/igl/copyleft/tetgen/mesh_to_tetgenio.h b/src/libigl/igl/copyleft/tetgen/mesh_to_tetgenio.h similarity index 100% rename from src/igl/copyleft/tetgen/mesh_to_tetgenio.h rename to src/libigl/igl/copyleft/tetgen/mesh_to_tetgenio.h diff --git a/src/igl/copyleft/tetgen/mesh_with_skeleton.cpp b/src/libigl/igl/copyleft/tetgen/mesh_with_skeleton.cpp similarity index 100% rename from src/igl/copyleft/tetgen/mesh_with_skeleton.cpp rename to src/libigl/igl/copyleft/tetgen/mesh_with_skeleton.cpp diff --git a/src/igl/copyleft/tetgen/mesh_with_skeleton.h b/src/libigl/igl/copyleft/tetgen/mesh_with_skeleton.h similarity index 100% rename from src/igl/copyleft/tetgen/mesh_with_skeleton.h rename to src/libigl/igl/copyleft/tetgen/mesh_with_skeleton.h diff --git a/src/igl/copyleft/tetgen/read_into_tetgenio.cpp b/src/libigl/igl/copyleft/tetgen/read_into_tetgenio.cpp similarity index 100% rename from src/igl/copyleft/tetgen/read_into_tetgenio.cpp rename to src/libigl/igl/copyleft/tetgen/read_into_tetgenio.cpp diff --git a/src/igl/copyleft/tetgen/read_into_tetgenio.h b/src/libigl/igl/copyleft/tetgen/read_into_tetgenio.h similarity index 100% rename from src/igl/copyleft/tetgen/read_into_tetgenio.h rename to src/libigl/igl/copyleft/tetgen/read_into_tetgenio.h diff --git a/src/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp b/src/libigl/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp similarity index 100% rename from src/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp rename to src/libigl/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp diff --git a/src/igl/copyleft/tetgen/tetgenio_to_tetmesh.h b/src/libigl/igl/copyleft/tetgen/tetgenio_to_tetmesh.h similarity index 100% rename from src/igl/copyleft/tetgen/tetgenio_to_tetmesh.h rename to src/libigl/igl/copyleft/tetgen/tetgenio_to_tetmesh.h diff --git a/src/igl/copyleft/tetgen/tetrahedralize.cpp b/src/libigl/igl/copyleft/tetgen/tetrahedralize.cpp similarity index 100% rename from src/igl/copyleft/tetgen/tetrahedralize.cpp rename to src/libigl/igl/copyleft/tetgen/tetrahedralize.cpp diff --git a/src/igl/copyleft/tetgen/tetrahedralize.h b/src/libigl/igl/copyleft/tetgen/tetrahedralize.h similarity index 100% rename from src/igl/copyleft/tetgen/tetrahedralize.h rename to src/libigl/igl/copyleft/tetgen/tetrahedralize.h diff --git a/src/igl/cotmatrix.cpp b/src/libigl/igl/cotmatrix.cpp similarity index 100% rename from src/igl/cotmatrix.cpp rename to src/libigl/igl/cotmatrix.cpp diff --git a/src/igl/cotmatrix.h b/src/libigl/igl/cotmatrix.h similarity index 100% rename from src/igl/cotmatrix.h rename to src/libigl/igl/cotmatrix.h diff --git a/src/igl/cotmatrix_entries.cpp b/src/libigl/igl/cotmatrix_entries.cpp similarity index 100% rename from src/igl/cotmatrix_entries.cpp rename to src/libigl/igl/cotmatrix_entries.cpp diff --git a/src/igl/cotmatrix_entries.h b/src/libigl/igl/cotmatrix_entries.h similarity index 100% rename from src/igl/cotmatrix_entries.h rename to src/libigl/igl/cotmatrix_entries.h diff --git a/src/igl/count.cpp b/src/libigl/igl/count.cpp similarity index 100% rename from src/igl/count.cpp rename to src/libigl/igl/count.cpp diff --git a/src/igl/count.h b/src/libigl/igl/count.h similarity index 100% rename from src/igl/count.h rename to src/libigl/igl/count.h diff --git a/src/igl/covariance_scatter_matrix.cpp b/src/libigl/igl/covariance_scatter_matrix.cpp similarity index 100% rename from src/igl/covariance_scatter_matrix.cpp rename to src/libigl/igl/covariance_scatter_matrix.cpp diff --git a/src/igl/covariance_scatter_matrix.h b/src/libigl/igl/covariance_scatter_matrix.h similarity index 100% rename from src/igl/covariance_scatter_matrix.h rename to src/libigl/igl/covariance_scatter_matrix.h diff --git a/src/igl/cross.cpp b/src/libigl/igl/cross.cpp similarity index 100% rename from src/igl/cross.cpp rename to src/libigl/igl/cross.cpp diff --git a/src/igl/cross.h b/src/libigl/igl/cross.h similarity index 100% rename from src/igl/cross.h rename to src/libigl/igl/cross.h diff --git a/src/igl/cross_field_missmatch.cpp b/src/libigl/igl/cross_field_missmatch.cpp similarity index 100% rename from src/igl/cross_field_missmatch.cpp rename to src/libigl/igl/cross_field_missmatch.cpp diff --git a/src/igl/cross_field_missmatch.h b/src/libigl/igl/cross_field_missmatch.h similarity index 100% rename from src/igl/cross_field_missmatch.h rename to src/libigl/igl/cross_field_missmatch.h diff --git a/src/igl/crouzeix_raviart_cotmatrix.cpp b/src/libigl/igl/crouzeix_raviart_cotmatrix.cpp similarity index 100% rename from src/igl/crouzeix_raviart_cotmatrix.cpp rename to src/libigl/igl/crouzeix_raviart_cotmatrix.cpp diff --git a/src/igl/crouzeix_raviart_cotmatrix.h b/src/libigl/igl/crouzeix_raviart_cotmatrix.h similarity index 100% rename from src/igl/crouzeix_raviart_cotmatrix.h rename to src/libigl/igl/crouzeix_raviart_cotmatrix.h diff --git a/src/igl/crouzeix_raviart_massmatrix.cpp b/src/libigl/igl/crouzeix_raviart_massmatrix.cpp similarity index 100% rename from src/igl/crouzeix_raviart_massmatrix.cpp rename to src/libigl/igl/crouzeix_raviart_massmatrix.cpp diff --git a/src/igl/crouzeix_raviart_massmatrix.h b/src/libigl/igl/crouzeix_raviart_massmatrix.h similarity index 100% rename from src/igl/crouzeix_raviart_massmatrix.h rename to src/libigl/igl/crouzeix_raviart_massmatrix.h diff --git a/src/igl/cumsum.cpp b/src/libigl/igl/cumsum.cpp similarity index 100% rename from src/igl/cumsum.cpp rename to src/libigl/igl/cumsum.cpp diff --git a/src/igl/cumsum.h b/src/libigl/igl/cumsum.h similarity index 100% rename from src/igl/cumsum.h rename to src/libigl/igl/cumsum.h diff --git a/src/igl/cut_mesh.cpp b/src/libigl/igl/cut_mesh.cpp similarity index 100% rename from src/igl/cut_mesh.cpp rename to src/libigl/igl/cut_mesh.cpp diff --git a/src/igl/cut_mesh.h b/src/libigl/igl/cut_mesh.h similarity index 100% rename from src/igl/cut_mesh.h rename to src/libigl/igl/cut_mesh.h diff --git a/src/igl/cut_mesh_from_singularities.cpp b/src/libigl/igl/cut_mesh_from_singularities.cpp similarity index 100% rename from src/igl/cut_mesh_from_singularities.cpp rename to src/libigl/igl/cut_mesh_from_singularities.cpp diff --git a/src/igl/cut_mesh_from_singularities.h b/src/libigl/igl/cut_mesh_from_singularities.h similarity index 100% rename from src/igl/cut_mesh_from_singularities.h rename to src/libigl/igl/cut_mesh_from_singularities.h diff --git a/src/igl/cylinder.cpp b/src/libigl/igl/cylinder.cpp similarity index 100% rename from src/igl/cylinder.cpp rename to src/libigl/igl/cylinder.cpp diff --git a/src/igl/cylinder.h b/src/libigl/igl/cylinder.h similarity index 100% rename from src/igl/cylinder.h rename to src/libigl/igl/cylinder.h diff --git a/src/igl/dated_copy.cpp b/src/libigl/igl/dated_copy.cpp similarity index 100% rename from src/igl/dated_copy.cpp rename to src/libigl/igl/dated_copy.cpp diff --git a/src/igl/dated_copy.h b/src/libigl/igl/dated_copy.h similarity index 100% rename from src/igl/dated_copy.h rename to src/libigl/igl/dated_copy.h diff --git a/src/igl/decimate.cpp b/src/libigl/igl/decimate.cpp similarity index 100% rename from src/igl/decimate.cpp rename to src/libigl/igl/decimate.cpp diff --git a/src/igl/decimate.h b/src/libigl/igl/decimate.h similarity index 100% rename from src/igl/decimate.h rename to src/libigl/igl/decimate.h diff --git a/src/igl/deform_skeleton.cpp b/src/libigl/igl/deform_skeleton.cpp similarity index 100% rename from src/igl/deform_skeleton.cpp rename to src/libigl/igl/deform_skeleton.cpp diff --git a/src/igl/deform_skeleton.h b/src/libigl/igl/deform_skeleton.h similarity index 100% rename from src/igl/deform_skeleton.h rename to src/libigl/igl/deform_skeleton.h diff --git a/src/igl/delaunay_triangulation.cpp b/src/libigl/igl/delaunay_triangulation.cpp similarity index 100% rename from src/igl/delaunay_triangulation.cpp rename to src/libigl/igl/delaunay_triangulation.cpp diff --git a/src/igl/delaunay_triangulation.h b/src/libigl/igl/delaunay_triangulation.h similarity index 100% rename from src/igl/delaunay_triangulation.h rename to src/libigl/igl/delaunay_triangulation.h diff --git a/src/igl/deprecated.h b/src/libigl/igl/deprecated.h similarity index 100% rename from src/igl/deprecated.h rename to src/libigl/igl/deprecated.h diff --git a/src/igl/dfs.cpp b/src/libigl/igl/dfs.cpp similarity index 100% rename from src/igl/dfs.cpp rename to src/libigl/igl/dfs.cpp diff --git a/src/igl/dfs.h b/src/libigl/igl/dfs.h similarity index 100% rename from src/igl/dfs.h rename to src/libigl/igl/dfs.h diff --git a/src/igl/diag.cpp b/src/libigl/igl/diag.cpp similarity index 100% rename from src/igl/diag.cpp rename to src/libigl/igl/diag.cpp diff --git a/src/igl/diag.h b/src/libigl/igl/diag.h similarity index 100% rename from src/igl/diag.h rename to src/libigl/igl/diag.h diff --git a/src/igl/dihedral_angles.cpp b/src/libigl/igl/dihedral_angles.cpp similarity index 100% rename from src/igl/dihedral_angles.cpp rename to src/libigl/igl/dihedral_angles.cpp diff --git a/src/igl/dihedral_angles.h b/src/libigl/igl/dihedral_angles.h similarity index 100% rename from src/igl/dihedral_angles.h rename to src/libigl/igl/dihedral_angles.h diff --git a/src/igl/dijkstra.cpp b/src/libigl/igl/dijkstra.cpp similarity index 100% rename from src/igl/dijkstra.cpp rename to src/libigl/igl/dijkstra.cpp diff --git a/src/igl/dijkstra.h b/src/libigl/igl/dijkstra.h similarity index 100% rename from src/igl/dijkstra.h rename to src/libigl/igl/dijkstra.h diff --git a/src/igl/directed_edge_orientations.cpp b/src/libigl/igl/directed_edge_orientations.cpp similarity index 100% rename from src/igl/directed_edge_orientations.cpp rename to src/libigl/igl/directed_edge_orientations.cpp diff --git a/src/igl/directed_edge_orientations.h b/src/libigl/igl/directed_edge_orientations.h similarity index 100% rename from src/igl/directed_edge_orientations.h rename to src/libigl/igl/directed_edge_orientations.h diff --git a/src/igl/directed_edge_parents.cpp b/src/libigl/igl/directed_edge_parents.cpp similarity index 100% rename from src/igl/directed_edge_parents.cpp rename to src/libigl/igl/directed_edge_parents.cpp diff --git a/src/igl/directed_edge_parents.h b/src/libigl/igl/directed_edge_parents.h similarity index 100% rename from src/igl/directed_edge_parents.h rename to src/libigl/igl/directed_edge_parents.h diff --git a/src/igl/dirname.cpp b/src/libigl/igl/dirname.cpp similarity index 100% rename from src/igl/dirname.cpp rename to src/libigl/igl/dirname.cpp diff --git a/src/igl/dirname.h b/src/libigl/igl/dirname.h similarity index 100% rename from src/igl/dirname.h rename to src/libigl/igl/dirname.h diff --git a/src/igl/dot.cpp b/src/libigl/igl/dot.cpp similarity index 100% rename from src/igl/dot.cpp rename to src/libigl/igl/dot.cpp diff --git a/src/igl/dot.h b/src/libigl/igl/dot.h similarity index 100% rename from src/igl/dot.h rename to src/libigl/igl/dot.h diff --git a/src/igl/dot_row.cpp b/src/libigl/igl/dot_row.cpp similarity index 100% rename from src/igl/dot_row.cpp rename to src/libigl/igl/dot_row.cpp diff --git a/src/igl/dot_row.h b/src/libigl/igl/dot_row.h similarity index 100% rename from src/igl/dot_row.h rename to src/libigl/igl/dot_row.h diff --git a/src/igl/doublearea.cpp b/src/libigl/igl/doublearea.cpp similarity index 100% rename from src/igl/doublearea.cpp rename to src/libigl/igl/doublearea.cpp diff --git a/src/igl/doublearea.h b/src/libigl/igl/doublearea.h similarity index 100% rename from src/igl/doublearea.h rename to src/libigl/igl/doublearea.h diff --git a/src/igl/dqs.cpp b/src/libigl/igl/dqs.cpp similarity index 100% rename from src/igl/dqs.cpp rename to src/libigl/igl/dqs.cpp diff --git a/src/igl/dqs.h b/src/libigl/igl/dqs.h similarity index 100% rename from src/igl/dqs.h rename to src/libigl/igl/dqs.h diff --git a/src/igl/ears.cpp b/src/libigl/igl/ears.cpp similarity index 100% rename from src/igl/ears.cpp rename to src/libigl/igl/ears.cpp diff --git a/src/igl/ears.h b/src/libigl/igl/ears.h similarity index 100% rename from src/igl/ears.h rename to src/libigl/igl/ears.h diff --git a/src/igl/edge_collapse_is_valid.cpp b/src/libigl/igl/edge_collapse_is_valid.cpp similarity index 100% rename from src/igl/edge_collapse_is_valid.cpp rename to src/libigl/igl/edge_collapse_is_valid.cpp diff --git a/src/igl/edge_collapse_is_valid.h b/src/libigl/igl/edge_collapse_is_valid.h similarity index 100% rename from src/igl/edge_collapse_is_valid.h rename to src/libigl/igl/edge_collapse_is_valid.h diff --git a/src/igl/edge_flaps.cpp b/src/libigl/igl/edge_flaps.cpp similarity index 100% rename from src/igl/edge_flaps.cpp rename to src/libigl/igl/edge_flaps.cpp diff --git a/src/igl/edge_flaps.h b/src/libigl/igl/edge_flaps.h similarity index 100% rename from src/igl/edge_flaps.h rename to src/libigl/igl/edge_flaps.h diff --git a/src/igl/edge_lengths.cpp b/src/libigl/igl/edge_lengths.cpp similarity index 100% rename from src/igl/edge_lengths.cpp rename to src/libigl/igl/edge_lengths.cpp diff --git a/src/igl/edge_lengths.h b/src/libigl/igl/edge_lengths.h similarity index 100% rename from src/igl/edge_lengths.h rename to src/libigl/igl/edge_lengths.h diff --git a/src/igl/edge_topology.cpp b/src/libigl/igl/edge_topology.cpp similarity index 100% rename from src/igl/edge_topology.cpp rename to src/libigl/igl/edge_topology.cpp diff --git a/src/igl/edge_topology.h b/src/libigl/igl/edge_topology.h similarity index 100% rename from src/igl/edge_topology.h rename to src/libigl/igl/edge_topology.h diff --git a/src/igl/edges.cpp b/src/libigl/igl/edges.cpp similarity index 100% rename from src/igl/edges.cpp rename to src/libigl/igl/edges.cpp diff --git a/src/igl/edges.h b/src/libigl/igl/edges.h similarity index 100% rename from src/igl/edges.h rename to src/libigl/igl/edges.h diff --git a/src/igl/edges_to_path.cpp b/src/libigl/igl/edges_to_path.cpp similarity index 100% rename from src/igl/edges_to_path.cpp rename to src/libigl/igl/edges_to_path.cpp diff --git a/src/igl/edges_to_path.h b/src/libigl/igl/edges_to_path.h similarity index 100% rename from src/igl/edges_to_path.h rename to src/libigl/igl/edges_to_path.h diff --git a/src/igl/eigs.cpp b/src/libigl/igl/eigs.cpp similarity index 100% rename from src/igl/eigs.cpp rename to src/libigl/igl/eigs.cpp diff --git a/src/igl/eigs.h b/src/libigl/igl/eigs.h similarity index 100% rename from src/igl/eigs.h rename to src/libigl/igl/eigs.h diff --git a/src/igl/embree/EmbreeIntersector.h b/src/libigl/igl/embree/EmbreeIntersector.h similarity index 100% rename from src/igl/embree/EmbreeIntersector.h rename to src/libigl/igl/embree/EmbreeIntersector.h diff --git a/src/igl/embree/Embree_convenience.h b/src/libigl/igl/embree/Embree_convenience.h similarity index 100% rename from src/igl/embree/Embree_convenience.h rename to src/libigl/igl/embree/Embree_convenience.h diff --git a/src/igl/embree/ambient_occlusion.cpp b/src/libigl/igl/embree/ambient_occlusion.cpp similarity index 100% rename from src/igl/embree/ambient_occlusion.cpp rename to src/libigl/igl/embree/ambient_occlusion.cpp diff --git a/src/igl/embree/ambient_occlusion.h b/src/libigl/igl/embree/ambient_occlusion.h similarity index 100% rename from src/igl/embree/ambient_occlusion.h rename to src/libigl/igl/embree/ambient_occlusion.h diff --git a/src/igl/embree/bone_heat.cpp b/src/libigl/igl/embree/bone_heat.cpp similarity index 100% rename from src/igl/embree/bone_heat.cpp rename to src/libigl/igl/embree/bone_heat.cpp diff --git a/src/igl/embree/bone_heat.h b/src/libigl/igl/embree/bone_heat.h similarity index 100% rename from src/igl/embree/bone_heat.h rename to src/libigl/igl/embree/bone_heat.h diff --git a/src/igl/embree/bone_visible.cpp b/src/libigl/igl/embree/bone_visible.cpp similarity index 100% rename from src/igl/embree/bone_visible.cpp rename to src/libigl/igl/embree/bone_visible.cpp diff --git a/src/igl/embree/bone_visible.h b/src/libigl/igl/embree/bone_visible.h similarity index 100% rename from src/igl/embree/bone_visible.h rename to src/libigl/igl/embree/bone_visible.h diff --git a/src/igl/embree/embree2/rtcore.h b/src/libigl/igl/embree/embree2/rtcore.h similarity index 100% rename from src/igl/embree/embree2/rtcore.h rename to src/libigl/igl/embree/embree2/rtcore.h diff --git a/src/igl/embree/embree2/rtcore.isph b/src/libigl/igl/embree/embree2/rtcore.isph similarity index 100% rename from src/igl/embree/embree2/rtcore.isph rename to src/libigl/igl/embree/embree2/rtcore.isph diff --git a/src/igl/embree/embree2/rtcore_geometry.h b/src/libigl/igl/embree/embree2/rtcore_geometry.h similarity index 100% rename from src/igl/embree/embree2/rtcore_geometry.h rename to src/libigl/igl/embree/embree2/rtcore_geometry.h diff --git a/src/igl/embree/embree2/rtcore_geometry.isph b/src/libigl/igl/embree/embree2/rtcore_geometry.isph similarity index 100% rename from src/igl/embree/embree2/rtcore_geometry.isph rename to src/libigl/igl/embree/embree2/rtcore_geometry.isph diff --git a/src/igl/embree/embree2/rtcore_geometry_user.h b/src/libigl/igl/embree/embree2/rtcore_geometry_user.h similarity index 100% rename from src/igl/embree/embree2/rtcore_geometry_user.h rename to src/libigl/igl/embree/embree2/rtcore_geometry_user.h diff --git a/src/igl/embree/embree2/rtcore_geometry_user.isph b/src/libigl/igl/embree/embree2/rtcore_geometry_user.isph similarity index 100% rename from src/igl/embree/embree2/rtcore_geometry_user.isph rename to src/libigl/igl/embree/embree2/rtcore_geometry_user.isph diff --git a/src/igl/embree/embree2/rtcore_ray.h b/src/libigl/igl/embree/embree2/rtcore_ray.h similarity index 100% rename from src/igl/embree/embree2/rtcore_ray.h rename to src/libigl/igl/embree/embree2/rtcore_ray.h diff --git a/src/igl/embree/embree2/rtcore_ray.isph b/src/libigl/igl/embree/embree2/rtcore_ray.isph similarity index 100% rename from src/igl/embree/embree2/rtcore_ray.isph rename to src/libigl/igl/embree/embree2/rtcore_ray.isph diff --git a/src/igl/embree/embree2/rtcore_scene.h b/src/libigl/igl/embree/embree2/rtcore_scene.h similarity index 100% rename from src/igl/embree/embree2/rtcore_scene.h rename to src/libigl/igl/embree/embree2/rtcore_scene.h diff --git a/src/igl/embree/embree2/rtcore_scene.isph b/src/libigl/igl/embree/embree2/rtcore_scene.isph similarity index 100% rename from src/igl/embree/embree2/rtcore_scene.isph rename to src/libigl/igl/embree/embree2/rtcore_scene.isph diff --git a/src/igl/embree/line_mesh_intersection.cpp b/src/libigl/igl/embree/line_mesh_intersection.cpp similarity index 100% rename from src/igl/embree/line_mesh_intersection.cpp rename to src/libigl/igl/embree/line_mesh_intersection.cpp diff --git a/src/igl/embree/line_mesh_intersection.h b/src/libigl/igl/embree/line_mesh_intersection.h similarity index 100% rename from src/igl/embree/line_mesh_intersection.h rename to src/libigl/igl/embree/line_mesh_intersection.h diff --git a/src/igl/embree/reorient_facets_raycast.cpp b/src/libigl/igl/embree/reorient_facets_raycast.cpp similarity index 100% rename from src/igl/embree/reorient_facets_raycast.cpp rename to src/libigl/igl/embree/reorient_facets_raycast.cpp diff --git a/src/igl/embree/reorient_facets_raycast.h b/src/libigl/igl/embree/reorient_facets_raycast.h similarity index 100% rename from src/igl/embree/reorient_facets_raycast.h rename to src/libigl/igl/embree/reorient_facets_raycast.h diff --git a/src/igl/embree/shape_diameter_function.cpp b/src/libigl/igl/embree/shape_diameter_function.cpp similarity index 100% rename from src/igl/embree/shape_diameter_function.cpp rename to src/libigl/igl/embree/shape_diameter_function.cpp diff --git a/src/igl/embree/shape_diameter_function.h b/src/libigl/igl/embree/shape_diameter_function.h similarity index 100% rename from src/igl/embree/shape_diameter_function.h rename to src/libigl/igl/embree/shape_diameter_function.h diff --git a/src/igl/embree/unproject_in_mesh.cpp b/src/libigl/igl/embree/unproject_in_mesh.cpp similarity index 100% rename from src/igl/embree/unproject_in_mesh.cpp rename to src/libigl/igl/embree/unproject_in_mesh.cpp diff --git a/src/igl/embree/unproject_in_mesh.h b/src/libigl/igl/embree/unproject_in_mesh.h similarity index 100% rename from src/igl/embree/unproject_in_mesh.h rename to src/libigl/igl/embree/unproject_in_mesh.h diff --git a/src/igl/embree/unproject_onto_mesh.cpp b/src/libigl/igl/embree/unproject_onto_mesh.cpp similarity index 100% rename from src/igl/embree/unproject_onto_mesh.cpp rename to src/libigl/igl/embree/unproject_onto_mesh.cpp diff --git a/src/igl/embree/unproject_onto_mesh.h b/src/libigl/igl/embree/unproject_onto_mesh.h similarity index 100% rename from src/igl/embree/unproject_onto_mesh.h rename to src/libigl/igl/embree/unproject_onto_mesh.h diff --git a/src/igl/euler_characteristic.cpp b/src/libigl/igl/euler_characteristic.cpp similarity index 100% rename from src/igl/euler_characteristic.cpp rename to src/libigl/igl/euler_characteristic.cpp diff --git a/src/igl/euler_characteristic.h b/src/libigl/igl/euler_characteristic.h similarity index 100% rename from src/igl/euler_characteristic.h rename to src/libigl/igl/euler_characteristic.h diff --git a/src/igl/exact_geodesic.cpp b/src/libigl/igl/exact_geodesic.cpp similarity index 100% rename from src/igl/exact_geodesic.cpp rename to src/libigl/igl/exact_geodesic.cpp diff --git a/src/igl/exact_geodesic.h b/src/libigl/igl/exact_geodesic.h similarity index 100% rename from src/igl/exact_geodesic.h rename to src/libigl/igl/exact_geodesic.h diff --git a/src/igl/example_fun.cpp b/src/libigl/igl/example_fun.cpp similarity index 100% rename from src/igl/example_fun.cpp rename to src/libigl/igl/example_fun.cpp diff --git a/src/igl/example_fun.h b/src/libigl/igl/example_fun.h similarity index 100% rename from src/igl/example_fun.h rename to src/libigl/igl/example_fun.h diff --git a/src/igl/exterior_edges.cpp b/src/libigl/igl/exterior_edges.cpp similarity index 100% rename from src/igl/exterior_edges.cpp rename to src/libigl/igl/exterior_edges.cpp diff --git a/src/igl/exterior_edges.h b/src/libigl/igl/exterior_edges.h similarity index 100% rename from src/igl/exterior_edges.h rename to src/libigl/igl/exterior_edges.h diff --git a/src/igl/extract_manifold_patches.cpp b/src/libigl/igl/extract_manifold_patches.cpp similarity index 100% rename from src/igl/extract_manifold_patches.cpp rename to src/libigl/igl/extract_manifold_patches.cpp diff --git a/src/igl/extract_manifold_patches.h b/src/libigl/igl/extract_manifold_patches.h similarity index 100% rename from src/igl/extract_manifold_patches.h rename to src/libigl/igl/extract_manifold_patches.h diff --git a/src/igl/extract_non_manifold_edge_curves.cpp b/src/libigl/igl/extract_non_manifold_edge_curves.cpp similarity index 100% rename from src/igl/extract_non_manifold_edge_curves.cpp rename to src/libigl/igl/extract_non_manifold_edge_curves.cpp diff --git a/src/igl/extract_non_manifold_edge_curves.h b/src/libigl/igl/extract_non_manifold_edge_curves.h similarity index 100% rename from src/igl/extract_non_manifold_edge_curves.h rename to src/libigl/igl/extract_non_manifold_edge_curves.h diff --git a/src/igl/face_areas.cpp b/src/libigl/igl/face_areas.cpp similarity index 100% rename from src/igl/face_areas.cpp rename to src/libigl/igl/face_areas.cpp diff --git a/src/igl/face_areas.h b/src/libigl/igl/face_areas.h similarity index 100% rename from src/igl/face_areas.h rename to src/libigl/igl/face_areas.h diff --git a/src/igl/face_occurrences.cpp b/src/libigl/igl/face_occurrences.cpp similarity index 100% rename from src/igl/face_occurrences.cpp rename to src/libigl/igl/face_occurrences.cpp diff --git a/src/igl/face_occurrences.h b/src/libigl/igl/face_occurrences.h similarity index 100% rename from src/igl/face_occurrences.h rename to src/libigl/igl/face_occurrences.h diff --git a/src/igl/faces_first.cpp b/src/libigl/igl/faces_first.cpp similarity index 100% rename from src/igl/faces_first.cpp rename to src/libigl/igl/faces_first.cpp diff --git a/src/igl/faces_first.h b/src/libigl/igl/faces_first.h similarity index 100% rename from src/igl/faces_first.h rename to src/libigl/igl/faces_first.h diff --git a/src/igl/facet_components.cpp b/src/libigl/igl/facet_components.cpp similarity index 100% rename from src/igl/facet_components.cpp rename to src/libigl/igl/facet_components.cpp diff --git a/src/igl/facet_components.h b/src/libigl/igl/facet_components.h similarity index 100% rename from src/igl/facet_components.h rename to src/libigl/igl/facet_components.h diff --git a/src/igl/false_barycentric_subdivision.cpp b/src/libigl/igl/false_barycentric_subdivision.cpp similarity index 100% rename from src/igl/false_barycentric_subdivision.cpp rename to src/libigl/igl/false_barycentric_subdivision.cpp diff --git a/src/igl/false_barycentric_subdivision.h b/src/libigl/igl/false_barycentric_subdivision.h similarity index 100% rename from src/igl/false_barycentric_subdivision.h rename to src/libigl/igl/false_barycentric_subdivision.h diff --git a/src/igl/fast_winding_number.cpp b/src/libigl/igl/fast_winding_number.cpp similarity index 100% rename from src/igl/fast_winding_number.cpp rename to src/libigl/igl/fast_winding_number.cpp diff --git a/src/igl/fast_winding_number.h b/src/libigl/igl/fast_winding_number.h similarity index 100% rename from src/igl/fast_winding_number.h rename to src/libigl/igl/fast_winding_number.h diff --git a/src/igl/file_contents_as_string.cpp b/src/libigl/igl/file_contents_as_string.cpp similarity index 100% rename from src/igl/file_contents_as_string.cpp rename to src/libigl/igl/file_contents_as_string.cpp diff --git a/src/igl/file_contents_as_string.h b/src/libigl/igl/file_contents_as_string.h similarity index 100% rename from src/igl/file_contents_as_string.h rename to src/libigl/igl/file_contents_as_string.h diff --git a/src/igl/file_dialog_open.cpp b/src/libigl/igl/file_dialog_open.cpp similarity index 100% rename from src/igl/file_dialog_open.cpp rename to src/libigl/igl/file_dialog_open.cpp diff --git a/src/igl/file_dialog_open.h b/src/libigl/igl/file_dialog_open.h similarity index 100% rename from src/igl/file_dialog_open.h rename to src/libigl/igl/file_dialog_open.h diff --git a/src/igl/file_dialog_save.cpp b/src/libigl/igl/file_dialog_save.cpp similarity index 100% rename from src/igl/file_dialog_save.cpp rename to src/libigl/igl/file_dialog_save.cpp diff --git a/src/igl/file_dialog_save.h b/src/libigl/igl/file_dialog_save.h similarity index 100% rename from src/igl/file_dialog_save.h rename to src/libigl/igl/file_dialog_save.h diff --git a/src/igl/file_exists.cpp b/src/libigl/igl/file_exists.cpp similarity index 100% rename from src/igl/file_exists.cpp rename to src/libigl/igl/file_exists.cpp diff --git a/src/igl/file_exists.h b/src/libigl/igl/file_exists.h similarity index 100% rename from src/igl/file_exists.h rename to src/libigl/igl/file_exists.h diff --git a/src/igl/find.cpp b/src/libigl/igl/find.cpp similarity index 100% rename from src/igl/find.cpp rename to src/libigl/igl/find.cpp diff --git a/src/igl/find.h b/src/libigl/igl/find.h similarity index 100% rename from src/igl/find.h rename to src/libigl/igl/find.h diff --git a/src/igl/find_cross_field_singularities.cpp b/src/libigl/igl/find_cross_field_singularities.cpp similarity index 100% rename from src/igl/find_cross_field_singularities.cpp rename to src/libigl/igl/find_cross_field_singularities.cpp diff --git a/src/igl/find_cross_field_singularities.h b/src/libigl/igl/find_cross_field_singularities.h similarity index 100% rename from src/igl/find_cross_field_singularities.h rename to src/libigl/igl/find_cross_field_singularities.h diff --git a/src/igl/find_zero.cpp b/src/libigl/igl/find_zero.cpp similarity index 100% rename from src/igl/find_zero.cpp rename to src/libigl/igl/find_zero.cpp diff --git a/src/igl/find_zero.h b/src/libigl/igl/find_zero.h similarity index 100% rename from src/igl/find_zero.h rename to src/libigl/igl/find_zero.h diff --git a/src/igl/fit_plane.cpp b/src/libigl/igl/fit_plane.cpp similarity index 100% rename from src/igl/fit_plane.cpp rename to src/libigl/igl/fit_plane.cpp diff --git a/src/igl/fit_plane.h b/src/libigl/igl/fit_plane.h similarity index 100% rename from src/igl/fit_plane.h rename to src/libigl/igl/fit_plane.h diff --git a/src/igl/fit_rotations.cpp b/src/libigl/igl/fit_rotations.cpp similarity index 100% rename from src/igl/fit_rotations.cpp rename to src/libigl/igl/fit_rotations.cpp diff --git a/src/igl/fit_rotations.h b/src/libigl/igl/fit_rotations.h similarity index 100% rename from src/igl/fit_rotations.h rename to src/libigl/igl/fit_rotations.h diff --git a/src/igl/flip_avoiding_line_search.cpp b/src/libigl/igl/flip_avoiding_line_search.cpp similarity index 100% rename from src/igl/flip_avoiding_line_search.cpp rename to src/libigl/igl/flip_avoiding_line_search.cpp diff --git a/src/igl/flip_avoiding_line_search.h b/src/libigl/igl/flip_avoiding_line_search.h similarity index 100% rename from src/igl/flip_avoiding_line_search.h rename to src/libigl/igl/flip_avoiding_line_search.h diff --git a/src/igl/flip_edge.cpp b/src/libigl/igl/flip_edge.cpp similarity index 100% rename from src/igl/flip_edge.cpp rename to src/libigl/igl/flip_edge.cpp diff --git a/src/igl/flip_edge.h b/src/libigl/igl/flip_edge.h similarity index 100% rename from src/igl/flip_edge.h rename to src/libigl/igl/flip_edge.h diff --git a/src/igl/flipped_triangles.cpp b/src/libigl/igl/flipped_triangles.cpp similarity index 100% rename from src/igl/flipped_triangles.cpp rename to src/libigl/igl/flipped_triangles.cpp diff --git a/src/igl/flipped_triangles.h b/src/libigl/igl/flipped_triangles.h similarity index 100% rename from src/igl/flipped_triangles.h rename to src/libigl/igl/flipped_triangles.h diff --git a/src/igl/flood_fill.cpp b/src/libigl/igl/flood_fill.cpp similarity index 100% rename from src/igl/flood_fill.cpp rename to src/libigl/igl/flood_fill.cpp diff --git a/src/igl/flood_fill.h b/src/libigl/igl/flood_fill.h similarity index 100% rename from src/igl/flood_fill.h rename to src/libigl/igl/flood_fill.h diff --git a/src/igl/floor.cpp b/src/libigl/igl/floor.cpp similarity index 100% rename from src/igl/floor.cpp rename to src/libigl/igl/floor.cpp diff --git a/src/igl/floor.h b/src/libigl/igl/floor.h similarity index 100% rename from src/igl/floor.h rename to src/libigl/igl/floor.h diff --git a/src/igl/for_each.h b/src/libigl/igl/for_each.h similarity index 100% rename from src/igl/for_each.h rename to src/libigl/igl/for_each.h diff --git a/src/igl/forward_kinematics.cpp b/src/libigl/igl/forward_kinematics.cpp similarity index 100% rename from src/igl/forward_kinematics.cpp rename to src/libigl/igl/forward_kinematics.cpp diff --git a/src/igl/forward_kinematics.h b/src/libigl/igl/forward_kinematics.h similarity index 100% rename from src/igl/forward_kinematics.h rename to src/libigl/igl/forward_kinematics.h diff --git a/src/igl/frame_field_deformer.cpp b/src/libigl/igl/frame_field_deformer.cpp similarity index 100% rename from src/igl/frame_field_deformer.cpp rename to src/libigl/igl/frame_field_deformer.cpp diff --git a/src/igl/frame_field_deformer.h b/src/libigl/igl/frame_field_deformer.h similarity index 100% rename from src/igl/frame_field_deformer.h rename to src/libigl/igl/frame_field_deformer.h diff --git a/src/igl/frame_to_cross_field.cpp b/src/libigl/igl/frame_to_cross_field.cpp similarity index 100% rename from src/igl/frame_to_cross_field.cpp rename to src/libigl/igl/frame_to_cross_field.cpp diff --git a/src/igl/frame_to_cross_field.h b/src/libigl/igl/frame_to_cross_field.h similarity index 100% rename from src/igl/frame_to_cross_field.h rename to src/libigl/igl/frame_to_cross_field.h diff --git a/src/igl/frustum.cpp b/src/libigl/igl/frustum.cpp similarity index 100% rename from src/igl/frustum.cpp rename to src/libigl/igl/frustum.cpp diff --git a/src/igl/frustum.h b/src/libigl/igl/frustum.h similarity index 100% rename from src/igl/frustum.h rename to src/libigl/igl/frustum.h diff --git a/src/igl/gaussian_curvature.cpp b/src/libigl/igl/gaussian_curvature.cpp similarity index 100% rename from src/igl/gaussian_curvature.cpp rename to src/libigl/igl/gaussian_curvature.cpp diff --git a/src/igl/gaussian_curvature.h b/src/libigl/igl/gaussian_curvature.h similarity index 100% rename from src/igl/gaussian_curvature.h rename to src/libigl/igl/gaussian_curvature.h diff --git a/src/igl/get_seconds.cpp b/src/libigl/igl/get_seconds.cpp similarity index 100% rename from src/igl/get_seconds.cpp rename to src/libigl/igl/get_seconds.cpp diff --git a/src/igl/get_seconds.h b/src/libigl/igl/get_seconds.h similarity index 100% rename from src/igl/get_seconds.h rename to src/libigl/igl/get_seconds.h diff --git a/src/igl/get_seconds_hires.cpp b/src/libigl/igl/get_seconds_hires.cpp similarity index 100% rename from src/igl/get_seconds_hires.cpp rename to src/libigl/igl/get_seconds_hires.cpp diff --git a/src/igl/get_seconds_hires.h b/src/libigl/igl/get_seconds_hires.h similarity index 100% rename from src/igl/get_seconds_hires.h rename to src/libigl/igl/get_seconds_hires.h diff --git a/src/igl/grad.cpp b/src/libigl/igl/grad.cpp similarity index 100% rename from src/igl/grad.cpp rename to src/libigl/igl/grad.cpp diff --git a/src/igl/grad.h b/src/libigl/igl/grad.h similarity index 100% rename from src/igl/grad.h rename to src/libigl/igl/grad.h diff --git a/src/igl/grid.cpp b/src/libigl/igl/grid.cpp similarity index 100% rename from src/igl/grid.cpp rename to src/libigl/igl/grid.cpp diff --git a/src/igl/grid.h b/src/libigl/igl/grid.h similarity index 100% rename from src/igl/grid.h rename to src/libigl/igl/grid.h diff --git a/src/igl/grid_search.cpp b/src/libigl/igl/grid_search.cpp similarity index 100% rename from src/igl/grid_search.cpp rename to src/libigl/igl/grid_search.cpp diff --git a/src/igl/grid_search.h b/src/libigl/igl/grid_search.h similarity index 100% rename from src/igl/grid_search.h rename to src/libigl/igl/grid_search.h diff --git a/src/igl/group_sum_matrix.cpp b/src/libigl/igl/group_sum_matrix.cpp similarity index 100% rename from src/igl/group_sum_matrix.cpp rename to src/libigl/igl/group_sum_matrix.cpp diff --git a/src/igl/group_sum_matrix.h b/src/libigl/igl/group_sum_matrix.h similarity index 100% rename from src/igl/group_sum_matrix.h rename to src/libigl/igl/group_sum_matrix.h diff --git a/src/igl/guess_extension.cpp b/src/libigl/igl/guess_extension.cpp similarity index 100% rename from src/igl/guess_extension.cpp rename to src/libigl/igl/guess_extension.cpp diff --git a/src/igl/guess_extension.h b/src/libigl/igl/guess_extension.h similarity index 100% rename from src/igl/guess_extension.h rename to src/libigl/igl/guess_extension.h diff --git a/src/igl/harmonic.cpp b/src/libigl/igl/harmonic.cpp similarity index 100% rename from src/igl/harmonic.cpp rename to src/libigl/igl/harmonic.cpp diff --git a/src/igl/harmonic.h b/src/libigl/igl/harmonic.h similarity index 100% rename from src/igl/harmonic.h rename to src/libigl/igl/harmonic.h diff --git a/src/igl/harwell_boeing.cpp b/src/libigl/igl/harwell_boeing.cpp similarity index 100% rename from src/igl/harwell_boeing.cpp rename to src/libigl/igl/harwell_boeing.cpp diff --git a/src/igl/harwell_boeing.h b/src/libigl/igl/harwell_boeing.h similarity index 100% rename from src/igl/harwell_boeing.h rename to src/libigl/igl/harwell_boeing.h diff --git a/src/igl/hausdorff.cpp b/src/libigl/igl/hausdorff.cpp similarity index 100% rename from src/igl/hausdorff.cpp rename to src/libigl/igl/hausdorff.cpp diff --git a/src/igl/hausdorff.h b/src/libigl/igl/hausdorff.h similarity index 100% rename from src/igl/hausdorff.h rename to src/libigl/igl/hausdorff.h diff --git a/src/igl/hessian.cpp b/src/libigl/igl/hessian.cpp similarity index 100% rename from src/igl/hessian.cpp rename to src/libigl/igl/hessian.cpp diff --git a/src/igl/hessian.h b/src/libigl/igl/hessian.h similarity index 100% rename from src/igl/hessian.h rename to src/libigl/igl/hessian.h diff --git a/src/igl/hessian_energy.cpp b/src/libigl/igl/hessian_energy.cpp similarity index 100% rename from src/igl/hessian_energy.cpp rename to src/libigl/igl/hessian_energy.cpp diff --git a/src/igl/hessian_energy.h b/src/libigl/igl/hessian_energy.h similarity index 100% rename from src/igl/hessian_energy.h rename to src/libigl/igl/hessian_energy.h diff --git a/src/igl/histc.cpp b/src/libigl/igl/histc.cpp similarity index 100% rename from src/igl/histc.cpp rename to src/libigl/igl/histc.cpp diff --git a/src/igl/histc.h b/src/libigl/igl/histc.h similarity index 100% rename from src/igl/histc.h rename to src/libigl/igl/histc.h diff --git a/src/igl/hsv_to_rgb.cpp b/src/libigl/igl/hsv_to_rgb.cpp similarity index 100% rename from src/igl/hsv_to_rgb.cpp rename to src/libigl/igl/hsv_to_rgb.cpp diff --git a/src/igl/hsv_to_rgb.h b/src/libigl/igl/hsv_to_rgb.h similarity index 100% rename from src/igl/hsv_to_rgb.h rename to src/libigl/igl/hsv_to_rgb.h diff --git a/src/igl/igl_inline.h b/src/libigl/igl/igl_inline.h similarity index 100% rename from src/igl/igl_inline.h rename to src/libigl/igl/igl_inline.h diff --git a/src/igl/in_element.cpp b/src/libigl/igl/in_element.cpp similarity index 100% rename from src/igl/in_element.cpp rename to src/libigl/igl/in_element.cpp diff --git a/src/igl/in_element.h b/src/libigl/igl/in_element.h similarity index 100% rename from src/igl/in_element.h rename to src/libigl/igl/in_element.h diff --git a/src/igl/infinite_cost_stopping_condition.cpp b/src/libigl/igl/infinite_cost_stopping_condition.cpp similarity index 100% rename from src/igl/infinite_cost_stopping_condition.cpp rename to src/libigl/igl/infinite_cost_stopping_condition.cpp diff --git a/src/igl/infinite_cost_stopping_condition.h b/src/libigl/igl/infinite_cost_stopping_condition.h similarity index 100% rename from src/igl/infinite_cost_stopping_condition.h rename to src/libigl/igl/infinite_cost_stopping_condition.h diff --git a/src/igl/inradius.cpp b/src/libigl/igl/inradius.cpp similarity index 100% rename from src/igl/inradius.cpp rename to src/libigl/igl/inradius.cpp diff --git a/src/igl/inradius.h b/src/libigl/igl/inradius.h similarity index 100% rename from src/igl/inradius.h rename to src/libigl/igl/inradius.h diff --git a/src/igl/internal_angles.cpp b/src/libigl/igl/internal_angles.cpp similarity index 100% rename from src/igl/internal_angles.cpp rename to src/libigl/igl/internal_angles.cpp diff --git a/src/igl/internal_angles.h b/src/libigl/igl/internal_angles.h similarity index 100% rename from src/igl/internal_angles.h rename to src/libigl/igl/internal_angles.h diff --git a/src/igl/intersect.cpp b/src/libigl/igl/intersect.cpp similarity index 100% rename from src/igl/intersect.cpp rename to src/libigl/igl/intersect.cpp diff --git a/src/igl/intersect.h b/src/libigl/igl/intersect.h similarity index 100% rename from src/igl/intersect.h rename to src/libigl/igl/intersect.h diff --git a/src/igl/invert_diag.cpp b/src/libigl/igl/invert_diag.cpp similarity index 100% rename from src/igl/invert_diag.cpp rename to src/libigl/igl/invert_diag.cpp diff --git a/src/igl/invert_diag.h b/src/libigl/igl/invert_diag.h similarity index 100% rename from src/igl/invert_diag.h rename to src/libigl/igl/invert_diag.h diff --git a/src/igl/is_border_vertex.cpp b/src/libigl/igl/is_border_vertex.cpp similarity index 100% rename from src/igl/is_border_vertex.cpp rename to src/libigl/igl/is_border_vertex.cpp diff --git a/src/igl/is_border_vertex.h b/src/libigl/igl/is_border_vertex.h similarity index 100% rename from src/igl/is_border_vertex.h rename to src/libigl/igl/is_border_vertex.h diff --git a/src/igl/is_boundary_edge.cpp b/src/libigl/igl/is_boundary_edge.cpp similarity index 100% rename from src/igl/is_boundary_edge.cpp rename to src/libigl/igl/is_boundary_edge.cpp diff --git a/src/igl/is_boundary_edge.h b/src/libigl/igl/is_boundary_edge.h similarity index 100% rename from src/igl/is_boundary_edge.h rename to src/libigl/igl/is_boundary_edge.h diff --git a/src/igl/is_dir.cpp b/src/libigl/igl/is_dir.cpp similarity index 100% rename from src/igl/is_dir.cpp rename to src/libigl/igl/is_dir.cpp diff --git a/src/igl/is_dir.h b/src/libigl/igl/is_dir.h similarity index 100% rename from src/igl/is_dir.h rename to src/libigl/igl/is_dir.h diff --git a/src/igl/is_edge_manifold.cpp b/src/libigl/igl/is_edge_manifold.cpp similarity index 100% rename from src/igl/is_edge_manifold.cpp rename to src/libigl/igl/is_edge_manifold.cpp diff --git a/src/igl/is_edge_manifold.h b/src/libigl/igl/is_edge_manifold.h similarity index 100% rename from src/igl/is_edge_manifold.h rename to src/libigl/igl/is_edge_manifold.h diff --git a/src/igl/is_file.cpp b/src/libigl/igl/is_file.cpp similarity index 100% rename from src/igl/is_file.cpp rename to src/libigl/igl/is_file.cpp diff --git a/src/igl/is_file.h b/src/libigl/igl/is_file.h similarity index 100% rename from src/igl/is_file.h rename to src/libigl/igl/is_file.h diff --git a/src/igl/is_irregular_vertex.cpp b/src/libigl/igl/is_irregular_vertex.cpp similarity index 100% rename from src/igl/is_irregular_vertex.cpp rename to src/libigl/igl/is_irregular_vertex.cpp diff --git a/src/igl/is_irregular_vertex.h b/src/libigl/igl/is_irregular_vertex.h similarity index 100% rename from src/igl/is_irregular_vertex.h rename to src/libigl/igl/is_irregular_vertex.h diff --git a/src/igl/is_planar.cpp b/src/libigl/igl/is_planar.cpp similarity index 100% rename from src/igl/is_planar.cpp rename to src/libigl/igl/is_planar.cpp diff --git a/src/igl/is_planar.h b/src/libigl/igl/is_planar.h similarity index 100% rename from src/igl/is_planar.h rename to src/libigl/igl/is_planar.h diff --git a/src/igl/is_readable.cpp b/src/libigl/igl/is_readable.cpp similarity index 100% rename from src/igl/is_readable.cpp rename to src/libigl/igl/is_readable.cpp diff --git a/src/igl/is_readable.h b/src/libigl/igl/is_readable.h similarity index 100% rename from src/igl/is_readable.h rename to src/libigl/igl/is_readable.h diff --git a/src/igl/is_sparse.cpp b/src/libigl/igl/is_sparse.cpp similarity index 100% rename from src/igl/is_sparse.cpp rename to src/libigl/igl/is_sparse.cpp diff --git a/src/igl/is_sparse.h b/src/libigl/igl/is_sparse.h similarity index 100% rename from src/igl/is_sparse.h rename to src/libigl/igl/is_sparse.h diff --git a/src/igl/is_stl.cpp b/src/libigl/igl/is_stl.cpp similarity index 100% rename from src/igl/is_stl.cpp rename to src/libigl/igl/is_stl.cpp diff --git a/src/igl/is_stl.h b/src/libigl/igl/is_stl.h similarity index 100% rename from src/igl/is_stl.h rename to src/libigl/igl/is_stl.h diff --git a/src/igl/is_symmetric.cpp b/src/libigl/igl/is_symmetric.cpp similarity index 100% rename from src/igl/is_symmetric.cpp rename to src/libigl/igl/is_symmetric.cpp diff --git a/src/igl/is_symmetric.h b/src/libigl/igl/is_symmetric.h similarity index 100% rename from src/igl/is_symmetric.h rename to src/libigl/igl/is_symmetric.h diff --git a/src/igl/is_vertex_manifold.cpp b/src/libigl/igl/is_vertex_manifold.cpp similarity index 100% rename from src/igl/is_vertex_manifold.cpp rename to src/libigl/igl/is_vertex_manifold.cpp diff --git a/src/igl/is_vertex_manifold.h b/src/libigl/igl/is_vertex_manifold.h similarity index 100% rename from src/igl/is_vertex_manifold.h rename to src/libigl/igl/is_vertex_manifold.h diff --git a/src/igl/is_writable.cpp b/src/libigl/igl/is_writable.cpp similarity index 100% rename from src/igl/is_writable.cpp rename to src/libigl/igl/is_writable.cpp diff --git a/src/igl/is_writable.h b/src/libigl/igl/is_writable.h similarity index 100% rename from src/igl/is_writable.h rename to src/libigl/igl/is_writable.h diff --git a/src/igl/isdiag.cpp b/src/libigl/igl/isdiag.cpp similarity index 100% rename from src/igl/isdiag.cpp rename to src/libigl/igl/isdiag.cpp diff --git a/src/igl/isdiag.h b/src/libigl/igl/isdiag.h similarity index 100% rename from src/igl/isdiag.h rename to src/libigl/igl/isdiag.h diff --git a/src/igl/ismember.cpp b/src/libigl/igl/ismember.cpp similarity index 100% rename from src/igl/ismember.cpp rename to src/libigl/igl/ismember.cpp diff --git a/src/igl/ismember.h b/src/libigl/igl/ismember.h similarity index 100% rename from src/igl/ismember.h rename to src/libigl/igl/ismember.h diff --git a/src/igl/isolines.cpp b/src/libigl/igl/isolines.cpp similarity index 100% rename from src/igl/isolines.cpp rename to src/libigl/igl/isolines.cpp diff --git a/src/igl/isolines.h b/src/libigl/igl/isolines.h similarity index 100% rename from src/igl/isolines.h rename to src/libigl/igl/isolines.h diff --git a/src/igl/jet.cpp b/src/libigl/igl/jet.cpp similarity index 100% rename from src/igl/jet.cpp rename to src/libigl/igl/jet.cpp diff --git a/src/igl/jet.h b/src/libigl/igl/jet.h similarity index 100% rename from src/igl/jet.h rename to src/libigl/igl/jet.h diff --git a/src/igl/knn.cpp b/src/libigl/igl/knn.cpp similarity index 100% rename from src/igl/knn.cpp rename to src/libigl/igl/knn.cpp diff --git a/src/igl/knn.h b/src/libigl/igl/knn.h similarity index 100% rename from src/igl/knn.h rename to src/libigl/igl/knn.h diff --git a/src/igl/launch_medit.cpp b/src/libigl/igl/launch_medit.cpp similarity index 100% rename from src/igl/launch_medit.cpp rename to src/libigl/igl/launch_medit.cpp diff --git a/src/igl/launch_medit.h b/src/libigl/igl/launch_medit.h similarity index 100% rename from src/igl/launch_medit.h rename to src/libigl/igl/launch_medit.h diff --git a/src/igl/lbs_matrix.cpp b/src/libigl/igl/lbs_matrix.cpp similarity index 100% rename from src/igl/lbs_matrix.cpp rename to src/libigl/igl/lbs_matrix.cpp diff --git a/src/igl/lbs_matrix.h b/src/libigl/igl/lbs_matrix.h similarity index 100% rename from src/igl/lbs_matrix.h rename to src/libigl/igl/lbs_matrix.h diff --git a/src/igl/lexicographic_triangulation.cpp b/src/libigl/igl/lexicographic_triangulation.cpp similarity index 100% rename from src/igl/lexicographic_triangulation.cpp rename to src/libigl/igl/lexicographic_triangulation.cpp diff --git a/src/igl/lexicographic_triangulation.h b/src/libigl/igl/lexicographic_triangulation.h similarity index 100% rename from src/igl/lexicographic_triangulation.h rename to src/libigl/igl/lexicographic_triangulation.h diff --git a/src/igl/lim/lim.cpp b/src/libigl/igl/lim/lim.cpp similarity index 100% rename from src/igl/lim/lim.cpp rename to src/libigl/igl/lim/lim.cpp diff --git a/src/igl/lim/lim.h b/src/libigl/igl/lim/lim.h similarity index 100% rename from src/igl/lim/lim.h rename to src/libigl/igl/lim/lim.h diff --git a/src/igl/limit_faces.cpp b/src/libigl/igl/limit_faces.cpp similarity index 100% rename from src/igl/limit_faces.cpp rename to src/libigl/igl/limit_faces.cpp diff --git a/src/igl/limit_faces.h b/src/libigl/igl/limit_faces.h similarity index 100% rename from src/igl/limit_faces.h rename to src/libigl/igl/limit_faces.h diff --git a/src/igl/line_field_missmatch.cpp b/src/libigl/igl/line_field_missmatch.cpp similarity index 100% rename from src/igl/line_field_missmatch.cpp rename to src/libigl/igl/line_field_missmatch.cpp diff --git a/src/igl/line_field_missmatch.h b/src/libigl/igl/line_field_missmatch.h similarity index 100% rename from src/igl/line_field_missmatch.h rename to src/libigl/igl/line_field_missmatch.h diff --git a/src/igl/line_search.cpp b/src/libigl/igl/line_search.cpp similarity index 100% rename from src/igl/line_search.cpp rename to src/libigl/igl/line_search.cpp diff --git a/src/igl/line_search.h b/src/libigl/igl/line_search.h similarity index 100% rename from src/igl/line_search.h rename to src/libigl/igl/line_search.h diff --git a/src/igl/line_segment_in_rectangle.cpp b/src/libigl/igl/line_segment_in_rectangle.cpp similarity index 100% rename from src/igl/line_segment_in_rectangle.cpp rename to src/libigl/igl/line_segment_in_rectangle.cpp diff --git a/src/igl/line_segment_in_rectangle.h b/src/libigl/igl/line_segment_in_rectangle.h similarity index 100% rename from src/igl/line_segment_in_rectangle.h rename to src/libigl/igl/line_segment_in_rectangle.h diff --git a/src/igl/linprog.cpp b/src/libigl/igl/linprog.cpp similarity index 100% rename from src/igl/linprog.cpp rename to src/libigl/igl/linprog.cpp diff --git a/src/igl/linprog.h b/src/libigl/igl/linprog.h similarity index 100% rename from src/igl/linprog.h rename to src/libigl/igl/linprog.h diff --git a/src/igl/list_to_matrix.cpp b/src/libigl/igl/list_to_matrix.cpp similarity index 100% rename from src/igl/list_to_matrix.cpp rename to src/libigl/igl/list_to_matrix.cpp diff --git a/src/igl/list_to_matrix.h b/src/libigl/igl/list_to_matrix.h similarity index 100% rename from src/igl/list_to_matrix.h rename to src/libigl/igl/list_to_matrix.h diff --git a/src/igl/local_basis.cpp b/src/libigl/igl/local_basis.cpp similarity index 100% rename from src/igl/local_basis.cpp rename to src/libigl/igl/local_basis.cpp diff --git a/src/igl/local_basis.h b/src/libigl/igl/local_basis.h similarity index 100% rename from src/igl/local_basis.h rename to src/libigl/igl/local_basis.h diff --git a/src/igl/look_at.cpp b/src/libigl/igl/look_at.cpp similarity index 100% rename from src/igl/look_at.cpp rename to src/libigl/igl/look_at.cpp diff --git a/src/igl/look_at.h b/src/libigl/igl/look_at.h similarity index 100% rename from src/igl/look_at.h rename to src/libigl/igl/look_at.h diff --git a/src/igl/loop.cpp b/src/libigl/igl/loop.cpp similarity index 100% rename from src/igl/loop.cpp rename to src/libigl/igl/loop.cpp diff --git a/src/igl/loop.h b/src/libigl/igl/loop.h similarity index 100% rename from src/igl/loop.h rename to src/libigl/igl/loop.h diff --git a/src/igl/lscm.cpp b/src/libigl/igl/lscm.cpp similarity index 100% rename from src/igl/lscm.cpp rename to src/libigl/igl/lscm.cpp diff --git a/src/igl/lscm.h b/src/libigl/igl/lscm.h similarity index 100% rename from src/igl/lscm.h rename to src/libigl/igl/lscm.h diff --git a/src/igl/map_vertices_to_circle.cpp b/src/libigl/igl/map_vertices_to_circle.cpp similarity index 100% rename from src/igl/map_vertices_to_circle.cpp rename to src/libigl/igl/map_vertices_to_circle.cpp diff --git a/src/igl/map_vertices_to_circle.h b/src/libigl/igl/map_vertices_to_circle.h similarity index 100% rename from src/igl/map_vertices_to_circle.h rename to src/libigl/igl/map_vertices_to_circle.h diff --git a/src/igl/massmatrix.cpp b/src/libigl/igl/massmatrix.cpp similarity index 100% rename from src/igl/massmatrix.cpp rename to src/libigl/igl/massmatrix.cpp diff --git a/src/igl/massmatrix.h b/src/libigl/igl/massmatrix.h similarity index 100% rename from src/igl/massmatrix.h rename to src/libigl/igl/massmatrix.h diff --git a/src/igl/mat_max.cpp b/src/libigl/igl/mat_max.cpp similarity index 100% rename from src/igl/mat_max.cpp rename to src/libigl/igl/mat_max.cpp diff --git a/src/igl/mat_max.h b/src/libigl/igl/mat_max.h similarity index 100% rename from src/igl/mat_max.h rename to src/libigl/igl/mat_max.h diff --git a/src/igl/mat_min.cpp b/src/libigl/igl/mat_min.cpp similarity index 100% rename from src/igl/mat_min.cpp rename to src/libigl/igl/mat_min.cpp diff --git a/src/igl/mat_min.h b/src/libigl/igl/mat_min.h similarity index 100% rename from src/igl/mat_min.h rename to src/libigl/igl/mat_min.h diff --git a/src/igl/mat_to_quat.cpp b/src/libigl/igl/mat_to_quat.cpp similarity index 100% rename from src/igl/mat_to_quat.cpp rename to src/libigl/igl/mat_to_quat.cpp diff --git a/src/igl/mat_to_quat.h b/src/libigl/igl/mat_to_quat.h similarity index 100% rename from src/igl/mat_to_quat.h rename to src/libigl/igl/mat_to_quat.h diff --git a/src/igl/material_colors.h b/src/libigl/igl/material_colors.h similarity index 100% rename from src/igl/material_colors.h rename to src/libigl/igl/material_colors.h diff --git a/src/igl/matlab/MatlabWorkspace.h b/src/libigl/igl/matlab/MatlabWorkspace.h similarity index 100% rename from src/igl/matlab/MatlabWorkspace.h rename to src/libigl/igl/matlab/MatlabWorkspace.h diff --git a/src/igl/matlab/MexStream.h b/src/libigl/igl/matlab/MexStream.h similarity index 100% rename from src/igl/matlab/MexStream.h rename to src/libigl/igl/matlab/MexStream.h diff --git a/src/igl/matlab/matlabinterface.cpp b/src/libigl/igl/matlab/matlabinterface.cpp similarity index 100% rename from src/igl/matlab/matlabinterface.cpp rename to src/libigl/igl/matlab/matlabinterface.cpp diff --git a/src/igl/matlab/matlabinterface.h b/src/libigl/igl/matlab/matlabinterface.h similarity index 100% rename from src/igl/matlab/matlabinterface.h rename to src/libigl/igl/matlab/matlabinterface.h diff --git a/src/igl/matlab/mexErrMsgTxt.cpp b/src/libigl/igl/matlab/mexErrMsgTxt.cpp similarity index 100% rename from src/igl/matlab/mexErrMsgTxt.cpp rename to src/libigl/igl/matlab/mexErrMsgTxt.cpp diff --git a/src/igl/matlab/mexErrMsgTxt.h b/src/libigl/igl/matlab/mexErrMsgTxt.h similarity index 100% rename from src/igl/matlab/mexErrMsgTxt.h rename to src/libigl/igl/matlab/mexErrMsgTxt.h diff --git a/src/igl/matlab/parse_rhs.cpp b/src/libigl/igl/matlab/parse_rhs.cpp similarity index 100% rename from src/igl/matlab/parse_rhs.cpp rename to src/libigl/igl/matlab/parse_rhs.cpp diff --git a/src/igl/matlab/parse_rhs.h b/src/libigl/igl/matlab/parse_rhs.h similarity index 100% rename from src/igl/matlab/parse_rhs.h rename to src/libigl/igl/matlab/parse_rhs.h diff --git a/src/igl/matlab/prepare_lhs.cpp b/src/libigl/igl/matlab/prepare_lhs.cpp similarity index 100% rename from src/igl/matlab/prepare_lhs.cpp rename to src/libigl/igl/matlab/prepare_lhs.cpp diff --git a/src/igl/matlab/prepare_lhs.h b/src/libigl/igl/matlab/prepare_lhs.h similarity index 100% rename from src/igl/matlab/prepare_lhs.h rename to src/libigl/igl/matlab/prepare_lhs.h diff --git a/src/igl/matlab/requires_arg.cpp b/src/libigl/igl/matlab/requires_arg.cpp similarity index 100% rename from src/igl/matlab/requires_arg.cpp rename to src/libigl/igl/matlab/requires_arg.cpp diff --git a/src/igl/matlab/requires_arg.h b/src/libigl/igl/matlab/requires_arg.h similarity index 100% rename from src/igl/matlab/requires_arg.h rename to src/libigl/igl/matlab/requires_arg.h diff --git a/src/igl/matlab/validate_arg.cpp b/src/libigl/igl/matlab/validate_arg.cpp similarity index 100% rename from src/igl/matlab/validate_arg.cpp rename to src/libigl/igl/matlab/validate_arg.cpp diff --git a/src/igl/matlab/validate_arg.h b/src/libigl/igl/matlab/validate_arg.h similarity index 100% rename from src/igl/matlab/validate_arg.h rename to src/libigl/igl/matlab/validate_arg.h diff --git a/src/igl/matlab_format.cpp b/src/libigl/igl/matlab_format.cpp similarity index 100% rename from src/igl/matlab_format.cpp rename to src/libigl/igl/matlab_format.cpp diff --git a/src/igl/matlab_format.h b/src/libigl/igl/matlab_format.h similarity index 100% rename from src/igl/matlab_format.h rename to src/libigl/igl/matlab_format.h diff --git a/src/igl/matrix_to_list.cpp b/src/libigl/igl/matrix_to_list.cpp similarity index 100% rename from src/igl/matrix_to_list.cpp rename to src/libigl/igl/matrix_to_list.cpp diff --git a/src/igl/matrix_to_list.h b/src/libigl/igl/matrix_to_list.h similarity index 100% rename from src/igl/matrix_to_list.h rename to src/libigl/igl/matrix_to_list.h diff --git a/src/igl/max.cpp b/src/libigl/igl/max.cpp similarity index 100% rename from src/igl/max.cpp rename to src/libigl/igl/max.cpp diff --git a/src/igl/max.h b/src/libigl/igl/max.h similarity index 100% rename from src/igl/max.h rename to src/libigl/igl/max.h diff --git a/src/igl/max_faces_stopping_condition.cpp b/src/libigl/igl/max_faces_stopping_condition.cpp similarity index 100% rename from src/igl/max_faces_stopping_condition.cpp rename to src/libigl/igl/max_faces_stopping_condition.cpp diff --git a/src/igl/max_faces_stopping_condition.h b/src/libigl/igl/max_faces_stopping_condition.h similarity index 100% rename from src/igl/max_faces_stopping_condition.h rename to src/libigl/igl/max_faces_stopping_condition.h diff --git a/src/igl/max_size.cpp b/src/libigl/igl/max_size.cpp similarity index 100% rename from src/igl/max_size.cpp rename to src/libigl/igl/max_size.cpp diff --git a/src/igl/max_size.h b/src/libigl/igl/max_size.h similarity index 100% rename from src/igl/max_size.h rename to src/libigl/igl/max_size.h diff --git a/src/igl/median.cpp b/src/libigl/igl/median.cpp similarity index 100% rename from src/igl/median.cpp rename to src/libigl/igl/median.cpp diff --git a/src/igl/median.h b/src/libigl/igl/median.h similarity index 100% rename from src/igl/median.h rename to src/libigl/igl/median.h diff --git a/src/igl/min.cpp b/src/libigl/igl/min.cpp similarity index 100% rename from src/igl/min.cpp rename to src/libigl/igl/min.cpp diff --git a/src/igl/min.h b/src/libigl/igl/min.h similarity index 100% rename from src/igl/min.h rename to src/libigl/igl/min.h diff --git a/src/igl/min_quad_dense.cpp b/src/libigl/igl/min_quad_dense.cpp similarity index 100% rename from src/igl/min_quad_dense.cpp rename to src/libigl/igl/min_quad_dense.cpp diff --git a/src/igl/min_quad_dense.h b/src/libigl/igl/min_quad_dense.h similarity index 100% rename from src/igl/min_quad_dense.h rename to src/libigl/igl/min_quad_dense.h diff --git a/src/igl/min_quad_with_fixed.cpp b/src/libigl/igl/min_quad_with_fixed.cpp similarity index 100% rename from src/igl/min_quad_with_fixed.cpp rename to src/libigl/igl/min_quad_with_fixed.cpp diff --git a/src/igl/min_quad_with_fixed.h b/src/libigl/igl/min_quad_with_fixed.h similarity index 100% rename from src/igl/min_quad_with_fixed.h rename to src/libigl/igl/min_quad_with_fixed.h diff --git a/src/igl/min_size.cpp b/src/libigl/igl/min_size.cpp similarity index 100% rename from src/igl/min_size.cpp rename to src/libigl/igl/min_size.cpp diff --git a/src/igl/min_size.h b/src/libigl/igl/min_size.h similarity index 100% rename from src/igl/min_size.h rename to src/libigl/igl/min_size.h diff --git a/src/igl/mod.cpp b/src/libigl/igl/mod.cpp similarity index 100% rename from src/igl/mod.cpp rename to src/libigl/igl/mod.cpp diff --git a/src/igl/mod.h b/src/libigl/igl/mod.h similarity index 100% rename from src/igl/mod.h rename to src/libigl/igl/mod.h diff --git a/src/igl/mode.cpp b/src/libigl/igl/mode.cpp similarity index 100% rename from src/igl/mode.cpp rename to src/libigl/igl/mode.cpp diff --git a/src/igl/mode.h b/src/libigl/igl/mode.h similarity index 100% rename from src/igl/mode.h rename to src/libigl/igl/mode.h diff --git a/src/igl/mosek/bbw.cpp b/src/libigl/igl/mosek/bbw.cpp similarity index 100% rename from src/igl/mosek/bbw.cpp rename to src/libigl/igl/mosek/bbw.cpp diff --git a/src/igl/mosek/bbw.h b/src/libigl/igl/mosek/bbw.h similarity index 100% rename from src/igl/mosek/bbw.h rename to src/libigl/igl/mosek/bbw.h diff --git a/src/igl/mosek/mosek_guarded.cpp b/src/libigl/igl/mosek/mosek_guarded.cpp similarity index 100% rename from src/igl/mosek/mosek_guarded.cpp rename to src/libigl/igl/mosek/mosek_guarded.cpp diff --git a/src/igl/mosek/mosek_guarded.h b/src/libigl/igl/mosek/mosek_guarded.h similarity index 100% rename from src/igl/mosek/mosek_guarded.h rename to src/libigl/igl/mosek/mosek_guarded.h diff --git a/src/igl/mosek/mosek_linprog.cpp b/src/libigl/igl/mosek/mosek_linprog.cpp similarity index 100% rename from src/igl/mosek/mosek_linprog.cpp rename to src/libigl/igl/mosek/mosek_linprog.cpp diff --git a/src/igl/mosek/mosek_linprog.h b/src/libigl/igl/mosek/mosek_linprog.h similarity index 100% rename from src/igl/mosek/mosek_linprog.h rename to src/libigl/igl/mosek/mosek_linprog.h diff --git a/src/igl/mosek/mosek_quadprog.cpp b/src/libigl/igl/mosek/mosek_quadprog.cpp similarity index 100% rename from src/igl/mosek/mosek_quadprog.cpp rename to src/libigl/igl/mosek/mosek_quadprog.cpp diff --git a/src/igl/mosek/mosek_quadprog.h b/src/libigl/igl/mosek/mosek_quadprog.h similarity index 100% rename from src/igl/mosek/mosek_quadprog.h rename to src/libigl/igl/mosek/mosek_quadprog.h diff --git a/src/igl/mvc.cpp b/src/libigl/igl/mvc.cpp similarity index 100% rename from src/igl/mvc.cpp rename to src/libigl/igl/mvc.cpp diff --git a/src/igl/mvc.h b/src/libigl/igl/mvc.h similarity index 100% rename from src/igl/mvc.h rename to src/libigl/igl/mvc.h diff --git a/src/igl/nchoosek.cpp b/src/libigl/igl/nchoosek.cpp similarity index 100% rename from src/igl/nchoosek.cpp rename to src/libigl/igl/nchoosek.cpp diff --git a/src/igl/nchoosek.h b/src/libigl/igl/nchoosek.h similarity index 100% rename from src/igl/nchoosek.h rename to src/libigl/igl/nchoosek.h diff --git a/src/igl/next_filename.cpp b/src/libigl/igl/next_filename.cpp similarity index 100% rename from src/igl/next_filename.cpp rename to src/libigl/igl/next_filename.cpp diff --git a/src/igl/next_filename.h b/src/libigl/igl/next_filename.h similarity index 100% rename from src/igl/next_filename.h rename to src/libigl/igl/next_filename.h diff --git a/src/igl/normal_derivative.cpp b/src/libigl/igl/normal_derivative.cpp similarity index 100% rename from src/igl/normal_derivative.cpp rename to src/libigl/igl/normal_derivative.cpp diff --git a/src/igl/normal_derivative.h b/src/libigl/igl/normal_derivative.h similarity index 100% rename from src/igl/normal_derivative.h rename to src/libigl/igl/normal_derivative.h diff --git a/src/igl/normalize_quat.cpp b/src/libigl/igl/normalize_quat.cpp similarity index 100% rename from src/igl/normalize_quat.cpp rename to src/libigl/igl/normalize_quat.cpp diff --git a/src/igl/normalize_quat.h b/src/libigl/igl/normalize_quat.h similarity index 100% rename from src/igl/normalize_quat.h rename to src/libigl/igl/normalize_quat.h diff --git a/src/igl/normalize_row_lengths.cpp b/src/libigl/igl/normalize_row_lengths.cpp similarity index 100% rename from src/igl/normalize_row_lengths.cpp rename to src/libigl/igl/normalize_row_lengths.cpp diff --git a/src/igl/normalize_row_lengths.h b/src/libigl/igl/normalize_row_lengths.h similarity index 100% rename from src/igl/normalize_row_lengths.h rename to src/libigl/igl/normalize_row_lengths.h diff --git a/src/igl/normalize_row_sums.cpp b/src/libigl/igl/normalize_row_sums.cpp similarity index 100% rename from src/igl/normalize_row_sums.cpp rename to src/libigl/igl/normalize_row_sums.cpp diff --git a/src/igl/normalize_row_sums.h b/src/libigl/igl/normalize_row_sums.h similarity index 100% rename from src/igl/normalize_row_sums.h rename to src/libigl/igl/normalize_row_sums.h diff --git a/src/igl/null.cpp b/src/libigl/igl/null.cpp similarity index 100% rename from src/igl/null.cpp rename to src/libigl/igl/null.cpp diff --git a/src/igl/null.h b/src/libigl/igl/null.h similarity index 100% rename from src/igl/null.h rename to src/libigl/igl/null.h diff --git a/src/igl/octree.cpp b/src/libigl/igl/octree.cpp similarity index 100% rename from src/igl/octree.cpp rename to src/libigl/igl/octree.cpp diff --git a/src/igl/octree.h b/src/libigl/igl/octree.h similarity index 100% rename from src/igl/octree.h rename to src/libigl/igl/octree.h diff --git a/src/igl/on_boundary.cpp b/src/libigl/igl/on_boundary.cpp similarity index 100% rename from src/igl/on_boundary.cpp rename to src/libigl/igl/on_boundary.cpp diff --git a/src/igl/on_boundary.h b/src/libigl/igl/on_boundary.h similarity index 100% rename from src/igl/on_boundary.h rename to src/libigl/igl/on_boundary.h diff --git a/src/igl/opengl/MeshGL.cpp b/src/libigl/igl/opengl/MeshGL.cpp similarity index 100% rename from src/igl/opengl/MeshGL.cpp rename to src/libigl/igl/opengl/MeshGL.cpp diff --git a/src/igl/opengl/MeshGL.h b/src/libigl/igl/opengl/MeshGL.h similarity index 100% rename from src/igl/opengl/MeshGL.h rename to src/libigl/igl/opengl/MeshGL.h diff --git a/src/igl/opengl/ViewerCore.cpp b/src/libigl/igl/opengl/ViewerCore.cpp similarity index 100% rename from src/igl/opengl/ViewerCore.cpp rename to src/libigl/igl/opengl/ViewerCore.cpp diff --git a/src/igl/opengl/ViewerCore.h b/src/libigl/igl/opengl/ViewerCore.h similarity index 100% rename from src/igl/opengl/ViewerCore.h rename to src/libigl/igl/opengl/ViewerCore.h diff --git a/src/igl/opengl/ViewerData.cpp b/src/libigl/igl/opengl/ViewerData.cpp similarity index 100% rename from src/igl/opengl/ViewerData.cpp rename to src/libigl/igl/opengl/ViewerData.cpp diff --git a/src/igl/opengl/ViewerData.h b/src/libigl/igl/opengl/ViewerData.h similarity index 100% rename from src/igl/opengl/ViewerData.h rename to src/libigl/igl/opengl/ViewerData.h diff --git a/src/igl/opengl/bind_vertex_attrib_array.cpp b/src/libigl/igl/opengl/bind_vertex_attrib_array.cpp similarity index 100% rename from src/igl/opengl/bind_vertex_attrib_array.cpp rename to src/libigl/igl/opengl/bind_vertex_attrib_array.cpp diff --git a/src/igl/opengl/bind_vertex_attrib_array.h b/src/libigl/igl/opengl/bind_vertex_attrib_array.h similarity index 100% rename from src/igl/opengl/bind_vertex_attrib_array.h rename to src/libigl/igl/opengl/bind_vertex_attrib_array.h diff --git a/src/igl/opengl/create_index_vbo.cpp b/src/libigl/igl/opengl/create_index_vbo.cpp similarity index 100% rename from src/igl/opengl/create_index_vbo.cpp rename to src/libigl/igl/opengl/create_index_vbo.cpp diff --git a/src/igl/opengl/create_index_vbo.h b/src/libigl/igl/opengl/create_index_vbo.h similarity index 100% rename from src/igl/opengl/create_index_vbo.h rename to src/libigl/igl/opengl/create_index_vbo.h diff --git a/src/igl/opengl/create_mesh_vbo.cpp b/src/libigl/igl/opengl/create_mesh_vbo.cpp similarity index 100% rename from src/igl/opengl/create_mesh_vbo.cpp rename to src/libigl/igl/opengl/create_mesh_vbo.cpp diff --git a/src/igl/opengl/create_mesh_vbo.h b/src/libigl/igl/opengl/create_mesh_vbo.h similarity index 100% rename from src/igl/opengl/create_mesh_vbo.h rename to src/libigl/igl/opengl/create_mesh_vbo.h diff --git a/src/igl/opengl/create_shader_program.cpp b/src/libigl/igl/opengl/create_shader_program.cpp similarity index 100% rename from src/igl/opengl/create_shader_program.cpp rename to src/libigl/igl/opengl/create_shader_program.cpp diff --git a/src/igl/opengl/create_shader_program.h b/src/libigl/igl/opengl/create_shader_program.h similarity index 100% rename from src/igl/opengl/create_shader_program.h rename to src/libigl/igl/opengl/create_shader_program.h diff --git a/src/igl/opengl/create_vector_vbo.cpp b/src/libigl/igl/opengl/create_vector_vbo.cpp similarity index 100% rename from src/igl/opengl/create_vector_vbo.cpp rename to src/libigl/igl/opengl/create_vector_vbo.cpp diff --git a/src/igl/opengl/create_vector_vbo.h b/src/libigl/igl/opengl/create_vector_vbo.h similarity index 100% rename from src/igl/opengl/create_vector_vbo.h rename to src/libigl/igl/opengl/create_vector_vbo.h diff --git a/src/igl/opengl/destroy_shader_program.cpp b/src/libigl/igl/opengl/destroy_shader_program.cpp similarity index 100% rename from src/igl/opengl/destroy_shader_program.cpp rename to src/libigl/igl/opengl/destroy_shader_program.cpp diff --git a/src/igl/opengl/destroy_shader_program.h b/src/libigl/igl/opengl/destroy_shader_program.h similarity index 100% rename from src/igl/opengl/destroy_shader_program.h rename to src/libigl/igl/opengl/destroy_shader_program.h diff --git a/src/igl/opengl/gl.h b/src/libigl/igl/opengl/gl.h similarity index 100% rename from src/igl/opengl/gl.h rename to src/libigl/igl/opengl/gl.h diff --git a/src/igl/opengl/gl_type_size.cpp b/src/libigl/igl/opengl/gl_type_size.cpp similarity index 100% rename from src/igl/opengl/gl_type_size.cpp rename to src/libigl/igl/opengl/gl_type_size.cpp diff --git a/src/igl/opengl/gl_type_size.h b/src/libigl/igl/opengl/gl_type_size.h similarity index 100% rename from src/igl/opengl/gl_type_size.h rename to src/libigl/igl/opengl/gl_type_size.h diff --git a/src/igl/opengl/glfw/Viewer.cpp b/src/libigl/igl/opengl/glfw/Viewer.cpp similarity index 100% rename from src/igl/opengl/glfw/Viewer.cpp rename to src/libigl/igl/opengl/glfw/Viewer.cpp diff --git a/src/igl/opengl/glfw/Viewer.h b/src/libigl/igl/opengl/glfw/Viewer.h similarity index 100% rename from src/igl/opengl/glfw/Viewer.h rename to src/libigl/igl/opengl/glfw/Viewer.h diff --git a/src/igl/opengl/glfw/ViewerPlugin.h b/src/libigl/igl/opengl/glfw/ViewerPlugin.h similarity index 100% rename from src/igl/opengl/glfw/ViewerPlugin.h rename to src/libigl/igl/opengl/glfw/ViewerPlugin.h diff --git a/src/igl/opengl/glfw/background_window.cpp b/src/libigl/igl/opengl/glfw/background_window.cpp similarity index 100% rename from src/igl/opengl/glfw/background_window.cpp rename to src/libigl/igl/opengl/glfw/background_window.cpp diff --git a/src/igl/opengl/glfw/background_window.h b/src/libigl/igl/opengl/glfw/background_window.h similarity index 100% rename from src/igl/opengl/glfw/background_window.h rename to src/libigl/igl/opengl/glfw/background_window.h diff --git a/src/igl/opengl/glfw/imgui/ImGuiHelpers.h b/src/libigl/igl/opengl/glfw/imgui/ImGuiHelpers.h similarity index 100% rename from src/igl/opengl/glfw/imgui/ImGuiHelpers.h rename to src/libigl/igl/opengl/glfw/imgui/ImGuiHelpers.h diff --git a/src/igl/opengl/glfw/imgui/ImGuiMenu.cpp b/src/libigl/igl/opengl/glfw/imgui/ImGuiMenu.cpp similarity index 100% rename from src/igl/opengl/glfw/imgui/ImGuiMenu.cpp rename to src/libigl/igl/opengl/glfw/imgui/ImGuiMenu.cpp diff --git a/src/igl/opengl/glfw/imgui/ImGuiMenu.h b/src/libigl/igl/opengl/glfw/imgui/ImGuiMenu.h similarity index 100% rename from src/igl/opengl/glfw/imgui/ImGuiMenu.h rename to src/libigl/igl/opengl/glfw/imgui/ImGuiMenu.h diff --git a/src/igl/opengl/glfw/map_texture.cpp b/src/libigl/igl/opengl/glfw/map_texture.cpp similarity index 100% rename from src/igl/opengl/glfw/map_texture.cpp rename to src/libigl/igl/opengl/glfw/map_texture.cpp diff --git a/src/igl/opengl/glfw/map_texture.h b/src/libigl/igl/opengl/glfw/map_texture.h similarity index 100% rename from src/igl/opengl/glfw/map_texture.h rename to src/libigl/igl/opengl/glfw/map_texture.h diff --git a/src/igl/opengl/init_render_to_texture.cpp b/src/libigl/igl/opengl/init_render_to_texture.cpp similarity index 100% rename from src/igl/opengl/init_render_to_texture.cpp rename to src/libigl/igl/opengl/init_render_to_texture.cpp diff --git a/src/igl/opengl/init_render_to_texture.h b/src/libigl/igl/opengl/init_render_to_texture.h similarity index 100% rename from src/igl/opengl/init_render_to_texture.h rename to src/libigl/igl/opengl/init_render_to_texture.h diff --git a/src/igl/opengl/load_shader.cpp b/src/libigl/igl/opengl/load_shader.cpp similarity index 100% rename from src/igl/opengl/load_shader.cpp rename to src/libigl/igl/opengl/load_shader.cpp diff --git a/src/igl/opengl/load_shader.h b/src/libigl/igl/opengl/load_shader.h similarity index 100% rename from src/igl/opengl/load_shader.h rename to src/libigl/igl/opengl/load_shader.h diff --git a/src/igl/opengl/print_program_info_log.cpp b/src/libigl/igl/opengl/print_program_info_log.cpp similarity index 100% rename from src/igl/opengl/print_program_info_log.cpp rename to src/libigl/igl/opengl/print_program_info_log.cpp diff --git a/src/igl/opengl/print_program_info_log.h b/src/libigl/igl/opengl/print_program_info_log.h similarity index 100% rename from src/igl/opengl/print_program_info_log.h rename to src/libigl/igl/opengl/print_program_info_log.h diff --git a/src/igl/opengl/print_shader_info_log.cpp b/src/libigl/igl/opengl/print_shader_info_log.cpp similarity index 100% rename from src/igl/opengl/print_shader_info_log.cpp rename to src/libigl/igl/opengl/print_shader_info_log.cpp diff --git a/src/igl/opengl/print_shader_info_log.h b/src/libigl/igl/opengl/print_shader_info_log.h similarity index 100% rename from src/igl/opengl/print_shader_info_log.h rename to src/libigl/igl/opengl/print_shader_info_log.h diff --git a/src/igl/opengl/report_gl_error.cpp b/src/libigl/igl/opengl/report_gl_error.cpp similarity index 100% rename from src/igl/opengl/report_gl_error.cpp rename to src/libigl/igl/opengl/report_gl_error.cpp diff --git a/src/igl/opengl/report_gl_error.h b/src/libigl/igl/opengl/report_gl_error.h similarity index 100% rename from src/igl/opengl/report_gl_error.h rename to src/libigl/igl/opengl/report_gl_error.h diff --git a/src/igl/opengl/uniform_type_to_string.cpp b/src/libigl/igl/opengl/uniform_type_to_string.cpp similarity index 100% rename from src/igl/opengl/uniform_type_to_string.cpp rename to src/libigl/igl/opengl/uniform_type_to_string.cpp diff --git a/src/igl/opengl/uniform_type_to_string.h b/src/libigl/igl/opengl/uniform_type_to_string.h similarity index 100% rename from src/igl/opengl/uniform_type_to_string.h rename to src/libigl/igl/opengl/uniform_type_to_string.h diff --git a/src/igl/opengl/vertex_array.cpp b/src/libigl/igl/opengl/vertex_array.cpp similarity index 100% rename from src/igl/opengl/vertex_array.cpp rename to src/libigl/igl/opengl/vertex_array.cpp diff --git a/src/igl/opengl/vertex_array.h b/src/libigl/igl/opengl/vertex_array.h similarity index 100% rename from src/igl/opengl/vertex_array.h rename to src/libigl/igl/opengl/vertex_array.h diff --git a/src/igl/opengl2/MouseController.h b/src/libigl/igl/opengl2/MouseController.h similarity index 100% rename from src/igl/opengl2/MouseController.h rename to src/libigl/igl/opengl2/MouseController.h diff --git a/src/igl/opengl2/RotateWidget.h b/src/libigl/igl/opengl2/RotateWidget.h similarity index 100% rename from src/igl/opengl2/RotateWidget.h rename to src/libigl/igl/opengl2/RotateWidget.h diff --git a/src/igl/opengl2/TranslateWidget.h b/src/libigl/igl/opengl2/TranslateWidget.h similarity index 100% rename from src/igl/opengl2/TranslateWidget.h rename to src/libigl/igl/opengl2/TranslateWidget.h diff --git a/src/igl/opengl2/draw_beach_ball.cpp b/src/libigl/igl/opengl2/draw_beach_ball.cpp similarity index 100% rename from src/igl/opengl2/draw_beach_ball.cpp rename to src/libigl/igl/opengl2/draw_beach_ball.cpp diff --git a/src/igl/opengl2/draw_beach_ball.h b/src/libigl/igl/opengl2/draw_beach_ball.h similarity index 100% rename from src/igl/opengl2/draw_beach_ball.h rename to src/libigl/igl/opengl2/draw_beach_ball.h diff --git a/src/igl/opengl2/draw_floor.cpp b/src/libigl/igl/opengl2/draw_floor.cpp similarity index 100% rename from src/igl/opengl2/draw_floor.cpp rename to src/libigl/igl/opengl2/draw_floor.cpp diff --git a/src/igl/opengl2/draw_floor.h b/src/libigl/igl/opengl2/draw_floor.h similarity index 100% rename from src/igl/opengl2/draw_floor.h rename to src/libigl/igl/opengl2/draw_floor.h diff --git a/src/igl/opengl2/draw_mesh.cpp b/src/libigl/igl/opengl2/draw_mesh.cpp similarity index 100% rename from src/igl/opengl2/draw_mesh.cpp rename to src/libigl/igl/opengl2/draw_mesh.cpp diff --git a/src/igl/opengl2/draw_mesh.h b/src/libigl/igl/opengl2/draw_mesh.h similarity index 100% rename from src/igl/opengl2/draw_mesh.h rename to src/libigl/igl/opengl2/draw_mesh.h diff --git a/src/igl/opengl2/draw_point.cpp b/src/libigl/igl/opengl2/draw_point.cpp similarity index 100% rename from src/igl/opengl2/draw_point.cpp rename to src/libigl/igl/opengl2/draw_point.cpp diff --git a/src/igl/opengl2/draw_point.h b/src/libigl/igl/opengl2/draw_point.h similarity index 100% rename from src/igl/opengl2/draw_point.h rename to src/libigl/igl/opengl2/draw_point.h diff --git a/src/igl/opengl2/draw_rectangular_marquee.cpp b/src/libigl/igl/opengl2/draw_rectangular_marquee.cpp similarity index 100% rename from src/igl/opengl2/draw_rectangular_marquee.cpp rename to src/libigl/igl/opengl2/draw_rectangular_marquee.cpp diff --git a/src/igl/opengl2/draw_rectangular_marquee.h b/src/libigl/igl/opengl2/draw_rectangular_marquee.h similarity index 100% rename from src/igl/opengl2/draw_rectangular_marquee.h rename to src/libigl/igl/opengl2/draw_rectangular_marquee.h diff --git a/src/igl/opengl2/draw_skeleton_3d.cpp b/src/libigl/igl/opengl2/draw_skeleton_3d.cpp similarity index 100% rename from src/igl/opengl2/draw_skeleton_3d.cpp rename to src/libigl/igl/opengl2/draw_skeleton_3d.cpp diff --git a/src/igl/opengl2/draw_skeleton_3d.h b/src/libigl/igl/opengl2/draw_skeleton_3d.h similarity index 100% rename from src/igl/opengl2/draw_skeleton_3d.h rename to src/libigl/igl/opengl2/draw_skeleton_3d.h diff --git a/src/igl/opengl2/draw_skeleton_vector_graphics.cpp b/src/libigl/igl/opengl2/draw_skeleton_vector_graphics.cpp similarity index 100% rename from src/igl/opengl2/draw_skeleton_vector_graphics.cpp rename to src/libigl/igl/opengl2/draw_skeleton_vector_graphics.cpp diff --git a/src/igl/opengl2/draw_skeleton_vector_graphics.h b/src/libigl/igl/opengl2/draw_skeleton_vector_graphics.h similarity index 100% rename from src/igl/opengl2/draw_skeleton_vector_graphics.h rename to src/libigl/igl/opengl2/draw_skeleton_vector_graphics.h diff --git a/src/igl/opengl2/flare_textures.h b/src/libigl/igl/opengl2/flare_textures.h similarity index 100% rename from src/igl/opengl2/flare_textures.h rename to src/libigl/igl/opengl2/flare_textures.h diff --git a/src/igl/opengl2/gl.h b/src/libigl/igl/opengl2/gl.h similarity index 100% rename from src/igl/opengl2/gl.h rename to src/libigl/igl/opengl2/gl.h diff --git a/src/igl/opengl2/glext.h b/src/libigl/igl/opengl2/glext.h similarity index 100% rename from src/igl/opengl2/glext.h rename to src/libigl/igl/opengl2/glext.h diff --git a/src/igl/opengl2/glu.h b/src/libigl/igl/opengl2/glu.h similarity index 100% rename from src/igl/opengl2/glu.h rename to src/libigl/igl/opengl2/glu.h diff --git a/src/igl/opengl2/lens_flare.cpp b/src/libigl/igl/opengl2/lens_flare.cpp similarity index 100% rename from src/igl/opengl2/lens_flare.cpp rename to src/libigl/igl/opengl2/lens_flare.cpp diff --git a/src/igl/opengl2/lens_flare.h b/src/libigl/igl/opengl2/lens_flare.h similarity index 100% rename from src/igl/opengl2/lens_flare.h rename to src/libigl/igl/opengl2/lens_flare.h diff --git a/src/igl/opengl2/model_proj_viewport.cpp b/src/libigl/igl/opengl2/model_proj_viewport.cpp similarity index 100% rename from src/igl/opengl2/model_proj_viewport.cpp rename to src/libigl/igl/opengl2/model_proj_viewport.cpp diff --git a/src/igl/opengl2/model_proj_viewport.h b/src/libigl/igl/opengl2/model_proj_viewport.h similarity index 100% rename from src/igl/opengl2/model_proj_viewport.h rename to src/libigl/igl/opengl2/model_proj_viewport.h diff --git a/src/igl/opengl2/print_gl_get.cpp b/src/libigl/igl/opengl2/print_gl_get.cpp similarity index 100% rename from src/igl/opengl2/print_gl_get.cpp rename to src/libigl/igl/opengl2/print_gl_get.cpp diff --git a/src/igl/opengl2/print_gl_get.h b/src/libigl/igl/opengl2/print_gl_get.h similarity index 100% rename from src/igl/opengl2/print_gl_get.h rename to src/libigl/igl/opengl2/print_gl_get.h diff --git a/src/igl/opengl2/project.cpp b/src/libigl/igl/opengl2/project.cpp similarity index 100% rename from src/igl/opengl2/project.cpp rename to src/libigl/igl/opengl2/project.cpp diff --git a/src/igl/opengl2/project.h b/src/libigl/igl/opengl2/project.h similarity index 100% rename from src/igl/opengl2/project.h rename to src/libigl/igl/opengl2/project.h diff --git a/src/igl/opengl2/right_axis.cpp b/src/libigl/igl/opengl2/right_axis.cpp similarity index 100% rename from src/igl/opengl2/right_axis.cpp rename to src/libigl/igl/opengl2/right_axis.cpp diff --git a/src/igl/opengl2/right_axis.h b/src/libigl/igl/opengl2/right_axis.h similarity index 100% rename from src/igl/opengl2/right_axis.h rename to src/libigl/igl/opengl2/right_axis.h diff --git a/src/igl/opengl2/shine_textures.h b/src/libigl/igl/opengl2/shine_textures.h similarity index 100% rename from src/igl/opengl2/shine_textures.h rename to src/libigl/igl/opengl2/shine_textures.h diff --git a/src/igl/opengl2/sort_triangles.cpp b/src/libigl/igl/opengl2/sort_triangles.cpp similarity index 100% rename from src/igl/opengl2/sort_triangles.cpp rename to src/libigl/igl/opengl2/sort_triangles.cpp diff --git a/src/igl/opengl2/sort_triangles.h b/src/libigl/igl/opengl2/sort_triangles.h similarity index 100% rename from src/igl/opengl2/sort_triangles.h rename to src/libigl/igl/opengl2/sort_triangles.h diff --git a/src/igl/opengl2/unproject.cpp b/src/libigl/igl/opengl2/unproject.cpp similarity index 100% rename from src/igl/opengl2/unproject.cpp rename to src/libigl/igl/opengl2/unproject.cpp diff --git a/src/igl/opengl2/unproject.h b/src/libigl/igl/opengl2/unproject.h similarity index 100% rename from src/igl/opengl2/unproject.h rename to src/libigl/igl/opengl2/unproject.h diff --git a/src/igl/opengl2/unproject_to_zero_plane.cpp b/src/libigl/igl/opengl2/unproject_to_zero_plane.cpp similarity index 100% rename from src/igl/opengl2/unproject_to_zero_plane.cpp rename to src/libigl/igl/opengl2/unproject_to_zero_plane.cpp diff --git a/src/igl/opengl2/unproject_to_zero_plane.h b/src/libigl/igl/opengl2/unproject_to_zero_plane.h similarity index 100% rename from src/igl/opengl2/unproject_to_zero_plane.h rename to src/libigl/igl/opengl2/unproject_to_zero_plane.h diff --git a/src/igl/opengl2/up_axis.cpp b/src/libigl/igl/opengl2/up_axis.cpp similarity index 100% rename from src/igl/opengl2/up_axis.cpp rename to src/libigl/igl/opengl2/up_axis.cpp diff --git a/src/igl/opengl2/up_axis.h b/src/libigl/igl/opengl2/up_axis.h similarity index 100% rename from src/igl/opengl2/up_axis.h rename to src/libigl/igl/opengl2/up_axis.h diff --git a/src/igl/opengl2/view_axis.cpp b/src/libigl/igl/opengl2/view_axis.cpp similarity index 100% rename from src/igl/opengl2/view_axis.cpp rename to src/libigl/igl/opengl2/view_axis.cpp diff --git a/src/igl/opengl2/view_axis.h b/src/libigl/igl/opengl2/view_axis.h similarity index 100% rename from src/igl/opengl2/view_axis.h rename to src/libigl/igl/opengl2/view_axis.h diff --git a/src/igl/orient_outward.cpp b/src/libigl/igl/orient_outward.cpp similarity index 100% rename from src/igl/orient_outward.cpp rename to src/libigl/igl/orient_outward.cpp diff --git a/src/igl/orient_outward.h b/src/libigl/igl/orient_outward.h similarity index 100% rename from src/igl/orient_outward.h rename to src/libigl/igl/orient_outward.h diff --git a/src/igl/orientable_patches.cpp b/src/libigl/igl/orientable_patches.cpp similarity index 100% rename from src/igl/orientable_patches.cpp rename to src/libigl/igl/orientable_patches.cpp diff --git a/src/igl/orientable_patches.h b/src/libigl/igl/orientable_patches.h similarity index 100% rename from src/igl/orientable_patches.h rename to src/libigl/igl/orientable_patches.h diff --git a/src/igl/oriented_facets.cpp b/src/libigl/igl/oriented_facets.cpp similarity index 100% rename from src/igl/oriented_facets.cpp rename to src/libigl/igl/oriented_facets.cpp diff --git a/src/igl/oriented_facets.h b/src/libigl/igl/oriented_facets.h similarity index 100% rename from src/igl/oriented_facets.h rename to src/libigl/igl/oriented_facets.h diff --git a/src/igl/orth.cpp b/src/libigl/igl/orth.cpp similarity index 100% rename from src/igl/orth.cpp rename to src/libigl/igl/orth.cpp diff --git a/src/igl/orth.h b/src/libigl/igl/orth.h similarity index 100% rename from src/igl/orth.h rename to src/libigl/igl/orth.h diff --git a/src/igl/ortho.cpp b/src/libigl/igl/ortho.cpp similarity index 100% rename from src/igl/ortho.cpp rename to src/libigl/igl/ortho.cpp diff --git a/src/igl/ortho.h b/src/libigl/igl/ortho.h similarity index 100% rename from src/igl/ortho.h rename to src/libigl/igl/ortho.h diff --git a/src/igl/outer_element.cpp b/src/libigl/igl/outer_element.cpp similarity index 100% rename from src/igl/outer_element.cpp rename to src/libigl/igl/outer_element.cpp diff --git a/src/igl/outer_element.h b/src/libigl/igl/outer_element.h similarity index 100% rename from src/igl/outer_element.h rename to src/libigl/igl/outer_element.h diff --git a/src/igl/parallel_for.h b/src/libigl/igl/parallel_for.h similarity index 100% rename from src/igl/parallel_for.h rename to src/libigl/igl/parallel_for.h diff --git a/src/igl/parallel_transport_angles.cpp b/src/libigl/igl/parallel_transport_angles.cpp similarity index 100% rename from src/igl/parallel_transport_angles.cpp rename to src/libigl/igl/parallel_transport_angles.cpp diff --git a/src/igl/parallel_transport_angles.h b/src/libigl/igl/parallel_transport_angles.h similarity index 100% rename from src/igl/parallel_transport_angles.h rename to src/libigl/igl/parallel_transport_angles.h diff --git a/src/igl/partition.cpp b/src/libigl/igl/partition.cpp similarity index 100% rename from src/igl/partition.cpp rename to src/libigl/igl/partition.cpp diff --git a/src/igl/partition.h b/src/libigl/igl/partition.h similarity index 100% rename from src/igl/partition.h rename to src/libigl/igl/partition.h diff --git a/src/igl/parula.cpp b/src/libigl/igl/parula.cpp similarity index 100% rename from src/igl/parula.cpp rename to src/libigl/igl/parula.cpp diff --git a/src/igl/parula.h b/src/libigl/igl/parula.h similarity index 100% rename from src/igl/parula.h rename to src/libigl/igl/parula.h diff --git a/src/igl/path_to_executable.cpp b/src/libigl/igl/path_to_executable.cpp similarity index 100% rename from src/igl/path_to_executable.cpp rename to src/libigl/igl/path_to_executable.cpp diff --git a/src/igl/path_to_executable.h b/src/libigl/igl/path_to_executable.h similarity index 100% rename from src/igl/path_to_executable.h rename to src/libigl/igl/path_to_executable.h diff --git a/src/igl/pathinfo.cpp b/src/libigl/igl/pathinfo.cpp similarity index 100% rename from src/igl/pathinfo.cpp rename to src/libigl/igl/pathinfo.cpp diff --git a/src/igl/pathinfo.h b/src/libigl/igl/pathinfo.h similarity index 100% rename from src/igl/pathinfo.h rename to src/libigl/igl/pathinfo.h diff --git a/src/igl/per_corner_normals.cpp b/src/libigl/igl/per_corner_normals.cpp similarity index 100% rename from src/igl/per_corner_normals.cpp rename to src/libigl/igl/per_corner_normals.cpp diff --git a/src/igl/per_corner_normals.h b/src/libigl/igl/per_corner_normals.h similarity index 100% rename from src/igl/per_corner_normals.h rename to src/libigl/igl/per_corner_normals.h diff --git a/src/igl/per_edge_normals.cpp b/src/libigl/igl/per_edge_normals.cpp similarity index 100% rename from src/igl/per_edge_normals.cpp rename to src/libigl/igl/per_edge_normals.cpp diff --git a/src/igl/per_edge_normals.h b/src/libigl/igl/per_edge_normals.h similarity index 100% rename from src/igl/per_edge_normals.h rename to src/libigl/igl/per_edge_normals.h diff --git a/src/igl/per_face_normals.cpp b/src/libigl/igl/per_face_normals.cpp similarity index 100% rename from src/igl/per_face_normals.cpp rename to src/libigl/igl/per_face_normals.cpp diff --git a/src/igl/per_face_normals.h b/src/libigl/igl/per_face_normals.h similarity index 100% rename from src/igl/per_face_normals.h rename to src/libigl/igl/per_face_normals.h diff --git a/src/igl/per_vertex_attribute_smoothing.cpp b/src/libigl/igl/per_vertex_attribute_smoothing.cpp similarity index 100% rename from src/igl/per_vertex_attribute_smoothing.cpp rename to src/libigl/igl/per_vertex_attribute_smoothing.cpp diff --git a/src/igl/per_vertex_attribute_smoothing.h b/src/libigl/igl/per_vertex_attribute_smoothing.h similarity index 100% rename from src/igl/per_vertex_attribute_smoothing.h rename to src/libigl/igl/per_vertex_attribute_smoothing.h diff --git a/src/igl/per_vertex_normals.cpp b/src/libigl/igl/per_vertex_normals.cpp similarity index 100% rename from src/igl/per_vertex_normals.cpp rename to src/libigl/igl/per_vertex_normals.cpp diff --git a/src/igl/per_vertex_normals.h b/src/libigl/igl/per_vertex_normals.h similarity index 100% rename from src/igl/per_vertex_normals.h rename to src/libigl/igl/per_vertex_normals.h diff --git a/src/igl/per_vertex_point_to_plane_quadrics.cpp b/src/libigl/igl/per_vertex_point_to_plane_quadrics.cpp similarity index 100% rename from src/igl/per_vertex_point_to_plane_quadrics.cpp rename to src/libigl/igl/per_vertex_point_to_plane_quadrics.cpp diff --git a/src/igl/per_vertex_point_to_plane_quadrics.h b/src/libigl/igl/per_vertex_point_to_plane_quadrics.h similarity index 100% rename from src/igl/per_vertex_point_to_plane_quadrics.h rename to src/libigl/igl/per_vertex_point_to_plane_quadrics.h diff --git a/src/igl/piecewise_constant_winding_number.cpp b/src/libigl/igl/piecewise_constant_winding_number.cpp similarity index 100% rename from src/igl/piecewise_constant_winding_number.cpp rename to src/libigl/igl/piecewise_constant_winding_number.cpp diff --git a/src/igl/piecewise_constant_winding_number.h b/src/libigl/igl/piecewise_constant_winding_number.h similarity index 100% rename from src/igl/piecewise_constant_winding_number.h rename to src/libigl/igl/piecewise_constant_winding_number.h diff --git a/src/igl/pinv.cpp b/src/libigl/igl/pinv.cpp similarity index 100% rename from src/igl/pinv.cpp rename to src/libigl/igl/pinv.cpp diff --git a/src/igl/pinv.h b/src/libigl/igl/pinv.h similarity index 100% rename from src/igl/pinv.h rename to src/libigl/igl/pinv.h diff --git a/src/igl/planarize_quad_mesh.cpp b/src/libigl/igl/planarize_quad_mesh.cpp similarity index 100% rename from src/igl/planarize_quad_mesh.cpp rename to src/libigl/igl/planarize_quad_mesh.cpp diff --git a/src/igl/planarize_quad_mesh.h b/src/libigl/igl/planarize_quad_mesh.h similarity index 100% rename from src/igl/planarize_quad_mesh.h rename to src/libigl/igl/planarize_quad_mesh.h diff --git a/src/igl/ply.h b/src/libigl/igl/ply.h similarity index 100% rename from src/igl/ply.h rename to src/libigl/igl/ply.h diff --git a/src/igl/png/readPNG.cpp b/src/libigl/igl/png/readPNG.cpp similarity index 100% rename from src/igl/png/readPNG.cpp rename to src/libigl/igl/png/readPNG.cpp diff --git a/src/igl/png/readPNG.h b/src/libigl/igl/png/readPNG.h similarity index 100% rename from src/igl/png/readPNG.h rename to src/libigl/igl/png/readPNG.h diff --git a/src/igl/png/render_to_png.cpp b/src/libigl/igl/png/render_to_png.cpp similarity index 100% rename from src/igl/png/render_to_png.cpp rename to src/libigl/igl/png/render_to_png.cpp diff --git a/src/igl/png/render_to_png.h b/src/libigl/igl/png/render_to_png.h similarity index 100% rename from src/igl/png/render_to_png.h rename to src/libigl/igl/png/render_to_png.h diff --git a/src/igl/png/render_to_png_async.cpp b/src/libigl/igl/png/render_to_png_async.cpp similarity index 100% rename from src/igl/png/render_to_png_async.cpp rename to src/libigl/igl/png/render_to_png_async.cpp diff --git a/src/igl/png/render_to_png_async.h b/src/libigl/igl/png/render_to_png_async.h similarity index 100% rename from src/igl/png/render_to_png_async.h rename to src/libigl/igl/png/render_to_png_async.h diff --git a/src/igl/png/texture_from_file.cpp b/src/libigl/igl/png/texture_from_file.cpp similarity index 100% rename from src/igl/png/texture_from_file.cpp rename to src/libigl/igl/png/texture_from_file.cpp diff --git a/src/igl/png/texture_from_file.h b/src/libigl/igl/png/texture_from_file.h similarity index 100% rename from src/igl/png/texture_from_file.h rename to src/libigl/igl/png/texture_from_file.h diff --git a/src/igl/png/texture_from_png.cpp b/src/libigl/igl/png/texture_from_png.cpp similarity index 100% rename from src/igl/png/texture_from_png.cpp rename to src/libigl/igl/png/texture_from_png.cpp diff --git a/src/igl/png/texture_from_png.h b/src/libigl/igl/png/texture_from_png.h similarity index 100% rename from src/igl/png/texture_from_png.h rename to src/libigl/igl/png/texture_from_png.h diff --git a/src/igl/png/writePNG.cpp b/src/libigl/igl/png/writePNG.cpp similarity index 100% rename from src/igl/png/writePNG.cpp rename to src/libigl/igl/png/writePNG.cpp diff --git a/src/igl/png/writePNG.h b/src/libigl/igl/png/writePNG.h similarity index 100% rename from src/igl/png/writePNG.h rename to src/libigl/igl/png/writePNG.h diff --git a/src/igl/point_in_circle.cpp b/src/libigl/igl/point_in_circle.cpp similarity index 100% rename from src/igl/point_in_circle.cpp rename to src/libigl/igl/point_in_circle.cpp diff --git a/src/igl/point_in_circle.h b/src/libigl/igl/point_in_circle.h similarity index 100% rename from src/igl/point_in_circle.h rename to src/libigl/igl/point_in_circle.h diff --git a/src/igl/point_in_poly.cpp b/src/libigl/igl/point_in_poly.cpp similarity index 100% rename from src/igl/point_in_poly.cpp rename to src/libigl/igl/point_in_poly.cpp diff --git a/src/igl/point_in_poly.h b/src/libigl/igl/point_in_poly.h similarity index 100% rename from src/igl/point_in_poly.h rename to src/libigl/igl/point_in_poly.h diff --git a/src/igl/point_mesh_squared_distance.cpp b/src/libigl/igl/point_mesh_squared_distance.cpp similarity index 100% rename from src/igl/point_mesh_squared_distance.cpp rename to src/libigl/igl/point_mesh_squared_distance.cpp diff --git a/src/igl/point_mesh_squared_distance.h b/src/libigl/igl/point_mesh_squared_distance.h similarity index 100% rename from src/igl/point_mesh_squared_distance.h rename to src/libigl/igl/point_mesh_squared_distance.h diff --git a/src/igl/point_simplex_squared_distance.cpp b/src/libigl/igl/point_simplex_squared_distance.cpp similarity index 100% rename from src/igl/point_simplex_squared_distance.cpp rename to src/libigl/igl/point_simplex_squared_distance.cpp diff --git a/src/igl/point_simplex_squared_distance.h b/src/libigl/igl/point_simplex_squared_distance.h similarity index 100% rename from src/igl/point_simplex_squared_distance.h rename to src/libigl/igl/point_simplex_squared_distance.h diff --git a/src/igl/polar_dec.cpp b/src/libigl/igl/polar_dec.cpp similarity index 100% rename from src/igl/polar_dec.cpp rename to src/libigl/igl/polar_dec.cpp diff --git a/src/igl/polar_dec.h b/src/libigl/igl/polar_dec.h similarity index 100% rename from src/igl/polar_dec.h rename to src/libigl/igl/polar_dec.h diff --git a/src/igl/polar_svd.cpp b/src/libigl/igl/polar_svd.cpp similarity index 100% rename from src/igl/polar_svd.cpp rename to src/libigl/igl/polar_svd.cpp diff --git a/src/igl/polar_svd.h b/src/libigl/igl/polar_svd.h similarity index 100% rename from src/igl/polar_svd.h rename to src/libigl/igl/polar_svd.h diff --git a/src/igl/polar_svd3x3.cpp b/src/libigl/igl/polar_svd3x3.cpp similarity index 100% rename from src/igl/polar_svd3x3.cpp rename to src/libigl/igl/polar_svd3x3.cpp diff --git a/src/igl/polar_svd3x3.h b/src/libigl/igl/polar_svd3x3.h similarity index 100% rename from src/igl/polar_svd3x3.h rename to src/libigl/igl/polar_svd3x3.h diff --git a/src/igl/polygon_mesh_to_triangle_mesh.cpp b/src/libigl/igl/polygon_mesh_to_triangle_mesh.cpp similarity index 100% rename from src/igl/polygon_mesh_to_triangle_mesh.cpp rename to src/libigl/igl/polygon_mesh_to_triangle_mesh.cpp diff --git a/src/igl/polygon_mesh_to_triangle_mesh.h b/src/libigl/igl/polygon_mesh_to_triangle_mesh.h similarity index 100% rename from src/igl/polygon_mesh_to_triangle_mesh.h rename to src/libigl/igl/polygon_mesh_to_triangle_mesh.h diff --git a/src/igl/principal_curvature.cpp b/src/libigl/igl/principal_curvature.cpp similarity index 100% rename from src/igl/principal_curvature.cpp rename to src/libigl/igl/principal_curvature.cpp diff --git a/src/igl/principal_curvature.h b/src/libigl/igl/principal_curvature.h similarity index 100% rename from src/igl/principal_curvature.h rename to src/libigl/igl/principal_curvature.h diff --git a/src/igl/print_ijv.cpp b/src/libigl/igl/print_ijv.cpp similarity index 100% rename from src/igl/print_ijv.cpp rename to src/libigl/igl/print_ijv.cpp diff --git a/src/igl/print_ijv.h b/src/libigl/igl/print_ijv.h similarity index 100% rename from src/igl/print_ijv.h rename to src/libigl/igl/print_ijv.h diff --git a/src/igl/print_vector.cpp b/src/libigl/igl/print_vector.cpp similarity index 100% rename from src/igl/print_vector.cpp rename to src/libigl/igl/print_vector.cpp diff --git a/src/igl/print_vector.h b/src/libigl/igl/print_vector.h similarity index 100% rename from src/igl/print_vector.h rename to src/libigl/igl/print_vector.h diff --git a/src/igl/procrustes.cpp b/src/libigl/igl/procrustes.cpp similarity index 100% rename from src/igl/procrustes.cpp rename to src/libigl/igl/procrustes.cpp diff --git a/src/igl/procrustes.h b/src/libigl/igl/procrustes.h similarity index 100% rename from src/igl/procrustes.h rename to src/libigl/igl/procrustes.h diff --git a/src/igl/project.cpp b/src/libigl/igl/project.cpp similarity index 100% rename from src/igl/project.cpp rename to src/libigl/igl/project.cpp diff --git a/src/igl/project.h b/src/libigl/igl/project.h similarity index 100% rename from src/igl/project.h rename to src/libigl/igl/project.h diff --git a/src/igl/project_isometrically_to_plane.cpp b/src/libigl/igl/project_isometrically_to_plane.cpp similarity index 100% rename from src/igl/project_isometrically_to_plane.cpp rename to src/libigl/igl/project_isometrically_to_plane.cpp diff --git a/src/igl/project_isometrically_to_plane.h b/src/libigl/igl/project_isometrically_to_plane.h similarity index 100% rename from src/igl/project_isometrically_to_plane.h rename to src/libigl/igl/project_isometrically_to_plane.h diff --git a/src/igl/project_to_line.cpp b/src/libigl/igl/project_to_line.cpp similarity index 100% rename from src/igl/project_to_line.cpp rename to src/libigl/igl/project_to_line.cpp diff --git a/src/igl/project_to_line.h b/src/libigl/igl/project_to_line.h similarity index 100% rename from src/igl/project_to_line.h rename to src/libigl/igl/project_to_line.h diff --git a/src/igl/project_to_line_segment.cpp b/src/libigl/igl/project_to_line_segment.cpp similarity index 100% rename from src/igl/project_to_line_segment.cpp rename to src/libigl/igl/project_to_line_segment.cpp diff --git a/src/igl/project_to_line_segment.h b/src/libigl/igl/project_to_line_segment.h similarity index 100% rename from src/igl/project_to_line_segment.h rename to src/libigl/igl/project_to_line_segment.h diff --git a/src/igl/pseudonormal_test.cpp b/src/libigl/igl/pseudonormal_test.cpp similarity index 100% rename from src/igl/pseudonormal_test.cpp rename to src/libigl/igl/pseudonormal_test.cpp diff --git a/src/igl/pseudonormal_test.h b/src/libigl/igl/pseudonormal_test.h similarity index 100% rename from src/igl/pseudonormal_test.h rename to src/libigl/igl/pseudonormal_test.h diff --git a/src/igl/pso.cpp b/src/libigl/igl/pso.cpp similarity index 100% rename from src/igl/pso.cpp rename to src/libigl/igl/pso.cpp diff --git a/src/igl/pso.h b/src/libigl/igl/pso.h similarity index 100% rename from src/igl/pso.h rename to src/libigl/igl/pso.h diff --git a/src/igl/qslim.cpp b/src/libigl/igl/qslim.cpp similarity index 100% rename from src/igl/qslim.cpp rename to src/libigl/igl/qslim.cpp diff --git a/src/igl/qslim.h b/src/libigl/igl/qslim.h similarity index 100% rename from src/igl/qslim.h rename to src/libigl/igl/qslim.h diff --git a/src/igl/qslim_optimal_collapse_edge_callbacks.cpp b/src/libigl/igl/qslim_optimal_collapse_edge_callbacks.cpp similarity index 100% rename from src/igl/qslim_optimal_collapse_edge_callbacks.cpp rename to src/libigl/igl/qslim_optimal_collapse_edge_callbacks.cpp diff --git a/src/igl/qslim_optimal_collapse_edge_callbacks.h b/src/libigl/igl/qslim_optimal_collapse_edge_callbacks.h similarity index 100% rename from src/igl/qslim_optimal_collapse_edge_callbacks.h rename to src/libigl/igl/qslim_optimal_collapse_edge_callbacks.h diff --git a/src/igl/quad_planarity.cpp b/src/libigl/igl/quad_planarity.cpp similarity index 100% rename from src/igl/quad_planarity.cpp rename to src/libigl/igl/quad_planarity.cpp diff --git a/src/igl/quad_planarity.h b/src/libigl/igl/quad_planarity.h similarity index 100% rename from src/igl/quad_planarity.h rename to src/libigl/igl/quad_planarity.h diff --git a/src/igl/quadric_binary_plus_operator.cpp b/src/libigl/igl/quadric_binary_plus_operator.cpp similarity index 100% rename from src/igl/quadric_binary_plus_operator.cpp rename to src/libigl/igl/quadric_binary_plus_operator.cpp diff --git a/src/igl/quadric_binary_plus_operator.h b/src/libigl/igl/quadric_binary_plus_operator.h similarity index 100% rename from src/igl/quadric_binary_plus_operator.h rename to src/libigl/igl/quadric_binary_plus_operator.h diff --git a/src/igl/quat_conjugate.cpp b/src/libigl/igl/quat_conjugate.cpp similarity index 100% rename from src/igl/quat_conjugate.cpp rename to src/libigl/igl/quat_conjugate.cpp diff --git a/src/igl/quat_conjugate.h b/src/libigl/igl/quat_conjugate.h similarity index 100% rename from src/igl/quat_conjugate.h rename to src/libigl/igl/quat_conjugate.h diff --git a/src/igl/quat_mult.cpp b/src/libigl/igl/quat_mult.cpp similarity index 100% rename from src/igl/quat_mult.cpp rename to src/libigl/igl/quat_mult.cpp diff --git a/src/igl/quat_mult.h b/src/libigl/igl/quat_mult.h similarity index 100% rename from src/igl/quat_mult.h rename to src/libigl/igl/quat_mult.h diff --git a/src/igl/quat_to_axis_angle.cpp b/src/libigl/igl/quat_to_axis_angle.cpp similarity index 100% rename from src/igl/quat_to_axis_angle.cpp rename to src/libigl/igl/quat_to_axis_angle.cpp diff --git a/src/igl/quat_to_axis_angle.h b/src/libigl/igl/quat_to_axis_angle.h similarity index 100% rename from src/igl/quat_to_axis_angle.h rename to src/libigl/igl/quat_to_axis_angle.h diff --git a/src/igl/quat_to_mat.cpp b/src/libigl/igl/quat_to_mat.cpp similarity index 100% rename from src/igl/quat_to_mat.cpp rename to src/libigl/igl/quat_to_mat.cpp diff --git a/src/igl/quat_to_mat.h b/src/libigl/igl/quat_to_mat.h similarity index 100% rename from src/igl/quat_to_mat.h rename to src/libigl/igl/quat_to_mat.h diff --git a/src/igl/quats_to_column.cpp b/src/libigl/igl/quats_to_column.cpp similarity index 100% rename from src/igl/quats_to_column.cpp rename to src/libigl/igl/quats_to_column.cpp diff --git a/src/igl/quats_to_column.h b/src/libigl/igl/quats_to_column.h similarity index 100% rename from src/igl/quats_to_column.h rename to src/libigl/igl/quats_to_column.h diff --git a/src/igl/ramer_douglas_peucker.cpp b/src/libigl/igl/ramer_douglas_peucker.cpp similarity index 100% rename from src/igl/ramer_douglas_peucker.cpp rename to src/libigl/igl/ramer_douglas_peucker.cpp diff --git a/src/igl/ramer_douglas_peucker.h b/src/libigl/igl/ramer_douglas_peucker.h similarity index 100% rename from src/igl/ramer_douglas_peucker.h rename to src/libigl/igl/ramer_douglas_peucker.h diff --git a/src/igl/random_dir.cpp b/src/libigl/igl/random_dir.cpp similarity index 100% rename from src/igl/random_dir.cpp rename to src/libigl/igl/random_dir.cpp diff --git a/src/igl/random_dir.h b/src/libigl/igl/random_dir.h similarity index 100% rename from src/igl/random_dir.h rename to src/libigl/igl/random_dir.h diff --git a/src/igl/random_points_on_mesh.cpp b/src/libigl/igl/random_points_on_mesh.cpp similarity index 100% rename from src/igl/random_points_on_mesh.cpp rename to src/libigl/igl/random_points_on_mesh.cpp diff --git a/src/igl/random_points_on_mesh.h b/src/libigl/igl/random_points_on_mesh.h similarity index 100% rename from src/igl/random_points_on_mesh.h rename to src/libigl/igl/random_points_on_mesh.h diff --git a/src/igl/random_quaternion.cpp b/src/libigl/igl/random_quaternion.cpp similarity index 100% rename from src/igl/random_quaternion.cpp rename to src/libigl/igl/random_quaternion.cpp diff --git a/src/igl/random_quaternion.h b/src/libigl/igl/random_quaternion.h similarity index 100% rename from src/igl/random_quaternion.h rename to src/libigl/igl/random_quaternion.h diff --git a/src/igl/random_search.cpp b/src/libigl/igl/random_search.cpp similarity index 100% rename from src/igl/random_search.cpp rename to src/libigl/igl/random_search.cpp diff --git a/src/igl/random_search.h b/src/libigl/igl/random_search.h similarity index 100% rename from src/igl/random_search.h rename to src/libigl/igl/random_search.h diff --git a/src/igl/randperm.cpp b/src/libigl/igl/randperm.cpp similarity index 100% rename from src/igl/randperm.cpp rename to src/libigl/igl/randperm.cpp diff --git a/src/igl/randperm.h b/src/libigl/igl/randperm.h similarity index 100% rename from src/igl/randperm.h rename to src/libigl/igl/randperm.h diff --git a/src/igl/ray_box_intersect.cpp b/src/libigl/igl/ray_box_intersect.cpp similarity index 100% rename from src/igl/ray_box_intersect.cpp rename to src/libigl/igl/ray_box_intersect.cpp diff --git a/src/igl/ray_box_intersect.h b/src/libigl/igl/ray_box_intersect.h similarity index 100% rename from src/igl/ray_box_intersect.h rename to src/libigl/igl/ray_box_intersect.h diff --git a/src/igl/ray_mesh_intersect.cpp b/src/libigl/igl/ray_mesh_intersect.cpp similarity index 100% rename from src/igl/ray_mesh_intersect.cpp rename to src/libigl/igl/ray_mesh_intersect.cpp diff --git a/src/igl/ray_mesh_intersect.h b/src/libigl/igl/ray_mesh_intersect.h similarity index 100% rename from src/igl/ray_mesh_intersect.h rename to src/libigl/igl/ray_mesh_intersect.h diff --git a/src/igl/ray_sphere_intersect.cpp b/src/libigl/igl/ray_sphere_intersect.cpp similarity index 100% rename from src/igl/ray_sphere_intersect.cpp rename to src/libigl/igl/ray_sphere_intersect.cpp diff --git a/src/igl/ray_sphere_intersect.h b/src/libigl/igl/ray_sphere_intersect.h similarity index 100% rename from src/igl/ray_sphere_intersect.h rename to src/libigl/igl/ray_sphere_intersect.h diff --git a/src/igl/raytri.c b/src/libigl/igl/raytri.c similarity index 100% rename from src/igl/raytri.c rename to src/libigl/igl/raytri.c diff --git a/src/igl/readBF.cpp b/src/libigl/igl/readBF.cpp similarity index 100% rename from src/igl/readBF.cpp rename to src/libigl/igl/readBF.cpp diff --git a/src/igl/readBF.h b/src/libigl/igl/readBF.h similarity index 100% rename from src/igl/readBF.h rename to src/libigl/igl/readBF.h diff --git a/src/igl/readCSV.cpp b/src/libigl/igl/readCSV.cpp similarity index 100% rename from src/igl/readCSV.cpp rename to src/libigl/igl/readCSV.cpp diff --git a/src/igl/readCSV.h b/src/libigl/igl/readCSV.h similarity index 100% rename from src/igl/readCSV.h rename to src/libigl/igl/readCSV.h diff --git a/src/igl/readDMAT.cpp b/src/libigl/igl/readDMAT.cpp similarity index 100% rename from src/igl/readDMAT.cpp rename to src/libigl/igl/readDMAT.cpp diff --git a/src/igl/readDMAT.h b/src/libigl/igl/readDMAT.h similarity index 100% rename from src/igl/readDMAT.h rename to src/libigl/igl/readDMAT.h diff --git a/src/igl/readMESH.cpp b/src/libigl/igl/readMESH.cpp similarity index 100% rename from src/igl/readMESH.cpp rename to src/libigl/igl/readMESH.cpp diff --git a/src/igl/readMESH.h b/src/libigl/igl/readMESH.h similarity index 100% rename from src/igl/readMESH.h rename to src/libigl/igl/readMESH.h diff --git a/src/igl/readMSH.cpp b/src/libigl/igl/readMSH.cpp similarity index 100% rename from src/igl/readMSH.cpp rename to src/libigl/igl/readMSH.cpp diff --git a/src/igl/readMSH.h b/src/libigl/igl/readMSH.h similarity index 100% rename from src/igl/readMSH.h rename to src/libigl/igl/readMSH.h diff --git a/src/igl/readNODE.cpp b/src/libigl/igl/readNODE.cpp similarity index 100% rename from src/igl/readNODE.cpp rename to src/libigl/igl/readNODE.cpp diff --git a/src/igl/readNODE.h b/src/libigl/igl/readNODE.h similarity index 100% rename from src/igl/readNODE.h rename to src/libigl/igl/readNODE.h diff --git a/src/igl/readOBJ.cpp b/src/libigl/igl/readOBJ.cpp similarity index 100% rename from src/igl/readOBJ.cpp rename to src/libigl/igl/readOBJ.cpp diff --git a/src/igl/readOBJ.h b/src/libigl/igl/readOBJ.h similarity index 100% rename from src/igl/readOBJ.h rename to src/libigl/igl/readOBJ.h diff --git a/src/igl/readOFF.cpp b/src/libigl/igl/readOFF.cpp similarity index 100% rename from src/igl/readOFF.cpp rename to src/libigl/igl/readOFF.cpp diff --git a/src/igl/readOFF.h b/src/libigl/igl/readOFF.h similarity index 100% rename from src/igl/readOFF.h rename to src/libigl/igl/readOFF.h diff --git a/src/igl/readPLY.cpp b/src/libigl/igl/readPLY.cpp similarity index 100% rename from src/igl/readPLY.cpp rename to src/libigl/igl/readPLY.cpp diff --git a/src/igl/readPLY.h b/src/libigl/igl/readPLY.h similarity index 100% rename from src/igl/readPLY.h rename to src/libigl/igl/readPLY.h diff --git a/src/igl/readSTL.cpp b/src/libigl/igl/readSTL.cpp similarity index 100% rename from src/igl/readSTL.cpp rename to src/libigl/igl/readSTL.cpp diff --git a/src/igl/readSTL.h b/src/libigl/igl/readSTL.h similarity index 100% rename from src/igl/readSTL.h rename to src/libigl/igl/readSTL.h diff --git a/src/igl/readTGF.cpp b/src/libigl/igl/readTGF.cpp similarity index 100% rename from src/igl/readTGF.cpp rename to src/libigl/igl/readTGF.cpp diff --git a/src/igl/readTGF.h b/src/libigl/igl/readTGF.h similarity index 100% rename from src/igl/readTGF.h rename to src/libigl/igl/readTGF.h diff --git a/src/igl/readWRL.cpp b/src/libigl/igl/readWRL.cpp similarity index 100% rename from src/igl/readWRL.cpp rename to src/libigl/igl/readWRL.cpp diff --git a/src/igl/readWRL.h b/src/libigl/igl/readWRL.h similarity index 100% rename from src/igl/readWRL.h rename to src/libigl/igl/readWRL.h diff --git a/src/igl/read_triangle_mesh.cpp b/src/libigl/igl/read_triangle_mesh.cpp similarity index 100% rename from src/igl/read_triangle_mesh.cpp rename to src/libigl/igl/read_triangle_mesh.cpp diff --git a/src/igl/read_triangle_mesh.h b/src/libigl/igl/read_triangle_mesh.h similarity index 100% rename from src/igl/read_triangle_mesh.h rename to src/libigl/igl/read_triangle_mesh.h diff --git a/src/igl/redux.h b/src/libigl/igl/redux.h similarity index 100% rename from src/igl/redux.h rename to src/libigl/igl/redux.h diff --git a/src/igl/remesh_along_isoline.cpp b/src/libigl/igl/remesh_along_isoline.cpp similarity index 100% rename from src/igl/remesh_along_isoline.cpp rename to src/libigl/igl/remesh_along_isoline.cpp diff --git a/src/igl/remesh_along_isoline.h b/src/libigl/igl/remesh_along_isoline.h similarity index 100% rename from src/igl/remesh_along_isoline.h rename to src/libigl/igl/remesh_along_isoline.h diff --git a/src/igl/remove_duplicate_vertices.cpp b/src/libigl/igl/remove_duplicate_vertices.cpp similarity index 100% rename from src/igl/remove_duplicate_vertices.cpp rename to src/libigl/igl/remove_duplicate_vertices.cpp diff --git a/src/igl/remove_duplicate_vertices.h b/src/libigl/igl/remove_duplicate_vertices.h similarity index 100% rename from src/igl/remove_duplicate_vertices.h rename to src/libigl/igl/remove_duplicate_vertices.h diff --git a/src/igl/remove_duplicates.cpp b/src/libigl/igl/remove_duplicates.cpp similarity index 100% rename from src/igl/remove_duplicates.cpp rename to src/libigl/igl/remove_duplicates.cpp diff --git a/src/igl/remove_duplicates.h b/src/libigl/igl/remove_duplicates.h similarity index 100% rename from src/igl/remove_duplicates.h rename to src/libigl/igl/remove_duplicates.h diff --git a/src/igl/remove_unreferenced.cpp b/src/libigl/igl/remove_unreferenced.cpp similarity index 100% rename from src/igl/remove_unreferenced.cpp rename to src/libigl/igl/remove_unreferenced.cpp diff --git a/src/igl/remove_unreferenced.h b/src/libigl/igl/remove_unreferenced.h similarity index 100% rename from src/igl/remove_unreferenced.h rename to src/libigl/igl/remove_unreferenced.h diff --git a/src/igl/reorder.cpp b/src/libigl/igl/reorder.cpp similarity index 100% rename from src/igl/reorder.cpp rename to src/libigl/igl/reorder.cpp diff --git a/src/igl/reorder.h b/src/libigl/igl/reorder.h similarity index 100% rename from src/igl/reorder.h rename to src/libigl/igl/reorder.h diff --git a/src/igl/repdiag.cpp b/src/libigl/igl/repdiag.cpp similarity index 100% rename from src/igl/repdiag.cpp rename to src/libigl/igl/repdiag.cpp diff --git a/src/igl/repdiag.h b/src/libigl/igl/repdiag.h similarity index 100% rename from src/igl/repdiag.h rename to src/libigl/igl/repdiag.h diff --git a/src/igl/repmat.cpp b/src/libigl/igl/repmat.cpp similarity index 100% rename from src/igl/repmat.cpp rename to src/libigl/igl/repmat.cpp diff --git a/src/igl/repmat.h b/src/libigl/igl/repmat.h similarity index 100% rename from src/igl/repmat.h rename to src/libigl/igl/repmat.h diff --git a/src/igl/resolve_duplicated_faces.cpp b/src/libigl/igl/resolve_duplicated_faces.cpp similarity index 100% rename from src/igl/resolve_duplicated_faces.cpp rename to src/libigl/igl/resolve_duplicated_faces.cpp diff --git a/src/igl/resolve_duplicated_faces.h b/src/libigl/igl/resolve_duplicated_faces.h similarity index 100% rename from src/igl/resolve_duplicated_faces.h rename to src/libigl/igl/resolve_duplicated_faces.h diff --git a/src/igl/rgb_to_hsv.cpp b/src/libigl/igl/rgb_to_hsv.cpp similarity index 100% rename from src/igl/rgb_to_hsv.cpp rename to src/libigl/igl/rgb_to_hsv.cpp diff --git a/src/igl/rgb_to_hsv.h b/src/libigl/igl/rgb_to_hsv.h similarity index 100% rename from src/igl/rgb_to_hsv.h rename to src/libigl/igl/rgb_to_hsv.h diff --git a/src/igl/rotate_by_quat.cpp b/src/libigl/igl/rotate_by_quat.cpp similarity index 100% rename from src/igl/rotate_by_quat.cpp rename to src/libigl/igl/rotate_by_quat.cpp diff --git a/src/igl/rotate_by_quat.h b/src/libigl/igl/rotate_by_quat.h similarity index 100% rename from src/igl/rotate_by_quat.h rename to src/libigl/igl/rotate_by_quat.h diff --git a/src/igl/rotate_vectors.cpp b/src/libigl/igl/rotate_vectors.cpp similarity index 100% rename from src/igl/rotate_vectors.cpp rename to src/libigl/igl/rotate_vectors.cpp diff --git a/src/igl/rotate_vectors.h b/src/libigl/igl/rotate_vectors.h similarity index 100% rename from src/igl/rotate_vectors.h rename to src/libigl/igl/rotate_vectors.h diff --git a/src/igl/rotation_matrix_from_directions.cpp b/src/libigl/igl/rotation_matrix_from_directions.cpp similarity index 100% rename from src/igl/rotation_matrix_from_directions.cpp rename to src/libigl/igl/rotation_matrix_from_directions.cpp diff --git a/src/igl/rotation_matrix_from_directions.h b/src/libigl/igl/rotation_matrix_from_directions.h similarity index 100% rename from src/igl/rotation_matrix_from_directions.h rename to src/libigl/igl/rotation_matrix_from_directions.h diff --git a/src/igl/round.cpp b/src/libigl/igl/round.cpp similarity index 100% rename from src/igl/round.cpp rename to src/libigl/igl/round.cpp diff --git a/src/igl/round.h b/src/libigl/igl/round.h similarity index 100% rename from src/igl/round.h rename to src/libigl/igl/round.h diff --git a/src/igl/rows_to_matrix.cpp b/src/libigl/igl/rows_to_matrix.cpp similarity index 100% rename from src/igl/rows_to_matrix.cpp rename to src/libigl/igl/rows_to_matrix.cpp diff --git a/src/igl/rows_to_matrix.h b/src/libigl/igl/rows_to_matrix.h similarity index 100% rename from src/igl/rows_to_matrix.h rename to src/libigl/igl/rows_to_matrix.h diff --git a/src/igl/sample_edges.cpp b/src/libigl/igl/sample_edges.cpp similarity index 100% rename from src/igl/sample_edges.cpp rename to src/libigl/igl/sample_edges.cpp diff --git a/src/igl/sample_edges.h b/src/libigl/igl/sample_edges.h similarity index 100% rename from src/igl/sample_edges.h rename to src/libigl/igl/sample_edges.h diff --git a/src/igl/seam_edges.cpp b/src/libigl/igl/seam_edges.cpp similarity index 100% rename from src/igl/seam_edges.cpp rename to src/libigl/igl/seam_edges.cpp diff --git a/src/igl/seam_edges.h b/src/libigl/igl/seam_edges.h similarity index 100% rename from src/igl/seam_edges.h rename to src/libigl/igl/seam_edges.h diff --git a/src/igl/segment_segment_intersect.cpp b/src/libigl/igl/segment_segment_intersect.cpp similarity index 100% rename from src/igl/segment_segment_intersect.cpp rename to src/libigl/igl/segment_segment_intersect.cpp diff --git a/src/igl/segment_segment_intersect.h b/src/libigl/igl/segment_segment_intersect.h similarity index 100% rename from src/igl/segment_segment_intersect.h rename to src/libigl/igl/segment_segment_intersect.h diff --git a/src/igl/serialize.h b/src/libigl/igl/serialize.h similarity index 100% rename from src/igl/serialize.h rename to src/libigl/igl/serialize.h diff --git a/src/igl/setdiff.cpp b/src/libigl/igl/setdiff.cpp similarity index 100% rename from src/igl/setdiff.cpp rename to src/libigl/igl/setdiff.cpp diff --git a/src/igl/setdiff.h b/src/libigl/igl/setdiff.h similarity index 100% rename from src/igl/setdiff.h rename to src/libigl/igl/setdiff.h diff --git a/src/igl/setunion.cpp b/src/libigl/igl/setunion.cpp similarity index 100% rename from src/igl/setunion.cpp rename to src/libigl/igl/setunion.cpp diff --git a/src/igl/setunion.h b/src/libigl/igl/setunion.h similarity index 100% rename from src/igl/setunion.h rename to src/libigl/igl/setunion.h diff --git a/src/igl/setxor.cpp b/src/libigl/igl/setxor.cpp similarity index 100% rename from src/igl/setxor.cpp rename to src/libigl/igl/setxor.cpp diff --git a/src/igl/setxor.h b/src/libigl/igl/setxor.h similarity index 100% rename from src/igl/setxor.h rename to src/libigl/igl/setxor.h diff --git a/src/igl/shape_diameter_function.cpp b/src/libigl/igl/shape_diameter_function.cpp similarity index 100% rename from src/igl/shape_diameter_function.cpp rename to src/libigl/igl/shape_diameter_function.cpp diff --git a/src/igl/shape_diameter_function.h b/src/libigl/igl/shape_diameter_function.h similarity index 100% rename from src/igl/shape_diameter_function.h rename to src/libigl/igl/shape_diameter_function.h diff --git a/src/igl/shapeup.cpp b/src/libigl/igl/shapeup.cpp similarity index 100% rename from src/igl/shapeup.cpp rename to src/libigl/igl/shapeup.cpp diff --git a/src/igl/shapeup.h b/src/libigl/igl/shapeup.h similarity index 100% rename from src/igl/shapeup.h rename to src/libigl/igl/shapeup.h diff --git a/src/igl/shortest_edge_and_midpoint.cpp b/src/libigl/igl/shortest_edge_and_midpoint.cpp similarity index 100% rename from src/igl/shortest_edge_and_midpoint.cpp rename to src/libigl/igl/shortest_edge_and_midpoint.cpp diff --git a/src/igl/shortest_edge_and_midpoint.h b/src/libigl/igl/shortest_edge_and_midpoint.h similarity index 100% rename from src/igl/shortest_edge_and_midpoint.h rename to src/libigl/igl/shortest_edge_and_midpoint.h diff --git a/src/igl/signed_angle.cpp b/src/libigl/igl/signed_angle.cpp similarity index 100% rename from src/igl/signed_angle.cpp rename to src/libigl/igl/signed_angle.cpp diff --git a/src/igl/signed_angle.h b/src/libigl/igl/signed_angle.h similarity index 100% rename from src/igl/signed_angle.h rename to src/libigl/igl/signed_angle.h diff --git a/src/igl/signed_distance.cpp b/src/libigl/igl/signed_distance.cpp similarity index 100% rename from src/igl/signed_distance.cpp rename to src/libigl/igl/signed_distance.cpp diff --git a/src/igl/signed_distance.h b/src/libigl/igl/signed_distance.h similarity index 100% rename from src/igl/signed_distance.h rename to src/libigl/igl/signed_distance.h diff --git a/src/igl/simplify_polyhedron.cpp b/src/libigl/igl/simplify_polyhedron.cpp similarity index 100% rename from src/igl/simplify_polyhedron.cpp rename to src/libigl/igl/simplify_polyhedron.cpp diff --git a/src/igl/simplify_polyhedron.h b/src/libigl/igl/simplify_polyhedron.h similarity index 100% rename from src/igl/simplify_polyhedron.h rename to src/libigl/igl/simplify_polyhedron.h diff --git a/src/igl/slice.cpp b/src/libigl/igl/slice.cpp similarity index 100% rename from src/igl/slice.cpp rename to src/libigl/igl/slice.cpp diff --git a/src/igl/slice.h b/src/libigl/igl/slice.h similarity index 100% rename from src/igl/slice.h rename to src/libigl/igl/slice.h diff --git a/src/igl/slice_cached.cpp b/src/libigl/igl/slice_cached.cpp similarity index 100% rename from src/igl/slice_cached.cpp rename to src/libigl/igl/slice_cached.cpp diff --git a/src/igl/slice_cached.h b/src/libigl/igl/slice_cached.h similarity index 100% rename from src/igl/slice_cached.h rename to src/libigl/igl/slice_cached.h diff --git a/src/igl/slice_into.cpp b/src/libigl/igl/slice_into.cpp similarity index 100% rename from src/igl/slice_into.cpp rename to src/libigl/igl/slice_into.cpp diff --git a/src/igl/slice_into.h b/src/libigl/igl/slice_into.h similarity index 100% rename from src/igl/slice_into.h rename to src/libigl/igl/slice_into.h diff --git a/src/igl/slice_mask.cpp b/src/libigl/igl/slice_mask.cpp similarity index 100% rename from src/igl/slice_mask.cpp rename to src/libigl/igl/slice_mask.cpp diff --git a/src/igl/slice_mask.h b/src/libigl/igl/slice_mask.h similarity index 100% rename from src/igl/slice_mask.h rename to src/libigl/igl/slice_mask.h diff --git a/src/igl/slice_tets.cpp b/src/libigl/igl/slice_tets.cpp similarity index 100% rename from src/igl/slice_tets.cpp rename to src/libigl/igl/slice_tets.cpp diff --git a/src/igl/slice_tets.h b/src/libigl/igl/slice_tets.h similarity index 100% rename from src/igl/slice_tets.h rename to src/libigl/igl/slice_tets.h diff --git a/src/igl/slim.cpp b/src/libigl/igl/slim.cpp similarity index 100% rename from src/igl/slim.cpp rename to src/libigl/igl/slim.cpp diff --git a/src/igl/slim.h b/src/libigl/igl/slim.h similarity index 100% rename from src/igl/slim.h rename to src/libigl/igl/slim.h diff --git a/src/igl/snap_points.cpp b/src/libigl/igl/snap_points.cpp similarity index 100% rename from src/igl/snap_points.cpp rename to src/libigl/igl/snap_points.cpp diff --git a/src/igl/snap_points.h b/src/libigl/igl/snap_points.h similarity index 100% rename from src/igl/snap_points.h rename to src/libigl/igl/snap_points.h diff --git a/src/igl/snap_to_canonical_view_quat.cpp b/src/libigl/igl/snap_to_canonical_view_quat.cpp similarity index 100% rename from src/igl/snap_to_canonical_view_quat.cpp rename to src/libigl/igl/snap_to_canonical_view_quat.cpp diff --git a/src/igl/snap_to_canonical_view_quat.h b/src/libigl/igl/snap_to_canonical_view_quat.h similarity index 100% rename from src/igl/snap_to_canonical_view_quat.h rename to src/libigl/igl/snap_to_canonical_view_quat.h diff --git a/src/igl/snap_to_fixed_up.cpp b/src/libigl/igl/snap_to_fixed_up.cpp similarity index 100% rename from src/igl/snap_to_fixed_up.cpp rename to src/libigl/igl/snap_to_fixed_up.cpp diff --git a/src/igl/snap_to_fixed_up.h b/src/libigl/igl/snap_to_fixed_up.h similarity index 100% rename from src/igl/snap_to_fixed_up.h rename to src/libigl/igl/snap_to_fixed_up.h diff --git a/src/igl/solid_angle.cpp b/src/libigl/igl/solid_angle.cpp similarity index 100% rename from src/igl/solid_angle.cpp rename to src/libigl/igl/solid_angle.cpp diff --git a/src/igl/solid_angle.h b/src/libigl/igl/solid_angle.h similarity index 100% rename from src/igl/solid_angle.h rename to src/libigl/igl/solid_angle.h diff --git a/src/igl/sort.cpp b/src/libigl/igl/sort.cpp similarity index 100% rename from src/igl/sort.cpp rename to src/libigl/igl/sort.cpp diff --git a/src/igl/sort.h b/src/libigl/igl/sort.h similarity index 100% rename from src/igl/sort.h rename to src/libigl/igl/sort.h diff --git a/src/igl/sort_angles.cpp b/src/libigl/igl/sort_angles.cpp similarity index 100% rename from src/igl/sort_angles.cpp rename to src/libigl/igl/sort_angles.cpp diff --git a/src/igl/sort_angles.h b/src/libigl/igl/sort_angles.h similarity index 100% rename from src/igl/sort_angles.h rename to src/libigl/igl/sort_angles.h diff --git a/src/igl/sort_triangles.cpp b/src/libigl/igl/sort_triangles.cpp similarity index 100% rename from src/igl/sort_triangles.cpp rename to src/libigl/igl/sort_triangles.cpp diff --git a/src/igl/sort_triangles.h b/src/libigl/igl/sort_triangles.h similarity index 100% rename from src/igl/sort_triangles.h rename to src/libigl/igl/sort_triangles.h diff --git a/src/igl/sort_vectors_ccw.cpp b/src/libigl/igl/sort_vectors_ccw.cpp similarity index 100% rename from src/igl/sort_vectors_ccw.cpp rename to src/libigl/igl/sort_vectors_ccw.cpp diff --git a/src/igl/sort_vectors_ccw.h b/src/libigl/igl/sort_vectors_ccw.h similarity index 100% rename from src/igl/sort_vectors_ccw.h rename to src/libigl/igl/sort_vectors_ccw.h diff --git a/src/igl/sortrows.cpp b/src/libigl/igl/sortrows.cpp similarity index 100% rename from src/igl/sortrows.cpp rename to src/libigl/igl/sortrows.cpp diff --git a/src/igl/sortrows.h b/src/libigl/igl/sortrows.h similarity index 100% rename from src/igl/sortrows.h rename to src/libigl/igl/sortrows.h diff --git a/src/igl/sparse.cpp b/src/libigl/igl/sparse.cpp similarity index 100% rename from src/igl/sparse.cpp rename to src/libigl/igl/sparse.cpp diff --git a/src/igl/sparse.h b/src/libigl/igl/sparse.h similarity index 100% rename from src/igl/sparse.h rename to src/libigl/igl/sparse.h diff --git a/src/igl/sparse_cached.cpp b/src/libigl/igl/sparse_cached.cpp similarity index 100% rename from src/igl/sparse_cached.cpp rename to src/libigl/igl/sparse_cached.cpp diff --git a/src/igl/sparse_cached.h b/src/libigl/igl/sparse_cached.h similarity index 100% rename from src/igl/sparse_cached.h rename to src/libigl/igl/sparse_cached.h diff --git a/src/igl/speye.cpp b/src/libigl/igl/speye.cpp similarity index 100% rename from src/igl/speye.cpp rename to src/libigl/igl/speye.cpp diff --git a/src/igl/speye.h b/src/libigl/igl/speye.h similarity index 100% rename from src/igl/speye.h rename to src/libigl/igl/speye.h diff --git a/src/igl/squared_edge_lengths.cpp b/src/libigl/igl/squared_edge_lengths.cpp similarity index 100% rename from src/igl/squared_edge_lengths.cpp rename to src/libigl/igl/squared_edge_lengths.cpp diff --git a/src/igl/squared_edge_lengths.h b/src/libigl/igl/squared_edge_lengths.h similarity index 100% rename from src/igl/squared_edge_lengths.h rename to src/libigl/igl/squared_edge_lengths.h diff --git a/src/igl/stdin_to_temp.cpp b/src/libigl/igl/stdin_to_temp.cpp similarity index 100% rename from src/igl/stdin_to_temp.cpp rename to src/libigl/igl/stdin_to_temp.cpp diff --git a/src/igl/stdin_to_temp.h b/src/libigl/igl/stdin_to_temp.h similarity index 100% rename from src/igl/stdin_to_temp.h rename to src/libigl/igl/stdin_to_temp.h diff --git a/src/igl/straighten_seams.cpp b/src/libigl/igl/straighten_seams.cpp similarity index 100% rename from src/igl/straighten_seams.cpp rename to src/libigl/igl/straighten_seams.cpp diff --git a/src/igl/straighten_seams.h b/src/libigl/igl/straighten_seams.h similarity index 100% rename from src/igl/straighten_seams.h rename to src/libigl/igl/straighten_seams.h diff --git a/src/igl/sum.cpp b/src/libigl/igl/sum.cpp similarity index 100% rename from src/igl/sum.cpp rename to src/libigl/igl/sum.cpp diff --git a/src/igl/sum.h b/src/libigl/igl/sum.h similarity index 100% rename from src/igl/sum.h rename to src/libigl/igl/sum.h diff --git a/src/igl/svd3x3.cpp b/src/libigl/igl/svd3x3.cpp similarity index 100% rename from src/igl/svd3x3.cpp rename to src/libigl/igl/svd3x3.cpp diff --git a/src/igl/svd3x3.h b/src/libigl/igl/svd3x3.h similarity index 100% rename from src/igl/svd3x3.h rename to src/libigl/igl/svd3x3.h diff --git a/src/igl/svd3x3_avx.cpp b/src/libigl/igl/svd3x3_avx.cpp similarity index 100% rename from src/igl/svd3x3_avx.cpp rename to src/libigl/igl/svd3x3_avx.cpp diff --git a/src/igl/svd3x3_avx.h b/src/libigl/igl/svd3x3_avx.h similarity index 100% rename from src/igl/svd3x3_avx.h rename to src/libigl/igl/svd3x3_avx.h diff --git a/src/igl/svd3x3_sse.cpp b/src/libigl/igl/svd3x3_sse.cpp similarity index 100% rename from src/igl/svd3x3_sse.cpp rename to src/libigl/igl/svd3x3_sse.cpp diff --git a/src/igl/svd3x3_sse.h b/src/libigl/igl/svd3x3_sse.h similarity index 100% rename from src/igl/svd3x3_sse.h rename to src/libigl/igl/svd3x3_sse.h diff --git a/src/igl/swept_volume_bounding_box.cpp b/src/libigl/igl/swept_volume_bounding_box.cpp similarity index 100% rename from src/igl/swept_volume_bounding_box.cpp rename to src/libigl/igl/swept_volume_bounding_box.cpp diff --git a/src/igl/swept_volume_bounding_box.h b/src/libigl/igl/swept_volume_bounding_box.h similarity index 100% rename from src/igl/swept_volume_bounding_box.h rename to src/libigl/igl/swept_volume_bounding_box.h diff --git a/src/igl/swept_volume_signed_distance.cpp b/src/libigl/igl/swept_volume_signed_distance.cpp similarity index 100% rename from src/igl/swept_volume_signed_distance.cpp rename to src/libigl/igl/swept_volume_signed_distance.cpp diff --git a/src/igl/swept_volume_signed_distance.h b/src/libigl/igl/swept_volume_signed_distance.h similarity index 100% rename from src/igl/swept_volume_signed_distance.h rename to src/libigl/igl/swept_volume_signed_distance.h diff --git a/src/igl/trackball.cpp b/src/libigl/igl/trackball.cpp similarity index 100% rename from src/igl/trackball.cpp rename to src/libigl/igl/trackball.cpp diff --git a/src/igl/trackball.h b/src/libigl/igl/trackball.h similarity index 100% rename from src/igl/trackball.h rename to src/libigl/igl/trackball.h diff --git a/src/igl/transpose_blocks.cpp b/src/libigl/igl/transpose_blocks.cpp similarity index 100% rename from src/igl/transpose_blocks.cpp rename to src/libigl/igl/transpose_blocks.cpp diff --git a/src/igl/transpose_blocks.h b/src/libigl/igl/transpose_blocks.h similarity index 100% rename from src/igl/transpose_blocks.h rename to src/libigl/igl/transpose_blocks.h diff --git a/src/igl/triangle/cdt.cpp b/src/libigl/igl/triangle/cdt.cpp similarity index 100% rename from src/igl/triangle/cdt.cpp rename to src/libigl/igl/triangle/cdt.cpp diff --git a/src/igl/triangle/cdt.h b/src/libigl/igl/triangle/cdt.h similarity index 100% rename from src/igl/triangle/cdt.h rename to src/libigl/igl/triangle/cdt.h diff --git a/src/igl/triangle/triangulate.cpp b/src/libigl/igl/triangle/triangulate.cpp similarity index 100% rename from src/igl/triangle/triangulate.cpp rename to src/libigl/igl/triangle/triangulate.cpp diff --git a/src/igl/triangle/triangulate.h b/src/libigl/igl/triangle/triangulate.h similarity index 100% rename from src/igl/triangle/triangulate.h rename to src/libigl/igl/triangle/triangulate.h diff --git a/src/igl/triangle_fan.cpp b/src/libigl/igl/triangle_fan.cpp similarity index 100% rename from src/igl/triangle_fan.cpp rename to src/libigl/igl/triangle_fan.cpp diff --git a/src/igl/triangle_fan.h b/src/libigl/igl/triangle_fan.h similarity index 100% rename from src/igl/triangle_fan.h rename to src/libigl/igl/triangle_fan.h diff --git a/src/igl/triangle_triangle_adjacency.cpp b/src/libigl/igl/triangle_triangle_adjacency.cpp similarity index 100% rename from src/igl/triangle_triangle_adjacency.cpp rename to src/libigl/igl/triangle_triangle_adjacency.cpp diff --git a/src/igl/triangle_triangle_adjacency.h b/src/libigl/igl/triangle_triangle_adjacency.h similarity index 100% rename from src/igl/triangle_triangle_adjacency.h rename to src/libigl/igl/triangle_triangle_adjacency.h diff --git a/src/igl/triangles_from_strip.cpp b/src/libigl/igl/triangles_from_strip.cpp similarity index 100% rename from src/igl/triangles_from_strip.cpp rename to src/libigl/igl/triangles_from_strip.cpp diff --git a/src/igl/triangles_from_strip.h b/src/libigl/igl/triangles_from_strip.h similarity index 100% rename from src/igl/triangles_from_strip.h rename to src/libigl/igl/triangles_from_strip.h diff --git a/src/igl/two_axis_valuator_fixed_up.cpp b/src/libigl/igl/two_axis_valuator_fixed_up.cpp similarity index 100% rename from src/igl/two_axis_valuator_fixed_up.cpp rename to src/libigl/igl/two_axis_valuator_fixed_up.cpp diff --git a/src/igl/two_axis_valuator_fixed_up.h b/src/libigl/igl/two_axis_valuator_fixed_up.h similarity index 100% rename from src/igl/two_axis_valuator_fixed_up.h rename to src/libigl/igl/two_axis_valuator_fixed_up.h diff --git a/src/igl/uniformly_sample_two_manifold.cpp b/src/libigl/igl/uniformly_sample_two_manifold.cpp similarity index 100% rename from src/igl/uniformly_sample_two_manifold.cpp rename to src/libigl/igl/uniformly_sample_two_manifold.cpp diff --git a/src/igl/uniformly_sample_two_manifold.h b/src/libigl/igl/uniformly_sample_two_manifold.h similarity index 100% rename from src/igl/uniformly_sample_two_manifold.h rename to src/libigl/igl/uniformly_sample_two_manifold.h diff --git a/src/igl/unique.cpp b/src/libigl/igl/unique.cpp similarity index 100% rename from src/igl/unique.cpp rename to src/libigl/igl/unique.cpp diff --git a/src/igl/unique.h b/src/libigl/igl/unique.h similarity index 100% rename from src/igl/unique.h rename to src/libigl/igl/unique.h diff --git a/src/igl/unique_edge_map.cpp b/src/libigl/igl/unique_edge_map.cpp similarity index 100% rename from src/igl/unique_edge_map.cpp rename to src/libigl/igl/unique_edge_map.cpp diff --git a/src/igl/unique_edge_map.h b/src/libigl/igl/unique_edge_map.h similarity index 100% rename from src/igl/unique_edge_map.h rename to src/libigl/igl/unique_edge_map.h diff --git a/src/igl/unique_rows.cpp b/src/libigl/igl/unique_rows.cpp similarity index 100% rename from src/igl/unique_rows.cpp rename to src/libigl/igl/unique_rows.cpp diff --git a/src/igl/unique_rows.h b/src/libigl/igl/unique_rows.h similarity index 100% rename from src/igl/unique_rows.h rename to src/libigl/igl/unique_rows.h diff --git a/src/igl/unique_simplices.cpp b/src/libigl/igl/unique_simplices.cpp similarity index 100% rename from src/igl/unique_simplices.cpp rename to src/libigl/igl/unique_simplices.cpp diff --git a/src/igl/unique_simplices.h b/src/libigl/igl/unique_simplices.h similarity index 100% rename from src/igl/unique_simplices.h rename to src/libigl/igl/unique_simplices.h diff --git a/src/igl/unproject.cpp b/src/libigl/igl/unproject.cpp similarity index 100% rename from src/igl/unproject.cpp rename to src/libigl/igl/unproject.cpp diff --git a/src/igl/unproject.h b/src/libigl/igl/unproject.h similarity index 100% rename from src/igl/unproject.h rename to src/libigl/igl/unproject.h diff --git a/src/igl/unproject_in_mesh.cpp b/src/libigl/igl/unproject_in_mesh.cpp similarity index 100% rename from src/igl/unproject_in_mesh.cpp rename to src/libigl/igl/unproject_in_mesh.cpp diff --git a/src/igl/unproject_in_mesh.h b/src/libigl/igl/unproject_in_mesh.h similarity index 100% rename from src/igl/unproject_in_mesh.h rename to src/libigl/igl/unproject_in_mesh.h diff --git a/src/igl/unproject_onto_mesh.cpp b/src/libigl/igl/unproject_onto_mesh.cpp similarity index 100% rename from src/igl/unproject_onto_mesh.cpp rename to src/libigl/igl/unproject_onto_mesh.cpp diff --git a/src/igl/unproject_onto_mesh.h b/src/libigl/igl/unproject_onto_mesh.h similarity index 100% rename from src/igl/unproject_onto_mesh.h rename to src/libigl/igl/unproject_onto_mesh.h diff --git a/src/igl/unproject_ray.cpp b/src/libigl/igl/unproject_ray.cpp similarity index 100% rename from src/igl/unproject_ray.cpp rename to src/libigl/igl/unproject_ray.cpp diff --git a/src/igl/unproject_ray.h b/src/libigl/igl/unproject_ray.h similarity index 100% rename from src/igl/unproject_ray.h rename to src/libigl/igl/unproject_ray.h diff --git a/src/igl/unzip_corners.cpp b/src/libigl/igl/unzip_corners.cpp similarity index 100% rename from src/igl/unzip_corners.cpp rename to src/libigl/igl/unzip_corners.cpp diff --git a/src/igl/unzip_corners.h b/src/libigl/igl/unzip_corners.h similarity index 100% rename from src/igl/unzip_corners.h rename to src/libigl/igl/unzip_corners.h diff --git a/src/igl/upsample.cpp b/src/libigl/igl/upsample.cpp similarity index 100% rename from src/igl/upsample.cpp rename to src/libigl/igl/upsample.cpp diff --git a/src/igl/upsample.h b/src/libigl/igl/upsample.h similarity index 100% rename from src/igl/upsample.h rename to src/libigl/igl/upsample.h diff --git a/src/igl/vector_area_matrix.cpp b/src/libigl/igl/vector_area_matrix.cpp similarity index 100% rename from src/igl/vector_area_matrix.cpp rename to src/libigl/igl/vector_area_matrix.cpp diff --git a/src/igl/vector_area_matrix.h b/src/libigl/igl/vector_area_matrix.h similarity index 100% rename from src/igl/vector_area_matrix.h rename to src/libigl/igl/vector_area_matrix.h diff --git a/src/igl/verbose.h b/src/libigl/igl/verbose.h similarity index 100% rename from src/igl/verbose.h rename to src/libigl/igl/verbose.h diff --git a/src/igl/vertex_triangle_adjacency.cpp b/src/libigl/igl/vertex_triangle_adjacency.cpp similarity index 100% rename from src/igl/vertex_triangle_adjacency.cpp rename to src/libigl/igl/vertex_triangle_adjacency.cpp diff --git a/src/igl/vertex_triangle_adjacency.h b/src/libigl/igl/vertex_triangle_adjacency.h similarity index 100% rename from src/igl/vertex_triangle_adjacency.h rename to src/libigl/igl/vertex_triangle_adjacency.h diff --git a/src/igl/volume.cpp b/src/libigl/igl/volume.cpp similarity index 100% rename from src/igl/volume.cpp rename to src/libigl/igl/volume.cpp diff --git a/src/igl/volume.h b/src/libigl/igl/volume.h similarity index 100% rename from src/igl/volume.h rename to src/libigl/igl/volume.h diff --git a/src/igl/voxel_grid.cpp b/src/libigl/igl/voxel_grid.cpp similarity index 100% rename from src/igl/voxel_grid.cpp rename to src/libigl/igl/voxel_grid.cpp diff --git a/src/igl/voxel_grid.h b/src/libigl/igl/voxel_grid.h similarity index 100% rename from src/igl/voxel_grid.h rename to src/libigl/igl/voxel_grid.h diff --git a/src/igl/winding_number.cpp b/src/libigl/igl/winding_number.cpp similarity index 100% rename from src/igl/winding_number.cpp rename to src/libigl/igl/winding_number.cpp diff --git a/src/igl/winding_number.h b/src/libigl/igl/winding_number.h similarity index 100% rename from src/igl/winding_number.h rename to src/libigl/igl/winding_number.h diff --git a/src/igl/writeBF.cpp b/src/libigl/igl/writeBF.cpp similarity index 100% rename from src/igl/writeBF.cpp rename to src/libigl/igl/writeBF.cpp diff --git a/src/igl/writeBF.h b/src/libigl/igl/writeBF.h similarity index 100% rename from src/igl/writeBF.h rename to src/libigl/igl/writeBF.h diff --git a/src/igl/writeDMAT.cpp b/src/libigl/igl/writeDMAT.cpp similarity index 100% rename from src/igl/writeDMAT.cpp rename to src/libigl/igl/writeDMAT.cpp diff --git a/src/igl/writeDMAT.h b/src/libigl/igl/writeDMAT.h similarity index 100% rename from src/igl/writeDMAT.h rename to src/libigl/igl/writeDMAT.h diff --git a/src/igl/writeMESH.cpp b/src/libigl/igl/writeMESH.cpp similarity index 100% rename from src/igl/writeMESH.cpp rename to src/libigl/igl/writeMESH.cpp diff --git a/src/igl/writeMESH.h b/src/libigl/igl/writeMESH.h similarity index 100% rename from src/igl/writeMESH.h rename to src/libigl/igl/writeMESH.h diff --git a/src/igl/writeOBJ.cpp b/src/libigl/igl/writeOBJ.cpp similarity index 100% rename from src/igl/writeOBJ.cpp rename to src/libigl/igl/writeOBJ.cpp diff --git a/src/igl/writeOBJ.h b/src/libigl/igl/writeOBJ.h similarity index 100% rename from src/igl/writeOBJ.h rename to src/libigl/igl/writeOBJ.h diff --git a/src/igl/writeOFF.cpp b/src/libigl/igl/writeOFF.cpp similarity index 100% rename from src/igl/writeOFF.cpp rename to src/libigl/igl/writeOFF.cpp diff --git a/src/igl/writeOFF.h b/src/libigl/igl/writeOFF.h similarity index 100% rename from src/igl/writeOFF.h rename to src/libigl/igl/writeOFF.h diff --git a/src/igl/writePLY.cpp b/src/libigl/igl/writePLY.cpp similarity index 100% rename from src/igl/writePLY.cpp rename to src/libigl/igl/writePLY.cpp diff --git a/src/igl/writePLY.h b/src/libigl/igl/writePLY.h similarity index 100% rename from src/igl/writePLY.h rename to src/libigl/igl/writePLY.h diff --git a/src/igl/writeSTL.cpp b/src/libigl/igl/writeSTL.cpp similarity index 100% rename from src/igl/writeSTL.cpp rename to src/libigl/igl/writeSTL.cpp diff --git a/src/igl/writeSTL.h b/src/libigl/igl/writeSTL.h similarity index 100% rename from src/igl/writeSTL.h rename to src/libigl/igl/writeSTL.h diff --git a/src/igl/writeTGF.cpp b/src/libigl/igl/writeTGF.cpp similarity index 100% rename from src/igl/writeTGF.cpp rename to src/libigl/igl/writeTGF.cpp diff --git a/src/igl/writeTGF.h b/src/libigl/igl/writeTGF.h similarity index 100% rename from src/igl/writeTGF.h rename to src/libigl/igl/writeTGF.h diff --git a/src/igl/writeWRL.cpp b/src/libigl/igl/writeWRL.cpp similarity index 100% rename from src/igl/writeWRL.cpp rename to src/libigl/igl/writeWRL.cpp diff --git a/src/igl/writeWRL.h b/src/libigl/igl/writeWRL.h similarity index 100% rename from src/igl/writeWRL.h rename to src/libigl/igl/writeWRL.h diff --git a/src/igl/write_triangle_mesh.cpp b/src/libigl/igl/write_triangle_mesh.cpp similarity index 100% rename from src/igl/write_triangle_mesh.cpp rename to src/libigl/igl/write_triangle_mesh.cpp diff --git a/src/igl/write_triangle_mesh.h b/src/libigl/igl/write_triangle_mesh.h similarity index 100% rename from src/igl/write_triangle_mesh.h rename to src/libigl/igl/write_triangle_mesh.h diff --git a/src/igl/xml/ReAntTweakBarXMLSerialization.h b/src/libigl/igl/xml/ReAntTweakBarXMLSerialization.h similarity index 100% rename from src/igl/xml/ReAntTweakBarXMLSerialization.h rename to src/libigl/igl/xml/ReAntTweakBarXMLSerialization.h diff --git a/src/igl/xml/XMLSerializable.h b/src/libigl/igl/xml/XMLSerializable.h similarity index 100% rename from src/igl/xml/XMLSerializable.h rename to src/libigl/igl/xml/XMLSerializable.h diff --git a/src/igl/xml/serialization_test.skip b/src/libigl/igl/xml/serialization_test.skip similarity index 100% rename from src/igl/xml/serialization_test.skip rename to src/libigl/igl/xml/serialization_test.skip diff --git a/src/igl/xml/serialize_xml.cpp b/src/libigl/igl/xml/serialize_xml.cpp similarity index 100% rename from src/igl/xml/serialize_xml.cpp rename to src/libigl/igl/xml/serialize_xml.cpp diff --git a/src/igl/xml/serialize_xml.h b/src/libigl/igl/xml/serialize_xml.h similarity index 100% rename from src/igl/xml/serialize_xml.h rename to src/libigl/igl/xml/serialize_xml.h diff --git a/src/igl/xml/writeDAE.cpp b/src/libigl/igl/xml/writeDAE.cpp similarity index 100% rename from src/igl/xml/writeDAE.cpp rename to src/libigl/igl/xml/writeDAE.cpp diff --git a/src/igl/xml/writeDAE.h b/src/libigl/igl/xml/writeDAE.h similarity index 100% rename from src/igl/xml/writeDAE.h rename to src/libigl/igl/xml/writeDAE.h diff --git a/src/igl/xml/write_triangle_mesh.cpp b/src/libigl/igl/xml/write_triangle_mesh.cpp similarity index 100% rename from src/igl/xml/write_triangle_mesh.cpp rename to src/libigl/igl/xml/write_triangle_mesh.cpp diff --git a/src/igl/xml/write_triangle_mesh.h b/src/libigl/igl/xml/write_triangle_mesh.h similarity index 100% rename from src/igl/xml/write_triangle_mesh.h rename to src/libigl/igl/xml/write_triangle_mesh.h diff --git a/src/libnest2d/CMakeLists.txt b/src/libnest2d/CMakeLists.txt index 2508c984a7..587b814b24 100644 --- a/src/libnest2d/CMakeLists.txt +++ b/src/libnest2d/CMakeLists.txt @@ -48,6 +48,9 @@ set(LIBNEST2D_SRCFILES ${SRC_DIR}/libnest2d/optimizer.hpp ${SRC_DIR}/libnest2d/utils/metaloop.hpp ${SRC_DIR}/libnest2d/utils/rotfinder.hpp + ${SRC_DIR}/libnest2d/utils/rotcalipers.hpp + ${SRC_DIR}/libnest2d/utils/bigint.hpp + ${SRC_DIR}/libnest2d/utils/rational.hpp ${SRC_DIR}/libnest2d/placers/placer_boilerplate.hpp ${SRC_DIR}/libnest2d/placers/bottomleftplacer.hpp ${SRC_DIR}/libnest2d/placers/nfpplacer.hpp @@ -70,12 +73,13 @@ if(TBB_FOUND) # The Intel TBB library will use the std::exception_ptr feature of C++11. target_compile_definitions(libnest2d INTERFACE -DTBB_USE_CAPTURED_EXCEPTION=0) - target_link_libraries(libnest2d INTERFACE tbb) - # The following breaks compilation on Visual Studio in Debug mode. - #find_package(Threads REQUIRED) - #target_link_libraries(libnest2d INTERFACE ${TBB_LIBRARIES} ${CMAKE_DL_LIBS} - # Threads::Threads - # ) + find_package(Threads REQUIRED) + target_link_libraries(libnest2d INTERFACE + tbb # VS debug mode needs linking this way: + # ${TBB_LIBRARIES} + ${CMAKE_DL_LIBS} + Threads::Threads + ) else() find_package(OpenMP QUIET) @@ -92,10 +96,11 @@ endif() add_subdirectory(${SRC_DIR}/libnest2d/backends/${LIBNEST2D_GEOMETRIES}) target_link_libraries(libnest2d INTERFACE ${LIBNEST2D_GEOMETRIES}Backend) + add_subdirectory(${SRC_DIR}/libnest2d/optimizers/${LIBNEST2D_OPTIMIZER}) target_link_libraries(libnest2d INTERFACE ${LIBNEST2D_OPTIMIZER}Optimizer) -#target_sources(libnest2d INTERFACE ${LIBNEST2D_SRCFILES}) +# target_sources(libnest2d INTERFACE ${LIBNEST2D_SRCFILES}) target_include_directories(libnest2d INTERFACE ${SRC_DIR}) if(NOT LIBNEST2D_HEADER_ONLY) diff --git a/src/libnest2d/include/libnest2d.h b/src/libnest2d/include/libnest2d.h index 4ad7524219..a6eb36a4b0 100644 --- a/src/libnest2d/include/libnest2d.h +++ b/src/libnest2d/include/libnest2d.h @@ -47,6 +47,17 @@ using NfpPlacer = _NfpPlacer; // This supports only box shaped bins using BottomLeftPlacer = placers::_BottomLeftPlacer; +#ifdef LIBNEST2D_STATIC + +extern template class Nester; +extern template class Nester; +extern template PackGroup Nester::execute( + std::vector::iterator, std::vector::iterator); +extern template PackGroup Nester::execute( + std::vector::iterator, std::vector::iterator); + +#endif + template::iterator> @@ -60,19 +71,6 @@ PackGroup nest(Iterator from, Iterator to, return nester.execute(from, to); } -template> -PackGroup nest(Container&& cont, - const typename Placer::BinType& bin, - Coord dist = 0, - const typename Placer::Config& pconf = {}, - const typename Selector::Config& sconf = {}) -{ - return nest(cont.begin(), cont.end(), - bin, dist, pconf, sconf); -} - template::iterator> @@ -90,6 +88,42 @@ PackGroup nest(Iterator from, Iterator to, return nester.execute(from, to); } +#ifdef LIBNEST2D_STATIC + +extern template class Nester; +extern template class Nester; + +extern template PackGroup nest(std::vector::iterator from, + std::vector::iterator to, + const Box& bin, + Coord dist = 0, + const NfpPlacer::Config& pconf, + const FirstFitSelection::Config& sconf); + +extern template PackGroup nest(std::vector::iterator from, + std::vector::iterator to, + const Box& bin, + ProgressFunction prg, + StopCondition scond, + Coord dist = 0, + const NfpPlacer::Config& pconf, + const FirstFitSelection::Config& sconf); + +#endif + +template> +PackGroup nest(Container&& cont, + const typename Placer::BinType& bin, + Coord dist = 0, + const typename Placer::Config& pconf = {}, + const typename Selector::Config& sconf = {}) +{ + return nest(cont.begin(), cont.end(), + bin, dist, pconf, sconf); +} + template> @@ -105,71 +139,6 @@ PackGroup nest(Container&& cont, bin, prg, scond, dist, pconf, sconf); } -#ifdef LIBNEST2D_STATIC -extern template -PackGroup nest&>( - std::vector& cont, - const Box& bin, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest&>( - std::vector& cont, - const Box& bin, - ProgressFunction prg, - StopCondition scond, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest>( - std::vector&& cont, - const Box& bin, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest>( - std::vector&& cont, - const Box& bin, - ProgressFunction prg, - StopCondition scond, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest::iterator>( - std::vector::iterator from, - std::vector::iterator to, - const Box& bin, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest::iterator>( - std::vector::iterator from, - std::vector::iterator to, - const Box& bin, - ProgressFunction prg, - StopCondition scond, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -#endif - } #endif // LIBNEST2D_H diff --git a/src/libnest2d/include/libnest2d/backends/clipper/CMakeLists.txt b/src/libnest2d/include/libnest2d/backends/clipper/CMakeLists.txt index cf8a373504..2020893567 100644 --- a/src/libnest2d/include/libnest2d/backends/clipper/CMakeLists.txt +++ b/src/libnest2d/include/libnest2d/backends/clipper/CMakeLists.txt @@ -33,19 +33,18 @@ if(NOT TARGET clipper) # If there is a clipper target in the parent project we a # ${clipper_library_BINARY_DIR} # ) - add_library(ClipperBackend STATIC + add_library(clipperBackend STATIC ${clipper_library_SOURCE_DIR}/clipper.cpp ${clipper_library_SOURCE_DIR}/clipper.hpp) - target_include_directories(ClipperBackend INTERFACE - ${clipper_library_SOURCE_DIR}) + target_include_directories(clipperBackend INTERFACE ${clipper_library_SOURCE_DIR}) else() message(FATAL_ERROR "Can't find clipper library and no SVN client found to download. You can download the clipper sources and define a clipper target in your project, that will work for libnest2d.") endif() else() - add_library(ClipperBackend INTERFACE) - target_link_libraries(ClipperBackend INTERFACE Clipper::Clipper) + add_library(clipperBackend INTERFACE) + target_link_libraries(clipperBackend INTERFACE Clipper::Clipper) endif() else() # set(CLIPPER_INCLUDE_DIRS "" PARENT_SCOPE) @@ -69,6 +68,6 @@ target_link_libraries(clipperBackend INTERFACE Boost::boost ) target_compile_definitions(clipperBackend INTERFACE LIBNEST2D_BACKEND_CLIPPER) -# And finally plug the ClipperBackend into libnest2d -#target_link_libraries(libnest2d INTERFACE ClipperBackend) +# And finally plug the clipperBackend into libnest2d +# target_link_libraries(libnest2d INTERFACE clipperBackend) diff --git a/src/libnest2d/include/libnest2d/backends/clipper/clipper_polygon.hpp b/src/libnest2d/include/libnest2d/backends/clipper/clipper_polygon.hpp index e9fbfbd18a..6511fbb72a 100644 --- a/src/libnest2d/include/libnest2d/backends/clipper/clipper_polygon.hpp +++ b/src/libnest2d/include/libnest2d/backends/clipper/clipper_polygon.hpp @@ -12,13 +12,13 @@ struct Polygon { inline Polygon() = default; inline explicit Polygon(const Path& cont): Contour(cont) {} - inline explicit Polygon(const Paths& holes): - Holes(holes) {} +// inline explicit Polygon(const Paths& holes): +// Holes(holes) {} inline Polygon(const Path& cont, const Paths& holes): Contour(cont), Holes(holes) {} inline explicit Polygon(Path&& cont): Contour(std::move(cont)) {} - inline explicit Polygon(Paths&& holes): Holes(std::move(holes)) {} +// inline explicit Polygon(Paths&& holes): Holes(std::move(holes)) {} inline Polygon(Path&& cont, Paths&& holes): Contour(std::move(cont)), Holes(std::move(holes)) {} }; @@ -42,7 +42,7 @@ inline IntPoint& operator -=(IntPoint& p, const IntPoint& pa ) { return p; } -inline IntPoint operator -(IntPoint& p ) { +inline IntPoint operator -(const IntPoint& p ) { IntPoint ret = p; ret.X = -ret.X; ret.Y = -ret.Y; diff --git a/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp b/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp index 232668f610..e9fad405b6 100644 --- a/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp +++ b/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp @@ -20,43 +20,23 @@ using PathImpl = ClipperLib::Path; using HoleStore = ClipperLib::Paths; using PolygonImpl = ClipperLib::Polygon; -// Type of coordinate units used by Clipper -template<> struct CoordType { - using Type = ClipperLib::cInt; -}; - -// Type of point used by Clipper -template<> struct PointType { - using Type = PointImpl; -}; - -template<> struct PointType { - using Type = PointImpl; -}; - -template<> struct PointType { - using Type = PointImpl; -}; - -template<> struct CountourType { - using Type = PathImpl; -}; - template<> struct ShapeTag { using Type = PolygonTag; }; -template<> struct ShapeTag { using Type = PathTag; }; -template<> struct ShapeTag { using Type = PointTag; }; +template<> struct ShapeTag { using Type = PathTag; }; +template<> struct ShapeTag { using Type = PointTag; }; -template<> struct ShapeTag> { - using Type = MultiPolygonTag; -}; +// Type of coordinate units used by Clipper. Enough to specialize for point, +// the rest of the types will work (Path, Polygon) +template<> struct CoordType { using Type = ClipperLib::cInt; }; -template<> struct PointType> { - using Type = PointImpl; -}; +// Enough to specialize for path, it will work for multishape and Polygon +template<> struct PointType { using Type = PointImpl; }; -template<> struct HolesContainer { - using Type = ClipperLib::Paths; -}; +// This is crucial. CountourType refers to itself by default, so we don't have +// to secialize for clipper Path. ContourType::Type is PathImpl. +template<> struct ContourType { using Type = PathImpl; }; + +// The holes are contained in Clipper::Paths +template<> struct HolesContainer { using Type = ClipperLib::Paths; }; namespace pointlike { @@ -86,39 +66,11 @@ template<> inline TCoord& y(PointImpl& p) } +// Using the libnest2d default area implementation #define DISABLE_BOOST_AREA -namespace _smartarea { - -template -inline double area(const PolygonImpl& /*sh*/) { - return std::nan(""); -} - -template<> -inline double area(const PolygonImpl& sh) { - return std::accumulate(sh.Holes.begin(), sh.Holes.end(), - ClipperLib::Area(sh.Contour), - [](double a, const ClipperLib::Path& pt){ - return a + ClipperLib::Area(pt); - }); -} - -template<> -inline double area(const PolygonImpl& sh) { - return -area(sh); -} - -} - namespace shapelike { -// Tell libnest2d how to make string out of a ClipperPolygon object -template<> inline double area(const PolygonImpl& sh, const PolygonTag&) -{ - return _smartarea::area::Value>(sh); -} - template<> inline void offset(PolygonImpl& sh, TCoord distance) { #define DISABLE_BOOST_OFFSET @@ -200,43 +152,16 @@ inline PolygonImpl create(const PathImpl& path, const HoleStore& holes) { PolygonImpl p; p.Contour = path; - - // Expecting that the coordinate system Y axis is positive in upwards - // direction - if(ClipperLib::Orientation(p.Contour)) { - // Not clockwise then reverse the b*tch - ClipperLib::ReversePath(p.Contour); - } - p.Holes = holes; - for(auto& h : p.Holes) { - if(!ClipperLib::Orientation(h)) { - ClipperLib::ReversePath(h); - } - } - + return p; } template<> inline PolygonImpl create( PathImpl&& path, HoleStore&& holes) { PolygonImpl p; p.Contour.swap(path); - - // Expecting that the coordinate system Y axis is positive in upwards - // direction - if(ClipperLib::Orientation(p.Contour)) { - // Not clockwise then reverse the b*tch - ClipperLib::ReversePath(p.Contour); - } - p.Holes.swap(holes); - - for(auto& h : p.Holes) { - if(!ClipperLib::Orientation(h)) { - ClipperLib::ReversePath(h); - } - } - + return p; } @@ -314,13 +239,13 @@ inline void rotate(PolygonImpl& sh, const Radians& rads) } // namespace shapelike #define DISABLE_BOOST_NFP_MERGE -inline std::vector clipper_execute( +inline TMultiShape clipper_execute( ClipperLib::Clipper& clipper, ClipperLib::ClipType clipType, ClipperLib::PolyFillType subjFillType = ClipperLib::pftEvenOdd, ClipperLib::PolyFillType clipFillType = ClipperLib::pftEvenOdd) { - shapelike::Shapes retv; + TMultiShape retv; ClipperLib::PolyTree result; clipper.Execute(clipType, result, subjFillType, clipFillType); @@ -370,8 +295,8 @@ inline std::vector clipper_execute( namespace nfp { -template<> inline std::vector -merge(const std::vector& shapes) +template<> inline TMultiShape +merge(const TMultiShape& shapes) { ClipperLib::Clipper clipper(ClipperLib::ioReverseSolution); @@ -394,6 +319,8 @@ merge(const std::vector& shapes) } +#define DISABLE_BOOST_CONVEX_HULL + //#define DISABLE_BOOST_SERIALIZE //#define DISABLE_BOOST_UNSERIALIZE diff --git a/src/libnest2d/include/libnest2d/common.hpp b/src/libnest2d/include/libnest2d/common.hpp index 6867f76f3e..66e095ae27 100644 --- a/src/libnest2d/include/libnest2d/common.hpp +++ b/src/libnest2d/include/libnest2d/common.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #if defined(_MSC_VER) && _MSC_VER <= 1800 || __cplusplus < 201103L #define BP2D_NOEXCEPT @@ -197,6 +198,33 @@ public: } }; +struct ScalarTag {}; +struct BigIntTag {}; +struct RationalTag {}; + +template struct _NumTag { + using Type = + enable_if_t::value, ScalarTag>; +}; + +template using NumTag = typename _NumTag>::Type; + +/// A local version for abs that is garanteed to work with libnest2d types +template inline T abs(const T& v, ScalarTag) +{ + return std::abs(v); +} + +template inline T abs(const T& v) { return abs(v, NumTag()); } + +template inline T2 cast(const T1& v, ScalarTag, ScalarTag) +{ + return static_cast(v); +} + +template inline T2 cast(const T1& v) { + return cast(v, NumTag(), NumTag()); +} } #endif // LIBNEST2D_CONFIG_HPP diff --git a/src/libnest2d/include/libnest2d/geometry_traits.hpp b/src/libnest2d/include/libnest2d/geometry_traits.hpp index 917f5280d1..6c55d0e3f2 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp @@ -7,45 +7,125 @@ #include #include #include -#include #include #include +#include -#include "common.hpp" +#include namespace libnest2d { +// Meta tags for different geometry concepts. +struct PointTag {}; +struct PolygonTag {}; +struct PathTag {}; +struct MultiPolygonTag {}; +struct BoxTag {}; +struct CircleTag {}; + +/// Meta-function to derive the tag of a shape type. +template struct ShapeTag { using Type = typename Shape::Tag; }; + +/// Tag will be used instead of `typename ShapeTag::Type` +template using Tag = typename ShapeTag>::Type; + +/// Meta function to derive the contour type for a polygon which could be itself +template struct ContourType { using Type = RawShape; }; + +/// TContour instead of `typename ContourType::type` +template +using TContour = typename ContourType>::Type; + +/// Getting the type of point structure used by a shape. +template struct PointType { + using Type = typename PointType>::Type; +}; + +/// TPoint as shorthand for `typename PointType::Type`. +template +using TPoint = typename PointType>::Type; + /// Getting the coordinate data type for a geometry class. -template struct CoordType { using Type = long; }; +template struct CoordType { + using Type = typename CoordType>::Type; +}; /// TCoord as shorthand for typename `CoordType::Type`. template using TCoord = typename CoordType>::Type; -/// Getting the type of point structure used by a shape. -template struct PointType { using Type = typename Sh::PointType; }; +/// Getting the computation type for a certain geometry type. +/// It is the coordinate type by default but it is advised that a type with +/// larger precision and (or) range is specified. +template::value> struct ComputeType {}; -/// TPoint as shorthand for `typename PointType::Type`. -template -using TPoint = typename PointType>::Type; +/// A compute type is introduced to hold the results of computations on +/// coordinates and points. It should be larger in range than the coordinate +/// type or the range of coordinates should be limited to not loose precision. +template struct ComputeType { + using Type = typename ComputeType>::Type; +}; +/// libnest2d will choose a default compute type for various coordinate types +/// if the backend has not specified anything. +template struct DoublePrecision { using Type = T; }; +template<> struct DoublePrecision { using Type = int16_t; }; +template<> struct DoublePrecision { using Type = int32_t; }; +template<> struct DoublePrecision { using Type = int64_t; }; +template<> struct DoublePrecision { using Type = double; }; +template<> struct DoublePrecision { using Type = long double; }; +template struct ComputeType { + using Type = typename DoublePrecision::Type; +}; -template struct CountourType { using Type = RawShape; }; - -template -using TContour = typename CountourType>::Type; - +/// TCompute shorthand for `typename ComputeType::Type` +template using TCompute = typename ComputeType>::Type; +/// A meta function to derive a container type for holes in a polygon template struct HolesContainer { using Type = std::vector>; }; +/// Shorthand for `typename HolesContainer::Type` template using THolesContainer = typename HolesContainer>::Type; +/* + * TContour, TPoint, TCoord and TCompute should be usable for any type for which + * it makes sense. For example, the point type could be derived from the contour, + * the polygon and (or) the multishape as well. The coordinate type also and + * including the point type. TCoord, TCoord, TCoord are + * all valid types and derives the coordinate type of template argument Polygon, + * Path and Point. This is also true for TCompute, but it can also take the + * coordinate type as argument. + */ -template -struct LastPointIsFirst { static const bool Value = true; }; +/* + * A Multi shape concept is also introduced. A multi shape is something that + * can contain the result of an operation where the input is one polygon and + * the result could be many polygons or path -> paths. The MultiShape should be + * a container type. If the backend does not specialize the MultiShape template, + * a default multi shape container will be used. + */ + +/// The default multi shape container. +template struct DefaultMultiShape: public std::vector { + using Tag = MultiPolygonTag; + template DefaultMultiShape(Args&&...args): + std::vector(std::forward(args)...) {} +}; + +/// The MultiShape Type trait which gets the container type for a geometry type. +template struct MultiShape { using Type = DefaultMultiShape; }; + +/// use TMultiShape instead of `typename MultiShape::Type` +template +using TMultiShape = typename MultiShape>::Type; + +// A specialization of ContourType to work with the default multishape type +template struct ContourType> { + using Type = typename ContourType::Type; +}; enum class Orientation { CLOCKWISE, @@ -59,6 +139,11 @@ struct OrientationType { static const Orientation Value = Orientation::CLOCKWISE; }; +template inline /*constexpr*/ bool is_clockwise() { + return OrientationType>::Value == Orientation::CLOCKWISE; +} + + /** * \brief A point pair base class for other point pairs (segment, box, ...). * \tparam RawPoint The actual point type to use. @@ -69,21 +154,6 @@ struct PointPair { RawPoint p2; }; -struct PointTag {}; -struct PolygonTag {}; -struct PathTag {}; -struct MultiPolygonTag {}; -struct BoxTag {}; -struct CircleTag {}; - -/// Meta-functions to derive the tags -template struct ShapeTag { using Type = typename Shape::Tag; }; -template using Tag = typename ShapeTag>::Type; - -template struct MultiShape { using Type = std::vector; }; -template -using TMultiShape =typename MultiShape>::Type; - /** * \brief An abstraction of a box; */ @@ -114,11 +184,16 @@ public: inline RawPoint center() const BP2D_NOEXCEPT; - inline double area() const BP2D_NOEXCEPT { - return double(width()*height()); + template> + inline Unit area() const BP2D_NOEXCEPT { + return Unit(width())*height(); } }; +template struct PointType<_Box> { + using Type = typename _Box::PointType; +}; + template class _Circle { RawPoint center_; @@ -129,7 +204,6 @@ public: using PointType = RawPoint; _Circle() = default; - _Circle(const RawPoint& center, double r): center_(center), radius_(r) {} inline const RawPoint& center() const BP2D_NOEXCEPT { return center_; } @@ -137,12 +211,16 @@ public: inline double radius() const BP2D_NOEXCEPT { return radius_; } inline void radius(double r) { radius_ = r; } - + inline double area() const BP2D_NOEXCEPT { - return 2.0*Pi*radius_*radius_; + return Pi_2 * radius_ * radius_; } }; +template struct PointType<_Circle> { + using Type = typename _Circle::PointType; +}; + /** * \brief An abstraction of a directed line segment with two points. */ @@ -185,7 +263,12 @@ public: inline Radians angleToXaxis() const; /// The length of the segment in the measure of the coordinate system. - inline double length(); + template> inline Unit sqlength() const; + +}; + +template struct PointType<_Segment> { + using Type = typename _Circle::PointType; }; // This struct serves almost as a namespace. The only difference is that is can @@ -216,33 +299,56 @@ inline TCoord& y(RawPoint& p) return p.y(); } -template -inline double distance(const RawPoint& /*p1*/, const RawPoint& /*p2*/) +template> +inline Unit squaredDistance(const RawPoint& p1, const RawPoint& p2) { - static_assert(always_false::value, - "PointLike::distance(point, point) unimplemented!"); - return 0; + auto x1 = Unit(x(p1)), y1 = Unit(y(p1)), x2 = Unit(x(p2)), y2 = Unit(y(p2)); + Unit a = (x2 - x1), b = (y2 - y1); + return a * a + b * b; } template -inline double distance(const RawPoint& /*p1*/, - const _Segment& /*s*/) +inline double distance(const RawPoint& p1, const RawPoint& p2) { - static_assert(always_false::value, - "PointLike::distance(point, segment) unimplemented!"); - return 0; + return std::sqrt(squaredDistance(p1, p2)); } -template -inline std::pair, bool> horizontalDistance( +// create perpendicular vector +template inline Pt perp(const Pt& p) +{ + return Pt(y(p), -x(p)); +} + +template> +inline Unit dotperp(const Pt& a, const Pt& b) +{ + return Unit(x(a)) * Unit(y(b)) - Unit(y(a)) * Unit(x(b)); +} + +// dot product +template> +inline Unit dot(const Pt& a, const Pt& b) +{ + return Unit(x(a)) * x(b) + Unit(y(a)) * y(b); +} + +// squared vector magnitude +template> +inline Unit magnsq(const Pt& p) +{ + return Unit(x(p)) * x(p) + Unit(y(p)) * y(p); +} + +template> +inline std::pair horizontalDistance( const RawPoint& p, const _Segment& s) { - using Unit = TCoord; - auto x = pointlike::x(p), y = pointlike::y(p); - auto x1 = pointlike::x(s.first()), y1 = pointlike::y(s.first()); - auto x2 = pointlike::x(s.second()), y2 = pointlike::y(s.second()); + namespace pl = pointlike; + auto x = Unit(pl::x(p)), y = Unit(pl::y(p)); + auto x1 = Unit(pl::x(s.first())), y1 = Unit(pl::y(s.first())); + auto x2 = Unit(pl::x(s.second())), y2 = Unit(pl::y(s.second())); - TCoord ret; + Unit ret; if( (y < y1 && y < y2) || (y > y1 && y > y2) ) return {0, false}; @@ -250,8 +356,7 @@ inline std::pair, bool> horizontalDistance( ret = std::min( x-x1, x -x2); else if( (y == y1 && y == y2) && (x < x1 && x < x2)) ret = -std::min(x1 - x, x2 - x); - else if(std::abs(y - y1) <= std::numeric_limits::epsilon() && - std::abs(y - y2) <= std::numeric_limits::epsilon()) + else if(y == y1 && y == y2) ret = 0; else ret = x - x1 + (x1 - x2)*(y1 - y)/(y1 - y2); @@ -259,16 +364,16 @@ inline std::pair, bool> horizontalDistance( return {ret, true}; } -template -inline std::pair, bool> verticalDistance( +template> +inline std::pair verticalDistance( const RawPoint& p, const _Segment& s) { - using Unit = TCoord; - auto x = pointlike::x(p), y = pointlike::y(p); - auto x1 = pointlike::x(s.first()), y1 = pointlike::y(s.first()); - auto x2 = pointlike::x(s.second()), y2 = pointlike::y(s.second()); + namespace pl = pointlike; + auto x = Unit(pl::x(p)), y = Unit(pl::y(p)); + auto x1 = Unit(pl::x(s.first())), y1 = Unit(pl::y(s.first())); + auto x2 = Unit(pl::x(s.second())), y2 = Unit(pl::y(s.second())); - TCoord ret; + Unit ret; if( (x < x1 && x < x2) || (x > x1 && x > x2) ) return {0, false}; @@ -276,8 +381,7 @@ inline std::pair, bool> verticalDistance( ret = std::min( y-y1, y -y2); else if( (x == x1 && x == x2) && (y < y1 && y < y2)) ret = -std::min(y1 - y, y2 - y); - else if(std::abs(x - x1) <= std::numeric_limits::epsilon() && - std::abs(x - x2) <= std::numeric_limits::epsilon()) + else if(x == x1 && x == x2) ret = 0; else ret = y - y1 + (y1 - y2)*(x1 - x)/(x1 - x2); @@ -333,9 +437,10 @@ inline Radians _Segment::angleToXaxis() const } template -inline double _Segment::length() +template +inline Unit _Segment::sqlength() const { - return pointlike::distance(first(), second()); + return pointlike::squaredDistance(first(), second()); } template @@ -346,8 +451,8 @@ inline RawPoint _Box::center() const BP2D_NOEXCEPT { using Coord = TCoord; RawPoint ret = { // No rounding here, we dont know if these are int coords - static_cast( (getX(minc) + getX(maxc))/2.0 ), - static_cast( (getY(minc) + getY(maxc))/2.0 ) + Coord( (getX(minc) + getX(maxc)) / Coord(2) ), + Coord( (getY(minc) + getY(maxc)) / Coord(2) ) }; return ret; @@ -362,9 +467,6 @@ enum class Formats { // used in friend declarations and can be aliased at class scope. namespace shapelike { -template -using Shapes = TMultiShape; - template inline RawShape create(const TContour& contour, const THolesContainer& holes) @@ -449,7 +551,7 @@ inline void reserve(RawPath& p, size_t vertex_capacity, const PathTag&) template inline void addVertex(RawShape& sh, const PathTag&, Args...args) { - return sh.emplace_back(std::forward(args)...); + sh.emplace_back(std::forward(args)...); } template @@ -504,13 +606,8 @@ inline void unserialize(RawShape& /*sh*/, const std::string& /*str*/) "shapelike::unserialize() unimplemented!"); } -template -inline double area(const RawShape& /*sh*/, const PolygonTag&) -{ - static_assert(always_false::value, - "shapelike::area() unimplemented!"); - return 0; -} +template +inline Unit area(const Cntr& poly, const PathTag& ); template inline bool intersects(const RawShape& /*sh*/, const RawShape& /*sh*/) @@ -556,14 +653,14 @@ inline bool touches( const TPoint& /*point*/, template inline _Box> boundingBox(const RawShape& /*sh*/, - const PolygonTag&) + const PathTag&) { static_assert(always_false::value, "shapelike::boundingBox(shape) unimplemented!"); } template -inline _Box> +inline _Box> boundingBox(const RawShapes& /*sh*/, const MultiPolygonTag&) { static_assert(always_false::value, @@ -571,21 +668,10 @@ boundingBox(const RawShapes& /*sh*/, const MultiPolygonTag&) } template -inline RawShape convexHull(const RawShape& /*sh*/, const PolygonTag&) -{ - static_assert(always_false::value, - "shapelike::convexHull(shape) unimplemented!"); - return RawShape(); -} +inline RawShape convexHull(const RawShape& sh, const PathTag&); -template -inline typename RawShapes::value_type -convexHull(const RawShapes& /*sh*/, const MultiPolygonTag&) -{ - static_assert(always_false::value, - "shapelike::convexHull(shapes) unimplemented!"); - return typename RawShapes::value_type(); -} +template +inline S convexHull(const RawShapes& sh, const MultiPolygonTag&); template inline void rotate(RawShape& /*sh*/, const Radians& /*rads*/) @@ -745,13 +831,19 @@ inline void reserve(T& sh, size_t vertex_capacity) { template inline void addVertex(RawShape& sh, const PolygonTag&, Args...args) { - return addVertex(contour(sh), PathTag(), std::forward(args)...); + addVertex(contour(sh), PathTag(), std::forward(args)...); } template // Tag dispatcher inline void addVertex(RawShape& sh, Args...args) { - return addVertex(sh, Tag(), std::forward(args)...); + addVertex(sh, Tag(), std::forward(args)...); +} + +template +inline _Box> boundingBox(const RawShape& poly, const PolygonTag&) +{ + return boundingBox(contour(poly), PathTag()); } template @@ -786,7 +878,7 @@ inline _Box> boundingBox(const S& sh) template inline double area(const Box& box, const BoxTag& ) { - return box.area(); + return box.template area(); } template @@ -795,6 +887,35 @@ inline double area(const Circle& circ, const CircleTag& ) return circ.area(); } +template +inline Unit area(const Cntr& poly, const PathTag& ) +{ + namespace sl = shapelike; + if (sl::cend(poly) - sl::cbegin(poly) < 3) return 0.0; + + Unit a = 0; + for (auto i = sl::cbegin(poly), j = std::prev(sl::cend(poly)); + i < sl::cend(poly); ++i) + { + auto xj = Unit(getX(*j)), yj = Unit(getY(*j)); + auto xi = Unit(getX(*i)), yi = Unit(getY(*i)); + a += (xj + xi) * (yj - yi); + j = i; + } + a /= 2; + return is_clockwise() ? a : -a; +} + +template inline double area(const S& poly, const PolygonTag& ) +{ + auto hls = holes(poly); + return std::accumulate(hls.begin(), hls.end(), + area(contour(poly), PathTag()), + [](double a, const TContour &h){ + return a + area(h, PathTag()); + }); +} + template // Dispatching function inline double area(const RawShape& sh) { @@ -811,6 +932,12 @@ inline double area(const RawShapes& shapes, const MultiPolygonTag&) }); } +template +inline RawShape convexHull(const RawShape& sh, const PolygonTag&) +{ + return create(convexHull(contour(sh), PathTag())); +} + template inline auto convexHull(const RawShape& sh) -> decltype(convexHull(sh, Tag())) // TODO: C++14 could deduce @@ -818,11 +945,91 @@ inline auto convexHull(const RawShape& sh) return convexHull(sh, Tag()); } +template +inline RawShape convexHull(const RawShape& sh, const PathTag&) +{ + using Unit = TCompute; + using Point = TPoint; + namespace sl = shapelike; + + size_t edges = sl::cend(sh) - sl::cbegin(sh); + if(edges <= 3) return {}; + + bool closed = false; + std::vector U, L; + U.reserve(1 + edges / 2); L.reserve(1 + edges / 2); + + std::vector pts; pts.reserve(edges); + std::copy(sl::cbegin(sh), sl::cend(sh), std::back_inserter(pts)); + + auto fpt = pts.front(), lpt = pts.back(); + if(getX(fpt) == getX(lpt) && getY(fpt) == getY(lpt)) { + closed = true; pts.pop_back(); + } + + std::sort(pts.begin(), pts.end(), + [](const Point& v1, const Point& v2) + { + Unit x1 = getX(v1), x2 = getX(v2), y1 = getY(v1), y2 = getY(v2); + return x1 == x2 ? y1 < y2 : x1 < x2; + }); + + auto dir = [](const Point& p, const Point& q, const Point& r) { + return (Unit(getY(q)) - getY(p)) * (Unit(getX(r)) - getX(p)) - + (Unit(getX(q)) - getX(p)) * (Unit(getY(r)) - getY(p)); + }; + + auto ik = pts.begin(); + + while(ik != pts.end()) { + + while(U.size() > 1 && dir(U[U.size() - 2], U.back(), *ik) <= 0) + U.pop_back(); + while(L.size() > 1 && dir(L[L.size() - 2], L.back(), *ik) >= 0) + L.pop_back(); + + U.emplace_back(*ik); + L.emplace_back(*ik); + + ++ik; + } + + RawShape ret; reserve(ret, U.size() + L.size()); + if(is_clockwise()) { + for(auto it = U.begin(); it != std::prev(U.end()); ++it) + addVertex(ret, *it); + for(auto it = L.rbegin(); it != std::prev(L.rend()); ++it) + addVertex(ret, *it); + if(closed) addVertex(ret, *std::prev(L.rend())); + } else { + for(auto it = L.begin(); it != std::prev(L.end()); ++it) + addVertex(ret, *it); + for(auto it = U.rbegin(); it != std::prev(U.rend()); ++it) + addVertex(ret, *it); + if(closed) addVertex(ret, *std::prev(U.rend())); + } + + return ret; +} + +template +inline S convexHull(const RawShapes& sh, const MultiPolygonTag&) +{ + namespace sl = shapelike; + S cntr; + for(auto& poly : sh) + for(auto it = sl::cbegin(poly); it != sl::cend(poly); ++it) + addVertex(cntr, *it); + + return convexHull(cntr, Tag()); +} + template inline bool isInside(const TP& point, const TC& circ, const PointTag&, const CircleTag&) { - return pointlike::distance(point, circ.center()) < circ.radius(); + auto r = circ.radius(); + return pointlike::squaredDistance(point, circ.center()) < r * r; } template @@ -972,6 +1179,9 @@ template inline bool isConvex(const RawShape& sh) // dispatch using Segment = _Segment; \ using Polygons = TMultiShape +namespace sl = shapelike; +namespace pl = pointlike; + } #endif // GEOMETRY_TRAITS_HPP diff --git a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp index cb0580ef4f..4a2c69bca2 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp @@ -1,26 +1,22 @@ #ifndef GEOMETRIES_NOFITPOLYGON_HPP #define GEOMETRIES_NOFITPOLYGON_HPP -#include "geometry_traits.hpp" #include #include #include #include +#include + namespace libnest2d { namespace __nfp { // Do not specialize this... -template +template> inline bool _vsort(const TPoint& v1, const TPoint& v2) { - using Coord = TCoord>; - Coord &&x1 = getX(v1), &&x2 = getX(v2), &&y1 = getY(v1), &&y2 = getY(v2); - auto diff = y1 - y2; - if(std::abs(diff) <= std::numeric_limits::epsilon()) - return x1 < x2; - - return diff < 0; + Unit x1 = getX(v1), x2 = getX(v2), y1 = getY(v1), y2 = getY(v2); + return y1 == y2 ? x1 < x2 : y1 < y2; } template> @@ -202,7 +198,7 @@ inline TPoint referenceVertex(const RawShape& sh) * convex as well in this case. * */ -template +template inline NfpResult nfpConvexOnly(const RawShape& sh, const RawShape& other) { @@ -238,12 +234,62 @@ inline NfpResult nfpConvexOnly(const RawShape& sh, ++first; ++next; } } - - // Sort the edges by angle to X axis. - std::sort(edgelist.begin(), edgelist.end(), - [](const Edge& e1, const Edge& e2) + + std::sort(edgelist.begin(), edgelist.end(), + [](const Edge& e1, const Edge& e2) { - return e1.angleToXaxis() > e2.angleToXaxis(); + Vertex ax(1, 0); // Unit vector for the X axis + + // get cectors from the edges + Vertex p1 = e1.second() - e1.first(); + Vertex p2 = e2.second() - e2.first(); + + // Quadrant mapping array. The quadrant of a vector can be determined + // from the dot product of the vector and its perpendicular pair + // with the unit vector X axis. The products will carry the values + // lcos = dot(p, ax) = l * cos(phi) and + // lsin = -dotperp(p, ax) = l * sin(phi) where + // l is the length of vector p. From the signs of these values we can + // construct an index which has the sign of lcos as MSB and the + // sign of lsin as LSB. This index can be used to retrieve the actual + // quadrant where vector p resides using the following map: + // (+ is 0, - is 1) + // cos | sin | decimal | quadrant + // + | + | 0 | 0 + // + | - | 1 | 3 + // - | + | 2 | 1 + // - | - | 3 | 2 + std::array quadrants {0, 3, 1, 2 }; + + std::array q {0, 0}; // Quadrant indices for p1 and p2 + + using TDots = std::array, 2>; + TDots lcos { pl::dot(p1, ax), pl::dot(p2, ax) }; + TDots lsin { -pl::dotperp(p1, ax), -pl::dotperp(p2, ax) }; + + // Construct the quadrant indices for p1 and p2 + for(size_t i = 0; i < 2; ++i) + if(lcos[i] == 0) q[i] = lsin[i] > 0 ? 1 : 3; + else if(lsin[i] == 0) q[i] = lcos[i] > 0 ? 0 : 2; + else q[i] = quadrants[((lcos[i] < 0) << 1) + (lsin[i] < 0)]; + + if(q[0] == q[1]) { // only bother if p1 and p2 are in the same quadrant + auto lsq1 = pl::magnsq(p1); // squared magnitudes, avoid sqrt + auto lsq2 = pl::magnsq(p2); // squared magnitudes, avoid sqrt + + // We will actually compare l^2 * cos^2(phi) which saturates the + // cos function. But with the quadrant info we can get the sign back + int sign = q[0] == 1 || q[0] == 2 ? -1 : 1; + + // If Ratio is an actual rational type, there is no precision loss + auto pcos1 = Ratio(lcos[0]) / lsq1 * sign * lcos[0]; + auto pcos2 = Ratio(lcos[1]) / lsq2 * sign * lcos[1]; + + return q[0] < 2 ? pcos1 < pcos2 : pcos1 > pcos2; + } + + // If in different quadrants, compare the quadrant indices only. + return q[0] > q[1]; }); __nfp::buildPolygon(edgelist, rsh, top_nfp); @@ -253,456 +299,9 @@ inline NfpResult nfpConvexOnly(const RawShape& sh, template NfpResult nfpSimpleSimple(const RawShape& cstationary, - const RawShape& cother) + const RawShape& cother) { - - // Algorithms are from the original algorithm proposed in paper: - // https://eprints.soton.ac.uk/36850/1/CORMSIS-05-05.pdf - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 1: Obtaining the minkowski sum - // ///////////////////////////////////////////////////////////////////////// - - // I guess this is not a full minkowski sum of the two input polygons by - // definition. This yields a subset that is compatible with the next 2 - // algorithms. - - using Result = NfpResult; - using Vertex = TPoint; - using Coord = TCoord; - using Edge = _Segment; - namespace sl = shapelike; - using std::signbit; - using std::sort; - using std::vector; - using std::ref; - using std::reference_wrapper; - - // TODO The original algorithms expects the stationary polygon in - // counter clockwise and the orbiter in clockwise order. - // So for preventing any further complication, I will make the input - // the way it should be, than make my way around the orientations. - - // Reverse the stationary contour to counter clockwise - auto stcont = sl::contour(cstationary); - { - std::reverse(sl::begin(stcont), sl::end(stcont)); - stcont.pop_back(); - auto it = std::min_element(sl::begin(stcont), sl::end(stcont), - [](const Vertex& v1, const Vertex& v2) { - return getY(v1) < getY(v2); - }); - std::rotate(sl::begin(stcont), it, sl::end(stcont)); - sl::addVertex(stcont, sl::front(stcont)); - } - RawShape stationary; - sl::contour(stationary) = stcont; - - // Reverse the orbiter contour to counter clockwise - auto orbcont = sl::contour(cother); - { - std::reverse(orbcont.begin(), orbcont.end()); - - // Step 1: Make the orbiter reverse oriented - - orbcont.pop_back(); - auto it = std::min_element(orbcont.begin(), orbcont.end(), - [](const Vertex& v1, const Vertex& v2) { - return getY(v1) < getY(v2); - }); - - std::rotate(orbcont.begin(), it, orbcont.end()); - orbcont.emplace_back(orbcont.front()); - - for(auto &v : orbcont) v = -v; - - } - - // Copy the orbiter (contour only), we will have to work on it - RawShape orbiter; - sl::contour(orbiter) = orbcont; - - // An edge with additional data for marking it - struct MarkedEdge { - Edge e; Radians turn_angle = 0; bool is_turning_point = false; - MarkedEdge() = default; - MarkedEdge(const Edge& ed, Radians ta, bool tp): - e(ed), turn_angle(ta), is_turning_point(tp) {} - - // debug - std::string label; - }; - - // Container for marked edges - using EdgeList = vector; - - EdgeList A, B; - - // This is how an edge list is created from the polygons - auto fillEdgeList = [](EdgeList& L, const RawShape& ppoly, int dir) { - auto& poly = sl::contour(ppoly); - - L.reserve(sl::contourVertexCount(poly)); - - if(dir > 0) { - auto it = poly.begin(); - auto nextit = std::next(it); - - double turn_angle = 0; - bool is_turn_point = false; - - while(nextit != poly.end()) { - L.emplace_back(Edge(*it, *nextit), turn_angle, is_turn_point); - it++; nextit++; - } - } else { - auto it = sl::rbegin(poly); - auto nextit = std::next(it); - - double turn_angle = 0; - bool is_turn_point = false; - - while(nextit != sl::rend(poly)) { - L.emplace_back(Edge(*it, *nextit), turn_angle, is_turn_point); - it++; nextit++; - } - } - - auto getTurnAngle = [](const Edge& e1, const Edge& e2) { - auto phi = e1.angleToXaxis(); - auto phi_prev = e2.angleToXaxis(); - auto turn_angle = phi-phi_prev; - if(turn_angle > Pi) turn_angle -= TwoPi; - if(turn_angle < -Pi) turn_angle += TwoPi; - return turn_angle; - }; - - auto eit = L.begin(); - auto enext = std::next(eit); - - eit->turn_angle = getTurnAngle(L.front().e, L.back().e); - - while(enext != L.end()) { - enext->turn_angle = getTurnAngle( enext->e, eit->e); - eit->is_turning_point = - signbit(enext->turn_angle) != signbit(eit->turn_angle); - ++eit; ++enext; - } - - L.back().is_turning_point = signbit(L.back().turn_angle) != - signbit(L.front().turn_angle); - - }; - - // Step 2: Fill the edgelists - fillEdgeList(A, stationary, 1); - fillEdgeList(B, orbiter, 1); - - int i = 1; - for(MarkedEdge& me : A) { - std::cout << "a" << i << ":\n\t" - << getX(me.e.first()) << " " << getY(me.e.first()) << "\n\t" - << getX(me.e.second()) << " " << getY(me.e.second()) << "\n\t" - << "Turning point: " << (me.is_turning_point ? "yes" : "no") - << std::endl; - - me.label = "a"; me.label += std::to_string(i); - i++; - } - - i = 1; - for(MarkedEdge& me : B) { - std::cout << "b" << i << ":\n\t" - << getX(me.e.first()) << " " << getY(me.e.first()) << "\n\t" - << getX(me.e.second()) << " " << getY(me.e.second()) << "\n\t" - << "Turning point: " << (me.is_turning_point ? "yes" : "no") - << std::endl; - me.label = "b"; me.label += std::to_string(i); - i++; - } - - // A reference to a marked edge that also knows its container - struct MarkedEdgeRef { - reference_wrapper eref; - reference_wrapper> container; - Coord dir = 1; // Direction modifier - - inline Radians angleX() const { return eref.get().e.angleToXaxis(); } - inline const Edge& edge() const { return eref.get().e; } - inline Edge& edge() { return eref.get().e; } - inline bool isTurningPoint() const { - return eref.get().is_turning_point; - } - inline bool isFrom(const vector& cont ) { - return &(container.get()) == &cont; - } - inline bool eq(const MarkedEdgeRef& mr) { - return &(eref.get()) == &(mr.eref.get()); - } - - MarkedEdgeRef(reference_wrapper er, - reference_wrapper> ec): - eref(er), container(ec), dir(1) {} - - MarkedEdgeRef(reference_wrapper er, - reference_wrapper> ec, - Coord d): - eref(er), container(ec), dir(d) {} - }; - - using EdgeRefList = vector; - - // Comparing two marked edges - auto sortfn = [](const MarkedEdgeRef& e1, const MarkedEdgeRef& e2) { - return e1.angleX() < e2.angleX(); - }; - - EdgeRefList Aref, Bref; // We create containers for the references - Aref.reserve(A.size()); Bref.reserve(B.size()); - - // Fill reference container for the stationary polygon - std::for_each(A.begin(), A.end(), [&Aref](MarkedEdge& me) { - Aref.emplace_back( ref(me), ref(Aref) ); - }); - - // Fill reference container for the orbiting polygon - std::for_each(B.begin(), B.end(), [&Bref](MarkedEdge& me) { - Bref.emplace_back( ref(me), ref(Bref) ); - }); - - auto mink = [sortfn] // the Mink(Q, R, direction) sub-procedure - (const EdgeRefList& Q, const EdgeRefList& R, bool positive) - { - - // Step 1 "merge sort_list(Q) and sort_list(R) to form merge_list(Q,R)" - // Sort the containers of edge references and merge them. - // Q could be sorted only once and be reused here but we would still - // need to merge it with sorted(R). - - EdgeRefList merged; - EdgeRefList S, seq; - merged.reserve(Q.size() + R.size()); - - merged.insert(merged.end(), R.begin(), R.end()); - std::stable_sort(merged.begin(), merged.end(), sortfn); - merged.insert(merged.end(), Q.begin(), Q.end()); - std::stable_sort(merged.begin(), merged.end(), sortfn); - - // Step 2 "set i = 1, k = 1, direction = 1, s1 = q1" - // we don't use i, instead, q is an iterator into Q. k would be an index - // into the merged sequence but we use "it" as an iterator for that - - // here we obtain references for the containers for later comparisons - const auto& Rcont = R.begin()->container.get(); - const auto& Qcont = Q.begin()->container.get(); - - // Set the initial direction - Coord dir = 1; - - // roughly i = 1 (so q = Q.begin()) and s1 = q1 so S[0] = q; - if(positive) { - auto q = Q.begin(); - S.emplace_back(*q); - - // Roughly step 3 - - std::cout << "merged size: " << merged.size() << std::endl; - auto mit = merged.begin(); - for(bool finish = false; !finish && q != Q.end();) { - ++q; // "Set i = i + 1" - - while(!finish && mit != merged.end()) { - if(mit->isFrom(Rcont)) { - auto s = *mit; - s.dir = dir; - S.emplace_back(s); - } - - if(mit->eq(*q)) { - S.emplace_back(*q); - if(mit->isTurningPoint()) dir = -dir; - if(q == Q.begin()) finish = true; - break; - } - - mit += dir; - // __nfp::advance(mit, merged, dir > 0); - } - } - } else { - auto q = Q.rbegin(); - S.emplace_back(*q); - - // Roughly step 3 - - std::cout << "merged size: " << merged.size() << std::endl; - auto mit = merged.begin(); - for(bool finish = false; !finish && q != Q.rend();) { - ++q; // "Set i = i + 1" - - while(!finish && mit != merged.end()) { - if(mit->isFrom(Rcont)) { - auto s = *mit; - s.dir = dir; - S.emplace_back(s); - } - - if(mit->eq(*q)) { - S.emplace_back(*q); - S.back().dir = -1; - if(mit->isTurningPoint()) dir = -dir; - if(q == Q.rbegin()) finish = true; - break; - } - - mit += dir; - // __nfp::advance(mit, merged, dir > 0); - } - } - } - - - // Step 4: - - // "Let starting edge r1 be in position si in sequence" - // whaaat? I guess this means the following: - auto it = S.begin(); - while(!it->eq(*R.begin())) ++it; - - // "Set j = 1, next = 2, direction = 1, seq1 = si" - // we don't use j, seq is expanded dynamically. - dir = 1; - auto next = std::next(R.begin()); seq.emplace_back(*it); - - // Step 5: - // "If all si edges have been allocated to seqj" should mean that - // we loop until seq has equal size with S - auto send = it; //it == S.begin() ? it : std::prev(it); - while(it != S.end()) { - ++it; if(it == S.end()) it = S.begin(); - if(it == send) break; - - if(it->isFrom(Qcont)) { - seq.emplace_back(*it); // "If si is from Q, j = j + 1, seqj = si" - - // "If si is a turning point in Q, - // direction = - direction, next = next + direction" - if(it->isTurningPoint()) { - dir = -dir; - next += dir; -// __nfp::advance(next, R, dir > 0); - } - } - - if(it->eq(*next) /*&& dir == next->dir*/) { // "If si = direction.rnext" - // "j = j + 1, seqj = si, next = next + direction" - seq.emplace_back(*it); - next += dir; -// __nfp::advance(next, R, dir > 0); - } - } - - return seq; - }; - - std::vector seqlist; - seqlist.reserve(Bref.size()); - - EdgeRefList Bslope = Bref; // copy Bref, we will make a slope diagram - - // make the slope diagram of B - std::sort(Bslope.begin(), Bslope.end(), sortfn); - - auto slopeit = Bslope.begin(); // search for the first turning point - while(!slopeit->isTurningPoint() && slopeit != Bslope.end()) slopeit++; - - if(slopeit == Bslope.end()) { - // no turning point means convex polygon. - seqlist.emplace_back(mink(Aref, Bref, true)); - } else { - int dir = 1; - - auto firstturn = Bref.begin(); - while(!firstturn->eq(*slopeit)) ++firstturn; - - assert(firstturn != Bref.end()); - - EdgeRefList bgroup; bgroup.reserve(Bref.size()); - bgroup.emplace_back(*slopeit); - - auto b_it = std::next(firstturn); - while(b_it != firstturn) { - if(b_it == Bref.end()) b_it = Bref.begin(); - - while(!slopeit->eq(*b_it)) { - __nfp::advance(slopeit, Bslope, dir > 0); - } - - if(!slopeit->isTurningPoint()) { - bgroup.emplace_back(*slopeit); - } else { - if(!bgroup.empty()) { - if(dir > 0) bgroup.emplace_back(*slopeit); - for(auto& me : bgroup) { - std::cout << me.eref.get().label << ", "; - } - std::cout << std::endl; - seqlist.emplace_back(mink(Aref, bgroup, dir == 1 ? true : false)); - bgroup.clear(); - if(dir < 0) bgroup.emplace_back(*slopeit); - } else { - bgroup.emplace_back(*slopeit); - } - - dir *= -1; - } - ++b_it; - } - } - -// while(it != Bref.end()) // This is step 3 and step 4 in one loop -// if(it->isTurningPoint()) { -// R = {R.last, it++}; -// auto seq = mink(Q, R, orientation); - -// // TODO step 6 (should be 5 shouldn't it?): linking edges from A -// // I don't get this step - -// seqlist.insert(seqlist.end(), seq.begin(), seq.end()); -// orientation = !orientation; -// } else ++it; - -// if(seqlist.empty()) seqlist = mink(Q, {Bref.begin(), Bref.end()}, true); - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 2: breaking Minkowski sums into track line trips - // ///////////////////////////////////////////////////////////////////////// - - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 3: finding the boundary of the NFP from track line trips - // ///////////////////////////////////////////////////////////////////////// - - - for(auto& seq : seqlist) { - std::cout << "seqlist size: " << seq.size() << std::endl; - for(auto& s : seq) { - std::cout << (s.dir > 0 ? "" : "-") << s.eref.get().label << ", "; - } - std::cout << std::endl; - } - - auto& seq = seqlist.front(); - RawShape rsh; - Vertex top_nfp; - std::vector edgelist; edgelist.reserve(seq.size()); - for(auto& s : seq) { - edgelist.emplace_back(s.eref.get().e); - } - - __nfp::buildPolygon(edgelist, rsh, top_nfp); - - return Result(rsh, top_nfp); + return {}; } // Specializable NFP implementation class. Specialize it if you have a faster diff --git a/src/libnest2d/include/libnest2d/libnest2d.hpp b/src/libnest2d/include/libnest2d/libnest2d.hpp index c7b252e5d5..5d74aa3d9d 100644 --- a/src/libnest2d/include/libnest2d/libnest2d.hpp +++ b/src/libnest2d/include/libnest2d/libnest2d.hpp @@ -8,13 +8,10 @@ #include #include -#include "geometry_traits.hpp" +#include namespace libnest2d { -namespace sl = shapelike; -namespace pl = pointlike; - /** * \brief An item to be placed on a bin. * @@ -422,13 +419,9 @@ private: static inline bool vsort(const Vertex& v1, const Vertex& v2) { - Coord &&x1 = getX(v1), &&x2 = getX(v2); - Coord &&y1 = getY(v1), &&y2 = getY(v2); - auto diff = y1 - y2; - if(std::abs(diff) <= std::numeric_limits::epsilon()) - return x1 < x2; - - return diff < 0; + TCompute x1 = getX(v1), x2 = getX(v2); + TCompute y1 = getY(v1), y2 = getY(v2); + return y1 == y2 ? x1 < x2 : y1 < y2; } }; diff --git a/src/libnest2d/include/libnest2d/optimizer.hpp b/src/libnest2d/include/libnest2d/optimizer.hpp index 962a47392f..e4c149f228 100644 --- a/src/libnest2d/include/libnest2d/optimizer.hpp +++ b/src/libnest2d/include/libnest2d/optimizer.hpp @@ -4,7 +4,8 @@ #include #include #include -#include "common.hpp" + +#include namespace libnest2d { namespace opt { @@ -60,6 +61,7 @@ enum class Method { L_SIMPLEX, L_SUBPLEX, G_GENETIC, + G_PARTICLE_SWARM //... }; diff --git a/src/libnest2d/include/libnest2d/optimizers/nlopt/CMakeLists.txt b/src/libnest2d/include/libnest2d/optimizers/nlopt/CMakeLists.txt index 4e16d4fc58..6f51718d8b 100644 --- a/src/libnest2d/include/libnest2d/optimizers/nlopt/CMakeLists.txt +++ b/src/libnest2d/include/libnest2d/optimizers/nlopt/CMakeLists.txt @@ -48,7 +48,7 @@ else() target_link_libraries(nloptOptimizer INTERFACE Nlopt::Nlopt) endif() -#target_sources( NloptOptimizer INTERFACE +#target_sources( nloptOptimizer INTERFACE #${CMAKE_CURRENT_SOURCE_DIR}/simplex.hpp #${CMAKE_CURRENT_SOURCE_DIR}/subplex.hpp #${CMAKE_CURRENT_SOURCE_DIR}/genetic.hpp @@ -57,5 +57,5 @@ endif() target_compile_definitions(nloptOptimizer INTERFACE LIBNEST2D_OPTIMIZER_NLOPT) -# And finally plug the NloptOptimizer into libnest2d -#target_link_libraries(libnest2d INTERFACE NloptOptimizer) +# And finally plug the nloptOptimizer into libnest2d +#target_link_libraries(libnest2d INTERFACE nloptOptimizer) diff --git a/src/libnest2d/include/libnest2d/optimizers/optimlib/CMakeLists.txt b/src/libnest2d/include/libnest2d/optimizers/optimlib/CMakeLists.txt deleted file mode 100644 index efbbd9cfb2..0000000000 --- a/src/libnest2d/include/libnest2d/optimizers/optimlib/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -find_package(Armadillo REQUIRED) - -add_library(OptimlibOptimizer INTERFACE) -target_include_directories(OptimlibOptimizer INTERFACE ${ARMADILLO_INCLUDE_DIRS}) -target_link_libraries(OptimlibOptimizer INTERFACE ${ARMADILLO_LIBRARIES}) \ No newline at end of file diff --git a/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp b/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp index 7f10be7d73..28aaad5ce1 100644 --- a/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp +++ b/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp @@ -7,15 +7,15 @@ namespace libnest2d { namespace placers { -template struct Epsilon {}; +template struct DefaultEpsilon {}; template -struct Epsilon::value, T> > { +struct DefaultEpsilon::value, T> > { static const T Value = 1; }; template -struct Epsilon::value, T> > { +struct DefaultEpsilon::value, T> > { static const T Value = 1e-3; }; @@ -24,7 +24,7 @@ struct BLConfig { DECLARE_MAIN_TYPES(RawShape); Coord min_obj_distance = 0; - Coord epsilon = Epsilon::Value; + Coord epsilon = DefaultEpsilon::Value; bool allow_rotations = false; }; diff --git a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp index 91affe9786..c1f15fe61f 100644 --- a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp +++ b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp @@ -103,14 +103,14 @@ Key hash(const _Item& item) { while(deg > N) { ms++; deg -= N; } ls += int(deg); ret.push_back(char(ms)); ret.push_back(char(ls)); - circ += seg.length(); + circ += std::sqrt(seg.template sqlength()); } it = ctr.begin(); nx = std::next(it); while(nx != ctr.end()) { Segment seg(*it++, *nx++); - auto l = int(M * seg.length() / circ); + auto l = int(M * std::sqrt(seg.template sqlength()) / circ); int ms = 'A', ls = 'A'; while(l > N) { ms++; l -= N; } ls += l; @@ -249,6 +249,11 @@ template class EdgeCache { std::vector holes_; double accuracy_ = 1.0; + + static double length(const Edge &e) + { + return std::sqrt(e.template sqlength()); + } void createCache(const RawShape& sh) { { // For the contour @@ -260,7 +265,7 @@ template class EdgeCache { while(next != endit) { contour_.emap.emplace_back(*(first++), *(next++)); - contour_.full_distance += contour_.emap.back().length(); + contour_.full_distance += length(contour_.emap.back()); contour_.distances.emplace_back(contour_.full_distance); } } @@ -275,7 +280,7 @@ template class EdgeCache { while(next != endit) { hc.emap.emplace_back(*(first++), *(next++)); - hc.full_distance += hc.emap.back().length(); + hc.full_distance += length(hc.emap.back()); hc.distances.emplace_back(hc.full_distance); } diff --git a/src/libnest2d/include/libnest2d/utils/boost_alg.hpp b/src/libnest2d/include/libnest2d/utils/boost_alg.hpp index baf1c6a105..16dee513b2 100644 --- a/src/libnest2d/include/libnest2d/utils/boost_alg.hpp +++ b/src/libnest2d/include/libnest2d/utils/boost_alg.hpp @@ -311,19 +311,19 @@ struct range_value { namespace libnest2d { // Now the algorithms that boost can provide... -namespace pointlike { -template<> -inline double distance(const PointImpl& p1, const PointImpl& p2 ) -{ - return boost::geometry::distance(p1, p2); -} +//namespace pointlike { +//template<> +//inline double distance(const PointImpl& p1, const PointImpl& p2 ) +//{ +// return boost::geometry::distance(p1, p2); +//} -template<> -inline double distance(const PointImpl& p, const bp2d::Segment& seg ) -{ - return boost::geometry::distance(p, seg); -} -} +//template<> +//inline double distance(const PointImpl& p, const bp2d::Segment& seg ) +//{ +// return boost::geometry::distance(p, seg); +//} +//} namespace shapelike { // Tell libnest2d how to make string out of a ClipperPolygon object @@ -382,16 +382,9 @@ inline bool touches( const PointImpl& point, const PolygonImpl& shape) } #ifndef DISABLE_BOOST_BOUNDING_BOX -template<> -inline bp2d::Box boundingBox(const PolygonImpl& sh, const PolygonTag&) -{ - bp2d::Box b; - boost::geometry::envelope(sh, b); - return b; -} template<> -inline bp2d::Box boundingBox(const PathImpl& sh, const PolygonTag&) +inline bp2d::Box boundingBox(const PathImpl& sh, const PathTag&) { bp2d::Box b; boost::geometry::envelope(sh, b); @@ -410,9 +403,9 @@ inline bp2d::Box boundingBox(const bp2d::Shapes& shapes, #ifndef DISABLE_BOOST_CONVEX_HULL template<> -inline PolygonImpl convexHull(const PolygonImpl& sh, const PolygonTag&) +inline PathImpl convexHull(const PathImpl& sh, const PathTag&) { - PolygonImpl ret; + PathImpl ret; boost::geometry::convex_hull(sh, ret); return ret; } diff --git a/src/libnest2d/include/libnest2d/utils/rotcalipers.hpp b/src/libnest2d/include/libnest2d/utils/rotcalipers.hpp new file mode 100644 index 0000000000..76f91ba0cf --- /dev/null +++ b/src/libnest2d/include/libnest2d/utils/rotcalipers.hpp @@ -0,0 +1,268 @@ +#ifndef ROTCALIPERS_HPP +#define ROTCALIPERS_HPP + +#include +#include +#include +#include + +#include + +namespace libnest2d { + +template> class RotatedBox { + Pt axis_; + Unit bottom_ = Unit(0), right_ = Unit(0); +public: + + RotatedBox() = default; + RotatedBox(const Pt& axis, Unit b, Unit r): + axis_(axis), bottom_(b), right_(r) {} + + inline long double area() const { + long double asq = pl::magnsq(axis_); + return cast(bottom_) * cast(right_) / asq; + } + + inline long double width() const { + return abs(bottom_) / std::sqrt(pl::magnsq(axis_)); + } + + inline long double height() const { + return abs(right_) / std::sqrt(pl::magnsq(axis_)); + } + + inline Unit bottom_extent() const { return bottom_; } + inline Unit right_extent() const { return right_; } + inline const Pt& axis() const { return axis_; } + + inline Radians angleToX() const { + double ret = std::atan2(getY(axis_), getX(axis_)); + auto s = std::signbit(ret); + if(s) ret += Pi_2; + return -ret; + } +}; + +template , class Unit = TCompute> +Poly removeCollinearPoints(const Poly& sh, Unit eps = Unit(0)) +{ + Poly ret; sl::reserve(ret, sl::contourVertexCount(sh)); + + Pt eprev = *sl::cbegin(sh) - *std::prev(sl::cend(sh)); + + auto it = sl::cbegin(sh); + auto itx = std::next(it); + if(itx != sl::cend(sh)) while (it != sl::cend(sh)) + { + Pt enext = *itx - *it; + + auto dp = pl::dotperp(eprev, enext); + if(abs(dp) > eps) sl::addVertex(ret, *it); + + eprev = enext; + if (++itx == sl::cend(sh)) itx = sl::cbegin(sh); + ++it; + } + + return ret; +} + +// The area of the bounding rectangle with the axis dir and support vertices +template, class R = TCompute> +inline R rectarea(const Pt& w, // the axis + const Pt& vb, const Pt& vr, + const Pt& vt, const Pt& vl) +{ + Unit a = pl::dot(w, vr - vl); + Unit b = pl::dot(-pl::perp(w), vt - vb); + R m = R(a) / pl::magnsq(w); + m = m * b; + return m; +}; + +template, + class R = TCompute, + class It = typename std::vector::const_iterator> +inline R rectarea(const Pt& w, const std::array& rect) +{ + return rectarea(w, *rect[0], *rect[1], *rect[2], *rect[3]); +} + +// This function is only applicable to counter-clockwise oriented convex +// polygons where only two points can be collinear witch each other. +template , + class Ratio = TCompute> +RotatedBox, Unit> minAreaBoundingBox(const RawShape& sh) +{ + using Point = TPoint; + using Iterator = typename TContour::const_iterator; + using pointlike::dot; using pointlike::magnsq; using pointlike::perp; + + // Get the first and the last vertex iterator + auto first = sl::cbegin(sh); + auto last = std::prev(sl::cend(sh)); + + // Check conditions and return undefined box if input is not sane. + if(last == first) return {}; + if(getX(*first) == getX(*last) && getY(*first) == getY(*last)) --last; + if(last - first < 2) return {}; + + RawShape shcpy; // empty at this point + { + Point p = *first, q = *std::next(first), r = *last; + + // Determine orientation from first 3 vertex (should be consistent) + Unit d = (Unit(getY(q)) - getY(p)) * (Unit(getX(r)) - getX(p)) - + (Unit(getX(q)) - getX(p)) * (Unit(getY(r)) - getY(p)); + + if(d > 0) { + // The polygon is clockwise. A flip is needed (for now) + sl::reserve(shcpy, last - first); + auto it = last; while(it != first) sl::addVertex(shcpy, *it--); + sl::addVertex(shcpy, *first); + first = sl::cbegin(shcpy); last = std::prev(sl::cend(shcpy)); + } + } + + // Cyclic iterator increment + auto inc = [&first, &last](Iterator& it) { + if(it == last) it = first; else ++it; + }; + + // Cyclic previous iterator + auto prev = [&first, &last](Iterator it) { + return it == first ? last : std::prev(it); + }; + + // Cyclic next iterator + auto next = [&first, &last](Iterator it) { + return it == last ? first : std::next(it); + }; + + // Establish initial (axis aligned) rectangle support verices by determining + // polygon extremes: + + auto it = first; + Iterator minX = it, maxX = it, minY = it, maxY = it; + + do { // Linear walk through the vertices and save the extreme positions + + Point v = *it, d = v - *minX; + if(getX(d) < 0 || (getX(d) == 0 && getY(d) < 0)) minX = it; + + d = v - *maxX; + if(getX(d) > 0 || (getX(d) == 0 && getY(d) > 0)) maxX = it; + + d = v - *minY; + if(getY(d) < 0 || (getY(d) == 0 && getX(d) > 0)) minY = it; + + d = v - *maxY; + if(getY(d) > 0 || (getY(d) == 0 && getX(d) < 0)) maxY = it; + + } while(++it != std::next(last)); + + // Update the vertices defining the bounding rectangle. The rectangle with + // the smallest rotation is selected and the supporting vertices are + // returned in the 'rect' argument. + auto update = [&next, &inc] + (const Point& w, std::array& rect) + { + Iterator B = rect[0], Bn = next(B); + Iterator R = rect[1], Rn = next(R); + Iterator T = rect[2], Tn = next(T); + Iterator L = rect[3], Ln = next(L); + + Point b = *Bn - *B, r = *Rn - *R, t = *Tn - *T, l = *Ln - *L; + Point pw = perp(w); + using Pt = Point; + + Unit dotwpb = dot( w, b), dotwpr = dot(-pw, r); + Unit dotwpt = dot(-w, t), dotwpl = dot( pw, l); + Unit dw = magnsq(w); + + std::array angles; + angles[0] = (Ratio(dotwpb) / magnsq(b)) * dotwpb; + angles[1] = (Ratio(dotwpr) / magnsq(r)) * dotwpr; + angles[2] = (Ratio(dotwpt) / magnsq(t)) * dotwpt; + angles[3] = (Ratio(dotwpl) / magnsq(l)) * dotwpl; + + using AngleIndex = std::pair; + std::vector A; A.reserve(4); + + for (size_t i = 3, j = 0; j < 4; i = j++) { + if(rect[i] != rect[j] && angles[i] < dw) { + auto iv = std::make_pair(angles[i], i); + auto it = std::lower_bound(A.begin(), A.end(), iv, + [](const AngleIndex& ai, + const AngleIndex& aj) + { + return ai.first > aj.first; + }); + + A.insert(it, iv); + } + } + + // The polygon is supposed to be a rectangle. + if(A.empty()) return false; + + auto amin = A.front().first; + auto imin = A.front().second; + for(auto& a : A) if(a.first == amin) inc(rect[a.second]); + + std::rotate(rect.begin(), rect.begin() + imin, rect.end()); + + return true; + }; + + Point w(1, 0); + Point w_min = w; + Ratio minarea((Unit(getX(*maxX)) - getX(*minX)) * + (Unit(getY(*maxY)) - getY(*minY))); + + std::array rect = {minY, maxX, maxY, minX}; + std::array minrect = rect; + + // An edge might be examined twice in which case the algorithm terminates. + size_t c = 0, count = last - first + 1; + std::vector edgemask(count, false); + + while(c++ < count) + { + // Update the support vertices, if cannot be updated, break the cycle. + if(! update(w, rect)) break; + + size_t eidx = size_t(rect[0] - first); + + if(edgemask[eidx]) break; + edgemask[eidx] = true; + + // get the unnormalized direction vector + w = *rect[0] - *prev(rect[0]); + + // get the area of the rotated rectangle + Ratio rarea = rectarea(w, rect); + + // Update min area and the direction of the min bounding box; + if(rarea <= minarea) { w_min = w; minarea = rarea; minrect = rect; } + } + + Unit a = dot(w_min, *minrect[1] - *minrect[3]); + Unit b = dot(-perp(w_min), *minrect[2] - *minrect[0]); + RotatedBox bb(w_min, a, b); + + return bb; +} + +template Radians minAreaBoundingBoxRotation(const RawShape& sh) +{ + return minAreaBoundingBox(sh).angleToX(); +} + + +} + +#endif // ROTCALIPERS_HPP diff --git a/src/libnest2d/src/libnest2d.cpp b/src/libnest2d/src/libnest2d.cpp new file mode 100644 index 0000000000..0214587874 --- /dev/null +++ b/src/libnest2d/src/libnest2d.cpp @@ -0,0 +1,23 @@ +#include + +namespace libnest2d { + +template class Nester; +template class Nester; + +template PackGroup nest(std::vector::iterator from, + std::vector::iterator to, + const Box& bin, + Coord dist = 0, + const NfpPlacer::Config& pconf, + const FirstFitSelection::Config& sconf); + +template PackGroup nest(std::vector::iterator from, + std::vector::iterator to, + const Box& bin, + ProgressFunction prg, + StopCondition scond, + Coord dist = 0, + const NfpPlacer::Config& pconf, + const FirstFitSelection::Config& sconf); +} diff --git a/src/libnest2d/tests/CMakeLists.txt b/src/libnest2d/tests/CMakeLists.txt index fc3cd309dd..1b7d8e3ae6 100644 --- a/src/libnest2d/tests/CMakeLists.txt +++ b/src/libnest2d/tests/CMakeLists.txt @@ -49,7 +49,12 @@ add_executable(tests_clipper_nlopt target_link_libraries(tests_clipper_nlopt libnest2d ${GTEST_LIBS_TO_LINK} ) -target_include_directories(tests_clipper_nlopt PRIVATE BEFORE - ${GTEST_INCLUDE_DIRS}) +target_include_directories(tests_clipper_nlopt PRIVATE BEFORE ${GTEST_INCLUDE_DIRS}) + +if(NOT LIBNEST2D_HEADER_ONLY) + target_link_libraries(tests_clipper_nlopt ${LIBNAME}) +else() + target_link_libraries(tests_clipper_nlopt libnest2d) +endif() add_test(libnest2d_tests tests_clipper_nlopt) diff --git a/src/libnest2d/tests/test.cpp b/src/libnest2d/tests/test.cpp index 3b0eae1618..5741e87b4f 100644 --- a/src/libnest2d/tests/test.cpp +++ b/src/libnest2d/tests/test.cpp @@ -3,11 +3,43 @@ #include #include "printer_parts.h" -#include +//#include #include "../tools/svgtools.hpp" +#include + +#include "boost/multiprecision/integer.hpp" +#include "boost/rational.hpp" + +//#include "../tools/Int128.hpp" + +//#include "gte/Mathematics/GteMinimumAreaBox2.h" + //#include "../tools/libnfpglue.hpp" //#include "../tools/nfp_svgnest_glue.hpp" +namespace libnest2d { +#if !defined(_MSC_VER) && defined(__SIZEOF_INT128__) && !defined(__APPLE__) +using LargeInt = __int128; +#else +using LargeInt = boost::multiprecision::int128_t; +template<> struct _NumTag { using Type = ScalarTag; }; +#endif +template struct _NumTag> { using Type = RationalTag; }; + +namespace nfp { + +template +struct NfpImpl +{ + NfpResult operator()(const S &sh, const S &other) + { + return nfpConvexOnly>(sh, other); + } +}; + +} +} + std::vector& prusaParts() { static std::vector ret; @@ -31,8 +63,8 @@ TEST(BasicFunctionality, Angles) ASSERT_DOUBLE_EQ(rad, Pi); ASSERT_DOUBLE_EQ(deg, 180); ASSERT_DOUBLE_EQ(deg2, 180); - ASSERT_DOUBLE_EQ(rad, (Radians) deg); - ASSERT_DOUBLE_EQ( (Degrees) rad, deg); + ASSERT_DOUBLE_EQ(rad, Radians(deg)); + ASSERT_DOUBLE_EQ( Degrees(rad), deg); ASSERT_TRUE(rad == deg); @@ -151,12 +183,12 @@ TEST(GeometryAlgorithms, Distance) { Segment seg(p1, p3); - ASSERT_DOUBLE_EQ(pointlike::distance(p2, seg), 7.0710678118654755); +// ASSERT_DOUBLE_EQ(pointlike::distance(p2, seg), 7.0710678118654755); auto result = pointlike::horizontalDistance(p2, seg); - auto check = [](Coord val, Coord expected) { - if(std::is_floating_point::value) + auto check = [](TCompute val, TCompute expected) { + if(std::is_floating_point>::value) ASSERT_DOUBLE_EQ(static_cast(val), static_cast(expected)); else @@ -415,7 +447,7 @@ TEST(GeometryAlgorithms, ArrangeRectanglesLoose) namespace { using namespace libnest2d; -template +template void exportSVG(std::vector>& result, const Bin& bin, int idx = 0) { @@ -500,6 +532,41 @@ TEST(GeometryAlgorithms, BottomLeftStressTest) { } } +TEST(GeometryAlgorithms, convexHull) { + using namespace libnest2d; + + ClipperLib::Path poly = PRINTER_PART_POLYGONS[0]; + + auto chull = sl::convexHull(poly); + + ASSERT_EQ(chull.size(), poly.size()); +} + + +TEST(GeometryAlgorithms, NestTest) { + std::vector input = prusaParts(); + + PackGroup result = libnest2d::nest(input, + Box(250000000, 210000000), + [](unsigned cnt) { + std::cout + << "parts left: " << cnt + << std::endl; + }); + + ASSERT_LE(result.size(), 2); + + int partsum = std::accumulate(result.begin(), + result.end(), + 0, + [](int s, + const decltype(result)::value_type &bin) { + return s += bin.size(); + }); + + ASSERT_EQ(input.size(), partsum); +} + namespace { struct ItemPair { @@ -713,7 +780,7 @@ void testNfp(const std::vector& testdata) { auto& exportfun = exportSVG; - auto onetest = [&](Item& orbiter, Item& stationary, unsigned testidx){ + auto onetest = [&](Item& orbiter, Item& stationary, unsigned /*testidx*/){ testcase++; orbiter.translate({210*SCALE, 0}); @@ -820,7 +887,7 @@ TEST(GeometryAlgorithms, mergePileWithPolygon) { rect2.translate({10, 0}); rect3.translate({25, 0}); - shapelike::Shapes pile; + TMultiShape pile; pile.push_back(rect1.transformedShape()); pile.push_back(rect2.transformedShape()); @@ -833,6 +900,126 @@ TEST(GeometryAlgorithms, mergePileWithPolygon) { ASSERT_EQ(shapelike::area(result.front()), ref.area()); } +namespace { + +long double refMinAreaBox(const PolygonImpl& p) { + + auto it = sl::cbegin(p), itx = std::next(it); + + long double min_area = std::numeric_limits::max(); + + + auto update_min = [&min_area, &it, &itx, &p]() { + Segment s(*it, *itx); + + PolygonImpl rotated = p; + sl::rotate(rotated, -s.angleToXaxis()); + auto bb = sl::boundingBox(rotated); + auto area = cast(sl::area(bb)); + if(min_area > area) min_area = area; + }; + + while(itx != sl::cend(p)) { + update_min(); + ++it; ++itx; + } + + it = std::prev(sl::cend(p)); itx = sl::cbegin(p); + update_min(); + + return min_area; +} + +template struct BoostGCD { + T operator()(const T &a, const T &b) { return boost::gcd(a, b); } +}; + +using Unit = int64_t; +using Ratio = boost::rational;// Rational; + +//double gteMinAreaBox(const PolygonImpl& p) { + +// using GteCoord = ClipperLib::cInt; +// using GtePoint = gte::Vector2; + +// gte::MinimumAreaBox2 mb; + +// std::vector points; +// points.reserve(p.Contour.size()); + +// for(auto& pt : p.Contour) points.emplace_back(GtePoint{GteCoord(pt.X), GteCoord(pt.Y)}); + +// mb(int(points.size()), points.data(), 0, nullptr, true); + +// auto min_area = double(mb.GetArea()); + +// return min_area; +//} + +} + +TEST(RotatingCalipers, MinAreaBBCClk) { +// PolygonImpl poly({{-50, 30}, {-50, -50}, {50, -50}, {50, 50}, {-40, 50}}); + +// PolygonImpl poly({{-50, 0}, {50, 0}, {0, 100}}); + + auto u = [](ClipperLib::cInt n) { return n*1000000; }; + PolygonImpl poly({ {u(0), u(0)}, {u(4), u(1)}, {u(2), u(4)}}); + + + long double arearef = refMinAreaBox(poly); + long double area = minAreaBoundingBox(poly).area(); +// double gtearea = gteMinAreaBox(poly); + + ASSERT_LE(std::abs(area - arearef), 500e6 ); +// ASSERT_LE(std::abs(gtearea - arearef), 500 ); +// ASSERT_DOUBLE_EQ(gtearea, arearef); +} + +TEST(RotatingCalipers, AllPrusaMinBB) { + size_t idx = 0; + long double err_epsilon = 500e6l; + + for(ClipperLib::Path rinput : PRINTER_PART_POLYGONS) { +// ClipperLib::Path rinput = PRINTER_PART_POLYGONS[idx]; +// rinput.pop_back(); +// std::reverse(rinput.begin(), rinput.end()); + +// PolygonImpl poly(removeCollinearPoints(rinput, 1000000)); + PolygonImpl poly(rinput); + + long double arearef = refMinAreaBox(poly); + auto bb = minAreaBoundingBox(rinput); + long double area = cast(bb.area()); +// double area = gteMinAreaBox(poly); + + bool succ = std::abs(arearef - area) < err_epsilon; + std::cout << idx++ << " " << (succ? "ok" : "failed") << " ref: " + << arearef << " actual: " << area << std::endl; + + ASSERT_TRUE(succ); + } + + for(ClipperLib::Path rinput : STEGOSAUR_POLYGONS) { + rinput.pop_back(); + std::reverse(rinput.begin(), rinput.end()); + + PolygonImpl poly(removeCollinearPoints(rinput, 1000000)); + + + long double arearef = refMinAreaBox(poly); + auto bb = minAreaBoundingBox(poly); + long double area = cast(bb.area()); +// double area = gteMinAreaBox(poly); + + bool succ = std::abs(arearef - area) < err_epsilon; + std::cout << idx++ << " " << (succ? "ok" : "failed") << " ref: " + << arearef << " actual: " << area << std::endl; + + ASSERT_TRUE(succ); + } +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 312a82c4c8..dc52257aa2 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -130,13 +130,10 @@ add_library(libslic3r STATIC Print.hpp PrintBase.cpp PrintBase.hpp - PrintExport.hpp PrintConfig.cpp PrintConfig.hpp PrintObject.cpp PrintRegion.cpp - Rasterizer/Rasterizer.hpp - Rasterizer/Rasterizer.cpp SLAPrint.cpp SLAPrint.hpp SLA/SLAAutoSupports.hpp @@ -163,6 +160,8 @@ add_library(libslic3r STATIC MTUtils.hpp Zipper.hpp Zipper.cpp + MinAreaBoundingBox.hpp + MinAreaBoundingBox.cpp miniz_extension.hpp miniz_extension.cpp SLA/SLABoilerPlate.hpp @@ -175,6 +174,10 @@ add_library(libslic3r STATIC SLA/SLARotfinder.cpp SLA/SLABoostAdapter.hpp SLA/SLASpatIndex.hpp + SLA/SLARaster.hpp + SLA/SLARaster.cpp + SLA/SLARasterWriter.hpp + SLA/SLARasterWriter.cpp ) if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) @@ -186,6 +189,7 @@ target_include_directories(libslic3r PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LIBNE target_link_libraries(libslic3r libnest2d admesh + libigl miniz boost_libs clipper diff --git a/src/libslic3r/Int128.hpp b/src/libslic3r/Int128.hpp index 56dc5f461d..8dc9e012dd 100644 --- a/src/libslic3r/Int128.hpp +++ b/src/libslic3r/Int128.hpp @@ -37,6 +37,8 @@ * * *******************************************************************************/ +#ifndef SLIC3R_INT128_HPP +#define SLIC3R_INT128_HPP // #define SLIC3R_DEBUG // Make assert active if SLIC3R_DEBUG @@ -48,6 +50,8 @@ #endif #include +#include +#include #if ! defined(_MSC_VER) && defined(__SIZEOF_INT128__) #define HAS_INTRINSIC_128_TYPE @@ -293,3 +297,5 @@ public: return sign_determinant_2x2(p1, q1, p2, q2) * invert; } }; + +#endif // SLIC3R_INT128_HPP diff --git a/src/libslic3r/MTUtils.hpp b/src/libslic3r/MTUtils.hpp index 7e91ace328..0afe3563f9 100644 --- a/src/libslic3r/MTUtils.hpp +++ b/src/libslic3r/MTUtils.hpp @@ -5,6 +5,7 @@ #include // for std::lock_guard #include // for std::function #include // for std::forward +#include namespace Slic3r { @@ -182,6 +183,14 @@ public: inline bool empty() const { return size() == 0; } }; +template bool all_of(const C &container) { + return std::all_of(container.begin(), + container.end(), + [](const typename C::value_type &v) { + return static_cast(v); + }); +} + } #endif // MTUTILS_HPP diff --git a/src/libslic3r/MinAreaBoundingBox.cpp b/src/libslic3r/MinAreaBoundingBox.cpp new file mode 100644 index 0000000000..6fc1b3327a --- /dev/null +++ b/src/libslic3r/MinAreaBoundingBox.cpp @@ -0,0 +1,142 @@ +#include "MinAreaBoundingBox.hpp" + +#include +#include + +#include + +#if !defined(HAS_INTRINSIC_128_TYPE) || defined(__APPLE__) +#include +#endif + +#include +#include + +namespace libnest2d { + +template<> struct PointType { using Type = Slic3r::Point; }; +template<> struct CoordType { using Type = coord_t; }; +template<> struct ShapeTag { using Type = PolygonTag; }; +template<> struct ShapeTag { using Type = PolygonTag; }; +template<> struct ShapeTag { using Type = PathTag; }; +template<> struct ShapeTag { using Type = PointTag; }; +template<> struct ContourType { using Type = Slic3r::Points; }; +template<> struct ContourType { using Type = Slic3r::Points; }; + +namespace pointlike { + +template<> inline coord_t x(const Slic3r::Point& p) { return p.x(); } +template<> inline coord_t y(const Slic3r::Point& p) { return p.y(); } +template<> inline coord_t& x(Slic3r::Point& p) { return p.x(); } +template<> inline coord_t& y(Slic3r::Point& p) { return p.y(); } + +} // pointlike + +namespace shapelike { +template<> inline Slic3r::Points& contour(Slic3r::ExPolygon& sh) { return sh.contour.points; } +template<> inline const Slic3r::Points& contour(const Slic3r::ExPolygon& sh) { return sh.contour.points; } +template<> inline Slic3r::Points& contour(Slic3r::Polygon& sh) { return sh.points; } +template<> inline const Slic3r::Points& contour(const Slic3r::Polygon& sh) { return sh.points; } + +template<> Slic3r::Points::iterator begin(Slic3r::Points& pts, const PathTag&) { return pts.begin();} +template<> Slic3r::Points::const_iterator cbegin(const Slic3r::Points& pts, const PathTag&) { return pts.begin(); } +template<> Slic3r::Points::iterator end(Slic3r::Points& pts, const PathTag&) { return pts.end();} +template<> Slic3r::Points::const_iterator cend(const Slic3r::Points& pts, const PathTag&) { return pts.cend(); } + +template<> inline Slic3r::ExPolygon create(Slic3r::Points&& contour) +{ + Slic3r::ExPolygon expoly; expoly.contour.points.swap(contour); + return expoly; +} + +template<> inline Slic3r::Polygon create(Slic3r::Points&& contour) +{ + Slic3r::Polygon poly; poly.points.swap(contour); + return poly; +} + +} // shapelike +} // libnest2d + +namespace Slic3r { + +// Used as compute type. +using Unit = int64_t; + +#if !defined(HAS_INTRINSIC_128_TYPE) || defined(__APPLE__) +using Rational = boost::rational; +#else +using Rational = boost::rational<__int128>; +#endif + +MinAreaBoundigBox::MinAreaBoundigBox(const Polygon &p, PolygonLevel pc) +{ + const Polygon& chull = pc == pcConvex ? p : libnest2d::sl::convexHull(p); + + libnest2d::RotatedBox box = + libnest2d::minAreaBoundingBox(chull); + + m_right = box.right_extent(); + m_bottom = box.bottom_extent(); + m_axis = box.axis(); +} + +MinAreaBoundigBox::MinAreaBoundigBox(const ExPolygon &p, PolygonLevel pc) +{ + const ExPolygon& chull = pc == pcConvex ? p : libnest2d::sl::convexHull(p); + + libnest2d::RotatedBox box = + libnest2d::minAreaBoundingBox(chull); + + m_right = box.right_extent(); + m_bottom = box.bottom_extent(); + m_axis = box.axis(); +} + +MinAreaBoundigBox::MinAreaBoundigBox(const Points &pts, PolygonLevel pc) +{ + const Points& chull = pc == pcConvex ? pts : libnest2d::sl::convexHull(pts); + + libnest2d::RotatedBox box = + libnest2d::minAreaBoundingBox(chull); + + m_right = box.right_extent(); + m_bottom = box.bottom_extent(); + m_axis = box.axis(); +} + +double MinAreaBoundigBox::angle_to_X() const +{ + double ret = std::atan2(m_axis.y(), m_axis.x()); + auto s = std::signbit(ret); + if(s) ret += 2 * PI; + return -ret; +} + +long double MinAreaBoundigBox::width() const +{ + return std::abs(m_bottom) / std::sqrt(libnest2d::pl::magnsq(m_axis)); +} + +long double MinAreaBoundigBox::height() const +{ + return std::abs(m_right) / std::sqrt(libnest2d::pl::magnsq(m_axis)); +} + +long double MinAreaBoundigBox::area() const +{ + long double asq = libnest2d::pl::magnsq(m_axis); + return m_bottom * m_right / asq; +} + +void remove_collinear_points(Polygon &p) +{ + p = libnest2d::removeCollinearPoints(p, Unit(0)); +} + +void remove_collinear_points(ExPolygon &p) +{ + p = libnest2d::removeCollinearPoints(p, Unit(0)); +} + +} diff --git a/src/libslic3r/MinAreaBoundingBox.hpp b/src/libslic3r/MinAreaBoundingBox.hpp new file mode 100644 index 0000000000..30d0e9799d --- /dev/null +++ b/src/libslic3r/MinAreaBoundingBox.hpp @@ -0,0 +1,59 @@ +#ifndef MINAREABOUNDINGBOX_HPP +#define MINAREABOUNDINGBOX_HPP + +#include "libslic3r/Point.hpp" + +namespace Slic3r { + +class Polygon; +class ExPolygon; + +void remove_collinear_points(Polygon& p); +void remove_collinear_points(ExPolygon& p); + +/// A class that holds a rotated bounding box. If instantiated with a polygon +/// type it will hold the minimum area bounding box for the given polygon. +/// If the input polygon is convex, the complexity is linear to the number of +/// points. Otherwise a convex hull of O(n*log(n)) has to be performed. +class MinAreaBoundigBox { + Point m_axis; + long double m_bottom = 0.0l, m_right = 0.0l; +public: + + // Polygons can be convex or simple (convex or concave with possible holes) + enum PolygonLevel { + pcConvex, pcSimple + }; + + // Constructors with various types of geometry data used in Slic3r. + // If the convexity is known apriory, pcConvex can be used to skip + // convex hull calculation. It is very important that the input polygons + // do NOT have any collinear points (except for the first and the last + // vertex being the same -- meaning a closed polygon for boost) + // To make sure this constraint is satisfied, you can call + // remove_collinear_points on the input polygon before handing over here) + explicit MinAreaBoundigBox(const Polygon&, PolygonLevel = pcSimple); + explicit MinAreaBoundigBox(const ExPolygon&, PolygonLevel = pcSimple); + explicit MinAreaBoundigBox(const Points&, PolygonLevel = pcSimple); + + // Returns the angle in radians needed for the box to be aligned with the + // X axis. Rotate the polygon by this angle and it will be aligned. + double angle_to_X() const; + + // The box width + long double width() const; + + // The box height + long double height() const; + + // The box area + long double area() const; + + // The axis of the rotated box. If the angle_to_X is not sufficiently + // precise, use this unnormalized direction vector. + const Point& axis() const { return m_axis; } +}; + +} + +#endif // MINAREABOUNDINGBOX_HPP diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp index b088a1f176..a440c3999d 100644 --- a/src/libslic3r/ModelArrange.cpp +++ b/src/libslic3r/ModelArrange.cpp @@ -9,6 +9,31 @@ #include #include +#include +#include + +namespace libnest2d { +#if !defined(_MSC_VER) && defined(__SIZEOF_INT128__) && !defined(__APPLE__) +using LargeInt = __int128; +#else +using LargeInt = boost::multiprecision::int128_t; +template<> struct _NumTag { using Type = ScalarTag; }; +#endif +template struct _NumTag> { using Type = RationalTag; }; + +namespace nfp { + +template +struct NfpImpl +{ + NfpResult operator()(const S &sh, const S &other) + { + return nfpConvexOnly>(sh, other); + } +}; + +} +} namespace Slic3r { @@ -130,7 +155,7 @@ Box boundingBox(const Box& pilebb, const Box& ibb ) { // at the same time, it has to provide reasonable results. std::tuple objfunc(const PointImpl& bincenter, - const shapelike::Shapes& merged_pile, + const TMultiShape& merged_pile, const Box& pilebb, const ItemGroup& items, const Item &item, @@ -293,7 +318,7 @@ class AutoArranger {}; // management and spatial index structures for acceleration. template class _ArrBase { -protected: +public: // Useful type shortcuts... using Placer = TPacker; @@ -301,7 +326,9 @@ protected: using Packer = Nester; using PConfig = typename Packer::PlacementConfig; using Distance = TCoord; - using Pile = sl::Shapes; + using Pile = TMultiShape; + +protected: Packer m_pck; PConfig m_pconf; // Placement configuration @@ -539,7 +566,10 @@ public: // 2D shape from top view. using ShapeData2D = std::vector>; -ShapeData2D projectModelFromTop(const Slic3r::Model &model, const WipeTowerInfo& wti) { +ShapeData2D projectModelFromTop(const Slic3r::Model &model, + const WipeTowerInfo &wti, + double tolerance) +{ ShapeData2D ret; // Count all the items on the bin (all the object's instances) @@ -561,21 +591,32 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model, const WipeTowerInfo& // Object instances should carry the same scaling and // x, y rotation that is why we use the first instance. { - ModelInstance *finst = objptr->instances.front(); - Vec3d rotation = finst->get_rotation(); - rotation.z() = 0.; - Transform3d trafo_instance = Geometry::assemble_transform(Vec3d::Zero(), rotation, finst->get_scaling_factor(), finst->get_mirror()); + ModelInstance *finst = objptr->instances.front(); + Vec3d rotation = finst->get_rotation(); + rotation.z() = 0.; + Transform3d trafo_instance = Geometry::assemble_transform( + Vec3d::Zero(), + rotation, + finst->get_scaling_factor(), + finst->get_mirror()); Polygon p = objptr->convex_hull_2d(trafo_instance); - assert(! p.points.empty()); - - // this may happen for malformed models, see: https://github.com/prusa3d/PrusaSlicer/issues/2209 - if (p.points.empty()) - continue; + + assert(!p.points.empty()); + // this may happen for malformed models, see: + // https://github.com/prusa3d/PrusaSlicer/issues/2209 + if (p.points.empty()) continue; + + if(tolerance > EPSILON) { + Polygons pp { p }; + pp = p.simplify(double(scaled(tolerance))); + if (!pp.empty()) p = pp.front(); + } + p.reverse(); assert(!p.is_counter_clockwise()); - p.append(p.first_point()); clpath = Slic3rMultiPoint_to_ClipperPath(p); + auto firstp = clpath.front(); clpath.emplace_back(firstp); } Vec3d rotation0 = objptr->instances.front()->get_rotation(); @@ -589,7 +630,7 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model, const WipeTowerInfo& // Invalid geometries would throw exceptions when arranging if(item.vertexCount() > 3) { - item.rotation(float(Geometry::rotation_diff_z(rotation0, objinst->get_rotation()))), + item.rotation(Geometry::rotation_diff_z(rotation0, objinst->get_rotation())); item.translation({ ClipperLib::cInt(objinst->get_offset(X)/SCALING_FACTOR), ClipperLib::cInt(objinst->get_offset(Y)/SCALING_FACTOR) @@ -741,6 +782,8 @@ BedShapeHint bedShape(const Polyline &bed) { return ret; } +static const SLIC3R_CONSTEXPR double SIMPLIFY_TOLERANCE_MM = 0.1; + // The final client function to arrange the Model. A progress indicator and // a stop predicate can be also be passed to control the process. bool arrange(Model &model, // The model with the geometries @@ -755,9 +798,9 @@ bool arrange(Model &model, // The model with the geometries std::function stopcondition) { bool ret = true; - + // Get the 2D projected shapes with their 3D model instance pointers - auto shapemap = arr::projectModelFromTop(model, wti); + auto shapemap = arr::projectModelFromTop(model, wti, SIMPLIFY_TOLERANCE_MM); // Copy the references for the shapes only as the arranger expects a // sequence of objects convertible to Item or ClipperPolygon @@ -782,7 +825,7 @@ bool arrange(Model &model, // The model with the geometries static_cast(bbb.min(0)), static_cast(bbb.min(1)) }, - { + { static_cast(bbb.max(0)), static_cast(bbb.max(1)) }); @@ -856,9 +899,9 @@ void find_new_position(const Model &model, coord_t min_obj_distance, const Polyline &bed, WipeTowerInfo& wti) -{ +{ // Get the 2D projected shapes with their 3D model instance pointers - auto shapemap = arr::projectModelFromTop(model, wti); + auto shapemap = arr::projectModelFromTop(model, wti, SIMPLIFY_TOLERANCE_MM); // Copy the references for the shapes only as the arranger expects a // sequence of objects convertible to Item or ClipperPolygon diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 87ea263012..89e21934a1 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2258,6 +2258,20 @@ void PrintConfigDef::init_sla_params() def->min = 100; def->set_default_value(new ConfigOptionInt(1440)); + def = this->add("display_mirror_x", coBool); + def->full_label = L("Display horizontal mirroring"); + def->label = L("Mirror horizontally"); + def->tooltip = L("Enable horizontal mirroring of output images"); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBool(true)); + + def = this->add("display_mirror_y", coBool); + def->full_label = L("Display vertical mirroring"); + def->label = L("Mirror vertically"); + def->tooltip = L("Enable vertical mirroring of output images"); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("display_orientation", coEnum); def->label = L("Display orientation"); def->tooltip = L("Set the actual LCD display orientation inside the SLA printer." diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 1da22b377f..248b89e321 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1083,6 +1083,8 @@ public: ConfigOptionInt display_pixels_x; ConfigOptionInt display_pixels_y; ConfigOptionEnum display_orientation; + ConfigOptionBool display_mirror_x; + ConfigOptionBool display_mirror_y; ConfigOptionFloats relative_correction; ConfigOptionFloat absolute_correction; ConfigOptionFloat gamma_correction; @@ -1099,6 +1101,8 @@ protected: OPT_PTR(display_height); OPT_PTR(display_pixels_x); OPT_PTR(display_pixels_y); + OPT_PTR(display_mirror_x); + OPT_PTR(display_mirror_y); OPT_PTR(display_orientation); OPT_PTR(relative_correction); OPT_PTR(absolute_correction); diff --git a/src/libslic3r/PrintExport.hpp b/src/libslic3r/PrintExport.hpp deleted file mode 100644 index f6537ed324..0000000000 --- a/src/libslic3r/PrintExport.hpp +++ /dev/null @@ -1,327 +0,0 @@ -#ifndef PRINTEXPORT_HPP -#define PRINTEXPORT_HPP - -// For png export of the sliced model -#include -#include -#include - -#include -#include - -#include "Rasterizer/Rasterizer.hpp" -//#include -//#include //#include "tbb/mutex.h" - -namespace Slic3r { - -// Used for addressing parameters of FilePrinter::set_statistics() -enum ePrintStatistics -{ - psUsedMaterial = 0, - psNumFade, - psNumSlow, - psNumFast, - - psCnt -}; - -enum class FilePrinterFormat { - SLA_PNGZIP, - SVG -}; - -/* - * Interface for a file printer of the slices. Implementation can be an SVG - * or PNG printer or any other format. - * - * The format argument specifies the output format of the printer and it enables - * different implementations of this class template for each supported format. - * - */ -template -class FilePrinter { -public: - - // Draw a polygon which is a polygon inside a slice on the specified layer. - void draw_polygon(const ExPolygon& p, unsigned lyr); - void draw_polygon(const ClipperLib::Polygon& p, unsigned lyr); - - // Tell the printer how many layers should it consider. - void layers(unsigned layernum); - - // Get the number of layers in the print. - unsigned layers() const; - - /* Switch to a particular layer. If there where less layers then the - * specified layer number than an appropriate number of layers will be - * allocated in the printer. - */ - void begin_layer(unsigned layer); - - // Allocate a new layer on top of the last and switch to it. - void begin_layer(); - - /* - * Finish the selected layer. It means that no drawing is allowed on that - * layer anymore. This fact can be used to prepare the file system output - * data like png comprimation and so on. - */ - void finish_layer(unsigned layer); - - // Finish the top layer. - void finish_layer(); - - // Save all the layers into the file (or dir) specified in the path argument - // An optional project name can be added to be used for the layer file names - void save(const std::string& path, const std::string& projectname = ""); - - // Save only the selected layer to the file specified in path argument. - void save_layer(unsigned lyr, const std::string& path); -}; - -// Provokes static_assert in the right way. -template struct VeryFalse { static const bool value = false; }; - -// This can be explicitly implemented in the gui layer or the default Zipper -// API in libslic3r with minz. -template class LayerWriter { -public: - - LayerWriter(const std::string& /*zipfile_path*/) - { - static_assert(VeryFalse::value, - "No layer writer implementation provided!"); - } - - // Should create a new file within the zip with the given filename. It - // should also finish any previous entry. - void next_entry(const std::string& /*fname*/) {} - - // Should create a new file within the archive and write the provided data. - void binary_entry(const std::string& /*fname*/, - const std::uint8_t* buf, size_t len); - - // Test whether the object can still be used for writing. - bool is_ok() { return false; } - - // Write some data (text) into the current file (entry) within the archive. - template LayerWriter& operator<<(T&& /*arg*/) { - return *this; - } - - // Flush the current entry into the archive. - void finalize() {} -}; - -// Implementation for PNG raster output -// Be aware that if a large number of layers are allocated, it can very well -// exhaust the available memory especially on 32 bit platform. -template<> class FilePrinter -{ - struct Layer { - Raster raster; - RawBytes rawbytes; - - Layer() {} - - Layer(const Layer&) = delete; - Layer(Layer&& m): - raster(std::move(m.raster)) {} - }; - - // We will save the compressed PNG data into stringstreams which can be done - // in parallel. Later we can write every layer to the disk sequentially. - std::vector m_layers_rst; - Raster::Resolution m_res; - Raster::PixelDim m_pxdim; - double m_exp_time_s = .0, m_exp_time_first_s = .0; - double m_layer_height = .0; - Raster::Origin m_o = Raster::Origin::TOP_LEFT; - double m_gamma; - - double m_used_material = 0.0; - int m_cnt_fade_layers = 0; - int m_cnt_slow_layers = 0; - int m_cnt_fast_layers = 0; - - std::string createIniContent(const std::string& projectname) { - using std::string; - using std::to_string; - - auto expt_str = to_string(m_exp_time_s); - auto expt_first_str = to_string(m_exp_time_first_s); - auto layerh_str = to_string(m_layer_height); - - const std::string cnt_fade_layers = to_string(m_cnt_fade_layers); - const std::string cnt_slow_layers = to_string(m_cnt_slow_layers); - const std::string cnt_fast_layers = to_string(m_cnt_fast_layers); - const std::string used_material = to_string(m_used_material); - - return string( - "action = print\n" - "jobDir = ") + projectname + "\n" + - "expTime = " + expt_str + "\n" - "expTimeFirst = " + expt_first_str + "\n" - "numFade = " + cnt_fade_layers + "\n" - "layerHeight = " + layerh_str + "\n" - "usedMaterial = " + used_material + "\n" - "numSlow = " + cnt_slow_layers + "\n" - "numFast = " + cnt_fast_layers + "\n"; - } - -public: - - enum RasterOrientation { - RO_LANDSCAPE, - RO_PORTRAIT - }; - - // We will play with the raster's coordinate origin parameter. When the - // printer should print in landscape mode it should have the Y axis flipped - // because the layers should be displayed upside down. PNG has its - // coordinate origin in the top-left corner so normally the Raster objects - // should be instantiated with the TOP_LEFT flag. However, in landscape mode - // we do want the pictures to be upside down so we will make BOTTOM_LEFT - // type rasters and the PNG format will do the flipping automatically. - - // In case of portrait images, we have to rotate the image by a 90 degrees - // and flip the y axis. To get the correct upside-down orientation of the - // slice images, we can flip the x and y coordinates of the input polygons - // and do the Y flipping of the image. This will generate the correct - // orientation in portrait mode. - - inline FilePrinter(double width_mm, double height_mm, - unsigned width_px, unsigned height_px, - double layer_height, - double exp_time, double exp_time_first, - RasterOrientation ro = RO_PORTRAIT, - double gamma = 1.0): - m_res(width_px, height_px), - m_pxdim(width_mm/width_px, height_mm/height_px), - m_exp_time_s(exp_time), - m_exp_time_first_s(exp_time_first), - m_layer_height(layer_height), - - // Here is the trick with the orientation. - m_o(ro == RO_LANDSCAPE? Raster::Origin::BOTTOM_LEFT : - Raster::Origin::TOP_LEFT ), - m_gamma(gamma) - { - } - - FilePrinter(const FilePrinter& ) = delete; - FilePrinter(FilePrinter&& m): - m_layers_rst(std::move(m.m_layers_rst)), - m_res(m.m_res), - m_pxdim(m.m_pxdim) {} - - inline void layers(unsigned cnt) { if(cnt > 0) m_layers_rst.resize(cnt); } - inline unsigned layers() const { return unsigned(m_layers_rst.size()); } - - inline void draw_polygon(const ExPolygon& p, unsigned lyr) { - assert(lyr < m_layers_rst.size()); - m_layers_rst[lyr].raster.draw(p); - } - - inline void draw_polygon(const ClipperLib::Polygon& p, unsigned lyr) { - assert(lyr < m_layers_rst.size()); - m_layers_rst[lyr].raster.draw(p); - } - - inline void begin_layer(unsigned lyr) { - if(m_layers_rst.size() <= lyr) m_layers_rst.resize(lyr+1); - m_layers_rst[lyr].raster.reset(m_res, m_pxdim, m_o, m_gamma); - } - - inline void begin_layer() { - m_layers_rst.emplace_back(); - m_layers_rst.front().raster.reset(m_res, m_pxdim, m_o, m_gamma); - } - - inline void finish_layer(unsigned lyr_id) { - assert(lyr_id < m_layers_rst.size()); - m_layers_rst[lyr_id].rawbytes = - m_layers_rst[lyr_id].raster.save(Raster::Compression::PNG); - m_layers_rst[lyr_id].raster.reset(); - } - - inline void finish_layer() { - if(!m_layers_rst.empty()) { - m_layers_rst.back().rawbytes = - m_layers_rst.back().raster.save(Raster::Compression::PNG); - m_layers_rst.back().raster.reset(); - } - } - - template - inline void save(const std::string& fpath, const std::string& prjname = "") - { - try { - LayerWriter writer(fpath); - if(!writer.is_ok()) return; - - std::string project = prjname.empty()? - boost::filesystem::path(fpath).stem().string() : prjname; - - writer.next_entry("config.ini"); - if(!writer.is_ok()) return; - - writer << createIniContent(project); - - for(unsigned i = 0; i < m_layers_rst.size() && writer.is_ok(); i++) - { - if(m_layers_rst[i].rawbytes.size() > 0) { - char lyrnum[6]; - std::sprintf(lyrnum, "%.5d", i); - auto zfilename = project + lyrnum + ".png"; - if(!writer.is_ok()) break; - - writer.binary_entry(zfilename, - m_layers_rst[i].rawbytes.data(), - m_layers_rst[i].rawbytes.size()); - } - } - - writer.finalize(); - } catch(std::exception& e) { - BOOST_LOG_TRIVIAL(error) << e.what(); - // Rethrow the exception - throw; - } - } - - void save_layer(unsigned lyr, const std::string& path) { - unsigned i = lyr; - assert(i < m_layers_rst.size()); - - char lyrnum[6]; - std::sprintf(lyrnum, "%.5d", lyr); - std::string loc = path + "layer" + lyrnum + ".png"; - - std::fstream out(loc, std::fstream::out | std::fstream::binary); - if(out.good()) { - m_layers_rst[i].raster.save(out, Raster::Compression::PNG); - } else { - BOOST_LOG_TRIVIAL(error) << "Can't create file for layer"; - } - - out.close(); - m_layers_rst[i].raster.reset(); - } - - void set_statistics(const std::vector statistics) - { - if (statistics.size() != psCnt) - return; - - m_used_material = statistics[psUsedMaterial]; - m_cnt_fade_layers = int(statistics[psNumFade]); - m_cnt_slow_layers = int(statistics[psNumSlow]); - m_cnt_fast_layers = int(statistics[psNumFast]); - } -}; - -} - -#endif // PRINTEXPORT_HPP diff --git a/src/libslic3r/Rasterizer/Rasterizer.cpp b/src/libslic3r/SLA/SLARaster.cpp similarity index 72% rename from src/libslic3r/Rasterizer/Rasterizer.cpp rename to src/libslic3r/SLA/SLARaster.cpp index e1213555c4..32a88b1b50 100644 --- a/src/libslic3r/Rasterizer/Rasterizer.cpp +++ b/src/libslic3r/SLA/SLARaster.cpp @@ -1,5 +1,10 @@ -#include "Rasterizer.hpp" -#include +#ifndef SLARASTER_CPP +#define SLARASTER_CPP + +#include + +#include "SLARaster.hpp" +#include "libslic3r/ExPolygon.hpp" #include // For rasterizing @@ -19,11 +24,13 @@ namespace Slic3r { -const Polygon& contour(const ExPolygon& p) { return p.contour; } -const ClipperLib::Path& contour(const ClipperLib::Polygon& p) { return p.Contour; } +inline const Polygon& contour(const ExPolygon& p) { return p.contour; } +inline const ClipperLib::Path& contour(const ClipperLib::Polygon& p) { return p.Contour; } -const Polygons& holes(const ExPolygon& p) { return p.holes; } -const ClipperLib::Paths& holes(const ClipperLib::Polygon& p) { return p.Holes; } +inline const Polygons& holes(const ExPolygon& p) { return p.holes; } +inline const ClipperLib::Paths& holes(const ClipperLib::Polygon& p) { return p.Holes; } + +namespace sla { class Raster::Impl { public: @@ -39,7 +46,7 @@ public: static const TPixel ColorWhite; static const TPixel ColorBlack; - using Origin = Raster::Origin; + using Format = Raster::Format; private: Raster::Resolution m_resolution; @@ -52,16 +59,21 @@ private: TRendererAA m_renderer; std::function m_gammafn; - Origin m_o; + std::array m_mirror; + Format m_fmt = Format::PNG; inline void flipy(agg::path_storage& path) const { path.flip_y(0, m_resolution.height_px); } + + inline void flipx(agg::path_storage& path) const { + path.flip_x(0, m_resolution.width_px); + } public: inline Impl(const Raster::Resolution& res, const Raster::PixelDim &pd, - Origin o, double gamma = 1.0): + const std::array& mirror, double gamma = 1.0): m_resolution(res), // m_pxdim(pd), m_pxdim_scaled(SCALING_FACTOR / pd.w_mm, SCALING_FACTOR / pd.h_mm), @@ -72,7 +84,7 @@ public: m_pixfmt(m_rbuf), m_raw_renderer(m_pixfmt), m_renderer(m_raw_renderer), - m_o(o) + m_mirror(mirror) { m_renderer.color(ColorWhite); @@ -81,6 +93,19 @@ public: clear(); } + + inline Impl(const Raster::Resolution& res, + const Raster::PixelDim &pd, + Format fmt, + double gamma = 1.0): + Impl(res, pd, {false, false}, gamma) + { + switch (fmt) { + case Format::PNG: m_mirror = {false, true}; break; + case Format::RAW: m_mirror = {false, false}; break; + } + m_fmt = fmt; + } template void draw(const P &poly) { agg::rasterizer_scanline_aa<> ras; @@ -89,14 +114,16 @@ public: ras.gamma(m_gammafn); auto&& path = to_path(contour(poly)); - - if(m_o == Origin::TOP_LEFT) flipy(path); + + if(m_mirror[X]) flipx(path); + if(m_mirror[Y]) flipy(path); ras.add_path(path); for(auto& h : holes(poly)) { auto&& holepath = to_path(h); - if(m_o == Origin::TOP_LEFT) flipy(holepath); + if(m_mirror[X]) flipx(holepath); + if(m_mirror[Y]) flipy(holepath); ras.add_path(holepath); } @@ -108,11 +135,11 @@ public: } inline TBuffer& buffer() { return m_buf; } + + inline Format format() const { return m_fmt; } inline const Raster::Resolution resolution() { return m_resolution; } - - inline Origin origin() const /*noexcept*/ { return m_o; } - + private: inline double getPx(const Point& p) { return p(0) * m_pxdim_scaled.w_mm; @@ -154,30 +181,30 @@ private: const Raster::Impl::TPixel Raster::Impl::ColorWhite = Raster::Impl::TPixel(255); const Raster::Impl::TPixel Raster::Impl::ColorBlack = Raster::Impl::TPixel(0); -Raster::Raster(const Resolution &r, const PixelDim &pd, Origin o, double g): - m_impl(new Impl(r, pd, o, g)) {} +template<> Raster::Raster() { reset(); }; +Raster::~Raster() = default; -Raster::Raster() {} +// Raster::Raster(Raster &&m) = default; +// Raster& Raster::operator=(Raster&&) = default; -Raster::~Raster() {} - -Raster::Raster(Raster &&m): - m_impl(std::move(m.m_impl)) {} - -void Raster::reset(const Raster::Resolution &r, const Raster::PixelDim &pd, - double g) -{ - // Free up the unnecessary memory and make sure it stays clear after - // an exception - auto o = m_impl? m_impl->origin() : Origin::TOP_LEFT; - reset(r, pd, o, g); +// FIXME: remove after migrating to higher version of windows compiler +Raster::Raster(Raster &&m): m_impl(std::move(m.m_impl)) {} +Raster& Raster::operator=(Raster &&m) { + m_impl = std::move(m.m_impl); return *this; } void Raster::reset(const Raster::Resolution &r, const Raster::PixelDim &pd, - Raster::Origin o, double gamma) + Format fmt, double gamma) { m_impl.reset(); - m_impl.reset(new Impl(r, pd, o, gamma)); + m_impl.reset(new Impl(r, pd, fmt, gamma)); +} + +void Raster::reset(const Raster::Resolution &r, const Raster::PixelDim &pd, + const std::array& mirror, double gamma) +{ + m_impl.reset(); + m_impl.reset(new Impl(r, pd, mirror, gamma)); } void Raster::reset() @@ -208,13 +235,13 @@ void Raster::draw(const ClipperLib::Polygon &poly) m_impl->draw(poly); } -void Raster::save(std::ostream& stream, Compression comp) +void Raster::save(std::ostream& stream, Format fmt) { assert(m_impl); if(!stream.good()) return; - switch(comp) { - case Compression::PNG: { + switch(fmt) { + case Format::PNG: { auto& b = m_impl->buffer(); size_t out_len = 0; void * rawdata = tdefl_write_image_to_png_file_in_memory( @@ -231,7 +258,7 @@ void Raster::save(std::ostream& stream, Compression comp) break; } - case Compression::RAW: { + case Format::RAW: { stream << "P5 " << m_impl->resolution().width_px << " " << m_impl->resolution().height_px << " " @@ -244,14 +271,19 @@ void Raster::save(std::ostream& stream, Compression comp) } } -RawBytes Raster::save(Raster::Compression comp) +void Raster::save(std::ostream &stream) +{ + save(stream, m_impl->format()); +} + +RawBytes Raster::save(Format fmt) { assert(m_impl); std::vector data; size_t s = 0; - switch(comp) { - case Compression::PNG: { + switch(fmt) { + case Format::PNG: { void *rawdata = tdefl_write_image_to_png_file_in_memory( m_impl->buffer().data(), int(resolution().width_px), @@ -265,7 +297,7 @@ RawBytes Raster::save(Raster::Compression comp) MZ_FREE(rawdata); break; } - case Compression::RAW: { + case Format::RAW: { auto header = std::string("P5 ") + std::to_string(m_impl->resolution().width_px) + " " + std::to_string(m_impl->resolution().height_px) + " " + "255 "; @@ -286,4 +318,12 @@ RawBytes Raster::save(Raster::Compression comp) return {std::move(data)}; } +RawBytes Raster::save() +{ + return save(m_impl->format()); } + +} +} + +#endif // SLARASTER_CPP diff --git a/src/libslic3r/Rasterizer/Rasterizer.hpp b/src/libslic3r/SLA/SLARaster.hpp similarity index 64% rename from src/libslic3r/Rasterizer/Rasterizer.hpp rename to src/libslic3r/SLA/SLARaster.hpp index 3fffe1a365..d3bd52d92c 100644 --- a/src/libslic3r/Rasterizer/Rasterizer.hpp +++ b/src/libslic3r/SLA/SLARaster.hpp @@ -1,17 +1,21 @@ -#ifndef RASTERIZER_HPP -#define RASTERIZER_HPP +#ifndef SLARASTER_HPP +#define SLARASTER_HPP #include #include #include +#include +#include #include namespace ClipperLib { struct Polygon; } -namespace Slic3r { +namespace Slic3r { class ExPolygon; +namespace sla { + // Raw byte buffer paired with its size. Suitable for compressed PNG data. class RawBytes { @@ -23,15 +27,18 @@ public: size_t size() const { return m_buffer.size(); } const uint8_t * data() { return m_buffer.data(); } + + RawBytes(const RawBytes&) = delete; + RawBytes& operator=(const RawBytes&) = delete; // ///////////////////////////////////////////////////////////////////////// // FIXME: the following is needed for MSVC2013 compatibility // ///////////////////////////////////////////////////////////////////////// - RawBytes(const RawBytes&) = delete; - RawBytes(RawBytes&& mv) : m_buffer(std::move(mv.m_buffer)) {} + // RawBytes(RawBytes&&) = default; + // RawBytes& operator=(RawBytes&&) = default; - RawBytes& operator=(const RawBytes&) = delete; + RawBytes(RawBytes&& mv) : m_buffer(std::move(mv.m_buffer)) {} RawBytes& operator=(RawBytes&& mv) { m_buffer = std::move(mv.m_buffer); return *this; @@ -54,28 +61,19 @@ class Raster { public: /// Supported compression types - enum class Compression { + enum class Format { RAW, //!> Uncompressed pixel data PNG //!> PNG compression }; - /// The Rasterizer expects the input polygons to have their coordinate - /// system origin in the bottom left corner. If the raster is then - /// configured with the TOP_LEFT origin parameter (in the constructor) than - /// it will flip the Y axis in output to maintain the correct orientation. - /// This is the default case with PNG images. They have the origin in the - /// top left corner. Without the flipping, the image would be upside down - /// with the scaled (clipper) coordinate system of the input polygons. - enum class Origin { - TOP_LEFT, - BOTTOM_LEFT - }; - /// Type that represents a resolution in pixels. struct Resolution { unsigned width_px; unsigned height_px; - inline Resolution(unsigned w, unsigned h): width_px(w), height_px(h) {} + + inline Resolution(unsigned w = 0, unsigned h = 0): + width_px(w), height_px(h) {} + inline unsigned pixels() const /*noexcept*/ { return width_px * height_px; } @@ -85,24 +83,34 @@ public: struct PixelDim { double w_mm; double h_mm; - inline PixelDim(double px_width_mm, double px_height_mm ): + inline PixelDim(double px_width_mm = 0.0, double px_height_mm = 0.0): w_mm(px_width_mm), h_mm(px_height_mm) {} }; /// Constructor taking the resolution and the pixel dimension. - Raster(const Resolution& r, const PixelDim& pd, - Origin o = Origin::BOTTOM_LEFT, double gamma = 1.0); + template Raster(Args...args) { + reset(std::forward(args)...); + } - Raster(); Raster(const Raster& cpy) = delete; Raster& operator=(const Raster& cpy) = delete; Raster(Raster&& m); + Raster& operator=(Raster&&); ~Raster(); /// Reallocated everything for the given resolution and pixel dimension. - void reset(const Resolution& r, const PixelDim& pd, double gamma = 1.0); - void reset(const Resolution& r, const PixelDim& pd, Origin o, double gamma); - + /// The third parameter is either the X, Y mirroring or a supported format + /// for which the correct mirroring will be configured. + void reset(const Resolution&, + const PixelDim&, + const std::array& mirror, + double gamma = 1.0); + + void reset(const Resolution& r, + const PixelDim& pd, + Format o, + double gamma = 1.0); + /** * Release the allocated resources. Drawing in this state ends in * unspecified behavior. @@ -119,11 +127,24 @@ public: void draw(const ExPolygon& poly); void draw(const ClipperLib::Polygon& poly); + // Saving the raster: + // It is possible to override the format given in the constructor but + // be aware that the mirroring will not be modified. + /// Save the raster on the specified stream. - void save(std::ostream& stream, Compression comp = Compression::RAW); + void save(std::ostream& stream, Format); + void save(std::ostream& stream); - RawBytes save(Compression comp = Compression::RAW); + /// Save into a continuous byte stream which is returned. + RawBytes save(Format fmt); + RawBytes save(); }; -} -#endif // RASTERIZER_HPP +// This prevents the duplicate default constructor warning on MSVC2013 +template<> Raster::Raster(); + + +} // sla +} // Slic3r + +#endif // SLARASTER_HPP diff --git a/src/libslic3r/SLA/SLARasterWriter.cpp b/src/libslic3r/SLA/SLARasterWriter.cpp new file mode 100644 index 0000000000..f7c3925ac7 --- /dev/null +++ b/src/libslic3r/SLA/SLARasterWriter.cpp @@ -0,0 +1,136 @@ +#include "SLARasterWriter.hpp" +#include "libslic3r/Zipper.hpp" +#include "ExPolygon.hpp" +#include + +#include +#include + +namespace Slic3r { namespace sla { + +std::string SLARasterWriter::createIniContent(const std::string& projectname) const +{ + auto expt_str = std::to_string(m_exp_time_s); + auto expt_first_str = std::to_string(m_exp_time_first_s); + auto layerh_str = std::to_string(m_layer_height); + + const std::string cnt_fade_layers = std::to_string(m_cnt_fade_layers); + const std::string cnt_slow_layers = std::to_string(m_cnt_slow_layers); + const std::string cnt_fast_layers = std::to_string(m_cnt_fast_layers); + const std::string used_material = std::to_string(m_used_material); + + return std::string( + "action = print\n" + "jobDir = ") + projectname + "\n" + + "expTime = " + expt_str + "\n" + "expTimeFirst = " + expt_first_str + "\n" + "numFade = " + cnt_fade_layers + "\n" + "layerHeight = " + layerh_str + "\n" + "usedMaterial = " + used_material + "\n" + "numSlow = " + cnt_slow_layers + "\n" + "numFast = " + cnt_fast_layers + "\n"; +} + +void SLARasterWriter::flpXY(ClipperLib::Polygon &poly) +{ + for(auto& p : poly.Contour) std::swap(p.X, p.Y); + std::reverse(poly.Contour.begin(), poly.Contour.end()); + + for(auto& h : poly.Holes) { + for(auto& p : h) std::swap(p.X, p.Y); + std::reverse(h.begin(), h.end()); + } +} + +void SLARasterWriter::flpXY(ExPolygon &poly) +{ + for(auto& p : poly.contour.points) p = Point(p.y(), p.x()); + std::reverse(poly.contour.points.begin(), poly.contour.points.end()); + + for(auto& h : poly.holes) { + for(auto& p : h.points) p = Point(p.y(), p.x()); + std::reverse(h.points.begin(), h.points.end()); + } +} + +SLARasterWriter::SLARasterWriter(const SLAPrinterConfig &cfg, + const SLAMaterialConfig &mcfg, + double layer_height) +{ + double w = cfg.display_width.getFloat(); + double h = cfg.display_height.getFloat(); + auto pw = unsigned(cfg.display_pixels_x.getInt()); + auto ph = unsigned(cfg.display_pixels_y.getInt()); + + m_mirror[X] = cfg.display_mirror_x.getBool(); + + // PNG raster will implicitly do an Y mirror + m_mirror[Y] = ! cfg.display_mirror_y.getBool(); + + auto ro = cfg.display_orientation.getInt(); + + if(ro == roPortrait) { + std::swap(w, h); + std::swap(pw, ph); + m_o = roPortrait; + + // XY flipping implicitly does an X mirror + m_mirror[X] = ! m_mirror[X]; + } else m_o = roLandscape; + + m_res = Raster::Resolution(pw, ph); + m_pxdim = Raster::PixelDim(w/pw, h/ph); + m_exp_time_s = mcfg.exposure_time.getFloat(); + m_exp_time_first_s = mcfg.initial_exposure_time.getFloat(); + m_layer_height = layer_height; + + m_gamma = cfg.gamma_correction.getFloat(); +} + +void SLARasterWriter::save(const std::string &fpath, const std::string &prjname) +{ + try { + Zipper zipper(fpath); // zipper with no compression + + std::string project = prjname.empty()? + boost::filesystem::path(fpath).stem().string() : prjname; + + zipper.add_entry("config.ini"); + + zipper << createIniContent(project); + + for(unsigned i = 0; i < m_layers_rst.size(); i++) + { + if(m_layers_rst[i].rawbytes.size() > 0) { + char lyrnum[6]; + std::sprintf(lyrnum, "%.5d", i); + auto zfilename = project + lyrnum + ".png"; + + // Add binary entry to the zipper + zipper.add_entry(zfilename, + m_layers_rst[i].rawbytes.data(), + m_layers_rst[i].rawbytes.size()); + } + } + + zipper.finalize(); + } catch(std::exception& e) { + BOOST_LOG_TRIVIAL(error) << e.what(); + // Rethrow the exception + throw; + } +} + +void SLARasterWriter::set_statistics(const std::vector statistics) +{ + if (statistics.size() != psCnt) + return; + + m_used_material = statistics[psUsedMaterial]; + m_cnt_fade_layers = int(statistics[psNumFade]); + m_cnt_slow_layers = int(statistics[psNumSlow]); + m_cnt_fast_layers = int(statistics[psNumFast]); +} + +} // namespace sla +} // namespace Slic3r diff --git a/src/libslic3r/SLA/SLARasterWriter.hpp b/src/libslic3r/SLA/SLARasterWriter.hpp new file mode 100644 index 0000000000..7133d2ddec --- /dev/null +++ b/src/libslic3r/SLA/SLARasterWriter.hpp @@ -0,0 +1,167 @@ +#ifndef SLARASTERWRITER_HPP +#define SLARASTERWRITER_HPP + +// For png export of the sliced model +#include +#include +#include +#include + +#include "libslic3r/PrintConfig.hpp" + +#include "SLARaster.hpp" + +namespace Slic3r { namespace sla { + +// Implementation for PNG raster output +// Be aware that if a large number of layers are allocated, it can very well +// exhaust the available memory especially on 32 bit platform. +// This class is designed to be used in parallel mode. Layers have an ID and +// each layer can be written and compressed independently (in parallel). +// At the end when all layers where written, the save method can be used to +// write out the result into a zipped archive. +class SLARasterWriter +{ +public: + enum RasterOrientation { + roLandscape, + roPortrait + }; + + // Used for addressing parameters of set_statistics() + enum ePrintStatistics + { + psUsedMaterial = 0, + psNumFade, + psNumSlow, + psNumFast, + + psCnt + }; + +private: + + // A struct to bind the raster image data and its compressed bytes together. + struct Layer { + Raster raster; + RawBytes rawbytes; + + Layer() = default; + Layer(const Layer&) = delete; // The image is big, do not copy by accident + Layer& operator=(const Layer&) = delete; + + // ///////////////////////////////////////////////////////////////////// + // FIXME: the following is needed for MSVC2013 compatibility + // ///////////////////////////////////////////////////////////////////// + + // Layer(Layer&& m) = default; + // Layer& operator=(Layer&&) = default; + Layer(Layer &&m): + raster(std::move(m.raster)), rawbytes(std::move(m.rawbytes)) {} + Layer& operator=(Layer &&m) { + raster = std::move(m.raster); rawbytes = std::move(m.rawbytes); + return *this; + } + }; + + // We will save the compressed PNG data into RawBytes type buffers in + // parallel. Later we can write every layer to the disk sequentially. + std::vector m_layers_rst; + Raster::Resolution m_res; + Raster::PixelDim m_pxdim; + double m_exp_time_s = .0, m_exp_time_first_s = .0; + double m_layer_height = .0; + RasterOrientation m_o = roPortrait; + std::array m_mirror; + + double m_gamma; + + double m_used_material = 0.0; + int m_cnt_fade_layers = 0; + int m_cnt_slow_layers = 0; + int m_cnt_fast_layers = 0; + + std::string createIniContent(const std::string& projectname) const; + + static void flpXY(ClipperLib::Polygon& poly); + static void flpXY(ExPolygon& poly); + +public: + + SLARasterWriter(const SLAPrinterConfig& cfg, + const SLAMaterialConfig& mcfg, + double layer_height); + + SLARasterWriter(const SLARasterWriter& ) = delete; + SLARasterWriter& operator=(const SLARasterWriter&) = delete; + + // ///////////////////////////////////////////////////////////////////////// + // FIXME: the following is needed for MSVC2013 compatibility + // ///////////////////////////////////////////////////////////////////////// + + // SLARasterWriter(SLARasterWriter&& m) = default; + // SLARasterWriter& operator=(SLARasterWriter&&) = default; + SLARasterWriter(SLARasterWriter&& m): + m_layers_rst(std::move(m.m_layers_rst)), + m_res(m.m_res), + m_pxdim(m.m_pxdim), + m_exp_time_s(m.m_exp_time_s), + m_exp_time_first_s(m.m_exp_time_first_s), + m_layer_height(m.m_layer_height), + m_o(m.m_o), + m_mirror(std::move(m.m_mirror)), + m_gamma(m.m_gamma), + m_used_material(m.m_used_material), + m_cnt_fade_layers(m.m_cnt_fade_layers), + m_cnt_slow_layers(m.m_cnt_slow_layers), + m_cnt_fast_layers(m.m_cnt_fast_layers) + {} + + // ///////////////////////////////////////////////////////////////////////// + + inline void layers(unsigned cnt) { if(cnt > 0) m_layers_rst.resize(cnt); } + inline unsigned layers() const { return unsigned(m_layers_rst.size()); } + + template void draw_polygon(const Poly& p, unsigned lyr) { + assert(lyr < m_layers_rst.size()); + if(m_o == roPortrait) { + Poly poly(p); flpXY(poly); + m_layers_rst[lyr].raster.draw(poly); + } + else m_layers_rst[lyr].raster.draw(p); + } + + inline void begin_layer(unsigned lyr) { + if(m_layers_rst.size() <= lyr) m_layers_rst.resize(lyr+1); + m_layers_rst[lyr].raster.reset(m_res, m_pxdim, m_mirror, m_gamma); + } + + inline void begin_layer() { + m_layers_rst.emplace_back(); + m_layers_rst.front().raster.reset(m_res, m_pxdim, m_mirror, m_gamma); + } + + inline void finish_layer(unsigned lyr_id) { + assert(lyr_id < m_layers_rst.size()); + m_layers_rst[lyr_id].rawbytes = + m_layers_rst[lyr_id].raster.save(Raster::Format::PNG); + m_layers_rst[lyr_id].raster.reset(); + } + + inline void finish_layer() { + if(!m_layers_rst.empty()) { + m_layers_rst.back().rawbytes = + m_layers_rst.back().raster.save(Raster::Format::PNG); + m_layers_rst.back().raster.reset(); + } + } + + void save(const std::string& fpath, const std::string& prjname = ""); + + void set_statistics(const std::vector statistics); +}; + +} // namespace sla +} // namespace Slic3r + +#endif // SLARASTERWRITER_HPP diff --git a/src/libslic3r/SLA/SLARotfinder.cpp b/src/libslic3r/SLA/SLARotfinder.cpp index 1a91041b78..2e64059d68 100644 --- a/src/libslic3r/SLA/SLARotfinder.cpp +++ b/src/libslic3r/SLA/SLARotfinder.cpp @@ -44,7 +44,7 @@ std::array find_best_rotation(const ModelObject& modelobj, // call the status callback in each iteration but the actual value may be // the same for subsequent iterations (status goes from 0 to 100 but // iterations can be many more) - auto objfunc = [&emesh, &status, &statuscb, max_tries] + auto objfunc = [&emesh, &status, &statuscb, &stopcond, max_tries] (double rx, double ry, double rz) { EigenMesh3D& m = emesh; @@ -91,7 +91,7 @@ std::array find_best_rotation(const ModelObject& modelobj, } // report status - statuscb( unsigned(++status * 100.0/max_tries) ); + if(!stopcond()) statuscb( unsigned(++status * 100.0/max_tries) ); return score; }; diff --git a/src/libslic3r/Rasterizer/bicubic.h b/src/libslic3r/SLA/bicubic.h similarity index 100% rename from src/libslic3r/Rasterizer/bicubic.h rename to src/libslic3r/SLA/bicubic.h diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 324008cf0d..c73ae5650d 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -747,8 +747,8 @@ void SLAPrint::process() { // We apply the printer correction offset here. if(clpr_offs != 0) - po.m_model_slices[id] = - offset_ex(po.m_model_slices[id], float(clpr_offs)); + po.m_model_slices[id] = + offset_ex(po.m_model_slices[id], float(clpr_offs)); mit->set_model_slice_idx(po, id); ++mit; } @@ -1014,7 +1014,7 @@ void SLAPrint::process() namespace sl = libnest2d::shapelike; // For algorithms // If the raster has vertical orientation, we will flip the coordinates - bool flpXY = m_printer_config.display_orientation.getInt() == SLADisplayOrientation::sladoPortrait; +// bool flpXY = m_printer_config.display_orientation.getInt() == SLADisplayOrientation::sladoPortrait; // Set up custom union and diff functions for clipper polygons auto polyunion = [] (const ClipperPolygons& subjects) @@ -1072,9 +1072,9 @@ void SLAPrint::process() // get polygons for all instances in the object auto get_all_polygons = - [flpXY](const ExPolygons& input_polygons, - const std::vector& instances, - bool is_lefthanded) + [](const ExPolygons& input_polygons, + const std::vector& instances, + bool is_lefthanded) { ClipperPolygons polygons; polygons.reserve(input_polygons.size() * instances.size()); @@ -1088,7 +1088,7 @@ void SLAPrint::process() // We need to reverse if flpXY OR is_lefthanded is true but // not if both are true which is a logical inequality (XOR) - bool needreverse = flpXY != is_lefthanded; + bool needreverse = /*flpXY !=*/ is_lefthanded; // should be a move poly.Contour.reserve(polygon.contour.size() + 1); @@ -1123,10 +1123,10 @@ void SLAPrint::process() sl::translate(poly, ClipperPoint{instances[i].shift(X), instances[i].shift(Y)}); - if (flpXY) { - for(auto& p : poly.Contour) std::swap(p.X, p.Y); - for(auto& h : poly.Holes) for(auto& p : h) std::swap(p.X, p.Y); - } +// if (flpXY) { +// for(auto& p : poly.Contour) std::swap(p.X, p.Y); +// for(auto& h : poly.Holes) for(auto& p : h) std::swap(p.X, p.Y); +// } polygons.emplace_back(std::move(poly)); } @@ -1295,35 +1295,11 @@ void SLAPrint::process() auto rasterize = [this]() { if(canceled()) return; - // collect all the keys - - // If the raster has vertical orientation, we will flip the coordinates - bool flpXY = m_printer_config.display_orientation.getInt() == - SLADisplayOrientation::sladoPortrait; - { // create a raster printer for the current print parameters - // I don't know any better - auto& ocfg = m_objects.front()->m_config; - auto& matcfg = m_material_config; - auto& printcfg = m_printer_config; - - double w = printcfg.display_width.getFloat(); - double h = printcfg.display_height.getFloat(); - auto pw = unsigned(printcfg.display_pixels_x.getInt()); - auto ph = unsigned(printcfg.display_pixels_y.getInt()); - double lh = ocfg.layer_height.getFloat(); - double exp_t = matcfg.exposure_time.getFloat(); - double iexp_t = matcfg.initial_exposure_time.getFloat(); - - double gamma = m_printer_config.gamma_correction.getFloat(); - - if(flpXY) { std::swap(w, h); std::swap(pw, ph); } - - m_printer.reset( - new SLAPrinter(w, h, pw, ph, lh, exp_t, iexp_t, - flpXY? SLAPrinter::RO_PORTRAIT : - SLAPrinter::RO_LANDSCAPE, - gamma)); + double layerh = m_default_object_config.layer_height.getFloat(); + m_printer.reset(new SLAPrinter(m_printer_config, + m_material_config, + layerh)); } // Allocate space for all the layers @@ -1511,6 +1487,8 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector #include "PrintBase.hpp" -#include "PrintExport.hpp" +//#include "PrintExport.hpp" +#include "SLA/SLARasterWriter.hpp" #include "Point.hpp" #include "MTUtils.hpp" #include -#include "Zipper.hpp" namespace Slic3r { @@ -326,37 +326,6 @@ struct SLAPrintStatistics } }; -// The implementation of creating zipped archives with wxWidgets -template<> class LayerWriter { - Zipper m_zip; -public: - - LayerWriter(const std::string& zipfile_path): m_zip(zipfile_path) {} - - void next_entry(const std::string& fname) { m_zip.add_entry(fname); } - - void binary_entry(const std::string& fname, - const std::uint8_t* buf, - size_t l) - { - m_zip.add_entry(fname, buf, l); - } - - template inline LayerWriter& operator<<(T&& arg) { - m_zip << std::forward(arg); return *this; - } - - bool is_ok() const { - return true; // m_zip blows up if something goes wrong... - } - - // After finalize, no writing to the archive will have an effect. The only - // valid operation is to dispose the object calling the destructor which - // should close the file. This method can throw and signal potential errors - // when flushing the archive. This is why its present. - void finalize() { m_zip.finalize(); } -}; - /** * @brief This class is the high level FSM for the SLA printing process. * @@ -389,11 +358,10 @@ public: // Returns true if the last step was finished with success. bool finished() const override { return this->is_step_done(slaposSliceSupports) && this->Inherited::is_step_done(slapsRasterize); } - template inline void export_raster(const std::string& fpath, - const std::string& projectname = "") + const std::string& projectname = "") { - if(m_printer) m_printer->save(fpath, projectname); + if(m_printer) m_printer->save(fpath, projectname); } const PrintObjects& objects() const { return m_objects; } @@ -454,7 +422,7 @@ public: const std::vector& print_layers() const { return m_printer_input; } private: - using SLAPrinter = FilePrinter; + using SLAPrinter = sla::SLARasterWriter; using SLAPrinterPtr = std::unique_ptr; // Implement same logic as in SLAPrintObject diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 19d1bc0edc..a3e352b983 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -17,6 +17,7 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/PresetBundle.hpp" #include "slic3r/GUI/Tab.hpp" +#include "slic3r/GUI/GUI_Preview.hpp" #include "GUI_App.hpp" #include "GUI_ObjectList.hpp" #include "GUI_ObjectManipulation.hpp" @@ -1209,6 +1210,7 @@ wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar) : m_canvas(canvas) @@ -2387,8 +2389,18 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case '4': { select_view("rear"); break; } case '5': { select_view("left"); break; } case '6': { select_view("right"); break; } - case '+': { post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, +1)); break; } - case '-': { post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, -1)); break; } + case '+': { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); + else + post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, +1)); + break; } + case '-': { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); + else + post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, -1)); + break; } case '?': { post_event(SimpleEvent(EVT_GLCANVAS_QUESTION_MARK)); break; } case 'A': case 'a': { post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); break; } @@ -2472,15 +2484,10 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) else if (keyCode == WXK_LEFT || keyCode == WXK_RIGHT || keyCode == WXK_UP || - keyCode == WXK_DOWN || - keyCode == '+' || - keyCode == WXK_NUMPAD_ADD || - keyCode == '-' || - keyCode == 390 || - keyCode == WXK_DELETE || - keyCode == WXK_BACK ) + keyCode == WXK_DOWN ) { - post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt)); + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt)); } } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 96bb56bd93..fc7dddd464 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -125,6 +125,7 @@ wxDECLARE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); class GLCanvas3D { diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 310000ecc3..372cd79efb 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -499,11 +499,13 @@ void ObjectManipulation::update_if_dirty() if (selection.requires_uniform_scale()) { m_lock_bnt->SetLock(true); - m_lock_bnt->Disable(); + m_lock_bnt->SetToolTip(_(L("You cann't use non-uniform scaling mode for multiple objects/parts selection"))); + m_lock_bnt->disable(); } else { m_lock_bnt->SetLock(m_uniform_scale); - m_lock_bnt->Enable(); + m_lock_bnt->SetToolTip(wxEmptyString); + m_lock_bnt->enable(); } { diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index ec7308382a..2f5e10962e 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -420,6 +420,12 @@ void Preview::move_double_slider(wxKeyEvent& evt) m_slider->OnKeyDown(evt); } +void Preview::edit_double_slider(wxKeyEvent& evt) +{ + if (m_slider) + m_slider->OnChar(evt); +} + void Preview::bind_event_handlers() { this->Bind(wxEVT_SIZE, &Preview::on_size, this); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index ed4555f5cc..93038b0e56 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -123,6 +123,7 @@ public: void msw_rescale(); void move_double_slider(wxKeyEvent& evt); + void edit_double_slider(wxKeyEvent& evt); private: bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 7e5b3ec05a..667dcd899d 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -54,7 +54,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S #endif // _WIN32 // initialize status bar - m_statusbar = new ProgressStatusBar(this); + m_statusbar.reset(new ProgressStatusBar(this)); m_statusbar->embed(this); m_statusbar->set_status_text(_(L("Version")) + " " + SLIC3R_VERSION + @@ -103,6 +103,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S event.Veto(); return; } + + if(m_plater) m_plater->stop_jobs(); // Weird things happen as the Paint messages are floating around the windows being destructed. // Avoid the Paint messages by hiding the main window. @@ -138,6 +140,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S update_ui_from_settings(); // FIXME (?) } +MainFrame::~MainFrame() = default; + void MainFrame::update_title() { wxString title = wxEmptyString; diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index a5de947388..805b663bb2 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -89,7 +89,7 @@ protected: public: MainFrame(); - ~MainFrame() {} + ~MainFrame(); Plater* plater() { return m_plater; } @@ -126,7 +126,7 @@ public: Plater* m_plater { nullptr }; wxNotebook* m_tabpanel { nullptr }; wxProgressDialog* m_progress_dialog { nullptr }; - ProgressStatusBar* m_statusbar { nullptr }; + std::unique_ptr m_statusbar; }; } // GUI diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 84a4db9659..ff1a2db6fd 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5,9 +5,11 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -37,7 +39,12 @@ #include "libslic3r/SLA/SLARotfinder.hpp" #include "libslic3r/Utils.hpp" -#include "libnest2d/optimizers/nlopt/genetic.hpp" +//#include "libslic3r/ClipperUtils.hpp" + +// #include "libnest2d/optimizers/nlopt/genetic.hpp" +// #include "libnest2d/backends/clipper/geometries.hpp" +// #include "libnest2d/utils/rotcalipers.hpp" +#include "libslic3r/MinAreaBoundingBox.hpp" #include "GUI.hpp" #include "GUI_App.hpp" @@ -1266,8 +1273,243 @@ struct Plater::priv Preview *preview; BackgroundSlicingProcess background_process; - bool arranging; - bool rotoptimizing; + + // A class to handle UI jobs like arranging and optimizing rotation. + // These are not instant jobs, the user has to be informed about their + // state in the status progress indicator. On the other hand they are + // separated from the background slicing process. Ideally, these jobs should + // run when the background process is not running. + // + // TODO: A mechanism would be useful for blocking the plater interactions: + // objects would be frozen for the user. In case of arrange, an animation + // could be shown, or with the optimize orientations, partial results + // could be displayed. + class Job: public wxEvtHandler { + int m_range = 100; + std::future m_ftr; + priv *m_plater = nullptr; + std::atomic m_running {false}, m_canceled {false}; + bool m_finalized = false; + + void run() { + m_running.store(true); process(); m_running.store(false); + + // ensure to call the last status to finalize the job + update_status(status_range(), ""); + } + + protected: + + // status range for a particular job + virtual int status_range() const { return 100; } + + // status update, to be used from the work thread (process() method) + void update_status(int st, const wxString& msg = "") { + auto evt = new wxThreadEvent(); evt->SetInt(st); evt->SetString(msg); + wxQueueEvent(this, evt); + } + + priv& plater() { return *m_plater; } + bool was_canceled() const { return m_canceled.load(); } + + // Launched just before start(), a job can use it to prepare internals + virtual void prepare() {} + + // Launched when the job is finished. It refreshes the 3dscene by def. + virtual void finalize() { + // Do a full refresh of scene tree, including regenerating + // all the GLVolumes. FIXME The update function shall just + // reload the modified matrices. + if(! was_canceled()) + plater().update(true); + } + + public: + + Job(priv *_plater): m_plater(_plater) + { + Bind(wxEVT_THREAD, [this](const wxThreadEvent& evt){ + auto msg = evt.GetString(); + if(! msg.empty()) plater().statusbar()->set_status_text(msg); + + if(m_finalized) return; + + plater().statusbar()->set_progress(evt.GetInt()); + if(evt.GetInt() == status_range()) { + + // set back the original range and cancel callback + plater().statusbar()->set_range(m_range); + plater().statusbar()->set_cancel_callback(); + wxEndBusyCursor(); + + finalize(); + + // dont do finalization again for the same process + m_finalized = true; + } + }); + } + + // TODO: use this when we all migrated to VS2019 + // Job(const Job&) = delete; + // Job(Job&&) = default; + // Job& operator=(const Job&) = delete; + // Job& operator=(Job&&) = default; + Job(const Job&) = delete; + Job& operator=(const Job&) = delete; + Job(Job &&o) : + m_range(o.m_range), + m_ftr(std::move(o.m_ftr)), + m_plater(o.m_plater), + m_finalized(o.m_finalized) + { + m_running.store(o.m_running.load()); + m_canceled.store(o.m_canceled.load()); + } + + virtual void process() = 0; + + void start() { // Start the job. No effect if the job is already running + if(! m_running.load()) { + + prepare(); + + // Save the current status indicatior range and push the new one + m_range = plater().statusbar()->get_range(); + plater().statusbar()->set_range(status_range()); + + // init cancellation flag and set the cancel callback + m_canceled.store(false); + plater().statusbar()->set_cancel_callback( [this](){ + m_canceled.store(true); + }); + + m_finalized = false; + + // Changing cursor to busy + wxBeginBusyCursor(); + + try { // Execute the job + m_ftr = std::async(std::launch::async, &Job::run, this); + } catch(std::exception& ) { + update_status(status_range(), + _(L("ERROR: not enough resources to execute a new job."))); + } + + // The state changes will be undone when the process hits the + // last status value, in the status update handler (see ctor) + } + } + + // To wait for the running job and join the threads. False is returned + // if the timeout has been reached and the job is still running. Call + // cancel() before this fn if you want to explicitly end the job. + bool join(int timeout_ms = 0) const { + if(!m_ftr.valid()) return true; + + if(timeout_ms <= 0) + m_ftr.wait(); + else if(m_ftr.wait_for(std::chrono::milliseconds(timeout_ms)) == + std::future_status::timeout) + return false; + + return true; + } + + bool is_running() const { return m_running.load(); } + void cancel() { m_canceled.store(true); } + }; + + enum class Jobs : size_t { + Arrange, + Rotoptimize + }; + + // Jobs defined inside the group class will be managed so that only one can + // run at a time. Also, the background process will be stopped if a job is + // started. + class ExclusiveJobGroup { + + static const int ABORT_WAIT_MAX_MS = 10000; + + priv * m_plater; + + class ArrangeJob : public Job + { + int count = 0; + + protected: + void prepare() override + { + count = 0; + for (auto obj : plater().model.objects) + count += int(obj->instances.size()); + } + + public: + //using Job::Job; + ArrangeJob(priv * pltr): Job(pltr) {} + int status_range() const override { return count; } + void set_count(int c) { count = c; } + void process() override; + } arrange_job/*{m_plater}*/; + + class RotoptimizeJob : public Job + { + public: + //using Job::Job; + RotoptimizeJob(priv * pltr): Job(pltr) {} + void process() override; + } rotoptimize_job/*{m_plater}*/; + + // To create a new job, just define a new subclass of Job, implement + // the process and the optional prepare() and finalize() methods + // Register the instance of the class in the m_jobs container + // if it cannot run concurrently with other jobs in this group + + std::vector> m_jobs/*{arrange_job, + rotoptimize_job}*/; + + public: + ExclusiveJobGroup(priv *_plater) + : m_plater(_plater) + , arrange_job(m_plater) + , rotoptimize_job(m_plater) + , m_jobs({arrange_job, rotoptimize_job}) + {} + + void start(Jobs jid) { + m_plater->background_process.stop(); + stop_all(); + m_jobs[size_t(jid)].get().start(); + } + + void cancel_all() { for (Job& j : m_jobs) j.cancel(); } + + void join_all(int wait_ms = 0) + { + std::vector aborted(m_jobs.size(), false); + + for (size_t jid = 0; jid < m_jobs.size(); ++jid) + aborted[jid] = m_jobs[jid].get().join(wait_ms); + + if (!all_of(aborted)) + BOOST_LOG_TRIVIAL(error) << "Could not abort a job!"; + } + + void stop_all() { cancel_all(); join_all(ABORT_WAIT_MAX_MS); } + + const Job& get(Jobs jobid) const { return m_jobs[size_t(jobid)]; } + + bool is_any_running() const + { + return std::any_of(m_jobs.begin(), + m_jobs.end(), + [](const Job &j) { return j.is_running(); }); + } + + } m_ui_jobs{this}; + bool delayed_scene_refresh; std::string delayed_error_message; @@ -1442,8 +1684,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) { this->q->SetFont(Slic3r::GUI::wxGetApp().normal_font()); - arranging = false; - rotoptimizing = false; background_process.set_fff_print(&fff_print); background_process.set_sla_print(&sla_print); background_process.set_gcode_preview_data(&gcode_preview_data); @@ -1531,6 +1771,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&) { set_bed_shape(config->option("bed_shape")->values); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, [this](wxKeyEvent& evt) { preview->move_double_slider(evt); }); + preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_EDIT_COLOR_CHANGE, [this](wxKeyEvent& evt) { preview->edit_double_slider(evt); }); q->Bind(EVT_SLICING_COMPLETED, &priv::on_slicing_completed, this); q->Bind(EVT_PROCESS_COMPLETED, &priv::on_process_completed, this); @@ -1548,7 +1789,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) void Plater::priv::update(bool force_full_scene_refresh) { - wxWindowUpdateLocker freeze_guard(q); + // the following line, when enabled, causes flickering on NVIDIA graphics cards +// wxWindowUpdateLocker freeze_guard(q); if (get_config("autocenter") == "1") { // auto *bed_shape_opt = config->opt("bed_shape"); // const auto bed_shape = Slic3r::Polygon::new_scale(bed_shape_opt->values); @@ -1618,7 +1860,7 @@ void Plater::priv::update_ui_from_settings() ProgressStatusBar* Plater::priv::statusbar() { - return main_frame->m_statusbar; + return main_frame->m_statusbar.get(); } std::string Plater::priv::get_config(const std::string &key) const @@ -2152,59 +2394,45 @@ void Plater::priv::mirror(Axis axis) void Plater::priv::arrange() { - if (arranging) { return; } - arranging = true; - Slic3r::ScopeGuard arranging_guard([this]() { arranging = false; }); + m_ui_jobs.start(Jobs::Arrange); +} - wxBusyCursor wait; +// This method will find an optimal orientation for the currently selected item +// Very similar in nature to the arrange method above... +void Plater::priv::sla_optimize_rotation() { + m_ui_jobs.start(Jobs::Rotoptimize); +} - this->background_process.stop(); +void Plater::priv::ExclusiveJobGroup::ArrangeJob::process() { + // TODO: we should decide whether to allow arrange when the search is + // running we should probably disable explicit slicing and background + // processing - unsigned count = 0; - for(auto obj : model.objects) count += obj->instances.size(); + static const auto arrangestr = _(L("Arranging")); - auto prev_range = statusbar()->get_range(); - statusbar()->set_range(count); - - auto statusfn = [this, count] (unsigned st, const std::string& msg) { - /* // In case we would run the arrange asynchronously - wxCommandEvent event(EVT_PROGRESS_BAR); - event.SetInt(st); - event.SetString(msg); - wxQueueEvent(this->q, event.Clone()); */ - statusbar()->set_progress(count - st); - statusbar()->set_status_text(_(msg)); - - // ok, this is dangerous, but we are protected by the flag - // 'arranging' and the arrange button is also disabled. - // This call is needed for the cancel button to work. - wxYieldIfNeeded(); - }; - - statusbar()->set_cancel_callback([this, statusfn](){ - arranging = false; - statusfn(0, L("Arranging canceled")); - }); - - static const std::string arrangestr = L("Arranging"); + auto &config = plater().config; + auto &view3D = plater().view3D; + auto &model = plater().model; // FIXME: I don't know how to obtain the minimum distance, it depends // on printer technology. I guess the following should work but it crashes. - double dist = 6; //PrintConfig::min_object_distance(config); - if(printer_technology == ptFFF) { + double dist = 6; // PrintConfig::min_object_distance(config); + if (plater().printer_technology == ptFFF) { dist = PrintConfig::min_object_distance(config); } - auto min_obj_distance = coord_t(dist/SCALING_FACTOR); + auto min_obj_distance = coord_t(dist / SCALING_FACTOR); - const auto *bed_shape_opt = config->opt("bed_shape"); + const auto *bed_shape_opt = config->opt( + "bed_shape"); assert(bed_shape_opt); - auto& bedpoints = bed_shape_opt->values; - Polyline bed; bed.points.reserve(bedpoints.size()); - for(auto& v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); + auto & bedpoints = bed_shape_opt->values; + Polyline bed; + bed.points.reserve(bedpoints.size()); + for (auto &v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); - statusfn(0, arrangestr); + update_status(0, arrangestr); arr::WipeTowerInfo wti = view3D->get_canvas3d()->get_wipe_tower_info(); @@ -2220,129 +2448,87 @@ void Plater::priv::arrange() bed, hint, false, // create many piles not just one pile - [statusfn](unsigned st) { statusfn(st, arrangestr); }, - [this] () { return !arranging; }); - } catch(std::exception& /*e*/) { - GUI::show_error(this->q, L("Could not arrange model objects! " - "Some geometries may be invalid.")); + [this](unsigned st) { + if (st > 0) + update_status(count - int(st), arrangestr); + }, + [this]() { return was_canceled(); }); + } catch (std::exception & /*e*/) { + GUI::show_error(plater().q, + L("Could not arrange model objects! " + "Some geometries may be invalid.")); } + update_status(count, + was_canceled() ? _(L("Arranging canceled.")) + : _(L("Arranging done."))); + // it remains to move the wipe tower: view3D->get_canvas3d()->arrange_wipe_tower(wti); - - statusfn(0, L("Arranging done.")); - statusbar()->set_range(prev_range); - statusbar()->set_cancel_callback(); // remove cancel button - - // Do a full refresh of scene tree, including regenerating all the GLVolumes. - //FIXME The update function shall just reload the modified matrices. - update(true); } -// This method will find an optimal orientation for the currently selected item -// Very similar in nature to the arrange method above... -void Plater::priv::sla_optimize_rotation() { - - // TODO: we should decide whether to allow arrange when the search is - // running we should probably disable explicit slicing and background - // processing - - if (rotoptimizing) { return; } - rotoptimizing = true; - Slic3r::ScopeGuard rotoptimizing_guard([this]() { rotoptimizing = false; }); - - int obj_idx = get_selected_object_idx(); +void Plater::priv::ExclusiveJobGroup::RotoptimizeJob::process() +{ + int obj_idx = plater().get_selected_object_idx(); if (obj_idx < 0) { return; } - ModelObject * o = model.objects[size_t(obj_idx)]; - - background_process.stop(); - - auto prev_range = statusbar()->get_range(); - statusbar()->set_range(100); - - auto stfn = [this] (unsigned st, const std::string& msg) { - statusbar()->set_progress(int(st)); - statusbar()->set_status_text(msg); - - // could be problematic, but we need the cancel button. - wxYieldIfNeeded(); - }; - - statusbar()->set_cancel_callback([this, stfn](){ - rotoptimizing = false; - stfn(0, L("Orientation search canceled")); - }); + ModelObject *o = plater().model.objects[size_t(obj_idx)]; auto r = sla::find_best_rotation( - *o, .005f, - [stfn](unsigned s) { stfn(s, L("Searching for optimal orientation")); }, - [this](){ return !rotoptimizing; } - ); + *o, + .005f, + [this](unsigned s) { + if (s < 100) + update_status(int(s), + _(L("Searching for optimal orientation"))); + }, + [this]() { return was_canceled(); }); - const auto *bed_shape_opt = config->opt("bed_shape"); + const auto *bed_shape_opt = + plater().config->opt("bed_shape"); + assert(bed_shape_opt); - auto& bedpoints = bed_shape_opt->values; - Polyline bed; bed.points.reserve(bedpoints.size()); - for(auto& v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); + auto & bedpoints = bed_shape_opt->values; + Polyline bed; + bed.points.reserve(bedpoints.size()); + for (auto &v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); double mindist = 6.0; // FIXME - double offs = mindist / 2.0 - EPSILON; - - if(rotoptimizing) // wasn't canceled - for(ModelInstance * oi : o->instances) { - oi->set_rotation({r[X], r[Y], r[Z]}); - - auto trchull = o->convex_hull_2d(oi->get_transformation().get_matrix()); - - namespace opt = libnest2d::opt; - opt::StopCriteria stopcr; - stopcr.relative_score_difference = 0.01; - stopcr.max_iterations = 10000; - stopcr.stop_score = 0.0; - opt::GeneticOptimizer solver(stopcr); - Polygon pbed(bed); - - auto bin = pbed.bounding_box(); - double binw = bin.size()(X) * SCALING_FACTOR - offs; - double binh = bin.size()(Y) * SCALING_FACTOR - offs; - - auto result = solver.optimize_min([&trchull, binw, binh](double rot){ - auto chull = trchull; - chull.rotate(rot); - - auto bb = chull.bounding_box(); - double bbw = bb.size()(X) * SCALING_FACTOR; - double bbh = bb.size()(Y) * SCALING_FACTOR; - - auto wdiff = bbw - binw; - auto hdiff = bbh - binh; - double diff = 0; - if(wdiff < 0 && hdiff < 0) diff = wdiff + hdiff; - if(wdiff > 0) diff += wdiff; - if(hdiff > 0) diff += hdiff; - - return diff; - }, opt::initvals(0.0), opt::bound(-PI/2, PI/2)); - - double r = std::get<0>(result.optimum); - - Vec3d rt = oi->get_rotation(); rt(Z) += r; - oi->set_rotation(rt); + + if (!was_canceled()) { + for(ModelInstance * oi : o->instances) { + oi->set_rotation({r[X], r[Y], r[Z]}); + + auto trmatrix = oi->get_transformation().get_matrix(); + Polygon trchull = o->convex_hull_2d(trmatrix); + + MinAreaBoundigBox rotbb(trchull, MinAreaBoundigBox::pcConvex); + double r = rotbb.angle_to_X(); + + // The box should be landscape + if(rotbb.width() < rotbb.height()) r += PI / 2; + + Vec3d rt = oi->get_rotation(); rt(Z) += r; + + oi->set_rotation(rt); + } + + arr::WipeTowerInfo wti; // useless in SLA context + arr::find_new_position(plater().model, + o->instances, + coord_t(mindist / SCALING_FACTOR), + bed, + wti); + + // Correct the z offset of the object which was corrupted be + // the rotation + o->ensure_on_bed(); } - arr::WipeTowerInfo wti; // useless in SLA context - arr::find_new_position(model, o->instances, coord_t(mindist/SCALING_FACTOR), bed, wti); - - // Correct the z offset of the object which was corrupted be the rotation - o->ensure_on_bed(); - - stfn(0, L("Orientation found.")); - statusbar()->set_range(prev_range); - statusbar()->set_cancel_callback(); - - update(true); + update_status(100, + was_canceled() ? _(L("Orientation search canceled.")) + : _(L("Orientation found."))); } void Plater::priv::split_object() @@ -2523,7 +2709,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation) // Restart background processing thread based on a bitmask of UpdateBackgroundProcessReturnState. bool Plater::priv::restart_background_process(unsigned int state) { - if (arranging || rotoptimizing) { + if (m_ui_jobs.is_any_running()) { // Avoid a race condition return false; } @@ -2760,7 +2946,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) { if (evt.status.percent >= -1) { - if (arranging || rotoptimizing) { + if (m_ui_jobs.is_any_running()) { // Avoid a race condition return; } @@ -3245,7 +3431,7 @@ bool Plater::priv::can_fix_through_netfabb() const bool Plater::priv::can_increase_instances() const { - if (arranging || rotoptimizing) { + if (m_ui_jobs.is_any_running()) { return false; } @@ -3255,7 +3441,7 @@ bool Plater::priv::can_increase_instances() const bool Plater::priv::can_decrease_instances() const { - if (arranging || rotoptimizing) { + if (m_ui_jobs.is_any_running()) { return false; } @@ -3275,7 +3461,7 @@ bool Plater::priv::can_split_to_volumes() const bool Plater::priv::can_arrange() const { - return !model.objects.empty() && !arranging; + return !model.objects.empty() && !m_ui_jobs.is_any_running(); } bool Plater::priv::can_layers_editing() const @@ -3342,6 +3528,7 @@ SLAPrint& Plater::sla_print() { return p->sla_print; } void Plater::new_project() { + p->select_view_3D("3D"); wxPostEvent(p->view3D->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); } @@ -3402,6 +3589,8 @@ void Plater::load_files(const std::vector& input_files, bool load_m void Plater::update() { p->update(); } +void Plater::stop_jobs() { p->m_ui_jobs.stop_all(); } + void Plater::update_ui_from_settings() { p->update_ui_from_settings(); } void Plater::select_view(const std::string& direction) { p->select_view(direction); } @@ -3708,7 +3897,7 @@ void Plater::export_3mf(const boost::filesystem::path& output_path) if (!path.Lower().EndsWith(".3mf")) return; - DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure(); + DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure(); const std::string path_u8 = into_u8(path); wxBusyCursor wait; if (Slic3r::store_3mf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr)) { @@ -3724,6 +3913,9 @@ void Plater::export_3mf(const boost::filesystem::path& output_path) void Plater::reslice() { + // Stop arrange and (or) optimize rotation tasks. + this->stop_jobs(); + //FIXME Don't reslice if export of G-code or sending to OctoPrint is running. // bitmask of UpdateBackgroundProcessReturnState unsigned int state = this->p->update_background_process(true); @@ -3759,7 +3951,7 @@ void Plater::reslice_SLA_supports(const ModelObject &object) if (state & priv::UPDATE_BACKGROUND_PROCESS_REFRESH_SCENE) this->p->view3D->reload_scene(false); - if (this->p->background_process.empty() || (state & priv::UPDATE_BACKGROUND_PROCESS_INVALID)) + if (this->p->background_process.empty() || (state & priv::UPDATE_BACKGROUND_PROCESS_INVALID)) // Nothing to do on empty input or invalid configuration. return; diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 3e50797a63..28043c9447 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -146,6 +146,7 @@ public: void load_files(const std::vector& input_files, bool load_model = true, bool load_config = true); void update(); + void stop_jobs(); void select_view(const std::string& direction); void select_view_3D(const std::string& name); diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 22ddf3449e..7192d485ca 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -509,6 +509,7 @@ const std::vector& Preset::sla_printer_options() "printer_technology", "bed_shape", "max_print_height", "display_width", "display_height", "display_pixels_x", "display_pixels_y", + "display_mirror_x", "display_mirror_y", "display_orientation", "fast_tilt_time", "slow_tilt_time", "area_fill", "relative_correction", diff --git a/src/slic3r/GUI/ProgressStatusBar.cpp b/src/slic3r/GUI/ProgressStatusBar.cpp index b48c5732b5..f848e663d2 100644 --- a/src/slic3r/GUI/ProgressStatusBar.cpp +++ b/src/slic3r/GUI/ProgressStatusBar.cpp @@ -168,6 +168,11 @@ void ProgressStatusBar::set_status_text(const char *txt) this->set_status_text(wxString::FromUTF8(txt)); } +wxString ProgressStatusBar::get_status_text() const +{ + return self->GetStatusText(); +} + void ProgressStatusBar::show_cancel_button() { if(m_cancelbutton) m_cancelbutton->Show(); diff --git a/src/slic3r/GUI/ProgressStatusBar.hpp b/src/slic3r/GUI/ProgressStatusBar.hpp index 8c65964758..7d624af90b 100644 --- a/src/slic3r/GUI/ProgressStatusBar.hpp +++ b/src/slic3r/GUI/ProgressStatusBar.hpp @@ -52,6 +52,7 @@ public: void set_status_text(const wxString& txt); void set_status_text(const std::string& txt); void set_status_text(const char *txt); + wxString get_status_text() const; // Temporary methods to satisfy Perl side void show_cancel_button(); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 6ab762c610..ef3878b5a9 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2087,6 +2087,10 @@ void TabPrinter::build_sla() line.append_option(optgroup->get_option("display_pixels_y")); optgroup->append_line(line); optgroup->append_single_option_line("display_orientation"); + + // FIXME: This should be on one line in the UI + optgroup->append_single_option_line("display_mirror_x"); + optgroup->append_single_option_line("display_mirror_y"); optgroup = page->new_optgroup(_(L("Tilt"))); line = { _(L("Tilt time")), "" }; diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index c23caa6c8c..c037a56183 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -1785,6 +1785,7 @@ DoubleSlider::DoubleSlider( wxWindow *parent, // slider events Bind(wxEVT_PAINT, &DoubleSlider::OnPaint, this); + Bind(wxEVT_CHAR, &DoubleSlider::OnChar, this); Bind(wxEVT_LEFT_DOWN, &DoubleSlider::OnLeftDown, this); Bind(wxEVT_MOTION, &DoubleSlider::OnMotion, this); Bind(wxEVT_LEFT_UP, &DoubleSlider::OnLeftUp, this); @@ -2564,9 +2565,9 @@ void DoubleSlider::OnWheel(wxMouseEvent& event) void DoubleSlider::OnKeyDown(wxKeyEvent &event) { const int key = event.GetKeyCode(); - if (key == '+' || key == WXK_NUMPAD_ADD) + if (key == WXK_NUMPAD_ADD) action_tick(taAdd); - else if (key == '-' || key == 390 || key == WXK_DELETE || key == WXK_BACK) + else if (key == 390 || key == WXK_DELETE || key == WXK_BACK) action_tick(taDel); else if (is_horizontal()) { @@ -2585,6 +2586,8 @@ void DoubleSlider::OnKeyDown(wxKeyEvent &event) else if (key == WXK_UP || key == WXK_DOWN) move_current_thumb(key == WXK_UP); } + + event.Skip(); // !Needed to have EVT_CHAR generated as well } void DoubleSlider::OnKeyUp(wxKeyEvent &event) @@ -2596,6 +2599,15 @@ void DoubleSlider::OnKeyUp(wxKeyEvent &event) event.Skip(); } +void DoubleSlider::OnChar(wxKeyEvent& event) +{ + const int key = event.GetKeyCode(); + if (key == '+') + action_tick(taAdd); + else if (key == '-') + action_tick(taDel); +} + void DoubleSlider::OnRightDown(wxMouseEvent& event) { this->CaptureMouse(); @@ -2658,6 +2670,9 @@ LockButton::LockButton( wxWindow *parent, void LockButton::OnButton(wxCommandEvent& event) { + if (m_disabled) + return; + m_is_pushed = !m_is_pushed; enter_button(true); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 1ed5770bb6..3dfb94e4ad 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -751,6 +751,7 @@ public: void OnWheel(wxMouseEvent& event); void OnKeyDown(wxKeyEvent &event); void OnKeyUp(wxKeyEvent &event); + void OnChar(wxKeyEvent &event); void OnRightDown(wxMouseEvent& event); void OnRightUp(wxMouseEvent& event); @@ -861,9 +862,13 @@ public: void OnEnterBtn(wxMouseEvent& event) { enter_button(true); event.Skip(); } void OnLeaveBtn(wxMouseEvent& event) { enter_button(false); event.Skip(); } - bool IsLocked() const { return m_is_pushed; } + bool IsLocked() const { return m_is_pushed; } void SetLock(bool lock); + // create its own Enable/Disable functions to not really disabled button because of tooltip enabling + void enable() { m_disabled = false; } + void disable() { m_disabled = true; } + void msw_rescale(); protected: @@ -871,6 +876,7 @@ protected: private: bool m_is_pushed = false; + bool m_disabled = false; ScalableBitmap m_bmp_lock_on; ScalableBitmap m_bmp_lock_off;