74 lines
2.5 KiB
C#
74 lines
2.5 KiB
C#
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";
|
|
}
|
|
}
|
|
} |