Files
UnrealEngine/Engine/Source/Programs/HeadlessChaos/Private/GeometryCollection/GeometryCollectionTestProximity.cpp
2025-05-18 13:04:45 +08:00

963 lines
37 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "GeometryCollection/GeometryCollectionTestProximity.h"
#include "GeometryCollection/GeometryCollection.h"
#include "GeometryCollection/GeometryCollectionAlgo.h"
#include "GeometryCollection/GeometryCollectionUtility.h"
#include "GeometryCollection/TransformCollection.h"
#include "GeometryCollection/GeometryCollectionProximityUtility.h"
#include "UObject/Package.h"
#include "UObject/UObjectGlobals.h"
#include "../Resource/FracturedGeometry.h"
namespace GeometryCollectionTest
{
void BuildProximity()
{
TSharedPtr<FGeometryCollection> Collection = GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.f, 0.f, 0.f)), FVector(1.0));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.5f, 0.f, 1.f)),FVector(1.0)));
// 0
// ...1
// ......2
(Collection->Parent)[0] = -1;
(Collection->Children)[0].Add(1);
(Collection->Parent)[1] = 0;
(Collection->Children)[1].Add(2);
(Collection->Parent)[2] = 1;
// GeometryCollectionAlgo::ParentTransform(Collection, 0, 1);
FGeometryCollection* Coll = Collection.Get();
TArray<FTransform> GlobalTransform;
GeometryCollectionAlgo::GlobalMatrices(Collection->Transform, Collection->Parent, GlobalTransform);
FGeometryCollectionProximityUtility ProximityUtility(Coll);
ProximityUtility.UpdateProximity();
// Breaking Data
const TManagedArray<TSet<int32>>& Proximity = Collection->GetAttribute<TSet<int32>>("Proximity", FGeometryCollection::GeometryGroup);
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(0));
}
void GeometryDeleteFromStart()
{
TSharedPtr<FGeometryCollection> Collection = GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.f, 0.f, 0.f)), FVector(1.0));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(2.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(-0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.5f, 0.f, 1.f)),FVector(1.0)));
// 0
// ...1
// ......2
(Collection->Parent)[0] = -1;
(Collection->Children)[0].Add(1);
(Collection->Parent)[1] = 0;
(Collection->Children)[1].Add(2);
(Collection->Parent)[2] = 0;
(Collection->Children)[2].Add(3);
(Collection->Parent)[3] = 0;
(Collection->Children)[3].Add(4);
(Collection->Parent)[4] = 0;
(Collection->Children)[4].Add(5);
(Collection->Parent)[5] = 0;
// GeometryCollectionAlgo::ParentTransform(Collection, 0, 1);
FGeometryCollection* Coll = Collection.Get();
TArray<FTransform> GlobalTransform;
GeometryCollectionAlgo::GlobalMatrices(Collection->Transform, Collection->Parent, GlobalTransform);
FGeometryCollectionProximityUtility ProximityUtility(Coll);
ProximityUtility.UpdateProximity();
// Breaking Data
const TManagedArray<TSet<int32>>& Proximity = Collection->GetAttribute<TSet<int32>>("Proximity", FGeometryCollection::GeometryGroup);
// Proximity = [(3,4,1), (0,4,5,2), (1,5), (0,4), (0,1,3,5), (1,2,4)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_TRUE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_TRUE((Proximity)[4].Contains(5));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_TRUE((Proximity)[5].Contains(1));
EXPECT_TRUE((Proximity)[5].Contains(2));
EXPECT_TRUE((Proximity)[5].Contains(4));
EXPECT_FALSE((Proximity)[5].Contains(0));
EXPECT_FALSE((Proximity)[5].Contains(3));
EXPECT_FALSE((Proximity)[5].Contains(5));
TArray<int32> DelList = { 0 };
Coll->RemoveElements(FGeometryCollection::GeometryGroup, DelList);
// Proximity = [(3,4,1), (0,4), (3), (0,2,4), (0,1,3)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_FALSE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(1));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(2));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_FALSE((Proximity)[4].Contains(5));
EXPECT_EQ(Collection->NumElements(FGeometryCollection::GeometryGroup), 5);
}
void GeometryDeleteFromEnd()
{
TSharedPtr<FGeometryCollection> Collection = GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.f, 0.f, 0.f)), FVector(1.0));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(2.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(-0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.5f, 0.f, 1.f)),FVector(1.0)));
// 0
// ...1
// ......2
(Collection->Parent)[0] = -1;
(Collection->Children)[0].Add(1);
(Collection->Parent)[1] = 0;
(Collection->Children)[1].Add(2);
(Collection->Parent)[2] = 0;
(Collection->Children)[2].Add(3);
(Collection->Parent)[3] = 0;
(Collection->Children)[3].Add(4);
(Collection->Parent)[4] = 0;
(Collection->Children)[4].Add(5);
(Collection->Parent)[5] = 0;
// GeometryCollectionAlgo::ParentTransform(Collection, 0, 1);
FGeometryCollection* Coll = Collection.Get();
TArray<FTransform> GlobalTransform;
GeometryCollectionAlgo::GlobalMatrices(Collection->Transform, Collection->Parent, GlobalTransform);
FGeometryCollectionProximityUtility ProximityUtility(Coll);
ProximityUtility.UpdateProximity();
// Breaking Data
const TManagedArray<TSet<int32>>& Proximity = Collection->GetAttribute<TSet<int32>>("Proximity", FGeometryCollection::GeometryGroup);
// Proximity = [(3,4,1), (0,4,5,2), (1,5), (0,4), (0,1,3,5), (1,2,4)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_TRUE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_TRUE((Proximity)[4].Contains(5));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_TRUE((Proximity)[5].Contains(1));
EXPECT_TRUE((Proximity)[5].Contains(2));
EXPECT_TRUE((Proximity)[5].Contains(4));
EXPECT_FALSE((Proximity)[5].Contains(0));
EXPECT_FALSE((Proximity)[5].Contains(3));
EXPECT_FALSE((Proximity)[5].Contains(5));
TArray<int32> DelList = { 5 };
Coll->RemoveElements(FGeometryCollection::GeometryGroup, DelList);
// Proximity = [(3,4,1), (0,4,2), (1), (0,4), (0,1,3)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_FALSE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_FALSE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_FALSE((Proximity)[4].Contains(5));
EXPECT_EQ(Collection->NumElements(FGeometryCollection::GeometryGroup), 5);
}
void GeometryDeleteFromMiddle()
{
TSharedPtr<FGeometryCollection> Collection = GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.f, 0.f, 0.f)), FVector(1.0));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(2.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(-0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.5f, 0.f, 1.f)),FVector(1.0)));
// 0
// ...1
// ......2
(Collection->Parent)[0] = -1;
(Collection->Children)[0].Add(1);
(Collection->Parent)[1] = 0;
(Collection->Children)[1].Add(2);
(Collection->Parent)[2] = 0;
(Collection->Children)[2].Add(3);
(Collection->Parent)[3] = 0;
(Collection->Children)[3].Add(4);
(Collection->Parent)[4] = 0;
(Collection->Children)[4].Add(5);
(Collection->Parent)[5] = 0;
// GeometryCollectionAlgo::ParentTransform(Collection, 0, 1);
FGeometryCollection* Coll = Collection.Get();
TArray<FTransform> GlobalTransform;
GeometryCollectionAlgo::GlobalMatrices(Collection->Transform, Collection->Parent, GlobalTransform);
FGeometryCollectionProximityUtility ProximityUtility(Coll);
ProximityUtility.UpdateProximity();
// Breaking Data
const TManagedArray<TSet<int32>>& Proximity = Collection->GetAttribute<TSet<int32>>("Proximity", FGeometryCollection::GeometryGroup);
// Proximity = [(3,4,1), (0,4,5,2), (1,5), (0,4), (0,1,3,5), (1,2,4)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_TRUE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_TRUE((Proximity)[4].Contains(5));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_TRUE((Proximity)[5].Contains(1));
EXPECT_TRUE((Proximity)[5].Contains(2));
EXPECT_TRUE((Proximity)[5].Contains(4));
EXPECT_FALSE((Proximity)[5].Contains(0));
EXPECT_FALSE((Proximity)[5].Contains(3));
EXPECT_FALSE((Proximity)[5].Contains(5));
TArray<int32> DelList = { 3 };
Coll->RemoveElements(FGeometryCollection::GeometryGroup, DelList);
// Proximity = [(3,1), (0,3,4,2), (1,4), (0,1,4), (1,2,3)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(4));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(3));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_TRUE((Proximity)[2].Contains(4));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(5));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(1));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(2));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_FALSE((Proximity)[4].Contains(0));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_FALSE((Proximity)[4].Contains(5));
EXPECT_EQ(Collection->NumElements(FGeometryCollection::GeometryGroup), 5);
}
void GeometryDeleteMultipleFromMiddle()
{
TSharedPtr<FGeometryCollection> Collection = GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.f, 0.f, 0.f)), FVector(1.0));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(2.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(-0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.5f, 0.f, 1.f)),FVector(1.0)));
// 0
// ...1
// ......2
(Collection->Parent)[0] = -1;
(Collection->Children)[0].Add(1);
(Collection->Parent)[1] = 0;
(Collection->Children)[1].Add(2);
(Collection->Parent)[2] = 0;
(Collection->Children)[2].Add(3);
(Collection->Parent)[3] = 0;
(Collection->Children)[3].Add(4);
(Collection->Parent)[4] = 0;
(Collection->Children)[4].Add(5);
(Collection->Parent)[5] = 0;
// GeometryCollectionAlgo::ParentTransform(Collection, 0, 1);
FGeometryCollection* Coll = Collection.Get();
TArray<FTransform> GlobalTransform;
GeometryCollectionAlgo::GlobalMatrices(Collection->Transform, Collection->Parent, GlobalTransform);
FGeometryCollectionProximityUtility ProximityUtility(Coll);
ProximityUtility.UpdateProximity();
// Breaking Data
const TManagedArray<TSet<int32>>& Proximity = Collection->GetAttribute<TSet<int32>>("Proximity", FGeometryCollection::GeometryGroup);
// Proximity = [(3,4,1), (0,4,5,2), (1,5), (0,4), (0,1,3,5), (1,2,4)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_TRUE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_TRUE((Proximity)[4].Contains(5));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_TRUE((Proximity)[5].Contains(1));
EXPECT_TRUE((Proximity)[5].Contains(2));
EXPECT_TRUE((Proximity)[5].Contains(4));
EXPECT_FALSE((Proximity)[5].Contains(0));
EXPECT_FALSE((Proximity)[5].Contains(3));
EXPECT_FALSE((Proximity)[5].Contains(5));
TArray<int32> DelList = { 2,3,4 };
Coll->RemoveElements(FGeometryCollection::GeometryGroup, DelList);
// Proximity = [(1), (0,2), (1)]
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(3));
EXPECT_FALSE((Proximity)[0].Contains(4));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_FALSE((Proximity)[1].Contains(4));
EXPECT_FALSE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(5));
EXPECT_EQ(Collection->NumElements(FGeometryCollection::GeometryGroup), 3);
}
void GeometryDeleteRandom()
{
TSharedPtr<FGeometryCollection> Collection = GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.f, 0.f, 0.f)), FVector(1.0));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(2.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(-0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.5f, 0.f, 1.f)),FVector(1.0)));
// 0
// ...1
// ......2
(Collection->Parent)[0] = -1;
(Collection->Children)[0].Add(1);
(Collection->Parent)[1] = 0;
(Collection->Children)[1].Add(2);
(Collection->Parent)[2] = 0;
(Collection->Children)[2].Add(3);
(Collection->Parent)[3] = 0;
(Collection->Children)[3].Add(4);
(Collection->Parent)[4] = 0;
(Collection->Children)[4].Add(5);
(Collection->Parent)[5] = 0;
// GeometryCollectionAlgo::ParentTransform(Collection, 0, 1);
FGeometryCollection* Coll = Collection.Get();
TArray<FTransform> GlobalTransform;
GeometryCollectionAlgo::GlobalMatrices(Collection->Transform, Collection->Parent, GlobalTransform);
FGeometryCollectionProximityUtility ProximityUtility(Coll);
ProximityUtility.UpdateProximity();
// Breaking Data
const TManagedArray<TSet<int32>>& Proximity = Collection->GetAttribute<TSet<int32>>("Proximity", FGeometryCollection::GeometryGroup);
// Proximity = [(3,4,1), (0,4,5,2), (1,5), (0,4), (0,1,3,5), (1,2,4)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_TRUE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_TRUE((Proximity)[4].Contains(5));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_TRUE((Proximity)[5].Contains(1));
EXPECT_TRUE((Proximity)[5].Contains(2));
EXPECT_TRUE((Proximity)[5].Contains(4));
EXPECT_FALSE((Proximity)[5].Contains(0));
EXPECT_FALSE((Proximity)[5].Contains(3));
EXPECT_FALSE((Proximity)[5].Contains(5));
TArray<int32> DelList = { 1,3,5 };
Coll->RemoveElements(FGeometryCollection::GeometryGroup, DelList);
// Proximity = [(2), (), (0)]
EXPECT_TRUE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(3));
EXPECT_FALSE((Proximity)[0].Contains(4));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_FALSE((Proximity)[1].Contains(0));
EXPECT_FALSE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_FALSE((Proximity)[1].Contains(4));
EXPECT_FALSE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(1));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_FALSE((Proximity)[2].Contains(5));
EXPECT_EQ(Collection->NumElements(FGeometryCollection::GeometryGroup), 3);
}
void GeometryDeleteRandom2()
{
TSharedPtr<FGeometryCollection> Collection = GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.f, 0.f, 0.f)), FVector(1.0));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(2.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(-0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.5f, 0.f, 1.f)),FVector(1.0)));
// 0
// ...1
// ......2
(Collection->Parent)[0] = -1;
(Collection->Children)[0].Add(1);
(Collection->Parent)[1] = 0;
(Collection->Children)[1].Add(2);
(Collection->Parent)[2] = 0;
(Collection->Children)[2].Add(3);
(Collection->Parent)[3] = 0;
(Collection->Children)[3].Add(4);
(Collection->Parent)[4] = 0;
(Collection->Children)[4].Add(5);
(Collection->Parent)[5] = 0;
// GeometryCollectionAlgo::ParentTransform(Collection, 0, 1);
FGeometryCollection* Coll = Collection.Get();
TArray<FTransform> GlobalTransform;
GeometryCollectionAlgo::GlobalMatrices(Collection->Transform, Collection->Parent, GlobalTransform);
FGeometryCollectionProximityUtility ProximityUtility(Coll);
ProximityUtility.UpdateProximity();
// Breaking Data
const TManagedArray<TSet<int32>>& Proximity = Collection->GetAttribute<TSet<int32>>("Proximity", FGeometryCollection::GeometryGroup);
// Proximity = [(3,4,1), (0,4,5,2), (1,5), (0,4), (0,1,3,5), (1,2,4)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_TRUE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_TRUE((Proximity)[4].Contains(5));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_TRUE((Proximity)[5].Contains(1));
EXPECT_TRUE((Proximity)[5].Contains(2));
EXPECT_TRUE((Proximity)[5].Contains(4));
EXPECT_FALSE((Proximity)[5].Contains(0));
EXPECT_FALSE((Proximity)[5].Contains(3));
EXPECT_FALSE((Proximity)[5].Contains(5));
TArray<int32> DelList = { 0,1,4,5 };
Coll->RemoveElements(FGeometryCollection::GeometryGroup, DelList);
// Proximity = [(), ()]
EXPECT_FALSE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(3));
EXPECT_FALSE((Proximity)[0].Contains(4));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_FALSE((Proximity)[1].Contains(0));
EXPECT_FALSE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_FALSE((Proximity)[1].Contains(4));
EXPECT_FALSE((Proximity)[1].Contains(5));
EXPECT_EQ(Collection->NumElements(FGeometryCollection::GeometryGroup), 2);
}
void GeometryDeleteAll()
{
TSharedPtr<FGeometryCollection> Collection = GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.f, 0.f, 0.f)), FVector(1.0));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(2.f, 0.f, 0.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(-0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(0.5f, 0.f, 1.f)),FVector(1.0)));
Collection->AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FQuat::MakeFromEuler(FVector(0.f, 0.f, 0.f)), FVector(1.5f, 0.f, 1.f)),FVector(1.0)));
// 0
// ...1
// ......2
(Collection->Parent)[0] = -1;
(Collection->Children)[0].Add(1);
(Collection->Parent)[1] = 0;
(Collection->Children)[1].Add(2);
(Collection->Parent)[2] = 0;
(Collection->Children)[2].Add(3);
(Collection->Parent)[3] = 0;
(Collection->Children)[3].Add(4);
(Collection->Parent)[4] = 0;
(Collection->Children)[4].Add(5);
(Collection->Parent)[5] = 0;
// GeometryCollectionAlgo::ParentTransform(Collection, 0, 1);
FGeometryCollection* Coll = Collection.Get();
TArray<FTransform> GlobalTransform;
GeometryCollectionAlgo::GlobalMatrices(Collection->Transform, Collection->Parent, GlobalTransform);
FGeometryCollectionProximityUtility ProximityUtility(Coll);
ProximityUtility.UpdateProximity();
// Breaking Data
const TManagedArray<TSet<int32>>& Proximity = Collection->GetAttribute<TSet<int32>>("Proximity", FGeometryCollection::GeometryGroup);
// Proximity = [(3,4,1), (0,4,5,2), (1,5), (0,4), (0,1,3,5), (1,2,4)]
EXPECT_TRUE((Proximity)[0].Contains(3));
EXPECT_TRUE((Proximity)[0].Contains(4));
EXPECT_TRUE((Proximity)[0].Contains(1));
EXPECT_FALSE((Proximity)[0].Contains(0));
EXPECT_FALSE((Proximity)[0].Contains(2));
EXPECT_FALSE((Proximity)[0].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(0));
EXPECT_TRUE((Proximity)[1].Contains(4));
EXPECT_TRUE((Proximity)[1].Contains(5));
EXPECT_TRUE((Proximity)[1].Contains(2));
EXPECT_FALSE((Proximity)[1].Contains(1));
EXPECT_FALSE((Proximity)[1].Contains(3));
EXPECT_TRUE((Proximity)[2].Contains(1));
EXPECT_TRUE((Proximity)[2].Contains(5));
EXPECT_FALSE((Proximity)[2].Contains(0));
EXPECT_FALSE((Proximity)[2].Contains(2));
EXPECT_FALSE((Proximity)[2].Contains(3));
EXPECT_FALSE((Proximity)[2].Contains(4));
EXPECT_TRUE((Proximity)[3].Contains(0));
EXPECT_TRUE((Proximity)[3].Contains(4));
EXPECT_FALSE((Proximity)[3].Contains(1));
EXPECT_FALSE((Proximity)[3].Contains(2));
EXPECT_FALSE((Proximity)[3].Contains(3));
EXPECT_FALSE((Proximity)[3].Contains(5));
EXPECT_TRUE((Proximity)[4].Contains(0));
EXPECT_TRUE((Proximity)[4].Contains(1));
EXPECT_TRUE((Proximity)[4].Contains(3));
EXPECT_TRUE((Proximity)[4].Contains(5));
EXPECT_FALSE((Proximity)[4].Contains(2));
EXPECT_FALSE((Proximity)[4].Contains(4));
EXPECT_TRUE((Proximity)[5].Contains(1));
EXPECT_TRUE((Proximity)[5].Contains(2));
EXPECT_TRUE((Proximity)[5].Contains(4));
EXPECT_FALSE((Proximity)[5].Contains(0));
EXPECT_FALSE((Proximity)[5].Contains(3));
EXPECT_FALSE((Proximity)[5].Contains(5));
TArray<int32> DelList = { 0,1,2,3,4,5 };
Coll->RemoveElements(FGeometryCollection::GeometryGroup, DelList);
// Proximity = []
EXPECT_EQ(Collection->NumElements(FGeometryCollection::GeometryGroup), 0);
}
void GeometrySwapFlat()
{
FGeometryCollection Coll;
Coll.AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FVector(0,0,0))));
Coll.AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FVector(1,0,0))));
Coll.AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FVector(2,0,0))));
Coll.AppendGeometry(*GeometryCollection::MakeCubeElement(FTransform(FVector(3,0,0))));
//verts are ordered with geometry
for (int box = 0; box < 4; ++box)
{
for (int i = 0; i < 8; ++i)
{
EXPECT_EQ(Coll.BoneMap[i + box * 8], box);
}
}
// Bottom: Y = -1
int32 ExpectedIndices[] = {
5,1,0,
0,4,5,
2,3,7,
7,6,2,
3,2,0,
0,1,3,
4,6,7,
7,5,4,
0,2,6,
6,4,0,
7,3,1,
1,5,7 };
//faces are ordered with geometry and point to the right vertices
for (int box = 0; box < 4; ++box)
{
for (int i = 0; i < 12; ++i)
{
for (int idx = 0; idx < 3; ++idx)
{
EXPECT_EQ(Coll.Indices[i + box * 12][idx], (ExpectedIndices[i * 3 + idx] + box * 8));
}
}
}
TArray<int32> NewOrder = { 0,3,2,1 };
Coll.ReorderElements(FGeometryCollection::TransformGroup, NewOrder);
//transforms change
EXPECT_EQ(Coll.Transform[0].GetLocation().X, 0.f);
EXPECT_EQ(Coll.Transform[1].GetLocation().X, 3.f);
EXPECT_EQ(Coll.Transform[2].GetLocation().X, 2.f);
EXPECT_EQ(Coll.Transform[3].GetLocation().X, 1.f);
//groups swap to be contiguous with transform array
EXPECT_EQ(Coll.TransformIndex[0], 0);
EXPECT_EQ(Coll.TransformIndex[1], 1);
EXPECT_EQ(Coll.TransformIndex[2], 2);
EXPECT_EQ(Coll.TransformIndex[3], 3);
//verts are still contiguous
for (int box = 0; box < 4; ++box)
{
for (int i = 0; i < 8; ++i)
{
EXPECT_EQ(Coll.BoneMap[i + box * 8], box);
}
}
//faces are reordered with geometry and point to the right vertices
for (int box = 0; box < 4; ++box)
{
for (int i = 0; i < 12; ++i)
{
for (int idx = 0; idx < 3; ++idx)
{
//expect verts to reorder with faces so there's no indirection needed. The whole point is that we are contiguous
EXPECT_EQ(Coll.Indices[i + box * 12][idx], (ExpectedIndices[i * 3 + idx] + box * 8));
}
}
}
}
void TestFracturedGeometry()
{
FGeometryCollection* TestCollection = FGeometryCollection::NewGeometryCollection(FracturedGeometry::RawVertexArray,
FracturedGeometry::RawIndicesArray,
FracturedGeometry::RawBoneMapArray,
FracturedGeometry::RawTransformArray,
FracturedGeometry::RawLevelArray,
FracturedGeometry::RawParentArray,
FracturedGeometry::RawChildrenArray,
FracturedGeometry::RawSimulationTypeArray,
FracturedGeometry::RawStatusFlagsArray);
EXPECT_EQ(TestCollection->NumElements(FGeometryCollection::GeometryGroup), 11);
}
}