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