GetAllInBounds() public static method

public static GetAllInBounds ( List buffer, Bounds bounds ) : void
buffer List
bounds UnityEngine.Bounds
return void
Ejemplo n.º 1
0
        /** 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);
        }