public List <GameObject> GetOverlappedObjects(List <GameObject> gameObjects, Camera camera, ObjectBounds.QueryConfig boundsQConfig, MultiSelectOverlapMode overlapMode)
        {
            if (gameObjects.Count == 0 || !IsBigEnoughForOverlap())
            {
                return(new List <GameObject>());
            }

            List <GameObject> overlappedObjects = new List <GameObject>(gameObjects.Count);

            if (overlapMode == MultiSelectOverlapMode.Partial)
            {
                foreach (GameObject gameObject in gameObjects)
                {
                    Rect objectScreenRect = ObjectBounds.CalcScreenRect(gameObject, camera, boundsQConfig);
                    if (_enclosingRect.Overlaps(objectScreenRect, true))
                    {
                        overlappedObjects.Add(gameObject);
                    }
                }
            }
            else
            {
                foreach (GameObject gameObject in gameObjects)
                {
                    Rect objectScreenRect = ObjectBounds.CalcScreenRect(gameObject, camera, boundsQConfig);
                    if (_enclosingRect.ContainsAllPoints(objectScreenRect.GetCornerPoints()))
                    {
                        overlappedObjects.Add(gameObject);
                    }
                }
            }

            return(overlappedObjects);
        }
        public bool OverlapsObject(GameObject gameObject, Camera camera, ObjectBounds.QueryConfig boundsQConfig, MultiSelectOverlapMode overlapMode)
        {
            if (!IsBigEnoughForOverlap())
            {
                return(false);
            }

            if (overlapMode == MultiSelectOverlapMode.Partial)
            {
                Rect objectScreenRect = ObjectBounds.CalcScreenRect(gameObject, camera, boundsQConfig);
                return(_enclosingRect.Overlaps(objectScreenRect, true));
            }
            else
            {
                Rect objectScreenRect = ObjectBounds.CalcScreenRect(gameObject, camera, boundsQConfig);
                return(_enclosingRect.ContainsAllPoints(objectScreenRect.GetCornerPoints()));
            }
        }
示例#3
0
        private void GatherDestinationObjects()
        {
            Camera focusCamera = RTFocusCamera.Get.TargetCamera;

            _destinationObjects.Clear();

            IInputDevice inputDevice = RTInputDevice.Get.Device;

            if (!inputDevice.HasPointer())
            {
                return;
            }
            Vector2 inputDevicePos = inputDevice.GetPositionYAxisUp();

            var boundsQConfig = new ObjectBounds.QueryConfig();

            boundsQConfig.ObjectTypes  = GameObjectTypeHelper.AllCombined;
            boundsQConfig.NoVolumeSize = Vector3Ex.FromValue(1e-5f);

            List <GameObject> visibleObjects = RTFocusCamera.Get.GetVisibleObjects();
            List <GameObject> targetObjects  = new List <GameObject>(_targetObjects);

            visibleObjects.RemoveAll(a => targetObjects.Contains(a) ||
                                     !ObjectBounds.CalcScreenRect(a, focusCamera, boundsQConfig).Contains(inputDevicePos) ||
                                     targetObjects.FindAll(b => a.transform.IsChildOf(b.transform)).Count != 0);

            foreach (var visibleObject in visibleObjects)
            {
                if (!CanUseObjectAsSnapDestination(visibleObject))
                {
                    continue;
                }

                GameObjectType objectType = visibleObject.GetGameObjectType();
                if (objectType == GameObjectType.Mesh || objectType == GameObjectType.Sprite)
                {
                    _destinationObjects.Add(visibleObject);
                }
            }
        }