using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SoundMaterial : MonoBehaviour
{
    [SerializeField] private Material[] materials; // 머티리얼 배열
    [SerializeField] private float sensitivity = 1.0f; // 소리 감도 조절
    [SerializeField] private float smoothTime = 0.1f; // 부드러운 전환을 위한 시간
    [SerializeField] private float minPower = 0f; // 최소 파워 값
    [SerializeField] private float maxPower = 1f; // 최대 파워 값

    private float[] spectrumData = new float[1024]; // 스펙트럼 데이터 배열
    private float[] currentPower; // 현재 파워 값 배열
    private float[] targetPower; // 목표 파워 값 배열
    private float[] velocity; // 부드러운 전환을 위한 속도 배열

    // Start is called before the first frame update
    void Start()
    {
        // 배열 초기화
        currentPower = new float[materials.Length];
        targetPower = new float[materials.Length];
        velocity = new float[materials.Length];

        // 초기 파워 값 설정
        for (int i = 0; i < materials.Length; i++)
        {
            currentPower[i] = minPower;
            targetPower[i] = minPower;
        }
    }

    // Update is called once per frame
    void Update()
    {
        // 오디오 스펙트럼 데이터 가져오기
        AudioListener.GetSpectrumData(spectrumData, 0, FFTWindow.BlackmanHarris);

        // 각 머티리얼에 대해 파워 값 업데이트
        for (int i = 0; i < materials.Length; i++)
        {
            // 해당 머티리얼의 주파수 대역에 해당하는 스펙트럼 데이터 평균 계산
            int startIndex = i * (spectrumData.Length / materials.Length);
            int endIndex = (i + 1) * (spectrumData.Length / materials.Length);
            float average = 0f;

            for (int j = startIndex; j < endIndex; j++)
            {
                average += spectrumData[j];
            }
            average /= (endIndex - startIndex);

            // 목표 파워 값 설정
            targetPower[i] = Mathf.Lerp(minPower, maxPower, average * sensitivity);

            // 부드러운 전환을 위해 SmoothDamp 사용
            currentPower[i] = Mathf.SmoothDamp(currentPower[i], targetPower[i], ref velocity[i], smoothTime);

            // 머티리얼의 파워 값 업데이트
            materials[i].SetFloat("_Power", currentPower[i]);
        }
    }
}
