// Copyright Epic Games, Inc. All Rights Reserved. #include "MassStationaryISMRepresentationFragmentDestructor.h" #include "MassRepresentationSubsystem.h" #include "MassCommonFragments.h" #include "MassRepresentationProcessor.h" //----------------------------------------------------------------------------- // UMassStationaryISMRepresentationFragmentDestructor //----------------------------------------------------------------------------- #include UE_INLINE_GENERATED_CPP_BY_NAME(MassStationaryISMRepresentationFragmentDestructor) UMassStationaryISMRepresentationFragmentDestructor::UMassStationaryISMRepresentationFragmentDestructor() : EntityQuery(*this) { ObservedType = FMassRepresentationFragment::StaticStruct(); ObservedOperations = EMassObservedOperationFlags::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) { const int32 ISMInfoIndex = Representation.StaticMeshDescHandle.ToIndex(); if (ensureMsgf(ISMInfosView.IsValidIndex(ISMInfoIndex), TEXT("Invalid handle index %u for ISMInfosView"), ISMInfoIndex)) { FMassInstancedStaticMeshInfo& ISMInfo = ISMInfosView[ISMInfoIndex]; if (FMassLODSignificanceRange* OldRange = ISMInfo.GetLODSignificanceRange(Representation.PrevLODSignificance)) { const FMassEntityHandle EntityHandle = Context.GetEntity(EntityIt); if (OldRange) { OldRange->RemoveInstance(EntityHandle); } } } Representation.CurrentRepresentation = EMassRepresentationType::None; } } }); }