84 lines
4.0 KiB
C#
84 lines
4.0 KiB
C#
// Copyright © 2015-2022 Pico Technology Co., Ltd. All Rights Reserved.
|
|
|
|
using UnityEngine;
|
|
|
|
public class PXR_Audio_Spatializer_SceneMaterial : MonoBehaviour
|
|
{
|
|
[Tooltip("Acoustic material preset corresponding to real-world material types. " +
|
|
"Absorption, scattering, and transmission will be automatically set based on the physical nature of the selected material.\n" +
|
|
"Deviating acoustic parameters away from preset values will automatically set this field to 'Custom'")]
|
|
[SerializeField]
|
|
public PXR_Audio.Spatializer.AcousticsMaterial
|
|
materialPreset = PXR_Audio.Spatializer.AcousticsMaterial.AcousticTile;
|
|
|
|
private PXR_Audio.Spatializer.AcousticsMaterial lastMaterialPreset =
|
|
PXR_Audio.Spatializer.AcousticsMaterial.AcousticTile;
|
|
|
|
[SerializeField] [Range(0.0f, 1.0f)]
|
|
public float[] absorption = new float[4];
|
|
|
|
[Tooltip("Ratio of sound energy get scattered by each reflection.\n" +
|
|
" - Low scattering will result in a more echoic sound\n" +
|
|
" - high scattering will result in a more reverberant sound")]
|
|
[SerializeField]
|
|
[Range(0.0f, 1.0f)]
|
|
public float scattering = 0.0f;
|
|
|
|
[Tooltip("Ratio of sound energy get transmitted through this material.")] [SerializeField] [Range(0.0f, 1.0f)]
|
|
public float transmission = 0.0f;
|
|
|
|
private float[] absorptionForValidation = new float[4];
|
|
private float scatteringForValidation = 0.0f;
|
|
private float transmissionForValidation = 0.0f;
|
|
|
|
private static PXR_Audio_Spatializer_Context spatialAudioContextRef;
|
|
|
|
private void OnValidate()
|
|
{
|
|
if (spatialAudioContextRef == null)
|
|
spatialAudioContextRef = FindObjectOfType<PXR_Audio_Spatializer_Context>();
|
|
if (lastMaterialPreset != materialPreset) // material_preset is changed
|
|
{
|
|
if (materialPreset != PXR_Audio.Spatializer.AcousticsMaterial.Custom)
|
|
{
|
|
if (spatialAudioContextRef != null)
|
|
{
|
|
spatialAudioContextRef.PXR_Audio_Spatializer_Api.GetAbsorptionFactor(materialPreset,
|
|
absorption);
|
|
spatialAudioContextRef.PXR_Audio_Spatializer_Api.GetScatteringFactor(materialPreset,
|
|
ref scattering);
|
|
spatialAudioContextRef.PXR_Audio_Spatializer_Api.GetTransmissionFactor(
|
|
materialPreset, ref transmission);
|
|
lastMaterialPreset = materialPreset;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lastMaterialPreset = materialPreset;
|
|
}
|
|
}
|
|
else if (materialPreset != PXR_Audio.Spatializer.AcousticsMaterial.Custom &&
|
|
spatialAudioContextRef !=
|
|
null) // material_preset is not changed, but acoustic properties are changed manually
|
|
{
|
|
// Check if actual material parameters are different from current materialPreset
|
|
spatialAudioContextRef.PXR_Audio_Spatializer_Api.GetAbsorptionFactor(materialPreset,
|
|
absorptionForValidation);
|
|
spatialAudioContextRef.PXR_Audio_Spatializer_Api.GetScatteringFactor(materialPreset,
|
|
ref scatteringForValidation);
|
|
spatialAudioContextRef.PXR_Audio_Spatializer_Api.GetTransmissionFactor(materialPreset,
|
|
ref transmissionForValidation);
|
|
|
|
if (Mathf.Abs(absorption[0] - absorptionForValidation[0]) > float.Epsilon ||
|
|
Mathf.Abs(absorption[1] - absorptionForValidation[1]) > float.Epsilon ||
|
|
Mathf.Abs(absorption[2] - absorptionForValidation[2]) > float.Epsilon ||
|
|
Mathf.Abs(absorption[3] - absorptionForValidation[3]) > float.Epsilon ||
|
|
Mathf.Abs(scattering - scatteringForValidation) > float.Epsilon ||
|
|
Mathf.Abs(transmission - transmissionForValidation) > float.Epsilon)
|
|
{
|
|
materialPreset = PXR_Audio.Spatializer.AcousticsMaterial.Custom;
|
|
lastMaterialPreset = PXR_Audio.Spatializer.AcousticsMaterial.Custom;
|
|
}
|
|
}
|
|
}
|
|
} |