Skip to content

Commit c83d634

Browse files
HnRenderDelegate: store lights in a light type -> prim map
1 parent 1ad2f17 commit c83d634

File tree

4 files changed

+36
-20
lines changed

4 files changed

+36
-20
lines changed

Hydrogent/interface/HnRenderDelegate.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,9 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
512512
std::unordered_set<HnMaterial*> m_Materials;
513513
HnMaterial* m_FallbackMaterial = nullptr;
514514

515-
std::mutex m_LightsMtx;
516-
std::unordered_set<HnLight*> m_Lights;
515+
std::mutex m_LightsMtx;
516+
// Light type -> light prim
517+
std::unordered_multimap<pxr::TfToken, HnLight*, pxr::TfToken::HashFunctor> m_Lights;
517518

518519
Uint32 m_MeshResourcesVersion = ~0u;
519520
Uint32 m_MaterialResourcesVersion = ~0u;

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,7 @@ pxr::HdSprim* HnRenderDelegate::CreateSprim(const pxr::TfToken& TypeId,
654654
HnLight* Light = HnLight::Create(SPrimId, TypeId);
655655
{
656656
std::lock_guard<std::mutex> Guard{m_LightsMtx};
657-
m_Lights.emplace(Light);
657+
m_Lights.emplace(TypeId, Light);
658658
}
659659
SPrim = Light;
660660
}
@@ -710,7 +710,16 @@ void HnRenderDelegate::DestroySprim(pxr::HdSprim* SPrim)
710710
else if (dynamic_cast<HnLight*>(SPrim) != nullptr)
711711
{
712712
std::lock_guard<std::mutex> Guard{m_LightsMtx};
713-
m_Lights.erase(static_cast<HnLight*>(SPrim));
713+
714+
auto it_range = m_Lights.equal_range(static_cast<HnLight*>(SPrim)->GetTypeId());
715+
for (auto it = it_range.first; it != it_range.second; ++it)
716+
{
717+
if (it->second == SPrim)
718+
{
719+
m_Lights.erase(it);
720+
break;
721+
}
722+
}
714723
}
715724

716725
delete SPrim;
@@ -901,19 +910,21 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
901910
std::lock_guard<std::mutex> Guard{m_LightsMtx};
902911

903912
HnLight* DomeLight = nullptr;
904-
for (HnLight* pLight : m_Lights)
913+
914+
auto dome_lights_range = m_Lights.equal_range(pxr::HdPrimTypeTokens->domeLight);
915+
for (auto it = dome_lights_range.first; it != dome_lights_range.second; ++it)
905916
{
906-
if (pLight->GetTypeId() == pxr::HdPrimTypeTokens->domeLight)
917+
HnLight* pLight = it->second;
918+
VERIFY_EXPR(pLight->GetTypeId() == pxr::HdPrimTypeTokens->domeLight);
919+
920+
if (DomeLight == nullptr)
907921
{
908-
if (DomeLight == nullptr)
909-
{
910-
pLight->PrecomputeIBLCubemaps(*this);
911-
DomeLight = pLight;
912-
}
913-
else
914-
{
915-
LOG_WARNING_MESSAGE("Only one dome light is supported. ", pLight->GetId(), " will be ignored");
916-
}
922+
pLight->PrecomputeIBLCubemaps(*this);
923+
DomeLight = pLight;
924+
}
925+
else
926+
{
927+
LOG_WARNING_MESSAGE("Only one dome light is supported. ", pLight->GetId(), " will be ignored");
917928
}
918929
}
919930
m_LightResourcesVersion = LightResourcesVersion;

Hydrogent/src/Tasks/HnBeginFrameTask.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,9 @@ void HnBeginFrameTask::Prepare(pxr::HdTaskContext* TaskCtx,
396396
const auto& Lights = RenderDelegate->GetLights();
397397

398398
Uint32 ShadowCastingLightIdx = 0;
399-
for (HnLight* Light : Lights)
399+
for (auto light_it : Lights)
400400
{
401+
HnLight* Light = light_it.second;
401402
if (Light->ShadowsEnabled() && Light->IsVisible() && ShadowCastingLightIdx < NumShadowCastingLights)
402403
{
403404
Light->SetFrameAttribsIndex(ShadowCastingLightIdx++);
@@ -439,9 +440,10 @@ void HnBeginFrameTask::UpdateFrameConstants(IDeviceContext* pCtx,
439440
const TextureDesc& ShadowAtlasDesc = ShadowMapMgr->GetAtlasDesc();
440441

441442
const auto& Lights = RenderDelegate->GetLights();
442-
for (const HnLight* Light : Lights)
443+
for (auto light_it : Lights)
443444
{
444-
const Int32 ShadowCastingLightIdx = Light->GetFrameAttribsIndex();
445+
const HnLight* Light = light_it.second;
446+
const Int32 ShadowCastingLightIdx = Light->GetFrameAttribsIndex();
445447
VERIFY_EXPR((ShadowCastingLightIdx < 0) == (!Light->ShadowsEnabled() || !Light->IsVisible() || ShadowCastingLightIdx >= static_cast<Int32>(NumShadowCastingLights)));
446448
if (ShadowCastingLightIdx < 0)
447449
continue;
@@ -574,8 +576,9 @@ void HnBeginFrameTask::UpdateFrameConstants(IDeviceContext* pCtx,
574576
}
575577

576578
int LightCount = 0;
577-
for (HnLight* Light : RenderDelegate->GetLights())
579+
for (auto light_it : RenderDelegate->GetLights())
578580
{
581+
HnLight* Light = light_it.second;
579582
if (!Light->IsVisible())
580583
continue;
581584

Hydrogent/src/Tasks/HnRenderShadowsTask.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,9 @@ void HnRenderShadowsTask::Prepare(pxr::HdTaskContext* TaskCtx,
257257
const auto& Lights = RenderDelegate->GetLights();
258258

259259
// Sort all shadow lights with dirty shadow maps by shadow map slice
260-
for (HnLight* Light : Lights)
260+
for (auto light_it : Lights)
261261
{
262+
HnLight* Light = light_it.second;
262263
if (!Light->ShadowsEnabled())
263264
continue;
264265

0 commit comments

Comments
 (0)