Files
UnrealEngine/Engine/Plugins/Runtime/MassGameplay/Source/MassRepresentation/Private/MassStationaryVisualizationTrait.cpp
2025-05-18 13:04:45 +08:00

59 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MassStationaryVisualizationTrait.h"
#include "MassEntityTemplateRegistry.h"
#include "MassStationaryISMSwitcherProcessor.h"
#include "VisualLogger/VisualLogger.h"
namespace UE::Mass::LOD::Private
{
void SetUpStationaryVisualizationTrait(const UMassEntityTraitBase& Trait, FMassEntityTemplateBuildContext& BuildContext, FStaticMeshInstanceVisualizationDesc& StaticMeshInstanceDesc)
{
bool bIssuesFound = false;
for (FMassStaticMeshInstanceVisualizationMeshDesc& MeshDesc : StaticMeshInstanceDesc.Meshes)
{
bIssuesFound = bIssuesFound || (MeshDesc.Mobility != EComponentMobility::Stationary);
MeshDesc.Mobility = EComponentMobility::Stationary;
MeshDesc.bRequiresExternalInstanceIDTracking = true;
}
UE_CVLOG_UELOG(bIssuesFound, &Trait, LogMass, Log, TEXT("%s some Meshes' mobility has been set to non-Stationary. These settings will be overridden."), *Trait.GetPathName());
BuildContext.AddTag<FMassStaticRepresentationTag>();
BuildContext.AddTag<FMassStationaryISMSwitcherProcessorTag>();
}
}
//-----------------------------------------------------------------------------
// UMassStationaryVisualizationTrait
//-----------------------------------------------------------------------------
UMassStationaryVisualizationTrait::UMassStationaryVisualizationTrait(const FObjectInitializer& ObjectInitializer)
{
bAllowServerSideVisualization = true;
}
void UMassStationaryVisualizationTrait::BuildTemplate(FMassEntityTemplateBuildContext& BuildContext, const UWorld& World) const
{
UE::Mass::LOD::Private::SetUpStationaryVisualizationTrait(*this, BuildContext, StaticMeshInstanceDesc);
Super::BuildTemplate(BuildContext, World);
BuildContext.RequireTag<FMassCollectLODViewerInfoTag>();
}
#if WITH_EDITOR
void UMassStationaryVisualizationTrait::PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent)
{
static const FName StaticMeshInstanceDescName = GET_MEMBER_NAME_CHECKED(UMassStationaryVisualizationTrait, StaticMeshInstanceDesc);
Super::PostEditChangeProperty(PropertyChangedEvent);
if (PropertyChangedEvent.MemberProperty && PropertyChangedEvent.MemberProperty->GetFName() == StaticMeshInstanceDescName)
{
for (FMassStaticMeshInstanceVisualizationMeshDesc& MeshDesc : StaticMeshInstanceDesc.Meshes)
{
MeshDesc.Mobility = EComponentMobility::Stationary;
}
}
}
#endif // WITH_EDITOR