FarCry 5

Project Name: FarCry 5

Platform: PS4-XBoxOne-PC

Release date: 2018

Game Engine: Dunia Engine

 

Introduction:

On Far Cry 5, I was responsible of developing a new procedural pipeline and set of tools to generate content in the world. The initial mandate was simply to develop a tool to generate the vegetation biomes but we ended up expanding way beyond that.

 

Challenges:

Here are the initial challenges we wanted to tackle with our pipeline.

Far Cry 5 terrain evolution over 2.5 years.

How do we manage our content with a terrain that is changing constantly?

Fixed Forest Position over 2.5 years

Same evolution on a smaller portion of the terrain with a forest applied manually. The forest distribution patterns is initially coherent with the terraforming. However, it becomes really incoherent over time as the terrain changes.

How do we solve that?

It would be tedious work to repaint the forest everytime the terrain change. Also, if manage by several different users. How consistent would the result be?

Should we lock terraforming early in the project to avoid this? That would not be realistic, because this iterative process is vital to the game quality.

Pipeline Objectives:

It is with those challenges in mind that we built a procedural pipeline.

1st objective: Fill up the world with natural looking content

Macro management tools to fill up the world with natural looking content.

2nd objective: Consistent with terrain topology

The content generated needs to be consistent with the terrain topology. Here we have the same example as before but this time with a forest distribution that is adapting to the terrain shape. And as we can see the result remains coherent with any of the terraforming changes.

3rd objective: Automated

Then the whole pipeline needs to be automated.
We used Houdini and Houdini Engine.
And nightly generation on build machines to fully refresh the world every night.
Several build machines will process different part of the world one by one, until the full world is generated.
This process ensures us that the users will have updated world data every morning.

4th objective: Deterministic

Then all the data generated also needs to be deterministic. Which means that, the generation needs to yield the same result given the same inputs.
By using different build machine, whether we bake the left or right chunk of terrain the middle part will always give the same results.
This is important for the navmesh generation among other things because we have a nightly build that bakes the world map per map so the junctions between maps needs to be seamless.

5th objective: User friendly

  • Shelf tools in the editor
  • Easy to manage by the users
  • Users can bake as they work
  • Ability to override procedural results

Our last objective, we want the whole thing to be user friendly. Just the nightly build alone is not enough to ensure users have up to date data.They need to be able to bake the procedural generation as they work as well. So of course we have all the tools available in the editor.

Developped Procedural Tools:

Freshwater

Fences & Powerlines

Cliffs

Biomes

Fog

Worldmap

Using the tools from the users point of view:

User generating freshwater

After the terraforming artist are ready to lay down freshwater networks. That is achieved by using curves and spline that will be used as inputs for the freshwater tool. For rivers we have controls directly on the spline for the width. When happy with the inputs the user will run procedural generation from the Freshwater shelf button. The tool will produce water surface meshes and terrain texturing

User generating cliffs

The cliffs tool is simply based on the terrain slope so the user just have to run the generation on the desired terrain area.

User generating biomes

To apply vegetation in the world the user can paint the desired biomes with the biome painter tool.
The main biomes naturally distribute grass and forest sub-biomes.

User generating roads and setting up a location

So far, our result is quite natural. To bring men’s influence on the environment and override mother nature the user can start by adding roads. This is done by using the road spline. After baking the road tool, the user can also refresh the biome tool to clear out the vegetation in the way of the road.

Then in order to customize a location, the user can override the main biomes by painting sub-biomes like grass and adding clumps of forest here and there. This will clear the way to hand place buildings and such.

 

User generating fences

The input for fence is once again a spline. The user will simply set the fence type he wants to generate on the spline parameters and run the generation.

User generating power lines

Electric poles will spawn on each control points of the spline. In this example we add 3 different types of power lines that will automatically connect with one another (Standard lines, Single line and 2 House connectors).Transformer boxes will be automatically added where required. If the user does not snap the splines correctly the system will do it within a certain distance. You can also notice that by refreshing the biomes afterwards the power lines are taken into account to avoid having trees in the way of the power lines.

User readjusting terraforming

At any point the user can adjust the terraforming. Affected procedural tools simply have to be regenerated afterwards. The workflow is non-destructive!

Pipeline overview:

WIP

Cliffs tool in detail:

In previous Far Cry’s cliffs were only bare terrain or hand placed pre-modeled mesh that were not suited to cover large cliffs surfaces.

So I developer a tech to generate cliffs proceduraly:

Procedural cliffs OFF

Procedural cliffs ON

Tool input

The whole process starts from the terrain itself. Using slope terrain data, we isolate a specific threshold value and then delete all surface bellow that threshold. This becomes our cliffs input geometry.

–>–>

 

Stratification

Geometry shapes

Shading method

Terrain data

Erosion

Vegetation growing surfaces

Exported data

Biomes tool in detail:

WIP