Add Hypershade-style Material Editor with node graph and shader-ball preview
Browser column lists all scene materials plus a searchable create-node list; Show Graph (or double-click) loads a material into the node-graph work area. The graph shows the entire network including MaterialX (.mtlx) node graphs, resolving connections through NodeGraph boundaries via UsdShadeUtils::GetValueProducingAttributes, with layered auto-layout for nodes lacking authored uiPosition. Canvas navigates viewport-style (Alt+MMB pan / Alt+RMB zoom) and TAB opens a Nuke-style search popup. Selecting a node shows a typed property editor (live-apply, one undo command per edit) and previews that node's output on the shader ball. The preview renders through its own Hydra engine into a scratch stage that composes the material via a reference to the source root layer (so referenced .mtlx materials work), re-renders until progressive delegates (Arnold/Cycles/Embree) converge, and lights with HDR dome presets (External/Room/Interior/Sunset; CC0 Poly Haven EXRs fetched at CMake configure). texture:format is authored latlong explicitly - left automatic, hdArnold falls back to Arnold's angular fisheye default - and hdCycles gets a -90 X pole rotation to match Storm's +Y-pole sampling. Mutations go through new ICommand subclasses (create shader node, connect/disconnect attrs). imgui-node-editor is vendored (gitignored) with a local one-line patch: c_ScrollButtonIndex 1->2 for MMB pan. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+33
-1
@@ -13,6 +13,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
|
||||
find_package(OpenGL REQUIRED)
|
||||
find_package(OpenUSD REQUIRED)
|
||||
find_package(Imgui REQUIRED)
|
||||
find_package(ImguiNodeEditor REQUIRED)
|
||||
find_package(Glad REQUIRED)
|
||||
find_package(FFmpeg REQUIRED)
|
||||
|
||||
@@ -195,6 +196,7 @@ target_include_directories(UsdLayerManager PRIVATE
|
||||
target_link_libraries(UsdLayerManager PRIVATE
|
||||
OpenUSD::OpenUSD
|
||||
Imgui::Imgui
|
||||
ImguiNodeEditor::ImguiNodeEditor
|
||||
Glad::Glad
|
||||
FFmpeg::FFmpeg
|
||||
OpenColorIO::OpenColorIO
|
||||
@@ -577,6 +579,33 @@ if(NOT EXISTS "${_ocio_config_dir}/config.ocio")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# HDRI: shader-ball lighting presets (Poly Haven, CC0) at configure time
|
||||
# ---------------------------------------------------------------------------
|
||||
set(_hdri_dir "${CMAKE_SOURCE_DIR}/resources/hdri")
|
||||
set(_hdri_files
|
||||
kloofendal_48d_partly_cloudy_puresky_1k.exr
|
||||
lebombo_1k.exr
|
||||
artist_workshop_1k.exr
|
||||
venice_sunset_1k.exr
|
||||
)
|
||||
file(MAKE_DIRECTORY "${_hdri_dir}")
|
||||
foreach(_hdri ${_hdri_files})
|
||||
if(NOT EXISTS "${_hdri_dir}/${_hdri}")
|
||||
message(STATUS "Downloading HDRI ${_hdri} ...")
|
||||
file(DOWNLOAD
|
||||
"https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/${_hdri}"
|
||||
"${_hdri_dir}/${_hdri}"
|
||||
STATUS _hdri_dl_status
|
||||
)
|
||||
list(GET _hdri_dl_status 0 _hdri_dl_code)
|
||||
if(NOT _hdri_dl_code EQUAL 0)
|
||||
file(REMOVE "${_hdri_dir}/${_hdri}")
|
||||
message(WARNING "HDRI download failed for ${_hdri} (${_hdri_dl_status}) — the shader-ball lighting preset will fall back to a distant light.")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Copy resources to build directory
|
||||
file(COPY ${CMAKE_SOURCE_DIR}/resources
|
||||
DESTINATION ${CMAKE_BINARY_DIR}
|
||||
@@ -592,7 +621,10 @@ add_custom_command(TARGET UsdLayerManager POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||
"${CMAKE_SOURCE_DIR}/resources/icons"
|
||||
"$<TARGET_FILE_DIR:UsdLayerManager>/resources/icons"
|
||||
COMMENT "Copying fonts and SVG icons to build output"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||
"${CMAKE_SOURCE_DIR}/resources/hdri"
|
||||
"$<TARGET_FILE_DIR:UsdLayerManager>/resources/hdri"
|
||||
COMMENT "Copying fonts, SVG icons and HDRI presets to build output"
|
||||
)
|
||||
|
||||
# Copy ACES OCIO config to build output — only on first build (skipped if already present).
|
||||
|
||||
Reference in New Issue
Block a user