cmake_minimum_required(VERSION 3.16)
project(card_raytracer CXX)

# The original card.cc is sacred and must NOT be modified. We compile it
# verbatim. Because the file is golfed C++ from the early 2010s, we relax
# a few things so a modern compiler accepts it untouched:
#   - C++14 (default constructor v(){} is fine; pow(float,int) overload exists)
#   - -w  silences the unavoidable warnings (implicit float->int conversions
#         in the final printf, narrowing, unused result of operator new, etc.)
#         We can't fix them — we'd have to edit card.cc, which we won't.
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

add_executable(card card.cc)
add_executable(card_explained card_explained.cc)

# Per-compiler flags. The original is golfed and triggers warnings we can't
# fix without editing it (forbidden). The de-obfuscated version keeps full
# warnings on so it stays honest.
if(MSVC)
    target_compile_options(card           PRIVATE /w /O2)
    target_compile_options(card_explained PRIVATE /W4 /O2)
else()
    target_compile_options(card           PRIVATE -w -O3)
    target_compile_options(card_explained PRIVATE -Wall -Wextra -O3)
endif()

# Convenience targets: render an image from each binary.
# Run with:  cmake --build build --target image
add_custom_target(image
    COMMAND card > aek.ppm
    DEPENDS card
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Rendering aek.ppm from the original card (512x512 @ 64 spp)"
)

add_custom_target(image_explained
    COMMAND card_explained > aek_explained.ppm
    DEPENDS card_explained
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Rendering aek_explained.ppm from the de-obfuscated card"
)
