// Copyright Epic Games, Inc. All Rights Reserved. #include "GeometryCollection/GeometryCollectionConvexPropertiesInterface.h" #include "GeometryCollection/GeometryCollection.h" const FName FGeometryCollectionConvexPropertiesInterface::ConvexPropertiesGroup = "ConvexProperties"; const FName FGeometryCollectionConvexPropertiesInterface::ConvexIndexAttribute = "TransformGroupIndex"; const FName FGeometryCollectionConvexPropertiesInterface::ConvexEnable = "Enable"; const FName FGeometryCollectionConvexPropertiesInterface::ConvexFractionRemoveAttribute = "FractionRemove"; const FName FGeometryCollectionConvexPropertiesInterface::ConvexSimplificationThresholdAttribute = "SimplificationThreshold"; const FName FGeometryCollectionConvexPropertiesInterface::ConvexCanExceedFractionAttribute = "CanExceedFraction"; const FName FGeometryCollectionConvexPropertiesInterface::ConvexRemoveOverlapsMethodAttribute = "RemoveOverlapsMethod"; const FName FGeometryCollectionConvexPropertiesInterface::ConvexRemoveOverlapsShrinkAttribute = "RemoveOverlapsShrinkPercent"; FGeometryCollectionConvexPropertiesInterface::FGeometryCollectionConvexPropertiesInterface(FManagedArrayCollection* InGeometryCollection) : FManagedArrayInterface(InGeometryCollection) {} void FGeometryCollectionConvexPropertiesInterface::InitializeInterface() { if (!ManagedCollection->HasGroup(ConvexPropertiesGroup)) { ManagedCollection->AddGroup(ConvexPropertiesGroup); } if (!ManagedCollection->HasAttribute(ConvexIndexAttribute, ConvexPropertiesGroup)) { FManagedArrayCollection::FConstructionParameters AttributeDependency(FTransformCollection::TransformGroup); ManagedCollection->AddAttribute(ConvexIndexAttribute, ConvexPropertiesGroup, AttributeDependency); } if (!ManagedCollection->HasAttribute(ConvexEnable, ConvexPropertiesGroup)) { ManagedCollection->AddAttribute(ConvexEnable, ConvexPropertiesGroup); } if (!ManagedCollection->HasAttribute(ConvexFractionRemoveAttribute, ConvexPropertiesGroup)) { ManagedCollection->AddAttribute(ConvexFractionRemoveAttribute, ConvexPropertiesGroup); } if (!ManagedCollection->HasAttribute(ConvexSimplificationThresholdAttribute, ConvexPropertiesGroup)) { ManagedCollection->AddAttribute(ConvexSimplificationThresholdAttribute, ConvexPropertiesGroup); } if (!ManagedCollection->HasAttribute(ConvexCanExceedFractionAttribute, ConvexPropertiesGroup)) { ManagedCollection->AddAttribute(ConvexCanExceedFractionAttribute, ConvexPropertiesGroup); } if (!ManagedCollection->HasAttribute(ConvexRemoveOverlapsMethodAttribute, ConvexPropertiesGroup)) { ManagedCollection->AddAttribute(ConvexRemoveOverlapsMethodAttribute, ConvexPropertiesGroup); } if (!ManagedCollection->HasAttribute(ConvexRemoveOverlapsShrinkAttribute, ConvexPropertiesGroup)) { ManagedCollection->AddAttribute(ConvexRemoveOverlapsShrinkAttribute, ConvexPropertiesGroup); } SetDefaultProperty(); } void FGeometryCollectionConvexPropertiesInterface::SetDefaultProperty() { FConvexCreationProperties DefaultProperty; TManagedArray& Index = ManagedCollection->ModifyAttribute(ConvexIndexAttribute, ConvexPropertiesGroup); if (Index.Num() == 0 || !Index.Contains(INDEX_NONE)) { int32 DefaultAttributeIndex = ManagedCollection->AddElements(1, ConvexPropertiesGroup); Index[DefaultAttributeIndex] = INDEX_NONE; SetConvexProperties(DefaultProperty); } } FGeometryCollectionConvexPropertiesInterface::FConvexCreationProperties FGeometryCollectionConvexPropertiesInterface::GetDefaultProperty() const { FConvexCreationProperties DefaultProperty; const TManagedArray& Index = ManagedCollection->GetAttribute(ConvexIndexAttribute, ConvexPropertiesGroup); if (Index.Contains(INDEX_NONE)) { const TManagedArray& Enable = ManagedCollection->GetAttribute(ConvexEnable, ConvexPropertiesGroup); const TManagedArray& FractionRemove = ManagedCollection->GetAttribute(ConvexFractionRemoveAttribute, ConvexPropertiesGroup); const TManagedArray& SimplificationThreshold = ManagedCollection->GetAttribute(ConvexSimplificationThresholdAttribute, ConvexPropertiesGroup); const TManagedArray& CanExceedFraction = ManagedCollection->GetAttribute(ConvexCanExceedFractionAttribute, ConvexPropertiesGroup); const TManagedArray& RemoveOverlaps = ManagedCollection->GetAttribute(ConvexRemoveOverlapsMethodAttribute, ConvexPropertiesGroup); const TManagedArray& RemoveOverlapsShrinkPercent = ManagedCollection->GetAttribute(ConvexRemoveOverlapsShrinkAttribute, ConvexPropertiesGroup); int32 DefaultIndex = Index.Find(INDEX_NONE); if (0 <= DefaultIndex && DefaultIndex < Index.Num()) { DefaultProperty.Enable = Enable[DefaultIndex]; DefaultProperty.FractionRemove = FractionRemove[DefaultIndex]; DefaultProperty.SimplificationThreshold = SimplificationThreshold[DefaultIndex]; DefaultProperty.CanExceedFraction = CanExceedFraction[DefaultIndex]; DefaultProperty.RemoveOverlaps = (EConvexOverlapRemoval)RemoveOverlaps[DefaultIndex]; DefaultProperty.OverlapRemovalShrinkPercent = RemoveOverlapsShrinkPercent[DefaultIndex]; } } return DefaultProperty; } void FGeometryCollectionConvexPropertiesInterface::CleanInterfaceForCook() { RemoveInterfaceAttributes(); } void FGeometryCollectionConvexPropertiesInterface::RemoveInterfaceAttributes() { ManagedCollection->RemoveGroup(ConvexPropertiesGroup); } FGeometryCollectionConvexPropertiesInterface::FConvexCreationProperties FGeometryCollectionConvexPropertiesInterface::GetConvexProperties(int TransformGroupIndex) const { FConvexCreationProperties ConvexProperty = GetDefaultProperty(); const TManagedArray& Index = ManagedCollection->GetAttribute(ConvexIndexAttribute, ConvexPropertiesGroup); int32 PropIndex = Index.Find(TransformGroupIndex); if (0 <= PropIndex && PropIndex < Index.Num()) { const TManagedArray& Enable = ManagedCollection->GetAttribute(ConvexEnable, ConvexPropertiesGroup); const TManagedArray& FractionRemove = ManagedCollection->GetAttribute(ConvexFractionRemoveAttribute, ConvexPropertiesGroup); const TManagedArray& SimplificationThreshold = ManagedCollection->GetAttribute(ConvexSimplificationThresholdAttribute, ConvexPropertiesGroup); const TManagedArray& CanExceedFraction = ManagedCollection->GetAttribute(ConvexCanExceedFractionAttribute, ConvexPropertiesGroup); const TManagedArray& RemoveOverlaps = ManagedCollection->GetAttribute(ConvexRemoveOverlapsMethodAttribute, ConvexPropertiesGroup); const TManagedArray& RemoveOverlapsShrinkPercent = ManagedCollection->GetAttribute(ConvexRemoveOverlapsShrinkAttribute, ConvexPropertiesGroup); ConvexProperty.Enable = Enable[PropIndex]; ConvexProperty.FractionRemove = FractionRemove[PropIndex]; ConvexProperty.SimplificationThreshold = SimplificationThreshold[PropIndex]; ConvexProperty.CanExceedFraction = CanExceedFraction[PropIndex]; ConvexProperty.RemoveOverlaps = (EConvexOverlapRemoval)RemoveOverlaps[PropIndex]; ConvexProperty.OverlapRemovalShrinkPercent = RemoveOverlapsShrinkPercent[PropIndex]; } return ConvexProperty; } void FGeometryCollectionConvexPropertiesInterface::SetConvexProperties(const FConvexCreationProperties& InConvexAttributes, int TransformGroupIndex) { FConvexCreationProperties Property; TManagedArray& Index = ManagedCollection->ModifyAttribute(ConvexIndexAttribute, ConvexPropertiesGroup); TManagedArray& Enable = ManagedCollection->ModifyAttribute(ConvexEnable, ConvexPropertiesGroup); TManagedArray& FractionRemove = ManagedCollection->ModifyAttribute(ConvexFractionRemoveAttribute, ConvexPropertiesGroup); TManagedArray& SimplificationThreshold = ManagedCollection->ModifyAttribute(ConvexSimplificationThresholdAttribute, ConvexPropertiesGroup); TManagedArray& CanExceedFraction = ManagedCollection->ModifyAttribute(ConvexCanExceedFractionAttribute, ConvexPropertiesGroup); TManagedArray& RemoveOverlaps = ManagedCollection->ModifyAttribute(ConvexRemoveOverlapsMethodAttribute, ConvexPropertiesGroup); TManagedArray& RemoveOverlapsShrinkPercent = ManagedCollection->ModifyAttribute(ConvexRemoveOverlapsShrinkAttribute, ConvexPropertiesGroup); int32 AttributeIndex = INDEX_NONE; if (!Index.Contains(TransformGroupIndex)) { AttributeIndex = ManagedCollection->AddElements(1, ConvexPropertiesGroup); } else { AttributeIndex = Index.Find(TransformGroupIndex); } if (0 <= AttributeIndex && AttributeIndex < Index.Num()) { Index[AttributeIndex] = TransformGroupIndex; Enable[AttributeIndex] = InConvexAttributes.Enable; FractionRemove[AttributeIndex] = InConvexAttributes.FractionRemove; SimplificationThreshold[AttributeIndex] = InConvexAttributes.SimplificationThreshold; CanExceedFraction[AttributeIndex] = InConvexAttributes.CanExceedFraction; RemoveOverlaps[AttributeIndex] = (int32)InConvexAttributes.RemoveOverlaps; RemoveOverlapsShrinkPercent[AttributeIndex] = InConvexAttributes.OverlapRemovalShrinkPercent; } }