Esempio n. 1
0
        private uint ComputeAngleDistancePriority(ScenePresence presence, ISceneEntity entity)
        {
            // And convert the distance to a priority queue, this computation gives queues
            // at 10, 20, 40, 80, 160, 320, 640, and 1280m
//            uint minpqueue = PriorityQueue.NumberOfImmediateQueues;
            uint maxqueue = PriorityQueue.NumberOfQueues - PriorityQueue.NumberOfImmediateQueues - 1;
//            uint pqueue = minpqueue;
            uint  pqueue = PriorityQueue.NumberOfImmediateQueues;
            float distance;

            Vector3 presencePos = presence.AbsolutePosition;

            if (entity is ScenePresence)
            {
                ScenePresence sp = entity as ScenePresence;
                distance  = Vector3.Distance(presencePos, sp.AbsolutePosition);
                distance *= 0.5f;
            }
            else
            {
                SceneObjectGroup group   = (entity as SceneObjectPart).ParentGroup;
                float            bradius = group.GetBoundsRadius();
                Vector3          grppos  = group.AbsolutePosition + group.getBoundsCenter();
                distance  = Vector3.Distance(presencePos, grppos);
                distance -= bradius;
                distance *= group.getAreaFactor();
                if (group.IsAttachment)
                {
                    distance *= 0.5f;
                }
                else if (group.UsesPhysics)
                {
                    distance *= 0.6f;
                }
                else if (group.GetSittingAvatarsCount() > 0)
                {
                    distance *= 0.5f;
                }
            }

            if (distance > 10f)
            {
                float tmp = (float)Math.Log(distance) * 1.442695f - 3.321928f;
                // for a map identical to original:
                // now
                // 1st constant is 1/(log(2)) (natural log) so we get log2(distance)
                // 2st constant makes it be log2(distance/10)

                pqueue += (uint)tmp;
                if (pqueue > maxqueue)
                {
                    pqueue = maxqueue;
                }
            }

            return(pqueue);
        }