using UnityEngine; using UnityEngine.VFX; using UnityEngine.VFX.Utility; namespace Assets.WasapiAudio.Scripts.Unity { [AddComponentMenu("VFX/Property Binders/Spectre - VFX SDF Binder")] [VFXBinder("Audio/Audio Spectrum Data to 3d SDF AttributeMap")] public class SpectreVfxSdfBinder : VfxAudioVisualizationEffect { [VFXPropertyBinding("System.UInt32"), SerializeField] protected ExposedProperty SpectrumSizeParameter = "SpectrumSize"; [VFXPropertyBinding("UnityEngine.Texture3D"), SerializeField] protected ExposedProperty SpectrumDataTextureParameter = "SpectrumDataTexture"; private Texture3D _texture; private Color[] _colorCache; private int z = 0; private void UpdateTexture() { if (_texture == null) { _texture = new Texture3D(SpectrumSize * 2, SpectrumSize * 2, SpectrumSize * 2, TextureFormat.RFloat, false); _texture.name = $"AudioSpectrumDataSDF{SpectrumSize}"; _colorCache = new Color[ SpectrumSize * 2 * SpectrumSize * 2 * SpectrumSize * 2 ]; } var spectrumData = GetSpectrumData(); // go from 0 to end of spectrum for (int x = 0; x < SpectrumSize; x++) { float height = spectrumData[x] * SpectrumSize * 2; // go from 0 to double the spectrum height for (int y = 0; y < SpectrumSize * 2; y++) { float distance = (y - height); var z_part = z * (SpectrumSize * 2 * SpectrumSize * 2); var y_part = y * SpectrumSize * 2; _colorCache[z_part + y_part + (SpectrumSize + x)] = new Color(distance, 0, 0, 0); _colorCache[z_part + y_part + (SpectrumSize - (x + 1))] = new Color(distance, 0, 0, 0); } } z = (z + 1) % (SpectrumSize * 2); // Debug.Log($"{z}"); _texture.SetPixels(_colorCache); _texture.Apply(); } public override void UpdateBinding(VisualEffect component) { base.UpdateBinding(component); UpdateTexture(); component.SetUInt(SpectrumSizeParameter, (uint) SpectrumSize); component.SetTexture(SpectrumDataTextureParameter, _texture); } public override string ToString() { return "Audio Spectrum Data"; } } }