// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Chaos/Framework/PhysicsProxy.h" #include "GeometryCollection/GeometryCollectionSimulationTypes.h" #include "Chaos/Framework/BufferedData.h" // @todo(chaos): remove this file namespace Chaos { class FParticleData; } struct FPhysicsProxyKinematicUpdate { FTransform NewTransform; FVector NewVelocity; }; struct FStubSkeletalMeshData //: public Chaos::FParticleData { void Reset() { }; }; class FStaticMeshPhysicsProxy : public TPhysicsProxy { typedef TPhysicsProxy Base; public: struct FShapeParams { FVector BoxExtents; FVector2D CapsuleHalfHeightAndRadius; float SphereRadius; FShapeParams() { FMemory::Memset(this, 0, sizeof(FShapeParams)); } }; struct Params { Params() : Name("") , InitialTransform(FTransform::Identity) , InitialLinearVelocity(FVector::ZeroVector) , InitialAngularVelocity(FVector::ZeroVector) , ObjectType(EObjectStateTypeEnum::Chaos_Object_Dynamic) , ShapeType(EImplicitTypeEnum::Chaos_Max) , bSimulating(false) , TargetTransform(nullptr) , Mass(0.0f) , MinRes(5) , MaxRes(10) {} FString Name; Chaos::FParticles MeshVertexPositions; TArray > TriIndices; FShapeParams ShapeParams; FTransform InitialTransform; FVector InitialLinearVelocity; FVector InitialAngularVelocity; EObjectStateTypeEnum ObjectType; EImplicitTypeEnum ShapeType; bool bSimulating; FTransform* TargetTransform; Chaos::TSerializablePtr PhysicalMaterial; float Mass; int32 MinRes; int32 MaxRes; }; // Engine interface functions using FCallbackInitFunc = TFunction; using FSyncDynamicFunc = TFunction; FStaticMeshPhysicsProxy() = delete; CHAOS_API FStaticMeshPhysicsProxy(UObject* InOwner, FCallbackInitFunc InInitFunc, FSyncDynamicFunc InSyncFunc); CHAOS_API void Initialize(); CHAOS_API void Reset(); /** Stores latest update, to be applied at next opportunity (via UpdateKinematicBodiesCallback). */ CHAOS_API void BufferKinematicUpdate(const FPhysicsProxyKinematicUpdate& InParamUpdate); /** Solver Object interface */ CHAOS_API bool IsSimulating() const; CHAOS_API void UpdateKinematicBodiesCallback(const FParticlesType& Particles, const float Dt, const float Time, FKinematicProxy& Proxy); CHAOS_API void StartFrameCallback(const float InDt, const float InTime); CHAOS_API void EndFrameCallback(const float InDt); CHAOS_API void BindParticleCallbackMapping(Chaos::TArrayCollectionArray & PhysicsProxyReverseMap, Chaos::TArrayCollectionArray & ParticleIDReverseMap); CHAOS_API void CreateRigidBodyCallback(FParticlesType& InOutParticles); CHAOS_API void ParameterUpdateCallback(FParticlesType& InParticles, const float InTime); CHAOS_API void DisableCollisionsCallback(TSet>& InPairs); CHAOS_API void AddForceCallback(FParticlesType& InParticles, const float InDt, const int32 InIndex); void BufferCommand(Chaos::FPhysicsSolver* InSolver, const FFieldSystemCommand& InCommand) {}; void SyncBeforeDestroy() {}; CHAOS_API void OnRemoveFromScene(); void PushToPhysicsState(const Chaos::FParticleData*) {}; void ClearAccumulatedData() {} CHAOS_API void BufferPhysicsResults(); CHAOS_API void FlipBuffer(); CHAOS_API bool PullFromPhysicsState(const int32 SolverSyncTimestamp); bool IsDirty() { return false; } FStubSkeletalMeshData* NewData() { return nullptr; } static constexpr EPhysicsProxyType ConcreteType() { return EPhysicsProxyType::StaticMeshType; } /** ----------------------- */ private: };