cmake_minimum_required (VERSION 2.8.3)
project(DualSheetMeshing)

# compiler settings
if(MSVC)
  add_definitions(
    -D__STDC_LIMIT_MACROS
    -DEIGEN_DONT_ALIGN_STATICALLY
  )
  set(CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG}   /MTd /bigobj")
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT /GL /bigobj")
  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT /Od /Zi /bigobj")
  set(CMAKE_C_FLAGS_DEBUG   "${CMAKE_C_FLAGS_DEBUG}   /MTd")
  set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT /GL")
  set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MT /Od /Zi")
  set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG")
elseif(APPLE)
  set(CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG} -O0")
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
  set(CMAKE_CXX_FLAGS "-std=c++14 -msse4 -stdlib=libc++ -ObjC++ -fPIC -fno-strict-aliasing -Wno-logical-op-parentheses -Wno-unused-command-line-argument -Wno-shift-op-parentheses -Wno-comment -Wno-deprecated-declarations -D__PLACEMENT_NEW_INLINE -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo")
  string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
else()
  set(CMAKE_CXX_FLAGS "-std=c++14 -O3 -msse4")
endif()

include_directories(
  # external libraries
  ext
  ext/AntTweakBar/include
  ext/cereal-1.2.2/include
  ext/eigen-3.3.4
  ext/glew-2.1.0/include
  ext/glfw-3.2.1/include
  ext/openvolumemesh/src
  ext/tbb/include
  # general paths
  /usr/local/include
  /opt/local/include
)

# AntTweakBar
add_subdirectory(ext/AntTweakBar)

# GLEW
set(BUILD_UTILS OFF CACHE BOOL "" FORCE)
add_definitions(-DGLEW_STATIC)
add_subdirectory(ext/glew-2.1.0/build/cmake)

# GLFW
SET(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
SET(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
SET(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(ext/glfw-3.2.1)

# OpenVolumeMesh
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/ext/openvolumemesh/cmake)
add_subdirectory(ext/openvolumemesh)
add_definitions(-DINCLUDE_TEMPLATES)

# TBB
include(ext/tbb/cmake/TBBBuild.cmake)
tbb_build(TBB_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/ext/tbb CONFIG_DIR TBB_DIR MAKE_ARGS)
find_package(TBB REQUIRED tbb)

# instant-meshes
add_subdirectory(ext/instant-meshes)

if (GEN_REFERENCEPOLYHEDRA)
  add_executable(gen_referencepolyhedra src/gen_referencepolyhedra.cpp)
endif()

# DualSheetMeshing
add_executable(DualSheetMeshing MACOSX_BUNDLE
  src/app.cpp
  src/app/main.cpp
  src/app/State_EditFeatureGraph.cpp
  src/app/State_EditHexLayout.cpp
  src/app/State_EditHexMesh.cpp
  src/app/State_EditSheet.cpp
  src/app/shader_source.cpp
  src/app/drawhelper.cpp
  src/app/ssao.cpp
  src/app/serialization.cpp
  src/core.cpp
  src/helper.cpp
  src/misc.cpp
  src/referencepolyhedron.cpp
  src/sheet.cpp
  src/trimesh.cpp
)
target_link_libraries(DualSheetMeshing
  AntTweakBar
  glew_s
  glfw
  OpenVolumeMesh
  instant_meshes
  ${TBB_IMPORTED_TARGETS}
)
