### C# - Version 1.1.2 Fixes: - Fixed a crash when reducing `context.MaximumConcurrencyLevel` down to `1` at runtime - Fixed an issue where meshes would incorrectly block permeation rays - Fixed a crash when reducing all ray counts to `0` after adding targets to an `Emitter` - Fixed an issue where trails wouldn't be trimmed when line-of-sight is lost - Fixed reverb ray rendering in the debug window - Trails are now correctly regenerated when an emitter passes through geometry - Fixed a crash when running multiple contexts in parallel Additions: - New ambient occlusion/permeation system - New `AmbienceOcclusionRayCount` and `AmbienceOcclusionBounceCount` emitter settings. Ambience occlusion was previously tied to reverb (for calculating outside percentage) - New `RefreshDistanceThreshold` emitter setting that controls how far a ray must deviate from its old position before the trail is refreshed Removed: - Room volume calculation (expensive and unnecessary) - Reverb wetness (use emitter gain instead) Optimisations: - Parallelised expensive collation work from the single analysis thread across multiple worker threads - Culled excessive trail rays being cast when different ray features (e.g. occlusion and reverb) have different ray/bounce counts - Trails are no longer unnecessarily re-generated when an emitter moves (floating point precision) - Prevented memory allocation on background threads when tracking reverb hit positions - Prevented memory allocation on background threads when collating directional EAX - Primitive updates no longer cause memory allocations on background threads ### C# - Version 1.1.1 Fixes: - Rays now collide with cones, cylinders, disks and half-spheres correctly - Fixed `RaytracingContext.TotalPossibleRayCount` result - now includes refresh rays and trail verification rays - Meshes now render correctly in the debug window when disabling and enabling rendering - Fixed EAX decay time calculation - previously it would produce large values when the echogram contained a tiny amount of data much later on. Now it stops checking for data after the first empty bin. If your echogram has gaps (red lines in the debug window), increase the new `Emitter.MaxEchogramTime` setting from 10ms (default) to 50ms or 100ms. Additions: - New `RaytracingContext.WorldIsIndoors` setting that controls whether the entire world is considered indoors or outdoors. When false, reverb rays stop checking for line-of-sight after hitting the world edge. Defaults to false - The length and granularity of each Emitter's echogram can now be adjusted via the new `Emitter.MaxEchogramTime` and `Emitter.EchogramGranularity` settings - Emitters can now cast rays from multiple positions via the new `Emitter.OverridePositions` setting. Rays are cast round-robin style, e.g. with 128 rays and 2 vectors in `Emitter.OverridePositions`, even rays will be cast from the 1st vector and odd rays will be cast from the 2nd vector. - Emitters can now cast rays in custom directions via the new `Emitter.OverrideRayDirections` setting. Same round-robin style as above Changes: - Capitalised the ray colour fields in Emitter: `TrailColor`, `ReverbColor`, `OcclusionColor`, `PermeationColor`, `AmbientPermeationColor` - The debug window now renders each Emitter's echogram Optimisations: - Faster permeation intersection for meshes ### C# - Version 1.1.0 See [[Breaking Changes v1.1.0]] for an overview of breaking changes and new features. **Fixes:** - Voice reverb ray lengths now account for `metersPerUnit` correctly - Listener and Voice UI in the debug window now matches the 3D position of the emitter correctly - Fixed stale data when disabling permeation at runtime - Fixed NaN gain values from the default `voiceEnergyFormula` when occlusion or permeation is disabled - The order of groupedEAX indices is now stable - Fixed an edge case were occlusion/LOS rays were not re-cast when primitives moved - Fixed an exception when reducing `MaximumGroupedEAXCount` - Removed hardcoded SIMD code for bounding box checks (broken on Mac Parallels) - All rays are now correctly re-cast when materials are updated - Fixed ray reflections off world bounds edges - Fixed an issue where reverb line-of-sight was incorrectly blocked by the same surface the ray just bounced off - Fixed an issue where rays that collided with meshes were re-cast every frame, rather than being cached - Fixed reverb bounds and center calculation when `MetersPerUnit` is a value other than `1.0f` - Rays now correctly bounce within concave meshes **Changes:** - All settings can be changed at runtime with no stutters on the main thread - More accurate reverb pan/directionality calculation, with new `Emitter.EAXPanInnerThreshold` and `Emitter.EAXPanOuterThreshold` settings **Additions:** - New `Emitter` system - support for multiple listeners, customisable ray counts and customisable bounce counts - Two new ray types: Ambient Permeation and Visualisation - The debug rendering window can now render occlusion and permeation rays. Set the `emitter.occlusionColor` and `emitter.permeationColor` variables to render them. - New `PlaneTransmissionLF` and `PlaneTransmissionHF` material settings that control how much energy is lost when rays pass through flat planes **Optimisations:** - Slightly less memory usage - Heavy memory allocations moved to background threads - Post-raytracing analysis logic moved to background threads - No more stutters when changing ray counts, bounce counts, or maximum concurrency level on the main thread at runtime - Slightly faster primitive-ray intersections ### C# - Version 1.0.6 **Fixes:** - More robust world bounds checks - rays should never leave the world bounds **Changes:** - Removed some debug logging - Logs are now prefixed with `[vaudio]` **Optimisations:** - Raytracing should be slightly faster as the world bounds is no longer included in the BVH ### C# - Version 1.0.5 **Fixes:** - EAX `DecayTime` no longer flickers with sparse echograms - Fixed a `NullReferenceException` when creating a `RaytracingContext` with both `occlusionRayCount` and `permeationRayCount` set to 0 - Fixed an edge case where rays could leave the world when colliding with a primitive exactly on the world edge - Rays will now bounce correctly within a concave `MeshPrimitive` - Fixed an edge case where voices wouldn't render in the debug window - EAX gainLF and gainHF are now calculated correctly when `occlusionRayCount` or `permeationRayCount` are higher than `reverbRayCount` - Shader errors use the custom logging callback rather than `Console.WriteLine` **Changes:** - Removed all `outsideEAX` functionality - use `groupedEAX` instread **Additions:** - Added a new `supportsPemeation` field on `MeshPrimitive`, for meshes that are watertight. Currently only supports permeation between the first 2 intersections (complex concave shapes are not supported yet) - New `EAXReverbResults.ALEffectSlotGain` parameter that is automatically calculated for grouped EAX effects for voices - New `EAXReverbResults.BoundsMin` and `EAXReverbResults.BoundsMax` properties for the min and max 3D bounds of the reverb space ### C# - Version 1.0.4 **Changes:** - `Voice.filter` is now initially `null`, to prevent accidentally accessing it before raytracing completes - **Additions:** - New `RaytracingContext.OnReverbUpdated` callback, which fires after reverb is updated and before `Voice.OnRaytracingComplete` fires. This gives you a chance to update your EAX reverb effects, before `Voice.OnRaytracingComplete` tries to access them. ### C# - Version 1.0.3 **Fixes:** - Fixed a crash when creating a `RaytracingContext` with `RaytracingContextSettings.airAbsorption` set to null - Fixed an edge case where occlusion energy did not reset to 0 when no occlusion rays could reach a voice **Changes:** - Renamed `context.ListenerEAXReverb` to `context.ListenerEAX` - Renamed `context.OutsideEAXReverb` to `context.OutsideEAX` - Renamed `context.BlendedEAXReverb` to `context.GroupedEAX` - Renamed `settings.blendedReverbPresetAmount` to `settings.maximumGroupedEAXCount` - Renamed `voice.blendedEAXIndex` to `voice.groupedEAXIndex` - Renamed `ProcessedReverbResults.ReturningPercent` to `ProcessedReverbResults.ReturnedPercent` - Removed Sabine / Eyring / Theoretical RT60 properties from `ProcessedReverbResults`. Use `MeasuredDecayTimeLF` and `MeasuredDecayTimeHF` instead **Additions:** - Added XML documentation to `RaytracingContextSettings` - Added XML documentation to `RaytracingContext` - Added XML documentation to all primitives - Added XML documentation to `MaterialProperties` - Added XML documentation to `RawReverbResults` - **Optimisations:** - Line-of-sight rays for reverb are no longer cast back to the listener after the ray escapes outside (hits the world bounds) ### C# - Version 1.0.2 **Fixes:** - Rays now properly lose energy when bouncing off primitives when `reverbRayCount` is 0 - Fixed voice energy calculation when occlusion and permeation rays are different - Rays will no longer incorrectly travel through the primitive they just bounced off, when their next hit was trimmed - Rays will no longer have LOS blocked by the primitive they just bounced off - More accurate reflection positions when rays bounce off primitives - The rendering window now shows the correct ray counts **Changes:** - Warnings are now logged when creating voices when `occlusionRayCount` and `permeationRayCount` are zero (as no rays will be cast against voices) - Renamed `RaytracingContext.trailColour` to `RaytracingContext.trailColor` - Renamed `RaytracingContext.reverbColour` to `RaytracingContext.reverbColor` - Renamed `MaterialSettings.colours` to `MaterialSettings.colors` - Occlusion rays are no longer fired directly from the listener to each voice (only on each bounce) **Optimisations:** - Slightly faster bounding box intersection tests - Slightly less memory usage - Slightly faster primitive updates - Slightly less CPU usage on the main thread - Removed a decent amount of unused code ### C# - Version 1.0.1 **Fixes:** - Fixed air absorption - it was not applied at all - `RaytracingContext` can now be initialised with 0 `reverbRayCount` - Occlusion now works correctly when `reverbRayCount` is 0 **Changes:** - Air absorption now uses Celsius instead of Farenheit - Occlusion energy is now accumulated even after rays bounce off the edge of the map. Might make this a setting