## Audio Visualisation Accessibility feature for deaf players that paints sound where audio rays bounce. `voiceVisualisationRayCount` rays will be cast outwards from each voice, bouncing `voiceVisualisationBounceCount` times. Each bounce will be stored in an array of Vector3F and this list will be updated every `voiceVisualisationRefreshTime` milliseconds. Alternatively, you can pass a Vector3F* pointer to the voice, which the background thread will write to (e.g. a mapped OpenGL buffer) ## Ambience Permeation Currently rain is muffled only using occlusion rays, meaning rain is just as muffled in a thin metal shed as an underground bunker. Permeation rays should be cast from the **second** bounce position of each ray. This ensures the rays have spread out first before checking for skybox permeation. These rays will then permeate away from the listener, until they reach the world bounds edge. Rays that hit the world edge on their 1st or 2nd bounce will count as 100% permeation energy. The developer controls how permeation and occlusion energy translates to ambient volume, similar to `voiceEnergyFormula`. ## Separate Bounce Counts Currently occlusion and reverb rays bounce the same `trailBounceCount` times, and permeation rays are only cast towards each voice on the first bounce. This should be customisable, with new settings for: - `reverbBounceCount` - `occlusionBounceCount` - `permeationBounceCount` On the backend, trails will be formed as usual to accommodate for the highest bounce count. Unsure if permeation energy should also be affected by the energy currently in each ray when they bounce. Voice LOS data for occlusion will not be stored in ray trail hits if `reverbBounceCount` is higher than `occlusionBounceCount`. With voices requiring similar functionality with separate `voiceReverbRayCount` and `voiceVisualisationRayCount`, a separate 'Emitter' class should be created. This will also support multiple listeners. The class should support: - ray counts (occlusion, reverb, permeation, visualisation) - destinations (listener finds voices, voice finds single listener) - ambiencePermeation flag This class will automatically figure out ray indices, for cases where there are differing ray counts for occlusion and permeation (for example). Threading types should be identical for listeners and voices using this new Emitter class User no longer sets listener positions. They create a ListenerEmitter and access its: - reverb data - occlusion - to each voice? All ray counts should be updated at the same time, rather than one at a time.