Aetheria/Assets/Wwise/Deployment/Components/AkSpatialAudioDebugDraw.cs
Reinier Vens db8c3c7779 Initial Wwise Integration
Created wwise project
Integrated inventory UI sounds
Improved projectile weapon behavior (randomized start position, stopped them from self-destructing at target range when airburst is disabled)
2021-02-27 20:53:36 +00:00

176 lines
No EOL
6.6 KiB
C#

#if ! (UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms.
[UnityEngine.AddComponentMenu("Wwise/AkSpatialAudioDebugDraw")]
[UnityEngine.RequireComponent(typeof(AkGameObj))]
///@brief Add this script on a GameObject to print Spatial Audio paths.
public class AkSpatialAudioDebugDraw : UnityEngine.MonoBehaviour
{
#if UNITY_EDITOR
/// This allows you to visualize first order reflection sound paths.
public bool drawFirstOrderReflections = false;
/// This allows you to visualize second order reflection sound paths.
public bool drawSecondOrderReflections = false;
/// This allows you to visualize third or higher order reflection sound paths.
public bool drawHigherOrderReflections = false;
/// This allows you to visualize geometric diffraction sound paths between an obstructed emitter and the listener.
public bool drawDiffractionPaths = false;
private void OnDrawGizmos()
{
if (!UnityEngine.Application.isPlaying || !AkSoundEngine.IsInitialized())
return;
if (debugDrawData == null)
debugDrawData = new DebugDrawData();
if (drawFirstOrderReflections || drawSecondOrderReflections || drawHigherOrderReflections)
debugDrawData.DebugDrawEarlyReflections(gameObject, drawFirstOrderReflections, drawSecondOrderReflections, drawHigherOrderReflections);
if (drawDiffractionPaths)
debugDrawData.DebugDrawDiffraction(gameObject);
}
private class DebugDrawData
{
// Constants
private const uint kMaxIndirectPaths = 64;
private const uint kMaxDiffractionPaths = 16;
private readonly UnityEngine.Color32 colorLightYellow = new UnityEngine.Color32(255, 255, 121, 255);
private readonly UnityEngine.Color32 colorDarkYellow = new UnityEngine.Color32(164, 164, 0, 255);
private readonly UnityEngine.Color32 colorLightOrange = new UnityEngine.Color32(255, 202, 79, 255);
private readonly UnityEngine.Color32 colorDarkOrange = new UnityEngine.Color32(164, 115, 0, 255);
private readonly UnityEngine.Color32 colorLightRed = new UnityEngine.Color32(252, 177, 162, 255);
private readonly UnityEngine.Color32 colorDarkRed = new UnityEngine.Color32(169, 62, 39, 255);
private readonly UnityEngine.Color32 colorLightGrey = new UnityEngine.Color32(75, 75, 75, 255);
private readonly UnityEngine.Color32 colorGreen = new UnityEngine.Color32(38, 113, 88, 255);
private const float radiusSphere = 0.25f;
// Calculated path info
private readonly AkReflectionPathInfoArray indirectPathInfoArray = new AkReflectionPathInfoArray((int)kMaxIndirectPaths);
private readonly AkDiffractionPathInfoArray diffractionPathInfoArray = new AkDiffractionPathInfoArray((int)kMaxDiffractionPaths);
public void DebugDrawEarlyReflections(UnityEngine.GameObject gameObject, bool firstOrder, bool secondOrder, bool higherOrder)
{
var listenerPosition = UnityEngine.Vector3.zero;
var emitterPosition = UnityEngine.Vector3.zero;
uint numValidPaths = (uint)indirectPathInfoArray.Count();
if (AkSoundEngine.QueryReflectionPaths(gameObject, ref listenerPosition, ref emitterPosition, indirectPathInfoArray, out numValidPaths) != AKRESULT.AK_Success)
return;
for (var idxPath = (int)numValidPaths - 1; idxPath >= 0; --idxPath)
{
var path = indirectPathInfoArray[idxPath];
var order = path.numReflections;
var colorLight = colorLightRed;
var colorDark = colorDarkRed;
if (order == 1)
{
if (!firstOrder)
continue;
colorLight = colorLightYellow;
colorDark = colorDarkYellow;
}
else if (order == 2)
{
if (!secondOrder)
continue;
colorLight = colorLightOrange;
colorDark = colorDarkOrange;
}
else if (order > 2 && !higherOrder)
continue;
var listenerPt = listenerPosition;
for (var idxSeg = (int)path.numPathPoints - 1; idxSeg >= 0; --idxSeg)
{
var pt = path.GetPathPoint((uint)idxSeg);
UnityEngine.Debug.DrawLine(listenerPt, pt, path.isOccluded ? colorLightGrey : colorLight);
UnityEngine.Gizmos.color = path.isOccluded ? colorLightGrey : colorLight;
UnityEngine.Gizmos.DrawWireSphere(pt, radiusSphere / 2 / order);
if (!path.isOccluded)
{
var surface = path.GetAcousticSurface((uint)idxSeg);
DrawLabelInFrontOfCam(pt, surface.strName, 100000, colorDark);
}
float dfrnAmount = path.GetDiffraction((uint)idxSeg);
if (dfrnAmount > 0)
{
string dfrnAmountStr = dfrnAmount.ToString("0.#%");
DrawLabelInFrontOfCam(pt, dfrnAmountStr, 100000, colorDark);
}
listenerPt = pt;
}
if (!path.isOccluded)
{
// Finally the last path segment towards the emitter.
UnityEngine.Debug.DrawLine(listenerPt, emitterPosition, path.isOccluded ? colorLightGrey : colorLight);
}
}
}
public void DebugDrawDiffraction(UnityEngine.GameObject gameObject)
{
var listenerPosition = UnityEngine.Vector3.zero;
var emitterPosition = UnityEngine.Vector3.zero;
uint numValidPaths = (uint)diffractionPathInfoArray.Count();
if (AkSoundEngine.QueryDiffractionPaths(gameObject, ref listenerPosition, ref emitterPosition, diffractionPathInfoArray, out numValidPaths) != AKRESULT.AK_Success)
return;
for (var idxPath = (int)numValidPaths - 1; idxPath >= 0; --idxPath)
{
var path = diffractionPathInfoArray[idxPath];
if (path.nodeCount <= 0)
continue;
var prevPt = listenerPosition;
for (var idxSeg = 0; idxSeg < (int)path.nodeCount; ++idxSeg)
{
var pt = path.GetNodes((uint)idxSeg);
UnityEngine.Debug.DrawLine(prevPt, pt, colorGreen);
float angle = path.GetAngles((uint)idxSeg) / UnityEngine.Mathf.PI;
if (angle > 0)
{
string angleStr = angle.ToString("0.#%");
DrawLabelInFrontOfCam(pt, angleStr, 100000, colorGreen);
}
prevPt = pt;
}
UnityEngine.Debug.DrawLine(prevPt, emitterPosition, colorGreen);
}
}
}
private static DebugDrawData debugDrawData = null;
private static void DrawLabelInFrontOfCam(UnityEngine.Vector3 position, string name, float distance, UnityEngine.Color c)
{
var style = new UnityEngine.GUIStyle();
var oncam = UnityEngine.Camera.current.WorldToScreenPoint(position);
if (oncam.x >= 0 && oncam.x <= UnityEngine.Camera.current.pixelWidth && oncam.y >= 0 &&
oncam.y <= UnityEngine.Camera.current.pixelHeight && oncam.z > 0 && oncam.z < distance)
{
style.normal.textColor = c;
UnityEditor.Handles.Label(position, name, style);
}
}
#endif
}
#endif // #if ! (UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms.