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); } }
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; }
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); }
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); }
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); } } }); }