aorii/src/renderer/CMakeLists.txt
2024-12-17 10:54:19 +08:00

87 lines
3.4 KiB
CMake

project(aorii_renderer)
set(GL_BACKEND FALSE CACHE BOOL "OpenGL backend to use")
set(DX_BACKEND FALSE CACHE BOOL "DirectX backend to use")
set(VK_BACKEND FALSE CACHE BOOL "Vulkan backend to use")
set(METAL_BACKEND FALSE CACHE BOOL "Metal backend to use")
if (NOT GL_BACKEND AND NOT DX_BACKEND AND NOT VK_BACKEND AND NOT METAL_BACKEND)
message(FATAL_ERROR "No backend selected")
endif()
set(RENDERER_SOURCES "")
retrieve_files(core RENDERER_SOURCES)
retrieve_files(misc RENDERER_SOURCES)
if (GL_BACKEND)
retrieve_files(backend/gl RENDERER_SOURCES)
endif()
if (DX_BACKEND)
retrieve_files(backend/dx RENDERER_SOURCES)
endif ()
if (VK_BACKEND)
retrieve_files(backend/vk RENDERER_SOURCES)
endif ()
if (METAL_BACKEND)
retrieve_files(backend/metal RENDERER_SOURCES)
endif ()
add_library(${PROJECT_NAME} STATIC ${RENDERER_SOURCES})
target_link_libraries(${PROJECT_NAME} PUBLIC Eigen3::Eigen spdlog::spdlog glfw aorii_core)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${Stb_INCLUDE_DIR})
target_compile_definitions(${PROJECT_NAME} PRIVATE NOMINMAX)
add_os_definitions(${PROJECT_NAME})
configure_glfw_native(${PROJECT_NAME})
set(ALL_BACKENDS GL_BACKEND DX_BACKEND VK_BACKEND METAL_BACKEND)
if (GL_BACKEND)
target_compile_definitions(${PROJECT_NAME} PUBLIC GL_BACKEND=1)
list(REMOVE_ITEM ALL_BACKENDS GL_BACKEND)
endif()
if (DX_BACKEND)
target_compile_definitions(${PROJECT_NAME} PUBLIC DX_BACKEND=1)
list(REMOVE_ITEM ALL_BACKENDS DX_BACKEND)
target_link_libraries(${PROJECT_NAME} PRIVATE d3d11 d3dcompiler dxgi)
endif ()
if (VK_BACKEND)
target_compile_definitions(${PROJECT_NAME} PUBLIC VK_BACKEND=1)
list(REMOVE_ITEM ALL_BACKENDS VK_BACKEND)
endif ()
if (METAL_BACKEND)
target_compile_definitions(${PROJECT_NAME} PUBLIC METAL_BACKEND=1)
list(REMOVE_ITEM ALL_BACKENDS METAL_BACKEND)
endif ()
foreach(BACKEND ${ALL_BACKENDS})
target_compile_definitions(${PROJECT_NAME} PUBLIC ${BACKEND}=0)
endforeach()
# 添加编译shader的自定义命令
if (NOT DEFINED SHADER_OUTPUT_DIR)
set(SHADER_OUTPUT_DIR ${CMAKE_BINARY_DIR}/shaders CACHE PATH "Output directory for compiled shaders")
message(STATUS "SHADER_OUTPUT_DIR not defined, using default: ${SHADER_OUTPUT_DIR}")
endif ()
function(compile_aorii_shader SHADER_FILE)
compile_slang_shaders("${CMAKE_CURRENT_SOURCE_DIR}/shader/${SHADER_FILE}.slang" "vertex" "vertex_main")
compile_slang_shaders("${CMAKE_CURRENT_SOURCE_DIR}/shader/${SHADER_FILE}.slang" "pixel" "pixel_main")
endfunction()
compile_aorii_shader(aorii_rect)
compile_aorii_shader(aorii_rounded_rect)
compile_aorii_shader(aorii_texture)
compile_aorii_shader(aorii_segment)
compile_aorii_shader(aorii_sdf_text)
add_compile_shaders_target("compile_aorii_shaders" ${PROJECT_NAME})
# 如果需要编译example, 添加自定义命令用于拷贝shader文件
if (BUILD_EXAMPLE)
# 复制${SHADER_OUTPUT_DIR}文件到${CMAKE_CURRENT_BINARY_DIR}/example/resource/shaders
set(SOURCE_DIR ${SHADER_OUTPUT_DIR})
set(DEST_DIR ${CMAKE_BINARY_DIR}/example/resource/shaders)
# 添加自定义命令, 当外部目标compile_aorii_shaders被编译时, 将${SOURCE_DIR}文件复制到${DEST_DIR}
add_custom_command(
TARGET compile_aorii_shaders
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE_DIR} ${DEST_DIR}
COMMENT "Copying shaders to ${DEST_DIR}"
)
endif ()