Skip to content

Commit 5e31480

Browse files
authored
Merge pull request #115 from neil3d/master
Add a button for exporting node limits data to a Data Asset.
2 parents b26c16f + 06a62cd commit 5e31480

4 files changed

Lines changed: 90 additions & 4 deletions

File tree

Plugins/KawaiiPhysics/Source/KawaiiPhysics/Private/KawaiiPhysicsLimitsDataAsset.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void UKawaiiPhysicsLimitsDataAsset::UpdateLimit(FCollisionLimitBase* Limit)
4444
}
4545

4646
template <typename CollisionLimitDataType, typename CollisionLimitType>
47-
void SyncCollisionLimits(TArray<CollisionLimitDataType>& CollisionLimitData, TArray<CollisionLimitType>& CollisionLimits)
47+
void SyncCollisionLimits(const TArray<CollisionLimitDataType>& CollisionLimitData, TArray<CollisionLimitType>& CollisionLimits)
4848
{
4949
CollisionLimits.Empty();
5050
for (const auto& Data : CollisionLimitData)

Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/KawaiiPhysicsEd.Build.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public KawaiiPhysicsEd(ReadOnlyTargetRules Target) : base(Target)
99
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
1010

1111
PrivateDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "KawaiiPhysics" });
12-
PrivateDependencyModuleNames.AddRange(new string[] { "AnimGraph", "BlueprintGraph", "Persona", "UnrealEd", "AnimGraphRuntime", "SlateCore"});
12+
PrivateDependencyModuleNames.AddRange(new string[] { "AnimGraph", "BlueprintGraph", "Persona", "UnrealEd", "AnimGraphRuntime", "Slate", "SlateCore"});
1313

1414
BuildVersion Version;
1515
if (BuildVersion.TryRead(BuildVersion.GetDefaultFileName(), out Version))

Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/Private/AnimGraphNode_KawaiiPhysics.cpp

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
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+
182222
struct 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

Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/Public/AnimGraphNode_KawaiiPhysics.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class UAnimGraphNode_KawaiiPhysics : public UAnimGraphNode_SkeletalControlBase
4444
virtual FEditorModeID GetEditorMode() const override;
4545
virtual void ValidateAnimNodePostCompile(FCompilerResultsLog& MessageLog, UAnimBlueprintGeneratedClass* CompiledClass, int32 CompiledNodeIndex) override;
4646
virtual void CopyNodeDataToPreviewNode(FAnimNode_Base* AnimNode) override;
47+
virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;
4748
// End of UAnimGraphNode_Base interface
4849

4950
//virtual FText GetControllerDescription() const override;
@@ -59,4 +60,6 @@ class UAnimGraphNode_KawaiiPhysics : public UAnimGraphNode_SkeletalControlBase
5960
private:
6061
/** Constructing FText strings can be costly, so we cache the node's title */
6162
FNodeTitleTextTable CachedNodeTitles;
63+
64+
void ExportLimitsDataAsset();
6265
};

0 commit comments

Comments
 (0)