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>