From 8d130b923d313d7e19355262185dfb3ceff88704 Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Sat, 14 Jan 2023 22:01:46 -0500 Subject: [PATCH] bgfx: Move geometryc and add cmake macro --- cmake/{ => bgfx}/3rdparty/meshoptimizer.cmake | 23 +-- cmake/bgfx/CMakeLists.txt | 2 + cmake/{tools => bgfx}/geometryc.cmake | 20 ++- cmake/bgfxToolUtils.cmake | 147 +++++++++++++++++- cmake/examples.cmake | 7 +- cmake/tools.cmake | 4 - 6 files changed, 177 insertions(+), 26 deletions(-) rename cmake/{ => bgfx}/3rdparty/meshoptimizer.cmake (53%) rename cmake/{tools => bgfx}/geometryc.cmake (62%) diff --git a/cmake/3rdparty/meshoptimizer.cmake b/cmake/bgfx/3rdparty/meshoptimizer.cmake similarity index 53% rename from cmake/3rdparty/meshoptimizer.cmake rename to cmake/bgfx/3rdparty/meshoptimizer.cmake index b5528f5..27bf0ba 100644 --- a/cmake/3rdparty/meshoptimizer.cmake +++ b/cmake/bgfx/3rdparty/meshoptimizer.cmake @@ -1,19 +1,24 @@ # bgfx.cmake - bgfx building in cmake # Written in 2017 by Joshua Brookover - +# # To the extent possible under law, the author(s) have dedicated all copyright # and related and neighboring rights to this software to the public domain # worldwide. This software is distributed without any warranty. - +# # You should have received a copy of the CC0 Public Domain Dedication along with # this software. If not, see . -if(TARGET meshoptimizer) - return() +# Ensure the directory exists +if(NOT IS_DIRECTORY ${BGFX_DIR}) + message(SEND_ERROR "Could not load bgfx, directory does not exist. ${BGFX_DIR}") + return() endif() -file(GLOB MESHOPTIMIZER_SOURCES ${BGFX_DIR}/3rdparty/meshoptimizer/src/*.cpp ${BGFX_DIR}/3rdparty/meshoptimizer/src/*.h) - -add_library(meshoptimizer STATIC ${MESHOPTIMIZER_SOURCES}) -target_include_directories(meshoptimizer PUBLIC ${BGFX_DIR}/3rdparty) -set_target_properties(meshoptimizer PROPERTIES FOLDER "bgfx/3rdparty" PREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}bgfx-") +if(NOT MESHOPTIMIZER_LIBRARIES) + file(GLOB # + MESHOPTIMIZER_SOURCES # + ${BGFX_DIR}/3rdparty/meshoptimizer/src/*.cpp # + ${BGFX_DIR}/3rdparty/meshoptimizer/src/*.h # + ) + set(MESHOPTIMIZER_INCLUDE_DIR ${BGFX_DIR}/3rdparty) +endif() diff --git a/cmake/bgfx/CMakeLists.txt b/cmake/bgfx/CMakeLists.txt index 805820b..eeb6964 100644 --- a/cmake/bgfx/CMakeLists.txt +++ b/cmake/bgfx/CMakeLists.txt @@ -9,10 +9,12 @@ # this software. If not, see . include(bgfx.cmake) +include(3rdparty/meshoptimizer.cmake) if(BGFX_BUILD_TOOLS_TEXTURE) include(texturev.cmake) endif() if(BGFX_BUILD_TOOLS_GEOMETRY) + include(geometryc.cmake) include(geometryv.cmake) endif() diff --git a/cmake/tools/geometryc.cmake b/cmake/bgfx/geometryc.cmake similarity index 62% rename from cmake/tools/geometryc.cmake rename to cmake/bgfx/geometryc.cmake index f4b588d..02fdcd5 100644 --- a/cmake/tools/geometryc.cmake +++ b/cmake/bgfx/geometryc.cmake @@ -8,15 +8,25 @@ # You should have received a copy of the CC0 Public Domain Dedication along with # this software. If not, see . -include(CMakeParseArguments) +add_executable(geometryc) -include(${CMAKE_CURRENT_LIST_DIR}/../3rdparty/meshoptimizer.cmake) +# Grab the texturec source files +file( + GLOB_RECURSE + GEOMETRYC_SOURCES # + ${BGFX_DIR}/tools/geometryc/*.cpp # + ${BGFX_DIR}/tools/geometryc/*.h # + # + ${MESHOPTIMIZER_SOURCES} +) -add_executable(geometryc ${BGFX_DIR}/tools/geometryc/geometryc.cpp) +target_sources(geometryc PRIVATE ${GEOMETRYC_SOURCES}) +target_include_directories(geometryc PRIVATE ${MESHOPTIMIZER_INCLUDE_DIR}) +target_link_libraries(geometryc PRIVATE bx bgfx-vertexlayout ${MESHOPTIMIZER_LIBRARIES}) target_compile_definitions(geometryc PRIVATE "-D_CRT_SECURE_NO_WARNINGS") set_target_properties(geometryc PROPERTIES FOLDER "bgfx/tools") -target_link_libraries(geometryc bx bgfx-vertexlayout meshoptimizer) -if(BGFX_CUSTOM_TARGETS) + +if(BGFX_BUILD_TOOLS AND BGFX_CUSTOM_TARGETS) add_dependencies(tools geometryc) endif() diff --git a/cmake/bgfxToolUtils.cmake b/cmake/bgfxToolUtils.cmake index 29a7e6b..22a1c67 100644 --- a/cmake/bgfxToolUtils.cmake +++ b/cmake/bgfxToolUtils.cmake @@ -80,8 +80,11 @@ endfunction() # ) function(_bgfx_texturec_parse ARG_OUT) cmake_parse_arguments( - ARG "MIPS;NORMALMAP;EQUIRECT;STRIP;SDF;IQA;PMA;LINEAR" "FILE;OUTPUT;FORMAT;QUALITY;MIPSKIP;REF;MAX;RADIANCE;AS" - "" ${ARGN} + ARG # + "MIPS;NORMALMAP;EQUIRECT;STRIP;SDF;IQA;PMA;LINEAR" # + "FILE;OUTPUT;FORMAT;QUALITY;MIPSKIP;REF;MAX;RADIANCE;AS" # + "" # + ${ARGN} # ) set(CLI "") @@ -195,8 +198,11 @@ endfunction() # function(bgfx_compile_texture) cmake_parse_arguments( - ARG "MIPS;NORMALMAP;EQUIRECT;STRIP;SDF;IQA;PMA;LINEAR" "FILE;OUTPUT;FORMAT;QUALITY;MIPSKIP;REF;MAX;RADIANCE;AS" - "" ${ARGN} + ARG # + "MIPS;NORMALMAP;EQUIRECT;STRIP;SDF;IQA;PMA;LINEAR" # + "FILE;OUTPUT;FORMAT;QUALITY;MIPSKIP;REF;MAX;RADIANCE;AS" # + "" # + ${ARGN} # ) _bgfx_texturec_parse(CLI ${ARGV}) add_custom_command( @@ -206,6 +212,139 @@ function(bgfx_compile_texture) ) endfunction() +# _bgfx_geometryc_parse( +# FILE filename +# OUTPUT filename +# [SCALE scale] +# [CCW] +# [FLIPV] +# [OBB num steps] +# [PACKNORMAL 0|1] +# [PACKUV 0|1] +# [TANGENT] +# [BARYCENTRIC] +# [COMPRESS] +# [LH_UP_Y|LH_UP_Z|RH_UP_Y|RH_UP_Z] +# ) +function(_bgfx_geometryc_parse ARG_OUT) + cmake_parse_arguments( + ARG # + "CCW;FLIPV;TANGENT;BARYCENTRIC;COMPRESS;LH_UP_Y;LH_UP_Z;RH_UP_Y;RH_UP_Z" # + "FILE;OUTPUT;SCALE;OBB;PACKNORMAL;PACKUV" # + "" # + ${ARGN} # + ) + set(CLI "") + + # -f + if(ARG_FILE) + list(APPEND CLI "-f" "${ARG_FILE}") + endif() + + # -o + if(ARG_OUTPUT) + list(APPEND CLI "-o" "${ARG_OUTPUT}") + endif() + + # -s + if(ARG_SCALE) + list(APPEND CLI "-s" "${ARG_SCALE}") + endif() + + # --cw + if(ARG_QUALITY) + list(APPEND CLI "--cw") + endif() + + # --flipv + if(ARG_FLIPV) + list(APPEND CLI "--flipv") + endif() + + # --obb + if(ARG_OBB) + list(APPEND CLI "--mipskip" "${ARG_OBB}") + endif() + + # --packnormal + if(ARG_PACKNORMAL) + list(APPEND CLI "--packnormal ${ARG_PACKNORMAL}") + endif() + + # --packuv + if(ARG_PACKUV) + list(APPEND CLI "--packuv" ${ARG_PACKUV}) + endif() + + # --tangent + if(ARG_TANGENT) + list(APPEND CLI "--tangent") + endif() + + # --barycentric + if(ARG_BARYCENTRIC) + list(APPEND CLI "--barycentric") + endif() + + # --compress + if(ARG_REF) + list(APPEND CLI "--compress" "${ARG_COMPRESS}") + endif() + + # --lh-up+y + if(ARG_LH_UP_Y) + list(APPEND CLI "--lh-up+y") + endif() + + # --lh-up+z + if(ARG_LH_UP_Z) + list(APPEND CLI "--lh-up+z") + endif() + + # --rh-up+y + if(ARG_RH_UP_Y) + list(APPEND CLI "--rh-up+y") + endif() + + # --rh-up+z + if(ARG_RH_UP_Z) + list(APPEND CLI "--rh-up+z") + endif() + + set(${ARG_OUT} ${CLI} PARENT_SCOPE) +endfunction() + +# bgfx_compile_geometry( +# FILE filename +# OUTPUT filename +# [SCALE scale] +# [CCW] +# [FLIPV] +# [OBB num steps] +# [PACKNORMAL 0|1] +# [PACKUV 0|1] +# [TANGENT] +# [BARYCENTRIC] +# [COMPRESS] +# [LH_UP_Y|LH_UP_Z|RH_UP_Y|RH_UP_Z] +# ) +# +function(bgfx_compile_geometry) + cmake_parse_arguments( + ARG # + "CCW;FLIPV;TANGENT;BARYCENTRIC;COMPRESS;LH_UP_Y;LH_UP_Z;RH_UP_Y;RH_UP_Z" # + "FILE;OUTPUT;SCALE;OBB;PACKNORMAL;PACKUV" # + "" # + ${ARGN} # + ) + _bgfx_geometryc_parse(CLI ${ARGV}) + add_custom_command( + OUTPUT ${ARG_OUTPUT} # + COMMAND bgfx::geometryc ${CLI} # + MAIN_DEPENDENCY ${ARG_INPUT} # + ) +endfunction() + # _bgfx_shaderc_parse( # FILE filename # OUTPUT filename diff --git a/cmake/examples.cmake b/cmake/examples.cmake index f080958..f069126 100755 --- a/cmake/examples.cmake +++ b/cmake/examples.cmake @@ -13,7 +13,6 @@ include(CMakeParseArguments) include(${CMAKE_CURRENT_LIST_DIR}/util/ConfigureDebugging.cmake) include(${CMAKE_CURRENT_LIST_DIR}/3rdparty/dear-imgui.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/3rdparty/meshoptimizer.cmake) include(${CMAKE_CURRENT_LIST_DIR}/bgfxToolUtils.cmake) function(add_bgfx_shader FILE FOLDER) @@ -144,9 +143,9 @@ function(add_example ARG_NAME) # Add target if(ARG_COMMON) - add_library(example-${ARG_NAME} STATIC EXCLUDE_FROM_ALL ${SOURCES}) - target_include_directories(example-${ARG_NAME} PUBLIC ${BGFX_DIR}/examples/common) - target_link_libraries(example-${ARG_NAME} PUBLIC bgfx bx bimg bimg_decode dear-imgui meshoptimizer) + add_library(example-${ARG_NAME} STATIC EXCLUDE_FROM_ALL ${SOURCES} ${MESHOPTIMIZER_SOURCES}) + target_include_directories(example-${ARG_NAME} PUBLIC ${BGFX_DIR}/examples/common ${MESHOPTIMIZER_INCLUDE_DIR}) + target_link_libraries(example-${ARG_NAME} PUBLIC bgfx bx bimg bimg_decode dear-imgui ${MESHOPTIMIZER_LIBRARIES}) if(BGFX_WITH_GLFW) find_package(glfw3 REQUIRED) target_link_libraries(example-${ARG_NAME} PUBLIC glfw) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 185d8bf..41c7e4a 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -11,7 +11,3 @@ if(BGFX_BUILD_TOOLS_SHADER) include(${CMAKE_CURRENT_LIST_DIR}/tools/shaderc.cmake) endif() - -if(BGFX_BUILD_TOOLS_GEOMETRY) - include(${CMAKE_CURRENT_LIST_DIR}/tools/geometryc.cmake) -endif()