Example #1
0
        public static void RayTestAllLessGarbage(Ray ray, List <RayTestCollision> reusableList, uint maxResults = DEFAULT_MAX_RAY_TEST_RESULTS)
        {
            if (ray.IsInfiniteLength)
            {
                ray = ray.WithLength(RAY_TEST_INF_LENGTH_ACTUAL);
            }

            if (reusableRTResultsList == null)
            {
                reusableRTResultsList = new List <RayTestCollisionDesc>();
                rtcdComparer          = new RTCDComparer();
            }

            PhysicsManager.RayTestAllLessGarbage(ray.StartPoint, ray.EndPoint.Value, maxResults, reusableRTResultsList);
            rtcdComparer.RayOrigin = ray.StartPoint;
            reusableRTResultsList.Sort(rtcdComparer);

            reusableList.Clear();
            lock (staticMutationLock) {
                for (int i = 0; i < reusableRTResultsList.Count; ++i)
                {
                    var    rtcd = reusableRTResultsList[i];
                    Entity firstMatchingEntity = null;
                    for (int e = 0; e < entityList.Count; ++e)
                    {
                        if (entityList[e].PhysicsBody == rtcd.BodyHandle)
                        {
                            firstMatchingEntity = entityList[e];
                            break;
                        }
                    }
                    if (firstMatchingEntity == null)
                    {
                        for (int e = 0; e < entitiesToBeAdded.Count; ++e)
                        {
                            if (entitiesToBeAdded[e].PhysicsBody == rtcd.BodyHandle)
                            {
                                firstMatchingEntity = entitiesToBeAdded[e];
                                break;
                            }
                        }
                    }
                    var result = new RayTestCollision(firstMatchingEntity, (Vector3)rtcd.Position);
                    reusableList.Add(result);
                }
            }
        }