cmake_minimum_required(VERSION 3.13)

set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)

project(AnimTestbed
        VERSION 0.0.1
        LANGUAGES CXX C)

find_package(Threads)
find_package(OpenGL REQUIRED)

# glfw
set(GLFW_BUILD_DOCS Off)
set(GLFW_BUILD_EXAMPLES Off)
set(GLFW_BUILD_TESTS Off)
set(GLFW_BUILD_INSTALL Off)
add_subdirectory(3rdparty/glfw)

# ozz
set(ozz_build_tools ON)
set(ozz_build_fbx OFF CACHE BOOL "")
set(ozz_build_gltf ON)
set(ozz_build_data OFF CACHE BOOL "")
set(ozz_build_samples OFF CACHE BOOL "")
set(ozz_build_howtos OFF CACHE BOOL "")
set(ozz_build_tests OFF CACHE BOOL "")
set(ozz_build_simd_ref OFF CACHE BOOL "")
set(ozz_build_msvc_rt_dll OFF CACHE BOOL "")
add_subdirectory(3rdparty/ozz-animation)

set(ThirdPartyIncludeDeps
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/glfw/deps>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/glfw/deps>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Handmade-Math>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/imgui>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/imnodes>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/ozz-animation/include>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/sokol>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/vectorial/include>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>
)

# Shared code by main executable and tests
add_library(AnimTestbedCode OBJECT
        src/SyncTrack.cc
        src/SyncTrack.h
        src/ozzutils.cc
        src/AnimGraph/AnimGraphNodes.cc
        src/AnimGraph/AnimGraphNodes.h
        src/AnimGraph/AnimGraphData.cc
        src/AnimGraph/AnimGraphData.h
        src/AnimGraph/AnimGraphBlendTree.cc
        src/AnimGraph/AnimGraphBlendTree.h
        src/AnimGraph/AnimGraphStateMachine.cc
        src/AnimGraph/AnimGraphStateMachine.h
        src/AnimGraph/AnimNode.cc
        src/AnimGraph/AnimNode.h
        src/AnimGraph/AnimGraphResource.cc
        src/AnimGraph/AnimGraphResource.h)

target_include_directories(
        AnimTestbedCode
        PUBLIC
        src
        ${ThirdPartyIncludeDeps}
)

target_compile_features(AnimTestbedCode PRIVATE cxx_std_17)

# AnimTestbed Executable
add_executable(AnimTestbed)
target_include_directories(
        AnimTestbed
        PUBLIC
        ${ThirdPartyIncludeDeps}
)

target_sources(AnimTestbed PRIVATE
        src/main.cc
        src/embedded_fonts.h
        src/SkinnedMeshRenderer.cc
        src/AnimGraphEditor/AnimGraphEditor.cc
        src/AnimGraphEditor/AnimGraphEditor.h
        src/AnimGraphEditor/utilities/builders.cpp
        src/AnimGraphEditor/utilities/builders.h
        src/AnimGraphEditor/utilities/drawing.cpp
        src/AnimGraphEditor/utilities/drawing.h
        src/AnimGraphEditor/utilities/widgets.cpp
        src/AnimGraphEditor/utilities/widgets.h
        src/Camera.c
        src/SkinnedMesh.cc
        src/SkinnedMesh.h
        src/SkinnedMeshResource.cc
        src/SkinnedMeshResource.h
        3rdparty/glfw/deps/glad_gl.c
        3rdparty/imgui/imgui.cpp
        3rdparty/imgui/imgui_draw.cpp
        3rdparty/imgui/imgui_widgets.cpp
        3rdparty/imgui/imgui_tables.cpp
        3rdparty/imgui/imgui_demo.cpp
        3rdparty/imgui/backends/imgui_impl_glfw.cpp
        3rdparty/imgui/backends/imgui_impl_opengl3.cpp
        3rdparty/imgui/misc/cpp/imgui_stdlib.cpp
        3rdparty/imnodes/imnodes.cpp
        3rdparty/imgui-node-editor/imgui_node_editor.cpp
        3rdparty/imgui-node-editor/imgui_node_editor_api.cpp
        3rdparty/imgui-node-editor/imgui_node_editor.h
        3rdparty/imgui-node-editor/imgui_node_editor_internal.h
        3rdparty/imgui-node-editor/imgui_bezier_math.h
        3rdparty/imgui-node-editor/imgui_bezier_math.inl
        3rdparty/imgui-node-editor/imgui_canvas.cpp
        3rdparty/imgui-node-editor/imgui_canvas.h
        3rdparty/imgui-node-editor/imgui_extra_math.h
        3rdparty/imgui-node-editor/imgui_extra_math.inl
        3rdparty/imgui-node-editor/crude_json.cpp
        3rdparty/imgui-node-editor/crude_json.h
        # ImGui Extension needed for blueprint nodes
        3rdparty/imgui/imgui_stacklayout.cpp
        3rdparty/imgui/imgui_stacklayout.h
        3rdparty/imgui/imgui_stacklayout_internal.h
)

target_link_libraries(AnimTestbed AnimTestbedCode glfw ozz_base ozz_geometry ozz_animation ${OPENGL_LIBRARIES})

# Tests
add_executable(runtests)

set(ozz_offline_test_objs
        3rdparty/ozz-animation/src/animation/offline/skeleton_builder.cc
        3rdparty/ozz-animation/src/animation/offline/raw_skeleton.cc
        3rdparty/ozz-animation/src/animation/offline/animation_builder.cc
        3rdparty/ozz-animation/src/animation/offline/raw_animation.cc
)

target_sources(runtests PRIVATE
        tests/AnimGraphResourceTests.cc
        tests/AnimGraphEditorTests.cc
        # tests/AnimGraphEvalTests.cc
        tests/NodeDescriptorTests.cc
        tests/SyncTrackTests.cc
        tests/main.cc
        ${ozz_offline_test_objs}
)

target_include_directories(
        runtests
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
        PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/ozz-animation/src>
        ${ThirdPartyIncludeDeps}
)

target_compile_features(runtests PRIVATE cxx_std_17)

target_link_libraries(runtests AnimTestbedCode glfw ozz_base ozz_geometry ozz_animation)