14 PrimaryActorTick.bCanEverTick =
false;
21 UWorld* World = GetWorld();
40 Super::EndPlay(EndPlayReason);
42 UWorld* World = GetWorld();
65 UStaticMesh* Mesh = StaticMeshComponent->GetStaticMesh();
66 UClass* ClassPtr = InstancedActor->GetClass();
68 FString Name = IInteractable::Execute_GetInteractableName(InstancedActor).ToString();
72 Name = ClassPtr->GetAuthoredName();
73 if (Name.EndsWith(TEXT(
"_C")))
75 Name = Name.LeftChop(2);
77 if (Name.StartsWith(TEXT(
"BP_")))
79 Name = Name.RightChop(3);
81 Name.ReplaceInline(TEXT(
"_"), TEXT(
" "));
82 Name.ReplaceInline(TEXT(
"Instanced"), TEXT(
" "));
86 FString ActorName = Name;
87 ActorName.ReplaceInline(TEXT(
","), TEXT(
""));
88 ActorName.ReplaceInline(TEXT(
" "), TEXT(
"_"));
89 ActorName +=
"_Instanced";
90 SetActorLabel(ActorName);
94 FString Guid = FGuid::NewGuid().ToString().Left(4);
95 Name = FString::Printf(TEXT(
"%s(_%s_)"), *Name, *Guid);
102 const FTransform&
Transform = InstancedActor->GetActorTransform();
123 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([
this, AllowWorldPositionOffsetDisable] {
126 InstancedStaticMeshComponent->SetEvaluateWorldPositionOffset(false);
127 InstancedStaticMeshComponent->SetEvaluateWorldPositionOffsetInRayTracing(false);
141 const int32 NumberOfMaterials = StaticMeshComponent->GetNumMaterials();
142 TArray<UMaterialInterface*> MeshMaterials;
143 MeshMaterials.Reserve(NumberOfMaterials);
144 for (int32 i = 0; i < NumberOfMaterials; i++)
146 MeshMaterials.Add(StaticMeshComponent->GetMaterial(i));
157 const int32 MaterialCount = MeshMaterials.Num();
158 for (int32 MaterialIndex = 0; MaterialIndex < MaterialCount; ++MaterialIndex)
162 if (MaterialInterface)
168 UMaterial* Material = Cast<UMaterial>(MaterialInterface);
171 if (!Material->bUsedWithInstancedStaticMeshes)
173 UE_LOG(LogTemp, Warning, TEXT(
"AInstancedRendererManager: Material '%s' bUsedWithInstancedStaticMeshes is not set to true!"), *Material->GetName());
181 InstancedActor->Destroy();
196 UWorld* World = GetWorld();
214 FTransform InstanceTransform;
218 AActor* SpawnedActor = World->SpawnActorDeferred<AActor>(ActorClass, InstanceTransform);
227 SpawnedActor->FinishSpawning(InstanceTransform);
248 UWorld* World = GetWorld();
263 UE_LOG(LogTemp, Warning, TEXT(
"AInstancedActorRenderer: No spawn class setup."));
270 TArray<FTransform> Transforms;
274 for (int32 i = 0; i < InstanceCount; i++)
282 for (
const FTransform&
Transform : Transforms)
286 AActor* SpawnedActor = World->SpawnActorDeferred<AActor>(Class,
Transform);
301 if (!StaticMeshComponent)
306 UStaticMesh* StaticMesh = StaticMeshComponent->GetStaticMesh();
312 if (!CanHaveAlternativeMaterial)
321 const int32 NumberOfMaterials = StaticMeshComponent->GetNumMaterials();
322 TArray<UMaterialInterface*> MeshMaterials;
323 MeshMaterials.Reserve(NumberOfMaterials);
324 for (int32 i = 0; i < NumberOfMaterials; i++)
326 MeshMaterials.Add(StaticMeshComponent->GetMaterial(i));
331 bool bMaterialsMatch =
true;
336 UMaterialInterface* MeshMaterial = MeshMaterials[MaterialIndex];
337 if (UniqueMeshMaterial != MeshMaterial)
339 bMaterialsMatch =
false;
342 MeshMaterials.Empty();
363 const int32 NumberOfMaterials = ISM->GetNumMaterials();
369 for (int32 i = 0; i < NumberOfMaterials; i++)
429 bool ShouldRenderTreeWPO = IsWinter || IsWindy;
432 bool ShouldRenderSnowWPO = WeatherParameters.
SnowAmount != 0.0f;
434 bool ShouldRenderWPO = IsWinter || IsWindy;
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