in unity/Assets/PostProcessingV2/Runtime/PostProcessManager.cs [94:150]
public void GetActiveVolumes(PostProcessLayer layer, List<PostProcessVolume> results, bool skipDisabled = true, bool skipZeroWeight = true)
{
// If no trigger is set, only global volumes will have influence
int mask = layer.volumeLayer.value;
var volumeTrigger = layer.volumeTrigger;
bool onlyGlobal = volumeTrigger == null;
var triggerPos = onlyGlobal ? Vector3.zero : volumeTrigger.position;
// Sort the cached volume list(s) for the given layer mask if needed and return it
var volumes = GrabVolumes(mask);
// Traverse all volumes
foreach (var volume in volumes)
{
// Skip disabled volumes and volumes without any data or weight
if ((skipDisabled && !volume.enabled) || volume.profileRef == null || (skipZeroWeight && volume.weight <= 0f))
continue;
// Global volume always have influence
if (volume.isGlobal)
{
results.Add(volume);
continue;
}
if (onlyGlobal)
continue;
// If volume isn't global and has no collider, skip it as it's useless
var colliders = m_TempColliders;
volume.GetComponents(colliders);
if (colliders.Count == 0)
continue;
// Find closest distance to volume, 0 means it's inside it
float closestDistanceSqr = float.PositiveInfinity;
foreach (var collider in colliders)
{
if (!collider.enabled)
continue;
var closestPoint = collider.ClosestPoint(triggerPos); // 5.6-only API
var d = ((closestPoint - triggerPos) / 2f).sqrMagnitude;
if (d < closestDistanceSqr)
closestDistanceSqr = d;
}
colliders.Clear();
float blendDistSqr = volume.blendDistance * volume.blendDistance;
// Check for influence
if (closestDistanceSqr <= blendDistSqr)
results.Add(volume);
}
}