
This update introduces variable-width Paths, brings further landscape adjustment improvements and memory savings, adds new spawning and template options, and includes a large number of fixes and optimizations.
Deprecations
We deprecated configuring landscape adjustment via PathSplines. Using this option triggers a Blueprint compilation error now. Use the dedicated Landscape Adjustment Spline (
EpLandscapeAdjustmentSplineComponent) instead. Existing PathSpline adjustment data is preserved internally so the Batch Upgrade Tool can still migrate old assets.The deprecated ability to override PathLayers for a PathTemplate has been removed in Errant Paths 1.2. Originally, it was needed to handle assets created before EP 1.0 release. However, it introduced complexity and cluttered UI for a marginal gain in flexibility. PathLayers need to be assigned per component now.
A new version of the Asset Library has been published that no longer relies on the override.
Features
Mesh Terrain
- Paths can now adjust Mesh Terrain.
TODO: What are the limitations?
Shallow Water integration
TODO: New example, uses new actor spawning to spawn Shallow Water, uses Gen Callbacks to configure the actors, adjusts the landscape normally and additively, paints weightmaps, removes foliage? Shallow Water uses the custom splines spawned by the Path.
Variable-width Paths
- You can now make parts of a Path wider or narrower by scaling PathSpline points.
Each mesh can be set to react differently to that scaling in one of three modes:
- fixed size - useful for lane markings in the center of a road
- move only - useful for road signs and guardrails that need to stay on the edge of a road
- move and scale - useful for the asphalt and concrete that need to get wider with the road
PathSpline
Landscape-relative projection - we added a tool for adjusting PathSpline points' height above the landscape. By pressing Ctrl + W and scrolling the mouse wheel you can project Paths or a section of a Path to the landscape or at a given height above the landscape.
You can also define the preferred heights that the tool snaps to in a PathDescription. Such preferred heights could represent the heights for each level of a highway in a complex interchange or subway tunnels at different depths.

Pressing Ctrl + W and clicking midle mouse button (MMB) resets the adjustment to the landscape height and clicking right mouse button (RMB) resets the adjustment to the original height.
This tool is used during Path editing and is separate from projection onto geometry/landscape performed during Path generation. Both of these systems can be used together.
A Path that is projected onto a uneven terrain during editing is usually still below or above the landscape in between the PathSpline points and may still require additional projection during the generation.
A good example of a Path that beenfits from both of these projections is a dirt trail, as it needs to follow the terrain shape closely in between the PathSpline points.
Path spline post-processing - You can now process Path splines using custom logic defined in Blueprints or C++ (derived from
UEpPathAdjustment). This opens the door for all kinds of custom processing, such as:- ensuring the Path doesn't exceed a certain incline
- ensuring the turn radius is changing gradually
- clamping the turn radius based on the road type
- automated addition of roll in turns, and much more.
The built-in path adjustments we had before, such as dividing the spline into regular segments, smoothing, projecting onto a landscape, and vertical offset have been converted to these post-processing stages and can now be applied at arbitrary order. Migrating to this system doesn't require any user action, as settings are converted automatically.

Perturbing the Path - as one of the new PathAdjustments, we added an option to perturb the PathSpline. This option is useful for rivers, trails, embankments, and damaged structures.

Blend Distance for Project Onto Landscape - One challenge of using Project Onto Landscape was the abrupt change of Path height near the first and last points of a Path, when first/last points were not projected on the landscape. To solve this problem, we introduced a setting that controls how quickly the projection is blended in at the start/end of the Path.
Landscape Adjustment
Detail Texture support - Weightmap/BiomesMask adjustments can now be driven from textures, similarly to Height adjustment. This allows adding a more natural perturbation to landscape coloring and foliage near roads, trails and rivers.

Weightmap/BiomesMask value control - up until now, Paths were always writing a value of one to weightmaps/BiomesMasks, multiplied by the optional curve value. This release adds a setting for controlling which value is written, sparing users the pain of creating custom curves to adjust the value. It also allows clearing weightmap values by writing a zero or subtracting from a weigthmap by writing a negative value using an Additive adjustment strategy.

Lower memory usage for landscape adjustment - internal landscape adjustment meshes are no longer cached to disk and loaded to memory as soon as the Path is streamed in. They're now regenerated on demand, when a given Path needs to adjust the landscape for the first time (in the current Editor session). We also now unload these meshes from memory if a Path is not getting regenerated at least once every few minutes.
This allowed us to significantly reduce the memory usage in Editor for maps with many Paths, without a noticable loss of generation performance.
By not caching these meshes, we also solved a rare crash that occured for some users, where selected adjustment meshes would fail to load from the Derived Data Cache.
Spawning
Spawn actors from a Path - Paths now have a smarter way to spawn actors. Previously, users could use a ChildActorComponent in a PathTemplate to spawn actors. However, actors spawned this way would get recreated each time the level was loaded and each time the related ChildActorComponent was modified or reregistered. The new solution for spawning actors allows the Path to manage the actor's lifetime, recreating the actors only during the Path generation, similarly to Path components.
To spawn an actor using the new method, add a
UEpPathTemplateChildActorComponentin a PathTemplate and select a class it should spawn.Max distance for cables/attachments - You can now set a maximum length for a cable/attachment to prevent unintended connections.

- Sample connected Path Labels - when a SpawnCondition offset moves the sampling point outside of the current Path, it now correctly samples Labels from the connected Path instead. A potental use-case for this feature for things like right-of-way markings at intersections.
Asset Library
- Expanded the Asset Library with new examples: a T-shaped intersection, a roundabout, dirt path, fence and river.
User Interface
Buttons related to Path generation are now separated from the editing tools.

We moved PCG interaction settings from Path properties to the Errant Paths menu and added an extra option for interacting with PCG (see tooltips).

Path direction is now visualized as arrows on the pink visualization. We also added a grey visualization when connecting paths. Displaying Path directions helps prevent mistakes such as connecting Paths backwards and creating a small loop.

We added a button to realign two connected Paths that have got misaligned for any reason. Previously, users needed to disconnect and reconnect such Paths, which was inconvenient.

Right-click context menu of a Path now has a new entry that navigates to the Landscape/Biomes Adjustment Properties of the Path.

We added a checkbox that allows disabling adjustment curves in Landscape/Biomes Adjustment Properties without clearing the properties.

Possible viewport actions are now displayed in a more readable way.

Improvements
You don't need to hold Shift to force regenerate a Path anymore. All aspects of the Path are now regenerated on each generation, even if the Path doesn't seem to require regeneration. We made this change, because it seems that most users, including ourselves, always regenerate Paths while holding Shift and it simply became an inconvenience.
SubActors are now reused instead of being deleted and recreated on every update, which prevents unnecessary file adds and deletions in source control.
Paths inside Level Instances can no longer be edited or clicked unless the Level Instance is in Edit mode, preventing accidental edits. This also fixes Paths resetting and leaving ghost SubActors when entering/exiting Level Instance edit mode.
EpProjectComponentOntoGeometryGeneration Callback can now be called from PostSpawn or Pre/PostLandscapeAdjustment, giving you more control over when components gets projected onto landscape.Paths can now log what system dirtied them, which is useful for debugging accidental Path modifications. The logging can be enabled in Editor Preferences -> Errant Paths -> Log Callstack When Path Gets Modified.
Assets now store metadata recording which plugin version they were last saved with. This allows us to detect which assets require upgrades without loading them into memory, making the future upgrades faster.
Improved the text of the
BatchUpgradePathTemplatesSuccessnotification for clarity.
Performance
We now cache Path visualization mesh data instead of rebuilding it every frame. This improved editor performance when entering the Spawn, Cut, Connect or Ctrl+Q tools on maps with many Paths.
We fixed freezing landscape adjustment when Incremental Update is disabled, for maps with many Paths.
Bug Fixes
Crash Fixes
- Fixed a crash in landscape adjustment.
- Fixed a crash when compiling a PathTemplate (e.g. after renaming/duplicating StaticMesh components).
- Fixed a crash when dragging a plain static mesh onto an EPT.
- Fixed a crash when adding a non-SceneComponent to a PathTemplate.
- Fixed a crash in
AlignPathEnds. - Fixed a crash in
FindHoveredPath. - Fixed a crash in
FEpGeneralTool::FindAllPathConnectablePoints. - Fixed a crash when adjusting landscape after undoing Path spawning.
- Fixed a crash that could occur when collecting garbage after a non-incremental Path update.
Generation Fixes
- Fixed generation not progressing on UE 5.6 until all Paths were unselected.
- Fixed several issues affecting Errant Paths on UE 5.8.
- Fixed Paths spawned from a Blueprint resetting on every level reload or Editor restart.
- Fixed deleting a Path not clearing the landscape, including the edge case where it was the last Path on the level.
- Fixed Biomes not being cleared when a Path is cleared.
- Fixed being unable to regenerate a Path after its MainPathSpline was deleted.
- Fixed faulty Paths getting stuck in
CompleteUpdateOfDirtyPathsinstead of being skipped. - Reduced unnecessary Map/Level dirtying triggered by Path generation.
- Fixed landscape adjustment being cleared even when a Path didn't have the LandscapeBiomes update flag set.
- Fixed Map errors caused by adding Water plugins as dependencies.
- Fixed a bug in the commandlet that prevented World Partition regions from unloading.
- Fixed the commandlet creating duplicate SubActors.
- Fixed the commandlet failing to submit all modified files.
Landscape Adjustment Fixes
- Fixed glitching landscape adjustment.
- Fixed landscape adjustment having sharp edges on very sharp turns.
- Fixed BiomesMasks not being written to when the Landscape Adjustment Spline has the same length as the MainPathSpline.
- Fixed one Path's landscape adjustment breaking a nearby Path's adjustment.
- Fixed BiomesMasks affected by Paths sometimes not working until Weightmap adjustment was enabled once.
- Fixed Paths failing to paint Masks after a Level was converted to World Partition.
- Fixed the lateral height shape curve not being used.
- Fixed a Path still adjusting its old Edit Layer after the LandscapeLayer name was changed in PathDesc.
- Fixed Paths that only adjust the landscape being incorrectly marked as modified.
- Fixed copying Height adjustment settings to Weightmap adjustment settings leaving some relevant settings hidden.
- Fixed incorrect landscape adjustment from nearby Paths that are only partially loaded.
- Fixed some Paths loading World Partition infinitely far in +X/+Y.
- Removed an overly complex landscape adjustment mesh (1.3M+ vertices) that could slow down generation.
Path Editing & Connecting Fixes
- Fixed deleting middle PathSpline points removing connections.
- Fixed connecting a Path to an intersection bending the intersection's PathSplines.
- Fixed moving a PathSpline point often corrupting the nearby connected end of the Path.
- Fixed Disconnect not working when multiple Paths were selected.
- Fixed the Ctrl+Q pink outline not updating with cursor movement when the camera is close to a Path.
- Fixed roads sometimes not aligning roll properly to an intersection.
- Fixed the Cut indicator not being visible.
- Fixed duplicating a Path dirtying its connected Paths.
- Fixed a reversed Path's origin not updating until reselection.
- Fixed new PathSpline points not respecting snap size and rotation increments.
- Fixed selection being lost when entering the Spawn tool while creating Paths from existing splines.
- Fixed AutoGeneration deselecting a PathSpline point when adding new points.
- Fixed Connect always adding a new segment, even when one wasn't needed.
- Fixed
FEpGeneralTool::Connectionspotentially being rendered twice. - Fixed
SplineUtils::CopySplineShape()failing when the source spline is empty. - Fixed
AlongSplineResolvernot measuring distance correctly with an optional target transform and socket. - Fixed EPT rescaling issues affecting Zone Graph.
PathLabels & Visualization Fixes
- Fixed PathLabel data getting corrupted when the PreSpawn Spline Distance between points was decreased.
- Fixed using class variables stopping Label generation.
- Fixed the LeftCliff/RightCliff detection Labels activating underground.
- Fixed Labels debug text drawing on top of itself.
- Fixed the Turn label activating for slope on a specific map.
- Fixed Dirty Path visualization not updating after Undo or after a Cut.
- Fixed excessive
DirtyPathVisMeshwarnings in the output log. - Fixed spawning two Paths one after another displaying the pink visualization incorrectly.
- Fixed the Path's gizmo and details panel not updating during an update.
- Fixed newly created Biomes Masks only being drawn after an Editor restart.
Template, Asset & Tooling Fixes
- Fixed restoring default Template groups in a Path's PathDescription not always working.
- Fixed GroupComponent rotation rotating meshes around their own origin instead of the group's.
- Fixed random scale not being passed to children (random location/rotation already was).
- Fixed child meshes being placed incorrectly when Stretch mode is used.
- Fixed railway pylons scaling incorrectly, making them look like oversized cisterns/silos.
- Fixed
EPT_Intersection_Xcompilation failing when its MainPathSpline is moved. - Fixed Ghost SubActor validation failing for custom SubActor classes, blocking compilation.
- Fixed Ghost SubActors appearing on a certain maps.
- Fixed SubActors spawned by ChildPathActors being incorrectly treated as Ghost/Unreferenced.
- Fixed cables in
EPT_Powerlinesometimes failing to attach. - Fixed the "Remove unreferenced" button not working.
- Fixed gaps appearing between road meshes.
- Fixed
EPD_HighwayExtraLanemissing its cracks/dirt EPT. - Fixed disabling the elevated "Asphalt Cracks Patches Dirt" template preventing
EPD_HighwayExtraLanefrom spawning. - Fixed the "Fit To Blueprint" button being shown when it shouldn't be.
- Fixed Weightmap painting not working in a specific reported case.
- Fixed Errant Paths classes failing to load during cooking/loading.
- Fixed an enum loading error for
EEpRollDirectionwith an invalidOver0Degvalue. - Fixed the Errant Paths category appearing lower than expected in the component details tab on UE 5.6.
- Fixed a parent's probability incorrectly influencing the probability of its children.
- Fixed BP Editor selection not being restored after Blueprint compilation.
- Fixed reparenting a Blueprint causing
AEpPathto disappear from the class list on UE 5.7. - Fixed the Auto Regenerate button sometimes disappearing.
- Fixed the progress dialog repeating the same info when generating multiple Paths with Incremental Update disabled.
- Fixed material compilation warnings appearing when cooking on UE 5.6.
- Material compilation now fails (instead of silently sampling incorrectly) when a generic node is used to sample Errant Paths Biomes Masks instead of the dedicated node.
- Fixed unnecessary temporary components being spawned due to differing PathLayers.
- Fixed "Landscape Edit Layer Order" and "Waiting for textures to Load" notifications not being unique.
- Fixed some EPTs incorrectly using PathLayers from the library or plugin content instead of the project's own.
- Fixed the T-shaped intersection mesh (Nanite) not rendering to Runtime Virtual Textures.
- Fixed the RVT tangent/world-space normal switch on
MF_SwitchInputAttributesOrRVTdefaulting incorrectly; world-space is now the default. - Fixed Paths not getting saved (while remaining marked dirty) when their map is only partially loaded.
- Fixed several issues related to Path pinning, dirtying and Biomes Adjustment bounds.
- Fixed non-spatially-loaded SubActors forcing their parent Path to also become non-spatially-loaded.
- Renamed "Biome Mask" to "Biomes Mask" for consistency.
- Fixed the Stream example incorrectly using "Project First and Last Points", which made connected rivers start/end at different height.