示例#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);
        }
    }
示例#2
0
 private void Update()
 {
     if (LocalPlayer.Transform == null)
     {
         return;
     }
     if (this.bounds.SqrDistance(LocalPlayer.Transform.position) > this.sqrEventMaximumDistance)
     {
         this.StopAllSources();
         return;
     }
     AreaEmitter.Polygon polygon;
     if (this.ContainsPlayer(out polygon))
     {
         if (this.sources.Count > 0)
         {
             int num = 0;
             if (this.sources.Count > 1)
             {
                 float num2 = (this.sources[num].position - LocalPlayer.Transform.position).sqrMagnitude;
                 for (int i = 1; i < this.sources.Count; i++)
                 {
                     float sqrMagnitude = (this.sources[i].position - LocalPlayer.Transform.position).sqrMagnitude;
                     if (sqrMagnitude < num2)
                     {
                         num  = i;
                         num2 = sqrMagnitude;
                     }
                 }
                 for (int j = 0; j < this.sources.Count; j++)
                 {
                     if (j != num)
                     {
                         AreaEmitter.StopSource(this.sources[j]);
                     }
                 }
             }
             this.eventInstanceFollowingPlayer = this.sources[num].eventInstance;
             this.sources.Clear();
         }
         Vector3 position = this.TransformPoint(this.InverseTransformPoint(LocalPlayer.Transform.position));
         if (this.eventInstanceFollowingPlayer != null)
         {
             this.UpdateEvent(this.eventInstanceFollowingPlayer, position);
         }
         else
         {
             UnityUtil.ERRCHECK(this.eventDescription.createInstance(out this.eventInstanceFollowingPlayer));
             this.UpdateEvent(this.eventInstanceFollowingPlayer, position);
             UnityUtil.ERRCHECK(this.eventInstanceFollowingPlayer.start());
         }
     }
     else
     {
         polygon.UpdateSegments(this.inverseTransformDelegate);
         this.UpdateSources(polygon);
     }
 }
示例#3
0
    private void CreateDebugTextures()
    {
        AreaEmitter.lineTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
        AreaEmitter.lineTexture.SetPixel(0, 0, Color.white);
        AreaEmitter.lineTexture.Apply();
        AreaEmitter.voidLineTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
        AreaEmitter.voidLineTexture.SetPixel(0, 0, new Color(0.5f, 0f, 0f));
        AreaEmitter.voidLineTexture.Apply();
        AreaEmitter.occludedLineTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
        AreaEmitter.occludedLineTexture.SetPixel(0, 0, Color.black);
        AreaEmitter.occludedLineTexture.Apply();
        AreaEmitter.occludedVoidLineTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
        AreaEmitter.occludedVoidLineTexture.SetPixel(0, 0, new Color(0.125f, 0f, 0f));
        AreaEmitter.occludedVoidLineTexture.Apply();
        AreaEmitter.occluderBorderTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
        AreaEmitter.occluderBorderTexture.SetPixel(0, 0, new Color(1f, 1f, 1f, 0.25f));
        AreaEmitter.occluderBorderTexture.Apply();
        AreaEmitter.occluderCentreTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
        AreaEmitter.occluderCentreTexture.SetPixel(0, 0, new Color(0f, 0f, 0f, 0.25f));
        AreaEmitter.occluderCentreTexture.Apply();
        AreaEmitter.activeAreaTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
        AreaEmitter.activeAreaTexture.SetPixel(0, 0, Color.green);
        AreaEmitter.activeAreaTexture.Apply();
        AreaEmitter.sourceTexture = new Texture2D(10, 10, TextureFormat.ARGB32, false);
        FMOD_Listener.Fill(AreaEmitter.sourceTexture, new Color(0f, 0f, 0f, 0f));
        AreaEmitter.DrawCross(AreaEmitter.sourceTexture, new Color(1f, 1f, 1f, 0.5f));
        AreaEmitter.sourceTexture.Apply();
        AreaEmitter.pointTexture = new Texture2D(5, 5, TextureFormat.ARGB32, false);
        FMOD_Listener.Fill(AreaEmitter.pointTexture, new Color(1f, 1f, 1f, 0.5f));
        Color color = new Color(1f, 1f, 1f, 0.25f);

        AreaEmitter.pointTexture.SetPixel(0, 0, color);
        AreaEmitter.pointTexture.SetPixel(0, 4, color);
        AreaEmitter.pointTexture.SetPixel(4, 0, color);
        AreaEmitter.pointTexture.SetPixel(4, 4, color);
        AreaEmitter.pointTexture.Apply();
        AreaEmitter.occludedPointTexture = new Texture2D(5, 5, TextureFormat.ARGB32, false);
        FMOD_Listener.Fill(AreaEmitter.occludedPointTexture, new Color(0f, 0f, 0f, 0.5f));
        color = new Color(0f, 0f, 0f, 0.25f);
        AreaEmitter.occludedPointTexture.SetPixel(0, 0, color);
        AreaEmitter.occludedPointTexture.SetPixel(0, 4, color);
        AreaEmitter.occludedPointTexture.SetPixel(4, 0, color);
        AreaEmitter.occludedPointTexture.SetPixel(4, 4, color);
        AreaEmitter.occludedPointTexture.Apply();
    }