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