diff --git a/CMakeLists.txt b/CMakeLists.txt index 20551cf..0d2a364 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,15 +70,25 @@ 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() + +if(SDFLIB_BUILD_APPS OR SDFLIB_BUILD_DEBUG_APPS) + target_link_libraries(${PROJECT_NAME} PUBLIC args) + target_link_libraries(${PROJECT_NAME} PUBLIC stb_image) +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) if(CMAKE_CXX_COMPILER_ID MATCHES GNU) @@ -86,17 +96,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 +175,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..ea22b9a 100644 --- a/libs/CMakeLists.txt +++ b/libs/CMakeLists.txt @@ -14,37 +14,41 @@ 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 -FetchContent_Declare(args_lib - GIT_REPOSITORY https://github.com/Taywee/args.git - GIT_TAG a48e1f880813b367d2354963a58dedbf2b708584 # 6.3.0 -) - -FetchContent_GetProperties(args_lib) -if(NOT args_lib_POPULATED) - FetchContent_Populate(args_lib) - add_library(args INTERFACE) - target_include_directories(args INTERFACE ${args_lib_SOURCE_DIR}) -endif() +if(SDFLIB_BUILD_APPS OR SDFLIB_BUILD_DEBUG_APPS) + FetchContent_Declare(args_lib + GIT_REPOSITORY https://github.com/Taywee/args.git + GIT_TAG a48e1f880813b367d2354963a58dedbf2b708584 # 6.3.0 + ) + + FetchContent_GetProperties(args_lib) + if(NOT args_lib_POPULATED) + FetchContent_Populate(args_lib) + add_library(args INTERFACE) + target_include_directories(args INTERFACE ${args_lib_SOURCE_DIR}) + endif() + endif() # spdlog FetchContent_Declare(spdlog_lib @@ -76,47 +80,53 @@ 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) -target_include_directories(stb_image INTERFACE stb) +if(SDFLIB_BUILD_APPS OR SDFLIB_BUILD_DEBUG_APPS) + add_library(stb_image INTERFACE) + target_include_directories(stb_image INTERFACE stb) + endif() # icg add_library(icg 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 +}