Esempio n. 1
0
    private void UpdateSources(AreaEmitter.Polygon boundary)
    {
        this.sources.Sort(this.compareSources);
        int i = 0;

        while (i < this.sources.Count)
        {
            AreaEmitter.Source source = this.sources[i];
            if (source.polygon != boundary)
            {
                AreaEmitter.StopSource(source);
                this.sources.RemoveAt(i);
            }
            else
            {
                int num = boundary.DescendToClosestSegment(source.segment);
                if (boundary.IsSegmentOccluded(num))
                {
                    num = boundary.AscendToAudibleSegment(source.segment);
                }
                if (!boundary.IsSegmentOccluded(num))
                {
                    source.segment = num;
                }
                AreaEmitter.Segment segment = boundary.GetSegment(source.segment);
                if (boundary.IsSegmentOccluded(source.segment) || segment.sqrDistance > this.sqrEventMaximumDistance)
                {
                    AreaEmitter.StopSource(source);
                    this.sources.RemoveAt(i);
                }
                else
                {
                    Vector3 vector       = segment.closestPoint - source.position;
                    float   sqrMagnitude = vector.sqrMagnitude;
                    float   num2         = this.sourceSpeed * Time.deltaTime;
                    if (num2 * num2 >= sqrMagnitude)
                    {
                        source.position = segment.closestPoint;
                    }
                    else
                    {
                        source.position += vector.normalized * num2;
                    }
                    this.UpdateSource(source);
                    this.sources[i] = source;
                    i++;
                }
            }
        }
        while (this.sources.Count < this.maximumSourceCount)
        {
            int num3 = boundary.FindClosestAudibleSegment();
            if (num3 < 0)
            {
                break;
            }
            this.CreateSource(boundary, num3);
        }
    }
Esempio n. 2
0
        public int FindClosestAudibleSegment()
        {
            int   result = -1;
            float num    = 3.40282347E+38f;

            for (int i = 0; i < this.audibleSegmentCount; i++)
            {
                int index = this.activeSegments[i];
                AreaEmitter.Segment segment = this.segments[index];
                if (!this.IsSegmentOccluded(index) && segment.sqrDistance < num)
                {
                    num    = segment.sqrDistance;
                    result = this.activeSegments[i];
                }
            }
            return(result);
        }
Esempio n. 3
0
        private void UpdateSegment(int index)
        {
            if (this.IsSegmentActive(index))
            {
                return;
            }
            AreaEmitter.Segment value = this.segments[index];
            Vector3             rhs   = LocalPlayer.Transform.position - value.start;
            float num = Vector3.Dot(value.delta, rhs);

            if (num <= 0f)
            {
                value.closestT     = 0f;
                value.closestPoint = value.start;
            }
            else
            {
                float num2 = num / value.length;
                if (num2 >= value.length)
                {
                    value.closestT     = 1f;
                    value.closestPoint = value.start + value.delta;
                }
                else
                {
                    value.closestT     = num2 / value.length;
                    value.closestPoint = value.start + value.delta * value.closestT;
                }
            }
            value.sqrDistance = (value.closestPoint - LocalPlayer.Transform.position).sqrMagnitude;
            List <AreaEmitter.Polygon.SegmentFlags> list;
            List <AreaEmitter.Polygon.SegmentFlags> expr_10D = list = this.segmentFlags;

            AreaEmitter.Polygon.SegmentFlags segmentFlags = list[index];
            expr_10D[index] = (segmentFlags & ~AreaEmitter.Polygon.SegmentFlags.Occluded);
            if (value.sqrDistance < this.sqrMaximumDistance)
            {
                this.activeSegments.Add(index);
                List <AreaEmitter.Polygon.SegmentFlags> list2;
                List <AreaEmitter.Polygon.SegmentFlags> expr_14D = list2 = this.segmentFlags;
                segmentFlags    = list2[index];
                expr_14D[index] = (segmentFlags | AreaEmitter.Polygon.SegmentFlags.Active);
            }
            this.segments[index] = value;
        }