diff --git a/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysics.uasset b/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysics.uasset index db57ce6..21323d9 100644 Binary files a/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysics.uasset and b/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysics.uasset differ diff --git a/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision0.uasset b/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision0.uasset index f8fb540..1425226 100644 Binary files a/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision0.uasset and b/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision0.uasset differ diff --git a/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision1.uasset b/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision1.uasset index 5686522..5dd4cbe 100644 Binary files a/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision1.uasset and b/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision1.uasset differ diff --git a/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision2.uasset b/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision2.uasset index 1fc8f08..3666b75 100644 Binary files a/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision2.uasset and b/Content/KawaiiPhysicsSample/Chain/AnimBP_ChainKawaiiPhysicsCollision2.uasset differ diff --git a/Content/KawaiiPhysicsSample/GrayChan/AnimBP_GrayChanKawaiiPhysics.uasset b/Content/KawaiiPhysicsSample/GrayChan/AnimBP_GrayChanKawaiiPhysics.uasset index c746c34..69eaf38 100644 Binary files a/Content/KawaiiPhysicsSample/GrayChan/AnimBP_GrayChanKawaiiPhysics.uasset and b/Content/KawaiiPhysicsSample/GrayChan/AnimBP_GrayChanKawaiiPhysics.uasset differ diff --git a/Content/KawaiiPhysicsSample/GrayChan/AnimBP_GrayChanKawaiiPhysicsSkirt.uasset b/Content/KawaiiPhysicsSample/GrayChan/AnimBP_GrayChanKawaiiPhysicsSkirt.uasset index 3c13bb7..f874aa7 100644 Binary files a/Content/KawaiiPhysicsSample/GrayChan/AnimBP_GrayChanKawaiiPhysicsSkirt.uasset and b/Content/KawaiiPhysicsSample/GrayChan/AnimBP_GrayChanKawaiiPhysicsSkirt.uasset differ diff --git a/Plugins/KawaiiPhysics/Source/KawaiiPhysics/Private/AnimNode_KawaiiPhysics.cpp b/Plugins/KawaiiPhysics/Source/KawaiiPhysics/Private/AnimNode_KawaiiPhysics.cpp index 845878c..347503b 100644 --- a/Plugins/KawaiiPhysics/Source/KawaiiPhysics/Private/AnimNode_KawaiiPhysics.cpp +++ b/Plugins/KawaiiPhysics/Source/KawaiiPhysics/Private/AnimNode_KawaiiPhysics.cpp @@ -60,9 +60,12 @@ void FAnimNode_KawaiiPhysics::EvaluateSkeletalControl_AnyThread(FComponentSpaceP const FBoneContainer& BoneContainer = Output.Pose.GetPose().GetBoneContainer(); FTransform ComponentTransform = Output.AnimInstanceProxy->GetComponentTransform(); - if (!RootBone.IsValidToEvaluate(BoneContainer)) + for (auto& RootBone : RootBones) { - return; + if (!RootBone.IsValidToEvaluate(BoneContainer)) + { + return; + } } if (ModifyBones.Num() == 0) @@ -124,12 +127,20 @@ void FAnimNode_KawaiiPhysics::EvaluateSkeletalControl_AnyThread(FComponentSpaceP bool FAnimNode_KawaiiPhysics::IsValidToEvaluate(const USkeleton* Skeleton, const FBoneContainer& RequiredBones) { - return RootBone.IsValidToEvaluate(RequiredBones); + bool value = false; + for (auto& RootBone : RootBones) + { + value |= RootBone.IsValidToEvaluate(RequiredBones); + } + return value; } void FAnimNode_KawaiiPhysics::InitializeBoneReferences(const FBoneContainer& RequiredBones) { - RootBone.Initialize(RequiredBones); + for (auto& RootBone : RootBones) + { + RootBone.Initialize(RequiredBones); + } for (auto& Bone : ModifyBones) { @@ -162,7 +173,10 @@ void FAnimNode_KawaiiPhysics::InitModifyBones(FComponentSpacePoseContext& Output auto& RefSkeleton = Skeleton->GetReferenceSkeleton(); ModifyBones.Empty(); - AddModifyBone(Output, BoneContainer, RefSkeleton, RefSkeleton.FindBoneIndex(RootBone.BoneName)); + for (auto& RootBone : RootBones) + { + AddModifyBone(Output, BoneContainer, RefSkeleton, RefSkeleton.FindBoneIndex(RootBone.BoneName)); + } CalcBoneLength( ModifyBones[0], RefSkeleton.GetRefBonePose()); } @@ -677,6 +691,8 @@ void FAnimNode_KawaiiPhysics::ApplySimuateResult(FComponentSpacePoseContext& Out for (int i = 1; i < ModifyBones.Num(); ++i) { FKawaiiPhysicsModifyBone& Bone = ModifyBones[i]; + + if (Bone.ParentIndex == -1) continue; FKawaiiPhysicsModifyBone& ParentBone = ModifyBones[Bone.ParentIndex]; if (ParentBone.ChildIndexs.Num() <= 1) diff --git a/Plugins/KawaiiPhysics/Source/KawaiiPhysics/Public/AnimNode_KawaiiPhysics.h b/Plugins/KawaiiPhysics/Source/KawaiiPhysics/Public/AnimNode_KawaiiPhysics.h index 3eec4cb..fb3ae98 100644 --- a/Plugins/KawaiiPhysics/Source/KawaiiPhysics/Public/AnimNode_KawaiiPhysics.h +++ b/Plugins/KawaiiPhysics/Source/KawaiiPhysics/Public/AnimNode_KawaiiPhysics.h @@ -160,7 +160,7 @@ struct KAWAIIPHYSICS_API FAnimNode_KawaiiPhysics : public FAnimNode_SkeletalCont public: UPROPERTY(EditAnywhere, Category = ModifyTarget) - FBoneReference RootBone; + TArray RootBones; UPROPERTY(EditAnywhere, Category = ModifyTarget) TArray ExcludeBones; diff --git a/Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/Private/AnimGraphNode_KawaiiPhysics.cpp b/Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/Private/AnimGraphNode_KawaiiPhysics.cpp index e8648c6..44894e4 100644 --- a/Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/Private/AnimGraphNode_KawaiiPhysics.cpp +++ b/Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/Private/AnimGraphNode_KawaiiPhysics.cpp @@ -29,7 +29,10 @@ FText UAnimGraphNode_KawaiiPhysics::GetNodeTitle(ENodeTitleType::Type TitleType) { FFormatNamedArguments Args; Args.Add(TEXT("ControllerDescription"), GetControllerDescription()); - Args.Add(TEXT("RootBoneName"), FText::FromName(Node.RootBone.BoneName)); + for (auto& RootBone : Node.RootBones) + { + Args.Add(TEXT("RootBoneName"), FText::FromName(RootBone.BoneName)); + } // FText::Format() is slow, so we cache this to save on performance if (TitleType == ENodeTitleType::ListView || TitleType == ENodeTitleType::MenuTitle)