private void ValidateParameterSettings() { if (editorEventRef != null) { List <string> namesToDelete = new List <string>(); for (int i = 0; i < parametersProperty.arraySize; ++i) { SerializedProperty current = parametersProperty.GetArrayElementAtIndex(i); SerializedProperty name = current.FindPropertyRelative("Name"); EditorParamRef paramRef = editorEventRef.LocalParameters.FirstOrDefault(p => p.Name == name.stringValue); if (paramRef != null) { SerializedProperty value = current.FindPropertyRelative("Value"); value.floatValue = Mathf.Clamp(value.floatValue, paramRef.Min, paramRef.Max); } else { namesToDelete.Add(name.stringValue); } } foreach (string name in namesToDelete) { DeleteInitialParameterValue(name); } namesToDelete.Clear(); for (int i = 0; i < parameterLinksProperty.arraySize; ++i) { SerializedProperty current = parameterLinksProperty.GetArrayElementAtIndex(i); SerializedProperty name = current.FindPropertyRelative("Name"); if (!editorEventRef.LocalParameters.Any(p => p.Name == name.stringValue)) { namesToDelete.Add(name.stringValue); } } foreach (string name in namesToDelete) { DeleteParameterAutomation(name); } } }
static void InitializeParamRef(EditorParamRef paramRef, FMOD.Studio.PARAMETER_DESCRIPTION description) { paramRef.Name = description.name; paramRef.Min = description.minimum; paramRef.Max = description.maximum; paramRef.Default = description.defaultvalue; paramRef.IsGlobal = (description.flags & FMOD.Studio.PARAMETER_FLAGS.GLOBAL) != 0; if ((description.flags & FMOD.Studio.PARAMETER_FLAGS.DISCRETE) != 0) { paramRef.Type = ParameterType.Discrete; } else { paramRef.Type = ParameterType.Continuous; } }
void AddInitialParameterValue(EditorParamRef editorParamRef) { serializedObject.Update(); if (!InitialParameterValueExists(editorParamRef.Name)) { DeleteParameterAutomation(editorParamRef.Name); parametersProperty.ArrayAdd(p => { p.FindPropertyRelative("Name").stringValue = editorParamRef.Name; p.FindPropertyRelative("Value").floatValue = editorParamRef.Default; }); serializedObject.ApplyModifiedProperties(); RefreshMissingParameterLists(); } }
private void PreviewParameter(Rect previewRect, EditorParamRef selectedParam) { GUILayout.BeginArea(previewRect); var style = new GUIStyle(EditorStyles.label); EditorStyles.label.fontStyle = FontStyle.Bold; EditorGUIUtility.labelWidth = 75; EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Name", selectedParam.Name, style, GUILayout.ExpandWidth(true)); EditorGUILayout.EndHorizontal(); EditorGUILayout.LabelField("Min", selectedParam.Min.ToString(), style, GUILayout.ExpandWidth(true)); EditorGUILayout.LabelField("Max", selectedParam.Max.ToString(), style, GUILayout.ExpandWidth(true)); EditorGUI.indentLevel--; EditorGUIUtility.labelWidth = 0; GUILayout.EndArea(); }
// Add an initial value for the given parameter to all selected objects that don't have one. private void AddParameter(EditorParamRef parameter) { foreach (SerializedObject serializedTarget in serializedTargets) { StudioEventEmitter emitter = serializedTarget.targetObject as StudioEventEmitter; if (Array.FindIndex(emitter.Params, p => p.Name == parameter.Name) < 0) { SerializedProperty paramsProperty = serializedTarget.FindProperty("Params"); int index = paramsProperty.arraySize; paramsProperty.InsertArrayElementAtIndex(index); SerializedProperty arrayElement = paramsProperty.GetArrayElementAtIndex(index); arrayElement.FindPropertyRelative("Name").stringValue = parameter.Name; arrayElement.FindPropertyRelative("Value").floatValue = parameter.Default; serializedTarget.ApplyModifiedProperties(); } } }
void DrawInitialParameterValue(Rect rect, float labelRight, int index, bool active, bool focused) { if (editorEventRef == null) { return; } SerializedProperty property = parametersProperty.GetArrayElementAtIndex(index); string name = property.FindPropertyRelative("Name").stringValue; EditorParamRef paramRef = editorEventRef.LocalParameters.FirstOrDefault(p => p.Name == name); if (paramRef == null) { return; } Rect nameLabelRect = rect; nameLabelRect.xMax = labelRight; Rect sliderRect = rect; sliderRect.xMin = nameLabelRect.xMax; SerializedProperty valueProperty = property.FindPropertyRelative("Value"); GUI.Label(nameLabelRect, name); using (new NoIndentScope()) { valueProperty.floatValue = EditorGUI.Slider(sliderRect, valueProperty.floatValue, paramRef.Min, paramRef.Max); } }
static void UpdateCacheBank(EditorBankRef bankRef) { // Clear out any cached events from this bank eventCache.EditorEvents.ForEach((x) => x.Banks.Remove(bankRef)); FMOD.Studio.Bank bank; bankRef.LoadResult = EditorUtils.System.loadBankFile(bankRef.Path, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out bank); if (bankRef.LoadResult == FMOD.RESULT.ERR_EVENT_ALREADY_LOADED) { EditorUtils.System.getBank(bankRef.Name, out bank); bank.unload(); bankRef.LoadResult = EditorUtils.System.loadBankFile(bankRef.Path, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out bank); } if (bankRef.LoadResult == FMOD.RESULT.OK) { // Iterate all events in the bank and cache them FMOD.Studio.EventDescription[] eventList; var result = bank.getEventList(out eventList); if (result == FMOD.RESULT.OK) { foreach (var eventDesc in eventList) { string path; result = eventDesc.getPath(out path); EditorEventRef eventRef = eventCache.EditorEvents.Find((x) => x.Path == path); if (eventRef == null) { eventRef = ScriptableObject.CreateInstance <EditorEventRef>(); AssetDatabase.AddObjectToAsset(eventRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(eventRef)); eventRef.Banks = new List <EditorBankRef>(); eventCache.EditorEvents.Add(eventRef); eventRef.Parameters = new List <EditorParamRef>(); } eventRef.Banks.Add(bankRef); Guid guid; eventDesc.getID(out guid); eventRef.Guid = guid; eventRef.Path = eventRef.name = path; eventDesc.is3D(out eventRef.Is3D); eventDesc.isOneshot(out eventRef.IsOneShot); eventDesc.isStream(out eventRef.IsStream); eventDesc.getMaximumDistance(out eventRef.MaxDistance); eventDesc.getMinimumDistance(out eventRef.MinDistance); eventDesc.getLength(out eventRef.Length); int paramCount = 0; eventDesc.getParameterDescriptionCount(out paramCount); eventRef.Parameters.ForEach((x) => x.Exists = false); for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) { FMOD.Studio.PARAMETER_DESCRIPTION param; eventDesc.getParameterDescriptionByIndex(paramIndex, out param); if ((param.flags & FMOD.Studio.PARAMETER_FLAGS.READONLY) != 0) { continue; } EditorParamRef paramRef = eventRef.Parameters.Find((x) => x.name == param.name); if (paramRef == null) { paramRef = ScriptableObject.CreateInstance <EditorParamRef>(); AssetDatabase.AddObjectToAsset(paramRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(paramRef)); eventRef.Parameters.Add(paramRef); } paramRef.Name = param.name; paramRef.name = "parameter:/" + Path.GetFileName(path) + "/" + paramRef.Name; paramRef.Min = param.minimum; paramRef.Max = param.maximum; paramRef.Default = param.defaultvalue; paramRef.Exists = true; } eventRef.Parameters.RemoveAll((x) => !x.Exists); } } // Update global parameter list for each bank FMOD.Studio.PARAMETER_DESCRIPTION[] parameterDescriptions; result = EditorUtils.System.getParameterDescriptionList(out parameterDescriptions); if (result == FMOD.RESULT.OK) { for (int i = 0; i < parameterDescriptions.Length; i++) { FMOD.Studio.PARAMETER_DESCRIPTION param = parameterDescriptions[i]; if (param.flags == FMOD.Studio.PARAMETER_FLAGS.GLOBAL) { EditorParamRef paramRef = eventCache.EditorParameters.Find((x) => (parameterDescriptions[i].id.data1 == x.ID.data1 && param.id.data2 == x.ID.data2)); if (paramRef == null) { paramRef = ScriptableObject.CreateInstance <EditorParamRef>(); AssetDatabase.AddObjectToAsset(paramRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(paramRef)); eventCache.EditorParameters.Add(paramRef); paramRef.ID = param.id; } paramRef.Name = paramRef.name = param.name; paramRef.Min = param.minimum; paramRef.Max = param.maximum; paramRef.Default = param.defaultvalue; paramRef.Exists = true; } } } bank.unload(); } else { Debug.LogError(string.Format("FMOD Studio: Unable to load {0}: {1}", bankRef.Name, FMOD.Error.String(bankRef.LoadResult))); eventCache.StringsBankWriteTime = DateTime.MinValue; } }
static void UpdateCacheBank(EditorBankRef bankRef) { // Clear out any cached events from this bank eventCache.EditorEvents.ForEach((x) => x.Banks.Remove(bankRef)); FMOD.Studio.Bank bank; bankRef.LoadResult = EditorUtils.System.loadBankFile(bankRef.Path, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out bank); if (bankRef.LoadResult == FMOD.RESULT.ERR_EVENT_ALREADY_LOADED) { EditorUtils.System.getBank(bankRef.Name, out bank); bank.unload(); bankRef.LoadResult = EditorUtils.System.loadBankFile(bankRef.Path, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out bank); } if (bankRef.LoadResult == FMOD.RESULT.OK) { // Iterate all events in the bank and cache them FMOD.Studio.EventDescription[] eventList; var result = bank.getEventList(out eventList); if (result == FMOD.RESULT.OK) { foreach (var eventDesc in eventList) { string path; eventDesc.getPath(out path); EditorEventRef eventRef = eventCache.EditorEvents.Find((x) => x.Path == path); if (eventRef == null) { eventRef = ScriptableObject.CreateInstance <EditorEventRef>(); AssetDatabase.AddObjectToAsset(eventRef, CacheAssetFullName); eventRef.Banks = new List <EditorBankRef>(); eventCache.EditorEvents.Add(eventRef); } eventRef.Banks.Add(bankRef); Guid guid; eventDesc.getID(out guid); eventRef.Guid = guid; eventRef.Path = path; eventDesc.is3D(out eventRef.Is3D); eventDesc.isOneshot(out eventRef.IsOneShot); eventDesc.isStream(out eventRef.IsStream); eventDesc.getMaximumDistance(out eventRef.MaxDistance); eventDesc.getMinimumDistance(out eventRef.MinDistance); int paramCount = 0; eventDesc.getParameterCount(out paramCount); eventRef.Parameters = new List <EditorParamRef>(paramCount); for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) { EditorParamRef paramRef = ScriptableObject.CreateInstance <EditorParamRef>(); AssetDatabase.AddObjectToAsset(paramRef, CacheAssetFullName); FMOD.Studio.PARAMETER_DESCRIPTION param; eventDesc.getParameterByIndex(paramIndex, out param); paramRef.Name = param.name; paramRef.Min = param.minimum; paramRef.Max = param.maximum; eventRef.Parameters.Add(paramRef); } } } bank.unload(); } else { // TODO: log the error //UnityEngine.Debug.LogWarning("Cannot load ); } }
static void UpdateCacheBank(EditorBankRef bankRef) { // Clear out any cached events from this bank eventCache.EditorEvents.ForEach((x) => x.Banks.Remove(bankRef)); FMOD.Studio.Bank bank; bankRef.LoadResult = EditorUtils.System.loadBankFile(bankRef.Path, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out bank); if (bankRef.LoadResult == FMOD.RESULT.ERR_EVENT_ALREADY_LOADED) { EditorUtils.System.getBank(bankRef.Name, out bank); bank.unload(); bankRef.LoadResult = EditorUtils.System.loadBankFile(bankRef.Path, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out bank); } if (bankRef.LoadResult == FMOD.RESULT.OK) { // Iterate all events in the bank and cache them FMOD.Studio.EventDescription[] eventList; var result = bank.getEventList(out eventList); if (result == FMOD.RESULT.OK) { foreach (var eventDesc in eventList) { string path; result = eventDesc.getPath(out path); EditorEventRef eventRef = eventCache.EditorEvents.Find((x) => x.Path == path); if (eventRef == null) { eventRef = ScriptableObject.CreateInstance <EditorEventRef>(); AssetDatabase.AddObjectToAsset(eventRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(eventRef)); eventRef.Banks = new List <EditorBankRef>(); eventCache.EditorEvents.Add(eventRef); } eventRef.Banks.Add(bankRef); Guid guid; eventDesc.getID(out guid); eventRef.Guid = guid; eventRef.Path = path; eventDesc.is3D(out eventRef.Is3D); eventDesc.isOneshot(out eventRef.IsOneShot); eventDesc.isStream(out eventRef.IsStream); eventDesc.getMaximumDistance(out eventRef.MaxDistance); eventDesc.getMinimumDistance(out eventRef.MinDistance); eventDesc.getLength(out eventRef.Length); int paramCount = 0; eventDesc.getParameterCount(out paramCount); eventRef.Parameters = new List <EditorParamRef>(paramCount); for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) { FMOD.Studio.PARAMETER_DESCRIPTION param; eventDesc.getParameterByIndex(paramIndex, out param); if (param.type != FMOD.Studio.PARAMETER_TYPE.GAME_CONTROLLED) { continue; } EditorParamRef paramRef = ScriptableObject.CreateInstance <EditorParamRef>(); AssetDatabase.AddObjectToAsset(paramRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(paramRef)); paramRef.Name = param.name; paramRef.Min = param.minimum; paramRef.Max = param.maximum; paramRef.Default = param.defaultvalue; eventRef.Parameters.Add(paramRef); } } } bank.unload(); } else { Debug.LogError(String.Format("FMOD Studio: Unable to load {0}: {1}", bankRef.Name, FMOD.Error.String(bankRef.LoadResult))); eventCache.StringsBankWriteTime = DateTime.MinValue; } }