Files
FLESH/Source/FLESHEditor/Public/DismembermentGraph/DismembermentPreviewManager.h
2025-04-17 23:59:17 +08:00

168 lines
4.8 KiB
C++

#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "DismembermentPreviewManager.generated.h"
// Add a log category declaration
DECLARE_LOG_CATEGORY_EXTERN(LogFLESHPreview, Log, All);
class UDismembermentGraphNode;
class USkeletalMeshComponent;
class AActor;
class UWorld;
class UNiagaraComponent;
class UDecalComponent;
class UStaticMeshComponent;
/**
* Preview manager for dismemberment effects
* Handles real-time preview of dismemberment nodes
*/
UCLASS()
class FLESHEDITOR_API UDismembermentPreviewManager : public UObject
{
GENERATED_BODY()
public:
// Constructor
UDismembermentPreviewManager();
/**
* Initialize the preview manager
* @param InWorld - The world to create the preview in
*/
void Initialize(TObjectPtr<UWorld> InWorld);
/**
* Clean up the preview manager
*/
void Cleanup();
/**
* Set the target actor for preview
* @param InActor - The actor to preview on
*/
void SetTargetActor(TObjectPtr<AActor> InActor);
/**
* Preview a node
* @param Node - The node to preview
* @return True if the preview was successful
*/
bool PreviewNode(TObjectPtr<UDismembermentGraphNode> Node);
/**
* Clear the current preview
*/
void ClearPreview();
/**
* Update the preview
* @param DeltaTime - Time since last update
*/
void Tick(float DeltaTime);
/**
* Get the target actor
* @return The target actor
*/
TObjectPtr<AActor> GetTargetActor() const { return TargetActor; }
/**
* Get the target skeletal mesh component
* @return The target skeletal mesh component
*/
TObjectPtr<USkeletalMeshComponent> GetTargetSkeletalMesh() const { return TargetSkeletalMesh; }
private:
// The world to create the preview in
UPROPERTY()
TObjectPtr<UWorld> World;
// The target actor
UPROPERTY()
TObjectPtr<AActor> TargetActor;
// The target skeletal mesh component
UPROPERTY()
TObjectPtr<USkeletalMeshComponent> TargetSkeletalMesh;
// The currently previewed node
UPROPERTY()
TObjectPtr<UDismembermentGraphNode> PreviewedNode;
// Preview components
UPROPERTY()
TArray<TObjectPtr<UNiagaraComponent>> PreviewNiagaraComponents;
UPROPERTY()
TArray<TObjectPtr<UDecalComponent>> PreviewDecalComponents;
UPROPERTY()
TArray<TObjectPtr<UStaticMeshComponent>> PreviewStaticMeshComponents;
// Preview cut plane mesh
UPROPERTY()
TObjectPtr<UStaticMeshComponent> PreviewCutPlaneMesh;
// Preview bone selections
UPROPERTY()
TArray<FName> PreviewBoneSelections;
// Preview cut locations
UPROPERTY()
TArray<FTransform> PreviewCutTransforms;
// Preview blood effect locations
UPROPERTY()
TArray<FTransform> PreviewBloodEffectTransforms;
// Preview organ locations
UPROPERTY()
TArray<FTransform> PreviewOrganTransforms;
// Preview wound locations
UPROPERTY()
TArray<FTransform> PreviewWoundTransforms;
// Find the target skeletal mesh component
bool FindTargetSkeletalMesh();
// Preview a cut node
bool PreviewCutNode(TObjectPtr<class UDismembermentGraphNodeCut> CutNode);
// Preview a bone select node
bool PreviewBoneSelectNode(TObjectPtr<class UDismembermentGraphNodeBoneSelect> BoneSelectNode);
// Preview a blood effect node
bool PreviewBloodEffectNode(TObjectPtr<class UDismembermentGraphNodeBloodEffect> BloodEffectNode);
// Preview a physics node
bool PreviewPhysicsNode(TObjectPtr<class UDismembermentGraphNodePhysics> PhysicsNode);
// Preview an organ node
bool PreviewOrganNode(TObjectPtr<class UDismembermentGraphNodeOrgan> OrganNode);
// Preview a wound node
bool PreviewWoundNode(TObjectPtr<class UDismembermentGraphNodeWound> WoundNode);
// Create a preview cut plane mesh
TObjectPtr<UStaticMeshComponent> CreatePreviewCutPlaneMesh(const FVector& Location, const FVector& Direction, float Width, float Depth, UMaterialInterface* Material);
// Create a preview blood effect
TObjectPtr<UNiagaraComponent> CreatePreviewBloodEffect(const FVector& Location, UNiagaraSystem* BloodEffect, float BloodAmount, float BloodPressure);
// Create a preview blood pool
TObjectPtr<UDecalComponent> CreatePreviewBloodPool(const FVector& Location, float Size, UMaterialInterface* Material);
// Create a preview organ
TObjectPtr<UStaticMeshComponent> CreatePreviewOrgan(UStaticMesh* OrganMesh, UMaterialInterface* OrganMaterial, const FName& AttachBoneName, const FVector& RelativeLocation, const FRotator& RelativeRotation, const FVector& RelativeScale);
// Create a preview wound
TObjectPtr<UDecalComponent> CreatePreviewWound(const FVector& Location, float Size, UMaterialInterface* Material);
// Clear all preview components
void ClearPreviewComponents();
};