Renderer: suppress camera headlight when stage contains authored lights

Mirrors usdview behaviour -- when the stage has at least one UsdLux
light the default camera fill-light is disabled so the scene is lit
purely by its authored lights.  StageHasAuthoredLights() early-exits
on the first HasAPI<UsdLuxLightAPI>() hit to keep the per-frame cost
minimal.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 08:17:10 +08:00
parent 2649fe814c
commit c796c76561
2 changed files with 25 additions and 1 deletions
+21 -1
View File
@@ -571,7 +571,13 @@ void UsdSceneRenderer::Render(int width, int height)
// Camera headlight: point light (w=1) positioned at the camera world-origin,
// transformed by the view-inverse so it tracks the camera each frame.
// (stageView.py: l.position = cam_pos + (1,); l.transform = frustum.ComputeViewInverse())
if (m_ambientLightOnly) {
//
// The headlight is the *default* fill used only while the stage has no
// authored lights. Once the scene contains real UsdLux lights, suppress it
// so the scene is lit purely by those lights (Hydra evaluates them via
// enableSceneLights) -- mirrors usdview's "use scene lights when present".
const bool stageHasLights = StageHasAuthoredLights();
if (m_ambientLightOnly && !stageHasLights) {
pxr::GfMatrix4d viewInverse = m_viewMatrix.GetInverse();
pxr::GfVec3d camPos = viewInverse.ExtractTranslation();
@@ -1527,6 +1533,20 @@ void UsdSceneRenderer::BuildLightWireframeLines(const pxr::UsdPrim& lightPrim
}
}
// ===========================================================================
// StageHasAuthoredLights
// ===========================================================================
bool UsdSceneRenderer::StageHasAuthoredLights() const
{
if (!m_stage) return false;
for (const pxr::UsdPrim& prim : m_stage->Traverse()) {
if (prim.HasAPI<pxr::UsdLuxLightAPI>())
return true;
}
return false;
}
// ===========================================================================
// DrawLightWireframes (mirrors DrawCameraWireframes)
// ===========================================================================