Aetheria/Assets/Wwise/API/Editor/WwiseWindows/AkWwiseXMLBuilder.cs
2021-04-30 07:09:07 +01:00

156 lines
No EOL
4.2 KiB
C#

#if UNITY_EDITOR
//////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2014 Audiokinetic Inc. / All Rights Reserved
//
//////////////////////////////////////////////////////////////////////
[UnityEditor.InitializeOnLoad]
public class AkWwiseXMLBuilder
{
private static readonly System.DateTime s_LastParsed = System.DateTime.MinValue;
static AkWwiseXMLBuilder()
{
AkWwiseFileWatcher.Instance.PopulateXML += Populate;
UnityEditor.EditorApplication.playModeStateChanged += PlayModeChanged;
}
private static void PlayModeChanged(UnityEditor.PlayModeStateChange mode)
{
if (mode == UnityEditor.PlayModeStateChange.EnteredEditMode)
{
AkWwiseProjectInfo.Populate();
AkWwiseFileWatcher.Instance.StartWatchers();
}
}
public static bool Populate()
{
if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode || UnityEditor.EditorApplication.isCompiling)
{
return false;
}
try
{
// Try getting the SoundbanksInfo.xml file for Windows or Mac first, then try to find any other available platform.
var logWarnings = AkBasePathGetter.LogWarnings;
AkBasePathGetter.LogWarnings = false;
var FullSoundbankPath = AkBasePathGetter.GetPlatformBasePath();
AkBasePathGetter.LogWarnings = logWarnings;
var filename = System.IO.Path.Combine(FullSoundbankPath, "SoundbanksInfo.xml");
if (!System.IO.File.Exists(filename))
{
FullSoundbankPath = System.IO.Path.Combine(UnityEngine.Application.streamingAssetsPath, AkWwiseEditorSettings.Instance.SoundbankPath);
if (!System.IO.Directory.Exists(FullSoundbankPath))
return false;
var foundFiles = System.IO.Directory.GetFiles(FullSoundbankPath, "SoundbanksInfo.xml", System.IO.SearchOption.AllDirectories);
if (foundFiles.Length == 0)
return false;
filename = foundFiles[0];
}
var time = System.IO.File.GetLastWriteTime(filename);
if (time <= s_LastParsed)
{
return false;
}
var doc = new System.Xml.XmlDocument();
doc.Load(filename);
var bChanged = false;
var soundBanks = doc.GetElementsByTagName("SoundBanks");
for (var i = 0; i < soundBanks.Count; i++)
{
var soundBank = soundBanks[i].SelectNodes("SoundBank");
for (var j = 0; j < soundBank.Count; j++)
{
bChanged = SerialiseSoundBank(soundBank[j]) || bChanged;
}
}
return bChanged;
}
catch
{
return false;
}
}
private static bool SerialiseSoundBank(System.Xml.XmlNode node)
{
var bChanged = false;
var includedEvents = node.SelectNodes("IncludedEvents");
for (var i = 0; i < includedEvents.Count; i++)
{
var events = includedEvents[i].SelectNodes("Event");
for (var j = 0; j < events.Count; j++)
{
bChanged = SerialiseEventData(events[j]) || bChanged;
}
}
return bChanged;
}
private static float GetFloatFromString(string s)
{
return string.Compare(s, "Infinite") == 0 ? UnityEngine.Mathf.Infinity : float.Parse(s);
}
private static bool SerialiseEventData(System.Xml.XmlNode node)
{
var maxAttenuationAttribute = node.Attributes["MaxAttenuation"];
var durationMinAttribute = node.Attributes["DurationMin"];
var durationMaxAttribute = node.Attributes["DurationMax"];
if (maxAttenuationAttribute == null && durationMinAttribute == null && durationMaxAttribute == null)
return false;
var bChanged = false;
var name = node.Attributes["Name"].Value;
foreach (var wwu in AkWwiseProjectInfo.GetData().EventWwu)
{
var eventData = wwu.Find(name);
if (eventData == null)
continue;
if (maxAttenuationAttribute != null)
{
var maxAttenuation = float.Parse(maxAttenuationAttribute.Value);
if (eventData.maxAttenuation != maxAttenuation)
{
eventData.maxAttenuation = maxAttenuation;
bChanged = true;
}
}
if (durationMinAttribute != null)
{
var minDuration = GetFloatFromString(durationMinAttribute.Value);
if (eventData.minDuration != minDuration)
{
eventData.minDuration = minDuration;
bChanged = true;
}
}
if (durationMaxAttribute != null)
{
var maxDuration = GetFloatFromString(durationMaxAttribute.Value);
if (eventData.maxDuration != maxDuration)
{
eventData.maxDuration = maxDuration;
bChanged = true;
}
}
}
return bChanged;
}
}
#endif