添加 Source/FLESH/Private/SoftBodyVisceraComponent.cpp
This commit is contained in:
141
Source/FLESH/Private/SoftBodyVisceraComponent.cpp
Normal file
141
Source/FLESH/Private/SoftBodyVisceraComponent.cpp
Normal file
@@ -0,0 +1,141 @@
|
||||
#include "SoftBodyVisceraComponent.h"
|
||||
#include "Engine/SkeletalMesh.h"
|
||||
#include "PhysicsEngine/PhysicsAsset.h"
|
||||
#include "PhysicsEngine/BodySetup.h"
|
||||
|
||||
USoftBodyVisceraComponent::USoftBodyVisceraComponent()
|
||||
{
|
||||
// Set default values
|
||||
PrimaryComponentTick.bCanEverTick = true;
|
||||
bWantsInitializeComponent = true;
|
||||
|
||||
// Create tools
|
||||
SetupPhysicsTools();
|
||||
}
|
||||
|
||||
void USoftBodyVisceraComponent::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
// Initialize physics if not already initialized
|
||||
if (SoftBodyPhysicsTool && !SoftBodyPhysicsTool->IsValidLowLevel())
|
||||
{
|
||||
SetupPhysicsTools();
|
||||
}
|
||||
}
|
||||
|
||||
void USoftBodyVisceraComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
|
||||
{
|
||||
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
||||
|
||||
// Additional tick logic can be added here
|
||||
}
|
||||
|
||||
bool USoftBodyVisceraComponent::InitializeSoftBodyPhysics(const FSoftBodySimulationSettings& SimulationSettings)
|
||||
{
|
||||
if (!SoftBodyPhysicsTool)
|
||||
{
|
||||
SetupPhysicsTools();
|
||||
}
|
||||
|
||||
if (SoftBodyPhysicsTool)
|
||||
{
|
||||
return SoftBodyPhysicsTool->InitializeSoftBodyPhysics(this, SimulationSettings);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool USoftBodyVisceraComponent::AddAnchorPoint(const FSoftBodyAnchorPoint& AnchorPoint)
|
||||
{
|
||||
if (SoftBodyPhysicsTool)
|
||||
{
|
||||
return SoftBodyPhysicsTool->AddAnchorPoint(AnchorPoint);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool USoftBodyVisceraComponent::AddLineChain(const FSoftBodyLineChain& LineChain)
|
||||
{
|
||||
if (SoftBodyPhysicsTool)
|
||||
{
|
||||
return SoftBodyPhysicsTool->AddLineChain(LineChain);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool USoftBodyVisceraComponent::AddTetrahedron(const FSoftBodyTetrahedron& Tetrahedron)
|
||||
{
|
||||
if (SoftBodyPhysicsTool)
|
||||
{
|
||||
return SoftBodyPhysicsTool->AddTetrahedron(Tetrahedron);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool USoftBodyVisceraComponent::AddPlaneConstraint(const FSoftBodyPlaneConstraint& PlaneConstraint)
|
||||
{
|
||||
if (SoftBodyPhysicsTool)
|
||||
{
|
||||
return SoftBodyPhysicsTool->AddPlaneConstraint(PlaneConstraint);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void USoftBodyVisceraComponent::UpdateSimulationSettings(const FSoftBodySimulationSettings& SimulationSettings)
|
||||
{
|
||||
if (SoftBodyPhysicsTool)
|
||||
{
|
||||
SoftBodyPhysicsTool->UpdateSimulationSettings(SimulationSettings);
|
||||
}
|
||||
}
|
||||
|
||||
void USoftBodyVisceraComponent::SetSimulationEnabled(bool bEnable)
|
||||
{
|
||||
if (SoftBodyPhysicsTool)
|
||||
{
|
||||
SoftBodyPhysicsTool->SetSimulationEnabled(bEnable);
|
||||
}
|
||||
}
|
||||
|
||||
bool USoftBodyVisceraComponent::PerformCut(const FCutPlane& CutPlane, ECapMeshMethod CapMethod)
|
||||
{
|
||||
if (!BooleanCutTool)
|
||||
{
|
||||
SetupPhysicsTools();
|
||||
}
|
||||
|
||||
if (BooleanCutTool && GetSkeletalMeshAsset())
|
||||
{
|
||||
// Perform the cut operation
|
||||
TArray<USkeletalMesh*> CutResults = BooleanCutTool->CutSkeletalMesh(GetSkeletalMeshAsset(), CutPlane, NAME_None, true);
|
||||
|
||||
if (CutResults.Num() > 0 && CutResults[0])
|
||||
{
|
||||
// Update the mesh with the cut result
|
||||
SetSkeletalMesh(CutResults[0]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void USoftBodyVisceraComponent::SetupPhysicsTools()
|
||||
{
|
||||
// Create the soft body physics tool if it doesn't exist
|
||||
if (!SoftBodyPhysicsTool)
|
||||
{
|
||||
SoftBodyPhysicsTool = NewObject<USoftBodyPhysicsTool>(this, TEXT("SoftBodyPhysicsTool"));
|
||||
}
|
||||
|
||||
// Create the boolean cut tool if it doesn't exist
|
||||
if (!BooleanCutTool)
|
||||
{
|
||||
BooleanCutTool = NewObject<UBooleanCutTool>(this, TEXT("BooleanCutTool"));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user