Min Region Size Issue With Tiles

It appears that the Min Region Size value is ignored (or not used correctly) when the region to be tested crosses a tile boundary. Can you provide some guidance on this issue, as it’s important for us to remove small regions, and we have to use tiling because the scene is large.

Follow up – with the latest Pro version (3.4.06), the issue with tile boundaries and terrain seems to be fixed. However, I am still seeing the same issue with non-terrain meshes.

Below are two images demonstrating the problem. In the first image, you see an overhead view of the navmesh created with a tile size of 100. The Min Region Size is set to 1000, but you still see areas that are showing up (and they cross a tile boundary).

The second image is the exact same scene, but the scanning is not using tiles. The small regions disappear as expected.


Yes that is known and it is not a bug, just a limitation of how the system works. Each tile is calculated independently from other tiles, so they cannot know how large the region is in the other tiles it spans, therefore it cannot remove it.

What you can use is the RelevantGraphSurface component and place one in every tile you use. It is a bit tedious, but currently the only way to do it.

See here for more information: http://arongranberg.com/astar/docs/class_pathfinding_1_1_recast_graph.php#a6915c7a3bc45a0a4201e8d4919eda9f1

PS: Sorry for the late answer, I have been away for a while

Thanks for your response.

Could you point me towards the code where I could still remove the region based on its size in the tile alone? In my particular case, if the region is small in a tile, I know for certain I want it removed.

For my particular set of data, I have very large regions – and everything else should be discarded.

Actually, after reading the documentation on RelevantGraphSurface, I think I have everything I need. Thanks.

Ok, you can open up VoxelRegion.cs, search for the definition of BorderBit and set the value of it to zero.
const int BorderBit = 1 << 0;

const int BorderBit = 0;

I think that should do it.