From 4751f700261e0116dd289ab392a1de4857a9d1e9 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Thu, 14 Sep 2023 06:55:17 -0700 Subject: [PATCH] Export SdfLib patch to GitHub. PiperOrigin-RevId: 565354963 Change-Id: I10089d8abf85617d8e34da35c4bf4bfcb0a3684b --- cmake/sdflib-optional-dependencies.patch | 544 +++++++++++++++++++++++ 1 file changed, 544 insertions(+) create mode 100644 cmake/sdflib-optional-dependencies.patch diff --git a/cmake/sdflib-optional-dependencies.patch b/cmake/sdflib-optional-dependencies.patch new file mode 100644 index 00000000..2ec2ed04 --- /dev/null +++ b/cmake/sdflib-optional-dependencies.patch @@ -0,0 +1,544 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 20551cf..9145032 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -70,14 +70,21 @@ add_custom_target(copyShaders ALL SOURCES ${SHADER_FILES}) + # Add dependencies + add_subdirectory(libs) + ++if(SDFLIB_USE_ENOKI) ++ target_link_libraries(${PROJECT_NAME} PUBLIC enoki) ++ target_link_libraries(${PROJECT_NAME} PUBLIC fcpw) ++ target_compile_definitions(${PROJECT_NAME} PUBLIC -DENOKI_AVAILABLE) ++endif() ++ ++if(SDFLIB_USE_ASSIMP) ++ target_link_libraries(${PROJECT_NAME} PUBLIC assimp) ++ target_compile_definitions(${PROJECT_NAME} PUBLIC -DASSIMP_AVAILABLE) ++endif() ++ + target_link_libraries(${PROJECT_NAME} PUBLIC glm) +-target_link_libraries(${PROJECT_NAME} PUBLIC assimp) + target_link_libraries(${PROJECT_NAME} PUBLIC args) + target_link_libraries(${PROJECT_NAME} PUBLIC spdlog) + target_link_libraries(${PROJECT_NAME} PUBLIC cereal) +-target_link_libraries(${PROJECT_NAME} PUBLIC enoki) +-target_link_libraries(${PROJECT_NAME} PUBLIC eigen) +-target_link_libraries(${PROJECT_NAME} PUBLIC fcpw) + target_link_libraries(${PROJECT_NAME} PUBLIC stb_image) + target_link_libraries(${PROJECT_NAME} PUBLIC icg) + +@@ -86,17 +93,22 @@ if(CMAKE_CXX_COMPILER_ID MATCHES GNU) + endif() + + # Add openMP +-if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") +- message("Enabling openmp llvm extension") +- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp:llvm") +-else() +- find_package(OpenMP) +- if(NOT OpenMP_CXX_FOUND) +- message(FATAL_ERROR "OpenMP not found") +- endif() +- message("OpenMP version ${OpenMP_CXX_VERSION}") +- target_link_libraries(${PROJECT_NAME} PUBLIC OpenMP::OpenMP_CXX) +-endif() ++if(SDFLIB_USE_OPENMP) ++ if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") ++ message("Enabling openmp llvm extension") ++ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp:llvm") ++ target_compile_definitions(${PROJECT_NAME} PUBLIC -DOPENMP_AVAILABLE) ++ else() ++ find_package(OpenMP) ++ if(OpenMP_CXX_FOUND) ++ message("OpenMP version ${OpenMP_CXX_VERSION}") ++ target_link_libraries(${PROJECT_NAME} PUBLIC OpenMP::OpenMP_CXX) ++ target_compile_definitions(${PROJECT_NAME} PUBLIC -DOPENMP_AVAILABLE) ++ else() ++ message("Disabling openmp") ++ endif() ++ endif() ++endif() + + # Add executable + if (NOT UNIX) +@@ -160,6 +172,7 @@ if(SDFLIB_BUILD_DEBUG_APPS) + add_executable(GJKtest src/tools/GJKtest/main.cpp) + target_link_libraries(GJKtest PUBLIC ${PROJECT_NAME}) + ++ target_link_libraries(${PROJECT_NAME} PUBLIC eigen) + add_executable(CalculateInterpolationParameters src/tools/CalculateInterpolationParameters/main.cpp) + target_link_libraries(CalculateInterpolationParameters PUBLIC ${PROJECT_NAME}) + +diff --git a/include/SdfLib/ExactOctreeSdf.h b/include/SdfLib/ExactOctreeSdf.h +index 79ad82d..06dd7ac 100644 +--- a/include/SdfLib/ExactOctreeSdf.h ++++ b/include/SdfLib/ExactOctreeSdf.h +@@ -214,6 +214,8 @@ private: + }; + } + ++#ifdef OPENMP_AVAILABLE + #include "ExactOctreeSdfDepthFirst.h" ++#endif + + #endif +\ No newline at end of file +diff --git a/include/SdfLib/InterpolationMethods.h b/include/SdfLib/InterpolationMethods.h +index 077dfb2..f707d5b 100644 +--- a/include/SdfLib/InterpolationMethods.h ++++ b/include/SdfLib/InterpolationMethods.h +@@ -4,7 +4,10 @@ + #include + + #include "utils/TriangleUtils.h" ++ ++#ifdef ENOKI_AVAILABLE + #include "enoki/array.h" ++#endif + + namespace sdflib + { +@@ -236,15 +239,6 @@ struct TriLinearInterpolation + // outCoeff[63] = 8 * inValues[0][0] + 4 * inValues[0][1] * nodeSize + 4 * inValues[0][2] * nodeSize + 4 * inValues[0][3] * nodeSize + -8 * inValues[1][0] + 4 * inValues[1][1] * nodeSize + -4 * inValues[1][2] * nodeSize + -4 * inValues[1][3] * nodeSize + -8 * inValues[2][0] + -4 * inValues[2][1] * nodeSize + 4 * inValues[2][2] * nodeSize + -4 * inValues[2][3] * nodeSize + 8 * inValues[3][0] + -4 * inValues[3][1] * nodeSize + -4 * inValues[3][2] * nodeSize + 4 * inValues[3][3] * nodeSize + -8 * inValues[4][0] + -4 * inValues[4][1] * nodeSize + -4 * inValues[4][2] * nodeSize + 4 * inValues[4][3] * nodeSize + 8 * inValues[5][0] + -4 * inValues[5][1] * nodeSize + 4 * inValues[5][2] * nodeSize + -4 * inValues[5][3] * nodeSize + 8 * inValues[6][0] + 4 * inValues[6][1] * nodeSize + -4 * inValues[6][2] * nodeSize + -4 * inValues[6][3] * nodeSize + -8 * inValues[7][0] + 4 * inValues[7][1] * nodeSize + 4 * inValues[7][2] * nodeSize + 4 * inValues[7][3] * nodeSize + 0.0f; + // } + +-// inline static float interpolateValue(const std::array& values, glm::vec3 fracPart) +-// { +-// return 0.0f +-// + values[0] + values[1] * fracPart[0] + values[2] * fracPart[0] * fracPart[0] + values[3] * fracPart[0] * fracPart[0] * fracPart[0] + values[4] * fracPart[1] + values[5] * fracPart[0] * fracPart[1] + values[6] * fracPart[0] * fracPart[0] * fracPart[1] + values[7] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] + values[8] * fracPart[1] * fracPart[1] + values[9] * fracPart[0] * fracPart[1] * fracPart[1] + values[10] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] + values[11] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] + values[12] * fracPart[1] * fracPart[1] * fracPart[1] + values[13] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] + values[14] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] + values[15] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] +-// + values[16] * fracPart[2] + values[17] * fracPart[0] * fracPart[2] + values[18] * fracPart[0] * fracPart[0] * fracPart[2] + values[19] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[2] + values[20] * fracPart[1] * fracPart[2] + values[21] * fracPart[0] * fracPart[1] * fracPart[2] + values[22] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] + values[23] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] + values[24] * fracPart[1] * fracPart[1] * fracPart[2] + values[25] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] + values[26] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] + values[27] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] + values[28] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] + values[29] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] + values[30] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] + values[31] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] +-// + values[32] * fracPart[2] * fracPart[2] + values[33] * fracPart[0] * fracPart[2] * fracPart[2] + values[34] * fracPart[0] * fracPart[0] * fracPart[2] * fracPart[2] + values[35] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[2] * fracPart[2] + values[36] * fracPart[1] * fracPart[2] * fracPart[2] + values[37] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] + values[38] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] + values[39] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] + values[40] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[41] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[42] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[43] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[44] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[45] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[46] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[47] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] +-// + values[48] * fracPart[2] * fracPart[2] * fracPart[2] + values[49] * fracPart[0] * fracPart[2] * fracPart[2] * fracPart[2] + values[50] * fracPart[0] * fracPart[0] * fracPart[2] * fracPart[2] * fracPart[2] + values[51] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[2] * fracPart[2] * fracPart[2] + values[52] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[53] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[54] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[55] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[56] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[57] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[58] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[59] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[60] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[61] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[62] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[63] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2]; +-// } +- + // inline static void interpolateVertexValues(const std::array& values, glm::vec3 fracPart, float nodeSize, std::array& outValues) + // { + // outValues[0] = 0.0f +@@ -383,6 +377,7 @@ struct TriCubicInterpolation + outCoeff[63] = 8 * inValues[0][0] + 4 * inValues[0][1] + 4 * inValues[0][2] + 4 * inValues[0][3] + 2 * inValues[0][4] + 2 * inValues[0][5] + 2 * inValues[0][6] + 1 * inValues[0][7] + -8 * inValues[1][0] + 4 * inValues[1][1] + -4 * inValues[1][2] + -4 * inValues[1][3] + 2 * inValues[1][4] + 2 * inValues[1][5] + -2 * inValues[1][6] + 1 * inValues[1][7] + -8 * inValues[2][0] + -4 * inValues[2][1] + 4 * inValues[2][2] + -4 * inValues[2][3] + 2 * inValues[2][4] + -2 * inValues[2][5] + 2 * inValues[2][6] + 1 * inValues[2][7] + 8 * inValues[3][0] + -4 * inValues[3][1] + -4 * inValues[3][2] + 4 * inValues[3][3] + 2 * inValues[3][4] + -2 * inValues[3][5] + -2 * inValues[3][6] + 1 * inValues[3][7] + -8 * inValues[4][0] + -4 * inValues[4][1] + -4 * inValues[4][2] + 4 * inValues[4][3] + -2 * inValues[4][4] + 2 * inValues[4][5] + 2 * inValues[4][6] + 1 * inValues[4][7] + 8 * inValues[5][0] + -4 * inValues[5][1] + 4 * inValues[5][2] + -4 * inValues[5][3] + -2 * inValues[5][4] + 2 * inValues[5][5] + -2 * inValues[5][6] + 1 * inValues[5][7] + 8 * inValues[6][0] + 4 * inValues[6][1] + -4 * inValues[6][2] + -4 * inValues[6][3] + -2 * inValues[6][4] + -2 * inValues[6][5] + 2 * inValues[6][6] + 1 * inValues[6][7] + -8 * inValues[7][0] + 4 * inValues[7][1] + 4 * inValues[7][2] + 4 * inValues[7][3] + -2 * inValues[7][4] + -2 * inValues[7][5] + -2 * inValues[7][6] + 1 * inValues[7][7]; + } + ++#ifdef ENOKI_AVAILABLE + using vec4 = enoki::Array; + + inline static float interpolateValue(const std::array& values, glm::vec3 fracPart) +@@ -433,6 +428,16 @@ struct TriCubicInterpolation + + return sum; + } ++#else ++ inline static float interpolateValue(const std::array& values, glm::vec3 fracPart) ++ { ++ return 0.0f ++ + values[0] + values[1] * fracPart[0] + values[2] * fracPart[0] * fracPart[0] + values[3] * fracPart[0] * fracPart[0] * fracPart[0] + values[4] * fracPart[1] + values[5] * fracPart[0] * fracPart[1] + values[6] * fracPart[0] * fracPart[0] * fracPart[1] + values[7] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] + values[8] * fracPart[1] * fracPart[1] + values[9] * fracPart[0] * fracPart[1] * fracPart[1] + values[10] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] + values[11] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] + values[12] * fracPart[1] * fracPart[1] * fracPart[1] + values[13] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] + values[14] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] + values[15] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] ++ + values[16] * fracPart[2] + values[17] * fracPart[0] * fracPart[2] + values[18] * fracPart[0] * fracPart[0] * fracPart[2] + values[19] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[2] + values[20] * fracPart[1] * fracPart[2] + values[21] * fracPart[0] * fracPart[1] * fracPart[2] + values[22] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] + values[23] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] + values[24] * fracPart[1] * fracPart[1] * fracPart[2] + values[25] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] + values[26] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] + values[27] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] + values[28] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] + values[29] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] + values[30] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] + values[31] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] ++ + values[32] * fracPart[2] * fracPart[2] + values[33] * fracPart[0] * fracPart[2] * fracPart[2] + values[34] * fracPart[0] * fracPart[0] * fracPart[2] * fracPart[2] + values[35] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[2] * fracPart[2] + values[36] * fracPart[1] * fracPart[2] * fracPart[2] + values[37] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] + values[38] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] + values[39] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] + values[40] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[41] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[42] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[43] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[44] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[45] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[46] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] + values[47] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] ++ + values[48] * fracPart[2] * fracPart[2] * fracPart[2] + values[49] * fracPart[0] * fracPart[2] * fracPart[2] * fracPart[2] + values[50] * fracPart[0] * fracPart[0] * fracPart[2] * fracPart[2] * fracPart[2] + values[51] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[2] * fracPart[2] * fracPart[2] + values[52] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[53] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[54] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[55] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[56] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[57] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[58] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[59] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[60] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[61] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[62] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2] + values[63] * fracPart[0] * fracPart[0] * fracPart[0] * fracPart[1] * fracPart[1] * fracPart[1] * fracPart[2] * fracPart[2] * fracPart[2]; ++ } ++#endif + + inline static glm::vec3 interpolateGradient(const std::array& values, glm::vec3 fracPart) + { +@@ -493,4 +498,4 @@ struct TriCubicInterpolation + }; + } + +-#endif +\ No newline at end of file ++#endif +diff --git a/include/SdfLib/TrianglesInfluence.h b/include/SdfLib/TrianglesInfluence.h +index 3f3d33f..fc2ca52 100644 +--- a/include/SdfLib/TrianglesInfluence.h ++++ b/include/SdfLib/TrianglesInfluence.h +@@ -1,7 +1,10 @@ + #ifndef TRIANGLES_INFLUENCE_H + #define TRIANGLES_INFLUENCE_H + ++#ifdef ENOKI_AVAILABLE + #include ++#endif ++ + #include "utils/Mesh.h" + #include "utils/TriangleUtils.h" + #include "OctreeSdfUtils.h" +@@ -1008,6 +1011,7 @@ struct VHQueries + } + }; + ++#ifdef ENOKI_AVAILABLE + template + struct FCPWQueries + { +@@ -1118,6 +1122,8 @@ struct FCPWQueries + { + } + }; ++#endif ++ + } + +-#endif +\ No newline at end of file ++#endif +diff --git a/include/SdfLib/utils/Mesh.h b/include/SdfLib/utils/Mesh.h +index 28d5486..7d21e44 100644 +--- a/include/SdfLib/utils/Mesh.h ++++ b/include/SdfLib/utils/Mesh.h +@@ -4,9 +4,11 @@ + #include + #include + #include ++#ifdef ASSIMP_AVAILABLE + #include + #include + #include ++#endif + #include "SdfLib/utils/UsefullSerializations.h" + + namespace sdflib +@@ -43,6 +45,23 @@ struct BoundingBox + return glm::length(glm::max(q,glm::vec3(0.0f))) + glm::min(glm::max(q.x, glm::max(q.y,q.z)),0.0f); + } + ++ float getDistance(glm::vec3 point, glm::vec3& outGradient) const ++ { ++ glm::vec3 a = glm::abs(point) - getSize(); ++ int k = a[0] > a[1] ? 0 : 1; ++ int l = a[2] > a[k] ? 2 : k; ++ if (a[l] < 0) { ++ outGradient[l] = point[l] / glm::abs(point[l]); ++ } else { ++ glm::vec3 b = glm::max(a, glm::vec3(0.0f)); ++ float c = glm::length(b); ++ outGradient[0] = a[0] > 0 ? b[0] / c * point[0] / glm::abs(point[0]) : 0; ++ outGradient[1] = a[1] > 0 ? b[1] / c * point[1] / glm::abs(point[1]) : 0; ++ outGradient[2] = a[2] > 0 ? b[2] / c * point[2] / glm::abs(point[2]) : 0; ++ } ++ return getDistance(point); ++ } ++ + template + void serialize(Archive & archive) + { +@@ -54,8 +73,10 @@ class Mesh + { + public: + Mesh() {} ++#ifdef ASSIMP_AVAILABLE + Mesh(std::string filePath); + Mesh(const aiMesh* mesh); ++#endif + Mesh(glm::vec3* vertices, uint32_t numVertices, + uint32_t* indices, uint32_t numIndices); + +@@ -74,7 +95,9 @@ public: + void computeNormals(); + void applyTransform(glm::mat4 trans); + private: ++#ifdef ASSIMP_AVAILABLE + void initMesh(const aiMesh* mesh); ++#endif + + std::vector mVertices; + std::vector mIndices; +@@ -83,4 +106,4 @@ private: + }; + } + +-#endif +\ No newline at end of file ++#endif +diff --git a/include/SdfLib/utils/TriangleUtils.h b/include/SdfLib/utils/TriangleUtils.h +index 9f930ed..6ee2304 100644 +--- a/include/SdfLib/utils/TriangleUtils.h ++++ b/include/SdfLib/utils/TriangleUtils.h +@@ -2,6 +2,7 @@ + #define TRIANGLE_UTILS_H + + #include ++#include + #include + #include + #include +@@ -401,4 +402,4 @@ namespace TriangleUtils + } + } + +-#endif +\ No newline at end of file ++#endif +diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt +index b48bf39..3f143c8 100644 +--- a/libs/CMakeLists.txt ++++ b/libs/CMakeLists.txt +@@ -14,23 +14,25 @@ if(NOT glm_lib_POPULATED) + endif() + + # assimp +-FetchContent_Declare(assimp_lib +- GIT_REPOSITORY https://github.com/assimp/assimp.git +- GIT_TAG 9519a62dd20799c5493c638d1ef5a6f484e5faf1 # 5.2.5 +-) +- +-if(NOT assimp_lib) +- FetchContent_Populate(assimp_lib) +- +- set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) +- set(BUILD_SHARED_LIBS OFF) +- set(ASSIMP_BUILD_ASSIMP_TOOLS OFF) +- set(ASSIMP_BUILD_TESTS OFF) +- set(ASSIMP_INSTALL OFF) +- set(ASSIMP_INJECT_DEBUG_POSTFIX OFF) +- set(ASSIMP_BUILD_ASSIMP_VIEW OFF) ++if(SDF_USE_ASSIMP) ++ FetchContent_Declare(assimp_lib ++ GIT_REPOSITORY https://github.com/assimp/assimp.git ++ GIT_TAG 9519a62dd20799c5493c638d1ef5a6f484e5faf1 # 5.2.5 ++ ) + +- add_subdirectory(${assimp_lib_SOURCE_DIR} ${assimp_lib_BINARY_DIR}) ++ if(NOT assimp_lib) ++ FetchContent_Populate(assimp_lib) ++ ++ set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) ++ set(BUILD_SHARED_LIBS OFF) ++ set(ASSIMP_BUILD_ASSIMP_TOOLS OFF) ++ set(ASSIMP_BUILD_TESTS OFF) ++ set(ASSIMP_INSTALL OFF) ++ set(ASSIMP_INJECT_DEBUG_POSTFIX OFF) ++ set(ASSIMP_BUILD_ASSIMP_VIEW OFF) ++ ++ add_subdirectory(${assimp_lib_SOURCE_DIR} ${assimp_lib_BINARY_DIR}) ++ endif() + endif() + + # args +@@ -76,43 +78,47 @@ if(NOT cereal_lib_POPULATED) + endif() + + # Enoki +-FetchContent_Declare(enoki_lib +- GIT_REPOSITORY https://github.com/mitsuba-renderer/enoki.git +- GIT_TAG 2a18afa +-) +-FetchContent_GetProperties(enoki_lib) +-if(NOT enoki_lib_POPULATED) +- FetchContent_Populate(enoki_lib) +- add_library(enoki INTERFACE) +- add_subdirectory(${enoki_lib_SOURCE_DIR} ${enoki_lib_BINARY_DIR}) +- target_include_directories(enoki INTERFACE ${enoki_lib_SOURCE_DIR}/include) +-endif() +- +-# eigen +-FetchContent_Declare(eigen_lib +-GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git +-GIT_TAG 46126273552afe13692929523d34006f54c19719 # 3.4 +-) ++if(SDFLIB_USE_ENOKI) ++ FetchContent_Declare(enoki_lib ++ GIT_REPOSITORY https://github.com/mitsuba-renderer/enoki.git ++ GIT_TAG 2a18afa ++ ) ++ FetchContent_GetProperties(enoki_lib) ++ if(NOT enoki_lib_POPULATED) ++ FetchContent_Populate(enoki_lib) ++ add_library(enoki INTERFACE) ++ add_subdirectory(${enoki_lib_SOURCE_DIR} ${enoki_lib_BINARY_DIR}) ++ target_include_directories(enoki INTERFACE ${enoki_lib_SOURCE_DIR}/include) ++ endif() + +-FetchContent_GetProperties(eigen_lib) +-if(NOT eigen_lib_POPULATED) +- FetchContent_Populate(eigen_lib) +- add_library(eigen INTERFACE) +- target_include_directories(eigen INTERFACE ${eigen_lib_SOURCE_DIR}) ++ # FCPW ++ FetchContent_Declare(fcpw_lib ++ GIT_REPOSITORY https://github.com/rohan-sawhney/fcpw.git ++ GIT_TAG dd65ec2 ++ ) ++ ++ FetchContent_GetProperties(fcpw_lib) ++ if(NOT fcpw_lib_POPULATED) ++ FetchContent_Populate(fcpw_lib) ++ add_subdirectory(${fcpw_lib_SOURCE_DIR} ${fcpw_lib_BINARY_DIR}) ++ target_include_directories(fcpw INTERFACE ${fcpw_lib_SOURCE_DIR}) ++ endif() + endif() + +-# FCPW +-FetchContent_Declare(fcpw_lib +- GIT_REPOSITORY https://github.com/rohan-sawhney/fcpw.git +- GIT_TAG dd65ec2 +-) +- +-FetchContent_GetProperties(fcpw_lib) +-if(NOT fcpw_lib_POPULATED) +- FetchContent_Populate(fcpw_lib) +- add_subdirectory(${fcpw_lib_SOURCE_DIR} ${fcpw_lib_BINARY_DIR}) +- target_include_directories(fcpw INTERFACE ${fcpw_lib_SOURCE_DIR}) +-endif() ++# eigen ++if(SDFLIB_BUILD_DEBUG_APPS) ++ FetchContent_Declare(eigen_lib ++ GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git ++ GIT_TAG 46126273552afe13692929523d34006f54c19719 # 3.4 ++ ) ++ ++ FetchContent_GetProperties(eigen_lib) ++ if(NOT eigen_lib_POPULATED) ++ FetchContent_Populate(eigen_lib) ++ add_library(eigen INTERFACE) ++ target_include_directories(eigen INTERFACE ${eigen_lib_SOURCE_DIR}) ++ endif() ++ endif() + + # stb + add_library(stb_image INTERFACE) +diff --git a/src/sdf/OctreeSdf.cpp b/src/sdf/OctreeSdf.cpp +index ef8ed4d..0e1eb97 100644 +--- a/src/sdf/OctreeSdf.cpp ++++ b/src/sdf/OctreeSdf.cpp +@@ -6,7 +6,9 @@ + #include "SdfLib/InterpolationMethods.h" + #include "sdf/OctreeSdfDepthFirst.h" + #include "sdf/OctreeSdfBreadthFirst.h" ++#ifdef OPENMP_AVAILABLE + #include "sdf/OctreeSdfBreadthFirstNoDelay.h" ++#endif + #include + #include + +@@ -46,8 +48,11 @@ OctreeSdf::OctreeSdf(const Mesh& mesh, BoundingBox box, + break; + case OctreeSdf::InitAlgorithm::CONTINUITY: + //initOctreeWithContinuity>(mesh, startDepth, depth, terminationThreshold, terminationRule); +- // initOctreeWithContinuity>(mesh, startDepth, depth, terminationThreshold, terminationRule); ++#ifdef OPENMP_AVAILABLE + initOctreeWithContinuityNoDelay>(mesh, startDepth, depth, terminationThreshold, terminationRule, numThreads); ++#else ++ initOctreeWithContinuity>(mesh, startDepth, depth, terminationThreshold, terminationRule); ++#endif + break; + // case OctreeSdf::InitAlgorithm::GPU_IMPLEMENTATION: + // Timer time; +@@ -78,7 +83,7 @@ float OctreeSdf::getDistance(glm::vec3 sample) const + startArrayPos.y < 0 || startArrayPos.y >= mStartGridSize || + startArrayPos.z < 0 || startArrayPos.z >= mStartGridSize) + { +- return mBox.getDistance(sample) + glm::sqrt(3.0f) * mBox.getSize().x; ++ return mBox.getDistance(sample) + mMinBorderValue; + } + + const OctreeNode* currentNode = &mOctreeData[startArrayPos.z * mStartGridXY + startArrayPos.y * mStartGridSize + startArrayPos.x]; +@@ -108,7 +113,7 @@ float OctreeSdf::getDistance(glm::vec3 sample, glm::vec3& outGradient) const + startArrayPos.y < 0 || startArrayPos.y >= mStartGridSize || + startArrayPos.z < 0 || startArrayPos.z >= mStartGridSize) + { +- return mBox.getDistance(sample) + mMinBorderValue; ++ return mBox.getDistance(sample, outGradient) + mMinBorderValue; + } + + const OctreeNode* currentNode = &mOctreeData[startArrayPos.z * mStartGridXY + startArrayPos.y * mStartGridSize + startArrayPos.x]; +@@ -253,4 +258,4 @@ void OctreeSdf::getDepthDensity(std::vector& depthsDensity) + size *= 0.125f; + } + } +-} +\ No newline at end of file ++} +diff --git a/src/sdf/OctreeSdfDepthFirst.h b/src/sdf/OctreeSdfDepthFirst.h +index 53ee4b2..196d191 100644 +--- a/src/sdf/OctreeSdfDepthFirst.h ++++ b/src/sdf/OctreeSdfDepthFirst.h +@@ -7,7 +7,10 @@ + #include "SdfLib/OctreeSdfUtils.h" + #include + #include ++#ifdef OPENMP_AVAILABLE + #include ++#endif ++ + + namespace sdflib + { +@@ -381,7 +384,9 @@ void OctreeSdf::initOctree(const Mesh& mesh, uint32_t startDepth, uint32_t maxDe + }; + + const uint32_t voxlesPerAxis = 1 << startDepth; ++#ifdef OPENMP_AVAILABLE + if(numThreads < 2) ++#endif + { + // Create the grid + mOctreeData.resize(voxlesPerAxis * voxlesPerAxis * voxlesPerAxis); +@@ -402,7 +407,8 @@ void OctreeSdf::initOctree(const Mesh& mesh, uint32_t startDepth, uint32_t maxDe + + mValueRange = mainThread.valueRange; + } +- else ++#ifdef OPENMP_AVAILABLE ++ else + { + std::vector threadsContext(numThreads, mainThread); + +@@ -511,6 +517,7 @@ void OctreeSdf::initOctree(const Mesh& mesh, uint32_t startDepth, uint32_t maxDe + } + #endif + } ++#endif + + #ifdef SDFLIB_PRINT_STATISTICS + SPDLOG_INFO("Used an octree of max depth {}", maxDepth); +@@ -544,4 +551,4 @@ void OctreeSdf::initOctree(const Mesh& mesh, uint32_t startDepth, uint32_t maxDe + } + } + +-#endif +\ No newline at end of file ++#endif +diff --git a/src/utils/Mesh.cpp b/src/utils/Mesh.cpp +index b407d38..6fff5fe 100644 +--- a/src/utils/Mesh.cpp ++++ b/src/utils/Mesh.cpp +@@ -5,6 +5,7 @@ + + namespace sdflib + { ++#ifdef ASSIMP_AVAILABLE + Mesh::Mesh(std::string filePath) + { + Assimp::Importer import; +@@ -28,6 +29,7 @@ Mesh::Mesh(const aiMesh* mesh) + { + initMesh(mesh); + } ++#endif + + Mesh::Mesh(glm::vec3* vertices, uint32_t numVertices, + uint32_t* indices, uint32_t numIndices) +@@ -39,7 +41,7 @@ Mesh::Mesh(glm::vec3* vertices, uint32_t numVertices, + std::memcpy(mIndices.data(), indices, sizeof(uint32_t) * numIndices); + } + +- ++#ifdef ASSIMP_AVAILABLE + void Mesh::initMesh(const aiMesh* mesh) + { + if(!(mesh->mPrimitiveTypes & aiPrimitiveType_TRIANGLE)) +@@ -83,6 +85,7 @@ void Mesh::initMesh(const aiMesh* mesh) + computeNormals(); + } + } ++#endif + + void Mesh::computeBoundingBox() + { +@@ -134,4 +137,4 @@ void Mesh::applyTransform(glm::mat4 trans) + + computeBoundingBox(); + } +-} +\ No newline at end of file ++}