#pragma once #include "CoreMinimal.h" #include "UObject/NoExportTypes.h" #include "NiagaraSystem.h" #include "NiagaraComponent.h" #include "NiagaraFunctionLibrary.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 InWorld); /** * Clean up the preview manager */ void Cleanup(); /** * Set the target actor for preview * @param InActor - The actor to preview on */ void SetTargetActor(TObjectPtr InActor); /** * Preview a node * @param Node - The node to preview * @return True if the preview was successful */ bool PreviewNode(TObjectPtr 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 GetTargetActor() const { return TargetActor; } /** * Get the target skeletal mesh component * @return The target skeletal mesh component */ TObjectPtr GetTargetSkeletalMesh() const { return TargetSkeletalMesh; } private: // The world to create the preview in UPROPERTY() TObjectPtr World; // The target actor UPROPERTY() TObjectPtr TargetActor; // The target skeletal mesh component UPROPERTY() TObjectPtr TargetSkeletalMesh; // The currently previewed node UPROPERTY() TObjectPtr PreviewedNode; // Preview components UPROPERTY() TArray> PreviewNiagaraComponents; UPROPERTY() TArray> PreviewDecalComponents; UPROPERTY() TArray> PreviewStaticMeshComponents; // Preview cut plane mesh UPROPERTY() TObjectPtr PreviewCutPlaneMesh; // Preview bone selections UPROPERTY() TArray PreviewBoneSelections; // Preview cut locations UPROPERTY() TArray PreviewCutTransforms; // Preview blood effect locations UPROPERTY() TArray PreviewBloodEffectTransforms; // Preview organ locations UPROPERTY() TArray PreviewOrganTransforms; // Preview wound locations UPROPERTY() TArray PreviewWoundTransforms; // Find the target skeletal mesh component bool FindTargetSkeletalMesh(); // Preview a cut node bool PreviewCutNode(TObjectPtr CutNode); // Preview a bone select node bool PreviewBoneSelectNode(TObjectPtr BoneSelectNode); // Preview a blood effect node bool PreviewBloodEffectNode(TObjectPtr BloodEffectNode); // Preview a physics node bool PreviewPhysicsNode(TObjectPtr PhysicsNode); // Preview an organ node bool PreviewOrganNode(TObjectPtr OrganNode); // Preview a wound node bool PreviewWoundNode(TObjectPtr WoundNode); // Create a preview cut plane mesh TObjectPtr CreatePreviewCutPlaneMesh(const FVector& Location, const FVector& Direction, float Width, float Depth, UMaterialInterface* Material); // Create a preview blood effect TObjectPtr CreatePreviewBloodEffect(const FVector& Location, UNiagaraSystem* BloodEffect, float BloodAmount, float BloodPressure); // Create a preview blood pool TObjectPtr CreatePreviewBloodPool(const FVector& Location, float Size, UMaterialInterface* Material); // Create a preview organ TObjectPtr CreatePreviewOrgan(UStaticMesh* OrganMesh, UMaterialInterface* OrganMaterial, const FName& AttachBoneName, const FVector& RelativeLocation, const FRotator& RelativeRotation, const FVector& RelativeScale); // Create a preview wound TObjectPtr CreatePreviewWound(const FVector& Location, float Size, UMaterialInterface* Material); // Clear all preview components void ClearPreviewComponents(); };