Files
UnrealEngineUWP/Engine/Plugins/Runtime/SmartObjects/Source/SmartObjectsModule/Private/SmartObjectDefinition.cpp
yoan stamant 56a9c7cfe2 [SmartObject] replaced slot direction vector by rotation for easier authoring
Moved bounds computation from the component to the SmartObject definition
#rb trivial
#preflight 61d88fa24c252480ca3a0927

#ROBOMERGE-AUTHOR: yoan.stamant
#ROBOMERGE-SOURCE: CL 18549211 in //UE5/Release-5.0/... via CL 18549240
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v899-18417669)

[CL 18549270 by yoan stamant in ue5-release-engine-test branch]
2022-01-07 14:28:06 -05:00

118 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SmartObjectDefinition.h"
#include "SmartObjectTypes.h"
namespace UE::SmartObject
{
const FVector DefaultSlotSize(40, 40, 90);
}
bool USmartObjectDefinition::Validate() const
{
bValid = false;
if (Slots.Num() == 0)
{
UE_LOG(LogSmartObject, Error, TEXT("Need to provide at least one slot definition"));
return false;
}
// Detect null entries in default definitions
int32 NullEntryIndex;
if (DefaultBehaviorDefinitions.Find(nullptr, NullEntryIndex))
{
UE_LOG(LogSmartObject, Error, TEXT("Null entry found at index %d in default behavior definition list"), NullEntryIndex);
return false;
}
// Detect null entries in slot definitions
for (int i = 0; i < Slots.Num(); ++i)
{
const FSmartObjectSlot& Slot = Slots[i];
if (Slot.BehaviorDefinitions.Find(nullptr, NullEntryIndex))
{
UE_LOG(LogSmartObject, Error, TEXT("Null definition entry found at index %d in behavior list of slot %d"), i, NullEntryIndex);
return false;
}
}
// Detect missing definitions in slots if no default one are provided
if (DefaultBehaviorDefinitions.Num() == 0)
{
for (int i = 0; i < Slots.Num(); ++i)
{
const FSmartObjectSlot& Slot = Slots[i];
if (Slot.BehaviorDefinitions.Num() == 0)
{
UE_LOG(LogSmartObject, Error, TEXT("Slot at index %d needs to provide a behavior definition since there is no default one in the SmartObject definition"), i);
return false;
}
}
}
bValid = true;
return true;
}
const USmartObjectBehaviorDefinition* USmartObjectDefinition::GetBehaviorDefinition(const FSmartObjectSlotIndex& SlotIndex,
const TSubclassOf<USmartObjectBehaviorDefinition>& DefinitionClass) const
{
const USmartObjectBehaviorDefinition* Definition = nullptr;
if (Slots.IsValidIndex(SlotIndex))
{
Definition = GetBehaviorDefinitionByType(Slots[SlotIndex].BehaviorDefinitions, DefinitionClass);
}
if (Definition == nullptr)
{
Definition = GetBehaviorDefinitionByType(DefaultBehaviorDefinitions, DefinitionClass);
}
return Definition;
}
FBox USmartObjectDefinition::GetBounds() const
{
FBox BoundingBox(ForceInitToZero);
for (const FSmartObjectSlot& Slot : GetSlots())
{
BoundingBox += Slot.Offset + UE::SmartObject::DefaultSlotSize;
BoundingBox += Slot.Offset - UE::SmartObject::DefaultSlotSize;
}
return BoundingBox;
}
TOptional<FTransform> USmartObjectDefinition::GetSlotTransform(const FTransform& OwnerTransform, const FSmartObjectSlotIndex SlotIndex) const
{
TOptional<FTransform> Transform;
if (ensureMsgf(Slots.IsValidIndex(SlotIndex), TEXT("Requesting slot transform for an out of range index: %s"), *SlotIndex.Describe()))
{
const FSmartObjectSlot& Slot = Slots[SlotIndex];
Transform = FTransform(Slot.Rotation, Slot.Offset) * OwnerTransform;
}
return Transform;
}
const USmartObjectBehaviorDefinition* USmartObjectDefinition::GetBehaviorDefinitionByType(const TArray<USmartObjectBehaviorDefinition*>& BehaviorDefinitions,
const TSubclassOf<USmartObjectBehaviorDefinition>& DefinitionClass)
{
USmartObjectBehaviorDefinition* const* BehaviorDefinition = BehaviorDefinitions.FindByPredicate([&DefinitionClass](USmartObjectBehaviorDefinition* SlotBehaviorDefinition)
{
return SlotBehaviorDefinition != nullptr && SlotBehaviorDefinition->GetClass()->IsChildOf(*DefinitionClass);
});
return BehaviorDefinition != nullptr ? *BehaviorDefinition : nullptr;
}
FString USmartObjectDefinition::Describe() const
{
return FString::Printf(TEXT("NumSlots=%d NumDefs=%d HasUserFilter=%s HasObjectFilter=%s"),
Slots.Num(),
DefaultBehaviorDefinitions.Num(),
*LexToString(!UserTagFilter.IsEmpty()),
*LexToString(!ObjectTagFilter.IsEmpty()));
}