cmake_minimum_required(VERSION 3.14)
project(ImXui VERSION 0.1.0 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(IMXUI_CORE_SOURCES
    src/Element.cpp
    src/Canvas.cpp
    src/XurParser.cpp
    src/XuiClasses.cpp
    src/XurXml.cpp
    src/Application.cpp
    src/RenderCommands.cpp
    src/XuiControls.cpp
    src/XzpPackage.cpp
    src/XuiXmlWriter.cpp
    src/XurWriter.cpp
    src/Audio.cpp
    src/ImageManager.cpp
)


if(WIN32)
    list(APPEND IMXUI_CORE_SOURCES src/XuiCompat.cpp src/X360Backend.cpp)
endif()

set(IMXUI_BACKEND_SOURCES
    src/Renderer.cpp
    src/TextureManager.cpp
    src/Skin.cpp
)


set(IMXUI_HEADERS
    include/ImXui/ImXui.h
    include/ImXui/RenderCommands.h
    include/ImXui/XurFormat.h
    include/ImXui/Renderer.h
    include/ImXui/TextureManager.h
    include/ImXui/Skin.h
    include/ImXui/XurWriter.h
    include/ImXui/XuiXmlWriter.h
    include/ImXui/Audio.h
)


add_library(ImXuiCore STATIC ${IMXUI_CORE_SOURCES} ${IMXUI_HEADERS})
target_include_directories(ImXuiCore PUBLIC include compat/include third_party)
target_include_directories(ImXuiCore PRIVATE src)
target_include_directories(ImXuiCore PUBLIC include)

set(IMXUI_HEADERS ${IMXUI_HEADERS} compat/include/xui.h compat/include/xuiapp.h
    compat/include/xuirender.h compat/include/xuiresource.h)


add_library(ImXuiSoft STATIC
    src/FontEngine.cpp
    src/SoftwareRenderer.cpp
)
target_include_directories(ImXuiSoft PUBLIC include)
target_include_directories(ImXuiSoft PRIVATE src third_party)
target_link_libraries(ImXuiSoft PUBLIC ImXuiCore)

if(NOT WIN32)
    find_package(OpenGL)
endif()

if(WIN32)
    add_library(ImXui STATIC ${IMXUI_BACKEND_SOURCES} ${IMXUI_HEADERS})
    target_include_directories(ImXui PUBLIC include)
    target_include_directories(ImXui PRIVATE src)
    target_link_libraries(ImXui PUBLIC ImXuiCore d3d11.lib dxgi.lib d3dcompiler.lib d2d1.lib dwrite.lib)
endif()

if(WIN32)
    add_executable(NotepadDemo WIN32 examples/NotepadDemo.cpp)
    target_link_libraries(NotepadDemo PRIVATE ImXui comdlg32.lib)
    target_include_directories(NotepadDemo PRIVATE include)
    add_custom_command(TARGET NotepadDemo POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${CMAKE_SOURCE_DIR}/examples/assets/notepad.xui"
            "$<TARGET_FILE_DIR:NotepadDemo>"
        COMMENT "Copying notepad.xui"
        VERBATIM)
endif()

if(UNIX AND NOT APPLE)
    if(OpenGL_FOUND)
        target_sources(ImXuiSoft PRIVATE src/OpenGLRenderer.cpp)
        target_compile_definitions(ImXuiCore PRIVATE IMXUI_HAS_OPENGL IMXUI_HAS_GLX)
        target_compile_definitions(ImXuiSoft PRIVATE IMXUI_HAS_OPENGL IMXUI_HAS_GLX)
        target_compile_definitions(ImXuiSoft PRIVATE IMXUI_HAS_OPENGL IMXUI_HAS_GLX)
        target_link_libraries(ImXuiSoft PUBLIC OpenGL::GL)
    endif()
    add_executable(NotepadDemo examples/NotepadDemo.cpp)
    target_link_libraries(NotepadDemo PRIVATE ImXuiSoft ImXuiCore X11)
    target_include_directories(NotepadDemo PRIVATE include)
    add_custom_command(TARGET NotepadDemo POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${CMAKE_SOURCE_DIR}/examples/assets/notepad.xui"
            "$<TARGET_FILE_DIR:NotepadDemo>"
        COMMENT "Copying notepad.xui"
        VERBATIM)
endif()

if(WIN32)
find_file(D3DCOMPILER_DLL d3dcompiler_46.dll
    PATHS
        "C:/Program Files (x86)/Windows Kits/8.0/Redist/D3D/x86"
        "C:/Program Files (x86)/Windows Kits/8.1/Redist/D3D/x86"
        "C:/Program Files (x86)/Windows Kits/10/Redist/D3D/x86"
    NO_DEFAULT_PATH
)
mark_as_advanced(D3DCOMPILER_DLL)
if(D3DCOMPILER_DLL)
    add_custom_command(TARGET NotepadDemo POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${D3DCOMPILER_DLL}"
            "$<TARGET_FILE_DIR:NotepadDemo>"
        COMMENT "Copying d3dcompiler_46.dll")
endif()
endif()


add_executable(XUITool tools/xuitool.cpp
    third_party/zlib/adler32.c
    third_party/zlib/compress.c
    third_party/zlib/crc32.c
    third_party/zlib/deflate.c
    third_party/zlib/infback.c
    third_party/zlib/inffast.c
    third_party/zlib/inflate.c
    third_party/zlib/inftrees.c
    third_party/zlib/trees.c
    third_party/zlib/uncompr.c
    third_party/zlib/zutil.c
)
target_link_libraries(XUITool PRIVATE ImXuiCore)
target_include_directories(XUITool PRIVATE include third_party/zlib)

if(WIN32)
    install(TARGETS ImXui LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
endif()

install(DIRECTORY include/ DESTINATION include)
