@@ -82,8 +82,11 @@ void Viewport::buildUI()
8282 bool didPick = ui_picking (); // Needs to happen before ui_menubar
8383 ui_menubar ();
8484
85- if (m_anariPass && !didPick)
86- m_anariPass->setEnableIDs (appCore ()->getFirstSelected ().valid ());
85+ if (m_anariPass && !didPick) {
86+ bool needIDs = appCore ()->getFirstSelected ().valid ()
87+ || m_visualizeAOV == tsd::rendering::AOVType::EDGES;
88+ m_anariPass->setEnableIDs (needIDs);
89+ }
8790
8891 if (m_rIdx && (m_rIdx->isFlat () != appCore ()->anari .useFlatRenderIndex ())) {
8992 tsd::core::logWarning (" instancing setting changed: resetting viewport" );
@@ -270,6 +273,8 @@ void Viewport::saveSettings(tsd::core::DataNode &root)
270273 root[" visualizeAOV" ] = static_cast <int >(m_visualizeAOV);
271274 root[" depthVisualMinimum" ] = m_depthVisualMinimum;
272275 root[" depthVisualMaximum" ] = m_depthVisualMaximum;
276+ root[" edgeThreshold" ] = m_edgeThreshold;
277+ root[" edgeInvert" ] = m_edgeInvert;
273278 root[" fov" ] = m_fov;
274279 root[" resolutionScale" ] = m_resolutionScale;
275280 root[" showAxes" ] = m_showAxes;
@@ -326,6 +331,8 @@ void Viewport::loadSettings(tsd::core::DataNode &root)
326331 m_visualizeAOV = static_cast <tsd::rendering::AOVType>(aovType);
327332 root[" depthVisualMinimum" ].getValue (ANARI_FLOAT32, &m_depthVisualMinimum);
328333 root[" depthVisualMaximum" ].getValue (ANARI_FLOAT32, &m_depthVisualMaximum);
334+ root[" edgeThreshold" ].getValue (ANARI_FLOAT32, &m_edgeThreshold);
335+ root[" edgeInvert" ].getValue (ANARI_BOOL, &m_edgeInvert);
329336 root[" fov" ].getValue (ANARI_FLOAT32, &m_fov);
330337 root[" resolutionScale" ].getValue (ANARI_FLOAT32, &m_resolutionScale);
331338 root[" showAxes" ].getValue (ANARI_BOOL, &m_showAxes);
@@ -521,6 +528,8 @@ void Viewport::setupRenderPipeline()
521528 m_visualizeAOVPass =
522529 m_pipeline.emplace_back <tsd::rendering::VisualizeAOVPass>();
523530 m_visualizeAOVPass->setEnabled (false );
531+ m_visualizeAOVPass->setEdgeThreshold (m_edgeThreshold);
532+ m_visualizeAOVPass->setEdgeInvert (m_edgeInvert);
524533
525534 m_outlinePass = m_pipeline.emplace_back <tsd::rendering::OutlineRenderPass>();
526535
@@ -1120,7 +1129,8 @@ void Viewport::ui_menubar()
11201129
11211130 ImGui::Separator ();
11221131
1123- const char *aovItems[] = {" default" , " depth" , " albedo" , " normal" };
1132+ const char *aovItems[] = {
1133+ " default" , " depth" , " albedo" , " normal" , " edges" };
11241134 if (int aov = int (m_visualizeAOV); ImGui::Combo (
11251135 " visualize AOV" , &aov, aovItems, IM_ARRAYSIZE (aovItems))) {
11261136 if (aov != int (m_visualizeAOV)) {
@@ -1130,6 +1140,8 @@ void Viewport::ui_menubar()
11301140 m_visualizeAOV == tsd::rendering::AOVType::ALBEDO);
11311141 m_anariPass->setEnableNormals (
11321142 m_visualizeAOV == tsd::rendering::AOVType::NORMAL);
1143+ m_anariPass->setEnableIDs (
1144+ m_visualizeAOV == tsd::rendering::AOVType::EDGES);
11331145 }
11341146 }
11351147
@@ -1150,6 +1162,17 @@ void Viewport::ui_menubar()
11501162 m_depthVisualMinimum, m_depthVisualMaximum);
11511163 ImGui::EndDisabled ();
11521164
1165+ ImGui::BeginDisabled (m_visualizeAOV != tsd::rendering::AOVType::EDGES);
1166+ bool edgeSettingsChanged = false ;
1167+ edgeSettingsChanged |=
1168+ ImGui::DragFloat (" edge threshold" , &m_edgeThreshold, 0 .01f , 0 .f , 1 .f );
1169+ edgeSettingsChanged |= ImGui::Checkbox (" invert edges" , &m_edgeInvert);
1170+ if (edgeSettingsChanged) {
1171+ m_visualizeAOVPass->setEdgeThreshold (m_edgeThreshold);
1172+ m_visualizeAOVPass->setEdgeInvert (m_edgeInvert);
1173+ }
1174+ ImGui::EndDisabled ();
1175+
11531176 ImGui::Separator ();
11541177
11551178 ImGui::BeginDisabled (m_showOnlySelected);
0 commit comments