Website powered by

BTS - The Cliff Tool

The Cliff (& Landscape) Tool was without a doubt the biggest and most important procedural system I created for asses.masses. It was eventually used for everything from cliffs to entire levels, caves, floating pathways, islands and rocks. It created the crystals of the minigame rooms through to the floating, shattered bridge at the end. During the project I created 4 major iterations of the tool and results of all of them can be seen in the final game.

The tool is something I'm continuing to work on as it allows for rapid iteration, high detail and a great deal of artist control. My next personal project will be making heavy use of the newest version and I may even publicly release it at some point.

What it is - The cliff tool is a procedural workflow for generating cliffs, rock formations and landscapes without the limitations of heightmaps.  The tool is built in Blender geometry nodes

What it is - The cliff tool is a procedural workflow for generating cliffs, rock formations and landscapes without the limitations of heightmaps. The tool is built in Blender geometry nodes

Step 1 - Remeshing! The inner is with remeshing, outside is without.  I initially used heightmaps as the base mesh for the process but as can be seen in the bottom left corner stretching and poor geometry flow required a re-meshing step.

Step 1 - Remeshing! The inner is with remeshing, outside is without. I initially used heightmaps as the base mesh for the process but as can be seen in the bottom left corner stretching and poor geometry flow required a re-meshing step.

Step 2 - Deforming with the tool.  This is the main stage where various noises can be applied - either procedural 3d ones or from heightmap textures.  Noises are controlled by vertex colours and parameters like normal direction

Step 2 - Deforming with the tool. This is the main stage where various noises can be applied - either procedural 3d ones or from heightmap textures. Noises are controlled by vertex colours and parameters like normal direction

Step 3 - UVs and Export.  To enable a baked High Poly to Low Poly workflow UVs are needed even though most of the final shading is tri-planar.  Breaking large meshes into tiles is essential for performance reasons

Step 3 - UVs and Export. To enable a baked High Poly to Low Poly workflow UVs are needed even though most of the final shading is tri-planar. Breaking large meshes into tiles is essential for performance reasons

Step 4 - Texturing & Shading.  This is one of the earliest attempts using simple normal direction to mask between two materials.  The version used in asses.masses used baked global maps and 8 detail material sets in texture atlases.

Step 4 - Texturing & Shading. This is one of the earliest attempts using simple normal direction to mask between two materials. The version used in asses.masses used baked global maps and 8 detail material sets in texture atlases.

Early versions of the tool used splines to generate the U coordinate for heightmap projection.  The current version uses tri-planar projection.  Other issues here are the tile boundaries that were fixed later

Early versions of the tool used splines to generate the U coordinate for heightmap projection. The current version uses tri-planar projection. Other issues here are the tile boundaries that were fixed later

The current version of the tool is designed to be used as a single noise layer.  This is showing different height blending options for combining multiple layers

The current version of the tool is designed to be used as a single noise layer. This is showing different height blending options for combining multiple layers

The final version of the tool used for rocks with different noises masked by vertex colours

The final version of the tool used for rocks with different noises masked by vertex colours

Subdivision mode testing - This is one of the areas to focus on more for the future as currently tile corners don't align perfectly

Subdivision mode testing - This is one of the areas to focus on more for the future as currently tile corners don't align perfectly

Issues to watch out for - high subdivision amounts can lead to faceted shapes using subdivide mesh

Issues to watch out for - high subdivision amounts can lead to faceted shapes using subdivide mesh

Issues #2 - This can be fixed by using subdivision surface instead but this causes tile edges that don't align well across different LOD levels.  A solution I tried was pinning tile edge verts to subdivision mesh positions

Issues #2 - This can be fixed by using subdivision surface instead but this causes tile edges that don't align well across different LOD levels. A solution I tried was pinning tile edge verts to subdivision mesh positions

Issues #3 - As the deformation can can inwards as well as outwards self-intersection can occur, this is particularly difficult to solve on thin end pieces of geometry

Issues #3 - As the deformation can can inwards as well as outwards self-intersection can occur, this is particularly difficult to solve on thin end pieces of geometry

Issues #4 - My solution was to use raycasting along normals to determine outwards extrusion limits and a baked thickness map for inwards limits.  Some manual interventions using the vertex colours that control displacement strength might be needed

Issues #4 - My solution was to use raycasting along normals to determine outwards extrusion limits and a baked thickness map for inwards limits. Some manual interventions using the vertex colours that control displacement strength might be needed

Next Steps #1 - Remeshing is the most expensive process at present and is not deterministic across tiles.  In future I will test sculpted geometry as a base mesh to help enable a faster, more tile oriented workflow

Next Steps #1 - Remeshing is the most expensive process at present and is not deterministic across tiles. In future I will test sculpted geometry as a base mesh to help enable a faster, more tile oriented workflow

Next steps #2 - The thing I'm most excited to work on next is integrating other meshes into the output.  Essentially like 3D decals or boolean brushes in sculpting.  I believe this would work very well with scanned assets.  Soon!

Next steps #2 - The thing I'm most excited to work on next is integrating other meshes into the output. Essentially like 3D decals or boolean brushes in sculpting. I believe this would work very well with scanned assets. Soon!