Retrieve sensor definition from static function
This commit is contained in:
parent
cca42fd618
commit
93809422bd
|
@ -32,6 +32,7 @@ namespace detail {
|
|||
template <size_t Index>
|
||||
struct get_by_index {
|
||||
using type = void;
|
||||
using key = void;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -64,6 +65,12 @@ namespace detail {
|
|||
Value,
|
||||
typename CompileTimeTypeMapImpl<Size, Rest...>::template get_by_index<Index>::type
|
||||
>::type;
|
||||
|
||||
using key = typename std::conditional<
|
||||
Index == current_index(),
|
||||
Key,
|
||||
typename CompileTimeTypeMapImpl<Size, Rest...>::template get_by_index<Index>::key
|
||||
>::type;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -4,12 +4,19 @@
|
|||
// This work is licensed under the terms of the MIT license.
|
||||
// For a copy, see <https://opensource.org/licenses/MIT>.
|
||||
|
||||
#pragma once
|
||||
#ifndef LIBCARLA_SENSOR_REGISTRY_INCLUDE_H
|
||||
#define LIBCARLA_SENSOR_REGISTRY_INCLUDE_H
|
||||
|
||||
#include "carla/sensor/CompositeSerializer.h"
|
||||
|
||||
// =============================================================================
|
||||
// Follow the 4 steps to register a new sensor.
|
||||
// =============================================================================
|
||||
|
||||
// 1. Include the serializer here.
|
||||
#include "carla/sensor/s11n/ImageSerializer.h"
|
||||
|
||||
// 2. Add a forward-declaration of the sensor here.
|
||||
class ADepthCamera;
|
||||
class ASceneCaptureCamera;
|
||||
class ASemanticSegmentationCamera;
|
||||
|
@ -17,6 +24,9 @@ class ASemanticSegmentationCamera;
|
|||
namespace carla {
|
||||
namespace sensor {
|
||||
|
||||
// 3. Register the sensor and its serializer in the SensorRegistry.
|
||||
|
||||
/// Contains a registry of all the sensors available.
|
||||
using SensorRegistry = CompositeSerializer<
|
||||
std::pair<ASceneCaptureCamera *, s11n::ImageSerializer>,
|
||||
std::pair<ADepthCamera *, s11n::ImageSerializer>,
|
||||
|
@ -25,3 +35,14 @@ namespace sensor {
|
|||
|
||||
} // namespace sensor
|
||||
} // namespace carla
|
||||
|
||||
#endif // LIBCARLA_SENSOR_REGISTRY_INCLUDE_H
|
||||
|
||||
#ifdef LIBCARLA_SENSOR_REGISTRY_WITH_SENSOR_INCLUDES
|
||||
|
||||
// 4. Include the sensor here.
|
||||
#include "Carla/Sensor/DepthCamera.h"
|
||||
#include "Carla/Sensor/SceneCaptureCamera.h"
|
||||
#include "Carla/Sensor/SemanticSegmentationCamera.h"
|
||||
|
||||
#endif // LIBCARLA_SENSOR_REGISTRY_WITH_SENSOR_INCLUDES
|
||||
|
|
|
@ -185,14 +185,23 @@ bool UActorBlueprintFunctionLibrary::CheckActorDefinitions(const TArray<FActorDe
|
|||
/// -- Helpers to create actor definitions -------------------------------------
|
||||
/// ============================================================================
|
||||
|
||||
FActorDefinition UActorBlueprintFunctionLibrary::MakeCameraDefinition(
|
||||
const FString &Id)
|
||||
{
|
||||
FActorDefinition Definition;
|
||||
bool Success;
|
||||
MakeCameraDefinition(Id, Success, Definition);
|
||||
check(Success);
|
||||
return Definition;
|
||||
}
|
||||
|
||||
void UActorBlueprintFunctionLibrary::MakeCameraDefinition(
|
||||
const FCameraParameters &Parameters,
|
||||
const FString &Id,
|
||||
bool &Success,
|
||||
FActorDefinition &Definition)
|
||||
{
|
||||
Definition.Id = JoinStrings(TEXT("."), TEXT("sensor"), Parameters.Id).ToLower();
|
||||
Definition.Class = Parameters.Class;
|
||||
Definition.Tags = JoinStrings(TEXT(","), TEXT("sensor"), Parameters.Id).ToLower();
|
||||
Definition.Id = JoinStrings(TEXT("."), TEXT("sensor"), Id).ToLower();
|
||||
Definition.Tags = JoinStrings(TEXT(","), TEXT("sensor"), Id).ToLower();
|
||||
// FOV.
|
||||
FActorVariation FOV;
|
||||
FOV.Id = TEXT("fov");
|
||||
|
|
|
@ -13,18 +13,6 @@
|
|||
|
||||
#include "ActorBlueprintFunctionLibrary.generated.h"
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct CARLA_API FCameraParameters
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||
FString Id;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||
TSubclassOf<AActor> Class;
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct CARLA_API FVehicleParameters
|
||||
{
|
||||
|
@ -73,9 +61,11 @@ public:
|
|||
/// ==========================================================================
|
||||
/// @{
|
||||
|
||||
static FActorDefinition MakeCameraDefinition(const FString &Id);
|
||||
|
||||
UFUNCTION(Category = "Carla Actor", BlueprintCallable)
|
||||
static void MakeCameraDefinition(
|
||||
const FCameraParameters &Parameters,
|
||||
const FString &Id,
|
||||
bool &Success,
|
||||
FActorDefinition &Definition);
|
||||
|
||||
|
|
|
@ -18,6 +18,11 @@ class CARLA_API ADepthCamera : public AShaderBasedSensor
|
|||
|
||||
public:
|
||||
|
||||
static FActorDefinition GetSensorDefinition()
|
||||
{
|
||||
return UActorBlueprintFunctionLibrary::MakeCameraDefinition(TEXT("depth_camera"));
|
||||
}
|
||||
|
||||
ADepthCamera(const FObjectInitializer &ObjectInitializer)
|
||||
: Super(ObjectInitializer)
|
||||
{
|
||||
|
|
|
@ -18,6 +18,11 @@ class CARLA_API ASceneCaptureCamera : public ASceneCaptureSensor
|
|||
|
||||
public:
|
||||
|
||||
static FActorDefinition GetSensorDefinition()
|
||||
{
|
||||
return UActorBlueprintFunctionLibrary::MakeCameraDefinition(TEXT("camera"));
|
||||
}
|
||||
|
||||
using ASceneCaptureSensor::EnablePostProcessingEffects;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -18,6 +18,11 @@ class CARLA_API ASemanticSegmentationCamera : public AShaderBasedSensor
|
|||
|
||||
public:
|
||||
|
||||
static FActorDefinition GetSensorDefinition()
|
||||
{
|
||||
return UActorBlueprintFunctionLibrary::MakeCameraDefinition(TEXT("semseg_camera"));
|
||||
}
|
||||
|
||||
ASemanticSegmentationCamera(const FObjectInitializer &ObjectInitializer)
|
||||
: Super(ObjectInitializer)
|
||||
{
|
||||
|
|
|
@ -10,19 +10,52 @@
|
|||
#include "Carla/Actor/ActorBlueprintFunctionLibrary.h"
|
||||
#include "Carla/Sensor/SceneCaptureCamera.h"
|
||||
|
||||
TArray<FActorDefinition> ADeprecatedSensorFactory::GetDefinitions()
|
||||
#include <compiler/disable-ue4-macros.h>
|
||||
#include <carla/sensor/SensorRegistry.h>
|
||||
#include <compiler/enable-ue4-macros.h>
|
||||
#define LIBCARLA_SENSOR_REGISTRY_WITH_SENSOR_INCLUDES
|
||||
#include <carla/sensor/SensorRegistry.h>
|
||||
#undef LIBCARLA_SENSOR_REGISTRY_WITH_SENSOR_INCLUDES
|
||||
|
||||
/// Call GetSensorDefinition() on each sensor registered in the SensorRegistry.
|
||||
class FSensorDefinitionGatherer
|
||||
{
|
||||
FActorDefinition Cameras;
|
||||
bool Success = false;
|
||||
UActorBlueprintFunctionLibrary::MakeCameraDefinition(
|
||||
{TEXT("camera"), ASceneCaptureCamera::StaticClass()},
|
||||
Success,
|
||||
Cameras);
|
||||
check(Success);
|
||||
return {Cameras};
|
||||
using Registry = carla::sensor::SensorRegistry;
|
||||
|
||||
template <size_t Index>
|
||||
static void Append_impl(TArray<FActorDefinition> &Definitions)
|
||||
{
|
||||
using SensorPtrType = typename Registry::get_by_index<Index>::key;
|
||||
using SensorType = typename std::remove_pointer<SensorPtrType>::type;
|
||||
auto Def = SensorType::GetSensorDefinition();
|
||||
Def.Class = SensorType::StaticClass();
|
||||
Definitions.Add(Def);
|
||||
}
|
||||
|
||||
template <size_t... Is>
|
||||
static void Append_impl(
|
||||
TArray<FActorDefinition> &Definitions,
|
||||
std::index_sequence<Is...>)
|
||||
{
|
||||
std::initializer_list<int> ({(Append_impl<Is>(Definitions), 0)...});
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
static void AppendSensorDefinitions(TArray<FActorDefinition> &Definitions)
|
||||
{
|
||||
Append_impl(Definitions, std::make_index_sequence<Registry::size()>());
|
||||
}
|
||||
};
|
||||
|
||||
TArray<FActorDefinition> ASensorFactory::GetDefinitions()
|
||||
{
|
||||
TArray<FActorDefinition> Definitions;
|
||||
FSensorDefinitionGatherer::AppendSensorDefinitions(Definitions);
|
||||
return Definitions;
|
||||
}
|
||||
|
||||
FActorSpawnResult ADeprecatedSensorFactory::SpawnActor(
|
||||
FActorSpawnResult ASensorFactory::SpawnActor(
|
||||
const FTransform &Transform,
|
||||
const FActorDescription &Description)
|
||||
{
|
||||
|
@ -32,7 +65,8 @@ FActorSpawnResult ADeprecatedSensorFactory::SpawnActor(
|
|||
{
|
||||
return {};
|
||||
}
|
||||
auto *Sensor = World->SpawnActorDeferred<ASceneCaptureCamera>(
|
||||
/// @todo Here we may spawn something else than a scene capture.
|
||||
auto *Sensor = World->SpawnActorDeferred<ASceneCaptureSensor>(
|
||||
Description.Class,
|
||||
Transform,
|
||||
this,
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
/// Object in charge of spawning sensors.
|
||||
UCLASS()
|
||||
class CARLA_API ADeprecatedSensorFactory : public ACarlaActorFactory
|
||||
class CARLA_API ASensorFactory : public ACarlaActorFactory
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
|
Loading…
Reference in New Issue