private void ManageVisibility()

in Assets/MRTK/SDK/Features/UX/Scripts/ScrollingObjectCollection/ScrollingObjectCollection.cs [1685:1836]


        private void ManageVisibility(bool isRestoringVisibility = false)
        {
            if (!MaskEnabled && !isRestoringVisibility)
            {
                return;
            }

            ClippingBoundsCollider.enabled = true;
            Bounds clippingThresholdBounds = ClippingBoundsCollider.bounds;

            Renderer[] contentRenderers = ScrollContainer.GetComponentsInChildren<Renderer>(true);
            clippedRenderers.Clear();
            clippedRenderers.UnionWith(ClipBox.GetRenderersCopy());

            // Remove all renderers from clipping primitive that are not part of scroll content
            foreach (var clippedRenderer in clippedRenderers)
            {
                if (clippedRenderer != null && !clippedRenderer.transform.IsChildOf(ScrollContainer.transform))
                {
                    if (disableClippedGameObjects)
                    {
                        if (!clippedRenderer.gameObject.activeSelf)
                        {
                            clippedRenderer.gameObject.SetActive(true);
                        }
                    }
                    if (disableClippedRenderers)
                    {
                        if (!clippedRenderer.enabled)
                        {
                            clippedRenderer.enabled = true;
                        }
                    }

                    renderersToUnclip.Add(clippedRenderer);
                }
            }

            // Check render visibility
            foreach (var renderer in contentRenderers)
            {
                // All content renderers should be added to clipping primitive
                if (!isRestoringVisibility && MaskEnabled && !clippedRenderers.Contains(renderer))
                {
                    renderersToClip.Add(renderer);
                }

                // Complete or partially visible renders should be clipped and its game object should be active
                if (isRestoringVisibility
                    || clippingThresholdBounds.ContainsBounds(renderer.bounds)
                    || clippingThresholdBounds.Intersects(renderer.bounds))
                {
                    if (disableClippedGameObjects)
                    {
                        if (!renderer.gameObject.activeSelf)
                        {
                            renderer.gameObject.SetActive(true);
                        }
                    }
                    if (disableClippedRenderers)
                    {
                        if (!renderer.enabled)
                        {
                            renderer.enabled = true;
                        }
                    }
                }

                // Hidden renderer game objects should be inactive
                else
                {
                    if (disableClippedGameObjects)
                    {
                        if (renderer.gameObject.activeSelf)
                        {
                            renderer.gameObject.SetActive(false);
                        }
                    }
                    if (disableClippedRenderers)
                    {
                        if (renderer.enabled)
                        {
                            renderer.enabled = false;
                        }
                    }
                }
            }

            // Check collider visibility
            if (Application.isPlaying)
            {
                // Outer clipping bounds is used to ensure collider has minimum visibility to stay enabled
                Bounds outerClippingThresholdBounds = ClippingBoundsCollider.bounds;
                outerClippingThresholdBounds.size *= contentVisibilityThresholdRatio;

                var colliders = ScrollContainer.GetComponentsInChildren<Collider>(true);
                foreach (var collider in colliders)
                {
                    // Disabling content colliders during drag to stop interaction even if game object is inactive
                    if (!isRestoringVisibility && IsDragging)
                    {
                        if (collider.enabled)
                        {
                            collider.enabled = false;
                        }

                        continue;
                    }

                    // No need to manage collider visibility in case game object is inactive and no pointer is dragging the scroll
                    if (!isRestoringVisibility && !collider.gameObject.activeSelf)
                    {
                        continue;
                    }

                    // Temporary activating for getting bounds
                    var wasColliderEnabled = collider.enabled;

                    if (!wasColliderEnabled)
                    {
                        collider.enabled = true;
                    }

                    // Completely or partially visible colliders should be enabled if scroll is not drag engaged
                    if (isRestoringVisibility || outerClippingThresholdBounds.ContainsBounds(collider.bounds))
                    {
                        if (!wasColliderEnabled)
                        {
                            wasColliderEnabled = true;
                        }
                    }
                    // Hidden colliders should be disabled
                    else
                    {
                        if (wasColliderEnabled)
                        {
                            wasColliderEnabled = false;
                        }
                    }

                    // Update collider state or revert to previous state
                    collider.enabled = wasColliderEnabled;
                }
            }

            ClippingBoundsCollider.enabled = false;

            if (!isRestoringVisibility)
            {
                ReconcileClippingContent();
            }
        }