Files
FLESH/Source/FLESHEditor/Private/FLESHGraph/FLESHExecutor.cpp
2025-04-23 01:18:06 +08:00

196 lines
5.9 KiB
C++

#include "FLESHGraph/FLESHExecutor.h"
#include "Engine/SkeletalMesh.h"
#include "Components/SkeletalMeshComponent.h"
#include "NiagaraSystem.h"
#include "NiagaraComponent.h"
#include "NiagaraFunctionLibrary.h"
#include "Components/DecalComponent.h"
#include "Kismet/GameplayStatics.h"
#include "PhysicalMaterials/PhysicalMaterial.h"
#include "Logging/LogMacros.h"
// Define log category
DEFINE_LOG_CATEGORY_STATIC(LogFLESHExecutor, Log, All);
UFLESHExecutor::UFLESHExecutor()
{
// Initialize default values
Compiler = nullptr;
TargetActor = nullptr;
TargetSkeletalMesh = nullptr;
// Create boolean cut tool
CutTool = CreateDefaultSubobject<UBooleanCutTool>(TEXT("CutTool"));
}
void UFLESHExecutor::Initialize(UFLESHCompiler* InCompiler)
{
// Set compiler reference
Compiler = InCompiler;
UE_LOG(LogFLESHExecutor, Log, TEXT("FLESH Executor initialized with compiler: %s"),
Compiler ? TEXT("Valid") : TEXT("Invalid"));
}
bool UFLESHExecutor::Execute(AActor* InTargetActor)
{
// Set target actor
TargetActor = InTargetActor;
// Find skeletal mesh component
if (!FindTargetSkeletalMesh())
{
UE_LOG(LogFLESHExecutor, Warning, TEXT("FLESH: Cannot execute FLESH graph, skeletal mesh component not found"));
return false;
}
// Check if compiler is valid
if (!Compiler)
{
UE_LOG(LogFLESHExecutor, Warning, TEXT("FLESH: Cannot execute FLESH graph, invalid compiler"));
return false;
}
// Check if compilation was successful
if (!Compiler->IsCompilationSuccessful())
{
UE_LOG(LogFLESHExecutor, Warning, TEXT("FLESH: Cannot execute FLESH graph, compilation failed: %s"),
*Compiler->GetErrorMessage());
return false;
}
// Get execution order from compiler
TArray<int32> ExecutionOrder = Compiler->GetExecutionOrder();
// Get compiled node data
TArray<FFLESHNodeData> CompiledNodeData = Compiler->GetCompiledNodeData();
// Execute nodes in order
for (int32 NodeIndex : ExecutionOrder)
{
// Check if node index is valid
if (!CompiledNodeData.IsValidIndex(NodeIndex))
{
UE_LOG(LogFLESHExecutor, Warning, TEXT("FLESH: Invalid node index in execution order: %d"), NodeIndex);
continue;
}
// Execute node
if (!ExecuteNode(CompiledNodeData[NodeIndex]))
{
UE_LOG(LogFLESHExecutor, Warning, TEXT("FLESH: Failed to execute node: %s"),
*CompiledNodeData[NodeIndex].NodeName.ToString());
return false;
}
}
UE_LOG(LogFLESHExecutor, Log, TEXT("FLESH: Graph executed successfully on actor: %s"),
TargetActor ? *TargetActor->GetName() : TEXT("Invalid"));
return true;
}
void UFLESHExecutor::SetCutTool(UBooleanCutTool* InCutTool)
{
CutTool = InCutTool;
}
UBooleanCutTool* UFLESHExecutor::GetCutTool() const
{
return CutTool;
}
bool UFLESHExecutor::FindTargetSkeletalMesh()
{
// Check if target actor is valid
if (!TargetActor)
{
UE_LOG(LogFLESHExecutor, Warning, TEXT("FLESH: Invalid target actor"));
return false;
}
// Find skeletal mesh component
TargetSkeletalMesh = TargetActor->FindComponentByClass<USkeletalMeshComponent>();
// Check if skeletal mesh component is valid
if (!TargetSkeletalMesh)
{
UE_LOG(LogFLESHExecutor, Warning, TEXT("FLESH: Target actor does not have a skeletal mesh component"));
return false;
}
return true;
}
bool UFLESHExecutor::ExecuteNode(const FFLESHNodeData& NodeData)
{
// Execute node based on type
switch (NodeData.NodeType)
{
case EFLESHNodeType::Cut:
return ExecuteCutNode(NodeData);
case EFLESHNodeType::BloodEffect:
return ExecuteBloodEffectNode(NodeData);
case EFLESHNodeType::Physics:
return ExecutePhysicsNode(NodeData);
case EFLESHNodeType::Organ:
return ExecuteOrganNode(NodeData);
case EFLESHNodeType::Wound:
return ExecuteWoundNode(NodeData);
case EFLESHNodeType::BoneSelection:
return ExecuteBoneSelectionNode(NodeData);
default:
UE_LOG(LogFLESHExecutor, Warning, TEXT("FLESH: Unknown node type for node: %s"),
*NodeData.NodeName.ToString());
return false;
}
}
bool UFLESHExecutor::ExecuteCutNode(const FFLESHNodeData& NodeData)
{
// TODO: Implement cut node execution
UE_LOG(LogFLESHExecutor, Log, TEXT("FLESH: Executing cut node: %s"), *NodeData.NodeName.ToString());
return true;
}
bool UFLESHExecutor::ExecuteBloodEffectNode(const FFLESHNodeData& NodeData)
{
// TODO: Implement blood effect node execution
UE_LOG(LogFLESHExecutor, Log, TEXT("FLESH: Executing blood effect node: %s"), *NodeData.NodeName.ToString());
return true;
}
bool UFLESHExecutor::ExecutePhysicsNode(const FFLESHNodeData& NodeData)
{
// TODO: Implement physics node execution
UE_LOG(LogFLESHExecutor, Log, TEXT("FLESH: Executing physics node: %s"), *NodeData.NodeName.ToString());
return true;
}
bool UFLESHExecutor::ExecuteOrganNode(const FFLESHNodeData& NodeData)
{
// TODO: Implement organ node execution
UE_LOG(LogFLESHExecutor, Log, TEXT("FLESH: Executing organ node: %s"), *NodeData.NodeName.ToString());
return true;
}
bool UFLESHExecutor::ExecuteWoundNode(const FFLESHNodeData& NodeData)
{
// TODO: Implement wound node execution
UE_LOG(LogFLESHExecutor, Log, TEXT("FLESH: Executing wound node: %s"), *NodeData.NodeName.ToString());
return true;
}
bool UFLESHExecutor::ExecuteBoneSelectionNode(const FFLESHNodeData& NodeData)
{
// TODO: Implement bone selection node execution
UE_LOG(LogFLESHExecutor, Log, TEXT("FLESH: Executing bone selection node: %s"), *NodeData.NodeName.ToString());
return true;
}