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, // Camera headlight: point light (w=1) positioned at the camera world-origin,
// transformed by the view-inverse so it tracks the camera each frame. // transformed by the view-inverse so it tracks the camera each frame.
// (stageView.py: l.position = cam_pos + (1,); l.transform = frustum.ComputeViewInverse()) // (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::GfMatrix4d viewInverse = m_viewMatrix.GetInverse();
pxr::GfVec3d camPos = viewInverse.ExtractTranslation(); 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) // DrawLightWireframes (mirrors DrawCameraWireframes)
// =========================================================================== // ===========================================================================
+4
View File
@@ -247,6 +247,10 @@ private:
double scale, double scale,
std::vector<float>& outVerts); std::vector<float>& outVerts);
/// True if the stage contains at least one authored UsdLux light.
/// Used to suppress the default camera headlight when real lights exist.
bool StageHasAuthoredLights() const;
/// Project a world-space point to absolute screen coordinates (x=imagePosX+pixelX, etc.). /// Project a world-space point to absolute screen coordinates (x=imagePosX+pixelX, etc.).
/// Returns false when the point is behind the camera. /// Returns false when the point is behind the camera.
static bool WorldToScreen(const pxr::GfVec3d& world, static bool WorldToScreen(const pxr::GfVec3d& world,