Files
UnrealEngine/Engine/Plugins/Animation/RigLogic/Source/RigLogicModule/Private/SharedRigRuntimeContext.cpp
2025-05-18 13:04:45 +08:00

54 lines
2.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SharedRigRuntimeContext.h"
#include "CoreMinimal.h"
#include "HAL/LowLevelMemTracker.h"
#include "DNAReader.h"
#include "RigLogic.h"
void FSharedRigRuntimeContext::CacheVariableJointIndices()
{
LLM_SCOPE_BYNAME(TEXT("Animation/RigLogic"));
const uint16 LODCount = BehaviorReader->GetLODCount();
VariableJointIndicesPerLOD.Reset();
VariableJointIndicesPerLOD.AddDefaulted(LODCount);
TSet<uint16> DistinctVariableJointIndices;
for (uint16 LODIndex = 0; LODIndex < LODCount; ++LODIndex)
{
TArrayView<const uint16> VariableAttributeIndices = BehaviorReader->GetJointVariableAttributeIndices(LODIndex);
DistinctVariableJointIndices.Reset();
DistinctVariableJointIndices.Reserve(VariableAttributeIndices.Num());
for (const uint16 AttrIndex : VariableAttributeIndices)
{
// In DNA, the number of joint attributes is always 9 (only RigLogic has the ability to switch this)
// and since the variable indices are queried from the DNA here, we deal with 9 as well, regardless of
// the state elsewhere where we switched to 10 since the introduction of quaternion outputs from RigLogic.
static constexpr uint16 NUM_ATTRS_PER_JOINT = 9;
const uint16 JointIndex = AttrIndex / NUM_ATTRS_PER_JOINT;
DistinctVariableJointIndices.Add(JointIndex);
}
VariableJointIndicesPerLOD[LODIndex].Values = DistinctVariableJointIndices.Array();
}
}
void FSharedRigRuntimeContext::CacheInverseNeutralJointRotations()
{
LLM_SCOPE_BYNAME(TEXT("Animation/RigLogic"));
static constexpr uint32 JointAttributeCount = 10;
TArrayView<const float> NeutralJointValues = RigLogic->GetNeutralJointValues();
ensure(NeutralJointValues.Num() % JointAttributeCount == 0);
const int32 JointCount = NeutralJointValues.Num() / JointAttributeCount;
InverseNeutralJointRotations.Reset(JointCount);
for (int32 JointIndex = 0; JointIndex < JointCount; ++JointIndex)
{
const int32 AttrIndex = JointIndex * JointAttributeCount;
const tdm::fquat NeutralRotation{NeutralJointValues[AttrIndex + 3], NeutralJointValues[AttrIndex + 4], NeutralJointValues[AttrIndex + 5], NeutralJointValues[AttrIndex + 6]};
const tdm::fquat InverseNeutralRotation = tdm::inverse(NeutralRotation);
InverseNeutralJointRotations.Add(FQuat(InverseNeutralRotation.x, InverseNeutralRotation.y, InverseNeutralRotation.z, InverseNeutralRotation.w));
}
}