Full Code Example

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