private static AABCGrid CreateGridWithSingleObject(GameObject gameObj, float cubeSide, bool includeInside)
    {
        //Ext Opt 1: Get objects once
        Renderer rend = gameObj.GetComponent <Renderer>();

        if (rend != null)
        {
            Mesh gameObjMesh = gameObj.GetComponent <MeshFilter>().mesh;

            //Ext Opt 2: Create AABCGrid without temp objects
            AABCGrid grid = new AABCGrid(rend.bounds.min, rend.bounds.max, cubeSide);
            grid.FillGridWithGameObjectInfo(gameObj.transform, gameObjMesh.vertices, gameObjMesh.triangles, includeInside);
            return(grid);
        }
        else
        {
            SkinnedMeshRenderer sRend = gameObj.GetComponent <SkinnedMeshRenderer>();
            if (sRend != null)
            {
                Mesh gameObjMesh = new Mesh();
                sRend.BakeMesh(gameObjMesh);

                //Ext Opt 2: Create AABCGrid without temp objects
                AABCGrid grid = new AABCGrid(sRend.bounds.min, sRend.bounds.max, cubeSide);
                grid.FillGridWithGameObjectInfo(gameObj.transform, gameObjMesh.vertices, gameObjMesh.triangles, includeInside);
                return(grid);
            }
            else
            {
                return(null);
            }
        }
    }
    public static AABCGrid Create1GridNObjects(List <Transform> transforms, List <Mesh> meshes, List <Renderer> renderers, float cubeSide, bool includeInside)
    {
        if (transforms.Count == 0)
        {
            return(null);
        }

        Vector3 gridBoundsMin = renderers[0].bounds.min;
        Vector3 gridBoundsMax = renderers[0].bounds.max;

        for (int i = 1; i < renderers.Count; ++i)
        {
            gridBoundsMin = Vector3.Min(gridBoundsMin, renderers[i].bounds.min);
            gridBoundsMax = Vector3.Max(gridBoundsMax, renderers[i].bounds.max);
        }

        AABCGrid grid = new AABCGrid(gridBoundsMin, gridBoundsMax, cubeSide);

        for (int i = 0; i < transforms.Count; ++i)
        {
            grid.FillGridWithGameObjectInfo(transforms[i], meshes[i].vertices, meshes[i].triangles, includeInside);
        }

        return(grid);
    }
    //New API (Faster but some preprocess needed)
    public static AABCGrid Create1Grid1Object(Transform transform, Mesh mesh, Renderer renderer, float cubeSide, bool includeInside)
    {
        AABCGrid grid = new AABCGrid(renderer.bounds.min, renderer.bounds.max, cubeSide);

        grid.FillGridWithGameObjectInfo(transform, mesh.vertices, mesh.triangles, includeInside);
        return(grid);
    }
    private static AABCGrid CreateGridWithMultipleObjects(GameObject gameObj, float cubeSide, bool includeInside)
    {
        List <GameObject> gameObjectsWithMesh = new List <GameObject>();
        List <Bounds>     gameObjectBounds    = new List <Bounds>();

        GetObjectsWithMeshRec(gameObj, gameObjectsWithMesh, gameObjectBounds);

        if (gameObjectsWithMesh.Count == 0)
        {
            return(null);
        }

        Vector3 gridBoundsMin = gameObjectBounds[0].min;
        Vector3 gridBoundsMax = gameObjectBounds[0].max;

        for (int i = 1; i < gameObjectBounds.Count; ++i)
        {
            gridBoundsMin = Vector3.Min(gridBoundsMin, gameObjectBounds[i].min);
            gridBoundsMax = Vector3.Max(gridBoundsMax, gameObjectBounds[i].max);
        }

        //Ext Opt 2: Create AABCGrid without temp objects
        AABCGrid grid = new AABCGrid(gridBoundsMin, gridBoundsMax, cubeSide);

        for (int i = 0; i < gameObjectsWithMesh.Count; ++i)
        {
            GameObject gameObjAux  = gameObjectsWithMesh[i];
            Mesh       gameObjMesh = null;
            if (gameObjAux.GetComponent <MeshFilter>() != null)
            {
                gameObjMesh = gameObjAux.GetComponent <MeshFilter>().mesh;
            }
            else if (gameObjAux.GetComponent <SkinnedMeshRenderer>() != null)
            {
                gameObjMesh = new Mesh();
                gameObjAux.GetComponent <SkinnedMeshRenderer>().BakeMesh(gameObjMesh);
            }

            grid.FillGridWithGameObjectInfo(gameObjAux.transform, gameObjMesh.vertices, gameObjMesh.triangles, includeInside);
        }

        return(grid);
    }