```cs using vaudio; public class Demo { RaytracingContext context; PrismPrimitive prism; Emitter listener; Emitter enemy; public Demo() { context = new RaytracingContext() { WorldSize = new Vector3F(100), RenderingEnabled = true, OnReverbUpdated = OnReverbUpdated, }; // Create a rectangular prism prism = new PrismPrimitive() { // Set its material material = MaterialType.Metal, // Set its size size = new Vector3F(20, 10, 20), }; context.AddPrimitive(prism); // Create a listener emitter listener = new Emitter() { Name = "Listener", ReverbRayCount = 128, ReverbBounceCount = 64, ReverbEnergyCap = 128 * 64 * 0.05, MaxEchogramDuration = 5000, EchogramGranularity = 50, OcclusionRayCount = 512, OcclusionBounceCount = 8, PermeationRayCount = 256, PermeationBounceCount = 4, AmbientOcclusionRayCount = 512, AmbientOcclusionBounceCount = 8, AmbientPermeationRayCount = 128, AmbientPermeationBounceCount = 4, AffectsGroupedEAX = false }; context.AddEmitter(listener); // Create an enemy emitter enemy = new Emitter() { Name = "Enemy", ReverbRayCount = 32, ReverbBounceCount = 64, ReverbEnergyCap = 32 * 64 * 0.05, MaxEchogramDuration = 5000, EchogramGranularity = 50, AffectsGroupedEAX = true }; enemy.OnRaytracedByAnotherEmitter = (Emitter other) => { var filter = other.GetFilter(enemy); // PSEUDOCODE Godot.PlaySound(SoundType.EnemySpawn, enemy.position, filter); } context.AddEmitter(enemy); // Tell the listener to cast occlusion and permeation rays towards the enemy listener.AddTarget(enemy); } void OnReverbUpdated() { // Access reverb stats var returnedPercent = listener.ProcessedReverb.ReturnedPercent; var decayTime = listener.EAX.DecayTime; // Access ambient stats var outsidePercent = listener.OutsidePercent; var ambientGainLF = listener.AmbientFilter.GainLF; } Stopwatch watch = Stopwatch.StartNew(); public void Update() { // Rotate and position the prism in real time var rotation = watch.ElapsedMilliseconds / 1000.0f; prism.transform = Matrix4F.CreateRotationX(rotation) * Matrix4F.CreateTranslation(30, 30, 30); // Position emitters in real time listener.Position = new Vector3F(20); enemy.Position = new Vector3F(10), // Perform raytracing on background threads context.Update(); } } ```