< Summary

Class:ECSSystems.ECSSceneBoundsCheckerSystem.ECSSceneBoundsCheckerSystem
Assembly:ECS7Plugin.Systems.ECSSceneBoundsChecker
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/Systems/SceneBoundsCheckerSystem/ECSSceneBoundsCheckerSystem.cs
Covered lines:17
Uncovered lines:152
Coverable lines:169
Total lines:412
Line coverage:10% (17 of 169)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:20
Method coverage:10% (2 of 20)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ECSSceneBoundsCheckerSystem(...)0%330100%
Dispose()0%110100%
OnSceneAdded(...)0%12300%
OnSceneRemoved(...)0%2100%
Update()0%1101000%
RunEntityEvaluation(...)0%6200%
EvaluateEntityPosition(...)0%30500%
EvaluateMeshBounds(...)0%90900%
AreSubMeshesAndCollidersInsideBounds(...)0%3801900%
WereColliderComponentRemoved(...)0%6200%
WereRendererComponentRemoved(...)0%6200%
SetInsideBoundsStateForMeshComponents(...)0%2100%
SetInsideBoundsStateForNonMeshComponents(...)0%6200%
ProcessRendererComponentChanges(...)0%20400%
ProcessPointerColliderComponentChanges(...)0%20400%
ProcessPhysicColliderComponentChanges(...)0%20400%
IsEntityVisible(...)0%6200%
RecalculateEntityMeshBounds(...)0%56700%
GetColliderBounds(...)0%6200%
UpdateInsideSceneBoundsStatus(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/Systems/SceneBoundsCheckerSystem/ECSSceneBoundsCheckerSystem.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.ECS7.InternalComponents;
 3using DCL.ECSRuntime;
 4using DCL.Models;
 5using System;
 6using System.Collections.Generic;
 7using UnityEngine;
 8
 9namespace ECSSystems.ECSSceneBoundsCheckerSystem
 10{
 11    public class ECSSceneBoundsCheckerSystem
 12    {
 13        private readonly IInternalECSComponent<InternalSceneBoundsCheck> sceneBoundsCheckComponent;
 14        private readonly IInternalECSComponent<InternalVisibility> visibilityComponent;
 15        private readonly IInternalECSComponent<InternalRenderers> renderersComponent;
 16        private readonly IInternalECSComponent<InternalColliders> pointerCollidersComponent;
 17        private readonly IInternalECSComponent<InternalColliders> physicsCollidersComponent;
 18        private readonly IECSOutOfSceneBoundsFeedbackStyle outOfBoundsVisualFeedback;
 119        private readonly Dictionary<int, Tuple<Bounds, Vector3>> scenesOuterBounds = new Dictionary<int, Tuple<Bounds, V
 120        private readonly Dictionary<int, HashSet<Vector2Int>> scenesHashSetParcels = new Dictionary<int, HashSet<Vector2
 21        private readonly BaseList<IParcelScene> loadedScenes;
 122        private readonly HashSet<IDCLEntity> entitiesOutsideSceneBounds = new HashSet<IDCLEntity>();
 23
 124        public ECSSceneBoundsCheckerSystem(
 25            BaseList<IParcelScene> loadedScenes,
 26            IInternalECSComponent<InternalSceneBoundsCheck> sbcComponent,
 27            IInternalECSComponent<InternalVisibility> visibilityComponent,
 28            IInternalECSComponent<InternalRenderers> renderersComponent,
 29            IInternalECSComponent<InternalColliders> pointerColliderComponent,
 30            IInternalECSComponent<InternalColliders> physicsColliderComponent,
 31            bool previewMode = false)
 32        {
 133            this.loadedScenes = loadedScenes;
 134            this.sceneBoundsCheckComponent = sbcComponent;
 135            this.visibilityComponent = visibilityComponent;
 136            this.renderersComponent = renderersComponent;
 137            this.pointerCollidersComponent = pointerColliderComponent;
 138            this.physicsCollidersComponent = physicsColliderComponent;
 39
 140            loadedScenes.OnAdded += OnSceneAdded;
 141            loadedScenes.OnRemoved += OnSceneRemoved;
 42
 143            outOfBoundsVisualFeedback = previewMode ? new ECSOutOfSceneBoundsFeedback_RedWireframe() : new ECSOutOfScene
 144        }
 45
 46        public void Dispose()
 47        {
 148            loadedScenes.OnAdded -= OnSceneAdded;
 149            loadedScenes.OnRemoved -= OnSceneRemoved;
 150        }
 51
 52        private void OnSceneAdded(IParcelScene scene)
 53        {
 54            // global scenes do not have boundaries to check
 055            if (scene.isPersistent)
 056                return;
 57
 058            IReadOnlyList<Vector2Int> parcels = scene.sceneData.parcels;
 059            var sceneNumber = scene.sceneData.sceneNumber;
 60
 061            Bounds outerBounds = UtilsScene.CalculateOuterBounds(parcels, scene.GetSceneTransform().position);
 062            scenesOuterBounds.Add(sceneNumber, new Tuple<Bounds, Vector3>(outerBounds, outerBounds.center - scene.GetSce
 63
 064            HashSet<Vector2Int> hashSetParcels = new HashSet<Vector2Int>();
 065            for (int i = 0; i < parcels.Count; i++)
 66            {
 067                hashSetParcels.Add(parcels[i]);
 68            }
 069            scenesHashSetParcels.Add(sceneNumber, hashSetParcels);
 070        }
 71
 72        private void OnSceneRemoved(IParcelScene scene)
 73        {
 074            var sceneNumber = scene.sceneData.sceneNumber;
 075            scenesOuterBounds.Remove(sceneNumber);
 076            scenesHashSetParcels.Remove(sceneNumber);
 077        }
 78
 79        public void Update()
 80        {
 081            ProcessRendererComponentChanges(sceneBoundsCheckComponent, renderersComponent.GetForAll());
 082            ProcessPhysicColliderComponentChanges(sceneBoundsCheckComponent, physicsCollidersComponent.GetForAll());
 083            ProcessPointerColliderComponentChanges(sceneBoundsCheckComponent, pointerCollidersComponent.GetForAll());
 84
 85            // Note: the components are traversed backwards as we may free the 'fully defaulted' entities from the compo
 086            var sbcComponentGroup = sceneBoundsCheckComponent.GetForAll();
 87
 088            for (int i = sbcComponentGroup.Count - 1; i >= 0; i--)
 89            {
 090                var componentData = sbcComponentGroup[i].value;
 091                IParcelScene scene = componentData.scene;
 092                IDCLEntity entity = componentData.entity;
 093                InternalSceneBoundsCheck model = componentData.model;
 94
 095                if (!model.dirty || scene.isPersistent) continue;
 96
 097                bool physicsColliderRemoved = WereColliderComponentRemoved(scene, entity,
 98                    model.physicsColliders, physicsCollidersComponent);
 99
 0100                bool pointerColliderRemoved = WereColliderComponentRemoved(scene, entity,
 101                    model.pointerColliders, pointerCollidersComponent);
 102
 0103                bool renderersRemoved = WereRendererComponentRemoved(scene, entity,
 104                    model.renderers, renderersComponent);
 105
 0106                bool isMeshDirty = model.meshesDirty | physicsColliderRemoved | pointerColliderRemoved | renderersRemove
 107
 0108                if (isMeshDirty)
 109                {
 0110                    if (physicsColliderRemoved)
 0111                        model.physicsColliders = null;
 112
 0113                    if (pointerColliderRemoved)
 0114                        model.pointerColliders = null;
 115
 0116                    if (renderersRemoved)
 0117                        model.renderers = null;
 118
 0119                    model = RecalculateEntityMeshBounds(entity, model);
 120
 121                    // If all meshes were removed we need to reset the feedback.
 0122                    if (model.entityLocalMeshBounds.size == Vector3.zero)
 123                    {
 0124                        SetInsideBoundsStateForMeshComponents(outOfBoundsVisualFeedback, entity, model,
 125                            IsEntityVisible(scene, entity, visibilityComponent), true);
 126                    }
 127
 0128                    model.meshesDirty = false;
 0129                    sceneBoundsCheckComponent.PutFor(scene, entity, model);
 130                }
 131
 0132                if (sceneBoundsCheckComponent.IsFullyDefaulted(scene, entity))
 133                {
 0134                    entitiesOutsideSceneBounds.Remove(entity);
 135
 136                    // Since no other component is using the internal SBC component, we remove it.
 0137                    sceneBoundsCheckComponent.RemoveFor(scene, entity);
 0138                    continue;
 139                }
 140
 0141                Bounds sceneOuterBounds = scenesOuterBounds[scene.sceneData.sceneNumber].Item1;
 0142                sceneOuterBounds.center = scene.GetSceneTransform().position + scenesOuterBounds[scene.sceneData.sceneNu
 0143                RunEntityEvaluation(
 144                    scene,
 145                    entity,
 146                    scenesHashSetParcels[scene.sceneData.sceneNumber],
 147                    sceneOuterBounds,
 148                    entitiesOutsideSceneBounds,
 149                    model,
 150                    outOfBoundsVisualFeedback,
 151                    IsEntityVisible(scene, entity, visibilityComponent)
 152                    );
 153            }
 0154        }
 155
 156        private static void RunEntityEvaluation(IParcelScene scene, IDCLEntity entity, HashSet<Vector2Int> parcels, Boun
 157            InternalSceneBoundsCheck sbcComponentModel, IECSOutOfSceneBoundsFeedbackStyle outOfBoundsVisualFeedback, boo
 158        {
 159            // If it has a mesh we don't evaluate its position due to artists common "pivot point sloppiness", we evalua
 0160            if (sbcComponentModel.entityLocalMeshBounds.size != Vector3.zero) // has a mesh/collider
 0161                EvaluateMeshBounds(scene, entity, parcels, sceneOuterBounds, entitiesOutsideSceneBounds, sbcComponentMod
 162            else
 0163                EvaluateEntityPosition(scene, entity, parcels, sceneOuterBounds, entitiesOutsideSceneBounds, sbcComponen
 164
 0165            SetInsideBoundsStateForNonMeshComponents(entity, entitiesOutsideSceneBounds, sbcComponentModel);
 0166        }
 167
 168        private static void EvaluateEntityPosition(IParcelScene scene, IDCLEntity entity, HashSet<Vector2Int> parcels, B
 169        {
 170            // 1. Cheap outer-bounds check
 0171            bool isInsideSceneOuterBounds = scene.isPersistent || UtilsScene.IsInsideSceneOuterBounds(sceneOuterBounds, 
 172
 173            // 2. Confirm with inner-bounds check only if entity is inside outer bounds
 0174            Vector3 entityWorldPosition = sbcComponentModel.entityPosition + CommonScriptableObjects.worldOffset.Get();
 0175            bool isInsideSceneInnerBounds = scene.isPersistent || (isInsideSceneOuterBounds
 176                                           && UtilsScene.IsInsideSceneInnerBounds(parcels, scene.metricsCounter.maxCount
 177
 0178            UpdateInsideSceneBoundsStatus(entity, entitiesOutsideSceneBounds, isInsideSceneInnerBounds);
 0179        }
 180
 181        private static void EvaluateMeshBounds(IParcelScene scene, IDCLEntity entity, HashSet<Vector2Int> parcels, Bound
 182            HashSet<IDCLEntity> entitiesOutsideSceneBounds, InternalSceneBoundsCheck sbcComponentModel, IECSOutOfSceneBo
 183        {
 184            // Since the world's reposition in Unity also affects the entities position, we must use the real entity gam
 0185            Vector3 entityUnityPosition = entity.gameObject.transform.position;
 0186            Vector3 globalBoundsMaxPoint = entityUnityPosition + sbcComponentModel.entityLocalMeshBounds.max;
 0187            Vector3 globalBoundsMinPoint = entityUnityPosition + sbcComponentModel.entityLocalMeshBounds.min;
 188
 189            // 1. Cheap outer-bounds check
 0190            bool isInsideSceneOuterBounds = scene.isPersistent
 191                                                || (UtilsScene.IsInsideSceneOuterBounds(sceneOuterBounds, globalBoundsMa
 192                                                && UtilsScene.IsInsideSceneOuterBounds(sceneOuterBounds, globalBoundsMin
 193
 0194            if (isInsideSceneOuterBounds)
 195            {
 0196                Vector3 worldOffset = CommonScriptableObjects.worldOffset.Get();
 197
 198                // 2. If entity is inside outer bounds then check full merged bounds AABB
 0199                bool isInsideSceneInnerBounds = scene.isPersistent
 200                                               || (UtilsScene.IsInsideSceneInnerBounds(parcels, scene.metricsCounter.max
 201                                                   && UtilsScene.IsInsideSceneInnerBounds(parcels, scene.metricsCounter.
 202
 203                // 3. If merged bounds is detected as outside bounds we need a final check on submeshes (for L-Shaped su
 0204                if (!isInsideSceneInnerBounds)
 0205                    isInsideSceneInnerBounds = AreSubMeshesAndCollidersInsideBounds(scene, entity, parcels, entitiesOuts
 206
 0207                UpdateInsideSceneBoundsStatus(entity, entitiesOutsideSceneBounds, isInsideSceneInnerBounds);
 208            }
 209            else
 210            {
 0211                UpdateInsideSceneBoundsStatus(entity, entitiesOutsideSceneBounds, false);
 212            }
 213
 0214            SetInsideBoundsStateForMeshComponents(outOfBoundsVisualFeedback, entity, sbcComponentModel,
 215                isVisible, !entitiesOutsideSceneBounds.Contains(entity));
 0216        }
 217
 218        private static bool AreSubMeshesAndCollidersInsideBounds(IParcelScene scene, IDCLEntity entity,
 219            HashSet<Vector2Int> parcels, HashSet<IDCLEntity> entitiesOutsideSceneBounds, InternalSceneBoundsCheck sbcCom
 220        {
 0221            if (scene.isPersistent)
 0222                return true;
 223
 0224            var renderers = sbcComponentModel.renderers;
 0225            var physicsColliders = sbcComponentModel.physicsColliders;
 0226            var pointerColliders = sbcComponentModel.pointerColliders;
 0227            int renderersCount = renderers?.Count ?? 0;
 0228            int collidersCount = physicsColliders?.Count ?? 0 + pointerColliders?.Count ?? 0;
 229
 230            // For entities with 1 mesh/collider the already-checked merged bounds already represent its bounds
 231            // So we avoid all these unneeded submesh checks for those
 0232            if (renderersCount + collidersCount <= 1) return !entitiesOutsideSceneBounds.Contains(entity);
 233
 0234            if (renderers != null)
 235            {
 0236                for (int i = 0; i < renderersCount; i++)
 237                {
 0238                    if (!UtilsScene.IsInsideSceneInnerBounds(parcels, scene.metricsCounter.maxCount.sceneHeight, rendere
 0239                        return false;
 240                }
 241            }
 242
 0243            if (physicsColliders != null)
 244            {
 0245                var pairs = physicsColliders.Pairs;
 0246                for (int i = 0; i < pairs.Count; i++)
 247                {
 0248                    if (!UtilsScene.IsInsideSceneInnerBounds(parcels, scene.metricsCounter.maxCount.sceneHeight, pairs[i
 0249                        return false;
 250                }
 251            }
 252
 0253            if (pointerColliders != null)
 254            {
 0255                var pairs = pointerColliders.Pairs;
 0256                for (int i = 0; i < pairs.Count; i++)
 257                {
 0258                    if (!UtilsScene.IsInsideSceneInnerBounds(parcels, scene.metricsCounter.maxCount.sceneHeight, pairs[i
 0259                        return false;
 260                }
 261            }
 262
 0263            return true;
 264        }
 265
 266        private static bool WereColliderComponentRemoved(IParcelScene scene, IDCLEntity entity,
 267            KeyValueSet<Collider, uint> sbcComponentColliders, IInternalECSComponent<InternalColliders> colliderComponen
 268        {
 0269            return sbcComponentColliders != null && colliderComponent.GetFor(scene, entity) == null;
 270        }
 271
 272        private static bool WereRendererComponentRemoved(IParcelScene scene, IDCLEntity entity,
 273            IList<Renderer> sbcComponentRenderers, IInternalECSComponent<InternalRenderers> rendererComponent)
 274        {
 0275            return sbcComponentRenderers != null && rendererComponent.GetFor(scene, entity) == null;
 276        }
 277
 278        private static void SetInsideBoundsStateForMeshComponents(IECSOutOfSceneBoundsFeedbackStyle outOfBoundsVisualFee
 279            InternalSceneBoundsCheck sbcComponentModel, bool isVisible, bool isInsideBounds)
 280        {
 0281            outOfBoundsVisualFeedback.ApplyFeedback(entity, sbcComponentModel, isVisible, isInsideBounds);
 0282        }
 283
 284        private static void SetInsideBoundsStateForNonMeshComponents(IDCLEntity entity, HashSet<IDCLEntity> entitiesOuts
 285        {
 0286            componentModel.OnSceneBoundsStateChange?.Invoke(!entitiesOutsideSceneBounds.Contains(entity));
 0287        }
 288
 289        private static void ProcessRendererComponentChanges(IInternalECSComponent<InternalSceneBoundsCheck> sceneBoundsC
 290            IReadOnlyList<KeyValueSetTriplet<IParcelScene, long, ECSComponentData<InternalRenderers>>> rendererComponent
 291        {
 0292            for (int i = 0; i < rendererComponents.Count; i++)
 293            {
 0294                var componentData = rendererComponents[i].value;
 0295                IParcelScene scene = componentData.scene;
 0296                IDCLEntity entity = componentData.entity;
 0297                InternalRenderers model = componentData.model;
 298
 0299                if (!model.dirty || scene.isPersistent) continue;
 300
 0301                sceneBoundsCheckComponent.SetRenderers(scene, entity, model.renderers);
 302            }
 0303        }
 304
 305        private static void ProcessPointerColliderComponentChanges(IInternalECSComponent<InternalSceneBoundsCheck> scene
 306            IReadOnlyList<KeyValueSetTriplet<IParcelScene, long, ECSComponentData<InternalColliders>>> colliderComponent
 307        {
 0308            for (int i = 0; i < colliderComponents.Count; i++)
 309            {
 0310                var componentData = colliderComponents[i].value;
 0311                IParcelScene scene = componentData.scene;
 0312                IDCLEntity entity = componentData.entity;
 0313                InternalColliders model = componentData.model;
 314
 0315                if (!model.dirty || scene.isPersistent) continue;
 316
 0317                sceneBoundsCheckComponent.SetPointerColliders(scene, entity, model.colliders);
 318            }
 0319        }
 320
 321        private static void ProcessPhysicColliderComponentChanges(IInternalECSComponent<InternalSceneBoundsCheck> sceneB
 322            IReadOnlyList<KeyValueSetTriplet<IParcelScene, long, ECSComponentData<InternalColliders>>> colliderComponent
 323        {
 0324            for (int i = 0; i < colliderComponents.Count; i++)
 325            {
 0326                var componentData = colliderComponents[i].value;
 0327                IParcelScene scene = componentData.scene;
 0328                IDCLEntity entity = componentData.entity;
 0329                InternalColliders model = componentData.model;
 330
 0331                if (!model.dirty || scene.isPersistent) continue;
 332
 0333                sceneBoundsCheckComponent.SetPhysicsColliders(scene, entity, model.colliders);
 334            }
 0335        }
 336
 337        private static bool IsEntityVisible(IParcelScene scene, IDCLEntity entity, IInternalECSComponent<InternalVisibil
 338        {
 0339            return visibilityComponent.GetFor(scene, entity)?.model.visible ?? true;
 340        }
 341
 342        private static InternalSceneBoundsCheck RecalculateEntityMeshBounds(IDCLEntity entity, InternalSceneBoundsCheck 
 343        {
 344            // Clean existing bounds object
 0345            sbcInternalComponentModel.entityLocalMeshBounds.size = Vector3.zero;
 346
 347            // Note: the center shouldn't be modified beyond this point as it affects the bounds relative values
 0348            sbcInternalComponentModel.entityLocalMeshBounds.center = entity.gameObject.transform.position;
 349
 350            // Encapsulate with global bounds
 0351            if (sbcInternalComponentModel.renderers != null)
 352            {
 0353                for (var i = 0; i < sbcInternalComponentModel.renderers.Count; i++)
 354                {
 0355                    sbcInternalComponentModel.entityLocalMeshBounds.Encapsulate(sbcInternalComponentModel.renderers[i].b
 356                }
 357            }
 358
 0359            if (sbcInternalComponentModel.physicsColliders != null)
 360            {
 0361                var pairs = sbcInternalComponentModel.physicsColliders.Pairs;
 0362                for (int i = 0; i < pairs.Count; i++)
 363                {
 0364                    sbcInternalComponentModel.entityLocalMeshBounds.Encapsulate(GetColliderBounds(pairs[i].key));
 365                }
 366            }
 367
 0368            if (sbcInternalComponentModel.pointerColliders != null)
 369            {
 0370                var pairs = sbcInternalComponentModel.pointerColliders.Pairs;
 0371                for (int i = 0; i < pairs.Count; i++)
 372                {
 0373                    sbcInternalComponentModel.entityLocalMeshBounds.Encapsulate(GetColliderBounds(pairs[i].key));
 374                }
 375            }
 376
 377            // Turn min-max values to local/relative to be usable when the entity has moved
 0378            Vector3 entityPosition = entity.gameObject.transform.position;
 379
 0380            sbcInternalComponentModel.entityLocalMeshBounds.SetMinMax(sbcInternalComponentModel.entityLocalMeshBounds.mi
 381                sbcInternalComponentModel.entityLocalMeshBounds.max - entityPosition);
 382
 0383            return sbcInternalComponentModel;
 384        }
 385
 386        private static Bounds GetColliderBounds(Collider collider)
 387        {
 388            // Disabled colliders return a size-0 bounds object, so we enable it only to get its bounds
 0389            if (!collider.enabled)
 390            {
 391                // Enable collider to copy its real bounds
 0392                collider.enabled = true;
 0393                Bounds returnedBounds = collider.bounds;
 394
 395                // Reset modified values
 0396                collider.enabled = false;
 397
 0398                return returnedBounds;
 399            }
 400
 0401            return collider.bounds;
 402        }
 403
 404        private static void UpdateInsideSceneBoundsStatus(IDCLEntity entity, HashSet<IDCLEntity> entitiesOutsideSceneBou
 405        {
 0406            if (isInside)
 0407                entitiesOutsideSceneBounds.Remove(entity);
 408            else
 0409                entitiesOutsideSceneBounds.Add(entity);
 0410        }
 411    }
 412}

Methods/Properties

ECSSceneBoundsCheckerSystem(.BaseList[IParcelScene], .IInternalECSComponent[InternalSceneBoundsCheck], .IInternalECSComponent[InternalVisibility], .IInternalECSComponent[InternalRenderers], .IInternalECSComponent[InternalColliders], .IInternalECSComponent[InternalColliders], System.Boolean)
Dispose()
OnSceneAdded(DCL.Controllers.IParcelScene)
OnSceneRemoved(DCL.Controllers.IParcelScene)
Update()
RunEntityEvaluation(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, System.Collections.Generic.HashSet[Vector2Int], UnityEngine.Bounds, System.Collections.Generic.HashSet[IDCLEntity], DCL.ECS7.InternalComponents.InternalSceneBoundsCheck, ECSSystems.ECSSceneBoundsCheckerSystem.IECSOutOfSceneBoundsFeedbackStyle, System.Boolean)
EvaluateEntityPosition(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, System.Collections.Generic.HashSet[Vector2Int], UnityEngine.Bounds, System.Collections.Generic.HashSet[IDCLEntity], DCL.ECS7.InternalComponents.InternalSceneBoundsCheck)
EvaluateMeshBounds(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, System.Collections.Generic.HashSet[Vector2Int], UnityEngine.Bounds, System.Collections.Generic.HashSet[IDCLEntity], DCL.ECS7.InternalComponents.InternalSceneBoundsCheck, ECSSystems.ECSSceneBoundsCheckerSystem.IECSOutOfSceneBoundsFeedbackStyle, System.Boolean)
AreSubMeshesAndCollidersInsideBounds(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, System.Collections.Generic.HashSet[Vector2Int], System.Collections.Generic.HashSet[IDCLEntity], DCL.ECS7.InternalComponents.InternalSceneBoundsCheck)
WereColliderComponentRemoved(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, .KeyValueSet[Collider,UInt32], .IInternalECSComponent[InternalColliders])
WereRendererComponentRemoved(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, System.Collections.Generic.IList[Renderer], .IInternalECSComponent[InternalRenderers])
SetInsideBoundsStateForMeshComponents(ECSSystems.ECSSceneBoundsCheckerSystem.IECSOutOfSceneBoundsFeedbackStyle, DCL.Models.IDCLEntity, DCL.ECS7.InternalComponents.InternalSceneBoundsCheck, System.Boolean, System.Boolean)
SetInsideBoundsStateForNonMeshComponents(DCL.Models.IDCLEntity, System.Collections.Generic.HashSet[IDCLEntity], DCL.ECS7.InternalComponents.InternalSceneBoundsCheck)
ProcessRendererComponentChanges(.IInternalECSComponent[InternalSceneBoundsCheck], System.Collections.Generic.IReadOnlyList[KeyValueSetTriplet`3])
ProcessPointerColliderComponentChanges(.IInternalECSComponent[InternalSceneBoundsCheck], System.Collections.Generic.IReadOnlyList[KeyValueSetTriplet`3])
ProcessPhysicColliderComponentChanges(.IInternalECSComponent[InternalSceneBoundsCheck], System.Collections.Generic.IReadOnlyList[KeyValueSetTriplet`3])
IsEntityVisible(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, .IInternalECSComponent[InternalVisibility])
RecalculateEntityMeshBounds(DCL.Models.IDCLEntity, DCL.ECS7.InternalComponents.InternalSceneBoundsCheck)
GetColliderBounds(UnityEngine.Collider)
UpdateInsideSceneBoundsStatus(DCL.Models.IDCLEntity, System.Collections.Generic.HashSet[IDCLEntity], System.Boolean)