/// <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(); }