@@ -386,7 +386,7 @@ void HnMesh::UpdateRepr(pxr::HdSceneDelegate& SceneDelegate,
386386 GetVertexBuffer (pxr::HdTokens->normals ) == nullptr &&
387387 !StagingVerts.Points .IsEmpty ())
388388 {
389- GenerateSmoothNormals (StagingVerts);
389+ GenerateSmoothNormals (*RenderDelegate, StagingVerts);
390390 }
391391
392392 UpdateConstantPrimvars (SceneDelegate, RenderParam, DirtyBits, ReprToken);
@@ -528,7 +528,8 @@ void HnMesh::UpdateTopology(pxr::HdSceneDelegate& SceneDelegate,
528528 DirtyBits &= ~pxr::HdChangeTracker::DirtyTopology;
529529}
530530
531- bool HnMesh::AddStagingBufferSourceForPrimvar (StagingVertexData& StagingVerts,
531+ bool HnMesh::AddStagingBufferSourceForPrimvar (HnRenderDelegate* RenderDelegate,
532+ StagingVertexData& StagingVerts,
532533 const pxr::TfToken& Name,
533534 pxr::VtValue Primvar,
534535 pxr::HdInterpolation Interpolation,
@@ -537,6 +538,16 @@ bool HnMesh::AddStagingBufferSourceForPrimvar(StagingVertexData& StagingVerts,
537538 if (Primvar.IsEmpty ())
538539 return false ;
539540
541+ if (Name == pxr::HdTokens->normals )
542+ {
543+ VERIFY_EXPR (RenderDelegate != nullptr );
544+ if (RenderDelegate != nullptr && RenderDelegate->GetUSDRenderer ()->GetSettings ().PackVertexNormals )
545+ {
546+ HnMeshUtils MeshUtils{m_Topology, GetId ()};
547+ Primvar = MeshUtils.PackVertexNormals (Primvar);
548+ }
549+ }
550+
540551 pxr::VtValue FaceVaryingPrimvar;
541552 pxr::VtValue* pSrcPrimvar = &Primvar;
542553 if ((Interpolation == pxr::HdInterpolationVertex || Interpolation == pxr::HdInterpolationVarying) && m_HasFaceVaryingPrimvars)
@@ -677,7 +688,7 @@ bool HnMesh::AddJointInfluencesStagingBufferSource(const pxr::VtValue& NumInflue
677688 }
678689 }
679690
680- return AddStagingBufferSourceForPrimvar (StagingVerts, HnTokens->joints , pxr::VtValue::Take (Joints), pxr::HdInterpolationVertex, 2 );
691+ return AddStagingBufferSourceForPrimvar (nullptr , StagingVerts, HnTokens->joints , pxr::VtValue::Take (Joints), pxr::HdInterpolationVertex, 2 );
681692}
682693
683694void HnMesh::PrimvarsInfo::AddDirtyPrimvar (pxr::HdDirtyBits& DirtyBits,
@@ -781,9 +792,10 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
781792 const pxr::HdExtComputationPrimvarDescriptor& SkinningCompPrimDesc,
782793 StagingVertexData& StagingVerts)
783794{
784- const pxr::HdRenderIndex& RenderIndex = SceneDelegate.GetRenderIndex ();
785- const pxr::SdfPath& SkinnigCompId = SkinningCompPrimDesc.sourceComputationId ;
786- const HnExtComputation* SkinningComp = static_cast <const HnExtComputation*>(RenderIndex.GetSprim (pxr::HdPrimTypeTokens->extComputation , SkinnigCompId));
795+ const pxr::HdRenderIndex& RenderIndex = SceneDelegate.GetRenderIndex ();
796+ HnRenderDelegate* RenderDelegate = static_cast <HnRenderDelegate*>(RenderIndex.GetRenderDelegate ());
797+ const pxr::SdfPath& SkinnigCompId = SkinningCompPrimDesc.sourceComputationId ;
798+ const HnExtComputation* SkinningComp = static_cast <const HnExtComputation*>(RenderIndex.GetSprim (pxr::HdPrimTypeTokens->extComputation , SkinnigCompId));
787799 if (SkinningComp == nullptr )
788800 {
789801 LOG_ERROR_MESSAGE (" Unable to find skinning computation " , SkinnigCompId);
@@ -807,7 +819,7 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
807819 SkinningPrimvarsVersion += InputAggregatorComp->GetSceneInputsVersion ();
808820 }
809821
810- entt::registry& Registry = static_cast <HnRenderDelegate*>(SceneDelegate. GetRenderIndex (). GetRenderDelegate ()) ->GetEcsRegistry ();
822+ entt::registry& Registry = RenderDelegate ->GetEcsRegistry ();
811823 Components::Skinning& SkinningData = Registry.get <Components::Skinning>(m_Entity);
812824
813825 if (SkinningPrimvarsVersion != m_SkinningPrimvarsVersion)
@@ -857,7 +869,7 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
857869
858870 StagingVerts.Points = RestPointsVal;
859871
860- AddStagingBufferSourceForPrimvar (StagingVerts, SkinningCompPrimDesc.name , std::move (RestPointsVal), SkinningCompPrimDesc.interpolation );
872+ AddStagingBufferSourceForPrimvar (RenderDelegate, StagingVerts, SkinningCompPrimDesc.name , std::move (RestPointsVal), SkinningCompPrimDesc.interpolation );
861873 AddJointInfluencesStagingBufferSource (NumInfluencesPerComponentVal, InfluencesVal, StagingVerts);
862874
863875 // Skeleton adapter hides normals, so try to get them directly from the scene delegate
@@ -867,9 +879,9 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
867879 // There is no way to get the interpolation of the normals primvar from the scene delegate,
868880 // so rely on the number of elements.
869881 if (NormalsPrimvar.GetArraySize () == m_Topology.GetNumPoints ())
870- AddStagingBufferSourceForPrimvar (StagingVerts, pxr::HdTokens->normals , std::move (NormalsPrimvar), pxr::HdInterpolationVertex);
882+ AddStagingBufferSourceForPrimvar (RenderDelegate, StagingVerts, pxr::HdTokens->normals , std::move (NormalsPrimvar), pxr::HdInterpolationVertex);
871883 else if (NormalsPrimvar.GetArraySize () == m_Topology.GetNumFaceVaryings ())
872- AddStagingBufferSourceForPrimvar (StagingVerts, pxr::HdTokens->normals , std::move (NormalsPrimvar), pxr::HdInterpolationFaceVarying);
884+ AddStagingBufferSourceForPrimvar (RenderDelegate, StagingVerts, pxr::HdTokens->normals , std::move (NormalsPrimvar), pxr::HdInterpolationFaceVarying);
873885 }
874886
875887 m_SkinningPrimvarsVersion = SkinningPrimvarsVersion;
@@ -900,6 +912,8 @@ void HnMesh::UpdateVertexAndVaryingPrimvars(pxr::HdSceneDelegate& SceneDelegate,
900912 const PrimvarsInfo& VertexPrimvarsInfo,
901913 StagingVertexData& StagingVerts)
902914{
915+ HnRenderDelegate* RenderDelegate = static_cast <HnRenderDelegate*>(SceneDelegate.GetRenderIndex ().GetRenderDelegate ());
916+
903917 for (const auto & it : VertexPrimvarsInfo.Dirty )
904918 {
905919 const pxr::TfToken& Name = it.first ;
@@ -912,7 +926,7 @@ void HnMesh::UpdateVertexAndVaryingPrimvars(pxr::HdSceneDelegate& SceneDelegate,
912926 if (PrimDesc.name == pxr::HdTokens->points )
913927 StagingVerts.Points = PrimValue;
914928
915- AddStagingBufferSourceForPrimvar (StagingVerts, Name, std::move (PrimValue), PrimDesc.interpolation );
929+ AddStagingBufferSourceForPrimvar (RenderDelegate, StagingVerts, Name, std::move (PrimValue), PrimDesc.interpolation );
916930 }
917931
918932 for (const pxr::HdExtComputationPrimvarDescriptor& ExtCompPrimDesc : VertexPrimvarsInfo.ExtComp )
@@ -932,13 +946,15 @@ void HnMesh::UpdateFaceVaryingPrimvars(pxr::HdSceneDelegate& SceneDelegate,
932946 const PrimvarsInfo& FacePrimvarsInfo,
933947 StagingVertexData& StagingVerts)
934948{
949+ HnRenderDelegate* RenderDelegate = static_cast <HnRenderDelegate*>(SceneDelegate.GetRenderIndex ().GetRenderDelegate ());
950+
935951 for (const auto & it : FacePrimvarsInfo.Dirty )
936952 {
937953 const pxr::TfToken& Name = it.first ;
938954 const pxr::HdPrimvarDescriptor& PrimDesc = it.second ;
939955
940956 pxr::VtValue PrimValue = GetPrimvar (&SceneDelegate, PrimDesc.name );
941- AddStagingBufferSourceForPrimvar (StagingVerts, Name, std::move (PrimValue), PrimDesc.interpolation );
957+ AddStagingBufferSourceForPrimvar (RenderDelegate, StagingVerts, Name, std::move (PrimValue), PrimDesc.interpolation );
942958 }
943959}
944960
@@ -1000,7 +1016,7 @@ void HnMesh::UpdateConstantPrimvars(pxr::HdSceneDelegate& SceneDelegate,
10001016 }
10011017}
10021018
1003- void HnMesh::GenerateSmoothNormals (StagingVertexData& StagingVerts)
1019+ void HnMesh::GenerateSmoothNormals (HnRenderDelegate& RenderDelegate, StagingVertexData& StagingVerts)
10041020{
10051021 pxr::Hd_VertexAdjacency Adjacency;
10061022 Adjacency.BuildAdjacencyTable (&m_Topology);
@@ -1025,7 +1041,7 @@ void HnMesh::GenerateSmoothNormals(StagingVertexData& StagingVerts)
10251041 return ;
10261042 }
10271043
1028- AddStagingBufferSourceForPrimvar (StagingVerts, pxr::HdTokens->normals , pxr::VtValue::Take (Normals), pxr::HdInterpolationVertex);
1044+ AddStagingBufferSourceForPrimvar (&RenderDelegate, StagingVerts, pxr::HdTokens->normals , pxr::VtValue::Take (Normals), pxr::HdInterpolationVertex);
10291045}
10301046
10311047void HnMesh::UpdateIndexData (StagingIndexData& StagingInds, const pxr::VtValue& Points)
0 commit comments