cmake_minimum_required(VERSION 3.25)

project(mikemon VERSION 0.1 LANGUAGES CXX C)
set(CMAKE_C_STANDARD 23)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_DISABLE_PRECOMPILE_HEADERS ON)

option(TRACY_ENABLE "Enable Tracy profiling" OFF)

# glm
add_subdirectory(libs/glm)
target_compile_definitions(glm PUBLIC GLM_FORCE_SWIZZLE GLM_FORCE_XYZW_ONLY)

# SDL
set(SDL_SHARED OFF)
set(SDL_STATIC ON)
add_subdirectory(libs/SDL3)

# wgpu
add_subdirectory(libs/wgpu)

# SDL3_mixer
set(BUILD_SHARED_LIBS ${SDL_SHARED})
set(SDLMIXER_DEPS_SHARED       OFF)
set(SDLMIXER_VENDORED           ON)
set(SDLMIXER_OPUS               ON)
set(SDLMIXER_VORBIS_VORBISFILE OFF)
set(SDLMIXER_AIFF              OFF)
set(SDLMIXER_WAVE              OFF)
set(SDLMIXER_VOC               OFF)
set(SDLMIXER_AU                OFF)
set(SDLMIXER_FLAC              OFF)
set(SDLMIXER_GME               OFF)
set(SDLMIXER_MOD               OFF)
set(SDLMIXER_MP3               OFF)
set(SDLMIXER_MIDI              OFF)
set(SDLMIXER_WAVPACK           OFF)
add_subdirectory(libs/SDL3_mixer)

# Dear ImGui
add_library(imgui STATIC
    libs/imgui/imgui.cpp
    libs/imgui/imgui_draw.cpp
    libs/imgui/imgui_demo.cpp
    libs/imgui/imgui_tables.cpp
    libs/imgui/imgui_widgets.cpp
    libs/imgui/backends/imgui_impl_sdl3.cpp

    libs/dcimgui/dcimgui.cpp
    libs/dcimgui/dcimgui_internal.cpp
    libs/dcimgui/backends/dcimgui_impl_sdl3.cpp
)
target_include_directories(imgui PUBLIC
    libs/imgui
    libs/dcimgui
    libs/imgui/backends
)
target_link_libraries(imgui PRIVATE SDL3::SDL3)

# Dear ImGui WGPU backend
add_library(imgui_wgpu STATIC
    libs/imgui/backends/imgui_impl_wgpu.cpp
    libs/dcimgui/backends/dcimgui_impl_wgpu.cpp
)
target_include_directories(imgui_wgpu PUBLIC
    libs/imgui/backends
    libs/dcimgui/backends
)
target_link_libraries(imgui_wgpu PRIVATE imgui wgpu)
target_compile_definitions(imgui_wgpu PRIVATE IMGUI_IMPL_WEBGPU_BACKEND_WGPU=1)

# Dear ImGui SDLGPU backend
add_library(imgui_sdlgpu STATIC
    libs/imgui/backends/imgui_impl_sdlgpu3.cpp
    libs/dcimgui/backends/dcimgui_impl_sdlgpu3.cpp
)
target_include_directories(imgui_sdlgpu PUBLIC
    libs/imgui/backends
    libs/dcimgui/backends
)
target_link_libraries(imgui_sdlgpu PRIVATE imgui SDL3::SDL3)

# stb_image
add_library(stb_image STATIC libs/stb/stb_image.c)
target_include_directories(stb_image INTERFACE libs/stb)

# tracy
option(TRACY_ONLY_LOCALHOST "" ON)
add_subdirectory(libs/tracy)

# shaders
find_program(SLANGC_EXECUTABLE slangc)
set(SHADERS_SPV  "")
set(SHADERS_WGSL "")

function(add_shader name)
    if(SLANGC_EXECUTABLE)
        add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/spirv/${name}.spv" DEPFILE "${CMAKE_CURRENT_BINARY_DIR}/${name}-spv.dep"  COMMAND "${SLANGC_EXECUTABLE}" -depfile "${CMAKE_CURRENT_BINARY_DIR}/${name}-spv.dep"  "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/src/${name}.slang" -o "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/spirv/${name}.spv" -target spirv -profile spirv_1_0)
        add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/wgsl/${name}.wgsl" DEPFILE "${CMAKE_CURRENT_BINARY_DIR}/${name}-wgsl.dep" COMMAND "${SLANGC_EXECUTABLE}" -depfile "${CMAKE_CURRENT_BINARY_DIR}/${name}-wgsl.dep" "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/src/${name}.slang" -o "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/wgsl/${name}.wgsl" -target wgsl  -D__wgsl__)
    endif()

    set(SHADERS_SPV  ${SHADERS_SPV}  "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/spirv/${name}.spv" PARENT_SCOPE)
    set(SHADERS_WGSL ${SHADERS_WGSL} "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/wgsl/${name}.wgsl" PARENT_SCOPE)
endfunction()

add_shader(character)
add_shader(character_shadow)
add_shader(world)
add_shader(grid)

add_custom_target(shaders-spv  DEPENDS ${SHADERS_SPV})
add_custom_target(shaders-wgsl DEPENDS ${SHADERS_WGSL})

# game
add_executable(mikemon
    src/smol-atlas.cpp
    src/change_directory.c
    src/renderer_wgpu.c
    src/main.cpp
)
target_link_libraries(mikemon
    PRIVATE
        glm
        SDL3::SDL3
        SDL3_mixer::SDL3_mixer
        stb_image
        imgui
        imgui_wgpu
        TracyClient
        wgpu
)
add_dependencies(mikemon shaders-wgsl)

add_executable(mikemon-sdlgpu
    src/smol-atlas.cpp
    src/change_directory.c
    src/renderer_sdlgpu.c
    src/main.cpp
)
target_link_libraries(mikemon-sdlgpu
    PRIVATE
        glm
        SDL3::SDL3
        SDL3_mixer::SDL3_mixer
        stb_image
        imgui
        imgui_sdlgpu
        TracyClient
        wgpu
)
add_dependencies(mikemon-sdlgpu shaders-spv)
