diff --git a/Source/Carla/RoadIntersection.cpp b/Source/Carla/RoadIntersection.cpp new file mode 100644 index 000000000..717558273 --- /dev/null +++ b/Source/Carla/RoadIntersection.cpp @@ -0,0 +1,61 @@ +// CARLA, Copyright (C) 2017 Computer Vision Center (CVC) + +#include "Carla.h" +#include "RoadIntersection.h" + +ARoadIntersection::ARoadIntersection(const FObjectInitializer& ObjectInitializer) : + Super(ObjectInitializer) +{ + PrimaryActorTick.bCanEverTick = false; + + RootComponent = + ObjectInitializer.CreateDefaultSubobject(this, TEXT("RootComponent")); + RootComponent->SetMobility(EComponentMobility::Static); + +#define CARLA_CREATE_STATIC_MESH_COMPONENT(Mesh) \ + { \ + auto Component = CreateDefaultSubobject(TEXT(#Mesh) TEXT("Component")); \ + Component->SetMobility(EComponentMobility::Static); \ + Component->SetupAttachment(RootComponent); \ + StaticMeshComponents.Add(Component); \ + StaticMeshes.Add(ERoadIntersectionItem:: Mesh, nullptr); \ + } + CARLA_CREATE_STATIC_MESH_COMPONENT(Lane0) + CARLA_CREATE_STATIC_MESH_COMPONENT(Lane1) + CARLA_CREATE_STATIC_MESH_COMPONENT(Lane2) + CARLA_CREATE_STATIC_MESH_COMPONENT(Lane3) + CARLA_CREATE_STATIC_MESH_COMPONENT(Sidewalk0) + CARLA_CREATE_STATIC_MESH_COMPONENT(Sidewalk1) + CARLA_CREATE_STATIC_MESH_COMPONENT(Sidewalk2) + CARLA_CREATE_STATIC_MESH_COMPONENT(Sidewalk3) + CARLA_CREATE_STATIC_MESH_COMPONENT(LaneMarking) +#undef CARLA_CREATE_STATIC_MESH_COMPONENT +} + +#if WITH_EDITOR +void ARoadIntersection::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) +{ + Super::PostEditChangeProperty(PropertyChangedEvent); + if (PropertyChangedEvent.Property) { + UpdateMeshes(); + } +} +#endif // WITH_EDITOR + +void ARoadIntersection::SetStaticMesh(ERoadIntersectionItem Item, UStaticMesh *StaticMesh) +{ + if (static_cast(Item) < StaticMeshes.Num()) { + StaticMeshes[Item] = StaticMesh; + } +} + +void ARoadIntersection::UpdateMeshes() +{ + check(StaticMeshes.Num() == StaticMeshComponents.Num()); + int32 i = 0; + for (auto Item : StaticMeshes) { + check(StaticMeshComponents[i] != nullptr); + StaticMeshComponents[i]->SetStaticMesh(Item.Value); + ++i; + } +} diff --git a/Source/Carla/RoadIntersection.h b/Source/Carla/RoadIntersection.h new file mode 100644 index 000000000..de4720390 --- /dev/null +++ b/Source/Carla/RoadIntersection.h @@ -0,0 +1,49 @@ +// CARLA, Copyright (C) 2017 Computer Vision Center (CVC) + +#pragma once + +#include "GameFramework/Actor.h" +#include "Components/StaticMeshComponent.h" +#include "RoadIntersection.generated.h" + +UENUM(BlueprintType) +enum class ERoadIntersectionItem : uint8 +{ + Lane0 UMETA(DisplayName = "Lane 1"), + Lane1 UMETA(DisplayName = "Lane 2"), + Lane2 UMETA(DisplayName = "Lane 3"), + Lane3 UMETA(DisplayName = "Lane 4"), + Sidewalk0 UMETA(DisplayName = "Sidewalk 1"), + Sidewalk1 UMETA(DisplayName = "Sidewalk 2"), + Sidewalk2 UMETA(DisplayName = "Sidewalk 3"), + Sidewalk3 UMETA(DisplayName = "Sidewalk 4"), + LaneMarking UMETA(DisplayName = "LaneMarking"), +}; + +/// A road intersection. +UCLASS() +class CARLA_API ARoadIntersection : public AActor +{ + GENERATED_BODY() + +public: + + ARoadIntersection(const FObjectInitializer& ObjectInitializer); + +#if WITH_EDITOR + virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; +#endif // WITH_EDITOR + + UFUNCTION(BlueprintCallable) + void SetStaticMesh(ERoadIntersectionItem Item, UStaticMesh *StaticMesh); + +private: + + void UpdateMeshes(); + + UPROPERTY() + TArray StaticMeshComponents; + + UPROPERTY(Category = "Meshes", EditAnywhere) + TMap StaticMeshes; +};