From 862f3c974596e76033ea616537bacf209e25215f Mon Sep 17 00:00:00 2001 From: indigo Date: Tue, 30 Jun 2026 03:03:00 +0800 Subject: [PATCH] Add per-viewport AOV selection (stageView.py GetRendererAovs port) Exposes the render delegate's available AOVs in the gear popup under a new "AOV" sub-menu. Selecting an AOV calls SetRendererAov on the engine and persists the choice per-viewport in viewport_settings.ini. Switching the render delegate resets the AOV to "color", matching stageView.py's _handleRendererChanged. Menu is greyed-out when the delegate reports no AOVs. Co-Authored-By: Claude Sonnet 4.6 --- src/core/UsdSceneRenderer.cpp | 26 ++++++++++++++++++++++---- src/core/UsdSceneRenderer.h | 5 +++++ src/ui/ViewportPanel.cpp | 2 ++ src/ui/ViewportTile.cpp | 17 +++++++++++++++++ src/ui/ViewportTile.h | 1 + 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/core/UsdSceneRenderer.cpp b/src/core/UsdSceneRenderer.cpp index c61bd6d..1c81496 100644 --- a/src/core/UsdSceneRenderer.cpp +++ b/src/core/UsdSceneRenderer.cpp @@ -167,6 +167,7 @@ void main() { outColor = color; } UsdSceneRenderer::UsdSceneRenderer() : m_showGrid(true) , m_showCameraGuide(false) + , m_currentAov(pxr::TfToken("color")) , m_aaEnabled(false) , m_backgroundColor(0.15f, 0.15f, 0.15f) , m_shadingMode(ShadingMode::SmoothShaded) @@ -296,8 +297,8 @@ void UsdSceneRenderer::InitRenderer() { } LOG_INFO("Selected renderer: " + std::string(m_renderer->GetCurrentRendererId().GetText())); - // Enable AOV "color" (matches stageView._handleRendererChanged) - m_renderer->SetRendererAov(pxr::TfToken("color")); + // Enable AOV (matches stageView._handleRendererChanged; uses saved m_currentAov) + m_renderer->SetRendererAov(m_currentAov); // Selection highlight color (usdview default: yellow) m_renderer->SetSelectionColor(pxr::GfVec4f(1.0f, 1.0f, 0.0f, 1.0f)); @@ -342,8 +343,9 @@ bool UsdSceneRenderer::SetRendererPlugin(const pxr::TfToken& pluginId) { bool ok = m_renderer->SetRendererPlugin(pluginId); if (ok) { - // Re-enable colour AOV after delegate switch (mirrors usdtweak behaviour) - m_renderer->SetRendererAov(pxr::TfToken("color")); + // Reset AOV to "color" on every delegate switch (mirrors stageView._handleRendererChanged) + m_currentAov = pxr::TfToken("color"); + m_renderer->SetRendererAov(m_currentAov); LOG_INFO("Render delegate switched to: " + std::string(pluginId.GetText())); } else { LOG_ERROR("Failed to switch render delegate to: " + std::string(pluginId.GetText())); @@ -351,6 +353,22 @@ bool UsdSceneRenderer::SetRendererPlugin(const pxr::TfToken& pluginId) { return ok; } +pxr::TfTokenVector UsdSceneRenderer::GetRendererAovs() const +{ + if (!m_renderer) return {}; + return m_renderer->GetRendererAovs(); +} + +bool UsdSceneRenderer::SetCurrentAov(const pxr::TfToken& aov) +{ + if (!m_renderer) return false; + if (m_renderer->SetRendererAov(aov)) { + m_currentAov = aov; + return true; + } + return false; +} + // =========================================================================== // Camera State // =========================================================================== diff --git a/src/core/UsdSceneRenderer.h b/src/core/UsdSceneRenderer.h index e8ed8df..1700480 100644 --- a/src/core/UsdSceneRenderer.h +++ b/src/core/UsdSceneRenderer.h @@ -183,6 +183,10 @@ public: bool ShowCameraGuide() const { return m_showCameraGuide; } void SetShowCameraGuide(bool show) { m_showCameraGuide = show; } + const pxr::TfToken& GetCurrentAov() const { return m_currentAov; } + pxr::TfTokenVector GetRendererAovs() const; + bool SetCurrentAov(const pxr::TfToken& aov); + bool GetAAEnabled() const { return m_aaEnabled; } void SetAAEnabled(bool enabled) { m_aaEnabled = enabled; } @@ -331,6 +335,7 @@ private: bool m_showGrid; bool m_showCameraGuide; + pxr::TfToken m_currentAov; bool m_aaEnabled; ///< GL_LINE_SMOOTH anti-aliasing for all line overlays pxr::GfVec3f m_backgroundColor; diff --git a/src/ui/ViewportPanel.cpp b/src/ui/ViewportPanel.cpp index fbce136..3500f54 100644 --- a/src/ui/ViewportPanel.cpp +++ b/src/ui/ViewportPanel.cpp @@ -658,6 +658,7 @@ void ViewportPanel::SaveSettings(const std::string& path) const f << "RenderDelegate=" << s.renderDelegate << "\n"; f << "ShowGrid=" << (s.showGrid ? 1 : 0) << "\n"; f << "ShowCameraGuide=" << (s.showCameraGuide ? 1 : 0) << "\n"; + f << "Aov=" << s.aov << "\n"; f << "AAEnabled=" << (s.aaEnabled ? 1 : 0) << "\n"; f << "BgColorR=" << s.bgColorR << "\n"; f << "BgColorG=" << s.bgColorG << "\n"; @@ -725,6 +726,7 @@ void ViewportPanel::LoadSettings(const std::string& path) if (key == "RenderDelegate") ts.renderDelegate = val; else if (key == "ShowGrid") ts.showGrid = (val == "1"); else if (key == "ShowCameraGuide") ts.showCameraGuide = (val == "1"); + else if (key == "Aov") ts.aov = val; else if (key == "AAEnabled") ts.aaEnabled = (val == "1"); else if (key == "BgColorR") ts.bgColorR = toFloat(val, ts.bgColorR); else if (key == "BgColorG") ts.bgColorG = toFloat(val, ts.bgColorG); diff --git a/src/ui/ViewportTile.cpp b/src/ui/ViewportTile.cpp index fd53259..82bb09a 100644 --- a/src/ui/ViewportTile.cpp +++ b/src/ui/ViewportTile.cpp @@ -94,6 +94,7 @@ ViewportTileSettings ViewportTile::GetSettings() const s.renderDelegate = m_renderer.GetCurrentRendererId().GetString(); s.showGrid = m_renderer.ShowGrid(); s.showCameraGuide = m_renderer.ShowCameraGuide(); + s.aov = m_renderer.GetCurrentAov().GetString(); s.aaEnabled = m_renderer.GetAAEnabled(); const pxr::GfVec3f& bg = m_renderer.GetBackgroundColor(); s.bgColorR = bg[0]; s.bgColorG = bg[1]; s.bgColorB = bg[2]; @@ -110,6 +111,8 @@ void ViewportTile::ApplySettings(const ViewportTileSettings& s) m_renderer.SetRendererPlugin(pxr::TfToken(s.renderDelegate)); m_renderer.SetShowGrid(s.showGrid); m_renderer.SetShowCameraGuide(s.showCameraGuide); + if (!s.aov.empty()) + m_renderer.SetCurrentAov(pxr::TfToken(s.aov)); m_renderer.SetAAEnabled(s.aaEnabled); m_renderer.SetBackgroundColor(pxr::GfVec3f(s.bgColorR, s.bgColorG, s.bgColorB)); m_renderer.SetBBoxMode(static_cast(s.bboxMode)); @@ -1008,6 +1011,20 @@ void ViewportTile::RenderCompactToolbar(int tileIndex) ImGui::EndMenu(); } + // -- AOV --------------------------------------------------------- + { + pxr::TfTokenVector aovs = m_renderer.GetRendererAovs(); + if (ImGui::BeginMenu("AOV", !aovs.empty())) { + pxr::TfToken currentAov = m_renderer.GetCurrentAov(); + for (const auto& aov : aovs) { + bool checked = (aov == currentAov); + if (ImGui::MenuItem(aov.GetText(), nullptr, checked) && !checked) + m_renderer.SetCurrentAov(aov); + } + ImGui::EndMenu(); + } + } + // -- Lighting ---------------------------------------------------- if (ImGui::BeginMenu("Lighting")) { bool ambient = m_renderer.GetAmbientLightOnly(); diff --git a/src/ui/ViewportTile.h b/src/ui/ViewportTile.h index 55eb427..db4ae4c 100644 --- a/src/ui/ViewportTile.h +++ b/src/ui/ViewportTile.h @@ -23,6 +23,7 @@ struct ViewportTileSettings { std::string renderDelegate; ///< empty = use AppPreferences default on first load bool showGrid = true; bool showCameraGuide = false; + std::string aov = "color"; bool aaEnabled = false; float bgColorR = 0.15f; float bgColorG = 0.15f;