WIP:Fix sequenc emirror creation

+cleanup
This commit is contained in:
Lucas Peter 2025-02-07 15:04:52 +01:00
parent bc807249fd
commit 7231144e36
No known key found for this signature in database

View file

@ -28,10 +28,17 @@ UMASFunctionLibrary::UMASFunctionLibrary(const FObjectInitializer& ObjectInitial
{ {
} }
void UMASFunctionLibrary::BulkMirrorEditorOnly(const TArray <UAnimSequence*> SourceAnims, const UMirrorTable* MirrorTable, TArray <UAnimSequence*>& OutNewAnims) void UMASFunctionLibrary::BulkMirrorEditorOnly(const TArray<UAnimSequence*> SourceAnims,
const UMirrorTable* MirrorTable, TArray<UAnimSequence*>& OutNewAnims)
{ {
if (SourceAnims.Num() == 0) return; if (SourceAnims.Num() == 0)
if (MirrorTable == NULL) return; {
return;
}
if (MirrorTable == nullptr)
{
return;
}
#if WITH_EDITOR #if WITH_EDITOR
FAssetToolsModule& AssetToolsModule = FModuleManager::Get().LoadModuleChecked<FAssetToolsModule>("AssetTools"); FAssetToolsModule& AssetToolsModule = FModuleManager::Get().LoadModuleChecked<FAssetToolsModule>("AssetTools");
@ -45,13 +52,14 @@ void UMASFunctionLibrary::BulkMirrorEditorOnly(const TArray <UAnimSequence*> Sou
FString Suffix = TEXT("_Mirrored"); FString Suffix = TEXT("_Mirrored");
AssetToolsModule.Get().CreateUniqueAssetName(SourceAnims[i]->GetOutermost()->GetName(), Suffix, /*out*/ PackageName, /*out*/ Name); AssetToolsModule.Get().CreateUniqueAssetName(SourceAnims[i]->GetOutermost()->GetName(), Suffix, /*out*/
PackageName, /*out*/ Name);
const FString PackagePath = FPackageName::GetLongPackagePath(PackageName); const FString PackagePath = FPackageName::GetLongPackagePath(PackageName);
UObject* NewAsset = AssetToolsModule.Get().DuplicateAsset(Name, PackagePath, SourceAnims[i]); UObject* NewAsset = AssetToolsModule.Get().DuplicateAsset(Name, PackagePath, SourceAnims[i]);
if (NewAsset != NULL) if (NewAsset != nullptr)
{ {
UAnimSequence* MirrorAnimSequence = Cast<UAnimSequence>(NewAsset); UAnimSequence* MirrorAnimSequence = Cast<UAnimSequence>(NewAsset);
CreateMirrorSequenceFromAnimSequence(MirrorAnimSequence, MirrorTable); CreateMirrorSequenceFromAnimSequence(MirrorAnimSequence, MirrorTable);
@ -64,13 +72,21 @@ void UMASFunctionLibrary::BulkMirrorEditorOnly(const TArray <UAnimSequence*> Sou
// Display notification so users can quickly access // Display notification so users can quickly access
if (GIsEditor) if (GIsEditor)
{ {
FNotificationInfo Info(FText::Format(LOCTEXT("AnimationMirrored", "Successfully Mirrored Animation"), FText::FromString(MirrorAnimSequence->GetName()))); FNotificationInfo Info(FText::Format(
LOCTEXT("AnimationMirrored", "Successfully Mirrored Animation"),
FText::FromString(MirrorAnimSequence->GetName())));
Info.ExpireDuration = 8.0f; Info.ExpireDuration = 8.0f;
Info.bUseLargeFont = false; Info.bUseLargeFont = false;
//Info.Hyperlink = FSimpleDelegate::CreateLambda([=]() { FAssetEditorManager::Get().OpenEditorForAssets(TArray<UObject*>({ MirrorAnimSequence })); }); //Info.Hyperlink = FSimpleDelegate::CreateLambda([=]() { FAssetEditorManager::Get().OpenEditorForAssets(TArray<UObject*>({ MirrorAnimSequence })); });
Info.Hyperlink = FSimpleDelegate::CreateLambda([=]() { GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAssets(TArray<UObject*>({ MirrorAnimSequence })); }); Info.Hyperlink = FSimpleDelegate::CreateLambda([=]()
{
GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAssets(TArray<UObject*>({
MirrorAnimSequence
}));
});
Info.HyperlinkText = FText::Format(LOCTEXT("OpenNewAnimationHyperlink", "Open {0}"), FText::FromString(MirrorAnimSequence->GetName())); Info.HyperlinkText = FText::Format(
LOCTEXT("OpenNewAnimationHyperlink", "Open {0}"), FText::FromString(MirrorAnimSequence->GetName()));
TSharedPtr<SNotificationItem> Notification = FSlateNotificationManager::Get().AddNotification(Info); TSharedPtr<SNotificationItem> Notification = FSlateNotificationManager::Get().AddNotification(Info);
if (Notification.IsValid()) if (Notification.IsValid())
{ {
@ -83,11 +99,18 @@ void UMASFunctionLibrary::BulkMirrorEditorOnly(const TArray <UAnimSequence*> Sou
} }
MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::BulkMirror_CS_EditorOnly( MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::BulkMirror_CS_EditorOnly(
const TArray<UAnimSequence*> SourceAnims, const TArray<UAnimSequence*> SourceAnims,
const TEnumAsByte<EAxis::Type> MirrorAxis, const FString Substring_A, const FString Substring_B, const bool Symmetrical, TArray<UAnimSequence*>& OutNewAnims) const TEnumAsByte<EAxis::Type> MirrorAxis, const FString Substring_A, const FString Substring_B,
const bool Symmetrical, TArray<UAnimSequence*>& OutNewAnims)
{ {
if (SourceAnims.Num() == 0) return; if (SourceAnims.Num() == 0)
if (MirrorAxis == EAxis::None) return; {
return;
}
if (MirrorAxis == EAxis::None)
{
return;
}
#if WITH_EDITOR #if WITH_EDITOR
FAssetToolsModule& AssetToolsModule = FModuleManager::Get().LoadModuleChecked<FAssetToolsModule>("AssetTools"); FAssetToolsModule& AssetToolsModule = FModuleManager::Get().LoadModuleChecked<FAssetToolsModule>("AssetTools");
@ -101,16 +124,18 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::BulkMirror_CS_EditorOnly(
FString Suffix = TEXT("_Mirrored"); FString Suffix = TEXT("_Mirrored");
AssetToolsModule.Get().CreateUniqueAssetName(SourceAnims[i]->GetOutermost()->GetName(), Suffix, /*out*/ PackageName, /*out*/ Name); AssetToolsModule.Get().CreateUniqueAssetName(SourceAnims[i]->GetOutermost()->GetName(), Suffix, /*out*/
PackageName, /*out*/ Name);
const FString PackagePath = FPackageName::GetLongPackagePath(PackageName); const FString PackagePath = FPackageName::GetLongPackagePath(PackageName);
UObject* NewAsset = AssetToolsModule.Get().DuplicateAsset(Name, PackagePath, SourceAnims[i]); UObject* NewAsset = AssetToolsModule.Get().DuplicateAsset(Name, PackagePath, SourceAnims[i]);
if (NewAsset != NULL) if (NewAsset != nullptr)
{ {
UAnimSequence* MirrorAnimSequence = Cast<UAnimSequence>(NewAsset); UAnimSequence* MirrorAnimSequence = Cast<UAnimSequence>(NewAsset);
CreateMirrorSequenceFromAnimSequence_CS(MirrorAnimSequence, MirrorAxis, Substring_A, Substring_B, Symmetrical); CreateMirrorSequenceFromAnimSequence_CS(MirrorAnimSequence, MirrorAxis, Substring_A, Substring_B,
Symmetrical);
OutNewAnims.Add(MirrorAnimSequence); OutNewAnims.Add(MirrorAnimSequence);
@ -120,13 +145,21 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::BulkMirror_CS_EditorOnly(
// Display notification so users can quickly access // Display notification so users can quickly access
if (GIsEditor) if (GIsEditor)
{ {
FNotificationInfo Info(FText::Format(LOCTEXT("AnimationMirrored", "Successfully Mirrored Animation"), FText::FromString(MirrorAnimSequence->GetName()))); FNotificationInfo Info(FText::Format(
LOCTEXT("AnimationMirrored", "Successfully Mirrored Animation"),
FText::FromString(MirrorAnimSequence->GetName())));
Info.ExpireDuration = 8.0f; Info.ExpireDuration = 8.0f;
Info.bUseLargeFont = false; Info.bUseLargeFont = false;
//Info.Hyperlink = FSimpleDelegate::CreateLambda([=]() { FAssetEditorManager::Get().OpenEditorForAssets(TArray<UObject*>({ MirrorAnimSequence })); }); //Info.Hyperlink = FSimpleDelegate::CreateLambda([=]() { FAssetEditorManager::Get().OpenEditorForAssets(TArray<UObject*>({ MirrorAnimSequence })); });
Info.Hyperlink = FSimpleDelegate::CreateLambda([=]() { GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAssets(TArray<UObject*>({ MirrorAnimSequence })); }); Info.Hyperlink = FSimpleDelegate::CreateLambda([=]()
{
GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAssets(TArray<UObject*>({
MirrorAnimSequence
}));
});
Info.HyperlinkText = FText::Format(LOCTEXT("OpenNewAnimationHyperlink", "Open {0}"), FText::FromString(MirrorAnimSequence->GetName())); Info.HyperlinkText = FText::Format(
LOCTEXT("OpenNewAnimationHyperlink", "Open {0}"), FText::FromString(MirrorAnimSequence->GetName()));
TSharedPtr<SNotificationItem> Notification = FSlateNotificationManager::Get().AddNotification(Info); TSharedPtr<SNotificationItem> Notification = FSlateNotificationManager::Get().AddNotification(Info);
if (Notification.IsValid()) if (Notification.IsValid())
{ {
@ -140,10 +173,11 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::BulkMirror_CS_EditorOnly(
#if WITH_EDITOR #if WITH_EDITOR
void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* MirrorSequence, const UMirrorTable* MirrorTable) void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* MirrorSequence,
const UMirrorTable* MirrorTable)
{ {
//Check if it's valid //Check if it's valid
if ((MirrorSequence != NULL) && (MirrorTable != NULL) && (MirrorSequence->GetSkeleton() != NULL)) if ((MirrorSequence != nullptr) && (MirrorTable != nullptr) && (MirrorSequence->GetSkeleton() != nullptr))
{ {
//Make the duplicate that I will edit //Make the duplicate that I will edit
//UAnimSequence* MirrorSequence = FromAnimSequence; //UAnimSequence* MirrorSequence = FromAnimSequence;
@ -153,12 +187,13 @@ void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* Mi
int NumFrames = MirrorSequence->GetNumberOfFrames(); int NumFrames = MirrorSequence->GetNumberOfFrames();
IAnimationDataController& MirrorSequenceController = MirrorSequence->GetController(); IAnimationDataController& MirrorSequenceController = MirrorSequence->GetController();
TArray<FBoneAnimationTrack> SourceBoneAnimData = MirrorSequenceController.GetModel()->GetBoneAnimationTracks(); const TArray<FBoneAnimationTrack>& SourceBoneAnimData = MirrorSequenceController.GetModel()->
GetBoneAnimationTracks();
/************* SourceRawAnimDatas should be replaced by SourceBoneAnimData ************/ /************* SourceRawAnimDatas should be replaced by SourceBoneAnimData ************/
// TArray<FRawAnimSequenceTrack> SourceRawAnimDatas = MirrorSequence->GetRawAnimationData(); // TArray<FRawAnimSequenceTrack> SourceRawAnimDatas = MirrorSequence->GetRawAnimationData();
TArray<FName> TrackNames; TArray<FName>* TrackNames = new TArray<FName>;
MirrorSequenceController.GetModel()->GetBoneTrackNames(TrackNames); MirrorSequenceController.GetModel()->GetBoneTrackNames(*TrackNames);
for (int i = 0; i < NumMirrorBones; i++) for (int i = 0; i < NumMirrorBones; i++)
{ {
@ -176,25 +211,26 @@ void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* Mi
continue; continue;
} }
int32 TrackIndex = TrackNames.IndexOfByKey(CurrentBone.BoneName); int32 TrackIndex = TrackNames->IndexOfByKey(CurrentBone.BoneName);
int32 TwinTrackIndex = TrackNames.IndexOfByKey(CurrentBone.TwinBoneName); int32 TwinTrackIndex = TrackNames->IndexOfByKey(CurrentBone.TwinBoneName);
if (TrackIndex == INDEX_NONE && TwinTrackIndex == INDEX_NONE) if (TrackIndex == INDEX_NONE && TwinTrackIndex == INDEX_NONE)
{ {
continue; continue;
} }
TArray <FVector3f> MirrorPosKeys; TArray<FVector3f> MirrorPosKeys;
TArray <FQuat4f> MirrorRotKeys; TArray<FQuat4f> MirrorRotKeys;
TArray <FVector3f> MirrorScaleKeys; TArray<FVector3f> MirrorScaleKeys;
TArray <FVector3f> TwinMirrorPosKeys; TArray<FVector3f> TwinMirrorPosKeys;
TArray <FQuat4f> TwinMirrorRotKeys; TArray<FQuat4f> TwinMirrorRotKeys;
TArray <FVector3f> TwinMirrorScaleKeys; TArray<FVector3f> TwinMirrorScaleKeys;
// Original Bone // Original Bone
if (TrackIndex != INDEX_NONE) if (TrackIndex != INDEX_NONE)
{ {
check(SourceBoneAnimData.Num()>0);
auto& MirroredRawTrack = SourceBoneAnimData[TrackIndex]; auto& MirroredRawTrack = SourceBoneAnimData[TrackIndex];
for (int u = 0; u < NumFrames; u++) for (int u = 0; u < NumFrames; u++)
@ -222,8 +258,8 @@ void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* Mi
} }
MirrorTM.Mirror(CurrentBone.MirrorAxis, CurrentBone.FlipAxis); MirrorTM.Mirror(CurrentBone.MirrorAxis, CurrentBone.FlipAxis);
FRotator3f BoneNewRotation = MirrorTM.Rotator(); // quaternion to rotator FRotator3f BoneNewRotation = MirrorTM.Rotator(); // quaternion to rotator
BoneNewRotation.Yaw += CurrentBone.RotationOffset.Yaw; BoneNewRotation.Yaw += CurrentBone.RotationOffset.Yaw;
@ -353,7 +389,8 @@ void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* Mi
//MirrorSequence->AddNewRawTrack(CurrentBone.TwinBoneName, &NewTrack); //MirrorSequence->AddNewRawTrack(CurrentBone.TwinBoneName, &NewTrack);
MirrorSequenceController.AddBoneTrack(CurrentBone.TwinBoneName); MirrorSequenceController.AddBoneTrack(CurrentBone.TwinBoneName);
MirrorSequenceController.SetBoneTrackKeys(CurrentBone.BoneName,NewTrack.PosKeys,NewTrack.RotKeys,NewTrack.ScaleKeys); MirrorSequenceController.SetBoneTrackKeys(CurrentBone.BoneName, NewTrack.PosKeys, NewTrack.RotKeys,
NewTrack.ScaleKeys);
} }
// Twin Bone -> Original Bone // Twin Bone -> Original Bone
@ -365,12 +402,14 @@ void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* Mi
NewTrack.ScaleKeys = TwinMirrorScaleKeys; NewTrack.ScaleKeys = TwinMirrorScaleKeys;
MirrorSequenceController.AddBoneTrack(CurrentBone.BoneName); MirrorSequenceController.AddBoneTrack(CurrentBone.BoneName);
MirrorSequenceController.SetBoneTrackKeys(CurrentBone.BoneName,NewTrack.PosKeys,NewTrack.RotKeys,NewTrack.ScaleKeys); MirrorSequenceController.SetBoneTrackKeys(CurrentBone.BoneName, NewTrack.PosKeys, NewTrack.RotKeys,
NewTrack.ScaleKeys);
} }
} }
else else
{ {
int32 TrackIndex = TrackNames.IndexOfByKey(CurrentBone.BoneName); if (TrackNames) { continue; }
int32 TrackIndex = TrackNames->IndexOfByKey(CurrentBone.BoneName);
if (TrackIndex == INDEX_NONE) if (TrackIndex == INDEX_NONE)
{ {
@ -380,9 +419,9 @@ void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* Mi
FBoneAnimationTrack MirroredRawTrack = SourceBoneAnimData[TrackIndex]; FBoneAnimationTrack MirroredRawTrack = SourceBoneAnimData[TrackIndex];
//MirrorAllFrames //MirrorAllFrames
TArray <FVector3f> MirrorPosKeys; TArray<FVector3f> MirrorPosKeys;
TArray <FQuat4f> MirrorRotKeys; TArray<FQuat4f> MirrorRotKeys;
TArray <FVector3f> MirrorScaleKeys; TArray<FVector3f> MirrorScaleKeys;
for (int u = 0; u < NumFrames; u++) for (int u = 0; u < NumFrames; u++)
{ {
@ -448,7 +487,10 @@ void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence(UAnimSequence* Mi
//MirrorSequenceController.AddBoneTrack(CurrentBone.BoneName, &MirroredRawTrack); //MirrorSequenceController.AddBoneTrack(CurrentBone.BoneName, &MirroredRawTrack);
MirrorSequenceController.AddBoneCurve(CurrentBone.BoneName); MirrorSequenceController.AddBoneCurve(CurrentBone.BoneName);
MirrorSequenceController.SetBoneTrackKeys(CurrentBone.BoneName,MirroredRawTrack.InternalTrackData.PosKeys,MirroredRawTrack.InternalTrackData.RotKeys,MirroredRawTrack.InternalTrackData.ScaleKeys); MirrorSequenceController.SetBoneTrackKeys(CurrentBone.BoneName,
MirroredRawTrack.InternalTrackData.PosKeys,
MirroredRawTrack.InternalTrackData.RotKeys,
MirroredRawTrack.InternalTrackData.ScaleKeys);
} }
} }
//MirrorSequence->ClearBakedTransformData(); //MirrorSequence->ClearBakedTransformData();
@ -481,14 +523,13 @@ static FTransform3f GetAnimBoneCSTM(UAnimSequence* AnimSeq, const int32 BoneTree
while (true) while (true)
{ {
const int32 Parent(RefSkeleton.GetParentIndex(CurrBone)); const int32 Parent(RefSkeleton.GetParentIndex(CurrBone));
if (Parent < 0) break; if (Parent < 0)
else
{ {
break;
BoneTMWS = BoneTMWS * GetAnimBoneTM(AnimSeq, Parent, AnimTime);
CurrBone = Parent;
} }
BoneTMWS = BoneTMWS * GetAnimBoneTM(AnimSeq, Parent, AnimTime);
CurrBone = Parent;
} }
return BoneTMWS; return BoneTMWS;
} }
@ -496,8 +537,8 @@ static FTransform3f GetAnimBoneCSTM(UAnimSequence* AnimSeq, const int32 BoneTree
MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence_CS( MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromAnimSequence_CS(
UAnimSequence* MirrorSequence, UAnimSequence* MirrorSequence,
const TEnumAsByte<EAxis::Type> MirrorAxis, const TEnumAsByte<EAxis::Type> MirrorAxis,
const FString Substring_A, const FString Substring_A,
const FString Substring_B, const FString Substring_B,
const bool Symmetrical) const bool Symmetrical)
{ {
IAnimationDataController& Controller = MirrorSequence->GetController(); IAnimationDataController& Controller = MirrorSequence->GetController();
@ -507,14 +548,15 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
USkeleton* Skeleton = MirrorSequence->GetSkeleton(); USkeleton* Skeleton = MirrorSequence->GetSkeleton();
const auto& RefSkeleton = Skeleton->GetReferenceSkeleton(); const auto& RefSkeleton = Skeleton->GetReferenceSkeleton();
TArray<bool> Already;
TArray <bool> Already; Already.SetNumZeroed(Skeleton->GetReferenceSkeleton().GetRawBoneNum()); Already.SetNumZeroed(Skeleton->GetReferenceSkeleton().GetRawBoneNum());
TArray<FIntPoint> TwinPairs; TArray<FIntPoint> TwinPairs;
TArray<int32> NonTwinIDs; TArray<int32> NonTwinIDs;
TArray<EAxis::Type> NonTwinFlipAxis; TArray<EAxis::Type> NonTwinFlipAxis;
FMASUtils::CSMirrorSettings(RefSkeleton, MirrorAxis, Substring_A, Substring_B, TwinPairs, NonTwinIDs, NonTwinFlipAxis); FMASUtils::CSMirrorSettings(RefSkeleton, MirrorAxis, Substring_A, Substring_B, TwinPairs, NonTwinIDs,
NonTwinFlipAxis);
const bool DeltaStep = !Symmetrical; const bool DeltaStep = !Symmetrical;
@ -530,7 +572,7 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
TMap<int32, FRawAnimSequenceTrack> BoneTracks; TMap<int32, FRawAnimSequenceTrack> BoneTracks;
for (int32 i = 0; i < RefSkeleton.GetNum(); i++) for (int32 i = 0; i < RefSkeleton.GetNum(); i++)
{ {
BoneTracks.Add(i, FRawAnimSequenceTrack()); BoneTracks.Add(i, FRawAnimSequenceTrack());
@ -538,7 +580,8 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
for (int32 j = 0; j < NumFrames; j++) for (int32 j = 0; j < NumFrames; j++)
{ {
TArray <FTransform3f> NewCSTMs; NewCSTMs.SetNum(RefSkeleton.GetNum()); TArray<FTransform3f> NewCSTMs;
NewCSTMs.SetNum(RefSkeleton.GetNum());
for (int32 i = 0; i < NonTwinIDs.Num(); i++) for (int32 i = 0; i < NonTwinIDs.Num(); i++)
{ {
@ -550,7 +593,8 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
const int32 ParentIndex = RefSkeleton.GetParentIndex(BoneTreeIndex); const int32 ParentIndex = RefSkeleton.GetParentIndex(BoneTreeIndex);
if (ParentIndex != INDEX_NONE) if (ParentIndex != INDEX_NONE)
{ {
NewCSTMs[BoneTreeIndex] = FTransform3f(RefSkeleton.GetRefBonePose()[BoneTreeIndex]) * NewCSTMs[ParentIndex]; NewCSTMs[BoneTreeIndex] = FTransform3f(RefSkeleton.GetRefBonePose()[BoneTreeIndex]) * NewCSTMs[
ParentIndex];
} }
else else
{ {
@ -576,12 +620,14 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
const FCompactPoseBoneIndex TwinCmptBoneIndex(TwinBoneIndex); const FCompactPoseBoneIndex TwinCmptBoneIndex(TwinBoneIndex);
const FTransform3f RefTM = FTransform3f(FAnimationRuntime::GetComponentSpaceTransformRefPose(RefSkeleton, BoneIndex)); const FTransform3f RefTM = FTransform3f(
const FTransform3f TwinRefTM = FTransform3f(FAnimationRuntime::GetComponentSpaceTransformRefPose(RefSkeleton, TwinBoneIndex)); FAnimationRuntime::GetComponentSpaceTransformRefPose(RefSkeleton, BoneIndex));
const FTransform3f TwinRefTM = FTransform3f(
FAnimationRuntime::GetComponentSpaceTransformRefPose(RefSkeleton, TwinBoneIndex));
const FTransform3f TM = GetAnimBoneCSTM(MirrorSequence, BoneIndex, DT * j); const FTransform3f TM = GetAnimBoneCSTM(MirrorSequence, BoneIndex, DT * j);
//Output.Pose.GetComponentSpaceTransform(CmptBoneIndex); //Output.Pose.GetComponentSpaceTransform(CmptBoneIndex);
const FTransform3f TwinTM = GetAnimBoneCSTM(MirrorSequence, TwinBoneIndex, DT * j); const FTransform3f TwinTM = GetAnimBoneCSTM(MirrorSequence, TwinBoneIndex, DT * j);
//Output.Pose.GetComponentSpaceTransform(TwinCmptBoneIndex); //Output.Pose.GetComponentSpaceTransform(TwinCmptBoneIndex);
const int32 ParentIndex = RefSkeleton.GetParentIndex(BoneIndex); const int32 ParentIndex = RefSkeleton.GetParentIndex(BoneIndex);
@ -612,14 +658,16 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
else else
{ {
const FTransform3f& ParentTwinTM = NewCSTMs[RefSkeleton.GetParentIndex(TwinBoneIndex)]; const FTransform3f& ParentTwinTM = NewCSTMs[RefSkeleton.GetParentIndex(TwinBoneIndex)];
const FTransform3f& IParentTM =// Output.Pose.GetComponentSpaceTransform(FCompactPoseBoneIndex(ParentIndex)); const FTransform3f& IParentTM =
// Output.Pose.GetComponentSpaceTransform(FCompactPoseBoneIndex(ParentIndex));
GetAnimBoneCSTM(MirrorSequence, ParentIndex, DT * j); GetAnimBoneCSTM(MirrorSequence, ParentIndex, DT * j);
FTransform3f RefBS = FTransform3f(RefSkeleton.GetRefBonePose()[BoneIndex]) * IParentTM; FTransform3f RefBS = FTransform3f(RefSkeleton.GetRefBonePose()[BoneIndex]) * IParentTM;
RefBS = RefBS * TwinMirrorModTM; RefBS = RefBS * TwinMirrorModTM;
RefBS.SetRotation(RefBS.GetRotation() * DeltaQuat); RefBS.SetRotation(RefBS.GetRotation() * DeltaQuat);
RefBS.SetScale3D(TwinTM.GetScale3D()); RefBS.SetScale3D(TwinTM.GetScale3D());
MirrTM = (MirrTM.GetRelativeTransform(RefBS) * FTransform3f(RefSkeleton.GetRefBonePose()[TwinBoneIndex])) * ParentTwinTM; MirrTM = (MirrTM.GetRelativeTransform(RefBS) * FTransform3f(
RefSkeleton.GetRefBonePose()[TwinBoneIndex])) * ParentTwinTM;
} }
} }
@ -648,14 +696,17 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
else else
{ {
const FTransform3f& ParentTM = NewCSTMs[RefSkeleton.GetParentIndex(BoneIndex)]; const FTransform3f& ParentTM = NewCSTMs[RefSkeleton.GetParentIndex(BoneIndex)];
const FTransform3f& IParentTwinTM = //Output.Pose.GetComponentSpaceTransform(FCompactPoseBoneIndex(TwinParentIndex)); const FTransform3f& IParentTwinTM =
//Output.Pose.GetComponentSpaceTransform(FCompactPoseBoneIndex(TwinParentIndex));
GetAnimBoneCSTM(MirrorSequence, TwinParentIndex, DT * j); GetAnimBoneCSTM(MirrorSequence, TwinParentIndex, DT * j);
FTransform3f TwinRefBS = FTransform3f(RefSkeleton.GetRefBonePose()[TwinBoneIndex]) * IParentTwinTM; FTransform3f TwinRefBS = FTransform3f(RefSkeleton.GetRefBonePose()[TwinBoneIndex]) *
IParentTwinTM;
TwinRefBS = TwinRefBS * TwinMirrorModTM; TwinRefBS = TwinRefBS * TwinMirrorModTM;
TwinRefBS.SetRotation(TwinRefBS.GetRotation() * TwinDeltaQuat); TwinRefBS.SetRotation(TwinRefBS.GetRotation() * TwinDeltaQuat);
TwinRefBS.SetScale3D(TM.GetScale3D()); TwinRefBS.SetScale3D(TM.GetScale3D());
TwinMirrTM = (TwinMirrTM.GetRelativeTransform(TwinRefBS) * FTransform3f(RefSkeleton.GetRefBonePose()[BoneIndex]) * ParentTM); TwinMirrTM = (TwinMirrTM.GetRelativeTransform(TwinRefBS) * FTransform3f(
RefSkeleton.GetRefBonePose()[BoneIndex]) * ParentTM);
} }
} }
@ -668,8 +719,14 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
{ {
const int32 ParentIndex = RefSkeleton.GetParentIndex(i); const int32 ParentIndex = RefSkeleton.GetParentIndex(i);
FTransform3f BSTM; FTransform3f BSTM;
if (ParentIndex != INDEX_NONE) BSTM = NewCSTMs[i].GetRelativeTransform(NewCSTMs[ParentIndex]); if (ParentIndex != INDEX_NONE)
else BSTM = NewCSTMs[i]; {
BSTM = NewCSTMs[i].GetRelativeTransform(NewCSTMs[ParentIndex]);
}
else
{
BSTM = NewCSTMs[i];
}
auto& BoneTrack = BoneTracks[i]; auto& BoneTrack = BoneTracks[i];
BoneTrack.PosKeys.Add(BSTM.GetLocation()); BoneTrack.PosKeys.Add(BSTM.GetLocation());
@ -683,8 +740,7 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
const FName TrackName = Skeleton->GetReferenceSkeleton().GetBoneName(Pair.Key); const FName TrackName = Skeleton->GetReferenceSkeleton().GetBoneName(Pair.Key);
//MirrorSequence->AddNewRawTrack(TrackName, &Pair.Value); //MirrorSequence->AddNewRawTrack(TrackName, &Pair.Value);
Controller.AddBoneCurve(TrackName); Controller.AddBoneCurve(TrackName);
Controller.SetBoneTrackKeys(TrackName,Pair.Value.PosKeys,Pair.Value.RotKeys,Pair.Value.ScaleKeys); Controller.SetBoneTrackKeys(TrackName, Pair.Value.PosKeys, Pair.Value.RotKeys, Pair.Value.ScaleKeys);
} }
// Have to also apply to pelvis and spine_01 // Have to also apply to pelvis and spine_01
@ -693,4 +749,4 @@ MIRRORANIMATIONSYSTEMDEV_API void UMASFunctionLibrary::CreateMirrorSequenceFromA
#endif #endif
#undef LOCTEXT_NAMESPACE #undef LOCTEXT_NAMESPACE