cmake_minimum_required(VERSION 3.28)

project(obs-dshow-rgb-bridge VERSION 1.2.6 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(libobs REQUIRED)
find_package(obs-frontend-api REQUIRED)
find_package(Qt6 REQUIRED COMPONENTS Core Widgets)

add_library(obs-dshow-rgb-bridge MODULE
    obs-dshow-rgb-bridge.cpp
    ObsOutputRouter.cpp
    ObsOutputRouter.h
    OutputSourceControls.h
    OutputTargetControls.h
    OutputSettingsDialog.h
    TextureFanout.h
    ObsTargetMask.h
    ../assets/fonts/fonts.qrc
    ../common/InstanceConfiguration.cpp
    ../common/DJVCamVersion.rc
    ../common/ObsDShowNv12Protocol.h
    ../common/ObsDShowRgbProtocol.h
    ../common/ObsDShowYuy2Protocol.h
    ../common/DJVCamProtocol.h
)

target_include_directories(obs-dshow-rgb-bridge PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/../common"
)

target_link_libraries(obs-dshow-rgb-bridge PRIVATE
    OBS::libobs
    OBS::obs-frontend-api
    Qt6::Core
    Qt6::Widgets
    d3d11
    dxgi
    advapi32
    ole32

)

target_compile_definitions(obs-dshow-rgb-bridge PRIVATE
    UNICODE
    _UNICODE
    WIN32_LEAN_AND_MEAN
    NOMINMAX
)

if(MSVC)
    target_compile_options(obs-dshow-rgb-bridge PRIVATE
		/utf-8
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/O2>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/GL>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/Gy>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/Gw>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/GS>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/guard:cf>
    )
    target_link_options(obs-dshow-rgb-bridge PRIVATE
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/INCREMENTAL:NO>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/LTCG>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/OPT:REF>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/OPT:ICF>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/DYNAMICBASE>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/NXCOMPAT>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/guard:cf>
        $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/CETCOMPAT>
    )
endif()

set_target_properties(obs-dshow-rgb-bridge PROPERTIES
    AUTOMOC ON
    AUTORCC ON
    PREFIX ""
    OUTPUT_NAME "dj-vcam-obs-brige"
)

include(CTest)
if(BUILD_TESTING)
    add_executable(InstanceConfigurationTest
        tests/InstanceConfigurationTest.cpp ../common/InstanceConfiguration.cpp)
    target_link_libraries(InstanceConfigurationTest PRIVATE advapi32 ole32)
    target_compile_definitions(InstanceConfigurationTest PRIVATE
        DJVCAM_ISOLATED_TEST UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
    add_test(NAME isolated-instance-configuration COMMAND InstanceConfigurationTest)
    set_tests_properties(isolated-instance-configuration PROPERTIES TIMEOUT 20)
    add_executable(ObsOutputRouterTest tests/ObsOutputRouterTest.cpp ObsOutputRouter.cpp)
    target_link_libraries(ObsOutputRouterTest PRIVATE OBS::libobs)
    target_compile_definitions(ObsOutputRouterTest PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN)
    add_executable(OutputSourceControlsTest tests/OutputSourceControlsTest.cpp)
    target_link_libraries(OutputSourceControlsTest PRIVATE OBS::libobs Qt6::Widgets)
    add_executable(OutputTargetControlsTest tests/OutputTargetControlsTest.cpp)
    target_link_libraries(OutputTargetControlsTest PRIVATE Qt6::Widgets)
    add_executable(OutputSettingsDialogTest tests/OutputSettingsDialogTest.cpp)
    target_link_libraries(OutputSettingsDialogTest PRIVATE OBS::libobs Qt6::Widgets)
    add_executable(ObsTargetMaskTest tests/ObsTargetMaskTest.cpp)
    add_test(NAME obs-target-mask COMMAND ObsTargetMaskTest)
    add_executable(TextureFanoutTest tests/TextureFanoutTest.cpp)
    target_link_libraries(TextureFanoutTest PRIVATE d3d11 dxgi)
    target_compile_definitions(TextureFanoutTest PRIVATE DJVCAM_ISOLATED_TEST UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
    add_test(NAME isolated-texture-fanout COMMAND TextureFanoutTest)
    set_tests_properties(isolated-texture-fanout PROPERTIES TIMEOUT 45)
    add_executable(ConcurrentHeartbeatTest tests/ConcurrentHeartbeatTest.cpp)
    target_link_libraries(ConcurrentHeartbeatTest PRIVATE d3d11 dxgi)
    target_compile_definitions(ConcurrentHeartbeatTest PRIVATE DJVCAM_ISOLATED_TEST UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
    add_test(NAME isolated-concurrent-heartbeat COMMAND ConcurrentHeartbeatTest)
    set_tests_properties(isolated-concurrent-heartbeat PROPERTIES TIMEOUT 45)
    add_executable(ObsMultiTargetIntegrationTest tests/ObsMultiTargetIntegrationTest.cpp ObsOutputRouter.cpp ../common/InstanceConfiguration.cpp)
    target_include_directories(ObsMultiTargetIntegrationTest PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../common")
    target_link_libraries(ObsMultiTargetIntegrationTest PRIVATE OBS::libobs OBS::obs-frontend-api Qt6::Widgets d3d11 dxgi advapi32 ole32)
    target_compile_definitions(ObsMultiTargetIntegrationTest PRIVATE DJVCAM_ISOLATED_TEST UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
    if(MSVC)
        target_compile_options(InstanceConfigurationTest PRIVATE /utf-8)
        target_compile_options(ObsOutputRouterTest PRIVATE /utf-8)
        target_compile_options(OutputSourceControlsTest PRIVATE /utf-8)
        target_compile_options(OutputTargetControlsTest PRIVATE /utf-8)
        target_compile_options(OutputSettingsDialogTest PRIVATE /utf-8)
        target_compile_options(ObsTargetMaskTest PRIVATE /utf-8)
        target_compile_options(TextureFanoutTest PRIVATE /utf-8)
        target_compile_options(ConcurrentHeartbeatTest PRIVATE /utf-8)
        target_compile_options(ObsMultiTargetIntegrationTest PRIVATE /utf-8)
    endif()
endif()
