protected Vector3[] getRaysForFovAndDirection(FovDirectionPair fovDirPair, Vector3 right)
 {
     Vector3[] array;
     if (!fovDirectionPairToRays.ContainsKey(fovDirPair))
     {
         array = GetRaysForFOV(fovDirPair.Fov, NumHorizRays, NumVertRays, fovDirPair.Forward, fovDirPair.Up, right);
         fovDirectionPairToRays.Add(fovDirPair, array);
     }
     else
     {
         array = fovDirectionPairToRays[fovDirPair];
     }
     return(array);
 }
 public override void Execute(Visibility visibility)
 {
     for (int i = 0; i < gameObjectDatas.Length; i++)
     {
         FovDirectionPair fovDirPair             = new FovDirectionPair(visibility.Fov, visibility.Forward, visibility.Up);
         Vector3[]        raysForFovAndDirection = getRaysForFovAndDirection(fovDirPair, visibility.Right);
         for (int j = 0; j < raysForFovAndDirection.Length; j++)
         {
             if (Physics.Raycast(visibility.Position, raysForFovAndDirection[j], out var hitInfo))
             {
                 Transform key = hitInfo.transform;
                 if (transformToGoData.ContainsKey(key))
                 {
                     GameObjectData gameObjectData = transformToGoData[key];
                     gameObjectData.TriangleVisibilities[hitInfo.triangleIndex] = true;
                 }
             }
         }
     }
 }