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