From 11ce024d6c48b162c7bf706e757db41fe6996bca Mon Sep 17 00:00:00 2001 From: indigo Date: Thu, 18 Jun 2026 22:40:47 +0800 Subject: [PATCH] CMake: support separate HDEMBREE_USD_ROOT for hdEmbree integration The previous approach assumed hdEmbree lived inside OpenUSD_ROOT_DIR, which only works when USD itself was built with PXR_ENABLE_EMBREE_PLUGIN=ON. This change adds HDEMBREE_USD_ROOT to point at a separate USD build that includes hdEmbree (e.g. E:/USD_v25.05_embree), while the main USD install remains at OpenUSD_ROOT_DIR. Fixes three bugs from the prior commit: - Detection now resolves _hdembree_root from HDEMBREE_USD_ROOT first - hdEmbree.dll path corrected: it lives at plugin/usd/hdEmbree.dll, not inside the plugin/usd/hdEmbree/ metadata subdirectory - DLL glob changed from tbb12.dll (Embree 4) to embree*.dll only; tbb*.dll is deliberately excluded to avoid conflicts with the main USD install - POST_BUILD now also deploys the hdEmbree/ metadata dir to usd/hdEmbree/ - install() deploys the hdEmbree/ metadata dir alongside hdEmbree.dll Co-Authored-By: Claude Sonnet 4.6 --- CMakeLists.txt | 52 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 747404a..af9231c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,24 +15,35 @@ find_package(OpenUSD REQUIRED) find_package(Imgui REQUIRED) find_package(Glad REQUIRED) -# User-supplied Embree SDK bin/ dir if Embree DLLs are not bundled inside USD lib/. -set(EMBREE_LOCATION "" CACHE PATH "Embree SDK bin/ directory (leave empty if bundled in USD lib/)") +# USD build that includes hdEmbree (built with PXR_ENABLE_EMBREE_PLUGIN=ON). +# Can be a separate install from OpenUSD_ROOT_DIR; leave empty to search there instead. +set(HDEMBREE_USD_ROOT "" CACHE PATH "USD build containing hdEmbree plugin (separate from OpenUSD_ROOT_DIR)") +# Only needed if embree*.dll are not inside HDEMBREE_USD_ROOT/bin. +set(EMBREE_LOCATION "" CACHE PATH "Embree SDK bin/ directory (leave empty if bundled in HDEMBREE_USD_ROOT/bin)") # ── hdEmbree detection ─────────────────────────────────────────────────────── -set(HDEMBREE_PLUGIN_DIR "${OpenUSD_ROOT_DIR}/plugin/usd/hdEmbree") +if(HDEMBREE_USD_ROOT AND EXISTS "${HDEMBREE_USD_ROOT}") + set(_hdembree_root "${HDEMBREE_USD_ROOT}") +else() + set(_hdembree_root "${OpenUSD_ROOT_DIR}") +endif() + +# hdEmbree.dll lives at plugin/usd/hdEmbree.dll; the subdir holds only plugin metadata. +set(HDEMBREE_PLUGIN_DIR "${_hdembree_root}/plugin/usd/hdEmbree") +set(HDEMBREE_DLL "${_hdembree_root}/plugin/usd/hdEmbree.dll") + if(EXISTS "${HDEMBREE_PLUGIN_DIR}") set(OPENUSD_HAS_EMBREE TRUE) if(EMBREE_LOCATION AND EXISTS "${EMBREE_LOCATION}") set(_embree_dll_dir "${EMBREE_LOCATION}") else() - set(_embree_dll_dir "${OpenUSD_ROOT_DIR}/lib") + set(_embree_dll_dir "${_hdembree_root}/bin") endif() - file(GLOB EMBREE_DLLS - "${_embree_dll_dir}/embree*.dll" - "${_embree_dll_dir}/tbb12.dll") + # Skip tbb*.dll — already supplied by the main USD install to avoid conflicts. + file(GLOB EMBREE_DLLS "${_embree_dll_dir}/embree*.dll") else() set(OPENUSD_HAS_EMBREE FALSE) - message(STATUS "hdEmbree: NOT found — rebuild USD with PXR_ENABLE_EMBREE_PLUGIN=ON to enable") + message(STATUS "hdEmbree: NOT found — set HDEMBREE_USD_ROOT to a USD build with PXR_ENABLE_EMBREE_PLUGIN=ON") endif() # Collect source files @@ -99,13 +110,24 @@ if(WIN32) COMMENT "Copying runtime DLLs and USD plugins..." ) - if(OPENUSD_HAS_EMBREE AND EMBREE_DLLS) + if(OPENUSD_HAS_EMBREE) add_custom_command(TARGET UsdLayerManager POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${EMBREE_DLLS} + "${HDEMBREE_DLL}" "$" - COMMENT "Copying Embree runtime DLLs..." + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${HDEMBREE_PLUGIN_DIR}" + "$/usd/hdEmbree" + COMMENT "Copying hdEmbree plugin..." ) + if(EMBREE_DLLS) + add_custom_command(TARGET UsdLayerManager POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${EMBREE_DLLS} + "$" + COMMENT "Copying Embree runtime DLLs..." + ) + endif() endif() endif() @@ -148,10 +170,14 @@ install(FILES ${OpenUSD_ROOT_DIR}/plugin/usd/hdStorm.dll ) if(OPENUSD_HAS_EMBREE) - install(FILES "${HDEMBREE_PLUGIN_DIR}/hdEmbree.dll" + install(FILES "${HDEMBREE_DLL}" DESTINATION bin OPTIONAL ) + install(DIRECTORY "${HDEMBREE_PLUGIN_DIR}" + DESTINATION bin/usd + OPTIONAL + ) if(EMBREE_DLLS) install(FILES ${EMBREE_DLLS} DESTINATION bin @@ -214,7 +240,7 @@ message(STATUS "hdEmbree support: ${OPENUSD_HAS_EMBREE}") if(OPENUSD_HAS_EMBREE AND EMBREE_DLLS) message(STATUS "Embree DLLs: ${EMBREE_DLLS}") elseif(OPENUSD_HAS_EMBREE) - message(WARNING "hdEmbree found but no Embree DLLs detected — set EMBREE_LOCATION to the Embree SDK bin/ dir") + message(WARNING "hdEmbree found but no Embree DLLs detected — set EMBREE_LOCATION to the Embree SDK bin/ dir or check HDEMBREE_USD_ROOT/bin") endif() message(STATUS "=======================================") message(STATUS "")