MetaCore/cmake/MetaCorePanda3D.cmake

139 lines
6.4 KiB
CMake

set(METACORE_PANDA3D_VERSION "1.10.16" CACHE STRING "Pinned Panda3D SDK version used by MetaCore")
set(METACORE_PANDA3D_ARCH "x64" CACHE STRING "Pinned Panda3D Windows architecture used by MetaCore")
set(METACORE_PANDA3D_LOCAL_ROOT "${CMAKE_SOURCE_DIR}/.metacore/deps/panda3d/${METACORE_PANDA3D_VERSION}-${METACORE_PANDA3D_ARCH}" CACHE PATH "Local Panda3D SDK cache directory")
function(metacore_prepare_panda3d)
if(WIN32)
if(DEFINED ENV{PANDA3D_ROOT} AND NOT "$ENV{PANDA3D_ROOT}" STREQUAL "")
set(_metacore_panda3d_root "$ENV{PANDA3D_ROOT}")
elseif(DEFINED PANDA3D_ROOT AND NOT "${PANDA3D_ROOT}" STREQUAL "")
set(_metacore_panda3d_root "${PANDA3D_ROOT}")
else()
set(_metacore_panda3d_root "${METACORE_PANDA3D_LOCAL_ROOT}")
endif()
file(TO_CMAKE_PATH "${_metacore_panda3d_root}" _metacore_panda3d_root)
if(NOT EXISTS "${_metacore_panda3d_root}/include/pandaFramework.h")
if(METACORE_AUTO_PREPARE_PANDA3D)
message(STATUS "MetaCore will prepare Panda3D SDK into ${_metacore_panda3d_root}")
execute_process(
COMMAND
powershell
-NoProfile
-ExecutionPolicy Bypass
-File "${CMAKE_SOURCE_DIR}/scripts/PrepareMetaCorePanda3D.ps1"
-Version "${METACORE_PANDA3D_VERSION}"
-Architecture "${METACORE_PANDA3D_ARCH}"
-InstallDir "${_metacore_panda3d_root}"
RESULT_VARIABLE _metacore_prepare_result
)
if(NOT _metacore_prepare_result EQUAL 0)
message(FATAL_ERROR "MetaCore failed to prepare Panda3D SDK. Set PANDA3D_ROOT manually or inspect scripts/PrepareMetaCorePanda3D.ps1 output.")
endif()
else()
message(FATAL_ERROR "Panda3D SDK was not found. Set PANDA3D_ROOT or enable METACORE_AUTO_PREPARE_PANDA3D.")
endif()
endif()
set(METACORE_PANDA3D_ROOT "${_metacore_panda3d_root}" CACHE PATH "Resolved Panda3D SDK root used by MetaCore" FORCE)
set(METACORE_PANDA3D_INCLUDE_DIR "${METACORE_PANDA3D_ROOT}/include" CACHE PATH "Resolved Panda3D include directory" FORCE)
set(METACORE_PANDA3D_LIB_DIR "${METACORE_PANDA3D_ROOT}/lib" CACHE PATH "Resolved Panda3D library directory" FORCE)
set(METACORE_PANDA3D_BIN_DIR "${METACORE_PANDA3D_ROOT}/bin" CACHE PATH "Resolved Panda3D runtime directory" FORCE)
set(METACORE_PANDA3D_ETC_DIR "${METACORE_PANDA3D_ROOT}/etc" CACHE PATH "Resolved Panda3D config directory" FORCE)
set(METACORE_PANDA3D_MODELS_DIR "${METACORE_PANDA3D_ROOT}/models" CACHE PATH "Resolved Panda3D models directory" FORCE)
set(METACORE_PANDA3D_PLUGINS_DIR "${METACORE_PANDA3D_ROOT}/plugins" CACHE PATH "Resolved Panda3D plugins directory" FORCE)
set(_metacore_panda3d_libraries
"${METACORE_PANDA3D_LIB_DIR}/libp3framework.lib"
"${METACORE_PANDA3D_LIB_DIR}/libpanda.lib"
"${METACORE_PANDA3D_LIB_DIR}/libpandafx.lib"
"${METACORE_PANDA3D_LIB_DIR}/libpandaexpress.lib"
"${METACORE_PANDA3D_LIB_DIR}/libpandagl.lib"
"${METACORE_PANDA3D_LIB_DIR}/libp3windisplay.lib"
"${METACORE_PANDA3D_LIB_DIR}/libp3dtool.lib"
"${METACORE_PANDA3D_LIB_DIR}/libp3dtoolconfig.lib"
opengl32
gdi32
user32
shell32
advapi32
ws2_32
winmm
)
add_library(MetaCorePanda3D::SDK INTERFACE IMPORTED GLOBAL)
set_target_properties(MetaCorePanda3D::SDK PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${METACORE_PANDA3D_INCLUDE_DIR}"
INTERFACE_LINK_LIBRARIES "${_metacore_panda3d_libraries}"
)
file(GLOB METACORE_PANDA3D_RUNTIME_DLLS "${METACORE_PANDA3D_BIN_DIR}/*.dll")
set(METACORE_PANDA3D_RUNTIME_DLLS "${METACORE_PANDA3D_RUNTIME_DLLS}" CACHE INTERNAL "Resolved Panda3D runtime DLL list")
else()
message(FATAL_ERROR "MetaCore Panda3D V1 currently supports Windows only.")
endif()
endfunction()
function(metacore_stage_panda3d_runtime target_name)
if(NOT TARGET ${target_name})
message(FATAL_ERROR "Target ${target_name} does not exist.")
endif()
foreach(_metacore_runtime_dll IN LISTS METACORE_PANDA3D_RUNTIME_DLLS)
add_custom_command(TARGET ${target_name} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${_metacore_runtime_dll}"
"$<TARGET_FILE_DIR:${target_name}>"
)
endforeach()
if(EXISTS "${METACORE_PANDA3D_ETC_DIR}")
add_custom_command(TARGET ${target_name} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${METACORE_PANDA3D_ETC_DIR}"
"$<TARGET_FILE_DIR:${target_name}>/etc"
)
endif()
if(EXISTS "${METACORE_PANDA3D_MODELS_DIR}")
add_custom_command(TARGET ${target_name} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${METACORE_PANDA3D_MODELS_DIR}"
"$<TARGET_FILE_DIR:${target_name}>/models"
)
endif()
if(EXISTS "${METACORE_PANDA3D_PLUGINS_DIR}")
add_custom_command(TARGET ${target_name} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${METACORE_PANDA3D_PLUGINS_DIR}"
"$<TARGET_FILE_DIR:${target_name}>/plugins"
)
endif()
endfunction()
function(metacore_stage_simplepbr_runtime target_name)
if(NOT TARGET ${target_name})
message(FATAL_ERROR "Target ${target_name} does not exist.")
endif()
set(_metacore_simplepbr_root "${CMAKE_SOURCE_DIR}/third_party/simplepbr-shaders")
if(EXISTS "${_metacore_simplepbr_root}/shaders")
add_custom_command(TARGET ${target_name} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${_metacore_simplepbr_root}/shaders"
"$<TARGET_FILE_DIR:${target_name}>/simplepbr/shaders"
)
endif()
if(EXISTS "${_metacore_simplepbr_root}/textures")
add_custom_command(TARGET ${target_name} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${_metacore_simplepbr_root}/textures"
"$<TARGET_FILE_DIR:${target_name}>/simplepbr/textures"
)
endif()
endfunction()