cmake_minimum_required(VERSION 3.12)
project(wolf2009_skinned_model_checks LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(render "${CMAKE_CURRENT_SOURCE_DIR}/../../src/idtech4a_render")
set(core "${CMAKE_CURRENT_SOURCE_DIR}/../../src/wolf2009")
set(WOLF2009_MINIZ_SOURCE_DIR "" CACHE PATH "Pinned miniz source directory")
if(WOLF2009_MINIZ_SOURCE_DIR)
    add_library(skinned_miniz STATIC "${WOLF2009_MINIZ_SOURCE_DIR}/miniz.c")
    target_include_directories(skinned_miniz PUBLIC "${WOLF2009_MINIZ_SOURCE_DIR}")
    set(compression skinned_miniz)
else()
    find_package(ZLIB REQUIRED)
    set(compression ZLIB::ZLIB)
endif()
add_library(skinned_model_data STATIC
    "${render}/SkinnedModelData.cpp" "${render}/RenderData.cpp"
    "${core}/GreeterModel.cpp" "${core}/GreeterAnimation.cpp" "${core}/SkeletonData.cpp"
    "${core}/Geometry.cpp" "${core}/Dds.cpp" "${core}/Material.cpp"
    "${core}/ZipArchive.cpp" "${core}/Archive.cpp" "${core}/StreamMounts.cpp")
target_include_directories(skinned_model_data PUBLIC "${render}" "${core}")
target_link_libraries(skinned_model_data PUBLIC ${compression})
if(WOLF2009_MINIZ_SOURCE_DIR)
    target_compile_definitions(skinned_model_data PRIVATE WOLF2009_USE_MINIZ)
endif()
add_executable(wolf2009-skinned-model SkinnedModelTest.cpp)
target_link_libraries(wolf2009-skinned-model PRIVATE skinned_model_data)
enable_testing()
add_test(NAME wolf2009_skinned_model_synthetic COMMAND wolf2009-skinned-model --self-test)
add_executable(wolf2009-skinned-mesh-v2 SkinnedMeshV2Test.cpp)
target_link_libraries(wolf2009-skinned-mesh-v2 PRIVATE skinned_model_data)
add_test(NAME wolf2009_skinned_mesh_v2_synthetic COMMAND wolf2009-skinned-mesh-v2)
set(WOLF2009_SP_BASE "" CACHE PATH "Optional owner-supplied SP/base for read-only source comparison")
if(WOLF2009_SP_BASE)
    add_test(NAME wolf2009_skinned_model_source COMMAND wolf2009-skinned-model --source-base "${WOLF2009_SP_BASE}")
    add_test(NAME wolf2009_skinned_mesh_v2_source COMMAND wolf2009-skinned-mesh-v2 --source-base "${WOLF2009_SP_BASE}")
endif()

# Explicit root-LOD compatibility profile, independent of native game/graphics.
add_executable(wolf2009-root-lod-profile RootLodProfileTest.cpp
    "${render}/../idtech4a_anim/AnimationWireV2.cpp"
    "${core}/SourceRigAnimation.cpp" "${core}/SplineClipData.cpp" "${core}/SplineTransformCodec.cpp")
target_include_directories(wolf2009-root-lod-profile PRIVATE "${render}/../idtech4a_anim")
target_link_libraries(wolf2009-root-lod-profile PRIVATE skinned_model_data)
if(NOT MSVC)
    target_compile_options(skinned_model_data PRIVATE -ffp-contract=off -fno-fast-math)
    target_compile_options(wolf2009-root-lod-profile PRIVATE -ffp-contract=off -fno-fast-math)
endif()
add_test(NAME wolf2009_root_lod_profile_synthetic COMMAND wolf2009-root-lod-profile)
if(WOLF2009_SP_BASE)
    add_test(NAME wolf2009_root_lod_profile_mp40_source COMMAND wolf2009-root-lod-profile --source-base "${WOLF2009_SP_BASE}")
endif()
