Files
UnrealEngine/Engine/Source/Runtime/Foliage/Private/FoliageISMActor.h
2025-05-18 13:04:45 +08:00

99 lines
5.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "InstancedFoliage.h"
#include "ISMPartition/ISMPartitionActor.h"
#include "ISMPartition/ISMComponentDescriptor.h"
#include "Misc/Guid.h"
#include "Containers/SortedMap.h"
struct FFoliageInfo;
class UInstancedStaticMeshComponent;
class UPrimitiveComponent;
class UBlueprint;
class UFoliageType_Actor;
struct FFoliageISMActor : public FFoliageImpl, public IISMPartitionInstanceManager
{
FFoliageISMActor(FFoliageInfo* Info)
: FFoliageImpl(Info)
#if WITH_EDITORONLY_DATA
, Guid(FGuid::NewGuid())
, ActorClass(nullptr)
#endif
{
}
virtual ~FFoliageISMActor();
#if WITH_EDITORONLY_DATA
FGuid Guid;
FISMClientHandle ClientHandle;
TSortedMap<int32, TArray<FTransform>> ISMDefinition;
TObjectPtr<UClass> ActorClass;
#endif
virtual void Serialize(FArchive& Ar) override;
virtual void PostSerialize(FArchive& Ar) override;
virtual void PostLoad() override;
#if WITH_EDITOR
virtual void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector) override;
virtual bool IsInitialized() const override;
virtual void Initialize(const UFoliageType* FoliageType) override;
virtual void Uninitialize() override;
virtual void Reapply(const UFoliageType* FoliageType) override;
virtual int32 GetInstanceCount() const override;
virtual void PreAddInstances(const UFoliageType* FoliageType, int32 AddedInstanceCount) override;
virtual void AddInstance(const FFoliageInstance& NewInstance) override;
virtual void RemoveInstance(int32 InstanceIndex) override;
virtual void SetInstanceWorldTransform(int32 InstanceIndex, const FTransform& Transform, bool bTeleport) override;
virtual FTransform GetInstanceWorldTransform(int32 InstanceIndex) const override;
virtual bool IsOwnedComponent(const UPrimitiveComponent* Component) const override;
virtual void SelectAllInstances(bool bSelect) override;
virtual void SelectInstance(bool bSelect, int32 Index) override;
virtual void SelectInstances(bool bSelect, const TSet<int32>& SelectedIndices) override;
virtual int32 GetInstanceIndexFrom(const UPrimitiveComponent* Component, int32 ComponentIndex) const;
virtual FBox GetSelectionBoundingBox(const TSet<int32>& SelectedIndices) const override;
virtual void ApplySelection(bool bApply, const TSet<int32>& SelectedIndices) override;
virtual void ClearSelection(const TSet<int32>& SelectedIndices) override;
virtual void ForEachSMInstance(TFunctionRef<bool(FSMInstanceId)> Callback) const override;
virtual void ForEachSMInstance(int32 InstanceIndex, TFunctionRef<bool(FSMInstanceId)> Callback) const override;
virtual void BeginUpdate() override;
virtual void EndUpdate() override;
virtual void Refresh(bool bAsync, bool bForce) override;
virtual void OnHiddenEditorViewMaskChanged(uint64 InHiddenEditorViews) override;
virtual void PreEditUndo(UFoliageType* FoliageType) override;
virtual void PostEditUndo(FFoliageInfo* InInfo, UFoliageType* FoliageType) override;
virtual void NotifyFoliageTypeWillChange(UFoliageType* FoliageType) override;
virtual bool NotifyFoliageTypeChanged(UFoliageType* FoliageType, bool bSourceChanged) override;
private:
void RegisterDelegates();
void UnregisterDelegates();
void OnBlueprintChanged(UBlueprint* InBlueprint);
#endif
private:
//~ IISMPartitionInstanceManager interface
virtual FText GetISMPartitionInstanceDisplayName(const FISMClientInstanceId& InstanceId) const override;
virtual FText GetISMPartitionInstanceTooltip(const FISMClientInstanceId& InstanceId) const override;
virtual bool CanEditISMPartitionInstance(const FISMClientInstanceId& InstanceId) const override;
virtual bool CanMoveISMPartitionInstance(const FISMClientInstanceId& InstanceId, const ETypedElementWorldType InWorldType) const override;
virtual bool GetISMPartitionInstanceTransform(const FISMClientInstanceId& InstanceId, FTransform& OutInstanceTransform, bool bWorldSpace = false) const override;
virtual bool SetISMPartitionInstanceTransform(const FISMClientInstanceId& InstanceId, const FTransform& InstanceTransform, bool bWorldSpace = false, bool bTeleport = false) override;
virtual void NotifyISMPartitionInstanceMovementStarted(const FISMClientInstanceId& InstanceId) override;
virtual void NotifyISMPartitionInstanceMovementOngoing(const FISMClientInstanceId& InstanceId) override;
virtual void NotifyISMPartitionInstanceMovementEnded(const FISMClientInstanceId& InstanceId) override;
virtual void NotifyISMPartitionInstanceSelectionChanged(const FISMClientInstanceId& InstanceId, const bool bIsSelected) override;
virtual bool DeleteISMPartitionInstances(TArrayView<const FISMClientInstanceId> InstanceIds) override;
virtual bool DuplicateISMPartitionInstances(TArrayView<const FISMClientInstanceId> InstanceIds, TArray<FISMClientInstanceId>& OutNewInstanceIds) override;
#if WITH_EDITOR
FFoliageInstanceId ISMClientInstanceIdToFoliageInstanceId(const FISMClientInstanceId& InstanceId) const;
TArray<FFoliageInstanceId> ISMClientInstanceIdsToFoliageInstanceIds(TArrayView<const FISMClientInstanceId> InstanceIds) const;
#endif
};