cmake_minimum_required(VERSION 2.8.12)
project(BranchingImage)

set(BRANCHINGIMAGE_MAJOR_VERSION 0)
set(BRANCHINGIMAGE_MINOR_VERSION 1)
set(BRANCHINGIMAGE_VERSION ${BRANCHINGIMAGE_MAJOR_VERSION}.${BRANCHINGIMAGE_MINOR_VERSION})

set(HEADER_FILES
    BranchingImage.h
    BranchingImageConverter.h
    BranchingCellIndicesFromPositions.h
    BranchingCellIndicesFromLabels.h
    BranchingCellOffsetsFromPositions.h
    BranchingCellOffsetsFromConnectLabels.h
    BranchingCellVolumes.h
    BranchingImageSubsampler.h
    MergeBranchingImages.h
    MergeImagesIntoBranching.h
    MeshLabeler.h
    ImageMeshIntersection.h
    ImageContainer.h
    TransferFunction.h
    ImageValuesFromPositions.h
    ImageSampler.h
    ImageExporter.h
    ImageAlgorithms.h
)

set(SOURCE_FILES
    initBranchingImage.cpp
    BranchingImage.cpp
    BranchingImageConverter.cpp
    BranchingCellIndicesFromPositions.cpp
    BranchingCellIndicesFromLabels.cpp
    BranchingCellOffsetsFromPositions.cpp
    BranchingCellOffsetsFromConnectLabels.cpp
    BranchingCellVolumes.cpp
    BranchingImageSubsampler.cpp
    MergeBranchingImages.cpp
    MergeImagesIntoBranching.cpp
    MeshLabeler.cpp
    ImageMeshIntersection.cpp
    ImageContainer.cpp
    TransferFunction.cpp
    ImageValuesFromPositions.cpp
    ImageSampler.cpp
    ImageExporter.cpp
)

set(README_FILES
    BranchingImage.txt
)

set(PYTHON_FILES
    python/BranchingImage/__init__.py
    python/BranchingImage/API.py
)

find_package(SofaFramework REQUIRED)
find_package(image REQUIRED)
find_package(Flexible QUIET)

if(Flexible_FOUND)
    list(APPEND HEADER_FILES 
        flexiblePlugin/quadrature/ImageGaussPointSampler.h
        flexiblePlugin/shapeFunction/BaseImageShapeFunction.h
        flexiblePlugin/shapeFunction/VoronoiShapeFunction.h
        flexiblePlugin/mass/MassFromDensity.h
    )
    list(APPEND SOURCE_FILES 
        flexiblePlugin/quadrature/ImageGaussPointSampler.cpp
        flexiblePlugin/shapeFunction/VoronoiShapeFunction.cpp
        flexiblePlugin/shapeFunction/ImageShapeFunctionContainer.cpp
        flexiblePlugin/mass/MassFromDensity.cpp
    )
else()
    message(STATUS "BranchingImage: could not find Flexible")
endif()


 # OpenMP seems to be bugged in branchingimage, forcing it to be single threaded for now
if(SOFA_OPENMP)
     message( WARNING "BranchingImage: deactivating OpenMP" )
     string(REPLACE "${OpenMP_CXX_FLAGS}" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
     string(REPLACE "${OpenMP_CXX_FLAGS}" "" CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS})
endif()


## BranchingImage/config.h
configure_file(config.h.in "${CMAKE_BINARY_DIR}/include/BranchingImage/config.h")
install(FILES "${CMAKE_BINARY_DIR}/include/BranchingImage/config.h" DESTINATION "include/BranchingImage")

# Config files and install rules for pythons scripts
sofa_set_python_directory(${PROJECT_NAME} "python")

add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES} ${README_FILES} ${PYTHON_FILES})
target_link_libraries(${PROJECT_NAME} image)

set(BRANCHINGIMAGE_COMPILE_FLAGS "-DSOFA_BUILD_BranchingImage")

if(Flexible_FOUND)
    target_link_libraries(${PROJECT_NAME} Flexible)
    set(BRANCHINGIMAGE_COMPILE_FLAGS "${BRANCHINGIMAGE_COMPILE_FLAGS} -DSOFA_HAVE_FLEXIBLE")
endif()

target_include_directories(${PROJECT_NAME} PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")
target_include_directories(${PROJECT_NAME} PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
target_include_directories(${PROJECT_NAME} PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>")
target_include_directories(${PROJECT_NAME} PUBLIC "$<INSTALL_INTERFACE:include>")

set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${BRANCHINGIMAGE_VERSION})
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS ${BRANCHINGIMAGE_COMPILE_FLAGS})

install(DIRECTORY examples/ DESTINATION share/sofa/plugins/${PROJECT_NAME})

foreach(HEADER ${HEADER_FILES})
    string(REGEX MATCH "(.*)[/\\]" DIR ${HEADER})
    install(FILES ${HEADER} DESTINATION "include/${PROJECT_NAME}/${DIR}")
endforeach(HEADER HEADERS)

if(SOFA_BUILD_TESTS)
    find_package(SofaTest QUIET)
    if(SofaTest_FOUND)
        add_subdirectory(BranchingImage_test) #TODO: fix link error /usr/bin/ld: cannot find -lSofaGTestMain
    endif()
endif()

## Install rules for the library; CMake package configurations files
sofa_create_package(${PROJECT_NAME} ${BRANCHINGIMAGE_VERSION} ${PROJECT_NAME} ${PROJECT_NAME})
