public static RayHit LocalGridTrace(Ray ray, SpatialGridIndex index, List <int> geomGridList, List <RTTriangle_t> triangles, SpatialGrid grids, int excludeGeometry)
    {
        RayHit bestHit    = RayHit.CreateRayHit();
        RayHit currentHit = RayHit.CreateRayHit();

        int start = 0;
        int count = 0;

        GetNumberOfGeometryInGrid(index, geomGridList, grids.dimension, out start, out count);

        if (count == 0)
        {
            return(bestHit);
        }

        Vector3 localMin = SpatialGridCompute.GetGridLocalMin(grids, index);
        Vector3 localMax = SpatialGridCompute.GetGridLocalMax(grids, index);

        for (int t = 0; t < count; t++)
        {
            if (triangles[start + t].id == excludeGeometry)
            {
                continue;
            }
            RTTriangle.IntersectTriangle(ray, ref currentHit, triangles[start + t]);

            if (!(localMin.x <= currentHit.hitPoint.x && currentHit.hitPoint.x <= localMax.x))
            {
                currentHit = bestHit;   // Reset currentHit
                continue;
            }

            if (!(localMin.y <= currentHit.hitPoint.y && currentHit.hitPoint.y <= localMax.y))
            {
                currentHit = bestHit;   // Reset currentHit
                continue;
            }

            if (!(localMin.z <= currentHit.hitPoint.z && currentHit.hitPoint.z <= localMax.z))
            {
                currentHit = bestHit;   // Reset currentHit
                continue;
            }

            bestHit = currentHit;
        }

        return(bestHit);
    }