Files
UnrealEngine/Engine/Plugins/Experimental/PhysicsControl/Source/PhysicsControlEditor/Private/PhysicsControlAssetInfoDetailsCustomization.cpp
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

132 lines
4.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "PhysicsControlAssetInfoDetailsCustomization.h"
#include "PhysicsControlAssetActions.h"
#include "PhysicsControlAssetEditor.h"
#include "PhysicsControlAsset.h"
#include "PhysicsControlAssetEditorData.h"
#include "PhysicsControlAssetEditorSkeletalMeshComponent.h"
#include "PhysicsControlOperatorNameGeneration.h"
#include "PhysicsControlNameRecords.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "Framework/Application/SlateApplication.h"
#include "IDetailPropertyRow.h"
#include "PropertyHandle.h"
#define LOCTEXT_NAMESPACE "PhysicsControlAssetInfoDetailsCustomization"
//======================================================================================================================
TSharedRef<IDetailCustomization> FPhysicsControlAssetInfoDetailsCustomization::MakeInstance(
TWeakPtr<FPhysicsControlAssetEditor> InPhysicsControlAssetEditor, EInfoType InfoType)
{
return MakeShared<FPhysicsControlAssetInfoDetailsCustomization>(InPhysicsControlAssetEditor, InfoType);
}
//======================================================================================================================
void FPhysicsControlAssetInfoDetailsCustomization::CustomizeDetails(
const TSharedPtr<IDetailLayoutBuilder>& InDetailBuilder)
{
DetailLayoutBuilderWeak = InDetailBuilder;
FPhysicsControlAssetInfoDetailsCustomization::CustomizeDetails(*InDetailBuilder);
if (TSharedPtr<FPhysicsControlAssetEditor> PCAE = PhysicsControlAssetEditor.Pin())
{
if (UPhysicsControlAsset* PhysicsControlAsset = PCAE->GetEditorData()->PhysicsControlAsset.Get())
{
PhysicsControlAsset->OnControlAssetCompiled().AddSP(
this, &FPhysicsControlAssetInfoDetailsCustomization::OnControlAssetCompiled);
}
}
}
//======================================================================================================================
void FPhysicsControlAssetInfoDetailsCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailLayoutBuilder)
{
TArray<FName> CategoryNames;
DetailLayoutBuilder.GetCategoryNames(CategoryNames);
for (FName Category : CategoryNames)
{
DetailLayoutBuilder.HideCategory(Category);
}
DetailLayoutBuilder.HideCategory(TEXT("Actions"));
TSharedPtr<const FPhysicsControlAssetEditor> PCAE = PhysicsControlAssetEditor.Pin();
TSharedPtr<const FPhysicsControlAssetEditorData> EditorData = PCAE->GetEditorData();
const UPhysicsControlAsset* PCA = EditorData->PhysicsControlAsset.Get();
if (!PCA)
{
return;
}
const UPhysicsAsset* PA = PCA->GetPhysicsAsset();
const USkeletalMeshComponent* SKMC = EditorData->EditorSkelComp.Get();
if (!PA || !SKMC)
{
return;
}
const USkeletalMesh* SKM = SKMC->GetSkeletalMeshAsset();
if (!SKM)
{
return;
}
const FReferenceSkeleton& RefSkeleton = SKM->GetRefSkeleton();
// Process the asset to get all the controls/body modifiers and sets
TMap<FName, FPhysicsControlLimbBones> LimbBones =
UE::PhysicsControl::GetLimbBones(PCA->CharacterSetupData.LimbSetupData,RefSkeleton, PA);
TSet<FName> BodyModifierNames;
TSet<FName> ControlNames;
FPhysicsControlNameRecords NameRecords;
UE::PhysicsControl::CollectOperatorNames(
PCA->CharacterSetupData, PCA->AdditionalControlsAndModifiers,
LimbBones, RefSkeleton, PA, BodyModifierNames, ControlNames, NameRecords);
UE::PhysicsControl::CreateAdditionalSets(
PCA->AdditionalSets, BodyModifierNames, ControlNames, NameRecords);
TMap<FName, TArray<FName>>& SetsToShow =
(InfoType == EInfoType::Controls) ? NameRecords.ControlSets : NameRecords.BodyModifierSets;
SetsToShow.KeySort([](FName A, FName B) { return A.ToString() < B.ToString(); });
for (const TPair<FName, TArray<FName>>& Set : SetsToShow)
{
const FName SetName = Set.Key;
const TArray<FName>& Names = Set.Value;
FText SectionName = FText::FromName(SetName);
IDetailCategoryBuilder& DetailCategoryBuilder =
DetailLayoutBuilder.EditCategory(SetName, FText::FromName(SetName));
DetailCategoryBuilder.InitiallyCollapsed(true);
for (FName Name : Names)
{
FDetailWidgetRow& Row = DetailCategoryBuilder.AddCustomRow(
FText::Format(LOCTEXT("NameRow", "Name_{0}"), FText::FromName(Name)));
Row.WholeRowContent()
[
SNew(STextBlock).Text(FText::FromName(Name))
];
}
}
}
//======================================================================================================================
void FPhysicsControlAssetInfoDetailsCustomization::OnControlAssetCompiled(bool bProfileListChanged)
{
if (DetailLayoutBuilderWeak.IsValid())
{
if (IDetailLayoutBuilder* DetailLayoutBuilder = DetailLayoutBuilderWeak.Pin().Get())
{
DetailLayoutBuilder->ForceRefreshDetails();
}
}
}
#undef LOCTEXT_NAMESPACE