コード例 #1
0
ファイル: AreaEmitter.cs プロジェクト: ahvonenj/TheForest
    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
ファイル: AreaEmitter.cs プロジェクト: ahvonenj/TheForest
 public Polygon(AreaEmitter.Polygon other)
 {
     this.points              = new List <Vector2>(other.points);
     this.segments            = new List <AreaEmitter.Segment>();
     this.segmentFlags        = new List <AreaEmitter.Polygon.SegmentFlags>();
     this.activeSegments      = new List <int>();
     this.bounds              = default(Rect);
     this.grid                = null;
     this.gridSize            = Vector2.zero;
     this.sqrMaximumDistance  = 0f;
     this.audibleSegmentCount = 0;
 }
コード例 #3
0
ファイル: AreaEmitter.cs プロジェクト: ahvonenj/TheForest
 private void CreateSource(AreaEmitter.Polygon polygon, int segment)
 {
     AreaEmitter.Source source;
     source.polygon = polygon;
     source.segment = segment;
     if (this.eventInstanceFollowingPlayer != null)
     {
         source.position      = this.TransformPoint(this.InverseTransformPoint(LocalPlayer.Transform.position));
         source.eventInstance = this.eventInstanceFollowingPlayer;
         this.eventInstanceFollowingPlayer = null;
     }
     else
     {
         source.position = polygon.GetSegment(segment).closestPoint;
         UnityUtil.ERRCHECK(this.eventDescription.createInstance(out source.eventInstance));
     }
     this.UpdateSource(source);
     UnityUtil.ERRCHECK(source.eventInstance.start());
     this.sources.Add(source);
 }
コード例 #4
0
ファイル: AreaEmitter.cs プロジェクト: ahvonenj/TheForest
    private bool ContainsPlayer(out AreaEmitter.Polygon boundaryPolygon)
    {
        Vector2 point = this.InverseTransformPoint(LocalPlayer.Transform.position);

        if (this.perimeter.ContainsPoint(point))
        {
            for (int i = 0; i < this.voids.Count; i++)
            {
                if (this.voids[i].ContainsPoint(point))
                {
                    boundaryPolygon = this.voids[i];
                    return(false);
                }
            }
            boundaryPolygon = null;
            return(true);
        }
        boundaryPolygon = this.perimeter;
        return(false);
    }
コード例 #5
0
ファイル: AreaEmitter.cs プロジェクト: ahvonenj/TheForest
 private void DrawPolygon(AreaEmitter.Polygon polygon, Vector2 centre, float scale, float sqrMaximumDistance, Texture2D audibleTexture, Texture2D occludedTexture, bool drawPoints)
 {
     polygon.ForEachSegment(delegate(AreaEmitter.Segment segment, bool audible)
     {
         if (segment.sqrDistance <= sqrMaximumDistance)
         {
             Vector3 vector    = LocalPlayer.Transform.InverseTransformPoint(segment.start);
             Vector3 vector2   = LocalPlayer.Transform.InverseTransformPoint(segment.start + segment.delta);
             Texture2D texture = (!audible) ? occludedTexture : audibleTexture;
             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 (drawPoints)
             {
                 Vector3 vector3  = LocalPlayer.Transform.InverseTransformPoint(segment.closestPoint);
                 Vector2 position = new Vector2(vector3.x, -vector3.z) * scale + centre;
                 this.DrawTexture(position, (!audible) ? AreaEmitter.occludedPointTexture : AreaEmitter.pointTexture);
             }
         }
     });
 }