CARLA
Loading...
Searching...
No Matches
TrafficSignBase.h
Go to the documentation of this file.
1// Copyright (c) 2026 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once
8
9#include "GameFramework/Actor.h"
10
11#include "TrafficSignBase.generated.h"
12
13class UBoxComponent;
14
15UENUM(BlueprintType)
16enum class ETrafficSignState : uint8 {
17 Null = 0, // Workarround for UE4.24 issue with enums
18 UNKNOWN = 0u UMETA(DisplayName = "UNKNOWN"),
19 TrafficLightRed = 1u UMETA(DisplayName = "Traffic Light - Red"),
20 TrafficLightYellow = 2u UMETA(DisplayName = "Traffic Light - Yellow"),
21 TrafficLightGreen = 3u UMETA(DisplayName = "Traffic Light - Green"),
22 SpeedLimit_30 UMETA(DisplayName = "Speed Limit - 30"),
23 SpeedLimit_40 UMETA(DisplayName = "Speed Limit - 40"),
24 SpeedLimit_50 UMETA(DisplayName = "Speed Limit - 50"),
25 SpeedLimit_60 UMETA(DisplayName = "Speed Limit - 60"),
26 SpeedLimit_90 UMETA(DisplayName = "Speed Limit - 90"),
27 SpeedLimit_100 UMETA(DisplayName = "Speed Limit - 100"),
28 SpeedLimit_120 UMETA(DisplayName = "Speed Limit - 120"),
29 SpeedLimit_130 UMETA(DisplayName = "Speed Limit - 130"),
30 StopSign UMETA(DisplayName = "Stop Sign"),
31 YieldSign UMETA(DisplayName = "Yield Sign"),
32 // Appended after the original set so serialized values keep their meaning.
33 // Speed limits the regional sign catalog carries (km/h): the OpenDRIVE subtype of a
34 // type-274 signal is always km/h, mph plates are a rendering of the km/h value.
35 SpeedLimit_5 UMETA(DisplayName = "Speed Limit - 5"),
36 SpeedLimit_10 UMETA(DisplayName = "Speed Limit - 10"),
37 SpeedLimit_15 UMETA(DisplayName = "Speed Limit - 15"),
38 SpeedLimit_20 UMETA(DisplayName = "Speed Limit - 20"),
39 SpeedLimit_25 UMETA(DisplayName = "Speed Limit - 25"),
40 SpeedLimit_70 UMETA(DisplayName = "Speed Limit - 70"),
41 SpeedLimit_80 UMETA(DisplayName = "Speed Limit - 80"),
42 SpeedLimit_110 UMETA(DisplayName = "Speed Limit - 110"),
43 /// Any other km/h value; the actual limit is ATrafficSignBase::SpeedLimitKmh (twin builds
44 /// with a US profile convert mph limits, e.g. 35 mph -> 56 km/h).
45 SpeedLimit UMETA(DisplayName = "Speed Limit - custom (km/h)")
46};
47
48/// km/h of a speed-limit state, -1 for any other state (or for the custom state, whose
49/// value lives on the actor).
51{
52 switch (State)
53 {
54 case ETrafficSignState::SpeedLimit_5: return 5;
55 case ETrafficSignState::SpeedLimit_10: return 10;
56 case ETrafficSignState::SpeedLimit_15: return 15;
57 case ETrafficSignState::SpeedLimit_20: return 20;
58 case ETrafficSignState::SpeedLimit_25: return 25;
59 case ETrafficSignState::SpeedLimit_30: return 30;
60 case ETrafficSignState::SpeedLimit_40: return 40;
61 case ETrafficSignState::SpeedLimit_50: return 50;
62 case ETrafficSignState::SpeedLimit_60: return 60;
63 case ETrafficSignState::SpeedLimit_70: return 70;
64 case ETrafficSignState::SpeedLimit_80: return 80;
65 case ETrafficSignState::SpeedLimit_90: return 90;
66 case ETrafficSignState::SpeedLimit_100: return 100;
67 case ETrafficSignState::SpeedLimit_110: return 110;
68 case ETrafficSignState::SpeedLimit_120: return 120;
69 case ETrafficSignState::SpeedLimit_130: return 130;
70 default: return -1;
71 }
72}
73
74/// The dedicated state for a km/h value, ETrafficSignState::SpeedLimit when there is none
75/// (then store the value in ATrafficSignBase::SpeedLimitKmh), UNKNOWN for a non-positive value.
77{
78 if (Kmh <= 0)
79 {
81 }
82 static const ETrafficSignState Dedicated[] = {
83 ETrafficSignState::SpeedLimit_5, ETrafficSignState::SpeedLimit_10, ETrafficSignState::SpeedLimit_15,
84 ETrafficSignState::SpeedLimit_20, ETrafficSignState::SpeedLimit_25, ETrafficSignState::SpeedLimit_30,
85 ETrafficSignState::SpeedLimit_40, ETrafficSignState::SpeedLimit_50, ETrafficSignState::SpeedLimit_60,
86 ETrafficSignState::SpeedLimit_70, ETrafficSignState::SpeedLimit_80, ETrafficSignState::SpeedLimit_90,
87 ETrafficSignState::SpeedLimit_100, ETrafficSignState::SpeedLimit_110, ETrafficSignState::SpeedLimit_120,
88 ETrafficSignState::SpeedLimit_130 };
89 for (ETrafficSignState State : Dedicated)
90 {
91 if (KmhForSpeedLimitState(State) == Kmh)
92 {
93 return State;
94 }
95 }
96 return ETrafficSignState::SpeedLimit;
97}
98
100{
101 return State == ETrafficSignState::SpeedLimit || KmhForSpeedLimitState(State) > 0;
102}
103
104UCLASS()
105class CARLA_API ATrafficSignBase : public AActor {
106
107 GENERATED_BODY()
108
109public:
110
111 ATrafficSignBase(const FObjectInitializer &ObjectInitializer);
112
113 UFUNCTION(BlueprintCallable)
114 ETrafficSignState GetTrafficSignState() const
115 {
116 return TrafficSignState;
117 }
118
119 UFUNCTION(BlueprintCallable)
120 void SetTrafficSignState(ETrafficSignState State)
121 {
122 TrafficSignState = State;
123 }
124
125 /// km/h this sign limits to, -1 when it is not a speed-limit sign. Dedicated states
126 /// answer from the enum; the custom SpeedLimit state answers from SpeedLimitKmh.
127 UFUNCTION(BlueprintCallable)
128 int32 GetSpeedLimitKmh() const
129 {
130 if (TrafficSignState == ETrafficSignState::SpeedLimit)
131 {
132 return SpeedLimitKmh > 0 ? SpeedLimitKmh : -1;
133 }
134 return KmhForSpeedLimitState(TrafficSignState);
135 }
136
137 /// Make this a speed-limit sign for Kmh: picks the dedicated state when one exists,
138 /// the custom state (value kept in SpeedLimitKmh) otherwise.
139 UFUNCTION(BlueprintCallable)
140 void SetSpeedLimitKmh(int32 Kmh)
141 {
142 TrafficSignState = SpeedLimitStateForKmh(Kmh);
143 SpeedLimitKmh = Kmh > 0 ? Kmh : 0;
144 }
145
146 UFUNCTION(BlueprintImplementableEvent)
147 UBoxComponent *GetTriggerVolume() const;
148
149 TArray<UBoxComponent*> GetTriggerVolumes() const;
150
151 /// True once this sign has been snapped to the ground, to avoid adjusting
152 /// it more than once.
153 UPROPERTY(Category = "Traffic Sign", VisibleAnywhere, BlueprintReadOnly, Transient)
154 bool bPositioned = false;
155
156 /// True for signs/lights generated from the OpenDRIVE map. Height adjustment
157 /// only moves generated actors, never signs placed by hand in the level.
158 UPROPERTY(Category = "Traffic Sign", VisibleAnywhere, BlueprintReadOnly, Transient)
159 bool bGeneratedFromOpenDRIVE = false;
160
161private:
162
163 UPROPERTY(Category = "Traffic Sign", EditAnywhere)
165
166 /// Limit in km/h for the custom SpeedLimit state (ignored for the dedicated states).
167 UPROPERTY(Category = "Traffic Sign", EditAnywhere, meta = (ClampMin = "0"))
168 int32 SpeedLimitKmh = 0;
169};
ETrafficSignState SpeedLimitStateForKmh(int32 Kmh)
The dedicated state for a km/h value, ETrafficSignState::SpeedLimit when there is none (then store th...
ETrafficSignState
bool IsSpeedLimitState(ETrafficSignState State)
int32 KmhForSpeedLimitState(ETrafficSignState State)
km/h of a speed-limit state, -1 for any other state (or for the custom state, whose value lives on th...