Skip to content

Commit 4f4b83d

Browse files
HnSkinningComputation: added GetLastFrameXforms() method
1 parent b2a66be commit 4f4b83d

File tree

4 files changed

+15
-7
lines changed

4 files changed

+15
-7
lines changed

Hydrogent/include/Computations/HnSkinningComputation.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class HnSkinningComputation final : public HnExtComputationImpl
5959
static bool IsCompatible(const HnExtComputation& Owner);
6060

6161
const pxr::VtMatrix4fArray& GetXforms() const { return m_Xforms[m_CurrXformsIdx]; }
62+
const pxr::VtMatrix4fArray& GetLastFrameXforms() const { return m_Xforms[1 - m_CurrXformsIdx]; }
6263
size_t GetXformsHash() const { return m_XformsHash; }
6364

6465
const float4x4& GetPrimWorldToLocal() const { return m_PrimWorldToLocal; }

Hydrogent/interface/HnMesh.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,10 @@ class HnMesh final : public pxr::HdMesh
112112

113113
struct Skinning
114114
{
115-
const pxr::VtMatrix4fArray* Xforms = nullptr;
116-
size_t XformsHash = 0;
117-
float4x4 GeomBindXform = float4x4::Identity();
115+
const pxr::VtMatrix4fArray* Xforms = nullptr;
116+
const pxr::VtMatrix4fArray* LastFrameXforms = nullptr;
117+
size_t XformsHash = 0;
118+
float4x4 GeomBindXform = float4x4::Identity();
118119

119120
explicit operator bool() const { return Xforms != nullptr; }
120121
};

Hydrogent/src/Computations/HnSkinningComputation.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,15 @@ void HnSkinningComputation::Sync(pxr::HdSceneDelegate* SceneDelegate,
7474
pxr::VtValue SkinningXformsVal = SceneDelegate->GetExtComputationInput(Id, HnSkinningComputationPrivateTokens->skinningXforms);
7575
if (SkinningXformsVal.IsHolding<pxr::VtMatrix4fArray>())
7676
{
77-
m_CurrXformsIdx = (m_CurrXformsIdx + 1) % m_Xforms.size();
77+
pxr::VtMatrix4fArray& LastXforms = m_Xforms[m_CurrXformsIdx];
78+
VERIFY_EXPR(m_Xforms.size() == 2);
79+
m_CurrXformsIdx = 1 - m_CurrXformsIdx;
7880
pxr::VtMatrix4fArray& Xforms = m_Xforms[m_CurrXformsIdx];
7981

80-
Xforms = SkinningXformsVal.UncheckedGet<pxr::VtMatrix4fArray>();
82+
Xforms = SkinningXformsVal.UncheckedGet<pxr::VtMatrix4fArray>();
83+
if (LastXforms.empty())
84+
LastXforms = Xforms;
85+
8186
m_XformsHash = pxr::TfHash{}(Xforms);
8287

8388
const HnRenderDelegate* RenderDelegate = static_cast<const HnRenderDelegate*>(SceneDelegate->GetRenderIndex().GetRenderDelegate());

Hydrogent/src/HnMesh.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -915,8 +915,9 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
915915

916916
if (const HnSkinningComputation* SkinningCompImpl = SkinningComp->GetImpl<HnSkinningComputation>())
917917
{
918-
SkinningData.Xforms = &SkinningCompImpl->GetXforms();
919-
SkinningData.XformsHash = SkinningCompImpl->GetXformsHash();
918+
SkinningData.Xforms = &SkinningCompImpl->GetXforms();
919+
SkinningData.LastFrameXforms = &SkinningCompImpl->GetLastFrameXforms();
920+
SkinningData.XformsHash = SkinningCompImpl->GetXformsHash();
920921

921922
const float4x4& SkelLocalToPrimLocal = SkinningCompImpl->GetSkelLocalToPrimLocal();
922923
if (SkelLocalToPrimLocal != m_SkelLocalToPrimLocal)

0 commit comments

Comments
 (0)