From b4a532f1d09178893ebce33b7c79e29635810dd4 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sun, 17 Mar 2019 17:14:23 -0600 Subject: [PATCH] CMake: Add support for building against FCollada --- cmake/modules/FindFCollada.cmake | 80 +++++++++++++++++++++++++++ dtool/Package.cmake | 7 +++ pandatool/CMakeLists.txt | 2 + pandatool/src/daeegg/CMakeLists.txt | 26 +++++++++ pandatool/src/daeprogs/CMakeLists.txt | 11 ++++ pandatool/src/ptloader/CMakeLists.txt | 4 ++ 6 files changed, 130 insertions(+) create mode 100644 cmake/modules/FindFCollada.cmake create mode 100644 pandatool/src/daeegg/CMakeLists.txt create mode 100644 pandatool/src/daeprogs/CMakeLists.txt diff --git a/cmake/modules/FindFCollada.cmake b/cmake/modules/FindFCollada.cmake new file mode 100644 index 0000000000..8db7f1ca00 --- /dev/null +++ b/cmake/modules/FindFCollada.cmake @@ -0,0 +1,80 @@ +# Filename: FindFCollada.cmake +# Author: CFSworks (17 Mar, 2019) +# +# Usage: +# find_package(FCollada [REQUIRED] [QUIET]) +# +# Once done this will define: +# FCOLLADA_FOUND - system has FCollada +# FCOLLADA_INCLUDE_DIR - the FCollada include directory +# +# FCOLLADA_RELEASE_LIBRARY - the filepath of the FCollada release library +# FCOLLADA_DEBUG_LIBRARY - the filepath of the FCollada debug library +# +# FCollada::FCollada - The recommended FCollada library to link against +# + +# Find the FCollada include files +find_path(FCOLLADA_INCLUDE_DIR "FCollada.h" PATH_SUFFIXES "FCollada") + +# Find the library built for release +find_library(FCOLLADA_RELEASE_LIBRARY + NAMES "FCollada" "libFCollada" + "FColladaS" "libFColladaS" + "FColladaU" "libFColladaU" + "FColladaSU" "libFColladaSU" +) + +# Find the library built for debug +find_library(FCOLLADA_DEBUG_LIBRARY + NAMES "FColladaD" "libFColladaD" + "FColladaSD" "libFColladaSD" + "FColladaUD" "libFColladaUD" + "FColladaSUD" "libFColladaSUD" +) + +mark_as_advanced(FCOLLADA_INCLUDE_DIR) +mark_as_advanced(FCOLLADA_RELEASE_LIBRARY) +mark_as_advanced(FCOLLADA_DEBUG_LIBRARY) + +set(_defines) +if(FCOLLADA_RELEASE_LIBRARY MATCHES "FCollada[^/]*U" OR + FCOLLADA_DEBUG_LIBRARY MATCHES "FCollada[^/]*U") + list(APPEND _defines "UNICODE") +endif() +if(NOT MSVC AND + NOT FCOLLADA_RELEASE_LIBRARY MATCHES "FCollada[^/]*S" AND + NOT FCOLLADA_DEBUG_LIBRARY MATCHES "FCollada[^/]*S") + list(APPEND _defines "FCOLLADA_DLL") +endif() + +foreach(_config RELEASE DEBUG) + # Make sure we have lib/includes for this config + if(NOT FCOLLADA_${_config}_LIBRARY OR NOT FCOLLADA_INCLUDE_DIR) + continue() + endif() + + if(NOT _HAS_FCOLLADA_LIBRARY) + set(_HAS_FCOLLADA_LIBRARY ON) + add_library(FCollada::FCollada UNKNOWN IMPORTED GLOBAL) + + set_target_properties(FCollada::FCollada PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "${_defines}" + INTERFACE_INCLUDE_DIRECTORIES "${FCOLLADA_INCLUDE_DIR}") + + endif() + + set_property(TARGET FCollada::FCollada + APPEND PROPERTY IMPORTED_CONFIGURATIONS "${_config}") + + set_target_properties(FCollada::FCollada PROPERTIES + IMPORTED_LOCATION_${_config} "${FCOLLADA_${_config}_LIBRARY}") + +endforeach(_config) +unset(_config) +unset(_defines) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(FCollada DEFAULT_MSG FCOLLADA_INCLUDE_DIR _HAS_FCOLLADA_LIBRARY) + +unset(_HAS_FCOLLADA_LIBRARY) diff --git a/dtool/Package.cmake b/dtool/Package.cmake index 04ccedf67e..384fc7254b 100644 --- a/dtool/Package.cmake +++ b/dtool/Package.cmake @@ -171,6 +171,13 @@ package_option(ASSIMP "Build pandatool with support for loading 3D assets supported by Assimp.") package_status(ASSIMP "Assimp") +# FCollada +find_package(FCollada QUIET) +package_option(FCOLLADA + "Build pandatool with support for loading Collada files using FCollada." + IMPORTED_AS FCollada::FCollada) +package_status(FCOLLADA "FCollada") + # # ------------ Math libraries ------------ diff --git a/pandatool/CMakeLists.txt b/pandatool/CMakeLists.txt index 1ecd9f6f58..162ba44e8e 100644 --- a/pandatool/CMakeLists.txt +++ b/pandatool/CMakeLists.txt @@ -6,6 +6,8 @@ endif() add_subdirectory(src/assimp) add_subdirectory(src/bam) add_subdirectory(src/converter) +add_subdirectory(src/daeegg) +add_subdirectory(src/daeprogs) add_subdirectory(src/dxf) add_subdirectory(src/dxfegg) add_subdirectory(src/dxfprogs) diff --git a/pandatool/src/daeegg/CMakeLists.txt b/pandatool/src/daeegg/CMakeLists.txt new file mode 100644 index 0000000000..07b6320d14 --- /dev/null +++ b/pandatool/src/daeegg/CMakeLists.txt @@ -0,0 +1,26 @@ +if(NOT HAVE_EGG OR NOT HAVE_FCOLLADA) + return() +endif() + +set(P3DAEEGG_HEADERS + config_daeegg.h + daeCharacter.h + daeMaterials.h + daeToEggConverter.h + fcollada_utils.h + pre_fcollada_include.h +) + +set(P3DAEEGG_SOURCES + config_daeegg.cxx + daeCharacter.cxx + daeMaterials.cxx + daeToEggConverter.cxx +) + +add_library(p3daeegg STATIC ${P3DAEEGG_HEADERS} ${P3DAEEGG_SOURCES}) +target_link_libraries(p3daeegg p3eggbase + PKG::FCOLLADA) + +# This is only needed for binaries in the pandatool package. It is not useful +# for user applications, so it is not installed. diff --git a/pandatool/src/daeprogs/CMakeLists.txt b/pandatool/src/daeprogs/CMakeLists.txt new file mode 100644 index 0000000000..432fc5ecd2 --- /dev/null +++ b/pandatool/src/daeprogs/CMakeLists.txt @@ -0,0 +1,11 @@ +if(HAVE_EGG AND HAVE_FCOLLADA) + + add_executable(egg2dae eggToDAE.cxx eggToDAE.h) + target_link_libraries(egg2dae p3daeegg p3eggbase p3progbase) + install(TARGETS egg2dae EXPORT Tools COMPONENT Tools DESTINATION bin) + + add_executable(dae2egg daeToEgg.cxx daeToEgg.h) + target_link_libraries(dae2egg p3daeegg p3eggbase p3progbase) + install(TARGETS dae2egg EXPORT Tools COMPONENT Tools DESTINATION bin) + +endif() diff --git a/pandatool/src/ptloader/CMakeLists.txt b/pandatool/src/ptloader/CMakeLists.txt index c88009a520..83c15713eb 100644 --- a/pandatool/src/ptloader/CMakeLists.txt +++ b/pandatool/src/ptloader/CMakeLists.txt @@ -19,4 +19,8 @@ target_link_libraries(p3ptloader PRIVATE p3dxfegg p3fltegg p3lwoegg p3objegg p3vrmlegg p3xfileegg p3converter) +if(HAVE_FCOLLADA) + target_link_libraries(p3ptloader PRIVATE p3daeegg) +endif() + install(TARGETS p3ptloader EXPORT Tools COMPONENT Tools DESTINATION ${MODULE_DESTINATION})