<div data-tabs="full-code-example" markdown="1"> <div data-tab="C#" markdown="1"> ```cs using vaudio; public class Demo { RaytracingContext context; PrismPrimitive prism; Voice voice; public Demo() { var settings = new RaytracingContextSettings() { worldSize = new Vector3F(100, 100, 100), renderingEnabled = true, maxVoices = 16, reverbRayCount = 1024, occlusionRayCount = 512, permeationRayCount = 256, trailBounceCount = 8, }; context = new RaytracingContext(settings); // Create a rectangular prism prism = new PrismPrimitive() { // Set its material material = MaterialType.Metal }; context.AddPrimitive(prism); // Create a voice voice = context.CreateVoice(new StaticPositionF(4, 4, 4)); voice.OnRaytracingComplete = () => { // Check low-pass filter gains var gainLF = (int)(voice.filter.gainLF * 100); var gainHF = (int)(voice.filter.gainHF * 100); Console.WriteLine(quot;The voice has {gainLF}% LF gain"); Console.WriteLine(quot;The voice has {gainHF}% HF gain"); }; } 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); // Set the listener to the camera position, so when you fly around // in the debug window, the listener position updates context.UpdateListener(context.cameraPosition); // Perform raytracing on background threads context.Update(); } } ``` </div> <div data-tab="C" markdown="1"> ```c #include "context/raytracing_context.h" #include "settings/raytracing_context_settings.h" #include "settings/raytracing_context_validation.h" #include "types/voice.h" #include "types/vector3f.h" #include "types/matrix4f.h" #include "types/audio_filter.h" #include "primitive/primitive.h" #include "primitive/prism_primitive.h" void on_raytracing_complete_callback(Voice* voice) { // Check low-pass filter gains int gainLF = (int)(voice->filter->gainLF * 100); int gainHF = (int)(voice->filter->gainHF * 100); printf("The voice has %d%% LF gain\n", gainLF); printf("The voice has %d%% HF gain\n", gainHF); } int main(void) { RaytracingContextSettings* settings = raytracing_context_settings_create(); settings->world_size = vector3f_create(100, 100, 100); settings->max_voices = 16; settings->reverb_ray_count = 1024; settings->occlusion_ray_count = 512; settings->permeation_ray_count = 256; settings->trail_bounce_count = 8; // Validate settings ValidationResult result = validate_raytracing_context_settings(settings); if (!result.is_valid) { printf(result.error_message); return 1; } // Create the raytracing context RaytracingContext* context = raytracing_context_create(settings); // Free settings raytracing_context_settings_free(settings); settings = NULL; // Create a rectangular prism PrismPrimitive* prism = prism_primitive_create(); primitive_set_material((Primitive*)prism, MATERIAL_METAL); raytracing_context_add_primitive(context, (Primitive*)prism); // Create a voice Voice* voice = raytracing_context_create_voice(context, 0, vector3f_create(20, 80, 80)); voice->on_raytracing_complete = on_raytracing_complete_callback; // Update Stopwatch* watch = stopwatch_create(); stopwatch_start(watch); while (true) { // Rotate and position the prism in real time float elapsed = stopwatch_elapsed_ms(watch) * 0.001f; Matrix4F rotation = matrix4f_create_rotation_x(elapsed); Matrix4F translate = matrix4f_create_translation(30, 30, 30); Matrix4F transform = matrix4f_multiply(&rotation, &translate); prism_primitive_set_transform(prism, &transform); // Set the listener position raytracing_context_set_listener_position(context, vector3f_create(20, 20, 20)); // Perform raytracing on background threads raytracing_context_update(context); Sleep(1); } } ``` </div> </div>