Пример #1
0
        public void OnBehaviorUpdate()
        {
            if (m_SpatialHashContainer == null)
            {
                return;
            }

            if (m_Testers == null)
            {
                return;
            }

            for (int i = 0; i < m_Testers.Count; i++)
            {
                var tester = m_Testers[i];
                if (!tester.active)
                {
                    //Intersection Exit
                    m_IntersectedObjects[tester].renderer = null;
                    continue;
                }

                var testerTransform = tester.transform;
                if (testerTransform.hasChanged)
                {
                    var intersectionFound = false;
                    k_Renderers.Clear();
                    var testerCollider = tester.collider;
                    if (m_SpatialHashContainer.GetIntersections(k_Renderers, testerCollider.bounds))
                    {
                        var testerBounds       = testerCollider.bounds;
                        var testerBoundsCenter = testerBounds.center;

                        k_SortedIntersections.Clear();
                        for (int j = 0; j < k_Renderers.Count; j++)
                        {
                            var obj = k_Renderers[j];

                            // Ignore destroyed objects
                            if (!obj)
                            {
                                continue;
                            }

                            // Ignore inactive objects
                            var go = obj.gameObject;
                            if (!go.activeInHierarchy)
                            {
                                continue;
                            }

                            // Ignore locked objects
                            if (this.IsLocked(go))
                            {
                                continue;
                            }

                            // Bounds check
                            if (!obj.bounds.Intersects(testerBounds))
                            {
                                continue;
                            }

                            // Check if the object is larger than the player, and the player is inside it
                            if (ContainsVRPlayerCompletely(go))
                            {
                                continue;
                            }

                            k_SortedIntersections.Add(new SortableRenderer
                            {
                                renderer = obj,
                                distance = (obj.bounds.center - testerBoundsCenter).magnitude
                            });
                        }

                        //Sort list to try and hit closer object first
                        k_SortedIntersections.Sort((a, b) => a.distance.CompareTo(b.distance));

                        if (k_SortedIntersections.Count > k_MaxTestsPerTester)
                        {
                            continue;
                        }

                        for (int j = 0; j < k_SortedIntersections.Count; j++)
                        {
                            Vector3 contactPoint;
                            var     renderer = k_SortedIntersections[j].renderer;
                            if (IntersectionUtils.TestObject(m_CollisionTester, renderer, tester, out contactPoint))
                            {
                                intersectionFound = true;
                                var intersection = m_IntersectedObjects[tester];
                                if (intersection.renderer == renderer)
                                {
                                    // Intersection Stay
                                    intersection.contactPoint = contactPoint;
                                }
                                else
                                {
                                    // Intersection Exit / Enter
                                    intersection.renderer     = renderer;
                                    intersection.contactPoint = contactPoint;
                                }
                            }

                            if (intersectionFound)
                            {
                                break;
                            }
                        }
                    }

                    // Intersection Exit
                    if (!intersectionFound)
                    {
                        m_IntersectedObjects[tester].renderer = null;
                    }

                    testerTransform.hasChanged = false;
                }
            }
        }
Пример #2
0
        void Update()
        {
            if (m_SpatialHash == null)
            {
                return;
            }

            if (m_Testers == null)
            {
                return;
            }

            foreach (var tester in m_Testers)
            {
                if (!tester.active)
                {
                    Renderer intersectedObject;
                    if (m_IntersectedObjects.TryGetValue(tester, out intersectedObject))
                    {
                        OnIntersectionExit(tester, intersectedObject);
                    }

                    continue;
                }

                var testerTransform = tester.transform;
                if (testerTransform.hasChanged)
                {
                    var        intersectionFound = false;
                    Renderer[] intersections;
                    if (m_SpatialHash.GetIntersections(tester.renderer.bounds, out intersections))
                    {
                        //Sort list to try and hit closer object first
                        var testerBounds       = tester.renderer.bounds;
                        var testerBoundsCenter = testerBounds.center;
                        Array.Sort(intersections, (a, b) => (a.bounds.center - testerBoundsCenter).magnitude.CompareTo((b.bounds.center - testerBoundsCenter).magnitude));
                        var intersectionList = intersections.ToList();
                        intersectionList.RemoveAll(obj =>
                        {
                            // Ignore destroyed objects
                            if (!obj)
                            {
                                return(true);
                            }

                            // Ignore inactive objects
                            if (!obj.gameObject.activeInHierarchy)
                            {
                                return(true);
                            }

                            // Ignore locked objects
                            if (isLocked(obj.gameObject))
                            {
                                return(true);
                            }

                            // Bounds check
                            if (!obj.bounds.Intersects(testerBounds))
                            {
                                return(true);
                            }

                            return(false);
                        });

                        if (intersectionList.Count > k_MaxTestsPerTester)
                        {
                            continue;
                        }

                        foreach (var obj in intersectionList)
                        {
                            if (IntersectionUtils.TestObject(m_CollisionTester, obj, tester))
                            {
                                intersectionFound = true;
                                Renderer currentObject;
                                if (m_IntersectedObjects.TryGetValue(tester, out currentObject))
                                {
                                    if (currentObject == obj)
                                    {
                                        OnIntersectionStay(tester, obj);
                                    }
                                    else
                                    {
                                        OnIntersectionExit(tester, currentObject);
                                        OnIntersectionEnter(tester, obj);
                                    }
                                }
                                else
                                {
                                    OnIntersectionEnter(tester, obj);
                                }
                            }

                            if (intersectionFound)
                            {
                                break;
                            }
                        }
                    }

                    if (!intersectionFound)
                    {
                        Renderer intersectedObject;
                        if (m_IntersectedObjects.TryGetValue(tester, out intersectedObject))
                        {
                            OnIntersectionExit(tester, intersectedObject);
                        }
                    }

                    testerTransform.hasChanged = false;
                }
            }
        }
Пример #3
0
        void Update()
        {
            if (m_SpatialHash == null)
            {
                return;
            }

            if (m_Testers == null)
            {
                return;
            }

            for (int i = 0; i < m_Testers.Count; i++)
            {
                var tester = m_Testers[i];
                if (!tester.active)
                {
                    Renderer intersectedObject;
                    if (m_IntersectedObjects.TryGetValue(tester, out intersectedObject))
                    {
                        OnIntersectionExit(tester);
                    }

                    continue;
                }

                var testerTransform = tester.transform;
                if (testerTransform.hasChanged)
                {
                    var intersectionFound = false;
                    m_Intersections.Clear();
                    var testerCollider = tester.collider;
                    if (m_SpatialHash.GetIntersections(m_Intersections, testerCollider.bounds))
                    {
                        var testerBounds       = testerCollider.bounds;
                        var testerBoundsCenter = testerBounds.center;

                        m_SortedIntersections.Clear();
                        for (int j = 0; j < m_Intersections.Count; j++)
                        {
                            var obj = m_Intersections[j];

                            // Ignore destroyed objects
                            if (!obj)
                            {
                                continue;
                            }

                            // Ignore inactive objects
                            var go = obj.gameObject;
                            if (!go.activeInHierarchy)
                            {
                                continue;
                            }

                            // Ignore locked objects
                            if (this.IsLocked(go))
                            {
                                continue;
                            }

                            // Bounds check
                            if (!obj.bounds.Intersects(testerBounds))
                            {
                                continue;
                            }

                            // Check if the object is larger than the player, and the player is inside it
                            if (ContainsVRPlayerCompletely(go))
                            {
                                continue;
                            }

                            m_SortedIntersections.Add(new SortableRenderer
                            {
                                renderer = obj,
                                distance = (obj.bounds.center - testerBoundsCenter).magnitude
                            });
                        }

                        //Sort list to try and hit closer object first
                        m_SortedIntersections.Sort((a, b) => a.distance.CompareTo(b.distance));

                        if (m_SortedIntersections.Count > k_MaxTestsPerTester)
                        {
                            continue;
                        }

                        for (int j = 0; j < m_SortedIntersections.Count; j++)
                        {
                            var obj = m_SortedIntersections[j].renderer;
                            if (IntersectionUtils.TestObject(m_CollisionTester, obj, tester))
                            {
                                intersectionFound = true;
                                Renderer currentObject;
                                if (m_IntersectedObjects.TryGetValue(tester, out currentObject))
                                {
                                    if (currentObject == obj)
                                    {
                                        OnIntersectionStay(tester, obj);
                                    }
                                    else
                                    {
                                        OnIntersectionExit(tester);
                                        OnIntersectionEnter(tester, obj);
                                    }
                                }
                                else
                                {
                                    OnIntersectionEnter(tester, obj);
                                }
                            }

                            if (intersectionFound)
                            {
                                break;
                            }
                        }
                    }

                    if (!intersectionFound)
                    {
                        Renderer intersectedObject;
                        if (m_IntersectedObjects.TryGetValue(tester, out intersectedObject))
                        {
                            OnIntersectionExit(tester);
                        }
                    }

                    testerTransform.hasChanged = false;
                }
            }
        }