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:
@@ -185,12 +185,23 @@ public:
|
||||
/// unknown or the switch fails. The renderer is re-initialised if needed.
|
||||
bool SetRendererPlugin(const pxr::TfToken& pluginId);
|
||||
|
||||
/// False while a progressive delegate (Arnold/Cycles/Embree…) is still
|
||||
/// accumulating samples for the last-submitted frame; Storm is always
|
||||
/// converged after one pass. Callers that cache the output texture must
|
||||
/// keep calling Render() until this is true.
|
||||
bool IsConverged() const { return !m_renderer || m_renderer->IsConverged(); }
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// View settings
|
||||
// -----------------------------------------------------------------------
|
||||
bool ShowGrid() const { return m_showGrid; }
|
||||
void SetShowGrid(bool show) { m_showGrid = show; }
|
||||
|
||||
/// Hydra refinement complexity (1.0 = base mesh, up to 2.0). The shader
|
||||
/// ball uses a raised value so the sphere tessellates smoothly.
|
||||
float Complexity() const { return m_complexity; }
|
||||
void SetComplexity(float c) { m_complexity = c; }
|
||||
|
||||
bool ShowCameraGuide() const { return m_showCameraGuide; }
|
||||
void SetShowCameraGuide(bool show) { m_showCameraGuide = show; }
|
||||
|
||||
@@ -360,6 +371,7 @@ private:
|
||||
std::vector<pxr::GfVec4d> m_clipPlanes;
|
||||
|
||||
bool m_showGrid;
|
||||
float m_complexity = 1.0f;
|
||||
bool m_showCameraGuide;
|
||||
bool m_showGuides;
|
||||
bool m_showProxy;
|
||||
|
||||
Reference in New Issue
Block a user