/** Find all relevant RecastMeshObj components and create ExtraMeshes for them */
public void GetRecastMeshObjs(Bounds bounds, List <ExtraMesh> buffer)
{
List <RecastMeshObj> buffer2 = Util.ListPool <RecastMeshObj> .Claim();
// Get all recast mesh objects inside the bounds
RecastMeshObj.GetAllInBounds(buffer2, bounds);
var cachedVertices = new Dictionary <Mesh, Vector3[]>();
var cachedTris = new Dictionary <Mesh, int[]>();
// Create an ExtraMesh object
// for each RecastMeshObj
for (int i = 0; i < buffer2.Count; i++)
{
MeshFilter filter = buffer2[i].GetMeshFilter();
Renderer rend = filter != null?filter.GetComponent <Renderer>() : null;
if (filter != null && rend != null)
{
Mesh mesh = filter.sharedMesh;
#if BNICKSON_UPDATED
// extra information about which game object is causing the problem
if (null == mesh)
{
EB.Debug.LogError("RecastGenerator.GetRecastMeshObjs(): {0} has a RecastMeshObj, but does not have a MeshFilter", filter.name);
}
#endif
var smesh = new ExtraMesh();
smesh.matrix = rend.localToWorldMatrix;
smesh.original = filter;
smesh.area = buffer2[i].area;
// Don't read the vertices and triangles from the
// mesh if we have seen the same mesh previously
if (cachedVertices.ContainsKey(mesh))
{
smesh.vertices = cachedVertices[mesh];
smesh.triangles = cachedTris[mesh];
}
else
{
smesh.vertices = mesh.vertices;
smesh.triangles = mesh.triangles;
cachedVertices[mesh] = smesh.vertices;
cachedTris[mesh] = smesh.triangles;
}
smesh.bounds = rend.bounds;
buffer.Add(smesh);
}
else
{
Collider coll = buffer2[i].GetCollider();
if (coll == null)
{
EB.Debug.LogError("RecastMeshObject ({0}) didn't have a collider or MeshFilter+Renderer attached", buffer2[i].gameObject.name);
continue;
}
ExtraMesh smesh = RasterizeCollider(coll);
smesh.area = buffer2[i].area;
//Make sure a valid ExtraMesh was returned
if (smesh.vertices != null)
{
buffer.Add(smesh);
}
}
}
//Clear cache to avoid memory leak
capsuleCache.Clear();
Util.ListPool <RecastMeshObj> .Release(buffer2);
}