Skip to content

Commit d86cc03

Browse files
LuisPovedaCanoBlyron
authored andcommitted
Add StaticMeshActor support in MakePropDefinition.
Enhance actor spawning logic in APropActorFactory with detailed error handling and component validation
1 parent 50cb972 commit d86cc03

File tree

2 files changed

+76
-9
lines changed

2 files changed

+76
-9
lines changed

Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Actor/ActorBlueprintFunctionLibrary.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "Carla/Sensor/ShaderBasedSensor.h"
1616
#include "Carla/Util/ScopedStack.h"
1717
#include "BlueprintLibary/PostProcessJsonUtils.h"
18+
#include "Engine/StaticMeshActor.h"
1819

1920
#include <algorithm>
2021
#include <limits>
@@ -1063,6 +1064,16 @@ void UActorBlueprintFunctionLibrary::MakePropDefinition(
10631064
FillIdAndTags(Definition, TEXT("static"), TEXT("prop"), Parameters.Name);
10641065
AddRecommendedValuesForActorRoleName(Definition, {TEXT("prop")});
10651066

1067+
Definition.Class = AStaticMeshActor::StaticClass();
1068+
if (Parameters.Mesh != nullptr)
1069+
{
1070+
Definition.Variations.Emplace(FActorVariation{
1071+
TEXT("mesh_path"),
1072+
EActorAttributeType::String,
1073+
{Parameters.Mesh->GetPathName()},
1074+
false});
1075+
}
1076+
10661077
auto GetSize = [](EPropSize Value)
10671078
{
10681079
switch (Value)
@@ -1364,7 +1375,6 @@ void UActorBlueprintFunctionLibrary::SetCamera(
13641375

13651376
FString PostProcessDefaultName = RetrieveActorAttributeToString("post_process_profile",
13661377
Description.Variations, TEXT("default"));
1367-
13681378
UPostProcessJsonUtils::LoadAllPostProcessFromJsonToSceneCapture(
13691379
Camera->GetCaptureComponent(),
13701380
PostProcessDefaultName);

Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Actor/Factory/PropActorFactory.cpp

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
#include "JsonUtilities.h"
1616
#include "Misc/FileHelper.h"
1717
#include "Misc/Paths.h"
18+
#include "Engine/StaticMeshActor.h"
19+
#include "Components/StaticMeshComponent.h"
1820
#include <util/ue-header-guard-end.h>
1921

2022
TArray<FActorDefinition> APropActorFactory::GetDefinitions()
2123
{
2224
LoadPropParametersArrayFromFile("PropParameters.json", PropsParams);
23-
25+
2426
UActorBlueprintFunctionLibrary::MakePropDefinitions(PropsParams, Definitions);
2527
return Definitions;
2628
}
@@ -37,22 +39,77 @@ FActorSpawnResult APropActorFactory::SpawnActor(
3739
return SpawnResult;
3840
}
3941

40-
AActor* SpawnedActor = GetWorld()->SpawnActor<AActor>(ActorDescription.Class, SpawnAtTransform);
41-
SpawnResult.Actor = SpawnedActor;
42+
FActorSpawnParameters SpawnParameters;
43+
SpawnParameters.SpawnCollisionHandlingOverride =
44+
ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
45+
46+
AStaticMeshActor* StaticMeshActor = GetWorld()->SpawnActor<AStaticMeshActor>(
47+
ActorDescription.Class, SpawnAtTransform, SpawnParameters);
48+
49+
SpawnResult.Actor = StaticMeshActor;
4250

43-
if(SpawnedActor == nullptr)
51+
if(StaticMeshActor == nullptr)
4452
{
4553
SpawnResult.Status = EActorSpawnResultStatus::Collision;
4654
return SpawnResult;
4755
}
4856

49-
if(PostProcessProp(SpawnedActor, ActorDescription))
57+
UStaticMeshComponent* StaticMeshComponent = Cast<UStaticMeshComponent>(
58+
StaticMeshActor->GetRootComponent());
59+
60+
if (!StaticMeshComponent)
61+
{
62+
UE_LOG(LogCarla, Error, TEXT("Prop spawn failed: StaticMeshComponent is null for actor %s"),
63+
*ActorDescription.Id);
64+
StaticMeshActor->Destroy();
65+
SpawnResult.Status = EActorSpawnResultStatus::UnknownError;
66+
return SpawnResult;
67+
}
68+
69+
if (!ActorDescription.Variations.Contains("mesh_path"))
70+
{
71+
UE_LOG(LogCarla, Error, TEXT("Prop spawn failed: No mesh_path variation found for actor %s"),
72+
*ActorDescription.Id);
73+
StaticMeshActor->Destroy();
74+
SpawnResult.Status = EActorSpawnResultStatus::InvalidDescription;
75+
return SpawnResult;
76+
}
77+
78+
FString MeshPath = UActorBlueprintFunctionLibrary::ActorAttributeToString(
79+
ActorDescription.Variations["mesh_path"], "");
80+
81+
if (MeshPath.IsEmpty())
82+
{
83+
UE_LOG(LogCarla, Error, TEXT("Prop spawn failed: mesh_path is empty for actor %s"),
84+
*ActorDescription.Id);
85+
StaticMeshActor->Destroy();
86+
SpawnResult.Status = EActorSpawnResultStatus::InvalidDescription;
87+
return SpawnResult;
88+
}
89+
90+
UStaticMesh* Mesh = LoadObject<UStaticMesh>(nullptr, *MeshPath);
91+
if (Mesh == nullptr)
92+
{
93+
UE_LOG(LogCarla, Error, TEXT("Prop spawn failed: Failed to load mesh '%s' for actor %s"),
94+
*MeshPath, *ActorDescription.Id);
95+
StaticMeshActor->Destroy();
96+
SpawnResult.Status = EActorSpawnResultStatus::UnknownError;
97+
return SpawnResult;
98+
}
99+
100+
StaticMeshComponent->SetMobility(EComponentMobility::Movable);
101+
if (!StaticMeshComponent->SetStaticMesh(Mesh))
50102
{
51-
SpawnResult.Status = EActorSpawnResultStatus::Success;
103+
UE_LOG(LogCarla, Error, TEXT("Prop spawn failed: Failed to set mesh '%s' for actor %s"),
104+
*MeshPath, *ActorDescription.Id);
105+
StaticMeshActor->Destroy();
106+
SpawnResult.Status = EActorSpawnResultStatus::UnknownError;
52107
return SpawnResult;
53108
}
54109

55-
SpawnResult.Status = EActorSpawnResultStatus::UnknownError;
110+
StaticMeshComponent->SetMobility(EComponentMobility::Static);
111+
PostProcessProp(StaticMeshActor, ActorDescription);
112+
SpawnResult.Status = EActorSpawnResultStatus::Success;
56113
return SpawnResult;
57114
}
58115

@@ -226,4 +283,4 @@ void APropActorFactory::LoadPropParametersArrayFromFile(const FString& FileName,
226283
{
227284
UE_LOG(LogCarla, Error, TEXT("Failed to load file: %s"), *FilePath);
228285
}
229-
}
286+
}

0 commit comments

Comments
 (0)