50 const FTransform &SpawnAtTransform,
54 auto *World = GetWorld();
57 UE_LOG(LogCarla, Error, TEXT
58 (
"AStaticMeshFactory: cannot spawn mesh into an empty world."));
62 float Scale = ABFL::RetrieveActorAttributeToFloat(
"scale", ActorDescription.
Variations, 1.0f);
63 FTransform ScaledTransform(SpawnAtTransform);
64 ScaledTransform.SetScale3D(FVector(Scale));
69 UStaticMesh* Mesh =
nullptr;
70 if (ActorDescription.
Variations.Contains(
"mesh_path"))
72 MeshPath = ABFL::ActorAttributeToString(ActorDescription.
Variations[
"mesh_path"],
"");
73 if (MeshPath.IsEmpty())
77 UE_LOG(LogCarla, Error,
78 TEXT(
"AStaticMeshFactory: empty mesh_path for actor %s; spawn refused."),
79 *ActorDescription.
Id);
81 Failed.
Status = EActorSpawnResultStatus::InvalidDescription;
92 Mesh = LoadObject<UStaticMesh>(
nullptr, *MeshPath);
100 UE_LOG(LogCarla, Error,
101 TEXT(
"AStaticMeshFactory: failed to load mesh '%s' for actor %s; spawn refused."),
102 *MeshPath, *ActorDescription.
Id);
104 Failed.
Status = EActorSpawnResultStatus::InvalidDescription;
110 FActorSpawnParameters SpawnParameters;
111 SpawnParameters.SpawnCollisionHandlingOverride =
112 ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
113 auto *StaticMeshActor = World->SpawnActor<AStaticMeshActor>(
114 ActorDescription.
Class, ScaledTransform, SpawnParameters);
116 auto *StaticMeshComponent = Cast<UStaticMeshComponent>(
117 StaticMeshActor->GetRootComponent());
119 if (StaticMeshComponent)
121 if (ActorDescription.
Variations.Contains(
"mesh_path"))
123 StaticMeshComponent->SetMobility(EComponentMobility::Movable);
124 if (!StaticMeshComponent->SetStaticMesh(Mesh))
126 UE_LOG(LogCarla, Warning,
127 TEXT(
"AStaticMeshFactory: failed to set mesh '%s' on actor %s."),
128 *MeshPath, *ActorDescription.
Id);
130 StaticMeshComponent->SetMobility(EComponentMobility::Static);
132 if (ActorDescription.
Variations.Contains(
"mass"))
134 float Mass = ABFL::RetrieveActorAttributeToFloat(
"mass", ActorDescription.
Variations, 0.0f);
137 StaticMeshComponent->SetMobility(EComponentMobility::Movable);
138 StaticMeshComponent->SetSimulatePhysics(
true);
139 StaticMeshComponent->SetCollisionProfileName(
"PhysicsActor");
140 StaticMeshComponent->SetMassOverrideInKg(
"", Mass);