65 bool LoadOpenDrive(
const FString &OpenDrive);
68 const FString &GetOpenDrive()
const;
71 bool IsOpenDriveValid()
const;
74 void GenerateRoadMesh();
90 void GenerateGroundPlane();
105 void GenerateMedianFill();
108 void GenerateCrosswalkMesh();
112 void GenerateLaneMarkings();
122 void GeneratePoles();
125 bool IsStreetFurnitureGenerating()
const;
128 void GenerateSpawnPoints();
134 virtual void BeginPlay()
override;
138 UPROPERTY(Category =
"Spawners", EditAnywhere)
139 float SpawnersHeight = 300.f;
141 UPROPERTY(Category = "Spawners", EditAnywhere)
144 UPROPERTY(EditAnywhere)
145 FString OpenDriveData;
147 UPROPERTY(EditAnywhere)
148 TArray<TObjectPtr<
AActor>> ActorMeshList;
154 FBox RoadMeshBounds = FBox(ForceInit);
170 float DriveMinZ = 0.0f;
171 float DriveMaxZ = 0.0f;
172 float PavedMinZ = 0.0f;
173 float DistToDrive = -1.0f;
174 float DistToPaved = -1.0f;
175 float NearestPavedMinZ = 0.0f;
180 float GapSurfaceZ = FLT_MAX;
188 uint8 bDriveCovered = 0;
191 float CellSize = 250.0f;
192 float OriginX = 0.0f;
193 float OriginY = 0.0f;
198 bool IsValid()
const {
return Width > 0 && Height > 0; }
199 void Initialize(
const FBox &Bounds,
float InCellSize);
202 void RasterizeTriangle(
const FVector &A,
const FVector &B,
const FVector &C,
bool bIsDrive);
205 void BuildDistanceFields();
206 const FCell *CellAtWorld(
float X,
float Y)
const;
212 void DumpRasterAt(
float X,
float Y)
const;
218 UPROPERTY(Category =
"Materials", EditAnywhere)
219 TSoftObjectPtr<UMaterialInterface> RoadMaterial = TSoftObjectPtr<UMaterialInterface>(
220 FSoftObjectPath(TEXT("/Game/Carla/Static/GenericMaterials/Roads/MI_RoadAsphalt_Town15.MI_RoadAsphalt_Town15")));
223 UPROPERTY(Category = "Materials", EditAnywhere)
224 TSoftObjectPtr<UMaterialInterface> SidewalkMaterial = TSoftObjectPtr<UMaterialInterface>(
225 FSoftObjectPath(TEXT("/Game/Carla/Static/GenericMaterials/Sidewalk/MI_Sidewalk_Apartment.MI_Sidewalk_Apartment")));
234 UPROPERTY(Category = "Materials", EditAnywhere)
235 TSoftObjectPtr<UMaterialInterface> GroundMaterial = TSoftObjectPtr<UMaterialInterface>(
236 FSoftObjectPath(TEXT("/Game/Carla/Static/GenericMaterials/Ground/MI_LargeLandscape_Grass.MI_LargeLandscape_Grass")));
243 UPROPERTY(Category = "Materials", EditAnywhere)
244 TSoftObjectPtr<UMaterialInterface> CrosswalkMaterial = TSoftObjectPtr<UMaterialInterface>(
245 FSoftObjectPath(TEXT("/Game/Carla/Static/GenericMaterials/Roads/MI_Road_Asphalt_B_LaneMarkingWhite.MI_Road_Asphalt_B_LaneMarkingWhite")));
252 UPROPERTY(Category = "Materials", EditAnywhere)
253 TSoftObjectPtr<UMaterialInterface> LaneMarkingWhiteMaterial = TSoftObjectPtr<UMaterialInterface>(
254 FSoftObjectPath(TEXT("/Game/Carla/Static/GenericMaterials/Roads/MI_Road_Asphalt_B_LaneMarkingWhite.MI_Road_Asphalt_B_LaneMarkingWhite")));
257 UPROPERTY(Category = "Materials", EditAnywhere)
258 TSoftObjectPtr<UMaterialInterface> LaneMarkingYellowMaterial = TSoftObjectPtr<UMaterialInterface>(
259 FSoftObjectPath(TEXT("/Game/Carla/Static/GenericMaterials/Roads/MI_Road_Asphalt_B_LaneMarkingYellow.MI_Road_Asphalt_B_LaneMarkingYellow")));
263 UPROPERTY(Category = "Materials", EditAnywhere)
264 float DecalZOffset = 1.5f;
271 UPROPERTY(Category = "Materials", EditAnywhere)
272 float GroundPlaneZOffset = 5.0f;
277 UPROPERTY(Category = "Materials", EditAnywhere)
278 float MedianFillMaxWidth = 600.0f;
284 UPROPERTY(Category = "Materials", EditAnywhere)
285 float MedianFillMaxHeightDelta = 100.0f;
292 UPROPERTY(Category = "Materials", EditAnywhere)
293 float GroundSkirtWidth = 1000.0f;
297 UPROPERTY(Category = "Materials", EditAnywhere)
298 float GroundHeightSampleCellSize = 250.0f;
309 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
310 float LampRoadClearance = 50.0f;
312 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
313 float VegetationRoadClearance = 250.0f;
315 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
316 float SignageRoadClearance = 50.0f;
322 TArray<
float> GroundGridHeights;
323 int32 GroundGridNumX = 0;
324 int32 GroundGridNumY = 0;
325 FVector2D GroundGridOrigin = FVector2D::ZeroVector;
326 float GroundGridStepX = 0.0f;
327 float GroundGridStepY = 0.0f;
331 float SampleGroundGridHeight(
float X,
float Y) const;
336 UPROPERTY(Category = "Materials", EditAnywhere)
337 float GroundPlanePadding = 5000.0f;
343 UPROPERTY(Category = "Materials", EditAnywhere)
344 float GroundUVTileSize = 500.0f;
354 UPROPERTY(Category = "
Street Furniture", VisibleDefaultsOnly, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
355 TObjectPtr<UPCGComponent> PCGComponent;
363 UPROPERTY(Category = "
Street Furniture", VisibleDefaultsOnly, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
364 TObjectPtr<UBoxComponent> PCGBoundsComponent;
368 FBox FurnitureAnchorBounds = FBox(ForceInit);
376 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
377 TSoftObjectPtr<UPCGGraphInterface> StreetFurnitureGraph;
380 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
381 int32 StreetFurnitureSeed = 42;
384 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
385 FName LampAnchorTag = FName("PCG_StreetLampAnchor");
388 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
389 float LampAnchorSpacing = 30.0f;
398 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
399 float LampAnchorOffset = 1.0f;
402 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
403 FName VegetationAnchorTag = FName("PCG_VegetationAnchor");
408 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
409 float VegetationAnchorSpacing = 15.0f;
413 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
414 float VegetationAnchorOffset = 6.0f;
420 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
421 FName SignageAnchorTag = FName("PCG_SignageAnchor");
426 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
427 float SignageAnchorSpacing = 150.0f;
432 UPROPERTY(Category = "
Street Furniture", EditAnywhere)
433 float SignageAnchorOffset = 1.0f;
442 int32 GenerateFurnitureAnchors(
443 const FName &Tag,
float Spacing,
float Offset,
float RoadClearance,
444 bool bMeasureFromCurb,
bool bKeepOnSidewalk,
float SOffset);
463 void RunGenerationQA();
473 UPROPERTY(Category = "Generation QA", EditAnywhere)
474 float QASupportGapMax = 30.0f;
478 UPROPERTY(Category = "Generation QA", EditAnywhere)
479 float QAStackedRoadGap = 400.0f;