/// <summary>
    /// initialize PVS manager.
    /// </summary>
    /// <param name="pvsManager">the PVS manager.</param>
    public static void InitPVSManager(PVSManager pvsManager)
    {
        pvsManager.debugPlanes = new List <PVSManager.Plane>();
        pvsManager.debugLines  = new List <PVSManager.Line>();

        var currentScene = SceneManager.GetActiveScene();
        var allRootGos   = new List <GameObject>();

        currentScene.GetRootGameObjects(allRootGos);
        var worldBounds = new Bounds(Vector3.zero, Vector3.zero);
        var renderers   = new List <Renderer>();
        var colliders   = new List <Renderer>();

        foreach (var go in allRootGos)
        {
            WalkThroughTransformTree(go.transform, (tr) =>
            {
                var renderer = tr.GetComponent <Renderer>();
                if (!renderer || !tr.gameObject.isStatic)
                {
                    return;
                }

                worldBounds.Encapsulate(renderer.bounds);
                if (renderer.gameObject.tag == "PVS")
                {
                    renderers.Add(renderer);
                }
                colliders.Add(renderer);
            });
        }

        var counts = new Vector3(math.ceil(worldBounds.size.x / pvsManager.cellSize.x), math.ceil(worldBounds.size.y / pvsManager.cellSize.y), math.ceil(worldBounds.size.z / pvsManager.cellSize.z));

        worldBounds.size       = new Vector3(counts.x * pvsManager.cellSize.x, counts.y * pvsManager.cellSize.y, counts.z * pvsManager.cellSize.z);
        pvsManager.worldBounds = worldBounds;
        pvsManager.renderers   = renderers;
        pvsManager.colliders   = colliders;
        pvsManager.AllocVisibleFlags();
        Debug.Log($"{sizeof(int) * pvsManager.visibleFlags.Length} bytes were allocated for visible flags.");

        pvsManager.accelerationStructure = new RayTracingAccelerationStructure();
        var subMeshFlagArray   = new bool[32];
        var subMeshCutoffArray = new bool[32];

        for (var i = 0; i < 32; ++i)
        {
            subMeshFlagArray[i]   = true;
            subMeshCutoffArray[i] = false;
        }
        foreach (var renderer in colliders)
        {
            pvsManager.accelerationStructure.AddInstance(renderer, subMeshFlagArray, subMeshCutoffArray);
        }
        pvsManager.accelerationStructure.Build();
    }