// Copyright Epic Games, Inc. All Rights Reserved. #include "LyraTeamDisplayAsset.h" #include "Components/MeshComponent.h" #include "NiagaraComponent.h" #include "Materials/MaterialInstanceDynamic.h" #include "Engine/Texture.h" #include "Teams/LyraTeamSubsystem.h" void ULyraTeamDisplayAsset::ApplyToMaterial(UMaterialInstanceDynamic* Material) { if (Material) { for (const auto& KVP : ScalarParameters) { Material->SetScalarParameterValue(KVP.Key, KVP.Value); } for (const auto& KVP : ColorParameters) { Material->SetVectorParameterValue(KVP.Key, FVector(KVP.Value)); } for (const auto& KVP : TextureParameters) { Material->SetTextureParameterValue(KVP.Key, KVP.Value); } } } void ULyraTeamDisplayAsset::ApplyToMeshComponent(UMeshComponent* MeshComponent) { if (MeshComponent) { for (const auto& KVP : ScalarParameters) { MeshComponent->SetScalarParameterValueOnMaterials(KVP.Key, KVP.Value); } for (const auto& KVP : ColorParameters) { MeshComponent->SetVectorParameterValueOnMaterials(KVP.Key, FVector(KVP.Value)); } const TArray MaterialInterfaces = MeshComponent->GetMaterials(); for (int32 MaterialIndex = 0; MaterialIndex < MaterialInterfaces.Num(); ++MaterialIndex) { if (UMaterialInterface* MaterialInterface = MaterialInterfaces[MaterialIndex]) { UMaterialInstanceDynamic* DynamicMaterial = Cast(MaterialInterface); if (!DynamicMaterial) { DynamicMaterial = MeshComponent->CreateAndSetMaterialInstanceDynamic(MaterialIndex); } for (const auto& KVP : TextureParameters) { DynamicMaterial->SetTextureParameterValue(KVP.Key, KVP.Value); } } } } } void ULyraTeamDisplayAsset::ApplyToNiagaraComponent(UNiagaraComponent* NiagaraComponent) { if (NiagaraComponent) { for (const auto& KVP : ScalarParameters) { NiagaraComponent->SetVariableFloat(KVP.Key, KVP.Value); } for (const auto& KVP : ColorParameters) { NiagaraComponent->SetVariableLinearColor(KVP.Key, KVP.Value); } for (const auto& KVP : TextureParameters) { UTexture* Texture = KVP.Value; NiagaraComponent->SetVariableTexture(KVP.Key, Texture); } } } void ULyraTeamDisplayAsset::ApplyToActor(AActor* TargetActor, bool bIncludeChildActors) { if (TargetActor != nullptr) { TargetActor->ForEachComponent(bIncludeChildActors, [=](UActorComponent* InComponent) { if (UMeshComponent* MeshComponent = Cast(InComponent)) { ApplyToMeshComponent(MeshComponent); } else if (UNiagaraComponent* NiagaraComponent = Cast(InComponent)) { ApplyToNiagaraComponent(NiagaraComponent); } }); } } #if WITH_EDITOR void ULyraTeamDisplayAsset::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) { Super::PostEditChangeProperty(PropertyChangedEvent); for (ULyraTeamSubsystem* TeamSubsystem : TObjectRange()) { TeamSubsystem->NotifyTeamDisplayAssetModified(this); } } #endif