# SPDX-License-Identifier: LGPL-2.1-or-later

add_library(Mesh SHARED)

if(WIN32)
    add_definitions(-DFCAppMesh -DWM4_FOUNDATION_DLL_EXPORT)
endif(WIN32)

target_include_directories(
    Mesh
    PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}
)

target_include_directories(
    Mesh
    SYSTEM
    PUBLIC
    ${CMAKE_SOURCE_DIR}/src/3rdParty/libkdtree
    ${EIGEN3_INCLUDE_DIR}
    ${QtConcurrent_INCLUDE_DIRS}
)

set(Mesh_LIBS
    FreeCADBase
    FreeCADApp
)

list(APPEND Mesh_LIBS
    ${QtConcurrent_LIBRARIES}
)

generate_from_py(Edge)
generate_from_py(Facet)
generate_from_py(MeshFeature)
generate_from_py(MeshPoint)
generate_from_py(Mesh)

SET(Mesh_XML_SRCS
    Edge.pyi
    Facet.pyi
    MeshFeature.pyi
    MeshPoint.pyi
    Mesh.pyi
)
SOURCE_GROUP("XML" FILES ${Mesh_XML_SRCS})

SET(Core_SRCS
    Core/Algorithm.cpp
    Core/Algorithm.h
    Core/Approximation.cpp
    Core/Approximation.h
    Core/Builder.cpp
    Core/Builder.h
    Core/Curvature.cpp
    Core/Curvature.h
    Core/Decimation.cpp
    Core/Decimation.h
    Core/Definitions.cpp
    Core/Definitions.h
    Core/Degeneration.cpp
    Core/Degeneration.h
    Core/Elements.cpp
    Core/Elements.h
    Core/Evaluation.cpp
    Core/Evaluation.h
    Core/Grid.cpp
    Core/Grid.h
    Core/Helpers.h
    Core/Info.cpp
    Core/Info.h
    Core/Iterator.h
    Core/KDTree.cpp
    Core/KDTree.h
    Core/MeshIO.cpp
    Core/MeshIO.h
    Core/MeshKernel.cpp
    Core/MeshKernel.h
    Core/Projection.cpp
    Core/Projection.h
    Core/Segmentation.cpp
    Core/Segmentation.h
    Core/SetOperations.cpp
    Core/SetOperations.h
    Core/Smoothing.cpp
    Core/Smoothing.h
    Core/Tools.cpp
    Core/Tools.h
    Core/TopoAlgorithm.cpp
    Core/TopoAlgorithm.h
    Core/Triangulation.cpp
    Core/Triangulation.h
    Core/Trim.cpp
    Core/Trim.h
    Core/TrimByPlane.cpp
    Core/TrimByPlane.h
    Core/tritritest.h
    Core/Utilities.h
    Core/Visitor.cpp
    Core/Visitor.h
    Core/CylinderFit.cpp
    Core/CylinderFit.h
    Core/SphereFit.cpp
    Core/SphereFit.h
    Core/IO/Reader3MF.cpp
    Core/IO/Reader3MF.h
    Core/IO/ReaderOBJ.cpp
    Core/IO/ReaderOBJ.h
    Core/IO/ReaderPLY.cpp
    Core/IO/ReaderPLY.h
    Core/IO/Writer3MF.cpp
    Core/IO/Writer3MF.h
    Core/IO/WriterInventor.cpp
    Core/IO/WriterInventor.h
    Core/IO/WriterOBJ.cpp
    Core/IO/WriterOBJ.h
)
SOURCE_GROUP("Core" FILES ${Core_SRCS})

SET(WildMagic4_SRCS
    WildMagic4/Wm4ApprCylinderFit3.cpp
    WildMagic4/Wm4ApprCylinderFit3.h
    WildMagic4/Wm4ApprGaussPointsFit2.cpp
    WildMagic4/Wm4ApprGaussPointsFit2.h
    WildMagic4/Wm4ApprGaussPointsFit3.cpp
    WildMagic4/Wm4ApprGaussPointsFit3.h
    WildMagic4/Wm4ApprLineFit3.cpp
    WildMagic4/Wm4ApprLineFit3.h
    WildMagic4/Wm4ApprPlaneFit3.cpp
    WildMagic4/Wm4ApprPlaneFit3.h
    WildMagic4/Wm4ApprPolyFit3.cpp
    WildMagic4/Wm4ApprPolyFit3.h
    WildMagic4/Wm4ApprQuadraticFit3.cpp
    WildMagic4/Wm4ApprQuadraticFit3.h
    WildMagic4/Wm4ApprSphereFit3.cpp
    WildMagic4/Wm4ApprSphereFit3.h
    WildMagic4/Wm4BandedMatrix.h
    WildMagic4/Wm4BandedMatrix.inl
    WildMagic4/Wm4Box2.h
    WildMagic4/Wm4Box2.inl
    WildMagic4/Wm4Box3.h
    WildMagic4/Wm4Box3.inl
    WildMagic4/Wm4ContBox2.cpp
    WildMagic4/Wm4ContBox2.h
    WildMagic4/Wm4ContBox3.cpp
    WildMagic4/Wm4ContBox3.h
    WildMagic4/Wm4ConvexHull.cpp
    WildMagic4/Wm4ConvexHull.h
    WildMagic4/Wm4ConvexHull1.cpp
    WildMagic4/Wm4ConvexHull1.h
    WildMagic4/Wm4ConvexHull2.cpp
    WildMagic4/Wm4ConvexHull2.h
    WildMagic4/Wm4ConvexHull3.cpp
    WildMagic4/Wm4ConvexHull3.h
    WildMagic4/Wm4DelPolygonEdge.cpp
    WildMagic4/Wm4DelPolygonEdge.h
    WildMagic4/Wm4DelPolyhedronFace.cpp
    WildMagic4/Wm4DelPolyhedronFace.h
    WildMagic4/Wm4DelTetrahedron.cpp
    WildMagic4/Wm4DelTetrahedron.h
    WildMagic4/Wm4DelTriangle.cpp
    WildMagic4/Wm4DelTriangle.h
    WildMagic4/Wm4Delaunay.cpp
    WildMagic4/Wm4Delaunay.h
    WildMagic4/Wm4Delaunay1.cpp
    WildMagic4/Wm4Delaunay1.h
    WildMagic4/Wm4Delaunay2.cpp
    WildMagic4/Wm4Delaunay2.h
    WildMagic4/Wm4Delaunay3.cpp
    WildMagic4/Wm4Delaunay3.h
    WildMagic4/Wm4DistLine3Segment3.cpp
    WildMagic4/Wm4DistLine3Segment3.h
    WildMagic4/Wm4DistLine3Triangle3.cpp
    WildMagic4/Wm4DistLine3Triangle3.h
    WildMagic4/Wm4DistSegment3Segment3.cpp
    WildMagic4/Wm4DistSegment3Segment3.h
    WildMagic4/Wm4DistSegment3Triangle3.cpp
    WildMagic4/Wm4DistSegment3Triangle3.h
    WildMagic4/Wm4DistVector3Plane3.cpp
    WildMagic4/Wm4DistVector3Plane3.h
    WildMagic4/Wm4DistVector3Segment3.cpp
    WildMagic4/Wm4DistVector3Segment3.h
    WildMagic4/Wm4DistVector3Triangle3.cpp
    WildMagic4/Wm4DistVector3Triangle3.h
    WildMagic4/Wm4Distance.cpp
    WildMagic4/Wm4Distance.h
    WildMagic4/Wm4ETManifoldMesh.cpp
    WildMagic4/Wm4ETManifoldMesh.h
    WildMagic4/Wm4ETManifoldMesh.inl
    WildMagic4/Wm4EdgeKey.h
    WildMagic4/Wm4EdgeKey.inl
    WildMagic4/Wm4Eigen.cpp
    WildMagic4/Wm4Eigen.h
    WildMagic4/Wm4Foundation.h
    WildMagic4/Wm4FoundationLIB.h
    WildMagic4/Wm4FoundationPCH.cpp
    WildMagic4/Wm4FoundationPCH.h
    WildMagic4/Wm4GMatrix.h
    WildMagic4/Wm4GMatrix.inl
    WildMagic4/Wm4GVector.h
    WildMagic4/Wm4GVector.inl
    WildMagic4/Wm4ImplicitSurface.cpp
    WildMagic4/Wm4ImplicitSurface.h
    WildMagic4/Wm4Intersector.cpp
    WildMagic4/Wm4Intersector.h
    WildMagic4/Wm4Intersector1.cpp
    WildMagic4/Wm4Intersector1.h
    WildMagic4/Wm4IntrLine3Box3.cpp
    WildMagic4/Wm4IntrLine3Box3.h
    WildMagic4/Wm4IntrLine3Plane3.cpp
    WildMagic4/Wm4IntrLine3Plane3.h
    WildMagic4/Wm4IntrSegment3Box3.cpp
    WildMagic4/Wm4IntrSegment3Box3.h
    WildMagic4/Wm4IntrSegment3Plane3.cpp
    WildMagic4/Wm4IntrSegment3Plane3.h
    WildMagic4/Wm4IntrTriangle2Triangle2.cpp
    WildMagic4/Wm4IntrTriangle2Triangle2.h
    WildMagic4/Wm4IntrTriangle3Triangle3.cpp
    WildMagic4/Wm4IntrTriangle3Triangle3.h
    WildMagic4/Wm4LinComp.h
    WildMagic4/Wm4LinComp.inl
    WildMagic4/Wm4Line3.h
    WildMagic4/Wm4Line3.inl
    WildMagic4/Wm4LinearSystem.cpp
    WildMagic4/Wm4LinearSystem.h
    WildMagic4/Wm4Mapper2.h
    WildMagic4/Wm4Mapper2.inl
    WildMagic4/Wm4Mapper3.h
    WildMagic4/Wm4Mapper3.inl
    WildMagic4/Wm4Math.cpp
    WildMagic4/Wm4Math.h
    WildMagic4/Wm4Math.inl
    WildMagic4/Wm4MathMCR.h
    WildMagic4/Wm4Matrix2.cpp
    WildMagic4/Wm4Matrix2.h
    WildMagic4/Wm4Matrix2.inl
    WildMagic4/Wm4Matrix3.cpp
    WildMagic4/Wm4Matrix3.h
    WildMagic4/Wm4Matrix3.inl
    WildMagic4/Wm4Matrix4.cpp
    WildMagic4/Wm4Matrix4.h
    WildMagic4/Wm4Matrix4.inl
    WildMagic4/Wm4Memory.cpp
    WildMagic4/Wm4Memory.h
    WildMagic4/Wm4Memory.inl
    WildMagic4/Wm4MeshCurvature.cpp
    WildMagic4/Wm4MeshCurvature.h
    WildMagic4/Wm4MeshSmoother.cpp
    WildMagic4/Wm4MeshSmoother.h
    WildMagic4/Wm4ParametricSurface.cpp
    WildMagic4/Wm4ParametricSurface.h
    WildMagic4/Wm4Plane3.h
    WildMagic4/Wm4Plane3.inl
    WildMagic4/Wm4Platforms.h
    WildMagic4/Wm4PolynomialRoots.cpp
    WildMagic4/Wm4PolynomialRoots.h
    WildMagic4/Wm4Polynomial1.h
    WildMagic4/Wm4Polynomial1.inl
    WildMagic4/Wm4QuadricSurface.cpp
    WildMagic4/Wm4QuadricSurface.h
    WildMagic4/Wm4Quaternion.cpp
    WildMagic4/Wm4Quaternion.h
    WildMagic4/Wm4Quaternion.inl
    WildMagic4/Wm4Query.h
    WildMagic4/Wm4Query.inl
    WildMagic4/Wm4Query2.h
    WildMagic4/Wm4Query2.inl
    WildMagic4/Wm4Query2Filtered.h
    WildMagic4/Wm4Query2Filtered.inl
    WildMagic4/Wm4Query2Int64.h
    WildMagic4/Wm4Query2Int64.inl
    WildMagic4/Wm4Query2TInteger.h
    WildMagic4/Wm4Query2TInteger.inl
    WildMagic4/Wm4Query2TRational.h
    WildMagic4/Wm4Query2TRational.inl
    WildMagic4/Wm4Query3.h
    WildMagic4/Wm4Query3.inl
    WildMagic4/Wm4Query3Filtered.h
    WildMagic4/Wm4Query3Filtered.inl
    WildMagic4/Wm4Query3Int64.h
    WildMagic4/Wm4Query3Int64.inl
    WildMagic4/Wm4Query3TInteger.h
    WildMagic4/Wm4Query3TInteger.inl
    WildMagic4/Wm4Query3TRational.h
    WildMagic4/Wm4Query3TRational.inl
    WildMagic4/Wm4RVector2.h
    WildMagic4/Wm4RVector2.inl
    WildMagic4/Wm4RVector3.h
    WildMagic4/Wm4RVector3.inl
    WildMagic4/Wm4Segment3.h
    WildMagic4/Wm4Segment3.inl
    WildMagic4/Wm4Sphere3.h
    WildMagic4/Wm4Sphere3.inl
    WildMagic4/Wm4Surface.cpp
    WildMagic4/Wm4Surface.h
    WildMagic4/Wm4System.cpp
    WildMagic4/Wm4System.h
    WildMagic4/Wm4System.inl
    WildMagic4/Wm4THashSet.h
    WildMagic4/Wm4THashSet.inl
    WildMagic4/Wm4THashTable.h
    WildMagic4/Wm4THashTable.inl
    WildMagic4/Wm4TInteger.h
    WildMagic4/Wm4TInteger.inl
    WildMagic4/Wm4TMinHeap.h
    WildMagic4/Wm4TMinHeap.inl
    WildMagic4/Wm4TRVector.h
    WildMagic4/Wm4TRVector.inl
    WildMagic4/Wm4TRational.h
    WildMagic4/Wm4TRational.inl
    WildMagic4/Wm4TSmallUnorderedSet.h
    WildMagic4/Wm4TSmallUnorderedSet.inl
    WildMagic4/Wm4TStringHashTable.h
    WildMagic4/Wm4TStringHashTable.inl
    WildMagic4/Wm4TTuple.h
    WildMagic4/Wm4TTuple.inl
    WildMagic4/Wm4Triangle2.h
    WildMagic4/Wm4Triangle2.inl
    WildMagic4/Wm4Triangle3.h
    WildMagic4/Wm4Triangle3.inl
    WildMagic4/Wm4TriangleKey.h
    WildMagic4/Wm4TriangleKey.inl
    WildMagic4/Wm4TriangulateEC.cpp
    WildMagic4/Wm4TriangulateEC.h
    WildMagic4/Wm4UniqueVerticesTriangles.h
    WildMagic4/Wm4UniqueVerticesTriangles.inl
    WildMagic4/Wm4VEManifoldMesh.cpp
    WildMagic4/Wm4VEManifoldMesh.h
    WildMagic4/Wm4VEManifoldMesh.inl
    WildMagic4/Wm4Vector2.cpp
    WildMagic4/Wm4Vector2.h
    WildMagic4/Wm4Vector2.inl
    WildMagic4/Wm4Vector3.cpp
    WildMagic4/Wm4Vector3.h
    WildMagic4/Wm4Vector3.inl
    WildMagic4/Wm4Vector4.cpp
    WildMagic4/Wm4Vector4.h
    WildMagic4/Wm4Vector4.inl
)
SOURCE_GROUP("WildMagic4" FILES ${WildMagic4_SRCS})

SET(Mesh_SRCS
    ${Mesh_XML_SRCS}
    AppMesh.cpp
    AppMeshPy.cpp
    Exporter.cpp
    Exporter.h
    Importer.cpp
    Importer.h
    Edge.cpp
    Edge.h
    EdgePyImp.cpp
    Facet.cpp
    Facet.h
    FacetPyImp.cpp
    FeatureMeshCurvature.cpp
    FeatureMeshCurvature.h
    FeatureMeshDefects.cpp
    FeatureMeshDefects.h
    FeatureMeshExport.cpp
    FeatureMeshExport.h
    FeatureMeshImport.cpp
    FeatureMeshImport.h
    FeatureMeshSegmentByMesh.cpp
    FeatureMeshSegmentByMesh.h
    FeatureMeshSetOperations.cpp
    FeatureMeshSetOperations.h
    FeatureMeshSolid.cpp
    FeatureMeshSolid.h
    FeatureMeshTransform.cpp
    FeatureMeshTransform.h
    FeatureMeshTransformDemolding.cpp
    FeatureMeshTransformDemolding.h
    Mesh.cpp
    Mesh.h
    MeshFeature.cpp
    MeshFeature.h
    MeshFeaturePyImp.cpp
    MeshPointPyImp.cpp
    MeshPoint.h
    MeshProperties.cpp
    MeshProperties.h
    MeshPyImp.cpp
    MeshTexture.cpp
    MeshTexture.h
    PreCompiled.h
    Segment.cpp
    Segment.h
)

# Suppress -Wundefined-var-template
if (MINGW AND CMAKE_COMPILER_IS_CLANGXX)
    unset(_flag_found CACHE)
    check_cxx_compiler_flag("-Wno-undefined-var-template" _flag_found)
    if (_flag_found)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-undefined-var-template")
    endif()
endif()

if(FREECAD_USE_PCH)
    target_precompile_headers(Mesh PRIVATE
            $<$<COMPILE_LANGUAGE:CXX>:"${CMAKE_CURRENT_LIST_DIR}/PreCompiled.h">
    )
endif(FREECAD_USE_PCH)

# Suppress some very long Eigen3 warnings of older versions
if (EIGEN3_NO_DEPRECATED_COPY)
    set_source_files_properties(
        Core/Approximation.cpp
        Core/CylinderFit.cpp
        Core/SphereFit.cpp
        Core/KDTree.cpp
        PROPERTIES COMPILE_FLAGS ${EIGEN3_NO_DEPRECATED_COPY})
endif ()

target_sources(Mesh PRIVATE ${Core_SRCS} ${WildMagic4_SRCS} ${Mesh_SRCS})
target_link_libraries(Mesh ${Mesh_LIBS})

if (MSVC)
    target_compile_options(Mesh PRIVATE /wd4251 /wd4275 /wd4661)
endif()

if (FREECAD_WARN_ERROR)
    target_compile_warn_error(Mesh)
endif()


SET_BIN_DIR(Mesh Mesh /Mod/Mesh)
SET_PYTHON_PREFIX_SUFFIX(Mesh)

INSTALL(TARGETS Mesh DESTINATION ${CMAKE_INSTALL_LIBDIR})
