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