Creative freedom
Path blueprints may contain all types of components, such as meshes, light sources, sound emitters, decals, splines, volumes, etc. They may even contain child blueprints. All of these components get spawned along a path in a predictable manner.
Using the aforementioned rules you can decide which of the blueprint components get spawned in specific scenarios. Or you can define spawning probability. Location, rotation and scale of the spawned components may also be affected by randomization.
Great performance
We put a lot of effort into making the paths efficient. The generation process minimizes the number of components spawned, merges certain components together (splines), substitutes spline-meshes for cheaper static-meshes wherever it makes no visual difference, uses mesh instancing, etc.
Useful performance hints are also provided during the blueprint compilation.
Flexible asset organization
In order to facilitate asset management, one path can be made of multiple blueprints in a layered fashion. For example, one blueprint containing the road surface, another containing decals and yet another containing barriers, lamp posts or other decorations.
Rules can also apply to whole blueprints, deciding which of several blueprints gets spawned at a certain part of the path. All of these features give you the most flexibility and workflow options when coming up with your own designs.
Intuitive edition
Defining a path is as simple as creating a blueprint with a few meshes inside. The content of this blueprint is then repeatedly spawned along a spline and bent to match the curvature of the path.
Most importantly, the hierarchy of components and their spatial relations are maintained, despite some meshes getting significantly bent. For example, a lamp post attached to a barrier may follow the curvature of the barrier (stay attached visually and oriented properly), while not getting bent. Complex relations of bendable meshes are also supported, such as pipes or cables, connecting barriers on both sides of the road.
Pathfinding (WIP)
For extremely large maps, filled with hundreds of roads, we will provide a powerful pathfinding feature. Path finding allows you to create a realistic looking road, passing over swaths of land, by simply defining the road's start and end positions. Pathfinding creates a naturally-looking path connecting these points by mimicking the decisions of real-world engineers who take into account the cost of construction, cost of land shifting, safety, obstacles, height differences, tunnels, bridges and other, user-defined constraints and criteria. One example of such constraint would be that highways can't make sharp turns, while small dirt roads can.
Intersections, forking and merging
The plugin allows for connecting multiple paths together, either directly or via intersections, as well as cutting them and merging.
Landscape and foliage adjustment
Paths may also affect landscape by raising or lowering it in alignment with the path geometry or by painting onto weight-maps (affecting material of the landscape). They may also remove nearby foliage or affect the type of foliage which grows near the path.
Paths that adapt to the environment
One of the key features of our tool is that paths can be configured to automatically adapt and react to their environment in many useful ways. The adaptation is achieved through user defined rules, which can be easily created in blueprints/code and combined in arbitrary ways. This means that you can create just a few types of paths (asphalt, dirt, highway, etc.), which blend well with every environment you place them in.
Examples of path adaptations:
-
Roadside barriers added in sharp turns along a cliff
-
Different lane markings used in turns and straights
-
Tunnel walls added where the road goes underground
-
Concrete pillars added when the road goes above the ground
-
Automatic placement of road signs
-
Dirt cover in dry regions
-
Trash scattered in urban areas
-
Cracks, patches and potholes in rural areas
paths.
Easy creation of spline-based networks
BETA
Roads, railways, tunnels and more...
Errant Paths allows for creation of all kinds of spline-based networks: roads, railways, tunnels, fences, pipelines, power lines, etc. We will focus on roads here, as they serve as a good example.
Efficient workflow
Our tool allows you to define a path's appearance in one asset and have it applied to all paths of that type in a large map. There is no need for tedious, manual application of the same change over kilometers of existing paths. This encourages iterative work and experimentation.
Stamp brush
Places a hill or a valley based on a selected heightmap with support for scaling, rotation,
and a variety of blending options.
1.
Noise brush
Lifts the landscape based on a configurable noise function. Can be used as a base for a new landscape or to add smaller details to an existing landscape.
2.
Blur brush
Smoothens the shape of your landscape or detail in weightmaps or biomes masks.
3.
brushes.
Non-destructible workflow
When sculpting a landscape in Unreal you typically use a destructive workflow - each brush stroke overwrites the landscape state and all the strokes bake into a single shape. You can't modify any of the past edits without re-doing or breaking other edits. Just having layers is not enough when wanting to be able to go back and edit your work. We consider that a huge problem, as iteration is key to improvement.
Luckily, Unreal introduced a new method of working with landscape - Landscape Blueprint Brushes. LBB allow us to modify the landscape via brushes containing some logic - opening the door for procedural generation and non-destructive workflows.
The Landscape plugin comes with a number of such procedural brushes, which can be combined in any way and edited at any point in time, even a year after they were originally placed on the map. If you need to move a mountain later in development, you can do it.
Our brushes are performant even on the largest of maps, thanks to the fact that they only update parts of the world which are relevant. If you were burnt in the past by problems with Unreal Landscape workflow, you might be positively surprised this time.
Unreal Engine Integration
There are several software solutions for procedural landscape generation which are independent of Unreal. They typically have lots of useful features.
However, we experienced some serious difficulties when working with them in the past. The first problem is the disconnect between the work done in an external program and the map in Unreal Editor. When working in an external software you typically don't see textures, game objects, foliage, roads and you quickly lose sense of scale or context. It makes it very hard to adjust the landscape to match the game. So in practice you can initialize your landscape quite easily, but are left on your own when it comes to editing it afterwards.
The second headache we experienced was the need to shuffle and store the numerous large intermediate files, inflating our repository and lengthening download times.
The third issue was iteration time. Just having to re-export and re-import assets slowed iteration down significantly, but combined with lack of context and slower editing it became unbearably slow.
That's why we focus so much on working in editor, with full context, re-generating only the parts you're working on and having no imports/exports slowing you down.
Modify the standard UE landscape at runtime
Errant Landscape comes with a dedicated module for modifying the Unreal's standard landscape at runtime, as part of the gameplay. This feature allows adjusting the landscape's heightmap, weightmaps, and collision and can be used in multiplayer games.
It unlocks many new possibilities for game developers:
-
Creating terrains procedurally as the game loads
-
Altering terrain through gameplay actions such as digging, raising, and leveling
-
Reacting to explosions, magic spells, and destruction
-
Adjusting terrain for buildings and roads
-
Compressing vast landscapes into small sizes by storing only the list of applied stamps.
Normally implementing these features requires switching to different landscape representations, such as voxels, procedural meshes or virtual heightfields. With Errant Landscape, these workarounds are no longer necessary.
extra features.
Automation that doesn’t limit you
What’s important is the fact that you can control the amount of automation vs control. For example, you can describe procedurally where sub-biomes are placed, or you can paint sub-biomes manually. You could even mix both approaches, automated one for less important areas of the map and manual one for the crucial parts. You can also overwrite any automatically placed sub-biome with the sub-biome of your choice.
This way you are always working at the right level of abstraction - either quickly filling whole regions of the map or focusing on the details. At the lowest level, you can control where each species grows. At the highest level, you can paint biomes over a virtual planet.
Ease & Flexibility
When it comes to species, you define their placement logic in the material editor, as if you were creating a simple landscape material. This gives you a lot of creative freedom and access to the tools that you are already familiar with.
You can drive the generation with a simple noise function or a texture. You can also use a number of meta-data inputs calculated by our plugin - terrain slope, precipitation, erosion, sun exposure, azimuth and more. Species placement may also depend on the presence of other species - for example, twigs and leaves being placed near the trees.
Runtime generation for grass and dense foliage
The plugin may also be used for placing grass, where it’s common to have millions of mesh instances on the map. Storing those instances in the map file would inflate the file to gigabytes in size. To solve this, we added support for runtime generation. It works by storing only the minimal information needed to generate a given species and then generates the instances in real-time, during the game, within some radius of the camera.
Compared to Unreal’s Landscape Grass, our solution is more versatile and customizable, but crucially, it doesn’t require recompilation of the landscape materials (shaders) after each parameter change. In our tests, Landscape Grass would typically take 20-60 minutes to recompile shaders for a moderately complex map. This made it pretty much impossible to iterate on the grass without having a separate, small level for testing. Our solution removes those problems completely.
biomes.
Procedural placement of foliage and gameplay elements
Environment organized into biomes
Our Biomes plugin allows you to place naturally looking vegetation on your map. You do it by defining biomes, sub-biomes and species. A biome typically represents the region’s climate, such as desert, temperate, humid, arctic. A sub-biome represents the environment characteristic to that biome, such as rainforest, field, grassland, desert, ice. Each sub-biome contains a list of species which occur in its area, and species contain logic describing where they grow. Some species may only grow at high altitude, on eastern slopes of sunny hills, for example.
Different meshes on the edges of growth regions
You can, for example, spawn small trees instead of large ones on the outskirts of forests or adjust scale and density of the meshes in order to place denser and larger grass in regions with more sun exposure.
Adjusting landscape to the spawned meshes
You want to lift terrain under large trees to simulate growth of their roots, or adjust terrain under large rocks? You can easily achieve that with the Biomes plugin.
Spawning any type of objects on the map
Meshes, blueprints, light sources, FXs, sounds and more. When spawning meshes, the plugin automatically groups meshes into HISMs (Hierarchical Instanced Static Mesh Components), so that they can be rendered as fast as possible.
Balance between automation and creative control
Artists often fear that using procedural generation will limit their creative control over fine details, or that they will have to work in a way which doesn't feel natural to them.
We kept those concerns in mind when working on the procedural tools, and thus we focused on boosting the individual artist's efficiency rather than trying to make the computer take over their job.
Performance
and quick iteration
The bulk of our procedural generation is run on the GPU and directly in Unreal Editor. It makes our solutions fast - often an order of magnitude faster than competitive solutions run in external programs.
It also makes our tools radically easier to use - allowing for quick iteration and working within the context of the game. We remove the hassle of importing/exporting large intermediate files or the need for a powerful workstation.
The support you need
Our tools are used daily by us and other game studios. We are dedicated to working out all the edge-cases and assisting you in reaching the final solution.