12#include "Materials/Material.h"
13#include "TimerManager.h"
17 PrimaryActorTick.bCanEverTick =
false;
24 UWorld* World = GetWorld();
43 Super::EndPlay(EndPlayReason);
45 UWorld* World = GetWorld();
68 UStaticMesh* Mesh = StaticMeshComponent->GetStaticMesh();
69 UClass* ClassPtr = InstancedActor->GetClass();
71 FString Name = IInteractable::Execute_GetInteractableName(InstancedActor).ToString();
75 Name = ClassPtr->GetAuthoredName();
76 if (Name.EndsWith(TEXT(
"_C")))
78 Name = Name.LeftChop(2);
80 if (Name.StartsWith(TEXT(
"BP_")))
82 Name = Name.RightChop(3);
84 Name.ReplaceInline(TEXT(
"_"), TEXT(
" "));
85 Name.ReplaceInline(TEXT(
"Instanced"), TEXT(
" "));
89 FString ActorName = Name;
90 ActorName.ReplaceInline(TEXT(
","), TEXT(
""));
91 ActorName.ReplaceInline(TEXT(
" "), TEXT(
"_"));
92 ActorName +=
"_Instanced";
93 SetActorLabel(ActorName);
97 FString Guid = FGuid::NewGuid().ToString().Left(4);
98 Name = FString::Printf(TEXT(
"%s(_%s_)"), *Name, *Guid);
105 const FTransform&
Transform = InstancedActor->GetActorTransform();
126 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([
this, AllowWorldPositionOffsetDisable] {
129 InstancedStaticMeshComponent->SetEvaluateWorldPositionOffset(false);
130 InstancedStaticMeshComponent->SetEvaluateWorldPositionOffsetInRayTracing(false);
144 const int32 NumberOfMaterials = StaticMeshComponent->GetNumMaterials();
145 TArray<UMaterialInterface*> MeshMaterials;
146 MeshMaterials.Reserve(NumberOfMaterials);
147 for (int32 i = 0; i < NumberOfMaterials; i++)
149 MeshMaterials.Add(StaticMeshComponent->GetMaterial(i));
160 const int32 MaterialCount = MeshMaterials.Num();
161 for (int32 MaterialIndex = 0; MaterialIndex < MaterialCount; ++MaterialIndex)
165 if (MaterialInterface)
171 UMaterial* Material = Cast<UMaterial>(MaterialInterface);
174 if (!Material->bUsedWithInstancedStaticMeshes)
176 UE_LOG(LogTemp, Warning, TEXT(
"AInstancedRendererManager: Material '%s' bUsedWithInstancedStaticMeshes is not set to true!"), *Material->GetName());
184 InstancedActor->Destroy();
199 UWorld* World = GetWorld();
217 FTransform InstanceTransform;
221 AActor* SpawnedActor = World->SpawnActorDeferred<AActor>(ActorClass, InstanceTransform);
230 SpawnedActor->FinishSpawning(InstanceTransform);
251 UWorld* World = GetWorld();
266 UE_LOG(LogTemp, Warning, TEXT(
"AInstancedActorRenderer: No spawn class setup."));
273 TArray<FTransform> Transforms;
277 for (int32 i = 0; i < InstanceCount; i++)
285 for (
const FTransform&
Transform : Transforms)
289 AActor* SpawnedActor = World->SpawnActorDeferred<AActor>(Class,
Transform);
304 if (!StaticMeshComponent)
309 UStaticMesh* StaticMesh = StaticMeshComponent->GetStaticMesh();
315 if (!CanHaveAlternativeMaterial)
324 const int32 NumberOfMaterials = StaticMeshComponent->GetNumMaterials();
325 TArray<UMaterialInterface*> MeshMaterials;
326 MeshMaterials.Reserve(NumberOfMaterials);
327 for (int32 i = 0; i < NumberOfMaterials; i++)
329 MeshMaterials.Add(StaticMeshComponent->GetMaterial(i));
334 bool bMaterialsMatch =
true;
339 UMaterialInterface* MeshMaterial = MeshMaterials[MaterialIndex];
340 if (UniqueMeshMaterial != MeshMaterial)
342 bMaterialsMatch =
false;
345 MeshMaterials.Empty();
366 const int32 NumberOfMaterials = ISM->GetNumMaterials();
372 for (int32 i = 0; i < NumberOfMaterials; i++)
433 bool ShouldRenderTreeWPO = IsWinter || IsWindy;
436 bool ShouldRenderSnowWPO = WeatherParameters.
SnowAmount != 0.0f;
438 bool ShouldRenderWPO = IsWinter || IsWindy;
441 bool NewRenderingWPO = ShouldRenderWPO || HideLeaves;
int32 WorldPositionOffsetDistance
AInstancedActorRenderer(const FObjectInitializer &ObjectInitializer)
void SetupFromInstancedActor(AInstancedActor *InstancedActor)
bool Matches(UStaticMeshComponent *StaticMeshComponent, const bool CanHaveAlternativeMaterial) const
void OnGraphicsSettingsChanged(FGlobalGraphicsSettings GraphicsSettings)
void OnWeatherParametersChanged(FWeatherParameters WeatherParameters)
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override
FWeatherParameters CurrentWeatherParameters
void SetShadowCacheBehaviour(EShadowCacheInvalidationBehavior ShadowCacheInvalidationBehaviour)
bool SpawnInstancesBackActors()
void SetRenderWorldPositionOffet(bool RenderWPO)
FInstancedActorParameters InstancedActorParameters
bool SpawnInstanceBackToActor(UInstancedStaticMeshComponent *ISM, int32 Index, bool OnlyTree)
void SetWorldPositionOffsetDistance(int32 NewWPODistance)
virtual void BeginPlay() override
UInstancedStaticMeshComponent * InstancedStaticMeshComponent
UStaticMesh * GetStaticMesh() const
int32 GetInstanceEndCullDistance() const
bool AddToInstancedRenderer
int32 GetInstanceStartCullDistance() const
UStaticMeshComponent * GetStaticMeshComponent() const
bool GetAllowWorldPositionOffsetDisable() const
const FWeatherParameters & GetCurrentWeather() const
FLevelEventDelegate_WeatherChanged OnWeatherChanged
int32 GetWorldPositionOffsetRenderDistance() const
FGraphicsSettingsDelegate OnGraphicsSettingsChanged
static UAgrarsenseSettings * GetAgrarsenseSettings()
static AWeather * GetWeatherActor(const UObject *WorldContextObject)
int32 WorldPositionOffsetDistance
EShadowCacheInvalidationBehavior FoliageShadowCacheInvalidationBehaviour
TSubclassOf< AActor > ActorClass
TWeakObjectPtr< UStaticMesh > Mesh
TArray< UMaterialInterface * > Materials
bool AllowWorldPositionOffsetDisable
int32 CustomDepthStencilValue