// Copyright Epic Games, Inc. All Rights Reserved. #include "MassStationaryISMRepresentationFragmentDestructor.h" #include "MassRepresentationSubsystem.h" #include "MassCommonFragments.h" #include "MassRepresentationProcessor.h" //----------------------------------------------------------------------------- // UMassStationaryISMRepresentationFragmentDestructor //----------------------------------------------------------------------------- UMassStationaryISMRepresentationFragmentDestructor::UMassStationaryISMRepresentationFragmentDestructor() : EntityQuery(*this) { ObservedType = FMassRepresentationFragment::StaticStruct(); Operation = EMassObservedOperation::Remove; ExecutionFlags = (int32)EProcessorExecutionFlags::AllWorldModes; bRequiresGameThreadExecution = true; // not sure about this } void UMassStationaryISMRepresentationFragmentDestructor::ConfigureQueries(const TSharedRef& EntityManager) { EntityQuery.AddRequirement(EMassFragmentAccess::ReadWrite); EntityQuery.AddConstSharedRequirement(); EntityQuery.AddSharedRequirement(EMassFragmentAccess::ReadWrite); EntityQuery.AddTagRequirement(EMassFragmentPresence::All); } void UMassStationaryISMRepresentationFragmentDestructor::Execute(FMassEntityManager& EntityManager, FMassExecutionContext& Context) { EntityQuery.ForEachEntityChunk(Context, [this](FMassExecutionContext& Context) { UMassRepresentationSubsystem* RepresentationSubsystem = Context.GetMutableSharedFragment().RepresentationSubsystem; check(RepresentationSubsystem); FMassInstancedStaticMeshInfoArrayView ISMInfosView = RepresentationSubsystem->GetMutableInstancedStaticMeshInfos(); const TArrayView RepresentationList = Context.GetMutableFragmentView(); for (FMassExecutionContext::FEntityIterator EntityIt = Context.CreateEntityIterator(); EntityIt; ++EntityIt) { FMassRepresentationFragment& Representation = RepresentationList[EntityIt]; if (Representation.CurrentRepresentation == EMassRepresentationType::StaticMeshInstance) { FMassInstancedStaticMeshInfo& ISMInfo = ISMInfosView[Representation.StaticMeshDescHandle.ToIndex()]; if (FMassLODSignificanceRange* OldRange = ISMInfo.GetLODSignificanceRange(Representation.PrevLODSignificance)) { const FMassEntityHandle EntityHandle = Context.GetEntity(EntityIt); if (OldRange) { OldRange->RemoveInstance(EntityHandle); } } Representation.CurrentRepresentation = EMassRepresentationType::None; } } }); }