Ejemplo n.º 1
0
    private void UpdateSources()
    {
        this.sources.Sort(this.compareSources);
        int i = 0;

        while (i < this.sources.Count)
        {
            LinearEmitter.Source source = this.sources[i];
            int num = this.DescendToClosestSegment(source.segment);
            if (this.IsSegmentOccluded(num))
            {
                num = this.AscendToAudibleSegment(source.segment);
            }
            if (!this.IsSegmentOccluded(num))
            {
                source.segment = num;
            }
            LinearEmitter.Segment segment = this.segments[source.segment];
            if (this.IsSegmentOccluded(source.segment) || segment.sqrDistance > this.sqrEventMaximumDistance)
            {
                UnityUtil.ERRCHECK(source.eventInstance.stop(STOP_MODE.ALLOWFADEOUT));
                UnityUtil.ERRCHECK(source.eventInstance.release());
                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 = this.FindClosestAudibleSegment();
            if (num3 < 0 || this.segments[num3].sqrDistance > this.sqrEventMaximumDistance)
            {
                break;
            }
            LinearEmitter.Source source2;
            source2.segment  = num3;
            source2.position = this.segments[num3].closestPoint;
            UnityUtil.ERRCHECK(this.eventDescription.createInstance(out source2.eventInstance));
            this.UpdateSource(source2);
            UnityUtil.ERRCHECK(source2.eventInstance.start());
            this.sources.Add(source2);
        }
    }
Ejemplo n.º 2
0
    private int AscendToAudibleSegment(int segmentIndex)
    {
        int num  = segmentIndex - 1;
        int num2 = segmentIndex + 1;
        int num3 = 0;

        if (this.loop)
        {
            num  = this.WrapSegmentIndex(num);
            num2 = this.WrapSegmentIndex(num2);
        }
        else if (num < 0)
        {
            num3 = 1;
        }
        else if (num2 >= this.segments.Count)
        {
            num3 = -1;
        }
        if (num3 == 0)
        {
            num3 = ((this.segments[num].sqrDistance <= this.segments[num2].sqrDistance) ? 1 : -1);
        }
        while (this.IsSegmentOccluded(segmentIndex))
        {
            int num4 = segmentIndex + num3;
            if (this.loop)
            {
                num4 = this.WrapSegmentIndex(num4);
            }
            else if (num4 < 0 || num4 >= this.segments.Count)
            {
                break;
            }
            LinearEmitter.Segment segment  = this.segments[segmentIndex];
            LinearEmitter.Segment segment2 = this.segments[num4];
            if (!this.IsSegmentActive(num4))
            {
                break;
            }
            if (segment2.sqrDistance < segment.sqrDistance)
            {
                break;
            }
            segmentIndex = num4;
        }
        return(segmentIndex);
    }
Ejemplo n.º 3
0
    public void DrawDebug(Vector2 centre, float radius, float maximumDistance)
    {
        if (this.sources.Count == 0)
        {
            return;
        }
        if (LinearEmitter.lineTexture == null)
        {
            this.CreateDebugTextures();
        }
        float scale = radius / maximumDistance;
        float num   = maximumDistance * maximumDistance;

        for (int i = 0; i < this.segments.Count; i++)
        {
            LinearEmitter.Segment segment = this.segments[i];
            if (segment.sqrDistance <= num)
            {
                Vector3   vector  = LocalPlayer.Transform.InverseTransformPoint(segment.start);
                Vector3   vector2 = LocalPlayer.Transform.InverseTransformPoint(segment.start + segment.delta);
                bool      flag    = this.IsSegmentActive(i) && !this.IsSegmentOccluded(i);
                Texture2D texture = (!flag) ? LinearEmitter.occludedLineTexture : LinearEmitter.lineTexture;
                Vector2   start   = new Vector2(vector.x, -vector.z) * scale + centre;
                Vector2   end     = new Vector2(vector2.x, -vector2.z) * scale + centre;
                this.DrawLine(start, end, texture);
                if (this.IsSegmentActive(i))
                {
                    Vector3 vector3  = LocalPlayer.Transform.InverseTransformPoint(segment.closestPoint);
                    Vector2 position = new Vector2(vector3.x, -vector3.z) * scale + centre;
                    this.DrawTexture(position, (!this.IsSegmentOccluded(i)) ? LinearEmitter.pointTexture : LinearEmitter.occludedPointTexture);
                }
            }
        }
        this.sources.ForEach(delegate(LinearEmitter.Source source)
        {
            Vector3 vector4 = LocalPlayer.Transform.InverseTransformPoint(this.segments[source.segment].closestPoint);
            this.DrawTexture(new Vector2(vector4.x, -vector4.z) * scale + centre, LinearEmitter.sourceTexture);
            Vector3 vector5 = LocalPlayer.Transform.InverseTransformPoint(source.position);
            this.DrawTexture(new Vector2(vector5.x, -vector5.z) * scale + centre, LinearEmitter.pointTexture);
            float num2 = 57.29578f * Mathf.Atan2(-vector4.z, vector4.x);
            this.DrawLine(centre, num2, radius, LinearEmitter.occluderCentreTexture);
            this.DrawLine(centre, num2 - 45f, radius, LinearEmitter.occluderBorderTexture);
            this.DrawLine(centre, num2 + 45f, radius, LinearEmitter.occluderBorderTexture);
        });
        this.DrawTexture(centre, LinearEmitter.pointTexture);
    }
Ejemplo n.º 4
0
    private int FindClosestAudibleSegment()
    {
        int   result = -1;
        float num    = 3.40282347E+38f;

        for (int i = 0; i < this.audibleSegments.Count; i++)
        {
            int num2 = this.audibleSegments[i];
            LinearEmitter.Segment segment = this.segments[num2];
            if (!this.IsSegmentOccluded(num2) && segment.sqrDistance < num)
            {
                num    = segment.sqrDistance;
                result = num2;
            }
        }
        return(result);
    }
Ejemplo n.º 5
0
    private void OccludeSegments(LinearEmitter.Source occluder)
    {
        if (this.audibleSegments.Count == 0)
        {
            return;
        }
        Vector3 closestPoint = this.segments[occluder.segment].closestPoint;
        Vector3 v            = closestPoint - LocalPlayer.Transform.position;
        float   sqrMagnitude = v.sqrMagnitude;

        v.y = 0f;
        float   num  = -45f;
        Vector3 rhs  = v.RotateY(num);
        Vector3 rhs2 = v.RotateY(-num);
        int     i    = 0;

        while (i < this.audibleSegments.Count)
        {
            int index = this.audibleSegments[i];
            LinearEmitter.Segment segment = this.segments[index];
            bool flag = false;
            if (segment.sqrDistance >= sqrMagnitude)
            {
                Vector3 lhs = segment.closestPoint - LocalPlayer.Transform.position;
                lhs.y = 0f;
                if (Vector3.Dot(lhs, rhs) >= 0f && Vector3.Dot(lhs, rhs2) >= 0f)
                {
                    this.SetSegmentOccluded(index, true);
                    int index2 = this.audibleSegments.Count - 1;
                    this.audibleSegments[i] = this.audibleSegments[index2];
                    this.audibleSegments.RemoveAt(index2);
                    flag = true;
                }
            }
            if (!flag)
            {
                i++;
            }
        }
    }
Ejemplo n.º 6
0
    private void UpdateSegment(int index)
    {
        if (this.IsSegmentActive(index))
        {
            return;
        }
        LinearEmitter.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;
        this.SetSegmentOccluded(index, false);
        if (value.sqrDistance < this.sqrEventMaximumDistance)
        {
            this.audibleSegments.Add(index);
            this.SetSegmentActive(index, true);
        }
        this.segments[index] = value;
    }