Files
UnrealEngine/Engine/Source/Runtime/Experimental/Chaos/Public/GeometryCollection/GeometryCollectionCollisionStructureManager.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

151 lines
4.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GeometryCollection/GeometryCollection.h"
#include "GeometryCollection/GeometryCollectionSimulationCoreTypes.h"
#include "GeometryCollection/GeometryCollectionSimulationTypes.h"
#include "UObject/ObjectMacros.h"
namespace Chaos { class FErrorReporter; }
namespace Chaos
{
class FTriangleMesh;
class FLevelSet;
template <typename T, int d>
class TParticles;
using FParticles = TParticles<FReal, 3>;
}
class FCollisionStructureManager
{
public:
CHAOS_API FCollisionStructureManager();
virtual ~FCollisionStructureManager() {}
typedef TArray<Chaos::FVec3> FPoints;
typedef Chaos::FBVHParticles FSimplicial;
typedef Chaos::FImplicitObject FImplicit;
/**
* Culls particles inside \p Implicit, and coincident particles (defined by
* being within 1/20'th of the size of the domain from one another), truncates
* at \p CollisionParticlesMaxInput, and returns a bounding volume hierarchy
* of the remainder.
*/
static CHAOS_API FSimplicial* NewSimplicial(
const Chaos::FParticles& Vertices,
const Chaos::FTriangleMesh& TriMesh,
const Chaos::FImplicitObject* Implicit,
const int32 CollisionParticlesMaxInput);
/**
* Culls particles by importance (See \c FTriangleMesh::GetVertexImportanceOrdering()),
* and returns a bounding volume hierarchy of the remainder.
*/
static CHAOS_API FSimplicial* NewSimplicial(
const Chaos::FParticles& AllParticles,
const TManagedArray<int32>& BoneMap,
const ECollisionTypeEnum CollisionType,
Chaos::FTriangleMesh& TriMesh,
const float CollisionParticlesFraction);
/**
* Calls \c SetDoCollide(false) and \c SetConvex(false) on \p Implicit if
* \p CollisionType is \c ECollisionTypeEnum::Chaos_Surface_Volumetric.
*/
static CHAOS_API void UpdateImplicitFlags(
FImplicit* Implicit,
const ECollisionTypeEnum CollisionType);
/**
* Build a box, sphere, or level set based on \p ImplicitType.
*
* \p ErrorReporter - level set only
* \p MeshParticles - level set only
* \p TriMesh - level set only
* \p CollisionBounds - box and level set
* \p Radius - sphere only
* \p MinRes - level set only
* \p MaxRes - level set only
* \p CollisionObjectReduction - shrink percentage; value of 10 reduces by
* 10%, 0 does nothing, 100 shrinks to zero.
* \p CollisionType - param forwarded to \c UpdateImplictFlags().
* \p ImplicitType - type of implicit shape to build.
*/
static CHAOS_API Chaos::FImplicitObjectRef NewImplicit(
Chaos::FErrorReporter ErrorReporter,
const Chaos::FParticles& MeshParticles,
const Chaos::FTriangleMesh& TriMesh,
const FBox& CollisionBounds,
const Chaos::FReal Radius,
const int32 MinRes,
const int32 MaxRes,
const float CollisionObjectReduction,
const ECollisionTypeEnum CollisionType,
const EImplicitTypeEnum ImplicitType);
static CHAOS_API Chaos::FImplicitObjectRef NewImplicitBox(
const FBox& CollisionBounds,
const float CollisionObjectReduction,
const ECollisionTypeEnum CollisionType);
static CHAOS_API Chaos::FImplicitObjectRef NewImplicitSphere(
const Chaos::FReal Radius,
const float CollisionObjectReduction,
const ECollisionTypeEnum CollisionType);
static CHAOS_API Chaos::FImplicitObjectRef NewImplicitCapsule(
const Chaos::FReal Radius,
const Chaos::FReal Length,
const float CollisionObjectReduction,
const ECollisionTypeEnum CollisionType);
static CHAOS_API Chaos::FImplicitObjectRef NewImplicitCapsule(
const FBox& CollisionBounds,
const float CollisionObjectReduction,
const ECollisionTypeEnum CollisionType);
static CHAOS_API Chaos::FImplicitObjectRef NewImplicitConvex(
const TArray<int32>& ConvexIndices,
const TManagedArray<Chaos::FConvexPtr>* ConvexGeometry,
const ECollisionTypeEnum CollisionType,
const FTransform& MassTransform,
const Chaos::FReal CollisionMarginFraction,
const float CollisionObjectReduction);
static CHAOS_API Chaos::FImplicitObjectRef NewImplicitLevelset(
Chaos::FErrorReporter ErrorReporter,
const Chaos::FParticles& MeshParticles,
const Chaos::FTriangleMesh& TriMesh,
const FBox& CollisionBounds,
const int32 MinRes,
const int32 MaxRes,
const float CollisionObjectReduction,
const ECollisionTypeEnum CollisionType);
static CHAOS_API Chaos::FLevelSetRef NewLevelset(
Chaos::FErrorReporter ErrorReporter,
const Chaos::FParticles& MeshParticles,
const Chaos::FTriangleMesh& TriMesh,
const FBox& CollisionBounds,
const int32 MinRes,
const int32 MaxRes,
const ECollisionTypeEnum CollisionType);
static CHAOS_API FVector CalculateUnitMassInertiaTensor(
const FBox& BoundingBox,
const Chaos::FReal Radius,
const EImplicitTypeEnum ImplicitType);
static CHAOS_API Chaos::FReal CalculateVolume(
const FBox& BoundingBox,
const Chaos::FReal Radius,
const EImplicitTypeEnum ImplicitType);
};