Files
kaiju/Assets/WasapiAudio/Scripts/Unity/VfxAudioSpectrumDataBinder3d.cs
T
2022-02-07 20:04:02 +11:00

71 lines
2.5 KiB
C#

using UnityEngine;
using UnityEngine.VFX;
using UnityEngine.VFX.Utility;
namespace Assets.WasapiAudio.Scripts.Unity
{
[AddComponentMenu("VFX/Property Binders/VFX Audio Spectrum Data Binder SDF")]
[VFXBinder("Audio/Audio Spectrum Data to 3d AttributeMap")]
public class VfxAudioSpectrumDataBinder3d : 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, SpectrumSize, SpectrumSize, TextureFormat.RFloat, false);
_texture.name = $"AudioSpectrumDataSDF{SpectrumSize}";
_colorCache = new Color[SpectrumSize * SpectrumSize * SpectrumSize];
}
var spectrumData = GetSpectrumData();
// go from 0 to end of spectrum
for (int x = 0; x < SpectrumSize; x++) {
float height = spectrumData[x] * SpectrumSize;
// go from 0 to the height of the spectrum
for (int y = 0; y < SpectrumSize; y++) {
float distance = y - height;
// _colorCache[(z * SpectrumSize * SpectrumSize) + (y * SpectrumSize) + x] = new Color(distance, 0, 0, 0);
if (x == SpectrumSize - 1) {
_colorCache[(z * SpectrumSize * SpectrumSize) + (y * SpectrumSize) + x] = new Color(Mathf.Infinity, 0, 0, 0);
} else {
_colorCache[(z * SpectrumSize * SpectrumSize) + (y * SpectrumSize) + x] = new Color(distance, 0, 0, 0);
}
}
}
z = (z + 1) % SpectrumSize;
// 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";
}
}
}