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,
};
prism = new PrismPrimitive()
{
material = MaterialType.Metal,
size = new Vector3F(20, 10, 20),
};
context.AddPrimitive(prism);
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);
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);
Godot.PlaySound(SoundType.EnemySpawn, enemy.position, filter);
}
context.AddEmitter(enemy);
listener.AddTarget(enemy);
}
void OnReverbUpdated()
{
var returnedPercent = listener.ProcessedReverb.ReturnedPercent;
var decayTime = listener.EAX.DecayTime;
var outsidePercent = listener.OutsidePercent;
var ambientGainLF = listener.AmbientFilter.GainLF;
}
Stopwatch watch = Stopwatch.StartNew();
public void Update()
{
var rotation = watch.ElapsedMilliseconds / 1000.0f;
prism.transform = Matrix4F.CreateRotationX(rotation) *
Matrix4F.CreateTranslation(30, 30, 30);
listener.Position = new Vector3F(20);
enemy.Position = new Vector3F(10),
context.Update();
}
}