12#include <util/ue-header-guard-begin.h>
13#include "InstancedFoliageActor.h"
14#include "GameFramework/Character.h"
16#include "Misc/FileHelper.h"
17#include "Misc/Paths.h"
19#include <util/ue-header-guard-end.h>
25 TArray<FEnvironmentObject> Result;
28 bool FilterByTagEnabled = (TagQueried != crp::CityObjectLabel::Any);
32 if(!FilterByTagEnabled || (It.ObjectLabel == TagQueried))
50 if (!It.Value().IsValid())
61 for(
AActor* Actor : Actors)
64 FString ClassName = Actor->GetClass()->GetName();
66 if(ClassName.Equals(
"BP_Sky_C"))
continue;
99 FileContent += FString::Printf(TEXT(
"Num actors %d\n"), Actors.Num());
100 FileContent += FString::Printf(TEXT(
"Num registered objects %d\n\n"),
EnvironmentObjects.Num());
104 FileContent += FString::Printf(TEXT(
"%llu\t"), Object.Id);
105 FileContent += FString::Printf(TEXT(
"%s\t"), *Object.Name);
106 FileContent += FString::Printf(TEXT(
"%s\t"), *Object.IdStr);
107 FileContent += FString::Printf(TEXT(
"%d\n"),
static_cast<int32
>(Object.Type));
111 FString FilePath = FPaths::ProjectSavedDir() +
"RegisteredObjects.txt";
112 FFileHelper::SaveStringToFile(
115 FFileHelper::EEncodingOptions::AutoDetect,
116 &IFileManager::Get(),
117 EFileWrite::FILEWRITE_Silent);
125 for(uint64 It : EnvObjectIds)
130 if(It == EnvironmentObject.Id)
139 UE_LOG(LogCarla, Error, TEXT(
"EnableEnvironmentObjects id not found %llu"), It);
148 if (EnvObjectIds.Num() == 0)
154 if (EnvObjectIds.Contains(EnvironmentObject.Id))
156 Found.Add(EnvironmentObject.Id);
163 const TSet<uint64>& EnvObjectIds,
164 const TSet<const AActor*>& Actors)
const
167 if (EnvObjectIds.Num() == 0)
173 if (EnvObjectIds.Contains(EnvironmentObject.Id) &&
174 EnvironmentObject.Actor.IsValid() &&
175 Actors.Contains(EnvironmentObject.Actor.Get()))
177 Found.Add(EnvironmentObject.Id);
189 const FString ActorName = Actor->GetName();
190 auto ActorNameAnsichar = StringCast<ANSICHAR>(*ActorName);
191 const char* ActorNameChar = ActorNameAnsichar.Get();
194 EnvironmentObject.
Transform = Actor->GetActorTransform();
195 EnvironmentObject.
Id = CityHash64(ActorNameChar, ActorName.Len());
196 EnvironmentObject.
Name = ActorName;
197 EnvironmentObject.
Actor = Actor;
198 EnvironmentObject.
CanTick = Actor->IsActorTickEnabled();
201 EnvironmentObject.
Type = Type;
224 TArray<FBoundingBox> BBs;
228 check(BBs.Num() == Tags.Num());
230 const FTransform Transform =
TrafficLight->GetTransform();
232 const bool IsActorTickEnabled =
TrafficLight->IsActorTickEnabled();
234 for(
int i = 0; i < BBs.Num(); i++)
237 const uint8 Tag = Tags[i];
242 const FString SMName = FString::Printf(TEXT(
"%s_%s_%d"), *ActorName, *TagString, i);
246 EnvironmentObject.
Id = CityHash64(TCHAR_TO_ANSI(*SMName), SMName.Len());
247 EnvironmentObject.
Name = SMName;
249 EnvironmentObject.
CanTick = IsActorTickEnabled;
257 TArray<UStaticMeshComponent*> StaticMeshComps;
259 for(
const UStaticMeshComponent* Comp : StaticMeshComps)
270 TArray<UInstancedStaticMeshComponent*> ISMComps;
271 Actor->GetComponents<UInstancedStaticMeshComponent>(ISMComps);
273 const FString ActorName = Actor->GetName();
274 int InstanceCount = 0;
275 bool IsActorTickEnabled = Actor->IsActorTickEnabled();
278 if(Cast<AInstancedFoliageActor>(Actor))
283 for(UInstancedStaticMeshComponent* Comp : ISMComps)
285 const TArray<FInstancedStaticMeshInstanceData>& PerInstanceSMData = Comp->PerInstanceSMData;
286 const FTransform CompTransform = Comp->GetComponentTransform();
288 TArray<FBoundingBox> BoundingBoxes;
291 FString CompName = Comp->GetName();
294 for(
int i = 0; i < PerInstanceSMData.Num(); i++)
296 const FInstancedStaticMeshInstanceData& It = PerInstanceSMData[i];
297 const FTransform InstanceTransform = FTransform(It.Transform);
298 const FVector InstanceLocation = InstanceTransform.GetLocation();
301 const int32 X =
static_cast<int32
>(InstanceLocation.X);
302 const int32 Y =
static_cast<int32
>(InstanceLocation.Y);
303 const int32 Z =
static_cast<int32
>(InstanceLocation.Z);
305 const FString InstanceName = FString::Printf(TEXT(
"%s_Inst_%d_%d"), *ActorName, InstanceCount, i);
306 const FString InstanceIdStr = FString::Printf(TEXT(
"%s_%s_%d_%d_%d_%d"), *ActorName, *CompName, X, Y, Z, InstanceCount);
307 uint64 InstanceId = CityHash64(TCHAR_TO_ANSI(*InstanceIdStr), InstanceIdStr.Len());
310 EnvironmentObject.
Transform = InstanceTransform * CompTransform;
311 EnvironmentObject.
Id = InstanceId;
312 EnvironmentObject.
Name = InstanceName;
313 EnvironmentObject.
IdStr = InstanceIdStr;
314 EnvironmentObject.
Actor = Actor;
315 EnvironmentObject.
CanTick = IsActorTickEnabled;
316 if( i < BoundingBoxes.Num())
330 if(Cast<AInstancedFoliageActor>(Actor))
340 TArray<UStaticMeshComponent*> StaticMeshComps;
341 Actor->GetComponents<UStaticMeshComponent>(StaticMeshComps);
343 TArray<FBoundingBox> BBs;
346 check(BBs.Num() == Tags.Num());
348 const FTransform Transform = Actor->GetTransform();
349 const FString ActorName = Actor->GetName();
350 const bool IsActorTickEnabled = Actor->IsActorTickEnabled();
352 for(
int i = 0; i < BBs.Num(); i++)
354 const FString SMName = FString::Printf(TEXT(
"%s_SM_%d"), *ActorName, i);
358 EnvironmentObject.
Id = CityHash64(TCHAR_TO_ANSI(*SMName), SMName.Len());
359 EnvironmentObject.
Name = SMName;
360 EnvironmentObject.
Actor = Actor;
361 EnvironmentObject.
CanTick = IsActorTickEnabled;
373 TArray<USkeletalMeshComponent*> SkeletalMeshComps;
374 Actor->GetComponents<USkeletalMeshComponent>(SkeletalMeshComps);
376 TArray<FBoundingBox> BBs;
379 check(BBs.Num() == Tags.Num());
381 const FTransform Transform = Actor->GetTransform();
382 const FString ActorName = Actor->GetName();
383 const bool IsActorTickEnabled = Actor->IsActorTickEnabled();
385 for(
int i = 0; i < BBs.Num(); i++)
387 const FString SKMName = FString::Printf(TEXT(
"%s_SKM_%d"), *ActorName, i);
391 EnvironmentObject.
Id = CityHash64(TCHAR_TO_ANSI(*SKMName), SKMName.Len());
392 EnvironmentObject.
Name = SKMName;
393 EnvironmentObject.
Actor = Actor;
394 EnvironmentObject.
CanTick = IsActorTickEnabled;
408 switch (EnvironmentObject.
Type)
437 Actor->SetActorHiddenInGame(!Enable);
438 Actor->SetActorEnableCollision(Enable);
441 Actor->SetActorTickEnabled(Enable);
451 TArray<TWeakObjectPtr<const UStaticMeshComponent>> ObjectComps;
454 for(
const TWeakObjectPtr<const UStaticMeshComponent>& Comp : ObjectComps)
460 UStaticMeshComponent*
SMComp =
const_cast<UStaticMeshComponent*
>(Comp.Get());
461 SMComp->SetHiddenInGame(!Enable);
462 ECollisionEnabled::Type CollisionType = Enable ? ECollisionEnabled::Type::QueryAndPhysics : ECollisionEnabled::Type::NoCollision;
463 SMComp->SetCollisionEnabled(CollisionType);
470 TArray<TWeakObjectPtr<const UStaticMeshComponent>> ObjectComps;
471 TArray<FString> InstanceName;
472 FTransform InstanceTransform = EnvironmentObject.
Transform;
475 if (ObjectComps.Num() == 0 || !ObjectComps[0].IsValid())
479 EnvironmentObject.
Name.ParseIntoArray(InstanceName, TEXT(
"_"),
false);
481 int Index = FCString::Atoi(*InstanceName[InstanceName.Num() - 1]);
485 InstanceTransform.SetTranslation(FVector(1000000.0f));
486 InstanceTransform.SetScale3D(FVector(0.0f));
489 UStaticMeshComponent*
SMComp =
const_cast<UStaticMeshComponent*
>(ObjectComps[0].Get());
490 UInstancedStaticMeshComponent*
ISMComp = Cast<UInstancedStaticMeshComponent>(
SMComp);
495 ISMComp->UpdateInstanceTransform(Index, InstanceTransform,
true,
true);
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
Base class for CARLA wheeled vehicles.
static FString GetTagAsString(crp::CityObjectLabel Tag)
Transform a CityObjectLabel into a string.
static crp::CityObjectLabel GetTagOfTaggedComponent(const UPrimitiveComponent &Component)
Retrieve the tag of an already tagged component.
static void GetBBsOfSkeletalMeshComponents(const TArray< USkeletalMeshComponent * > &SkeletalMeshComps, TArray< FBoundingBox > &OutBB, TArray< uint8 > &OutTag, uint8 InTagQueried=0xFF)
static FBoundingBox GetCharacterBoundingBox(const ACharacter *Character, uint8 InTagQueried=0xFF)
static void GetISMBoundingBox(UInstancedStaticMeshComponent *ISMComp, TArray< FBoundingBox > &OutBoundingBox)
static void GetTrafficLightBoundingBox(const ATrafficLightBase *TrafficLight, TArray< FBoundingBox > &OutBB, TArray< uint8 > &OutTag, uint8 InTagQueried=0xFF)
static void GetBBsOfStaticMeshComponents(const TArray< UStaticMeshComponent * > &StaticMeshComps, TArray< FBoundingBox > &OutBB, TArray< uint8 > &OutTag, uint8 InTagQueried=0xFF)
static FBoundingBox GetVehicleBoundingBox(const ACarlaWheeledVehicle *Vehicle, uint8 InTagQueried=0xFF)
static void GetMeshCompsFromActorBoundingBox(const AActor *Actor, const FBoundingBox &InBB, TArray< UStaticMeshComponent * > &OutStaticMeshComps)
void RegisterVehicle(ACarlaWheeledVehicle *Vehicle)
void RegisterSMComponents(AActor *Actor)
TArray< FEnvironmentObject > EnvironmentObjects
void EnableEnvironmentObject(FEnvironmentObject &EnvironmentObject, bool Enable)
TMultiMap< uint64, TWeakObjectPtr< const UStaticMeshComponent > > ObjectIdToComp
void EnableISMComp(FEnvironmentObject &EnvironmentObject, bool Enable)
void EnableEnvironmentObjects(const TSet< uint64 > &EnvObjectIds, bool Enable)
void RegisterTrafficLight(ATrafficLightBase *TrafficLight)
void RegisterEnvironmentObject(AActor *Actor, FBoundingBox &BoundingBox, EnvironmentObjectType Type, uint8 Tag)
void RegisterObjects(TArray< AActor * > Actors)
void RegisterSKMComponents(AActor *Actor)
TSet< uint64 > FindEnvironmentObjectsOf(const TSet< uint64 > &EnvObjectIds, const TSet< const AActor * > &Actors) const
The ids of EnvObjectIds registered now for an actor of Actors.
TArray< FEnvironmentObject > GetEnvironmentObjects(uint8 InTagQueried=0xFF) const
void RegisterCharacter(ACharacter *Character)
void EnableActor(FEnvironmentObject &EnvironmentObject, bool Enable)
void EnableTrafficLight(FEnvironmentObject &EnvironmentObject, bool Enable)
int FoliageActorInstanceCount
TSet< uint64 > FindEnvironmentObjects(const TSet< uint64 > &EnvObjectIds) const
The ids of EnvObjectIds that are registered now.
void RegisterISMComponents(AActor *Actor)
TWeakObjectPtr< AActor > Actor
EnvironmentObjectType Type
crp::CityObjectLabel ObjectLabel