11#include " AnimGraphNode_KawaiiPhysics.h"
2+
3+ #include " DetailCategoryBuilder.h"
4+ #include " DetailLayoutBuilder.h"
5+ #include " DetailWidgetRow.h"
6+ #include " KawaiiPhysicsLimitsDataAsset.h"
7+ #include " Selection.h"
8+ #include " AssetRegistry/AssetRegistryModule.h"
9+ #include " Dialogs/DlgPickAssetPath.h"
210#include " Kismet2/CompilerResultsLog.h"
311#include " Materials/MaterialInstanceDynamic.h"
412
@@ -85,7 +93,7 @@ void UAnimGraphNode_KawaiiPhysics::Draw(FPrimitiveDrawInterface* PDI, USkeletalM
8593 for (const int32 ChildIndex : Bone.ChildIndexs )
8694 {
8795 DrawDashedLine (PDI , Bone.Location , ActiveNode->ModifyBones [ChildIndex].Location ,
88- FLinearColor::White, 1 , SDPG_Foreground);
96+ FLinearColor::White, 1 , SDPG_Foreground);
8997 }
9098 }
9199 }
@@ -104,7 +112,7 @@ void UAnimGraphNode_KawaiiPhysics::Draw(FPrimitiveDrawInterface* PDI, USkeletalM
104112 FTransform (FQuat::FindBetween (FVector::ForwardVector, Bone.PoseLocation - ParentBone.PoseLocation ), ParentBone.Location );
105113 TArray<FVector> Verts;
106114 DrawWireCone (PDI , Verts, ParentBoneTransform, (Bone.PoseLocation - ParentBone.PoseLocation ).Size (),
107- Bone.PhysicsSettings .LimitAngle , 16 , FColor::Green, SDPG_World);
115+ Bone.PhysicsSettings .LimitAngle , 16 , FColor::Green, SDPG_World);
108116 }
109117 }
110118}
@@ -179,6 +187,38 @@ void UAnimGraphNode_KawaiiPhysics::CopyNodeDataToPreviewNode(FAnimNode_Base* Ani
179187 KawaiiPhysics->ModifyBones .Empty ();
180188}
181189
190+ void UAnimGraphNode_KawaiiPhysics::CustomizeDetails (IDetailLayoutBuilder& DetailBuilder)
191+ {
192+ Super::CustomizeDetails (DetailBuilder);
193+
194+ Super::CustomizeDetails (DetailBuilder);
195+
196+ IDetailCategoryBuilder& ViewportCategory = DetailBuilder.EditCategory (TEXT (" Kawaii Physics Tools" ));
197+ FDetailWidgetRow& WidgetRow = ViewportCategory.AddCustomRow (LOCTEXT (" KawaiiPhysics" , " KawaiiPhysicsTools" ));
198+
199+ WidgetRow
200+ [
201+ SNew (SHorizontalBox)
202+ + SHorizontalBox::Slot ()
203+ .AutoWidth ()
204+ [
205+ SNew (SButton)
206+ .HAlign (HAlign_Center)
207+ .VAlign (VAlign_Center)
208+ .OnClicked_Lambda ([this ]()
209+ {
210+ this ->ExportLimitsDataAsset ();
211+ return FReply::Handled ();
212+ })
213+ .Content ()
214+ [
215+ SNew (STextBlock)
216+ .Text (FText::FromString (TEXT (" Export Limits Data Asset" )))
217+ ]
218+ ]
219+ ];
220+ }
221+
182222struct FKawaiiPhysicsVersion
183223{
184224 enum Type
@@ -216,8 +256,51 @@ void UAnimGraphNode_KawaiiPhysics::Serialize(FArchive& Ar)
216256 Node.RadiusCurveData .ExternalCurve = Node.RadiusCurve_DEPRECATED ;
217257 Node.LimitAngleCurveData .ExternalCurve = Node.LimitAngleCurve_DEPRECATED ;
218258 }
259+ }
260+
261+ void UAnimGraphNode_KawaiiPhysics::ExportLimitsDataAsset ()
262+ {
263+ const FString DefaultAsset = FPackageName::GetLongPackagePath (GetOutermost ()->GetName ()) + TEXT (" /" ) + GetName () + TEXT (" _Collision" );
264+
265+ const TSharedRef<SDlgPickAssetPath> NewAssetDlg =
266+ SNew (SDlgPickAssetPath)
267+ .Title (LOCTEXT (" NewDataAssetDialogTitle" , " Choose Location for Collision Data Asset" ))
268+ .DefaultAssetPath (FText::FromString (DefaultAsset));
269+
270+ if (NewAssetDlg->ShowModal () == EAppReturnType::Cancel)
271+ return ;
219272
273+ const FString Package (NewAssetDlg->GetFullAssetPath ().ToString ());
274+ const FString Name (NewAssetDlg->GetAssetName ().ToString ());
220275
276+ UPackage* Pkg = CreatePackage (*Package);
277+ UKawaiiPhysicsLimitsDataAsset* NewDataAsset = NewObject<UKawaiiPhysicsLimitsDataAsset>(Pkg, UKawaiiPhysicsLimitsDataAsset::StaticClass (), FName (Name),
278+ RF_Public | RF_Standalone);
279+ if (NewDataAsset)
280+ {
281+ // copy data
282+ NewDataAsset->SphericalLimitsData .SetNum (Node.SphericalLimits .Num ());
283+ for (int32 i=0 ; i<Node.SphericalLimits .Num (); i++)
284+ NewDataAsset->SphericalLimitsData [i].Update (&Node.SphericalLimits [i]);
285+
286+ NewDataAsset->CapsuleLimitsData .SetNum (Node.CapsuleLimits .Num ());
287+ for (int32 i=0 ; i<Node.CapsuleLimits .Num (); i++)
288+ NewDataAsset->CapsuleLimitsData [i].Update (&Node.CapsuleLimits [i]);
289+
290+ NewDataAsset->PlanarLimitsData .SetNum (Node.PlanarLimits .Num ());
291+ for (int32 i=0 ; i<Node.PlanarLimits .Num (); i++)
292+ NewDataAsset->PlanarLimitsData [i].Update (&Node.PlanarLimits [i]);
293+
294+ NewDataAsset->Sync ();
295+
296+ // select new asset
297+ USelection* SelectionSet = GEditor->GetSelectedObjects ();
298+ SelectionSet->DeselectAll ();
299+ SelectionSet->Select (NewDataAsset);
300+
301+ FAssetRegistryModule::AssetCreated (NewDataAsset);
302+ Pkg->MarkPackageDirty ();
303+ }
221304}
222305
223306#undef LOCTEXT_NAMESPACE
0 commit comments