cmake_minimum_required(VERSION 3.12)

project(psdr_enzyme VERSION 0.0.1 DESCRIPTION "Differentiable Volume Path Tracer")
include(CheckIPOSupported)

check_ipo_supported() # fatal error if IPO is not supported

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS_RELEASE "")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
set(PYTHON_MIN_VERSION "3.8")
find_package(Python 3.8 COMPONENTS Interpreter Development REQUIRED)

find_package(Embree REQUIRED)
if(NOT EMBREE_FOUND)
    add_subdirectory(embree)
endif()

find_package(OpenMP REQUIRED)
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")


find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})

# # libigl
set(LIBIGL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ext/libigl/include)
# option(LIBIGL_USE_STATIC_LIBRARY     "Use libIGL as static librarie" ON)
option(LIBIGL_WITH_OPENGL           "Use OpenGL"        OFF)
option(LIBIGL_WITH_OPENGL_GLFW      "Use GLFW"          OFF)
option(LIBIGL_WITH_TETGEN 			"Use Tetgen" 		ON)

find_package(LIBIGL REQUIRED QUIET)

include_directories(${Python_INCLUDE_DIRS})
include_directories(${EMBREE_INCLUDE_PATH})
include_directories(include/)
include_directories(src/)

add_subdirectory(ext/Catch2)
add_subdirectory(ext/spdlog)
add_subdirectory(ext/pugixml)
add_subdirectory(ext/tinyobjloader)
add_subdirectory(ext/fmt)
add_subdirectory(ext/pybind11)

if (MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2 /O2 /Z7 /wd4244 /wd4267 /wd4305 /wd4996")
elseif (APPLE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -Wno-ignored-attributes -Wno-macro-redefined -Wall -g -O3 -fvisibility=hidden")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -fno-vectorize -fno-slp-vectorize -fno-unroll-loops -g")
    # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-vectorize -fno-slp-vectorize -fno-unroll-loops")
endif()
add_compile_options(-Xclang -new-struct-path-tbaa)


add_subdirectory(src)

add_library(psdr_cpu SHARED
            src/scene/scene_loader.cpp
            src/psdr.cpp)
set_target_properties(psdr_cpu PROPERTIES PREFIX "")
target_link_libraries(psdr_cpu PUBLIC
    ${EMBREE_LIBRARY}
    psdr-core
    psdr-render
    integrator
    OpenMP::OpenMP_CXX
    pugixml
    spdlog
    igl::core 
    igl::tetgen 
    tinyobjloader
    pybind11::headers)

if (WIN32)
    set(PYTHON_EXEC "python")
else()
    set(PYTHON_EXEC "python3")
endif()

execute_process(
    COMMAND ${PYTHON_EXEC} -c "if True:
        from distutils import sysconfig as sc
        print(sc.get_python_lib())"
    OUTPUT_VARIABLE PYTHON_SITE
    OUTPUT_STRIP_TRAILING_WHITESPACE)

install(
    TARGETS psdr_cpu
    DESTINATION ${PYTHON_SITE})

execute_process (
    COMMAND ${PYTHON_EXEC} -c "from distutils.sysconfig import get_python_version; print(get_python_version())"
    OUTPUT_VARIABLE PYTHON_VERSION
    OUTPUT_STRIP_TRAILING_WHITESPACE)

install(CODE "execute_process(COMMAND ${PYTHON_EXEC} ${CMAKE_CURRENT_SOURCE_DIR}/setup.py install
                              WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})")