##
#Division of Computational Mechanics (MECOM), Comision Nacional de Energia Atomica, Argentina
#http://mecom.cnea.gov.ar/index.php/en

#Dr. Cejas Bolecek, N. R
#ncejas@cab.cnea.gov.ar
#v.0.2
## ---------------------------------------------------------////
cmake_minimum_required(VERSION 3.14)
project(rendering)

# Use VTK or VK Renderer
option(${PROJECT_NAME}_USE_VK "Vulkan" ON)

#Renderer mode
if(${PROJECT_NAME}_USE_VK)
  message(STATUS "${PROJECT_NAME} with Vulkan Renderer backend")
else()
  message(STATUS "${PROJECT_NAME} with VTK Renderer backend")
endif()

#-----------------------------------------------------------------------------
# iMSTK directories (we use build instead of iMSTK-build)
#-----------------------------------------------------------------------------
set(iMSTK_SOURCEs_DIR  ${iMSTK_SRC}/Source)
set(iMSTK_DIR          ${iMSTK_SRC}/build/Innerbuild)
set(iMSTK_LIBS_PATH    ${iMSTK_SRC}/build/lib)
set(iMSTK_LIB_EXTERNAL ${iMSTK_SRC}/build/External)

set(CMAKE_MODULE_PATH
    ${CMAKE_SOURCE_DIR}/CMake
    ${CMAKE_SOURCE_DIR}/CMake/Utilities
    ${CMAKE_MODULE_PATH}
    )

#-----------------------------------------------------------------------------
# Find external dependencies
#-----------------------------------------------------------------------------
#Threads
find_package (Threads REQUIRED)

# Assimp
find_package( Assimp REQUIRED )
include_directories( ${Assimp_INCLUDE_DIRS} )

# glm
find_package( glm )
include_directories( ${glm_INCLUDE_DIR} )

if(${PROJECT_NAME}_USE_VK)
  # glfw
  find_package( glfw )
  include_directories( ${glfw_INCLUDE_DIR} )

  # gli
  find_package( gli )
  include_directories( ${gli_INCLUDE_DIR} )

  #Vulkan
  find_package( VulkanSDK )
  include_directories( ${VulkanSDK_INCLUDE_DIR} )
  add_definitions( -DiMSTK_USE_Vulkan )
  set(GLSLANG_INSTALL_DIR ${VULKAN_SDK}/bin) 

endif()

# TBB
# Define  __TBB_NO_IMPLICIT_LINKAGE so that MSVC will not always look for tbb_debug in debug mode
add_definitions(-D__TBB_NO_IMPLICIT_LINKAGE)
find_package(tbb REQUIRED)
include_directories( ${TBB_INCLUDE_DIRS} )

set(VTK_DIR ${iMSTK_LIB_EXTERNAL}/VTK/build )
find_package( VTK REQUIRED CONFIG )
#message(STATUS "vtk: ${VTK_INCLUDE_DIRS}")

# g3log
find_package( g3log REQUIRED )
include_directories( ${g3log_INCLUDE_DIR} )

# Eigen
find_package( Eigen 3.1.2 REQUIRED )
include_directories( ${Eigen_INCLUDE_DIR} )

# imgui
find_package( imgui REQUIRED )
include_directories( ${imgui_INCLUDE_DIR} )

# SCCD
find_package( SCCD REQUIRED)
include_directories( ${SCCD_INCLUDE_DIR} )

# VRPN
find_package( VRPN REQUIRED )
include_directories( ${VRPN_INCLUDE_DIRS} )

#-----------------------------------------------------------------------------
# Include Targets
#-----------------------------------------------------------------------------
include(${iMSTK_DIR}/iMSTKTargets.cmake)

# VegaFEM targets
set(VEGAFEM_TARGETS    ${iMSTK_LIB_EXTERNAL}/VegaFEM/build)
include(${VEGAFEM_TARGETS}/VegaFEMTargets.cmake)

# VTK targets
set(VTK_TARGETS    ${iMSTK_LIB_EXTERNAL}/VTK/build)
include(${VTK_TARGETS}/VTKTargets.cmake)

#-----------------------------------------------------------------------------
#App
#-----------------------------------------------------------------------------

add_executable(${PROJECT_NAME} RenderingExample.cpp)

# Add shaders
#-----------------------------------------------------------------------------
include(imstkCopyAndCompileShaders)
CopyAndCompileShaders()

# Copy assets
#-----------------------------------------------------------------------------
file(COPY ${CMAKE_SOURCE_DIR}/Data/IBL
DESTINATION ${PROJECT_BINARY_DIR}/Data)

file(COPY ${CMAKE_SOURCE_DIR}/Data/head
DESTINATION ${PROJECT_BINARY_DIR}/Data)

# link Libs & include header path
#-----------------------------------------------------------------------------
target_link_libraries(${PROJECT_NAME} VegaFEM::volumetricMesh VegaFEM::massSpringSystem imstk::SimulationManager imstk::apiUtilities ${CMAKE_THREAD_LIBS_INIT})

if(${PROJECT_NAME}_USE_VK)
  target_include_directories (${PROJECT_NAME} PUBLIC
    ${VTK_INCLUDE_DIRS}
    ${iMSTK_SOURCEs_DIR}/SimulationManager/VTKRenderer
  )
else()
  target_include_directories (${PROJECT_NAME} PUBLIC
    ${VTK_INCLUDE_DIRS}
  )

endif()