project(PBVR CXX C)

cmake_minimum_required(VERSION 2.6.0)  # FindBoost.cmake is broken in older versions

set(CMAKE_MODULE_PATH "$ENV{CMAKE_MODULE_PATH}")

FILE(GLOB C_HEADERS "*.h" "*.hpp")
FILE(GLOB C_SOURCES "*.c" "*.cpp" "*.cxx")
FILE(GLOB CUDA_HEADERS "*.cuh")
FILE(GLOB CUDA_SOURCES "*.cu")




########################################
#     OpenGL      #
########################################

find_package(OPENGL REQUIRED)
INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})

if(UNIX)
  SET(GLEW_LIBRARIES "GLEW")
endif()

find_package(GLUT REQUIRED)
include_directories(${GLUT_INCLUDE_DIRS})


########################################
#     CUDA      #
########################################


find_package(CUDA REQUIRED COMPONENTS sdk)
include_directories(${CUDA_INCLUDE_DIRS})
cuda_include_directories(${CUDA_INCLUDE_DIRS} ${CUDA_CUT_INCLUDE_DIR})
set(CUDA_NVCC_FLAGS "-arch=sm_21;-use_fast_math;")

# if cutil is not found yutomatically
#IF(NOT CUDA_CUT_INCLUDE_DIR AND CUDA_CUT_LIBRARY)
message("searching for cutil manually. Please compile cutil separately if you haven't yet!")

find_path(CUDA_CUT_INCLUDE_DIR cutil.h
  "$ENV{NVSDKCOMPUTE_ROOT}/C/common/inc/"
  "$ENV{NVSDKCUDA_ROOT}/common/inc/"
  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\NVIDIA Corporation\\Installed Products\\NVIDIA SDK 10\\Compute;InstallDir]"
  "/Developer/GPU\ Computing/C/common/inc/"
  )

message("CMAKE_SIZEOF_VOID_P: ${CMAKE_SIZEOF_VOID_P}")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
message("64 bit system")
message("cutil found: ${CUDA_SDK_ROOT_DIR}/common/lib/x64")
   find_library(CUDA_CUT_LIBRARY
   NAMES cutil64
   PATHS ${CUDA_SDK_ROOT_DIR}/common/lib/x64
   DOC "Location of cutil library"
   NO_DEFAULT_PATH
   )
else(CMAKE_SIZEOF_VOID_P EQUAL 8)
message("32 bit system")
  find_library(CUDA_CUT_LIBRARY
   NAMES cutil32
   PATHS ${CUDA_SDK_ROOT_DIR}/common/lib/Win32
   DOC "Location of cutil library"
   NO_DEFAULT_PATH
   )
endif(CMAKE_SIZEOF_VOID_P EQUAL 8)
#ENDIF()

message("cutil found: ${CUDA_CUT_INCLUDE_DIR} ${CUDA_CUT_LIBRARY}")

find_path(CUDA_shrUTILS_INCLUDE_DIR shrUtils.h
  "$ENV{NVSDKCOMPUTE_ROOT}/shared/inc"
  "$ENV{NVSDKCUDA_ROOT}/shared/inc"
  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\NVIDIA Corporation\\Installed Products\\NVIDIA SDK 10\\Compute;InstallDir]"
  "/Developer/GPU\ Computing/shared/inc"
  )
  
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
message("64 bit system ${CUDA_SDK_ROOT_DIR}/../shared/lib/x64/")
   find_library(CUDA_shrUTILS_LIBRARY
   NAMES shrUtils64
   PATHS ${CUDA_SDK_ROOT_DIR}/../shared/lib/x64/
   DOC "Location of cutil library"
   NO_DEFAULT_PATH
   )
  find_library(freeglut_LIBRARY
  NAMES freeglut
  PATHS ${CUDA_SDK_ROOT_DIR}/common/lib/x64
  DOC "Location of freeglut library"
  NO_DEFAULT_PATH
  )
  find_library(GLEW_CUDA_LIBRARY
  NAMES glew64
  PATHS ${CUDA_SDK_ROOT_DIR}/common/lib/x64
  DOC "Location of glew64 library"
  NO_DEFAULT_PATH
  )
  message("CUDA_GLEW: " ${GLEW_CUDA_LIBRARY})
  message("CUDA_GLUT: " ${freeglut_LIBRARY})
  include_directories(${CUDA_SDK_ROOT_DIR}/common/inc/)
else(CMAKE_SIZEOF_VOID_P EQUAL 8)
message("32 bit system")
   find_library(CUDA_shrUTILS_LIBRARY
   NAMES shrUtils32
   PATHS ${CUDA_SDK_ROOT_DIR}/../shared/lib/Win32/
   DOC "Location of cutil library"
   NO_DEFAULT_PATH
   )
  find_library(GLEW_CUDA_LIBRARY
  NAMES glew32
  PATHS ${CUDA_SDK_ROOT_DIR}/common/lib/Win32
  DOC "Location of glew32 library"
  NO_DEFAULT_PATH
  )
endif(CMAKE_SIZEOF_VOID_P EQUAL 8)




########################################
#     CUDA Templates      #
########################################

find_package(CudaTemplates REQUIRED)
include_directories(${CUDATEMPLATES_INCLUDE_DIR})
cuda_include_directories(${CUDATEMPLATES_INCLUDE_DIR})


OPTION(USE_GPU_SCHEDULING "USE GpuScheduling" OFF)
if(USE_GPU_SCHEDULING)
find_package(GPUScheduling REQUIRED)
set (TURB_SRCS ${TURB_SRCS} 
               ${GPU_SCHEDULING_DEV_HEADERS})
source_group( GPUSchedulingHeaders FILES ${GPU_SCHEDULING_DEV_HEADERS} )
set (CUDA_LIBRARIES ${CUDA_LIBRARIES} ${GPU_SCHEDULING_LIBRARIES})
link_directories(${GPU_SCHEDULING_LIBRARY_DIRS})
add_definitions(-DUSE_GPU_SCHEDULING)
endif()




########################################
#     VTK      #
########################################

find_package(VTK REQUIRED)
SET(QT_QMAKE_EXECUTABLE ${VTK_QT_QMAKE_EXECUTABLE} CACHE FILEPATH "")
include(${VTK_USE_FILE})
include_directories(${VTK_DIR}/include)


########################################
#     QT       #
########################################

set(QT_USE_QTOPENGL TRUE)
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
file(GLOB UI "*.ui")
QT4_WRAP_CPP(MOC_SRCS ${C_HEADERS})
QT4_WRAP_UI(UI_WRAP ${UI})

message("UI: " ${UI})
message("UI_WRAP: " ${UI_WRAP})

message("MOC: " ${MOC_SRCS})


########################################
#     BOOST       #
########################################
set(Boost_ADDITIONAL_VERSIONS "1.41")
find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIR})


include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} )



SET(HEADERS ${C_HEADERS} ${CUDA_HEADERS} ${UI_WRAP})
SET(SOURCES ${C_SOURCES} ${CUDA_SOURCES} ${MOC_SRCS})
message("headers: " ${HEADERS})
message("sources: " ${SOURCES})

cuda_add_executable(PBVR 
	${HEADERS} 
	${SOURCES})
target_link_libraries(PBVR 
  ${CUDA_CUT_LIBRARY} 
  ${CUDA_LIBRARIES} 
  ${GLEW_CUDA_LIBRARY}
  ${freeglut_LIBRARY}
  vtkIO
  vtkCommon
  vtkHybrid
  vtkRendering
  QVTK
  )
  