cmake_minimum_required(VERSION 2.8.11)

project(VTKMMeshSimplify CXX)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${mccompare_SOURCE_DIR})

set(DEVICE "Serial" CACHE STRING "vtkm_configure_device")

set(definitions)

option(PROFILING "Don't show original mesh for large data tests" FALSE)

set( definitions "${definitions} -D__VTKM_VERTEX_CLUSTERING_BENCHMARK" )
if (PROFILING)
    set( definitions "${definitions} -DPROFILING")
endif()

option(SAVE_OUTPUT_ON "Save output when profiling" FALSE)
if (SAVE_OUTPUT_ON)
    set( definitions "${definitions} -DSAVE_OUTPUT_ON")
endif()

set(headers
  simplify.h
  algorithm.h
  math/Matrix.h
  math/VectorAnalysis.h
  math/Basic.h
  vtk_vtkm.h
)

set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY TRUE)

#########################################################
# Include VTKm
#########################################################
find_package(VTKm REQUIRED)
include(VTKmMacros)
vtkm_configure_device(Serial)
vtkm_configure_device(${DEVICE})

string(TOUPPER ${DEVICE} DEVICE_UPPER)
message(STATUS "VTKM_DEVICE_ADAPTER_${DEVICE_UPPER}")
set( definitions "${definitions} -DVTKM_DEVICE_ADAPTER=VTKM_DEVICE_ADAPTER_${DEVICE_UPPER}")

########################################################
# Include Boost
########################################################
find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})

#########################################################
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

include_directories(.)

#########################################################
# Include VTK
#########################################################
find_package(VTK 6.2 REQUIRED)
include(${VTK_USE_FILE})


########################################################
# Include TBB
########################################################
find_package(TBB)
include_directories(${TBB_INCLUDE_DIRS})
link_directories(${TBB_LIBRARY_DIRS})


#################### VTK fix for Cuda #######################
macro(REMOVE_VTK_DEFINITIONS)
    get_directory_property(_dir_defs DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS)
    set(_vtk_definitions)
    foreach(_item ${_dir_defs})
        if(_item MATCHES "vtk*")
            list(APPEND _vtk_definitions -D${_item})
        endif()
    endforeach()
    remove_definitions(${_vtk_definitions})
endmacro(REMOVE_VTK_DEFINITIONS)

#########################################################
# Data path
#########################################################
set(DATA_FILE "/home/chunmingchen/Project/VTKData/Data/cow.vtp" CACHE FILEPATH "Data filename")
set( definitions "${definitions} -DDATA_FILE=\\\"${DATA_FILE}\\\"")
#########################################################

########################################################
add_definitions(${definitions})

if (${DEVICE} STREQUAL "CUDA" OR ${DEVICE} STREQUAL "Cuda")
  ###### Add CUDA version #####

  REMOVE_VTK_DEFINITIONS() 

  find_package(CUDA REQUIRED)
  set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_35,code=sm_35)
  cuda_include_directories(${THRUST_INCLUDE_DIR})
  #cuda_include_directories("/home/jimmychen/Dropbox/Project/vtkm/")
  list(APPEND CUDA_NVCC_FLAGS "-arch=sm_35;-std=c++11;-DVERBOSE;-ccbin g++")
  #list(APPEND CUDA_NVCC_FLAGS ${definitions})

  list(APPEND CUDA_NVCC_FLAGS " -Xcompiler;${definitions}") #;${_vtk_definitions}

  cuda_compile(simplify_cuda simplify.cu)
  cuda_compile(main_cuda main.cu)
  cuda_add_executable(Benchmark #MACOSX_BUNDLE
    ${main_cuda} ${simplify_cuda}
    )

  target_link_libraries(Benchmark ${VTK_LIBRARIES})

else ()
  ####### CPU version #######
  add_executable(Benchmark MACOSX_BUNDLE
    simplify.cxx
    main.cxx
    )

  target_link_libraries(Benchmark ${VTK_LIBRARIES} ${TBB_LIBRARIES} )
endif()

if(VTK_HAS_FLYING_EDGES)
  target_compile_definitions(Benchmark PRIVATE "VTK_HAS_FLYING_EDGES")
endif()
