add_executable(rendering_raytracing_minimal minimal.cpp)
target_link_libraries(rendering_raytracing_minimal
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

add_executable(rendering_raytracing_minimal_overlay minimal_overlay.cpp)
target_link_libraries(rendering_raytracing_minimal_overlay
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

add_executable(rendering_raytracing_example example.cpp)
target_link_libraries(rendering_raytracing_example
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

add_executable(rendering_raytracing_example_depth EXCLUDE_FROM_ALL example.cpp)
target_link_libraries(rendering_raytracing_example_depth
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend_depth
        rendering_raytracing_stb
)
target_compile_definitions(rendering_raytracing_example_depth PRIVATE RL_TOOLS_RENDERING_RAYTRACING_EXAMPLE_OUTPUT_MODE=2)

add_executable(rendering_raytracing_example_rgbd EXCLUDE_FROM_ALL example.cpp)
target_link_libraries(rendering_raytracing_example_rgbd
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend_depth
        rendering_raytracing_stb
)
target_compile_definitions(rendering_raytracing_example_rgbd PRIVATE RL_TOOLS_RENDERING_RAYTRACING_EXAMPLE_OUTPUT_MODE=1)

add_executable(rendering_raytracing_motion_blur motion_blur.cpp)
target_link_libraries(rendering_raytracing_motion_blur
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

add_executable(rendering_raytracing_antialiasing antialiasing.cpp)
target_link_libraries(rendering_raytracing_antialiasing
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

add_executable(rendering_raytracing_flow flow.cpp)
target_link_libraries(rendering_raytracing_flow
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

add_executable(rendering_raytracing_drone drone.cpp)
target_link_libraries(rendering_raytracing_drone
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

if(RL_TOOLS_RENDERING_RAYTRACING_BACKEND_RESOLVED STREQUAL "OPTIX")
    add_executable(rendering_raytracing_drone_device drone_device.cu)
    target_link_libraries(rendering_raytracing_drone_device
        PRIVATE
            RLtools::RLtools
            rendering_raytracing_backend
            rendering_raytracing_stb
    )
    set_target_properties(rendering_raytracing_drone_device PROPERTIES CUDA_STANDARD 17 CUDA_STANDARD_REQUIRED ON)
endif()

add_executable(rendering_raytracing_fixed_pose fixed_pose.cpp)
target_link_libraries(rendering_raytracing_fixed_pose
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

add_custom_target(rendering_raytracing_fixed_pose_png
    COMMAND $<TARGET_FILE:rendering_raytracing_fixed_pose>
        --output ${CMAKE_SOURCE_DIR}/rendering_raytracing_fixed_pose.png
    DEPENDS rendering_raytracing_fixed_pose
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)

function(add_rendering_raytracing_fixed_pose_target target_name shading output_mode backend_target)
    add_executable(${target_name} EXCLUDE_FROM_ALL fixed_pose.cpp)
    target_link_libraries(${target_name}
        PRIVATE
            RLtools::RLtools
            ${backend_target}
            rendering_raytracing_stb
    )
    target_compile_definitions(${target_name}
        PRIVATE
            RL_TOOLS_RENDERING_RAYTRACING_FIXED_POSE_SHADING=${shading}
            RL_TOOLS_RENDERING_RAYTRACING_FIXED_POSE_OUTPUT_MODE=${output_mode}
    )
endfunction()

add_rendering_raytracing_fixed_pose_target(rendering_raytracing_fixed_pose_low 0 0 rendering_raytracing_backend)
add_rendering_raytracing_fixed_pose_target(rendering_raytracing_fixed_pose_medium 1 0 rendering_raytracing_backend)
add_rendering_raytracing_fixed_pose_target(rendering_raytracing_fixed_pose_high 2 0 rendering_raytracing_backend)
add_rendering_raytracing_fixed_pose_target(rendering_raytracing_fixed_pose_veryhigh 3 0 rendering_raytracing_backend)
add_rendering_raytracing_fixed_pose_target(rendering_raytracing_fixed_pose_depth 3 2 rendering_raytracing_backend_depth)
add_rendering_raytracing_fixed_pose_target(rendering_raytracing_fixed_pose_rgbd 3 1 rendering_raytracing_backend_depth)

add_executable(rendering_raytracing_pose_trace EXCLUDE_FROM_ALL render_pose_trace.cpp)
target_link_libraries(rendering_raytracing_pose_trace
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_backend_depth
        rendering_raytracing_stb
)

add_executable(rendering_raytracing_pose_trace_motion_blur EXCLUDE_FROM_ALL render_pose_trace_motion_blur.cpp)
target_link_libraries(rendering_raytracing_pose_trace_motion_blur
    PRIVATE
        RLtools::RLtools
        rendering_raytracing_backend
        rendering_raytracing_stb
)

find_package(glfw3 QUIET)
find_package(OpenGL QUIET)
if(glfw3_FOUND AND OpenGL_FOUND)
    if(APPLE)
        add_compile_definitions(GL_SILENCE_DEPRECATION)
    endif()
    add_executable(rendering_raytracing_interactive interactive.cpp)
    target_link_libraries(rendering_raytracing_interactive
        PRIVATE
            RLtools::RLtools
            rendering_raytracing_backend
            rendering_raytracing_stb
            glfw
            OpenGL::GL
    )

    find_path(RL_TOOLS_GAMEPAD_MAPPER_SOURCE_DIR NAMES include/gamepad_mapper/gamepad_mapper.hpp HINTS "${PROJECT_SOURCE_DIR}/../gamepad-mapper" DOC "Path to the gamepad-mapper checkout")
    find_package(SDL3 3.2 CONFIG QUIET)
    if(RL_TOOLS_GAMEPAD_MAPPER_SOURCE_DIR AND SDL3_FOUND AND TARGET nlohmann_json::nlohmann_json)
        add_library(rendering_raytracing_gamepad_mapper STATIC "${RL_TOOLS_GAMEPAD_MAPPER_SOURCE_DIR}/src/gamepad_mapper.cpp")
        target_include_directories(rendering_raytracing_gamepad_mapper PUBLIC "${RL_TOOLS_GAMEPAD_MAPPER_SOURCE_DIR}/include")
        target_link_libraries(rendering_raytracing_gamepad_mapper PUBLIC SDL3::SDL3 PRIVATE nlohmann_json::nlohmann_json)
        target_compile_features(rendering_raytracing_gamepad_mapper PUBLIC cxx_std_17)
        add_executable(rendering_raytracing_interactive_gamepad interactive.cpp)
        target_link_libraries(rendering_raytracing_interactive_gamepad PRIVATE RLtools::RLtools rendering_raytracing_backend rendering_raytracing_stb rendering_raytracing_gamepad_mapper glfw OpenGL::GL)
        target_compile_definitions(rendering_raytracing_interactive_gamepad PRIVATE RL_TOOLS_RENDERING_RAYTRACING_INTERACTIVE_GAMEPAD)
    endif()

    add_executable(rendering_raytracing_interactive_depth EXCLUDE_FROM_ALL interactive.cpp)
    target_link_libraries(rendering_raytracing_interactive_depth
        PRIVATE
            RLtools::RLtools
            rendering_raytracing_backend_depth
            rendering_raytracing_stb
            glfw
            OpenGL::GL
    )
    target_compile_definitions(rendering_raytracing_interactive_depth PRIVATE RL_TOOLS_RENDERING_RAYTRACING_INTERACTIVE_OUTPUT_MODE=2)

    add_executable(rendering_raytracing_interactive_rgbd EXCLUDE_FROM_ALL interactive.cpp)
    target_link_libraries(rendering_raytracing_interactive_rgbd
        PRIVATE
            RLtools::RLtools
            rendering_raytracing_backend_depth
            rendering_raytracing_stb
            glfw
            OpenGL::GL
    )
    target_compile_definitions(rendering_raytracing_interactive_rgbd PRIVATE RL_TOOLS_RENDERING_RAYTRACING_INTERACTIVE_OUTPUT_MODE=1)

    add_executable(rendering_raytracing_interactive_segmentation EXCLUDE_FROM_ALL interactive.cpp)
    target_link_libraries(rendering_raytracing_interactive_segmentation
        PRIVATE
            RLtools::RLtools
            rendering_raytracing_backend_segmentation
            rendering_raytracing_stb
            glfw
            OpenGL::GL
    )
    target_compile_definitions(rendering_raytracing_interactive_segmentation PRIVATE RL_TOOLS_RENDERING_RAYTRACING_INTERACTIVE_OUTPUT_MODE=3)

    add_executable(rendering_raytracing_interactive_flow EXCLUDE_FROM_ALL interactive.cpp)
    target_link_libraries(rendering_raytracing_interactive_flow
        PRIVATE
            RLtools::RLtools
            rendering_raytracing_backend
            rendering_raytracing_stb
            glfw
            OpenGL::GL
    )
    target_compile_definitions(rendering_raytracing_interactive_flow PRIVATE RL_TOOLS_RENDERING_RAYTRACING_INTERACTIVE_OUTPUT_MODE=4)
endif()
