// Copyright Epic Games, Inc. All Rights Reserved. #include "SkeletonTreePhysicsConstraintItem.h" #include "Styling/AppStyle.h" #include "PhysicsAssetRenderUtils.h" #include "PhysicsEngine/PhysicsConstraintTemplate.h" #define LOCTEXT_NAMESPACE "FSkeletonTreePhysicsConstraintItem" FSkeletonTreePhysicsConstraintItem::FSkeletonTreePhysicsConstraintItem(UPhysicsConstraintTemplate* const InConstraint, const int32 InConstraintIndex, const FName& InBoneName, const bool bInIsConstraintOnParentBody, const bool bInIsCrossConstraint, class UPhysicsAsset* const InPhysicsAsset, const TSharedRef& InSkeletonTree) : FSkeletonTreePhysicsItem(InPhysicsAsset, InSkeletonTree) , Constraint(InConstraint) , ConstraintIndex(InConstraintIndex) , bIsConstraintOnParentBody(bInIsConstraintOnParentBody) , bIsCrossConstraint(bInIsCrossConstraint) { const FConstraintInstance& ConstraintInstance = Constraint->DefaultInstance; FText Label = FText::Format(LOCTEXT("ConstraintNameFormat", "[ {0} -> {1} ] Constraint"), FText::FromName(ConstraintInstance.ConstraintBone2), FText::FromName(ConstraintInstance.ConstraintBone1)); DisplayName = *Label.ToString(); } FSkeletonTreePhysicsConstraintItem::FSkeletonTreePhysicsConstraintItem(UPhysicsConstraintTemplate* InConstraint, int32 InConstraintIndex, const FName& InBoneName, bool bInIsConstraintOnParentBody, class UPhysicsAsset* const InPhysicsAsset, const TSharedRef& InSkeletonTree) : FSkeletonTreePhysicsConstraintItem(InConstraint, InConstraintIndex, InBoneName, bInIsConstraintOnParentBody, false, InPhysicsAsset, InSkeletonTree) {} UObject* FSkeletonTreePhysicsConstraintItem::GetObject() const { return Constraint; } void FSkeletonTreePhysicsConstraintItem::OnToggleItemDisplayed(ECheckBoxState InCheckboxState) { if (FPhysicsAssetRenderSettings* RenderSettings = GetRenderSettings()) { RenderSettings->ToggleShowConstraint(ConstraintIndex); } } ECheckBoxState FSkeletonTreePhysicsConstraintItem::IsItemDisplayed() const { if (FPhysicsAssetRenderSettings* RenderSettings = GetRenderSettings()) { return RenderSettings->IsConstraintHidden(ConstraintIndex) ? ECheckBoxState::Unchecked : ECheckBoxState::Checked; } return ECheckBoxState::Undetermined; } const FSlateBrush* FSkeletonTreePhysicsConstraintItem::GetBrush() const { return (bIsCrossConstraint) ? FAppStyle::GetBrush("PhysicsAssetEditor.Tree.CrossConstraint") : FAppStyle::GetBrush("PhysicsAssetEditor.Tree.Constraint"); } FSlateColor FSkeletonTreePhysicsConstraintItem::GetTextColor() const { const FLinearColor Color(1.0f, 1.0f, 1.0f); const bool bInCurrentProfile = Constraint->GetCurrentConstraintProfileName() == NAME_None || Constraint->ContainsConstraintProfile(Constraint->GetCurrentConstraintProfileName()); if(bInCurrentProfile) { return FSlateColor(Color); } else { return FSlateColor(Color.Desaturate(0.5f)); } } FText FSkeletonTreePhysicsConstraintItem::GetNameColumnToolTip() const { if (Constraint) { const FConstraintInstance& ConstraintInstance = Constraint->DefaultInstance; return FText::Format(LOCTEXT("ConstraintTooltip", "Constraint linking child body [{0}] to parent body [{1}]"), FText::FromName(ConstraintInstance.ConstraintBone1), FText::FromName(ConstraintInstance.ConstraintBone2)); } return FText::GetEmpty(); } #undef LOCTEXT_NAMESPACE