# examples/CMakeLists.txt
#
# Example programs for conformallab++.
# All examples require -DWITH_CGAL=ON.
# example_viewer additionally requires -DWITH_VIEWER=ON.
#
# Run after building:
#   ./build/examples/example_euclidean   [input.off] [output.off]
#   ./build/examples/example_hyper_ideal [input.off] [output.off]
#   ./build/examples/example_viewer      [input.off]         (requires WITH_VIEWER)

# ── Shared include paths for all examples ─────────────────────────────────────
set(EXAMPLE_INCLUDES
    ${CMAKE_SOURCE_DIR}/deps/eigen-3.4.0
    ${CMAKE_SOURCE_DIR}/deps/CGAL-6.1.1/include
    ${CMAKE_SOURCE_DIR}/deps/single_includes
    ${Boost_INCLUDE_DIRS}
)
set(EXAMPLE_PRIVATE_INCLUDES
    ${CMAKE_SOURCE_DIR}/include
)
set(EXAMPLE_DEFS
    CGAL_DISABLE_GMP
    CGAL_DISABLE_MPFR
)

# ── example_euclidean ─────────────────────────────────────────────────────────
add_executable(example_euclidean example_euclidean.cpp)
target_include_directories(example_euclidean SYSTEM PRIVATE ${EXAMPLE_INCLUDES})
target_include_directories(example_euclidean PRIVATE        ${EXAMPLE_PRIVATE_INCLUDES})
target_compile_definitions(example_euclidean PRIVATE        ${EXAMPLE_DEFS})

# ── example_hyper_ideal ───────────────────────────────────────────────────────
add_executable(example_hyper_ideal example_hyper_ideal.cpp)
target_include_directories(example_hyper_ideal SYSTEM PRIVATE ${EXAMPLE_INCLUDES})
target_include_directories(example_hyper_ideal PRIVATE        ${EXAMPLE_PRIVATE_INCLUDES})
target_compile_definitions(example_hyper_ideal PRIVATE        ${EXAMPLE_DEFS})

# ── example_layout ───────────────────────────────────────────────────────────
add_executable(example_layout example_layout.cpp)
target_include_directories(example_layout SYSTEM PRIVATE ${EXAMPLE_INCLUDES})
target_include_directories(example_layout PRIVATE        ${EXAMPLE_PRIVATE_INCLUDES})
target_compile_definitions(example_layout PRIVATE        ${EXAMPLE_DEFS})

# ── example_flatten (primary use case: real conformal flattening) ─────────────
# Demonstrates Θ_v = 2π → non-trivial conformal map; contrast with
# example_euclidean which uses "natural theta" (u_v ≈ 0, testing trick).
add_executable(example_flatten example_flatten.cpp)
target_include_directories(example_flatten SYSTEM PRIVATE ${EXAMPLE_INCLUDES})
target_include_directories(example_flatten PRIVATE        ${EXAMPLE_PRIVATE_INCLUDES})
target_compile_definitions(example_flatten PRIVATE        ${EXAMPLE_DEFS})

# ── example_cgal_api (CGAL public API: one-call interface) ────────────────────
# Demonstrates CGAL::discrete_conformal_map_euclidean from
# <CGAL/Discrete_conformal_map.h>; contrast with example_flatten (internal API).
add_executable(example_cgal_api example_cgal_api.cpp)
target_include_directories(example_cgal_api SYSTEM PRIVATE ${EXAMPLE_INCLUDES})
target_include_directories(example_cgal_api PRIVATE        ${EXAMPLE_PRIVATE_INCLUDES})
target_compile_definitions(example_cgal_api PRIVATE        ${EXAMPLE_DEFS})

# ── example_viewer (requires WITH_VIEWER) ─────────────────────────────────────
if(WITH_VIEWER)
    add_executable(example_viewer example_viewer.cpp)
    target_include_directories(example_viewer SYSTEM PRIVATE
        ${EXAMPLE_INCLUDES}
        ${CMAKE_SOURCE_DIR}/deps/libigl-2.6.0/include
        ${CMAKE_SOURCE_DIR}/deps/libigl-glad/include
    )
    target_include_directories(example_viewer PRIVATE ${EXAMPLE_PRIVATE_INCLUDES})
    target_compile_definitions(example_viewer PRIVATE ${EXAMPLE_DEFS})
    target_link_libraries(example_viewer PRIVATE viewer)
endif()
