From 0dcce5f9e3cdd30882c82fd8492a6f1768d96334 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Sat, 28 Sep 2024 02:04:02 +0200 Subject: [PATCH 01/16] Create Component and add VRCFury "support" --- Component.meta | 3 + Component/MemoryOptimizerComponent.cs | 301 ++++++++++++++++++ Component/MemoryOptimizerComponent.cs.meta | 3 + Component/_InternalsVisibleTo.cs | 4 + Component/_InternalsVisibleTo.cs.meta | 3 + ...ev.jetees.memoryoptimizer.Component.asmdef | 25 ++ ...tees.memoryoptimizer.Component.asmdef.meta | 3 + Editor/MemoryOptimizerComponentEditor.cs | 63 ++++ Editor/MemoryOptimizerComponentEditor.cs.meta | 3 + Editor/MemoryOptimizerMain.cs | 18 +- Editor/MemoryOptimizerWindow.cs | 1 + Editor/_InternalsVisibleTo.cs | 4 + Editor/_InternalsVisibleTo.cs.meta | 3 + .../dev.jetees.memoryoptimizer.Editor.asmdef | 4 +- Helper.meta | 3 + Helper/ReadOnlyPropertyHelper.cs | 31 ++ Helper/ReadOnlyPropertyHelper.cs.meta | 3 + Helper/ReflectionHelper.cs | 10 + Helper/ReflectionHelper.cs.meta | 3 + {Editor => Helper}/TESHelperFunctions.cs | 4 + {Editor => Helper}/TESHelperFunctions.cs.meta | 0 Helper/_InternalsVisibleTo.cs | 5 + Helper/_InternalsVisibleTo.cs.meta | 3 + .../dev.jetees.memoryoptimizer.Helper.asmdef | 17 + ....jetees.memoryoptimizer.Helper.asmdef.meta | 3 + Patcher.meta | 3 + Patcher/VRCFury-FinalValidationService.txt | 81 +++++ .../VRCFury-FinalValidationService.txt.meta | 3 + Pipeline.meta | 3 + ...ryOptimizerDisableVRCFuryParameterCheck.cs | 37 +++ ...imizerDisableVRCFuryParameterCheck.cs.meta | 3 + Pipeline/MemoryOptimizerUploadPipeline.cs | 106 ++++++ .../MemoryOptimizerUploadPipeline.cs.meta | 3 + ...dev.jetees.memoryoptimizer.Pipeline.asmdef | 32 ++ ...etees.memoryoptimizer.Pipeline.asmdef.meta | 3 + 35 files changed, 790 insertions(+), 4 deletions(-) create mode 100644 Component.meta create mode 100644 Component/MemoryOptimizerComponent.cs create mode 100644 Component/MemoryOptimizerComponent.cs.meta create mode 100644 Component/_InternalsVisibleTo.cs create mode 100644 Component/_InternalsVisibleTo.cs.meta create mode 100644 Component/dev.jetees.memoryoptimizer.Component.asmdef create mode 100644 Component/dev.jetees.memoryoptimizer.Component.asmdef.meta create mode 100644 Editor/MemoryOptimizerComponentEditor.cs create mode 100644 Editor/MemoryOptimizerComponentEditor.cs.meta create mode 100644 Editor/_InternalsVisibleTo.cs create mode 100644 Editor/_InternalsVisibleTo.cs.meta create mode 100644 Helper.meta create mode 100644 Helper/ReadOnlyPropertyHelper.cs create mode 100644 Helper/ReadOnlyPropertyHelper.cs.meta create mode 100644 Helper/ReflectionHelper.cs create mode 100644 Helper/ReflectionHelper.cs.meta rename {Editor => Helper}/TESHelperFunctions.cs (99%) rename {Editor => Helper}/TESHelperFunctions.cs.meta (100%) create mode 100644 Helper/_InternalsVisibleTo.cs create mode 100644 Helper/_InternalsVisibleTo.cs.meta create mode 100644 Helper/dev.jetees.memoryoptimizer.Helper.asmdef create mode 100644 Helper/dev.jetees.memoryoptimizer.Helper.asmdef.meta create mode 100644 Patcher.meta create mode 100644 Patcher/VRCFury-FinalValidationService.txt create mode 100644 Patcher/VRCFury-FinalValidationService.txt.meta create mode 100644 Pipeline.meta create mode 100644 Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs create mode 100644 Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta create mode 100644 Pipeline/MemoryOptimizerUploadPipeline.cs create mode 100644 Pipeline/MemoryOptimizerUploadPipeline.cs.meta create mode 100644 Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef create mode 100644 Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef.meta diff --git a/Component.meta b/Component.meta new file mode 100644 index 0000000..425ddd6 --- /dev/null +++ b/Component.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6070dc9ff4364a4a96ab4aa47b0d90cc +timeCreated: 1727374867 \ No newline at end of file diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs new file mode 100644 index 0000000..1c3f92a --- /dev/null +++ b/Component/MemoryOptimizerComponent.cs @@ -0,0 +1,301 @@ +#if UNITY_EDITOR + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using JeTeeS.TES.HelperFunctions; +using UnityEngine; +using VRC.SDK3.Avatars.Components; +using VRC.SDK3.Avatars.ScriptableObjects; +using VRC.SDKBase; + +namespace JeTeeS.MemoryOptimizer +{ + [Serializable] + [RequireComponent(typeof(VRCAvatarDescriptor))] + public class MemoryOptimizerComponent : MonoBehaviour, IEditorOnly + { + [Serializable] + public class SavedParameterConfiguration + { + public string parameterName = string.Empty; + [ReadOnlyPropertyHelper.ReadOnly] public string parameterType = string.Empty; + public bool attemptToOptimize = true; + [ReadOnlyPropertyHelper.ReadOnly] public bool willOptimize = false; + [ReadOnlyPropertyHelper.ReadOnly] public bool isVRCFuryParameter = false; + [ReadOnlyPropertyHelper.ReadOnly] public string info = string.Empty; + + public override bool Equals(object obj) + { + if (obj is null) + { + return false; + } + + if (obj is SavedParameterConfiguration typed) + { + return typed.parameterName.Equals(parameterName) && typed.parameterType.Equals(parameterType); + } + + return base.Equals(obj); + } + + public override string ToString() + { + return $"{parameterName} ({parameterType}) - {(attemptToOptimize ? "Will try to Optimize" : "Won't Optimize")}"; + } + } + + [NonSerialized] private readonly string[] _paramTypes = { "Int", "Float", "Bool" }; + [NonSerialized] private VRCAvatarDescriptor _vrcAvatarDescriptor; + + public bool changeDetection = false; + public int syncSteps = 2; + public List savedParameterConfigurations = new List(0); + public List exclusions = new List(0); + public int totalParameterCost = 0; + public int optimizedParameterCost = 0; + + internal void Load() + { + // get descriptor + _vrcAvatarDescriptor = gameObject.GetComponent(); + + // collect all descriptor parameters that are synced + foreach (var savedParameterConfiguration in (_vrcAvatarDescriptor?.expressionParameters?.parameters ?? Array.Empty()).Where(p => p.networkSynced).Select(p => new SavedParameterConfiguration() + { + parameterName = p.name, + parameterType = _paramTypes[(int)p.valueType], + attemptToOptimize = true, + info = "From Avatar Descriptor" + })) + { + if (!savedParameterConfigurations.Contains(savedParameterConfiguration)) + { + savedParameterConfigurations.Add(savedParameterConfiguration); + } + } + +#if VRCFury_Installed + // since all VRCFury components are IEditorOnly, we can find them like this + // there is no better way as VRCFury has decided to mark their classes as internal only + IEnumerable _vrcfComponents = (gameObject.GetComponents()) + .Concat(gameObject.GetComponentsInChildren(true)) + .Where(x => x.GetType().ToString().Contains("VRCFury")); + + // collect all VRCFury parameters + // this is where the real fun begins... + if (_vrcfComponents.Any()) + { + foreach (IEditorOnly vrcfComponent in _vrcfComponents) + { + // some systems use EditorOnly components to be optimized away + var vrcfGameObject = ((Component)vrcfComponent).gameObject; + var isEditorOnly = vrcfGameObject.tag.Equals("EditorOnly"); + + // extract the content field from VRCFury, this is where the actual "component" data can be found + object contentValue = null; + try + { + contentValue = vrcfComponent.GetFieldValue("content"); + } + catch + { + continue; + } + + // not all components have content + if (string.IsNullOrEmpty(contentValue?.GetType()?.ToString())) + { + continue; + } + + // from here on out it depends on what we have + var contentType = contentValue.GetType().ToString(); + + // Notes: + // VRCFury generates parameters with the following format: VF\d+_{name} + // since we have no access to the number unless we build the avatar, we just display VF##_{name} and map it correctly later + + // Toggle + if (contentType.Contains("Toggle")) + { + // Toggles are rather simple, they can be in any of these configurations: + // 1. being a normal toggle (auto-generated bool parameter) + // 2. using a global parameter (defined bool parameter) + // 3. being a slider (auto-generated float parameter) + // 4. being a slider using a global parameter (defined float parameter) + + var toggleName = "VF##_"; + if (contentValue.GetFieldValue("name") is string _toggleName && !string.IsNullOrEmpty(_toggleName)) + { + toggleName = _toggleName; + } + + var isSlider = contentValue.GetFieldValue("slider") is true; + + var useGlobalParameter = contentValue.GetFieldValue("useGlobalParam") is true; + var globalParameter = string.Empty; + if (useGlobalParameter && contentValue.GetFieldValue("globalParam") is string _globalParameter && !string.IsNullOrEmpty(_globalParameter)) + { + globalParameter = _globalParameter; + } + else + { + useGlobalParameter = false; + } + + // if the toggle is a non described empty one and there isn't a global parameter + // that is being targeted, we skip this as we cannot correctly map it back + if (toggleName.Equals("VF##_") && !useGlobalParameter) + { + continue; + } + + SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration() + { + parameterName = useGlobalParameter ? globalParameter : $"VF##_{toggleName}", + parameterType = isSlider ? "Float" : "Bool", + attemptToOptimize = true, + isVRCFuryParameter = true, + info = isEditorOnly ? "(EditorOnly) " : string.Empty + $"From Toggle: {toggleName} on {gameObject.name}" + }; + + if (!savedParameterConfigurations.Contains(savedParameterConfiguration)) + { + savedParameterConfigurations.Add(savedParameterConfiguration); + } + } + // Full Controller + else if (contentType.Contains("FullController")) + { + // get global parameters + List globalParameters = new List(0); + if (contentValue.GetFieldValue("globalParams") is List _globalParameters) + { + globalParameters = _globalParameters; + } + + var containsStar = globalParameters.Contains("*"); + + // get the parameter list + if (contentValue.GetFieldValue("prms") is IEnumerable _parametersList) + { + // remap to actual expression parameters + var extractedParametersList = new List(); + foreach (object slot in _parametersList) + { + VRCExpressionParameters extracted = null; + // the parameters are a field which is wrapped again + if (slot.GetFieldValue("parameters")?.GetFieldValue("objRef") is VRCExpressionParameters cast) + { + extracted = cast; + } + + if (extracted is not null) + { + extractedParametersList.Add(extracted); + } + } + + // flatten parameters down + foreach (VRCExpressionParameters vrcExpressionParameters in extractedParametersList) + { + foreach (VRCExpressionParameters.Parameter parameter in vrcExpressionParameters.parameters) + { + // ignore un-synced + if (!parameter.networkSynced) + { + continue; + } + + SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration() + { + parameterName = (containsStar && !globalParameters.Contains($"!{parameter.name}")) || globalParameters.Contains(parameter.name) ? parameter.name : $"VF##_{parameter.name}", + parameterType = _paramTypes[(int)parameter.valueType], + attemptToOptimize = true, + isVRCFuryParameter = true, + info = isEditorOnly ? "(EditorOnly) " : string.Empty + $"From FullController on {vrcfGameObject.name}" + }; + + if (!savedParameterConfigurations.Contains(savedParameterConfiguration)) + { + savedParameterConfigurations.Add(savedParameterConfiguration); + } + } + } + } + } + } + } +#endif + } + + internal void Reset() + { + savedParameterConfigurations = new List(0); + Load(); + Refresh(); + } + + internal void Refresh() + { + totalParameterCost = 0; + optimizedParameterCost = 0; + + var parametersBool = new List(savedParameterConfigurations.Count); + var parametersIntNFloat = new List(savedParameterConfigurations.Count); + + foreach (var savedParameterConfiguration in savedParameterConfigurations) + { + savedParameterConfiguration.attemptToOptimize = exclusions.All(e => !savedParameterConfiguration.parameterName.Replace("VF##_", string.Empty).StartsWith(e)); + savedParameterConfiguration.willOptimize = false; + + if (savedParameterConfiguration.attemptToOptimize) + { + switch (savedParameterConfiguration.parameterType) + { + case "Bool": + parametersBool.Add(savedParameterConfiguration); + break; + case "Int": + case "Float": + parametersIntNFloat.Add(savedParameterConfiguration); + break; + } + } + } + + var parametersBoolToOptimize = parametersBool.Take(parametersBool.Count - (parametersBool.Count % syncSteps)).ToList(); + var parametersIntNFloatToOptimize = parametersIntNFloat.Take(parametersIntNFloat.Count - (parametersIntNFloat.Count % syncSteps)).ToList(); + + foreach (var savedParameterConfiguration in parametersBoolToOptimize) + { + savedParameterConfiguration.willOptimize = true; + } + + foreach (var savedParameterConfiguration in parametersIntNFloatToOptimize) + { + savedParameterConfiguration.willOptimize = true; + } + + foreach (var savedParameterConfiguration in savedParameterConfigurations) + { + totalParameterCost += savedParameterConfiguration.parameterType.Equals("Bool") ? 1 : 8; + if (!savedParameterConfiguration.willOptimize) + { + optimizedParameterCost += savedParameterConfiguration.parameterType.Equals("Bool") ? 1 : 8; + } + } + + var installationIndexers = (syncSteps - 1).DecimalToBinary().ToString().Count(); + var installationBoolSyncers = parametersBoolToOptimize.Count / syncSteps; + var installationIntNFloatSyncers = parametersIntNFloatToOptimize.Count / syncSteps; + + optimizedParameterCost += installationIndexers + installationBoolSyncers + (installationIntNFloatSyncers * 8); + } + } +} + +#endif diff --git a/Component/MemoryOptimizerComponent.cs.meta b/Component/MemoryOptimizerComponent.cs.meta new file mode 100644 index 0000000..7303e03 --- /dev/null +++ b/Component/MemoryOptimizerComponent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e86612edceff463ab4d3a82c82845b35 +timeCreated: 1727373554 \ No newline at end of file diff --git a/Component/_InternalsVisibleTo.cs b/Component/_InternalsVisibleTo.cs new file mode 100644 index 0000000..194b3ff --- /dev/null +++ b/Component/_InternalsVisibleTo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Editor")] +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Pipeline")] diff --git a/Component/_InternalsVisibleTo.cs.meta b/Component/_InternalsVisibleTo.cs.meta new file mode 100644 index 0000000..425f165 --- /dev/null +++ b/Component/_InternalsVisibleTo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6888c1db769a42fb82aa0cd76a939ffd +timeCreated: 1727468151 \ No newline at end of file diff --git a/Component/dev.jetees.memoryoptimizer.Component.asmdef b/Component/dev.jetees.memoryoptimizer.Component.asmdef new file mode 100644 index 0000000..6350793 --- /dev/null +++ b/Component/dev.jetees.memoryoptimizer.Component.asmdef @@ -0,0 +1,25 @@ +{ + "name": "dev.jetees.memoryoptimizer.Component", + "references": [ + "VRC.SDK3A", + "VRC.SDK3A.Editor", + "VRC.SDKBase", + "VRC.SDKBase.Editor", + "dev.jetees.memoryoptimizer.Helper" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "autoReferenced": true, + "overrideReferences": false, + "precompiledReferences": [], + "defineConstraints": [], + "optionalUnityReferences": [], + "versionDefines": [ + { + "define": "VRCFury_Installed", + "expression": "0.0.0", + "name": "com.vrcfury.vrcfury" + } + ] +} \ No newline at end of file diff --git a/Component/dev.jetees.memoryoptimizer.Component.asmdef.meta b/Component/dev.jetees.memoryoptimizer.Component.asmdef.meta new file mode 100644 index 0000000..5342ba1 --- /dev/null +++ b/Component/dev.jetees.memoryoptimizer.Component.asmdef.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c2651830b02b4624a7baea543f362d4b +timeCreated: 1727375242 \ No newline at end of file diff --git a/Editor/MemoryOptimizerComponentEditor.cs b/Editor/MemoryOptimizerComponentEditor.cs new file mode 100644 index 0000000..c5e5303 --- /dev/null +++ b/Editor/MemoryOptimizerComponentEditor.cs @@ -0,0 +1,63 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace JeTeeS.MemoryOptimizer +{ + [CustomEditor(typeof(MemoryOptimizerComponent))] + public class MemoryOptimizerComponentEditor : Editor + { + private void OnEnable() + { + ((MemoryOptimizerComponent)target).Load(); + } + + public override void OnInspectorGUI() + { + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.syncSteps))); + + GUILayout.Space(5); + + var syncSteps = serializedObject.FindProperty(nameof(MemoryOptimizerComponent.syncSteps)); + var disableChangeDetection = false; + if (syncSteps.intValue <= 2) + { + disableChangeDetection = true; + syncSteps.intValue = Math.Max(0, syncSteps.intValue); + } + + if (syncSteps.intValue > 32) + { + syncSteps.intValue = 32; + } + + EditorGUI.BeginDisabledGroup(disableChangeDetection); + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.changeDetection))); + EditorGUI.EndDisabledGroup(); + + GUILayout.Space(5); + + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.savedParameterConfigurations))); + + GUILayout.Space(5); + + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.exclusions))); + + serializedObject.ApplyModifiedProperties(); + + EditorGUI.BeginDisabledGroup(true); + + GUILayout.Space(5); + + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.totalParameterCost))); + + GUILayout.Space(5); + + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.optimizedParameterCost))); + + EditorGUI.EndDisabledGroup(); + + ((MemoryOptimizerComponent)target).Refresh(); + } + } +} \ No newline at end of file diff --git a/Editor/MemoryOptimizerComponentEditor.cs.meta b/Editor/MemoryOptimizerComponentEditor.cs.meta new file mode 100644 index 0000000..8f06a33 --- /dev/null +++ b/Editor/MemoryOptimizerComponentEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0508e9fa1fe14611995c477295f8bc55 +timeCreated: 1727374890 \ No newline at end of file diff --git a/Editor/MemoryOptimizerMain.cs b/Editor/MemoryOptimizerMain.cs index 818bbdd..31b2077 100644 --- a/Editor/MemoryOptimizerMain.cs +++ b/Editor/MemoryOptimizerMain.cs @@ -34,7 +34,7 @@ public class ParamDriversAndStates public List states = new List(); } - private const string discordLink = "https://discord.gg/N7snuJhzkd"; + private const string discordLink = "https://discord.gg/N7snuJhzkdN7snuJhzkd"; private const string prefix = "MemOpt_"; private const string syncingLayerName = prefix + "Syncing Layer"; private const string syncingLayerIdentifier = prefix + "Syncer"; @@ -589,8 +589,20 @@ private static void CreateLocalRemoteSplit(MemoryOptimizerState optimizerState) AnimatorStateTransition localTransition = localRemoteSplitState.AddTransition(localStateMachine); AnimatorStateTransition remoteTransition = localRemoteSplitState.AddTransition(remoteStateMachine); - localTransition.AddCondition(AnimatorConditionMode.If, 0, "IsLocal"); - remoteTransition.AddCondition(AnimatorConditionMode.IfNot, 0, "IsLocal"); + + // in some rare cases some types of FaceTracking (or other OSC based components) use a float-based IsLocal parameter + // this will prevent the layer from working correctly as the transition binding no longer matches the type + if (optimizerState.FXController.parameters.Any(p => p.name.Equals("IsLocal") && p.type == AnimatorControllerParameterType.Float)) + { + localTransition.AddCondition(AnimatorConditionMode.Greater, 0.5f, "IsLocal"); + remoteTransition.AddCondition(AnimatorConditionMode.Less, 0.5f, "IsLocal"); + } + else + { + localTransition.AddCondition(AnimatorConditionMode.If, 0, "IsLocal"); + remoteTransition.AddCondition(AnimatorConditionMode.IfNot, 0, "IsLocal"); + } + optimizerState.localStateMachine = localStateMachine; optimizerState.remoteStateMachine = remoteStateMachine; } diff --git a/Editor/MemoryOptimizerWindow.cs b/Editor/MemoryOptimizerWindow.cs index 34d6d9e..aabc485 100644 --- a/Editor/MemoryOptimizerWindow.cs +++ b/Editor/MemoryOptimizerWindow.cs @@ -492,6 +492,7 @@ public void OnChangeUpdate() newParamCost = expressionParameters == null ? 0 : expressionParameters.CalcTotalCost(); return; } + if (syncSteps < 2) syncSteps = 2; diff --git a/Editor/_InternalsVisibleTo.cs b/Editor/_InternalsVisibleTo.cs new file mode 100644 index 0000000..29559ad --- /dev/null +++ b/Editor/_InternalsVisibleTo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer")] +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Pipeline")] diff --git a/Editor/_InternalsVisibleTo.cs.meta b/Editor/_InternalsVisibleTo.cs.meta new file mode 100644 index 0000000..4a42be7 --- /dev/null +++ b/Editor/_InternalsVisibleTo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 96ff128552454cc6bff47bc3ac60fbd0 +timeCreated: 1727468128 \ No newline at end of file diff --git a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef index cdb2a66..46a3ac8 100644 --- a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef +++ b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef @@ -5,7 +5,9 @@ "VRC.SDK3A.Editor", "VRC.SDKBase", "VRC.SDKBase.Editor", - "dev.jetees.memoryoptimizer" + "dev.jetees.memoryoptimizer", + "dev.jetees.memoryoptimizer.Component", + "dev.jetees.memoryoptimizer.Helper" ], "includePlatforms": [ "Editor" diff --git a/Helper.meta b/Helper.meta new file mode 100644 index 0000000..6ff60cc --- /dev/null +++ b/Helper.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1b590918719f41eaa7339ee978744394 +timeCreated: 1727380569 \ No newline at end of file diff --git a/Helper/ReadOnlyPropertyHelper.cs b/Helper/ReadOnlyPropertyHelper.cs new file mode 100644 index 0000000..31c43a0 --- /dev/null +++ b/Helper/ReadOnlyPropertyHelper.cs @@ -0,0 +1,31 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace JeTeeS.MemoryOptimizer +{ + internal static class ReadOnlyPropertyHelper + { + [AttributeUsage(AttributeTargets.Field)] + internal class ReadOnlyAttribute : PropertyAttribute { } + +#if UNITY_EDITOR + [CustomPropertyDrawer(typeof(ReadOnlyAttribute))] + internal class ReadOnlyAttributeDrawer : PropertyDrawer + { + public override void OnGUI(Rect rect, SerializedProperty prop, GUIContent label) + { + bool wasEnabled = GUI.enabled; + GUI.enabled = false; + EditorGUI.PropertyField(rect, prop); + GUI.enabled = wasEnabled; + } + + public override float GetPropertyHeight(SerializedProperty prop, GUIContent label) + { + return EditorGUI.GetPropertyHeight(prop, label, true); + } + } +#endif + } +} \ No newline at end of file diff --git a/Helper/ReadOnlyPropertyHelper.cs.meta b/Helper/ReadOnlyPropertyHelper.cs.meta new file mode 100644 index 0000000..91b82d7 --- /dev/null +++ b/Helper/ReadOnlyPropertyHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8c926cde99d4af39f3d5b562ccfe40b +timeCreated: 1727380609 \ No newline at end of file diff --git a/Helper/ReflectionHelper.cs b/Helper/ReflectionHelper.cs new file mode 100644 index 0000000..b773726 --- /dev/null +++ b/Helper/ReflectionHelper.cs @@ -0,0 +1,10 @@ +namespace JeTeeS.MemoryOptimizer +{ + internal static class ReflectionHelper + { + internal static object GetFieldValue(this object obj, string field) + { + return obj.GetType().GetField(field).GetValue(obj); + } + } +} \ No newline at end of file diff --git a/Helper/ReflectionHelper.cs.meta b/Helper/ReflectionHelper.cs.meta new file mode 100644 index 0000000..049c219 --- /dev/null +++ b/Helper/ReflectionHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f78219981c3c42d4bbfa12a7a65547a2 +timeCreated: 1727460083 \ No newline at end of file diff --git a/Editor/TESHelperFunctions.cs b/Helper/TESHelperFunctions.cs similarity index 99% rename from Editor/TESHelperFunctions.cs rename to Helper/TESHelperFunctions.cs index fbb3716..ad38fc5 100644 --- a/Editor/TESHelperFunctions.cs +++ b/Helper/TESHelperFunctions.cs @@ -1,3 +1,5 @@ +#if UNITY_EDITOR + using System; using System.Collections.Generic; using System.Linq; @@ -649,3 +651,5 @@ public static int DecimalToBinary(this int i) } } } + +#endif diff --git a/Editor/TESHelperFunctions.cs.meta b/Helper/TESHelperFunctions.cs.meta similarity index 100% rename from Editor/TESHelperFunctions.cs.meta rename to Helper/TESHelperFunctions.cs.meta diff --git a/Helper/_InternalsVisibleTo.cs b/Helper/_InternalsVisibleTo.cs new file mode 100644 index 0000000..3fcc844 --- /dev/null +++ b/Helper/_InternalsVisibleTo.cs @@ -0,0 +1,5 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Component")] +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Editor")] +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Pipeline")] diff --git a/Helper/_InternalsVisibleTo.cs.meta b/Helper/_InternalsVisibleTo.cs.meta new file mode 100644 index 0000000..a75a7d2 --- /dev/null +++ b/Helper/_InternalsVisibleTo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 641e92ea267d43d88a00e8f39eeb7721 +timeCreated: 1727468042 \ No newline at end of file diff --git a/Helper/dev.jetees.memoryoptimizer.Helper.asmdef b/Helper/dev.jetees.memoryoptimizer.Helper.asmdef new file mode 100644 index 0000000..3f95218 --- /dev/null +++ b/Helper/dev.jetees.memoryoptimizer.Helper.asmdef @@ -0,0 +1,17 @@ +{ + "name": "dev.jetees.memoryoptimizer.Helper", + "references": [ + "VRC.SDK3A", + "VRC.SDK3A.Editor", + "VRC.SDKBase", + "VRC.SDKBase.Editor" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "autoReferenced": true, + "overrideReferences": false, + "precompiledReferences": [], + "defineConstraints": [], + "optionalUnityReferences": [] +} \ No newline at end of file diff --git a/Helper/dev.jetees.memoryoptimizer.Helper.asmdef.meta b/Helper/dev.jetees.memoryoptimizer.Helper.asmdef.meta new file mode 100644 index 0000000..6367080 --- /dev/null +++ b/Helper/dev.jetees.memoryoptimizer.Helper.asmdef.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f049bd9f33464d14bdb09b1782cb118c +timeCreated: 1727380590 \ No newline at end of file diff --git a/Patcher.meta b/Patcher.meta new file mode 100644 index 0000000..862f5e6 --- /dev/null +++ b/Patcher.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 489926ef3f5c49e7b03d87ebcb0ad1e6 +timeCreated: 1727478969 \ No newline at end of file diff --git a/Patcher/VRCFury-FinalValidationService.txt b/Patcher/VRCFury-FinalValidationService.txt new file mode 100644 index 0000000..ce5116d --- /dev/null +++ b/Patcher/VRCFury-FinalValidationService.txt @@ -0,0 +1,81 @@ +using System.Linq; +using UnityEngine; +using VF.Builder; +using VF.Builder.Exceptions; +using VF.Component; +using VF.Feature.Base; +using VF.Injector; +using VF.Utils; +using VRC.Dynamics; +using VRC.SDK3.Avatars.ScriptableObjects; + +namespace VF.Service { + /** + * Many of these checks are copied from or modified from the validation checks in the VRCSDK + * MemoryOptimizerPatched + */ + [VFService] + internal class FinalValidationService { + [VFAutowired] private readonly ExceptionService excService; + [VFAutowired] private readonly ParamsService paramsService; + private ParamManager paramz => paramsService.GetParams(); + [VFAutowired] private readonly VFGameObject avatarObject; + + [FeatureBuilderAction(FeatureOrder.Validation)] + public void Apply() { + CheckParams(); + CheckContacts(); + } + + private void CheckParams() { + if (paramz.GetRaw().parameters.Length > 8192) { + excService.ThrowIfActuallyUploading(new SneakyException( + $"Your avatar is using too many synced and unsynced expression parameters ({paramz.GetRaw().parameters.Length})!" + + " There's a limit of 8192 total expression parameters.")); + } + return; + /*var maxBits = VRCExpressionParameters.MAX_PARAMETER_COST; + if (maxBits > 9999) { + // Some modified versions of the VRChat SDK have a broken value for this + maxBits = 256; + } + if (paramz.GetRaw().CalcTotalCost() > maxBits) { + excService.ThrowIfActuallyUploading(new SneakyException( + "Your avatar is out of space for parameters! Used " + + paramz.GetRaw().CalcTotalCost() + "/" + maxBits + + " bits. Ask your avatar creator, or the creator of the last prop you've added, if there are any parameters you can remove to make space.")); + } + + if (paramz.GetRaw().parameters.Length > 8192) { + excService.ThrowIfActuallyUploading(new SneakyException( + $"Your avatar is using too many synced and unsynced expression parameters ({paramz.GetRaw().parameters.Length})!" + + " There's a limit of 8192 total expression parameters.")); + }*/ + } + + private void CheckContacts() { + var contacts = avatarObject.GetComponentsInSelfAndChildren().ToArray(); + var contactLimit = 256; + if (contacts.Length > contactLimit) { + var contactPaths = contacts + .Select(c => c.owner().GetPath(avatarObject)) + .OrderBy(path => path) + .ToArray(); + Debug.Log("Contact report:\n" + string.Join("\n", contactPaths)); + var usesSps = avatarObject.GetComponentsInSelfAndChildren().Any() + || avatarObject.GetComponentsInSelfAndChildren().Any(); + if (usesSps) { + excService.ThrowIfActuallyUploading(new SneakyException( + "Your avatar is using more than the allowed number of contacts! Used " + + contacts.Length + "/" + contactLimit + + ". Delete some contacts or DPS/SPS items from your avatar.")); + } else { + excService.ThrowIfActuallyUploading(new SneakyException( + "Your avatar is using more than the allowed number of contacts! Used " + + contacts.Length + "/" + contactLimit + + ". Delete some contacts from your avatar.")); + } + } + } + } +} diff --git a/Patcher/VRCFury-FinalValidationService.txt.meta b/Patcher/VRCFury-FinalValidationService.txt.meta new file mode 100644 index 0000000..f340270 --- /dev/null +++ b/Patcher/VRCFury-FinalValidationService.txt.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f0bb5fb0c47d4abcb3e76ea34fc498fd +timeCreated: 1727478991 \ No newline at end of file diff --git a/Pipeline.meta b/Pipeline.meta new file mode 100644 index 0000000..a15ac3c --- /dev/null +++ b/Pipeline.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 32a354577d154391a412e7aaf1b06438 +timeCreated: 1727383235 \ No newline at end of file diff --git a/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs b/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs new file mode 100644 index 0000000..15821c7 --- /dev/null +++ b/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs @@ -0,0 +1,37 @@ +#if UNITY_EDITOR + +using System; +using System.IO; +using UnityEditor; +using UnityEngine; +using VRC.SDKBase.Editor.BuildPipeline; + +namespace JeTeeS.MemoryOptimizer +{ + public class MemoryOptimizerDisableVRCFuryParameterCheck : IVRCSDKPreprocessAvatarCallback + { + // run before VRCFury does + public int callbackOrder => -20000; + + public bool OnPreprocessAvatar(GameObject avatarGameObject) + { +#if VRCFury_Installed +#if !VRCFury_Tested + Debug.LogWarning($"The pipeline is running on an untested version of VRCFury, probably fine though."); +#endif + if (AssetDatabase.LoadAssetAtPath("Packages/com.vrcfury.vrcfury/Editor/VF/Service/FinalValidationService.cs") is MonoScript scriptToPatch) + { + if (AssetDatabase.LoadAssetAtPath("Packages/dev.jetees.memoryoptimizer/Patcher/VRCFury-FinalValidationService.txt") is TextAsset patch) + { + File.WriteAllText(AssetDatabase.GetAssetPath(scriptToPatch), patch.text); + EditorUtility.SetDirty(scriptToPatch); + } + } +#endif + + return true; + } + } +} + +#endif diff --git a/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta b/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta new file mode 100644 index 0000000..6842524 --- /dev/null +++ b/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 00516ee5bfbb467a89829d5be0fb7c13 +timeCreated: 1727475942 \ No newline at end of file diff --git a/Pipeline/MemoryOptimizerUploadPipeline.cs b/Pipeline/MemoryOptimizerUploadPipeline.cs new file mode 100644 index 0000000..de5b092 --- /dev/null +++ b/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -0,0 +1,106 @@ +#if UNITY_EDITOR + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using UnityEngine; +using VRC.SDK3.Avatars.Components; +using VRC.SDK3.Avatars.ScriptableObjects; +using VRC.SDKBase.Editor.BuildPipeline; +using static JeTeeS.TES.HelperFunctions.TESHelperFunctions; + +namespace JeTeeS.MemoryOptimizer +{ + public class MemoryOptimizerUploadPipeline : IVRCSDKPreprocessAvatarCallback + { + private readonly string[] _paramTypes = { "Int", "Float", "Bool" }; + + // VRCFury runs at -10000 + // VRChat strips components at -1024 + // So we preprocess in between but not too close to the stripping of components + public int callbackOrder => -2048; + + public bool OnPreprocessAvatar(GameObject avatarGameObject) + { + var _vrcAvatarDescriptor = avatarGameObject.GetComponent(); + var memoryOptimizer = avatarGameObject.GetComponent(); + + var parameters = _vrcAvatarDescriptor.expressionParameters?.parameters ?? Array.Empty(); + + Debug.Log($"MemoryOptimizerUploadPipeline.OnPreprocessAvatar running on {avatarGameObject.name} with {parameters.Length} parameters - loaded configuration: {memoryOptimizer.savedParameterConfigurations.Where(p => p.attemptToOptimize).ToList().Count}"); + + var parametersBoolToOptimize = new List(0); + var parametersIntNFloatToOptimize = new List(0); + + memoryOptimizer.Refresh(); + + foreach (var savedParameterConfiguration in memoryOptimizer.savedParameterConfigurations) + { + // find actual parameter + VRCExpressionParameters.Parameter parameter = null; + if (savedParameterConfiguration.parameterName.StartsWith("VF##_")) + { + parameter = parameters.FirstOrDefault(p => + { + if (p.networkSynced) + { + // match VRCFury parameters by regex replacing VF\d+_ and replacing VF##_ and then matching name and type + if (p.name.StartsWith("VF") && new Regex("^VF\\d+_").Replace(p.name, string.Empty).Equals(savedParameterConfiguration.parameterName.Replace("VF##_", string.Empty)) && _paramTypes[(int)p.valueType].Equals(savedParameterConfiguration.parameterType)) + { + return true; + } + } + + return false; + }); + } + else + { + parameter = parameters.FirstOrDefault(p => + { + if (p.networkSynced) + { + // match parameters by name and type + if (p.name.Equals(savedParameterConfiguration.parameterName) && _paramTypes[(int)p.valueType].Equals(savedParameterConfiguration.parameterType)) + { + return true; + } + } + + return false; + }); + } + + if (parameter is null) + { + continue; + } + + if (savedParameterConfiguration.attemptToOptimize && savedParameterConfiguration.willOptimize) + { + Debug.Log($"MemoryOptimizerUploadPipeline.OnPreprocessAvatar {savedParameterConfiguration.parameterName} will be optimized."); + + var data = new MemoryOptimizerMain.MemoryOptimizerListData(parameter, savedParameterConfiguration.attemptToOptimize, savedParameterConfiguration.willOptimize); + + switch (parameter.valueType) + { + case VRCExpressionParameters.ValueType.Bool: + parametersBoolToOptimize.Add(data); + break; + case VRCExpressionParameters.ValueType.Int: + case VRCExpressionParameters.ValueType.Float: + parametersIntNFloatToOptimize.Add(data); + break; + } + } + } + + MemoryOptimizerMain.InstallMemOpt(_vrcAvatarDescriptor, FindFXLayer(_vrcAvatarDescriptor), _vrcAvatarDescriptor.expressionParameters, parametersBoolToOptimize, parametersIntNFloatToOptimize, memoryOptimizer.syncSteps, 0.2f, memoryOptimizer.changeDetection, 0, "Assets/TES/MemOpt"); + + return _vrcAvatarDescriptor.expressionParameters?.CalcTotalCost() < VRCExpressionParameters.MAX_PARAMETER_COST; + } + } +} + +#endif diff --git a/Pipeline/MemoryOptimizerUploadPipeline.cs.meta b/Pipeline/MemoryOptimizerUploadPipeline.cs.meta new file mode 100644 index 0000000..a7bf31d --- /dev/null +++ b/Pipeline/MemoryOptimizerUploadPipeline.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a61b6e17169c4e93880735fc7e88c45c +timeCreated: 1727383253 \ No newline at end of file diff --git a/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef b/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef new file mode 100644 index 0000000..04ce052 --- /dev/null +++ b/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef @@ -0,0 +1,32 @@ +{ + "name": "dev.jetees.memoryoptimizer.Pipeline", + "references": [ + "VRC.SDK3A", + "VRC.SDK3A.Editor", + "VRC.SDKBase", + "VRC.SDKBase.Editor", + "dev.jetees.memoryoptimizer.Component", + "dev.jetees.memoryoptimizer.Editor", + "dev.jetees.memoryoptimizer.Helper" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "autoReferenced": true, + "overrideReferences": false, + "precompiledReferences": [], + "defineConstraints": [], + "optionalUnityReferences": [], + "versionDefines": [ + { + "define": "VRCFury_Installed", + "expression": "0.0.0", + "name": "com.vrcfury.vrcfury" + }, + { + "define": "VRCFury_Tested", + "expression": "[1.0.0,1.1075.0]", + "name": "com.vrcfury.vrcfury" + } + ] +} \ No newline at end of file diff --git a/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef.meta b/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef.meta new file mode 100644 index 0000000..f6e38e6 --- /dev/null +++ b/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 64e613a2a91b4204b0cb83c77ad7f2c2 +timeCreated: 1727383292 \ No newline at end of file From bd11dda9dfbb02e2305aeaa7b1beb60ef1ceb5d6 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Sat, 28 Sep 2024 21:52:33 +0200 Subject: [PATCH 02/16] Iron some Bugs and move Patcher --- Component/MemoryOptimizerComponent.cs | 15 ++-- Editor/MemoryOptimizerComponentEditor.cs | 17 +++++ Editor/MemoryOptimizerMain.cs | 2 +- .../dev.jetees.memoryoptimizer.Editor.asmdef | 12 +++- Patcher/MemoryOptimizerVRCFuryPatcher.cs | 70 +++++++++++++++++++ Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta | 3 + Patcher/VRCFury-FinalValidationService.txt | 2 +- Patcher/_InternalsVisibleTo.cs | 4 ++ Patcher/_InternalsVisibleTo.cs.meta | 3 + .../dev.jetees.memoryoptimizer.Patcher.asmdef | 29 ++++++++ ...jetees.memoryoptimizer.Patcher.asmdef.meta | 3 + ...ryOptimizerDisableVRCFuryParameterCheck.cs | 16 +---- Pipeline/MemoryOptimizerUploadPipeline.cs | 37 ++++++++++ ...dev.jetees.memoryoptimizer.Pipeline.asmdef | 17 +---- 14 files changed, 187 insertions(+), 43 deletions(-) create mode 100644 Patcher/MemoryOptimizerVRCFuryPatcher.cs create mode 100644 Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta create mode 100644 Patcher/_InternalsVisibleTo.cs create mode 100644 Patcher/_InternalsVisibleTo.cs.meta create mode 100644 Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef create mode 100644 Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef.meta diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index 1c3f92a..7c97430 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -73,6 +73,7 @@ internal void Load() { if (!savedParameterConfigurations.Contains(savedParameterConfiguration)) { + totalParameterCost += savedParameterConfiguration.parameterType.Equals("Bool") ? 1 : 8; savedParameterConfigurations.Add(savedParameterConfiguration); } } @@ -150,6 +151,7 @@ internal void Load() // that is being targeted, we skip this as we cannot correctly map it back if (toggleName.Equals("VF##_") && !useGlobalParameter) { + totalParameterCost += isSlider ? 8 : 1; continue; } @@ -241,8 +243,7 @@ internal void Reset() internal void Refresh() { - totalParameterCost = 0; - optimizedParameterCost = 0; + optimizedParameterCost = totalParameterCost; var parametersBool = new List(savedParameterConfigurations.Count); var parametersIntNFloat = new List(savedParameterConfigurations.Count); @@ -280,14 +281,8 @@ internal void Refresh() savedParameterConfiguration.willOptimize = true; } - foreach (var savedParameterConfiguration in savedParameterConfigurations) - { - totalParameterCost += savedParameterConfiguration.parameterType.Equals("Bool") ? 1 : 8; - if (!savedParameterConfiguration.willOptimize) - { - optimizedParameterCost += savedParameterConfiguration.parameterType.Equals("Bool") ? 1 : 8; - } - } + optimizedParameterCost -= parametersBoolToOptimize.Count; + optimizedParameterCost -= parametersIntNFloatToOptimize.Count * 8; var installationIndexers = (syncSteps - 1).DecimalToBinary().ToString().Count(); var installationBoolSyncers = parametersBoolToOptimize.Count / syncSteps; diff --git a/Editor/MemoryOptimizerComponentEditor.cs b/Editor/MemoryOptimizerComponentEditor.cs index c5e5303..078e790 100644 --- a/Editor/MemoryOptimizerComponentEditor.cs +++ b/Editor/MemoryOptimizerComponentEditor.cs @@ -14,6 +14,23 @@ private void OnEnable() public override void OnInspectorGUI() { +#if VRCFury_Installed + if (MemoryOptimizerVRCFuryPatcher.AreVRCFuryScriptsPatched()) + { + GUILayout.Label("VRCFury is patched already!"); + } + else + { + GUILayout.Label("VRCFury requires to be patched in order for this to correctly work when uploading."); + GUILayout.Label("Patching will be done automatically during upload, however it is recommended todo this before."); + if (GUILayout.Button("Patch VRCFury") && EditorUtility.DisplayDialog("Patch VRCFury?", "This will patch some VRCFury files to disable upload check hooks for parameters as we preprocess after, this will cause a script rebuild.\nContinue?", "Yes, Patch!", "No.")) + { + MemoryOptimizerVRCFuryPatcher.PatchVRCFuryScripts(); + } + } + + GUILayout.Space(5); +#endif EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.syncSteps))); GUILayout.Space(5); diff --git a/Editor/MemoryOptimizerMain.cs b/Editor/MemoryOptimizerMain.cs index 31b2077..6962f51 100644 --- a/Editor/MemoryOptimizerMain.cs +++ b/Editor/MemoryOptimizerMain.cs @@ -34,7 +34,7 @@ public class ParamDriversAndStates public List states = new List(); } - private const string discordLink = "https://discord.gg/N7snuJhzkdN7snuJhzkd"; + private const string discordLink = "https://discord.gg/N7snuJhzkd"; private const string prefix = "MemOpt_"; private const string syncingLayerName = prefix + "Syncing Layer"; private const string syncingLayerIdentifier = prefix + "Syncer"; diff --git a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef index 46a3ac8..7db404b 100644 --- a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef +++ b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef @@ -7,7 +7,8 @@ "VRC.SDKBase.Editor", "dev.jetees.memoryoptimizer", "dev.jetees.memoryoptimizer.Component", - "dev.jetees.memoryoptimizer.Helper" + "dev.jetees.memoryoptimizer.Helper", + "dev.jetees.memoryoptimizer.Patcher" ], "includePlatforms": [ "Editor" @@ -18,5 +19,12 @@ "overrideReferences": false, "precompiledReferences": [], "defineConstraints": [], - "optionalUnityReferences": [] + "optionalUnityReferences": [], + "versionDefines": [ + { + "define": "VRCFury_Installed", + "expression": "0.0.0", + "name": "com.vrcfury.vrcfury" + } + ] } \ No newline at end of file diff --git a/Patcher/MemoryOptimizerVRCFuryPatcher.cs b/Patcher/MemoryOptimizerVRCFuryPatcher.cs new file mode 100644 index 0000000..64823e0 --- /dev/null +++ b/Patcher/MemoryOptimizerVRCFuryPatcher.cs @@ -0,0 +1,70 @@ +#if UNITY_EDITOR + +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace JeTeeS.MemoryOptimizer +{ + internal static class MemoryOptimizerVRCFuryPatcher + { + private static bool _refIsPatched = false; + private static MonoScript _refFinalValidationService = null; + + private static void Load() + { + if (_refFinalValidationService is null) + { + if (AssetDatabase.LoadAssetAtPath("Packages/com.vrcfury.vrcfury/Editor/VF/Service/FinalValidationService.cs") is MonoScript scriptToPatch) + { + _refFinalValidationService = scriptToPatch; + _refIsPatched = scriptToPatch.text.Contains("patched by >>> dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher"); + } + } + } + + public static bool AreVRCFuryScriptsPatched() + { +#if VRCFury_Installed +#if !VRCFury_Tested + Debug.LogWarning($"The pipeline is running on an untested version of VRCFury, probably fine though."); +#endif + Load(); + + return _refIsPatched; +#else + return true; +#endif + } + + public static bool PatchVRCFuryScripts() + { +#if VRCFury_Installed +#if !VRCFury_Tested + Debug.LogWarning($"The pipeline is running on an untested version of VRCFury, probably fine though."); +#endif + Load(); + + if (_refIsPatched) + { + Debug.Log("MemoryOptimizerVRCFuryPatcher: Already patched, skipping."); + return true; + } + + if (_refFinalValidationService is not null) + { + if (AssetDatabase.LoadAssetAtPath("Packages/dev.jetees.memoryoptimizer/Patcher/VRCFury-FinalValidationService.txt") is TextAsset patch) + { + File.WriteAllText(AssetDatabase.GetAssetPath(_refFinalValidationService), patch.text); + EditorUtility.SetDirty(_refFinalValidationService); + Debug.Log("MemoryOptimizerVRCFuryPatcher: Patched FinalValidationService."); + } + } + + return AreVRCFuryScriptsPatched(); +#endif + } + } +} + +#endif diff --git a/Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta b/Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta new file mode 100644 index 0000000..ee53d84 --- /dev/null +++ b/Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 630e356928644fc18a7f55eea03a394b +timeCreated: 1727551628 \ No newline at end of file diff --git a/Patcher/VRCFury-FinalValidationService.txt b/Patcher/VRCFury-FinalValidationService.txt index ce5116d..43304a8 100644 --- a/Patcher/VRCFury-FinalValidationService.txt +++ b/Patcher/VRCFury-FinalValidationService.txt @@ -12,7 +12,7 @@ using VRC.SDK3.Avatars.ScriptableObjects; namespace VF.Service { /** * Many of these checks are copied from or modified from the validation checks in the VRCSDK - * MemoryOptimizerPatched + * patched by >>> dev.jetees.memoryoptimier.MemoryOptimizerVRCFuryPatcher */ [VFService] internal class FinalValidationService { diff --git a/Patcher/_InternalsVisibleTo.cs b/Patcher/_InternalsVisibleTo.cs new file mode 100644 index 0000000..194b3ff --- /dev/null +++ b/Patcher/_InternalsVisibleTo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Editor")] +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Pipeline")] diff --git a/Patcher/_InternalsVisibleTo.cs.meta b/Patcher/_InternalsVisibleTo.cs.meta new file mode 100644 index 0000000..003212d --- /dev/null +++ b/Patcher/_InternalsVisibleTo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ca82bbc994354247a560244ff04e0823 +timeCreated: 1727551858 \ No newline at end of file diff --git a/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef b/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef new file mode 100644 index 0000000..d832707 --- /dev/null +++ b/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef @@ -0,0 +1,29 @@ +{ + "name": "dev.jetees.memoryoptimizer.Patcher", + "references": [ + "VRC.SDK3A", + "VRC.SDK3A.Editor", + "VRC.SDKBase", + "VRC.SDKBase.Editor" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "autoReferenced": true, + "overrideReferences": false, + "precompiledReferences": [], + "defineConstraints": [], + "optionalUnityReferences": [], + "versionDefines": [ + { + "define": "VRCFury_Installed", + "expression": "0.0.0", + "name": "com.vrcfury.vrcfury" + }, + { + "define": "VRCFury_Tested", + "expression": "[1.0.0,1.1075.0]", + "name": "com.vrcfury.vrcfury" + } + ] +} \ No newline at end of file diff --git a/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef.meta b/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef.meta new file mode 100644 index 0000000..1768f89 --- /dev/null +++ b/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4ac41961b7af4a058bde479d16dacf91 +timeCreated: 1727551599 \ No newline at end of file diff --git a/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs b/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs index 15821c7..83ef887 100644 --- a/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs +++ b/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs @@ -15,21 +15,7 @@ public class MemoryOptimizerDisableVRCFuryParameterCheck : IVRCSDKPreprocessAvat public bool OnPreprocessAvatar(GameObject avatarGameObject) { -#if VRCFury_Installed -#if !VRCFury_Tested - Debug.LogWarning($"The pipeline is running on an untested version of VRCFury, probably fine though."); -#endif - if (AssetDatabase.LoadAssetAtPath("Packages/com.vrcfury.vrcfury/Editor/VF/Service/FinalValidationService.cs") is MonoScript scriptToPatch) - { - if (AssetDatabase.LoadAssetAtPath("Packages/dev.jetees.memoryoptimizer/Patcher/VRCFury-FinalValidationService.txt") is TextAsset patch) - { - File.WriteAllText(AssetDatabase.GetAssetPath(scriptToPatch), patch.text); - EditorUtility.SetDirty(scriptToPatch); - } - } -#endif - - return true; + return MemoryOptimizerVRCFuryPatcher.PatchVRCFuryScripts(); } } } diff --git a/Pipeline/MemoryOptimizerUploadPipeline.cs b/Pipeline/MemoryOptimizerUploadPipeline.cs index de5b092..1baf266 100644 --- a/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -15,6 +15,23 @@ namespace JeTeeS.MemoryOptimizer public class MemoryOptimizerUploadPipeline : IVRCSDKPreprocessAvatarCallback { private readonly string[] _paramTypes = { "Int", "Float", "Bool" }; + private readonly string[] _animatorParamTypes = + { + "", + // 1 + "Float", + "", + // 3 + "Int", + // 4 + "Bool", + "", + "", + "", + "", + // 9 + "Trigger" + }; // VRCFury runs at -10000 // VRChat strips components at -1024 @@ -77,6 +94,26 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) continue; } + var fxLayer = FindFXLayer(_vrcAvatarDescriptor); + // add the parameter to the fx layer if it's missing + if (fxLayer.parameters.All(p => !p.name.Equals(parameter.name))) + { + var type = AnimatorControllerParameterType.Float; + switch (parameter.valueType) + { + case VRCExpressionParameters.ValueType.Int: + type = AnimatorControllerParameterType.Int; + break; + case VRCExpressionParameters.ValueType.Float: + break; + case VRCExpressionParameters.ValueType.Bool: + type = AnimatorControllerParameterType.Bool; + break; + } + + fxLayer.AddUniqueParam(parameter.name, type); + } + if (savedParameterConfiguration.attemptToOptimize && savedParameterConfiguration.willOptimize) { Debug.Log($"MemoryOptimizerUploadPipeline.OnPreprocessAvatar {savedParameterConfiguration.parameterName} will be optimized."); diff --git a/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef b/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef index 04ce052..f65cd43 100644 --- a/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef +++ b/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef @@ -7,7 +7,8 @@ "VRC.SDKBase.Editor", "dev.jetees.memoryoptimizer.Component", "dev.jetees.memoryoptimizer.Editor", - "dev.jetees.memoryoptimizer.Helper" + "dev.jetees.memoryoptimizer.Helper", + "dev.jetees.memoryoptimizer.Patcher" ], "includePlatforms": [], "excludePlatforms": [], @@ -16,17 +17,5 @@ "overrideReferences": false, "precompiledReferences": [], "defineConstraints": [], - "optionalUnityReferences": [], - "versionDefines": [ - { - "define": "VRCFury_Installed", - "expression": "0.0.0", - "name": "com.vrcfury.vrcfury" - }, - { - "define": "VRCFury_Tested", - "expression": "[1.0.0,1.1075.0]", - "name": "com.vrcfury.vrcfury" - } - ] + "optionalUnityReferences": [] } \ No newline at end of file From 415b60c5824b6d3788e9bd16a5a721528d35f703 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:44:12 +0200 Subject: [PATCH 03/16] Refactor a lot of stuff, configuration now happens in the Editor Window --- Component/MemoryOptimizerComponent.cs | 183 +++---- ...ev.jetees.memoryoptimizer.Component.asmdef | 5 +- Editor/MemoryOptimizerComponentEditor.cs | 137 +++-- Editor/MemoryOptimizerMain.cs | 235 ++++++--- Editor/MemoryOptimizerWindow.cs | 496 ++++++++++++------ Editor/Patcher.meta | 8 + .../Patcher}/MemoryOptimizerVRCFuryPatcher.cs | 20 +- .../MemoryOptimizerVRCFuryPatcher.cs.meta | 0 .../VRCFury-FinalValidationService.txt | 2 +- .../VRCFury-FinalValidationService.txt.meta | 0 Editor/Pipeline.meta | 8 + ...ryOptimizerDisableVRCFuryParameterCheck.cs | 11 +- ...imizerDisableVRCFuryParameterCheck.cs.meta | 0 .../MemoryOptimizerUploadPipeline.cs | 64 +-- .../MemoryOptimizerUploadPipeline.cs.meta | 0 Editor/_InternalsVisibleTo.cs | 1 + .../dev.jetees.memoryoptimizer.Editor.asmdef | 9 +- Helper/ReadOnlyPropertyHelper.cs | 2 +- Helper/ReflectionHelper.cs | 2 +- Helper/TESHelperFunctions.cs | 273 ++++++++-- Helper/_InternalsVisibleTo.cs | 1 - Patcher.meta | 3 - Patcher/_InternalsVisibleTo.cs.meta | 3 - ...jetees.memoryoptimizer.Patcher.asmdef.meta | 3 - Pipeline.meta | 3 - ...dev.jetees.memoryoptimizer.Pipeline.asmdef | 21 - ...etees.memoryoptimizer.Pipeline.asmdef.meta | 3 - Shared.meta | 3 + Shared/MemoryOptimizerListData.cs | 21 + Shared/MemoryOptimizerListData.cs.meta | 3 + {Patcher => Shared}/_InternalsVisibleTo.cs | 2 +- Shared/_InternalsVisibleTo.cs.meta | 3 + .../dev.jetees.memoryoptimizer.Shared.asmdef | 9 +- ....jetees.memoryoptimizer.Shared.asmdef.meta | 3 + 34 files changed, 1020 insertions(+), 517 deletions(-) create mode 100644 Editor/Patcher.meta rename {Patcher => Editor/Patcher}/MemoryOptimizerVRCFuryPatcher.cs (86%) rename {Patcher => Editor/Patcher}/MemoryOptimizerVRCFuryPatcher.cs.meta (100%) rename {Patcher => Editor/Patcher}/VRCFury-FinalValidationService.txt (97%) rename {Patcher => Editor/Patcher}/VRCFury-FinalValidationService.txt.meta (100%) create mode 100644 Editor/Pipeline.meta rename {Pipeline => Editor/Pipeline}/MemoryOptimizerDisableVRCFuryParameterCheck.cs (64%) rename {Pipeline => Editor/Pipeline}/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta (100%) rename {Pipeline => Editor/Pipeline}/MemoryOptimizerUploadPipeline.cs (60%) rename {Pipeline => Editor/Pipeline}/MemoryOptimizerUploadPipeline.cs.meta (100%) delete mode 100644 Patcher.meta delete mode 100644 Patcher/_InternalsVisibleTo.cs.meta delete mode 100644 Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef.meta delete mode 100644 Pipeline.meta delete mode 100644 Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef delete mode 100644 Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef.meta create mode 100644 Shared.meta create mode 100644 Shared/MemoryOptimizerListData.cs create mode 100644 Shared/MemoryOptimizerListData.cs.meta rename {Patcher => Shared}/_InternalsVisibleTo.cs (60%) create mode 100644 Shared/_InternalsVisibleTo.cs.meta rename Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef => Shared/dev.jetees.memoryoptimizer.Shared.asmdef (68%) create mode 100644 Shared/dev.jetees.memoryoptimizer.Shared.asmdef.meta diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index 7c97430..7bfe521 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -1,11 +1,13 @@ -#if UNITY_EDITOR - -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using JeTeeS.MemoryOptimizer.Helper; +using JeTeeS.MemoryOptimizer.Shared; using JeTeeS.TES.HelperFunctions; +using UnityEditor; using UnityEngine; +using UnityEngine.Serialization; using VRC.SDK3.Avatars.Components; using VRC.SDK3.Avatars.ScriptableObjects; using VRC.SDKBase; @@ -13,18 +15,33 @@ namespace JeTeeS.MemoryOptimizer { [Serializable] + [DisallowMultipleComponent] [RequireComponent(typeof(VRCAvatarDescriptor))] - public class MemoryOptimizerComponent : MonoBehaviour, IEditorOnly + internal class MemoryOptimizerComponent : MonoBehaviour, IEditorOnly { [Serializable] - public class SavedParameterConfiguration + internal class SavedParameterConfiguration : MemoryOptimizerListData { - public string parameterName = string.Empty; - [ReadOnlyPropertyHelper.ReadOnly] public string parameterType = string.Empty; - public bool attemptToOptimize = true; - [ReadOnlyPropertyHelper.ReadOnly] public bool willOptimize = false; - [ReadOnlyPropertyHelper.ReadOnly] public bool isVRCFuryParameter = false; - [ReadOnlyPropertyHelper.ReadOnly] public string info = string.Empty; + public bool isVRCFuryParameter = false; + public string info = string.Empty; + + public SavedParameterConfiguration(VRCExpressionParameters.Parameter parameter) : base(parameter, false, false) + { + } + + public SavedParameterConfiguration(string parameterName, VRCExpressionParameters.ValueType parameterType) : base(new VRCExpressionParameters.Parameter() + { + name = parameterName, + valueType = parameterType, + networkSynced = true + }, false, false) + { + } + + public override int GetHashCode() + { + return $"{this.param.name}{TESHelperFunctions._paramTypes[(int)this.param.valueType]}".GetHashCode(); + } public override bool Equals(object obj) { @@ -35,61 +52,73 @@ public override bool Equals(object obj) if (obj is SavedParameterConfiguration typed) { - return typed.parameterName.Equals(parameterName) && typed.parameterType.Equals(parameterType); + return typed.param.name.Equals(this.param.name) && typed.param.valueType == this.param.valueType; } return base.Equals(obj); } - public override string ToString() + public MemoryOptimizerListData Pure() + { + return new MemoryOptimizerListData(new VRCExpressionParameters.Parameter() + { + name = this.param.name, + valueType = this.param.valueType, + networkSynced = true + }, this.selected, this.willBeOptimized); + } + + public static bool operator ==(SavedParameterConfiguration a, object b) + { + return a?.Equals(b) ?? false; + } + + public static bool operator !=(SavedParameterConfiguration a, object b) { - return $"{parameterName} ({parameterType}) - {(attemptToOptimize ? "Will try to Optimize" : "Won't Optimize")}"; + return !(a == b); } - } + } - [NonSerialized] private readonly string[] _paramTypes = { "Int", "Float", "Bool" }; [NonSerialized] private VRCAvatarDescriptor _vrcAvatarDescriptor; public bool changeDetection = false; public int syncSteps = 2; - public List savedParameterConfigurations = new List(0); - public List exclusions = new List(0); - public int totalParameterCost = 0; - public int optimizedParameterCost = 0; + public float stepDelay = 0.2f; + public int wdOption = 0; + [SerializeReference] internal DefaultAsset savePathOverride = null; + + [NonSerialized] internal int longestParameterName = 0; + + [SerializeField] internal List savedParameterConfigurations = new(0); internal void Load() { // get descriptor _vrcAvatarDescriptor = gameObject.GetComponent(); + var descriptorParameters = (_vrcAvatarDescriptor?.expressionParameters?.parameters ?? Array.Empty()).Where(p => p.networkSynced).ToList(); // collect all descriptor parameters that are synced - foreach (var savedParameterConfiguration in (_vrcAvatarDescriptor?.expressionParameters?.parameters ?? Array.Empty()).Where(p => p.networkSynced).Select(p => new SavedParameterConfiguration() + foreach (var savedParameterConfiguration in descriptorParameters.Select(p => new SavedParameterConfiguration(p) { - parameterName = p.name, - parameterType = _paramTypes[(int)p.valueType], - attemptToOptimize = true, info = "From Avatar Descriptor" })) { - if (!savedParameterConfigurations.Contains(savedParameterConfiguration)) - { - totalParameterCost += savedParameterConfiguration.parameterType.Equals("Bool") ? 1 : 8; - savedParameterConfigurations.Add(savedParameterConfiguration); - } + AddOrReplaceParameterConfiguration(savedParameterConfiguration); } -#if VRCFury_Installed +#if MemoryOptimizer_VRCFury_IsInstalled // since all VRCFury components are IEditorOnly, we can find them like this // there is no better way as VRCFury has decided to mark their classes as internal only - IEnumerable _vrcfComponents = (gameObject.GetComponents()) + List vrcfComponents = (gameObject.GetComponents()) .Concat(gameObject.GetComponentsInChildren(true)) - .Where(x => x.GetType().ToString().Contains("VRCFury")); + .Where(x => x.GetType().ToString().Contains("VRCFury")) + .ToList(); // collect all VRCFury parameters // this is where the real fun begins... - if (_vrcfComponents.Any()) + if (vrcfComponents.Any()) { - foreach (IEditorOnly vrcfComponent in _vrcfComponents) + foreach (IEditorOnly vrcfComponent in vrcfComponents) { // some systems use EditorOnly components to be optimized away var vrcfGameObject = ((Component)vrcfComponent).gameObject; @@ -146,28 +175,21 @@ internal void Load() { useGlobalParameter = false; } - + // if the toggle is a non described empty one and there isn't a global parameter // that is being targeted, we skip this as we cannot correctly map it back if (toggleName.Equals("VF##_") && !useGlobalParameter) { - totalParameterCost += isSlider ? 8 : 1; continue; } - SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration() + SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration(useGlobalParameter ? globalParameter : $"VF##_{toggleName}", isSlider ? VRCExpressionParameters.ValueType.Float : VRCExpressionParameters.ValueType.Bool) { - parameterName = useGlobalParameter ? globalParameter : $"VF##_{toggleName}", - parameterType = isSlider ? "Float" : "Bool", - attemptToOptimize = true, isVRCFuryParameter = true, info = isEditorOnly ? "(EditorOnly) " : string.Empty + $"From Toggle: {toggleName} on {gameObject.name}" }; - if (!savedParameterConfigurations.Contains(savedParameterConfiguration)) - { - savedParameterConfigurations.Add(savedParameterConfiguration); - } + AddOrReplaceParameterConfiguration(savedParameterConfiguration); } // Full Controller else if (contentType.Contains("FullController")) @@ -212,19 +234,13 @@ internal void Load() continue; } - SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration() + SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration((containsStar && !globalParameters.Contains($"!{parameter.name}")) || globalParameters.Contains(parameter.name) ? parameter.name : $"VF##_{parameter.name}", parameter.valueType) { - parameterName = (containsStar && !globalParameters.Contains($"!{parameter.name}")) || globalParameters.Contains(parameter.name) ? parameter.name : $"VF##_{parameter.name}", - parameterType = _paramTypes[(int)parameter.valueType], - attemptToOptimize = true, isVRCFuryParameter = true, info = isEditorOnly ? "(EditorOnly) " : string.Empty + $"From FullController on {vrcfGameObject.name}" }; - if (!savedParameterConfigurations.Contains(savedParameterConfiguration)) - { - savedParameterConfigurations.Add(savedParameterConfiguration); - } + AddOrReplaceParameterConfiguration(savedParameterConfiguration); } } } @@ -234,63 +250,34 @@ internal void Load() #endif } - internal void Reset() + private void Awake() { - savedParameterConfigurations = new List(0); Load(); - Refresh(); } - internal void Refresh() + private void Reset() { - optimizedParameterCost = totalParameterCost; - - var parametersBool = new List(savedParameterConfigurations.Count); - var parametersIntNFloat = new List(savedParameterConfigurations.Count); - - foreach (var savedParameterConfiguration in savedParameterConfigurations) + savedParameterConfigurations = new(0); + } + + private void AddOrReplaceParameterConfiguration(SavedParameterConfiguration configuration) + { + if (savedParameterConfigurations.Contains(configuration)) { - savedParameterConfiguration.attemptToOptimize = exclusions.All(e => !savedParameterConfiguration.parameterName.Replace("VF##_", string.Empty).StartsWith(e)); - savedParameterConfiguration.willOptimize = false; - - if (savedParameterConfiguration.attemptToOptimize) + // in the odd case a parameter is defined multiple times + // we replace it with the one costing more, as mapping from a float to a bool + // usually is handled much better than bool to a float + var saved = savedParameterConfigurations.FirstOrDefault(p => p == configuration); + if (saved is not null && saved.param.GetParameterCost() < configuration.param.GetParameterCost()) { - switch (savedParameterConfiguration.parameterType) - { - case "Bool": - parametersBool.Add(savedParameterConfiguration); - break; - case "Int": - case "Float": - parametersIntNFloat.Add(savedParameterConfiguration); - break; - } + saved.param = configuration.param; } } - - var parametersBoolToOptimize = parametersBool.Take(parametersBool.Count - (parametersBool.Count % syncSteps)).ToList(); - var parametersIntNFloatToOptimize = parametersIntNFloat.Take(parametersIntNFloat.Count - (parametersIntNFloat.Count % syncSteps)).ToList(); - - foreach (var savedParameterConfiguration in parametersBoolToOptimize) - { - savedParameterConfiguration.willOptimize = true; - } - - foreach (var savedParameterConfiguration in parametersIntNFloatToOptimize) + else { - savedParameterConfiguration.willOptimize = true; + longestParameterName = Math.Max(longestParameterName, configuration.param.name.Count()); + savedParameterConfigurations.Add(configuration); } - - optimizedParameterCost -= parametersBoolToOptimize.Count; - optimizedParameterCost -= parametersIntNFloatToOptimize.Count * 8; - - var installationIndexers = (syncSteps - 1).DecimalToBinary().ToString().Count(); - var installationBoolSyncers = parametersBoolToOptimize.Count / syncSteps; - var installationIntNFloatSyncers = parametersIntNFloatToOptimize.Count / syncSteps; - - optimizedParameterCost += installationIndexers + installationBoolSyncers + (installationIntNFloatSyncers * 8); } } } - -#endif diff --git a/Component/dev.jetees.memoryoptimizer.Component.asmdef b/Component/dev.jetees.memoryoptimizer.Component.asmdef index 6350793..1df1971 100644 --- a/Component/dev.jetees.memoryoptimizer.Component.asmdef +++ b/Component/dev.jetees.memoryoptimizer.Component.asmdef @@ -5,7 +5,8 @@ "VRC.SDK3A.Editor", "VRC.SDKBase", "VRC.SDKBase.Editor", - "dev.jetees.memoryoptimizer.Helper" + "dev.jetees.memoryoptimizer.Helper", + "dev.jetees.memoryoptimizer.Shared" ], "includePlatforms": [], "excludePlatforms": [], @@ -17,7 +18,7 @@ "optionalUnityReferences": [], "versionDefines": [ { - "define": "VRCFury_Installed", + "define": "MemoryOptimizer_VRCFury_IsInstalled", "expression": "0.0.0", "name": "com.vrcfury.vrcfury" } diff --git a/Editor/MemoryOptimizerComponentEditor.cs b/Editor/MemoryOptimizerComponentEditor.cs index 078e790..319f261 100644 --- a/Editor/MemoryOptimizerComponentEditor.cs +++ b/Editor/MemoryOptimizerComponentEditor.cs @@ -1,80 +1,117 @@ using System; +using JeTeeS.MemoryOptimizer.Patcher; +using JeTeeS.TES.HelperFunctions; using UnityEditor; using UnityEngine; namespace JeTeeS.MemoryOptimizer { [CustomEditor(typeof(MemoryOptimizerComponent))] - public class MemoryOptimizerComponentEditor : Editor + internal class MemoryOptimizerComponentEditor : Editor { - private void OnEnable() - { - ((MemoryOptimizerComponent)target).Load(); - } - + private const string EditorKeyInspectComponent = "dev.jetees.memoryoptimizer_inspectcomponent"; + private const string EditorKeyInspectParameters = "dev.jetees.memoryoptimizer_inspectparameters"; + public override void OnInspectorGUI() { -#if VRCFury_Installed + var typed = ((MemoryOptimizerComponent)target); + +#if MemoryOptimizer_VRCFury_IsInstalled if (MemoryOptimizerVRCFuryPatcher.AreVRCFuryScriptsPatched()) { - GUILayout.Label("VRCFury is patched already!"); + EditorGUILayout.HelpBox("VRCFury is patched already!", MessageType.Info); } else { - GUILayout.Label("VRCFury requires to be patched in order for this to correctly work when uploading."); - GUILayout.Label("Patching will be done automatically during upload, however it is recommended todo this before."); - if (GUILayout.Button("Patch VRCFury") && EditorUtility.DisplayDialog("Patch VRCFury?", "This will patch some VRCFury files to disable upload check hooks for parameters as we preprocess after, this will cause a script rebuild.\nContinue?", "Yes, Patch!", "No.")) + EditorGUILayout.HelpBox("VRCFury requires to be patched in order for this to correctly work when uploading.\nPatching will be done automatically during upload, however it is recommended todo this before.", MessageType.Warning); + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) { - MemoryOptimizerVRCFuryPatcher.PatchVRCFuryScripts(); + if (GUILayout.Button("Patch VRCFury") && EditorUtility.DisplayDialog("Patch VRCFury?", "This will patch some VRCFury files to disable upload check hooks for parameters as we preprocess after, this will cause a script rebuild.\nContinue?", "Yes, Patch!", "No.")) + { + MemoryOptimizerVRCFuryPatcher.PatchVRCFuryScripts(); + } } } GUILayout.Space(5); #endif - EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.syncSteps))); - - GUILayout.Space(5); - - var syncSteps = serializedObject.FindProperty(nameof(MemoryOptimizerComponent.syncSteps)); - var disableChangeDetection = false; - if (syncSteps.intValue <= 2) + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) { - disableChangeDetection = true; - syncSteps.intValue = Math.Max(0, syncSteps.intValue); + if (GUILayout.Button("Configure")) + { + typed.Load(); + + MemoryOptimizerWindow._component = typed; + EditorWindow window = EditorWindow.GetWindow(typeof(MemoryOptimizerWindow), false, "Memory Optimizer (Configuration)", true); + window.minSize = new Vector2(600, 900); + } } - if (syncSteps.intValue > 32) + var foldoutState = EditorGUILayout.Foldout(EditorPrefs.GetBool(EditorKeyInspectComponent), "Component Configuration"); + EditorPrefs.SetBool(EditorKeyInspectComponent, foldoutState); + if (foldoutState) { - syncSteps.intValue = 32; - } - - EditorGUI.BeginDisabledGroup(disableChangeDetection); - EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.changeDetection))); - EditorGUI.EndDisabledGroup(); - - GUILayout.Space(5); - - EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.savedParameterConfigurations))); - - GUILayout.Space(5); - - EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.exclusions))); - - serializedObject.ApplyModifiedProperties(); + GUI.enabled = false; - EditorGUI.BeginDisabledGroup(true); - - GUILayout.Space(5); - - EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.totalParameterCost))); - - GUILayout.Space(5); - - EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(MemoryOptimizerComponent.optimizedParameterCost))); - - EditorGUI.EndDisabledGroup(); + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) + { + GUILayout.Label("Write Defaults:"); + GUILayout.Label($"{MemoryOptimizerWindow.wdOptions[typed.wdOption]}", GUILayout.Width(100)); + } + + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) + { + GUILayout.Label("Change Detection"); + + GUI.backgroundColor = typed.changeDetection ? Color.green : Color.red; + GUILayout.Button(typed.changeDetection ? "On" : "Off", GUILayout.Width(100)); + GUI.backgroundColor = Color.white; + } + + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) + { + GUILayout.Label("Sync Steps:"); + GUILayout.Label($"{typed.syncSteps}", GUILayout.Width(100)); + } - ((MemoryOptimizerComponent)target).Refresh(); + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) + { + GUILayout.Label("Step Delay:"); + GUILayout.Label($"{typed.stepDelay}s", GUILayout.Width(100)); + } + + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) + { + GUILayout.Label("Save Path Override:"); + GUILayout.Label($"{typed.savePathOverride?.ToString() ?? "None"}", GUILayout.Width(100)); + } + + GUI.enabled = true; + + foldoutState = EditorGUILayout.Foldout(EditorPrefs.GetBool(EditorKeyInspectParameters), "Parameter Configurations"); + EditorPrefs.SetBool(EditorKeyInspectParameters, foldoutState); + if (foldoutState) + { + foreach (var savedParameterConfiguration in typed.savedParameterConfigurations) + { + var (parameterName, parameterType, isSelected, willOptimize) = (savedParameterConfiguration.param.name, savedParameterConfiguration.param.valueType.TranslateParameterValueType(), savedParameterConfiguration.selected, savedParameterConfiguration.willBeOptimized); + + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal))) + { + GUILayout.Space(5); + + GUILayout.Label(new GUIContent(parameterName, savedParameterConfiguration.info), GUILayout.MinWidth(typed.longestParameterName * 8)); + GUILayout.Label($"{parameterType}", GUILayout.Width(50)); + + GUI.backgroundColor = isSelected ? (willOptimize ? Color.green : Color.yellow) : Color.red; + GUI.enabled = false; + GUILayout.Button($"{(isSelected ? (willOptimize ? "Will optimize." : "Can't be optimized." ) : "Won't be optimized.")}", GUILayout.Width(203)); + GUI.enabled = true; + GUI.backgroundColor = Color.white; + } + } + } + } } } } \ No newline at end of file diff --git a/Editor/MemoryOptimizerMain.cs b/Editor/MemoryOptimizerMain.cs index 6962f51..a584404 100644 --- a/Editor/MemoryOptimizerMain.cs +++ b/Editor/MemoryOptimizerMain.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using JeTeeS.MemoryOptimizer.Shared; using UnityEditor; using UnityEditor.Animations; using UnityEngine; @@ -12,23 +13,9 @@ namespace JeTeeS.MemoryOptimizer { - public static class MemoryOptimizerMain + internal static class MemoryOptimizerMain { - public class MemoryOptimizerListData - { - public VRCExpressionParameters.Parameter param; - public bool selected = false; - public bool willBeOptimized = false; - - public MemoryOptimizerListData(VRCExpressionParameters.Parameter parameter, bool isSelected, bool willOptimize) - { - param = parameter; - selected = isSelected; - willBeOptimized = willOptimize; - } - } - - public class ParamDriversAndStates + internal class ParamDriversAndStates { public VRCAvatarParameterDriver paramDriver = ScriptableObject.CreateInstance(); public List states = new List(); @@ -70,12 +57,20 @@ private class MemoryOptimizerState public static bool IsSystemInstalled(AnimatorController controller) { - if (controller == null) + if (controller is null) + { return false; + } + if (controller.FindHiddenIdentifier(syncingLayerIdentifier).Count == 1) + { return true; + } + if (controller.FindHiddenIdentifier(mainBlendTreeIdentifier).Count == 1) + { return true; + } return false; } @@ -93,11 +88,6 @@ public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorControlle boolsToOptimize = boolsToOptimize, intsNFloatsToOptimize = intsNFloatsToOptimize, boolsNIntsWithCopies = new List(), - /*Debug stuff - Debug.Log("[MemoryOptimizer] Optimizing Params..."); - foreach (MemoryOptimizerListData listData in boolsToOptimize) Debug.Log("[MemoryOptimizer] Optimizing: " + listData.param.name + " that is the type: " + listData.param.valueType.ToString()); - foreach (MemoryOptimizerListData listData in intsNFloatsToOptimize) Debug.Log("[MemoryOptimizer] Optimizing: " + listData.param.name + " that is the type: " + listData.param.valueType.ToString()); - */ syncingLayer = new AnimatorControllerLayer { @@ -123,18 +113,26 @@ public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorControlle string syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); for (int i = 0; i < syncStepsBinary.Count(); i++) + { AddUniqueSyncedParamToController(indexerParamName + (i + 1).ToString(), fxLayer, expressionParameters, AnimatorControllerParameterType.Bool, VRCExpressionParameters.ValueType.Bool); + } for (int j = 0; j < boolsToOptimize.Count / syncSteps; j++) + { AddUniqueSyncedParamToController(boolSyncerParamName + j, optimizerState.FXController, optimizerState.expressionParameters, AnimatorControllerParameterType.Bool, VRCExpressionParameters.ValueType.Bool); + } for (int j = 0; j < intsNFloatsToOptimize.Count / syncSteps; j++) + { AddUniqueSyncedParamToController(intNFloatSyncerParamName + j, optimizerState.FXController, optimizerState.expressionParameters, AnimatorControllerParameterType.Int, VRCExpressionParameters.ValueType.Int); + } CreateLocalRemoteSplit(optimizerState); if (generateChangeDetection) + { GenerateDeltas(optimizerState, generatedAssetsFilePath); + } AnimatorState localEntryState = optimizerState.localStateMachine.AddState("Entry", new Vector3(0, 100, 0)); localEntryState.hideFlags = HideFlags.HideInHierarchy; @@ -153,26 +151,46 @@ public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorControlle if (wdOption == 0) { int foundWD = fxLayer.FindWDInController(); - if (foundWD == -1) setWD = true; - else if (foundWD == 0) setWD = false; - else if (foundWD == 1) setWD = true; + if (foundWD == -1) + { + setWD = true; + } + else if (foundWD == 0) + { + setWD = false; + } + else if (foundWD == 1) + { + setWD = true; + } } else if (wdOption == 1) + { setWD = false; + } else + { setWD = true; + } - foreach (var state in optimizerState.syncingLayer.FindAllStatesInLayer()) state.state.writeDefaultValues = setWD; + foreach (var state in optimizerState.syncingLayer.FindAllStatesInLayer()) + { + state.state.writeDefaultValues = setWD; + } optimizerState.FXController.AddLayer(optimizerState.syncingLayer); optimizerState.FXController.SaveUnsavedAssetsToController(); foreach (var param in boolsToOptimize) + { param.param.networkSynced = false; + } foreach (var param in intsNFloatsToOptimize) + { param.param.networkSynced = false; - + } + EditorUtility.SetDirty(expressionParameters); AssetDatabase.SaveAssets(); @@ -190,12 +208,13 @@ private static void GenerateDeltas(MemoryOptimizerState optimizerState, string g List boolsDifferentials = new List(); List intsNFloatsDifferentials = new List(); + //Add smoothed ver of every param in the list foreach (MemoryOptimizerListData param in boolsToOptimize) { List paramMatches = optimizerState.FXController.parameters.Where(x => x.name == param.param.name).ToList(); AnimatorControllerParameter paramMatch = paramMatches[0]; - if (paramMatch.type == AnimatorControllerParameterType.Int || paramMatch.type == AnimatorControllerParameterType.Bool) + if (paramMatch.type is AnimatorControllerParameterType.Int or AnimatorControllerParameterType.Bool) { AnimatorControllerParameter paramCopy = optimizerState.FXController.AddUniqueParam(prefix + paramMatch.name + "_Copy"); optimizerState.boolsNIntsWithCopies.Add(paramMatch); @@ -208,14 +227,17 @@ private static void GenerateDeltas(MemoryOptimizerState optimizerState, string g boolsDifferentials.Add(AddParamDifferential(paramMatch, smoothedParam, optimizerState.FXController, generatedAssetsFilePath, 0, 1, prefix + paramMatch.name + DifferentialSuffix, mainBlendTreeIdentifier, mainBlendTreeLayerName, DifferentialTreeName, constantOneName)); } else + { Debug.LogError("[MemoryOptimizer] Param " + param.param.name + "is not bool, int or float!"); + } } foreach (MemoryOptimizerListData param in intsNFloatsToOptimize) { List paramMatches = optimizerState.FXController.parameters.Where(x => x.name == param.param.name).ToList(); AnimatorControllerParameter paramMatch = paramMatches[0]; - if (paramMatch.type == AnimatorControllerParameterType.Int || paramMatch.type == AnimatorControllerParameterType.Bool) + + if (paramMatch.type is AnimatorControllerParameterType.Int or AnimatorControllerParameterType.Bool) { AnimatorControllerParameter paramCopy = optimizerState.FXController.AddUniqueParam(prefix + paramMatch.name + "_Copy"); optimizerState.boolsNIntsWithCopies.Add(paramMatch); @@ -228,7 +250,9 @@ private static void GenerateDeltas(MemoryOptimizerState optimizerState, string g intsNFloatsDifferentials.Add(AddParamDifferential(paramMatch, smoothedParam, optimizerState.FXController, generatedAssetsFilePath, -1, 1, prefix + paramMatch.name + DifferentialSuffix, mainBlendTreeIdentifier, mainBlendTreeLayerName, DifferentialTreeName, constantOneName)); } else + { Debug.LogError("[MemoryOptimizer] Param " + param.param.name + "is not bool, int or float!"); + } } optimizerState.boolsDifferentials = boolsDifferentials; @@ -256,7 +280,9 @@ private static void CreateTransitions(MemoryOptimizerState optimizerState, int s { string currentIndex = i.DecimalToBinary().ToString(); while (currentIndex.Length < syncStepsBinary.Length) + { currentIndex = "0" + currentIndex; + } AnimatorStateTransition toSetterTransition = new AnimatorStateTransition() { @@ -305,6 +331,7 @@ void SetupLocalResetStateTransitions(string differentialName) duration = 0f, hideFlags = HideFlags.HideInHierarchy }; + transition.AddCondition(AnimatorConditionMode.Less, changeSensitivity * -1, differentialName); state.AddTransition(transition); @@ -317,6 +344,7 @@ void SetupLocalResetStateTransitions(string differentialName) duration = 0f, hideFlags = HideFlags.HideInHierarchy }; + transition.AddCondition(AnimatorConditionMode.Greater, changeSensitivity, differentialName); state.AddTransition(transition); } @@ -335,16 +363,28 @@ void SetupLocalResetStateTransitions(string differentialName) } } - //add the transitions from remote set states to the wait state + // add the transitions from remote set states to the wait state foreach (AnimatorStateTransition transition in toWaitTransitions) + { remoteSetStates[i].AddTransition(transition); + } - //add transition from wait state to current set state + // add transition from wait state to current set state waitForIndexer.AddTransition(toSetterTransition); } for (int i = 0; i < localSetStates.Count; i++) - localSetStates[i].AddTransition(new AnimatorStateTransition() { destinationState = localSetStates[(i + 1) % localSetStates.Count], exitTime = stepDelay, hasExitTime = true, hasFixedDuration = true, duration = 0f, hideFlags = HideFlags.HideInHierarchy }); + { + localSetStates[i].AddTransition(new AnimatorStateTransition() + { + destinationState = localSetStates[(i + 1) % localSetStates.Count], + exitTime = stepDelay, + hasExitTime = true, + hasFixedDuration = true, + duration = 0f, + hideFlags = HideFlags.HideInHierarchy + }); + } } private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, int syncSteps, bool generateChangeDetection) @@ -352,17 +392,21 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, List localSetStates = optimizerState.localSetStates; List localResetStates = optimizerState.localResetStates; List remoteSetStates = optimizerState.remoteSetStates; + List boolsToOptimize = optimizerState.boolsToOptimize; List intsNFloatsToOptimize = optimizerState.intsNFloatsToOptimize; List localSettersParameterDrivers = new List(); List remoteSettersParameterDrivers = new List(); + string syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); for (int i = 0; i < syncSteps; i++) { string currentIndex = i.DecimalToBinary().ToString(); while (currentIndex.Length < syncStepsBinary.Length) + { currentIndex = "0" + currentIndex; + } localSettersParameterDrivers.Add(new ParamDriversAndStates()); localSettersParameterDrivers.Last().states.Add(localSetStates[i]); @@ -371,7 +415,14 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, localSettersParameterDrivers.Last().states.Add(localResetStates[i]); foreach (AnimatorControllerParameter param in optimizerState.boolsNIntsWithCopies) - localSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() { name = prefix + param.name + "_Copy", source = param.name, type = VRC_AvatarParameterDriver.ChangeType.Copy }); + { + localSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + { + name = prefix + param.name + "_Copy", + source = param.name, + type = VRC_AvatarParameterDriver.ChangeType.Copy + }); + } } remoteSettersParameterDrivers.Add(new ParamDriversAndStates()); @@ -394,6 +445,7 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, source = param.name, type = VRC_AvatarParameterDriver.ChangeType.Copy }); + remoteSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() { name = param.name, @@ -413,6 +465,7 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, source = param.name, type = VRC_AvatarParameterDriver.ChangeType.Copy }); + remoteSettersParameterDrivers.Last().paramDriver.parameters.Add( new VRC_AvatarParameterDriver.Parameter() { @@ -434,6 +487,7 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, sourceMin = 0, sourceMax = 1 }); + remoteSettersParameterDrivers.Last().paramDriver.parameters.Add( new VRC_AvatarParameterDriver.Parameter() { @@ -448,7 +502,9 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, }); } else + { Debug.LogError("[MemoryOptimizer] " + param.name + " is not an int or a float!"); + } } } @@ -459,20 +515,24 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, private static void CreateStates(MemoryOptimizerState optimizerState, int syncSteps, float stepDelay, bool generateChangeDetection) { string syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); + AnimatorStateMachine localStateMachine = optimizerState.localStateMachine; AnimatorStateMachine remoteStateMachine = optimizerState.remoteStateMachine; List localSetStates = new List(); List localResetStates = new List(); List remoteSetStates = new List(); + for (int i = 0; i < syncSteps; i++) { - //convert i to binary so it can be used for the binary counter + // convert i to binary, so it can be used for the binary counter string currentIndex = i.DecimalToBinary().ToString(); while (currentIndex.Length < syncStepsBinary.Length) + { currentIndex = "0" + currentIndex; + } - //add the local set and reset states + // add the local set and reset states localSetStates.Add(localStateMachine.AddState("Set Value " + (i + 1), AngleRadiusToPos(((float)i / syncSteps + 0.5f) * (float)Math.PI * 2f, 400f, new Vector3(0, 600, 0)))); localSetStates.Last().hideFlags = HideFlags.HideInHierarchy; localSetStates.Last().motion = optimizerState.oneSecBuffer; @@ -494,7 +554,7 @@ private static void CreateStates(MemoryOptimizerState optimizerState, int syncSt }); } - //add the remote set states + // add the remote set states remoteSetStates.Add(remoteStateMachine.AddState("Set values for index " + (i + 1), AngleRadiusToPos(((float)i / syncSteps + 0.5f) * (float)Math.PI * 2f, 250f, new Vector3(0, 400, 0)))); remoteSetStates.Last().hideFlags = HideFlags.HideInHierarchy; remoteSetStates.Last().motion = optimizerState.oneFrameBuffer; @@ -507,23 +567,28 @@ private static void CreateStates(MemoryOptimizerState optimizerState, int syncSt private static (AnimationClip oneFrameBuffer, AnimationClip oneSecBuffer) BufferAnims(string generatedAssetsFilePath) { - //create and overwrite single frame buffer animation + // create and overwrite single frame buffer animation AnimationClip oneFrameBuffer = new AnimationClip() { name = oneFrameBufferAnimName, }; AnimationCurve oneFrameBufferCurve = new AnimationCurve(); + oneFrameBufferCurve.AddKey(0, 0); oneFrameBufferCurve.AddKey(1 / 60f, 1); oneFrameBuffer.SetCurve("", typeof(GameObject), "DO NOT CHANGE THIS ANIMATION", oneFrameBufferCurve); + AssetDatabase.DeleteAsset(generatedAssetsFilePath + oneFrameBuffer.name + ".anim"); AssetDatabase.CreateAsset(oneFrameBuffer, generatedAssetsFilePath + oneFrameBuffer.name + ".anim"); - //create and overwrite one second buffer animation + // create and overwrite one second buffer animation AnimationClip oneSecBuffer = new AnimationClip() { name = oneSecBufferAnimName, }; AnimationCurve oneSecBufferCurve = new AnimationCurve(); + oneSecBufferCurve.AddKey(0, 0); oneSecBufferCurve.AddKey(1, 1); oneSecBuffer.SetCurve("", typeof(GameObject), "DO NOT CHANGE THIS ANIMATION", oneSecBufferCurve); + AssetDatabase.DeleteAsset(generatedAssetsFilePath + oneSecBuffer.name + ".anim"); AssetDatabase.CreateAsset(oneSecBuffer, generatedAssetsFilePath + oneSecBuffer.name + ".anim"); + return (oneFrameBuffer, oneSecBuffer); } @@ -555,27 +620,36 @@ private static void SetupParameterDrivers(MemoryOptimizerState optimizerState) foreach (AnimatorState state in localSetStates) { VRCAvatarParameterDriver temp = (VRCAvatarParameterDriver)state.behaviours[0]; - temp.parameters.Add(new VRC_AvatarParameterDriver.Parameter() { name = smoothingAmountParamName, type = VRC_AvatarParameterDriver.ChangeType.Set, value = 0 }); + temp.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + { + name = smoothingAmountParamName, + type = VRC_AvatarParameterDriver.ChangeType.Set, + value = 0 + }); } foreach (AnimatorState state in localResetStates) { VRCAvatarParameterDriver temp = (VRCAvatarParameterDriver)state.behaviours[0]; - temp.parameters.Add(new VRC_AvatarParameterDriver.Parameter() { name = smoothingAmountParamName, type = VRC_AvatarParameterDriver.ChangeType.Set, value = 1 }); + temp.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + { + name = smoothingAmountParamName, + type = VRC_AvatarParameterDriver.ChangeType.Set, + value = 1 + }); } } private static void CreateLocalRemoteSplit(MemoryOptimizerState optimizerState) { AnimatorControllerLayer syncingLayer = optimizerState.syncingLayer; - AnimatorState localRemoteSplitState = - syncingLayer.stateMachine.AddState("Local/Remote split", position: new Vector3(0, 100, 0)); + AnimatorState localRemoteSplitState = syncingLayer.stateMachine.AddState("Local/Remote split", position: new Vector3(0, 100, 0)); + localRemoteSplitState.motion = optimizerState.oneFrameBuffer; localRemoteSplitState.hideFlags = HideFlags.HideInHierarchy; syncingLayer.stateMachine.defaultState = localRemoteSplitState; - AnimatorStateMachine localStateMachine = - syncingLayer.stateMachine.AddStateMachine("Local", position: new Vector3(100, 200, 0)); + AnimatorStateMachine localStateMachine = syncingLayer.stateMachine.AddStateMachine("Local", position: new Vector3(100, 200, 0)); localStateMachine.hideFlags = HideFlags.HideInHierarchy; AnimatorStateMachine remoteStateMachine = syncingLayer.stateMachine.AddStateMachine("Remote", position: new Vector3(-100, 200, 0)); @@ -612,30 +686,33 @@ public static void UninstallMemOpt(VRCAvatarDescriptor avatar, AnimatorControlle List generatedExpressionParams = new List(); List optimizedParams = new List(); List generatedAnimatorParams = new List(); + foreach (AnimatorControllerParameter controllerParam in fxLayer.parameters) + { if (controllerParam.name.Contains(prefix)) + { generatedAnimatorParams.Add(controllerParam); + } + } List mainBlendTreeLayers = fxLayer.FindHiddenIdentifier(mainBlendTreeIdentifier); List syncingLayers = fxLayer.FindHiddenIdentifier(syncingLayerIdentifier); if (mainBlendTreeLayers.Count > 1) - if (UninstallErrorDialogWithDiscordLink( - $"Too many MemOptBlendtrees found", - $"Too many MemOptBlendtrees found! {mainBlendTreeLayers.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", - discordLink) != 0 - ) + { + if (UninstallErrorDialogWithDiscordLink($"Too many MemOptBlendtrees found", $"Too many MemOptBlendtrees found! {mainBlendTreeLayers.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", discordLink) != 0) + { return; + } + } if (syncingLayers.Count != 1) { string s = (mainBlendTreeLayers.Count > 1) ? "many" : "few"; - if (UninstallErrorDialogWithDiscordLink( - $"Too {s} syncing layers found", - $"Too {s} syncing layers found! {syncingLayers.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", - discordLink) != 0 - ) + if (UninstallErrorDialogWithDiscordLink($"Too {s} syncing layers found", $"Too {s} syncing layers found! {syncingLayers.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", discordLink) != 0) + { return; + } } else { @@ -646,67 +723,75 @@ public static void UninstallMemOpt(VRCAvatarDescriptor avatar, AnimatorControlle VRCAvatarParameterDriver paramdriver = (VRCAvatarParameterDriver)state.state.behaviours[0]; List paramdriverParams = paramdriver.parameters; foreach (VRC_AvatarParameterDriver.Parameter param in paramdriverParams) + { if (!String.IsNullOrEmpty(param.source)) + { foreach (VRCExpressionParameters.Parameter item in expressionParameters.parameters.Where(x => x.name == param.source)) + { optimizedParams.Add(item); + } + } + } } } foreach (VRCExpressionParameters.Parameter item in expressionParameters.parameters.Where(x => x.name.Contains(prefix))) + { generatedExpressionParams.Add(item); - + } + if (generatedExpressionParams.Count <= 0) - if (UninstallErrorDialogWithDiscordLink( - "Too few generated expressions found", - $"Too few generated expressions found! {generatedExpressionParams.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", - discordLink) != 0 - ) + { + if (UninstallErrorDialogWithDiscordLink("Too few generated expressions found", $"Too few generated expressions found! {generatedExpressionParams.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", discordLink) != 0) + { return; + } + } if (generatedAnimatorParams.Count <= 0) - if (UninstallErrorDialogWithDiscordLink( - "Too few generated animator parameters found!", - $"Too few generated animator parameters found! {generatedAnimatorParams.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", - discordLink) != 0 - ) + { + if (UninstallErrorDialogWithDiscordLink("Too few generated animator parameters found!", $"Too few generated animator parameters found! {generatedAnimatorParams.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", discordLink) != 0) + { return; + } + } if (optimizedParams.Count < 2) - if (UninstallErrorDialogWithDiscordLink( - "Too few optimized parameters found!", - $"Too few generated animator parameters found! {optimizedParams.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", - discordLink) != 0 - ) + { + if (UninstallErrorDialogWithDiscordLink("Too few optimized parameters found!", $"Too few generated animator parameters found! {optimizedParams.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", discordLink) != 0) + { return; + } + } foreach (AnimatorControllerLayer mainBlendTreeLayer in mainBlendTreeLayers) { - //Debug.Log("[MemoryOptimizer] Animator layer " + mainBlendTreeLayer.name + " of index " + fxLayer.FindLayerIndex(mainBlendTreeLayer) + " is being deleted"); + // Debug.Log("[MemoryOptimizer] Animator layer " + mainBlendTreeLayer.name + " of index " + fxLayer.FindLayerIndex(mainBlendTreeLayer) + " is being deleted"); DeleteBlendTreeFromAsset((BlendTree)mainBlendTreeLayer.stateMachine.states[0].state.motion); fxLayer.RemoveLayer(mainBlendTreeLayer); } foreach (AnimatorControllerLayer syncingLayer in syncingLayers) { - //Debug.Log("[MemoryOptimizer] Animator layer " + syncingLayer.name + " of index " + fxLayer.FindLayerIndex(syncingLayer) + " is being deleted"); + // Debug.Log("[MemoryOptimizer] Animator layer " + syncingLayer.name + " of index " + fxLayer.FindLayerIndex(syncingLayer) + " is being deleted"); fxLayer.RemoveLayer(syncingLayer); } foreach (VRCExpressionParameters.Parameter param in generatedExpressionParams) { - //Debug.Log("[MemoryOptimizer] Expression param " + param.name + " of type: " + param.valueType + " is being deleted"); + // Debug.Log("[MemoryOptimizer] Expression param " + param.name + " of type: " + param.valueType + " is being deleted"); expressionParameters.parameters = expressionParameters.parameters.Where(x => x != param).ToArray(); } foreach (AnimatorControllerParameter param in generatedAnimatorParams) { - //Debug.Log("[MemoryOptimizer] Controller param " + param.name + " of type: " + param.type + " is being deleted"); + // Debug.Log("[MemoryOptimizer] Controller param " + param.name + " of type: " + param.type + " is being deleted"); fxLayer.RemoveParameter(param); } foreach (VRCExpressionParameters.Parameter param in optimizedParams) { - //Debug.Log("[MemoryOptimizer] Optimized param " + param.name + " of type: " + param.valueType + " setting to sync"); + // Debug.Log("[MemoryOptimizer] Optimized param " + param.name + " of type: " + param.valueType + " setting to sync"); param.networkSynced = true; } diff --git a/Editor/MemoryOptimizerWindow.cs b/Editor/MemoryOptimizerWindow.cs index aabc485..ad776c3 100644 --- a/Editor/MemoryOptimizerWindow.cs +++ b/Editor/MemoryOptimizerWindow.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; +using JeTeeS.MemoryOptimizer.Shared; +using JeTeeS.TES.HelperFunctions; using UnityEditor; using UnityEditor.Animations; using UnityEngine; @@ -12,26 +14,27 @@ namespace JeTeeS.MemoryOptimizer { - public class MemoryOptimizerWindow : EditorWindow + internal class MemoryOptimizerWindow : EditorWindow { private const string menuPath = "Tools/TES/MemoryOptimizer"; private const string defaultSavePath = "Assets/TES/MemOpt"; - private string currentSavePath; - DefaultAsset savePathOverride = null; - private const string prefKey = "Mem_Opt_Pref_"; private const string unlockSyncStepsEPKey = prefKey + "UnlockSyncSteps"; private const string backUpModeEPKey = prefKey + "BackUpMode"; private const string savePathPPKey = prefKey + "SavePath"; private const int maxUnsyncedParams = 8192; + internal static MemoryOptimizerComponent _component; + + private string currentSavePath; + private DefaultAsset savePathOverride = null; + private bool unlockSyncSteps = false; private int backupMode = 0; - - private readonly string[] paramTypes = { "Int", "Float", "Bool" }; - public readonly string[] wdOptions = { "Auto-Detect", "Off", "On" }; - public readonly string[] backupModes = { "On", "Off", "Ask" }; + internal static readonly string[] wdOptions = { "Auto-Detect", "Off", "On" }; + internal static readonly string[] backupModes = { "On", "Off", "Ask" }; + private int tab = 0; private Vector2 scrollPosition; private bool runOnce; @@ -40,11 +43,12 @@ public class MemoryOptimizerWindow : EditorWindow private AnimatorController avatarFXLayer; private VRCExpressionParameters expressionParameters; - private List selectedBools = new List(); - private List boolsToOptimize = new List(); - private List selectedIntsNFloats = new List(); - private List intsNFloatsToOptimize = new List(); - private List paramList; + private List selectedBools = new(); + private List boolsToOptimize = new(); + private List selectedIntsNFloats = new(); + private List intsNFloatsToOptimize = new(); + private List paramList = new(); + private int installationIndexers; private int installationBoolSyncers; private int installationIntSyncers; @@ -59,33 +63,76 @@ public class MemoryOptimizerWindow : EditorWindow [MenuItem(menuPath)] public static void ShowWindow() { - //Show existing window instance. If one doesn't exist, make one. + // if you open by menu path, open the normal editor + MemoryOptimizerWindow._component = null; + + // Show existing window instance. If one doesn't exist, make one. EditorWindow window = GetWindow(typeof(MemoryOptimizerWindow), false, "Memory Optimizer", true); window.minSize = new Vector2(600, 900); } + private void Awake() + { + if (_component is not null) + { + avatarDescriptor = _component.gameObject.GetComponent(); + avatarFXLayer = new AnimatorController(); + expressionParameters = ScriptableObject.CreateInstance(); + + avatarFXLayer.name = "Temporary Generated FX Layer"; + expressionParameters.name = "Temporary Generated Parameters"; + + expressionParameters.parameters = _component.savedParameterConfigurations.Select(s => + { + avatarFXLayer.AddUniqueParam(s.param.name, s.param.valueType.ValueTypeToParamType()); + return s.param; + }).ToArray(); + + if (_component.syncSteps > 4) + { + unlockSyncSteps = true; + EditorPrefs.SetBool(unlockSyncStepsEPKey, true); + } + + wdOptionSelected = _component.wdOption; + maxSyncSteps = _component.syncSteps; + syncSteps = _component.syncSteps; + stepDelay = _component.stepDelay; + changeDetectionEnabled = _component.changeDetection; + savePathOverride = _component.savePathOverride; + } + } + private void OnGUI() { unlockSyncSteps = EditorPrefs.GetBool(unlockSyncStepsEPKey); backupMode = EditorPrefs.GetInt(backUpModeEPKey); + string savePathEP = PlayerPrefs.GetString(savePathPPKey); - if (!String.IsNullOrEmpty(savePathEP) && AssetDatabase.IsValidFolder(savePathEP)) + if (!string.IsNullOrEmpty(savePathEP) && AssetDatabase.IsValidFolder(savePathEP)) + { savePathOverride = (DefaultAsset)AssetDatabase.LoadAssetAtPath(savePathEP, typeof(DefaultAsset)); + } - if (savePathOverride && AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(savePathOverride))) + if (savePathOverride && AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(savePathOverride))) + { currentSavePath = AssetDatabase.GetAssetPath(savePathOverride); - else + } + else + { currentSavePath = defaultSavePath; + } - tab = GUILayout.Toolbar (tab, new string[] {"Install menu", "Settings menu"}); - switch (tab) + tab = GUILayout.Toolbar(tab, new[] { _component is null ? "Install menu" : "Configure", "Settings menu" }); + switch (tab) { case 0: - using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { + EditorGUI.BeginDisabledGroup(_component is not null); + using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) { void OnAvatarChange() @@ -100,32 +147,50 @@ void OnAvatarChange() avatarFXLayer = null; expressionParameters = null; } + ResetParamSelection(); } - + using (new ChangeCheckScope(OnAvatarChange)) { avatarDescriptor = (VRCAvatarDescriptor)EditorGUILayout.ObjectField("Avatar", avatarDescriptor, typeof(VRCAvatarDescriptor), true); - if (avatarDescriptor == null) + if (_component is null && avatarDescriptor is null) + { if (GUILayout.Button("Auto-detect")) + { FillAvatarFields(null, avatarFXLayer, expressionParameters); + } + } } } + + EditorGUI.EndDisabledGroup(); - using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) + if (_component is null) { - avatarFXLayer = (AnimatorController)EditorGUILayout.ObjectField("FX Layer", avatarFXLayer, typeof(AnimatorController), true); - if (avatarFXLayer == null) - if (GUILayout.Button("Auto-Detect")) - FillAvatarFields(avatarDescriptor, null, expressionParameters); - } + using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) + { + avatarFXLayer = (AnimatorController)EditorGUILayout.ObjectField("FX Layer", avatarFXLayer, typeof(AnimatorController), true); + if (_component is null && avatarFXLayer is null) + { + if (GUILayout.Button("Auto-Detect")) + { + FillAvatarFields(avatarDescriptor, null, expressionParameters); + } + } + } - using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) - { - expressionParameters = (VRCExpressionParameters)EditorGUILayout.ObjectField("Parameters", expressionParameters, typeof(VRCExpressionParameters), true); - if (expressionParameters == null) - if (GUILayout.Button("Auto-Detect")) - FillAvatarFields(avatarDescriptor, avatarFXLayer, null); + using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) + { + expressionParameters = (VRCExpressionParameters)EditorGUILayout.ObjectField("Parameters", expressionParameters, typeof(VRCExpressionParameters), true); + if (_component is null && expressionParameters is null) + { + if (GUILayout.Button("Auto-Detect")) + { + FillAvatarFields(avatarDescriptor, avatarFXLayer, null); + } + } + } } if (!runOnce) @@ -159,7 +224,9 @@ void OnAvatarChange() { GUI.backgroundColor = Color.green; if (GUILayout.Button("On", GUILayout.Width(203))) + { changeDetectionEnabled = !changeDetectionEnabled; + } GUI.backgroundColor = Color.white; } @@ -167,19 +234,26 @@ void OnAvatarChange() { GUI.backgroundColor = Color.red; if (GUILayout.Button("Off", GUILayout.Width(203))) + { changeDetectionEnabled = !changeDetectionEnabled; + } GUI.backgroundColor = Color.white; } } + GUILayout.Space(5); } + GUILayout.Space(5); - if (avatarDescriptor != null && avatarFXLayer != null && expressionParameters != null) + + if (avatarDescriptor is not null && avatarFXLayer is not null && expressionParameters is not null) { longestParamName = 0; foreach (var x in expressionParameters.parameters) + { longestParamName = Math.Max(longestParamName, x.name.Count()); + } using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) { @@ -187,22 +261,34 @@ void OnAvatarChange() if (GUILayout.Button("Deselect Prefix")) { - EditorInputDialog.Show("", "Please enter your prefix to deselect", "", name => + EditorInputDialog.Show("", "Please enter your prefix to deselect", "", prefix => { - if (!string.IsNullOrEmpty(name)) - foreach (MemoryOptimizerMain.MemoryOptimizerListData param in paramList.FindAll(x => x.param.name.StartsWith(name, true, null))) param.selected = false; + if (!string.IsNullOrEmpty(prefix)) + { + foreach (MemoryOptimizerListData param in paramList.FindAll(x => x.param.name.StartsWith(prefix, true, null))) + { + param.selected = false; + } + } + OnChangeUpdate(); }); } if (GUILayout.Button("Select All")) { - foreach (MemoryOptimizerMain.MemoryOptimizerListData param in paramList) param.selected = true; + foreach (MemoryOptimizerListData param in paramList) + { + param.selected = true; + } + OnChangeUpdate(); } if (GUILayout.Button("Clear Selected Parameters")) + { ResetParamSelection(); + } } scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, true); @@ -211,74 +297,93 @@ void OnAvatarChange() { using (new SqueezeScope((0, 0, Horizontal))) { - //make sure the param list is always the same size as avatar's expression parameters - if (paramList == null || paramList.Count != expressionParameters.parameters.Length) + // make sure the param list is always the same size as avatar's expression parameters + if (paramList.Count != expressionParameters.parameters.Length) + { ResetParamSelection(); + } using (new SqueezeScope((0, 0, Horizontal))) { GUI.enabled = false; EditorGUILayout.TextArea(expressionParameters.parameters[i].name, GUILayout.MinWidth(longestParamName * 8)); - EditorGUILayout.Popup((int)expressionParameters.parameters[i].valueType, paramTypes, GUILayout.Width(50)); - //EditorGUILayout.Toggle(avatarDescriptor.expressionParameters.parameters[i].networkSynced, GUILayout.MaxWidth(15)); + EditorGUILayout.Popup((int)expressionParameters.parameters[i].valueType, _paramTypes, GUILayout.Width(50)); + GUI.enabled = true; - //System already installed + // System already installed if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) { GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 1); GUI.enabled = false; GUILayout.Button("System Already Installed!", GUILayout.Width(203)); } - //Param isn't network synced + // Param isn't network synced else if (!expressionParameters.parameters[i].networkSynced) { GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 1); GUI.enabled = false; GUILayout.Button("Param Not Synced", GUILayout.Width(203)); } - //Param isn't in FX layer + // Param isn't in FX layer else if (!(avatarFXLayer.parameters.Count(x => x.name == expressionParameters.parameters[i].name) > 0)) { paramList[i].selected = false; GUI.backgroundColor = Color.yellow; if (GUILayout.Button("Add To FX", GUILayout.Width(100))) + { avatarFXLayer.AddUniqueParam(paramList[i].param.name); + } GUI.enabled = false; GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 1); GUILayout.Button("Param Not In FX", GUILayout.Width(100)); } - //Param isn't selected + // Param isn't selected else if (!paramList[i].selected) { GUI.backgroundColor = Color.red; using (new ChangeCheckScope(OnChangeUpdate)) + { if (GUILayout.Button("Optimize", GUILayout.Width(203))) + { paramList[i].selected = !paramList[i].selected; + } + } } - //Param won't be optimized + // Param won't be optimized else if (!paramList[i].willBeOptimized) { GUI.backgroundColor = Color.yellow; using (new ChangeCheckScope(OnChangeUpdate)) + { if (GUILayout.Button("Optimize", GUILayout.Width(203))) + { paramList[i].selected = !paramList[i].selected; + } + } } - //Param will be optimized + // Param will be optimized else { GUI.backgroundColor = Color.green; using (new ChangeCheckScope(OnChangeUpdate)) + { if (GUILayout.Button("Optimize", GUILayout.Width(203))) + { paramList[i].selected = !paramList[i].selected; + } + } } + GUI.enabled = true; } } + GUI.backgroundColor = Color.white; } + GUILayout.EndScrollView(); using (new SqueezeScope((0, 0, EditorH))) @@ -294,16 +399,7 @@ void OnAvatarChange() LabelWithHelpBox($"Amount You Will Save: {expressionParameters.CalcTotalCost() - newParamCost}"); LabelWithHelpBox($"Total Sync Time: {syncSteps * stepDelay}s"); } - /* - using (new SqueezeScope((0, 0, EditorH))) - { - LabelWithHelpBox($"Bools to be optimized: {boolsToOptimize.Count}"); - LabelWithHelpBox($"Ints and Floats to be optimized: {intsNFloatsToOptimize.Count}"); - LabelWithHelpBox($"Indexers: {installationIndexers}"); - LabelWithHelpBox($"Bool Syncers: {installationBoolSyncers}"); - LabelWithHelpBox($"Int Syncers: {installationIntSyncers}"); - } - */ + using (new SqueezeScope((0, 0, EditorH, EditorStyles.helpBox))) { if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) @@ -324,28 +420,75 @@ void OnAvatarChange() { GUILayout.Label("Syncing Steps", GUILayout.MaxWidth(100)); using (new ChangeCheckScope(OnChangeUpdate)) + { syncSteps = EditorGUILayout.IntSlider(syncSteps, 2, unlockSyncSteps ? maxSyncSteps : Math.Min(maxSyncSteps, 4)); + } } + GUI.backgroundColor = Color.white; } + GUI.enabled = true; } + if (syncSteps > maxSyncSteps) + { syncSteps = maxSyncSteps; + } - if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) + if (_component is null) { - if (GUILayout.Button("Uninstall")) - MemoryOptimizerMain.UninstallMemOpt(avatarDescriptor, avatarFXLayer, expressionParameters); + if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) + { + if (GUILayout.Button("Uninstall")) + { + MemoryOptimizerMain.UninstallMemOpt(avatarDescriptor, avatarFXLayer, expressionParameters); + } + } + else + { + GUI.enabled = false; + GUILayout.Button("Uninstall"); + GUI.enabled = true; + } } - else + + if (_component is not null) { - GUI.enabled = false; - GUILayout.Button("Uninstall"); - GUI.enabled = true; - } + if (expressionParameters.parameters.Length + (installationBoolSyncers + installationIntSyncers + installationIndexers) >= maxUnsyncedParams) + { + GUI.enabled = false; + GUI.backgroundColor = Color.red; + GUILayout.Button($"Generated params will exceed {maxUnsyncedParams}!"); + } + else if (GUILayout.Button("Save")) + { + // write our configuration back + _component.wdOption = wdOptionSelected; + _component.syncSteps = syncSteps; + _component.stepDelay = stepDelay; + _component.changeDetection = changeDetectionEnabled; + _component.savePathOverride = savePathOverride; + + foreach (var data in paramList) + { + var match = _component.savedParameterConfigurations.FirstOrDefault(p => p.param.name.Equals(data.param.name) && p.param.valueType == data.param.valueType); + + if (match is not null) + { + match.selected = data.selected; + match.willBeOptimized = data.willBeOptimized; + } + } - if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) + // clear reference + _component = null; + + // close the window + Close(); + } + } + else if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) { GUI.enabled = false; GUI.backgroundColor = Color.black; @@ -381,20 +524,27 @@ void OnAvatarChange() { backupMode = EditorPrefs.GetInt(backUpModeEPKey); if (backupMode == 0) + { MakeBackupOf(new List { avatarFXLayer, expressionParameters }, currentSavePath + "/Backup/"); + } else if (backupMode == 2) + { if (EditorUtility.DisplayDialog("", "Do you want to make a backup of your controller and parameters?", "Yes", "No")) + { MakeBackupOf(new List { avatarFXLayer, expressionParameters }, currentSavePath + "/Backup/"); + } + } MemoryOptimizerMain.InstallMemOpt(avatarDescriptor, avatarFXLayer, expressionParameters, boolsToOptimize, intsNFloatsToOptimize, syncSteps, stepDelay, changeDetectionEnabled, wdOptionSelected, currentSavePath); } } } + break; case 1: - using (new SqueezeScope((0,0, Vertical, EditorStyles.helpBox))) + using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { - //Backup Mode + // Backup Mode using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) { EditorGUILayout.LabelField("Backup Mode: ", EditorStyles.boldLabel); @@ -403,18 +553,19 @@ void OnAvatarChange() GUILayout.Space(5); - //Unlock sync steps button - if (unlockSyncSteps) - GUI.backgroundColor = Color.green; - else - GUI.backgroundColor = Color.red; + // Unlock sync steps button + GUI.backgroundColor = unlockSyncSteps ? Color.green : Color.red; + if (GUILayout.Button("Unlock sync steps")) + { EditorPrefs.SetBool(unlockSyncStepsEPKey, !unlockSyncSteps); + } + GUI.backgroundColor = Color.white; GUILayout.Space(5); - //save path + // save path using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { using (new SqueezeScope((0, 0, Horizontal))) @@ -424,6 +575,7 @@ void OnAvatarChange() EditorGUILayout.LabelField("Select folder to save generated assets to: "); savePathOverride = (DefaultAsset)EditorGUILayout.ObjectField("", savePathOverride, typeof(DefaultAsset), false); } + void SavePathChange() { PlayerPrefs.SetString(savePathPPKey, AssetDatabase.GetAssetPath(savePathOverride)); @@ -431,27 +583,37 @@ void SavePathChange() } if (savePathOverride && AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(savePathOverride))) + { EditorGUILayout.HelpBox($"Valid folder! Now saving to: {currentSavePath}", MessageType.Info, true); + } else + { EditorGUILayout.HelpBox($"Not valid! Now saving to: {currentSavePath}", MessageType.Info, true); + } } GUILayout.Space(5); - //Step delay + // Step delay using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { - EditorGUILayout.HelpBox($"Not recommended editing!", MessageType.Error, true); + EditorGUILayout.HelpBox("It is recommended not editing this value!", MessageType.Error, true); using (new SqueezeScope((0, 0, Horizontal))) { GUILayout.Label("Step delay", GUILayout.MaxWidth(100)); using (new ChangeCheckScope(OnChangeUpdate)) + { stepDelay = EditorGUILayout.FloatField(stepDelay); + } } + if (GUILayout.Button("Reset value")) + { stepDelay = 0.2f; + } } } + break; } @@ -459,28 +621,33 @@ void SavePathChange() GUI.enabled = true; } - public void OnChangeUpdate() + internal void OnChangeUpdate() { - if (paramList == null) ResetParamSelection(); - - foreach (MemoryOptimizerMain.MemoryOptimizerListData param in paramList) + foreach (MemoryOptimizerListData param in paramList) { param.willBeOptimized = false; if (avatarFXLayer && (!param.param.networkSynced || !(avatarFXLayer.parameters.Count(x => x.name == param.param.name) > 0))) + { param.selected = false; + } } - selectedBools = new List(); - selectedIntsNFloats = new List(); - foreach(var param in paramList) + selectedBools = new List(); + selectedIntsNFloats = new List(); + + foreach (var param in paramList) { - if(param.selected) + if (param.selected) + { + if (param.param.valueType == VRCExpressionParameters.ValueType.Bool) { - if(param.param.valueType == VRCExpressionParameters.ValueType.Bool) - selectedBools.Add(param); - else - selectedIntsNFloats.Add(param); + selectedBools.Add(param); } + else + { + selectedIntsNFloats.Add(param); + } + } } maxSyncSteps = Math.Max(Math.Max(selectedBools.Count(), selectedIntsNFloats.Count()), 1); @@ -489,80 +656,111 @@ public void OnChangeUpdate() installationIndexers = 0; installationBoolSyncers = 0; installationIntSyncers = 0; - newParamCost = expressionParameters == null ? 0 : expressionParameters.CalcTotalCost(); + newParamCost = expressionParameters?.CalcTotalCost() ?? 0; + return; } - + if (syncSteps < 2) + { syncSteps = 2; + } boolsToOptimize = selectedBools.Take(selectedBools.Count - (selectedBools.Count % syncSteps)).ToList(); intsNFloatsToOptimize = selectedIntsNFloats.Take(selectedIntsNFloats.Count - (selectedIntsNFloats.Count % syncSteps)).ToList(); - - foreach (MemoryOptimizerMain.MemoryOptimizerListData param in boolsToOptimize) + + foreach (MemoryOptimizerListData param in boolsToOptimize) + { param.willBeOptimized = true; - foreach (MemoryOptimizerMain.MemoryOptimizerListData param in intsNFloatsToOptimize) + } + + foreach (MemoryOptimizerListData param in intsNFloatsToOptimize) + { param.willBeOptimized = true; - + } + installationIndexers = (syncSteps - 1).DecimalToBinary().ToString().Count(); installationBoolSyncers = boolsToOptimize.Count / syncSteps; - installationIntSyncers = intsNFloatsToOptimize.Count / syncSteps; + installationIntSyncers = intsNFloatsToOptimize.Count / syncSteps; newParamCost = expressionParameters.CalcTotalCost() + installationIndexers + installationBoolSyncers + (installationIntSyncers * 8) - (boolsToOptimize.Count + (intsNFloatsToOptimize.Count * 8)); } - public void ResetParamSelection() + internal void ResetParamSelection() { - paramList = new List(); + paramList = new List(); - if (expressionParameters != null && expressionParameters.parameters.Length > 0) + if (_component is not null) { - foreach (VRCExpressionParameters.Parameter param in expressionParameters.parameters) - paramList.Add(new MemoryOptimizerMain.MemoryOptimizerListData(param, false, false)); + foreach (var value in _component.savedParameterConfigurations) + { + paramList.Add(value.Pure()); + } } - - maxSyncSteps = 1; - syncSteps = 1; + else + { + if (expressionParameters is not null && expressionParameters.parameters.Length > 0) + { + foreach (VRCExpressionParameters.Parameter param in expressionParameters.parameters) + { + paramList.Add(new MemoryOptimizerListData(param, false, false)); + } + } + + maxSyncSteps = 1; + syncSteps = 1; + } + OnChangeUpdate(); } - public void FillAvatarFields(VRCAvatarDescriptor descriptor, AnimatorController controller, VRCExpressionParameters parameters) + internal void FillAvatarFields(VRCAvatarDescriptor descriptor, AnimatorController controller, VRCExpressionParameters parameters) { - if (descriptor == null) + if (descriptor is null) + { avatarDescriptor = FindObjectOfType(); + } else { - if (controller == null) + if (controller is null) + { avatarFXLayer = FindFXLayer(avatarDescriptor); - if (parameters == null) + } + + if (parameters is null) + { expressionParameters = FindExpressionParams(avatarDescriptor); + } } OnChangeUpdate(); } - public class ChangeCheckScope : IDisposable + internal class ChangeCheckScope : IDisposable { public Action callBack; public ChangeCheckScope(Action callBack) { this.callBack = callBack; + EditorGUI.BeginChangeCheck(); } public void Dispose() { if (EditorGUI.EndChangeCheck()) + { callBack(); + } } } - public class SqueezeScope : IDisposable + internal class SqueezeScope : IDisposable { private readonly SqueezeSettings[] settings; - public enum SqueezeScopeType + internal enum SqueezeScopeType { Horizontal, Vertical, @@ -570,38 +768,33 @@ public enum SqueezeScopeType EditorV } - public SqueezeScope(SqueezeSettings input) : this(new[] { input }) + internal SqueezeScope(SqueezeSettings input) : this(new[] { input }) { } - public SqueezeScope(params SqueezeSettings[] input) + internal SqueezeScope(params SqueezeSettings[] input) { settings = input; foreach (var squeezeSettings in input) { - BeginSqueeze(squeezeSettings); - } - } + switch (squeezeSettings.type) + { + case Horizontal: + GUILayout.BeginHorizontal(squeezeSettings.style); + break; + case Vertical: + GUILayout.BeginVertical(squeezeSettings.style); + break; + case EditorH: + EditorGUILayout.BeginHorizontal(squeezeSettings.style); + break; + case EditorV: + EditorGUILayout.BeginVertical(squeezeSettings.style); + break; + } - private void BeginSqueeze(SqueezeSettings squeezeSettings) - { - switch (squeezeSettings.type) - { - case Horizontal: - GUILayout.BeginHorizontal(squeezeSettings.style); - break; - case Vertical: - GUILayout.BeginVertical(squeezeSettings.style); - break; - case EditorH: - EditorGUILayout.BeginHorizontal(squeezeSettings.style); - break; - case EditorV: - EditorGUILayout.BeginVertical(squeezeSettings.style); - break; + GUILayout.Space(squeezeSettings.width1); } - - GUILayout.Space(squeezeSettings.width1); } public void Dispose() @@ -628,7 +821,7 @@ public void Dispose() } } - public struct SqueezeSettings + internal struct SqueezeSettings { public int width1; public int width2; @@ -640,21 +833,21 @@ public static implicit operator SqueezeSettings((int, int) val) return new SqueezeSettings { width1 = val.Item1, width2 = val.Item2, type = Horizontal, style = GUIStyle.none }; } - public static implicit operator SqueezeSettings((int, int, SqueezeScopeType) val) + public static implicit operator SqueezeSettings((int, int, /* For some reason Unity can't resolve SqueezeScopeType unless SqueezeScope is specified */ SqueezeScope.SqueezeScopeType) val) { return new SqueezeSettings { width1 = val.Item1, width2 = val.Item2, type = val.Item3, style = GUIStyle.none }; } - public static implicit operator SqueezeSettings((int, int, SqueezeScopeType, GUIStyle) val) + public static implicit operator SqueezeSettings((int, int, /* For some reason Unity can't resolve SqueezeScopeType unless SqueezeScope is specified */ SqueezeScope.SqueezeScopeType, GUIStyle) val) { return new SqueezeSettings { width1 = val.Item1, width2 = val.Item2, type = val.Item3, style = val.Item4 }; } } - //https://forum.unity.com/threads/is-there-a-way-to-input-text-using-a-unity-editor-utility.473743/#post-7191802 - //https://forum.unity.com/threads/is-there-a-way-to-input-text-using-a-unity-editor-utility.473743/#post-7229248 - //Thanks to JelleJurre for help - public class EditorInputDialog : EditorWindow + // https://forum.unity.com/threads/is-there-a-way-to-input-text-using-a-unity-editor-utility.473743/#post-7191802 + // https://forum.unity.com/threads/is-there-a-way-to-input-text-using-a-unity-editor-utility.473743/#post-7229248 + // Thanks to JelleJurre for help + internal class EditorInputDialog : EditorWindow { string description, inputText; string okButton, cancelButton; @@ -664,7 +857,6 @@ public class EditorInputDialog : EditorWindow bool shouldClose = false; Vector2 maxScreenPos; - #region OnGUI() void OnGUI() { // Check if Esc/Return have been pressed @@ -678,7 +870,6 @@ void OnGUI() shouldClose = true; e.Use(); break; - // Enter pressed case KeyCode.Return: case KeyCode.KeypadEnter: @@ -690,9 +881,9 @@ void OnGUI() } if (shouldClose) - { // Close this dialog + { + // Close this dialog Close(); - //return; } // Draw our control @@ -704,7 +895,8 @@ void OnGUI() EditorGUILayout.Space(8); GUI.SetNextControlName("inText"); inputText = EditorGUILayout.TextField("", inputText); - GUI.FocusControl("inText"); // Focus text field + // Focus text field + GUI.FocusControl("inText"); EditorGUILayout.Space(12); // Draw OK / Cancel buttons @@ -719,7 +911,8 @@ void OnGUI() r.x += r.width; if (GUI.Button(r, cancelButton)) { - inputText = null; // Cancel - delete inputText + // Cancel - delete inputText + inputText = null; shouldClose = true; } @@ -749,9 +942,7 @@ void OnGUI() Focus(); } } - #endregion OnGUI() - #region Show() /// /// Returns text player entered, or null if player cancelled the dialog. /// @@ -769,7 +960,9 @@ public static void Show(string title, string description, string inputText, Acti var maxPos = GUIUtility.GUIToScreenPoint(new Vector2(Screen.width, Screen.height)); if (EditorWindow.HasOpenInstances()) + { return; + } var window = CreateInstance(); window.maxScreenPos = maxPos; @@ -781,7 +974,6 @@ public static void Show(string title, string description, string inputText, Acti window.onOKButton += () => callBack(window.inputText); window.ShowPopup(); } - #endregion Show() } } -} +} \ No newline at end of file diff --git a/Editor/Patcher.meta b/Editor/Patcher.meta new file mode 100644 index 0000000..c00cfe2 --- /dev/null +++ b/Editor/Patcher.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e91901a6e191b2489709026072734c0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Patcher/MemoryOptimizerVRCFuryPatcher.cs b/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs similarity index 86% rename from Patcher/MemoryOptimizerVRCFuryPatcher.cs rename to Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs index 64823e0..0be0aa8 100644 --- a/Patcher/MemoryOptimizerVRCFuryPatcher.cs +++ b/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs @@ -1,10 +1,8 @@ -#if UNITY_EDITOR - -using System.IO; +using System.IO; using UnityEditor; using UnityEngine; -namespace JeTeeS.MemoryOptimizer +namespace JeTeeS.MemoryOptimizer.Patcher { internal static class MemoryOptimizerVRCFuryPatcher { @@ -13,7 +11,7 @@ internal static class MemoryOptimizerVRCFuryPatcher private static void Load() { - if (_refFinalValidationService is null) + if (_refFinalValidationService is null || !_refIsPatched) { if (AssetDatabase.LoadAssetAtPath("Packages/com.vrcfury.vrcfury/Editor/VF/Service/FinalValidationService.cs") is MonoScript scriptToPatch) { @@ -25,8 +23,8 @@ private static void Load() public static bool AreVRCFuryScriptsPatched() { -#if VRCFury_Installed -#if !VRCFury_Tested +#if MemoryOptimizer_VRCFury_IsInstalled +#if !MemoryOptimizer_VRCFury_IsTested Debug.LogWarning($"The pipeline is running on an untested version of VRCFury, probably fine though."); #endif Load(); @@ -39,8 +37,8 @@ public static bool AreVRCFuryScriptsPatched() public static bool PatchVRCFuryScripts() { -#if VRCFury_Installed -#if !VRCFury_Tested +#if MemoryOptimizer_VRCFury_IsInstalled +#if !MemoryOptimizer_VRCFury_IsTested Debug.LogWarning($"The pipeline is running on an untested version of VRCFury, probably fine though."); #endif Load(); @@ -62,9 +60,9 @@ public static bool PatchVRCFuryScripts() } return AreVRCFuryScriptsPatched(); +#else + return true; #endif } } } - -#endif diff --git a/Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta b/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta similarity index 100% rename from Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta rename to Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs.meta diff --git a/Patcher/VRCFury-FinalValidationService.txt b/Editor/Patcher/VRCFury-FinalValidationService.txt similarity index 97% rename from Patcher/VRCFury-FinalValidationService.txt rename to Editor/Patcher/VRCFury-FinalValidationService.txt index 43304a8..9648eec 100644 --- a/Patcher/VRCFury-FinalValidationService.txt +++ b/Editor/Patcher/VRCFury-FinalValidationService.txt @@ -12,7 +12,7 @@ using VRC.SDK3.Avatars.ScriptableObjects; namespace VF.Service { /** * Many of these checks are copied from or modified from the validation checks in the VRCSDK - * patched by >>> dev.jetees.memoryoptimier.MemoryOptimizerVRCFuryPatcher + * patched by >>> dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher */ [VFService] internal class FinalValidationService { diff --git a/Patcher/VRCFury-FinalValidationService.txt.meta b/Editor/Patcher/VRCFury-FinalValidationService.txt.meta similarity index 100% rename from Patcher/VRCFury-FinalValidationService.txt.meta rename to Editor/Patcher/VRCFury-FinalValidationService.txt.meta diff --git a/Editor/Pipeline.meta b/Editor/Pipeline.meta new file mode 100644 index 0000000..c8b611a --- /dev/null +++ b/Editor/Pipeline.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 17e44102ea5cc1a4097b348580379389 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs b/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs similarity index 64% rename from Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs rename to Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs index 83ef887..de4415c 100644 --- a/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs +++ b/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs @@ -1,14 +1,13 @@ -#if UNITY_EDITOR - -using System; +using System; using System.IO; +using JeTeeS.MemoryOptimizer.Patcher; using UnityEditor; using UnityEngine; using VRC.SDKBase.Editor.BuildPipeline; -namespace JeTeeS.MemoryOptimizer +namespace JeTeeS.MemoryOptimizer.Pipeline { - public class MemoryOptimizerDisableVRCFuryParameterCheck : IVRCSDKPreprocessAvatarCallback + internal class MemoryOptimizerDisableVRCFuryParameterCheck : IVRCSDKPreprocessAvatarCallback { // run before VRCFury does public int callbackOrder => -20000; @@ -19,5 +18,3 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) } } } - -#endif diff --git a/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta b/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta similarity index 100% rename from Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta rename to Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta diff --git a/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs similarity index 60% rename from Pipeline/MemoryOptimizerUploadPipeline.cs rename to Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index 1baf266..8b99a77 100644 --- a/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -1,20 +1,18 @@ -#if UNITY_EDITOR - -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using JeTeeS.MemoryOptimizer.Shared; using UnityEngine; using VRC.SDK3.Avatars.Components; using VRC.SDK3.Avatars.ScriptableObjects; using VRC.SDKBase.Editor.BuildPipeline; using static JeTeeS.TES.HelperFunctions.TESHelperFunctions; -namespace JeTeeS.MemoryOptimizer +namespace JeTeeS.MemoryOptimizer.Pipeline { - public class MemoryOptimizerUploadPipeline : IVRCSDKPreprocessAvatarCallback + internal class MemoryOptimizerUploadPipeline : IVRCSDKPreprocessAvatarCallback { - private readonly string[] _paramTypes = { "Int", "Float", "Bool" }; private readonly string[] _animatorParamTypes = { "", @@ -40,30 +38,30 @@ public class MemoryOptimizerUploadPipeline : IVRCSDKPreprocessAvatarCallback public bool OnPreprocessAvatar(GameObject avatarGameObject) { - var _vrcAvatarDescriptor = avatarGameObject.GetComponent(); + var vrcAvatarDescriptor = avatarGameObject.GetComponent(); var memoryOptimizer = avatarGameObject.GetComponent(); - var parameters = _vrcAvatarDescriptor.expressionParameters?.parameters ?? Array.Empty(); - - Debug.Log($"MemoryOptimizerUploadPipeline.OnPreprocessAvatar running on {avatarGameObject.name} with {parameters.Length} parameters - loaded configuration: {memoryOptimizer.savedParameterConfigurations.Where(p => p.attemptToOptimize).ToList().Count}"); + var parameters = vrcAvatarDescriptor.expressionParameters?.parameters ?? Array.Empty(); - var parametersBoolToOptimize = new List(0); - var parametersIntNFloatToOptimize = new List(0); + Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar running on {avatarGameObject.name} with {parameters.Length} parameters - loaded configuration: {memoryOptimizer.savedParameterConfigurations.Where(p => p.selected && p.willBeOptimized).ToList().Count}"); - memoryOptimizer.Refresh(); + var parametersBoolToOptimize = new List(0); + var parametersIntNFloatToOptimize = new List(0); + + var fxLayer = FindFXLayer(vrcAvatarDescriptor); foreach (var savedParameterConfiguration in memoryOptimizer.savedParameterConfigurations) { // find actual parameter VRCExpressionParameters.Parameter parameter = null; - if (savedParameterConfiguration.parameterName.StartsWith("VF##_")) + if (savedParameterConfiguration.param.name.StartsWith("VF##_")) { parameter = parameters.FirstOrDefault(p => { if (p.networkSynced) { // match VRCFury parameters by regex replacing VF\d+_ and replacing VF##_ and then matching name and type - if (p.name.StartsWith("VF") && new Regex("^VF\\d+_").Replace(p.name, string.Empty).Equals(savedParameterConfiguration.parameterName.Replace("VF##_", string.Empty)) && _paramTypes[(int)p.valueType].Equals(savedParameterConfiguration.parameterType)) + if (p.name.StartsWith("VF") && new Regex("^VF\\d+_").Replace(p.name, string.Empty).Equals(savedParameterConfiguration.param.name.Replace("VF##_", string.Empty)) && p.valueType == savedParameterConfiguration.param.valueType) { return true; } @@ -79,7 +77,7 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) if (p.networkSynced) { // match parameters by name and type - if (p.name.Equals(savedParameterConfiguration.parameterName) && _paramTypes[(int)p.valueType].Equals(savedParameterConfiguration.parameterType)) + if (p.name.Equals(savedParameterConfiguration.param.name) && p.valueType == savedParameterConfiguration.param.valueType) { return true; } @@ -94,7 +92,10 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) continue; } - var fxLayer = FindFXLayer(_vrcAvatarDescriptor); + // create pure copy to reference the proper parameter + var pure = savedParameterConfiguration.Pure(); + pure.param = parameter; + // add the parameter to the fx layer if it's missing if (fxLayer.parameters.All(p => !p.name.Equals(parameter.name))) { @@ -114,30 +115,33 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) fxLayer.AddUniqueParam(parameter.name, type); } - if (savedParameterConfiguration.attemptToOptimize && savedParameterConfiguration.willOptimize) + if (savedParameterConfiguration.selected && savedParameterConfiguration.willBeOptimized) { - Debug.Log($"MemoryOptimizerUploadPipeline.OnPreprocessAvatar {savedParameterConfiguration.parameterName} will be optimized."); - - var data = new MemoryOptimizerMain.MemoryOptimizerListData(parameter, savedParameterConfiguration.attemptToOptimize, savedParameterConfiguration.willOptimize); - - switch (parameter.valueType) + switch (savedParameterConfiguration.param.valueType) { case VRCExpressionParameters.ValueType.Bool: - parametersBoolToOptimize.Add(data); + parametersBoolToOptimize.Add(pure); break; case VRCExpressionParameters.ValueType.Int: case VRCExpressionParameters.ValueType.Float: - parametersIntNFloatToOptimize.Add(data); + + parametersIntNFloatToOptimize.Add(pure); break; } } } + + if (parametersBoolToOptimize.Any() || parametersIntNFloatToOptimize.Any()) + { + MemoryOptimizerMain.InstallMemOpt(vrcAvatarDescriptor, fxLayer, vrcAvatarDescriptor.expressionParameters, parametersBoolToOptimize, parametersIntNFloatToOptimize, memoryOptimizer.syncSteps, memoryOptimizer.stepDelay, memoryOptimizer.changeDetection, memoryOptimizer.wdOption, "Assets/TES/MemOpt"); - MemoryOptimizerMain.InstallMemOpt(_vrcAvatarDescriptor, FindFXLayer(_vrcAvatarDescriptor), _vrcAvatarDescriptor.expressionParameters, parametersBoolToOptimize, parametersIntNFloatToOptimize, memoryOptimizer.syncSteps, 0.2f, memoryOptimizer.changeDetection, 0, "Assets/TES/MemOpt"); - - return _vrcAvatarDescriptor.expressionParameters?.CalcTotalCost() < VRCExpressionParameters.MAX_PARAMETER_COST; + Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar optimized:\n- Bools:\n{string.Join("\n", parametersBoolToOptimize.Select(p => $" > {p.param.name}"))}\n- IntNFloats:\n{string.Join("\n", parametersIntNFloatToOptimize.Select(p => $" > {p.param.name}"))}"); + + return vrcAvatarDescriptor.expressionParameters?.CalcTotalCost() < VRCExpressionParameters.MAX_PARAMETER_COST; + } + + Debug.Log("[MemoryOptimizer] System was not installed as there were no parameters to optimize."); + return true; } } } - -#endif diff --git a/Pipeline/MemoryOptimizerUploadPipeline.cs.meta b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs.meta similarity index 100% rename from Pipeline/MemoryOptimizerUploadPipeline.cs.meta rename to Editor/Pipeline/MemoryOptimizerUploadPipeline.cs.meta diff --git a/Editor/_InternalsVisibleTo.cs b/Editor/_InternalsVisibleTo.cs index 29559ad..b911687 100644 --- a/Editor/_InternalsVisibleTo.cs +++ b/Editor/_InternalsVisibleTo.cs @@ -1,4 +1,5 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer")] +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Component")] [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Pipeline")] diff --git a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef index 7db404b..7158ede 100644 --- a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef +++ b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef @@ -8,7 +8,7 @@ "dev.jetees.memoryoptimizer", "dev.jetees.memoryoptimizer.Component", "dev.jetees.memoryoptimizer.Helper", - "dev.jetees.memoryoptimizer.Patcher" + "dev.jetees.memoryoptimizer.Shared" ], "includePlatforms": [ "Editor" @@ -22,9 +22,14 @@ "optionalUnityReferences": [], "versionDefines": [ { - "define": "VRCFury_Installed", + "define": "MemoryOptimizer_VRCFury_IsInstalled", "expression": "0.0.0", "name": "com.vrcfury.vrcfury" + }, + { + "define": "MemoryOptimizer_VRCFury_IsTested", + "expression": "[1.0.0,1.1075.0]", + "name": "com.vrcfury.vrcfury" } ] } \ No newline at end of file diff --git a/Helper/ReadOnlyPropertyHelper.cs b/Helper/ReadOnlyPropertyHelper.cs index 31c43a0..0c3351e 100644 --- a/Helper/ReadOnlyPropertyHelper.cs +++ b/Helper/ReadOnlyPropertyHelper.cs @@ -2,7 +2,7 @@ using UnityEditor; using UnityEngine; -namespace JeTeeS.MemoryOptimizer +namespace JeTeeS.MemoryOptimizer.Helper { internal static class ReadOnlyPropertyHelper { diff --git a/Helper/ReflectionHelper.cs b/Helper/ReflectionHelper.cs index b773726..5923a82 100644 --- a/Helper/ReflectionHelper.cs +++ b/Helper/ReflectionHelper.cs @@ -1,4 +1,4 @@ -namespace JeTeeS.MemoryOptimizer +namespace JeTeeS.MemoryOptimizer.Helper { internal static class ReflectionHelper { diff --git a/Helper/TESHelperFunctions.cs b/Helper/TESHelperFunctions.cs index ad38fc5..0667850 100644 --- a/Helper/TESHelperFunctions.cs +++ b/Helper/TESHelperFunctions.cs @@ -11,12 +11,15 @@ namespace JeTeeS.TES.HelperFunctions { - public static class TESHelperFunctions + internal static class TESHelperFunctions { + internal static readonly string[] _paramTypes = { "Int", "Float", "Bool" }; + public static string SanitizeFileName(this string fileName) { return String.Join("_", fileName.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)); } + public static void MakeBackupOf(List things, string saveTo) { ReadyPath(saveTo); @@ -26,32 +29,49 @@ public static void MakeBackupOf(List things, string saveTo) List splitAssetname = GetAssetName(obj).Split('.').ToList(); string assetName = ""; foreach (string strng in splitAssetname.Take(splitAssetname.Count - 1)) + { assetName += strng; + } while (System.IO.File.Exists(saveTo + assetName + $" ({i})." + splitAssetname.Last())) + { i++; + } + if (!AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(obj), saveTo + assetName + $" ({i})." + splitAssetname.Last())) + { Debug.LogWarning($"Failed to copy '{AssetDatabase.GetAssetPath(obj)}' to path: {saveTo + assetName + $" ({i})." + splitAssetname.Last()}"); + } } } + public static string GetFileType(UnityEngine.Object obj) { string fileName = GetAssetName(obj); if (!string.IsNullOrEmpty(fileName)) + { return fileName.Split('.').ToList().Last(); + } + return null; } + public static string GetAssetName(string path) { if (!string.IsNullOrEmpty(path)) + { return path.Split(@"\/".ToCharArray()).ToList().Last(); + } + return null; } + public static string GetAssetName(UnityEngine.Object thing) { string path = AssetDatabase.GetAssetPath(thing); return GetAssetName(path); } + public static int UninstallErrorDialogWithDiscordLink(string title, string mainMessage, string discordLink) { int option = EditorUtility.DisplayDialogComplex(title, mainMessage, "Continue uninstall anyways (not recommended)", "Cancel uninstall", "Join the discord"); @@ -69,6 +89,7 @@ public static int UninstallErrorDialogWithDiscordLink(string title, string mainM return -1; } } + public static AnimatorController FindFXLayer(VRCAvatarDescriptor descriptor) { return (AnimatorController)descriptor.baseAnimationLayers.FirstOrDefault(x => x.type == VRCAvatarDescriptor.AnimLayerType.FX && x.animatorController != null).animatorController; @@ -76,8 +97,11 @@ public static AnimatorController FindFXLayer(VRCAvatarDescriptor descriptor) public static VRCExpressionParameters FindExpressionParams(VRCAvatarDescriptor descriptor) { - if (descriptor == null) + if (descriptor is null) + { return null; + } + return descriptor.expressionParameters; } @@ -111,7 +135,10 @@ public static string GetControllerParentFolder(AnimatorController controller) subPaths.RemoveAt(subPaths.Count - 1); string returnString = ""; foreach (string subPath in subPaths) + { returnString += subPath + "/"; + } + return returnString; } @@ -133,8 +160,12 @@ public static void LabelWithHelpBox(string text) public static int FindLayerIndex(this AnimatorController controller, AnimatorControllerLayer layer) { for (int i = 0; i < controller.layers.Count(); i++) + { if (controller.layers[i].stateMachine == layer.stateMachine) + { return i; + } + } return -1; } @@ -161,9 +192,14 @@ public static List FindAllStatesInLayer(this AnimatorControl { AnimatorStateMachine currentStateMachine = stateMachines.Dequeue(); foreach (ChildAnimatorState state in currentStateMachine.states) + { returnList.Add(state); + } + foreach (ChildAnimatorStateMachine stateMachine in currentStateMachine.stateMachines) + { stateMachines.Enqueue(stateMachine.stateMachine); + } } return returnList; @@ -173,10 +209,15 @@ public static int FindWDInLayer(this AnimatorControllerLayer layer) { Queue stateQueue = new Queue(); foreach (var state in layer.FindAllStatesInLayer()) + { stateQueue.Enqueue(state); + } if (stateQueue.Count == 0) + { return -2; + } + ChildAnimatorState currentState = stateQueue.Dequeue(); bool firstWD = currentState.state.writeDefaultValues; while (stateQueue.Count > 1) @@ -184,7 +225,9 @@ public static int FindWDInLayer(this AnimatorControllerLayer layer) currentState = stateQueue.Dequeue(); if (currentState.state.writeDefaultValues != firstWD && !currentState.state.name.Contains("WD On")) + { return -1; + } } return Convert.ToInt32(firstWD); @@ -196,11 +239,17 @@ public static int FindWDInController(this AnimatorController controller) AnimatorControllerLayer currentLayer = new AnimatorControllerLayer(); int firstWD = -2; foreach (var layer in controller.layers) + { layerQueue.Enqueue(layer); + } while ((currentLayer.IsBlendTreeLayer() || firstWD == -2) && layerQueue.Count > 1) { - if (firstWD == -1) return -1; + if (firstWD == -1) + { + return -1; + } + currentLayer = layerQueue.Dequeue(); firstWD = currentLayer.FindWDInLayer(); } @@ -209,7 +258,9 @@ public static int FindWDInController(this AnimatorController controller) { currentLayer = layerQueue.Dequeue(); if (currentLayer.FindWDInLayer() != firstWD) + { return -1; + } } return Convert.ToInt32(firstWD); @@ -217,11 +268,18 @@ public static int FindWDInController(this AnimatorController controller) public static bool IsBlendTreeLayer(this AnimatorControllerLayer layer) { - if (layer == null || layer.stateMachine == null) + if (layer?.stateMachine is null) + { return false; + } + foreach (var state in layer.stateMachine.states) + { if (!state.state.name.Contains("WD On")) + { return false; + } + } return true; } @@ -233,22 +291,49 @@ public static AnimatorControllerParameter AddUniqueParam(this AnimatorController if (param.name == paramName) { if (param.type != paramType) + { Debug.LogError("Parameter " + param.name + " is of type: " + param.type.ToString() + " not " + paramType.ToString() + "!"); + } + return param; } } AnimatorControllerParameter controllerParam = new AnimatorControllerParameter(); if (paramType == AnimatorControllerParameterType.Float) - controllerParam = new AnimatorControllerParameter() { name = paramName, type = paramType, defaultFloat = defaultValue }; + { + controllerParam = new AnimatorControllerParameter() + { + name = paramName, + type = paramType, + defaultFloat = defaultValue + }; + } else if (paramType == AnimatorControllerParameterType.Int) - controllerParam = new AnimatorControllerParameter() { name = paramName, type = paramType, defaultInt = ((int)defaultValue) }; + { + controllerParam = new AnimatorControllerParameter() + { + name = paramName, + type = paramType, + defaultInt = ((int)defaultValue) + }; + } else if (paramType == AnimatorControllerParameterType.Bool) - controllerParam = defaultValue > 0 ? new AnimatorControllerParameter() { name = paramName, type = paramType, defaultBool = true } : new AnimatorControllerParameter() { name = paramName, type = paramType, defaultBool = false }; + { + controllerParam = new AnimatorControllerParameter() + { + name = paramName, + type = paramType, + defaultBool = defaultValue > 0 + }; + } else + { Debug.LogError("Parameter " + paramName + " is not a float, int or bool??"); + } controller.AddParameter(controllerParam); + return controller.parameters.Last(x => x.name == paramName && x.type == paramType); } @@ -259,15 +344,29 @@ public static void AddUniqueSyncedParam(this VRCExpressionParameters vrcExpressi if (param.name == name) { if (param.valueType != valueType) + { Debug.LogError("Parameter " + param.name + " is not of type: " + param.valueType.ToString() + "!"); + } + return; } } VRCExpressionParameters.Parameter[] newList = new VRCExpressionParameters.Parameter[vrcExpressionParameters.parameters.Length + 1]; for (int i = 0; i < vrcExpressionParameters.parameters.Length; i++) + { newList[i] = vrcExpressionParameters.parameters[i]; - newList[newList.Length - 1] = new VRCExpressionParameters.Parameter() { name = name, valueType = valueType, networkSynced = isNetworkSynced, saved = isSaved, defaultValue = defaultValue }; + } + + newList[newList.Length - 1] = new VRCExpressionParameters.Parameter() + { + name = name, + valueType = valueType, + networkSynced = isNetworkSynced, + saved = isSaved, + defaultValue = defaultValue + }; + vrcExpressionParameters.parameters = newList; } @@ -285,7 +384,9 @@ public static AnimatorControllerLayer AddLayer(this AnimatorController controlle defaultWeight = defaultWeight, stateMachine = new AnimatorStateMachine() { hideFlags = HideFlags.HideInHierarchy }, }; + controller.AddLayer(layer); + return layer; } @@ -300,14 +401,23 @@ public static void AddHiddenIdentifier(this AnimatorStateMachine animatorStateMa public static List FindHiddenIdentifier(this AnimatorController animatorController, string identifierString) { - if (animatorController == null) + if (animatorController is null) + { return null; + } + List returnList = new List(); foreach (AnimatorControllerLayer layer in animatorController.layers) + { foreach (AnimatorStateTransition anyStateTransition in layer.stateMachine.anyStateTransitions) + { if (anyStateTransition.isExit && anyStateTransition.mute && anyStateTransition.name == identifierString) + { returnList.Add(layer); + } + } + } return returnList; } @@ -319,26 +429,6 @@ public static void ReadyPath(string path) System.IO.Directory.CreateDirectory(path); AssetDatabase.ImportAsset(path); } - /* - string[] subPaths = path.Split(@"\/".ToCharArray()); - foreach (string subPath in subPaths) Debug.Log(subPath); - string tempPath = ""; - - if (subPaths[subPaths.Length - 1].Contains('.')) subPaths = subPaths.Take(subPaths.Length - 1).ToArray(); - for (int i = 0; i < subPaths.Length; i++) - { - if (i == 0) tempPath += subPaths[i]; - else - { - if (!AssetDatabase.IsValidFolder(tempPath + "/" + subPaths[i])) - { - Debug.Log("Creating Folder " + subPaths[i] + " at " + tempPath); - AssetDatabase.CreateFolder(tempPath, subPaths[i]); - } - tempPath += "/" + subPaths[i]; - } - } - */ } public static AnimationClip MakeAAP(string paramName, string saveAssetsTo, float value = 0, float animLength = 1, string assetName = "") => MakeAAP(new[] { paramName }, saveAssetsTo, value, animLength, assetName); @@ -346,13 +436,21 @@ public static void ReadyPath(string path) public static AnimationClip MakeAAP(string[] paramNames, string saveAssetsTo, float value = 0, float animLength = 1, string assetName = "") { if (paramNames.Length == 0) + { Debug.LogError("param list is empty!"); + } + if (assetName == "") + { assetName = paramNames[0] + "_AAP " + value; + } + string saveName = assetName.Replace('/', '_').SanitizeFileName(); AnimationClip animClip = (AnimationClip)AssetDatabase.LoadAssetAtPath(saveAssetsTo + saveName + ".anim", typeof(AnimationClip)); if (animClip != null) + { return animClip; + } ReadyPath(saveAssetsTo); @@ -362,6 +460,7 @@ public static AnimationClip MakeAAP(string[] paramNames, string saveAssetsTo, fl name = assetName, wrapMode = WrapMode.Clamp, }; + foreach (string paramName in paramNames) { AnimationCurve curve = new AnimationCurve(); @@ -371,10 +470,12 @@ public static AnimationClip MakeAAP(string[] paramNames, string saveAssetsTo, fl } AssetDatabase.CreateAsset(animClip, saveAssetsTo + saveName + ".anim"); + return animClip; } public static string GetAssetPath(this UnityEngine.Object item) => AssetDatabase.GetAssetPath(item); + public static void SaveToAsset(this UnityEngine.Object item, UnityEngine.Object saveTo) => AssetDatabase.AddObjectToAsset(item, AssetDatabase.GetAssetPath(saveTo)); public static void SaveUnsavedAssetsToController(this AnimatorController controller) @@ -386,15 +487,22 @@ public static void SaveUnsavedAssetsToController(this AnimatorController control foreach (AnimatorControllerLayer layer in controller.layers) { if (GetAssetPath(layer.stateMachine) == "") + { layer.stateMachine.SaveToAsset(controller); + } + foreach (var state in layer.stateMachine.states) + { states.Add(state); + } foreach (ChildAnimatorStateMachine tempChildStateMachine in layer.stateMachine.stateMachines) { childStateMachines.Enqueue(tempChildStateMachine); foreach (ChildAnimatorState state in tempChildStateMachine.stateMachine.states) + { states.Add(state); + } } while (childStateMachines.Count > 0) @@ -404,29 +512,48 @@ public static void SaveUnsavedAssetsToController(this AnimatorController control { childStateMachines.Enqueue(tempChildStateMachine); foreach (ChildAnimatorState state in tempChildStateMachine.stateMachine.states) + { states.Add(state); + } } - if (GetAssetPath(childStateMachine.stateMachine) == "") + if (string.IsNullOrEmpty(GetAssetPath(childStateMachine.stateMachine))) + { childStateMachine.stateMachine.SaveToAsset(controller); + } } foreach (AnimatorStateTransition anyState in layer.stateMachine.anyStateTransitions) + { transitions.Add(anyState); + } } foreach (ChildAnimatorState state in states) { foreach (AnimatorStateTransition transition in state.state.transitions) + { transitions.Add(transition); - if (GetAssetPath(state.state) == "") + } + + if (string.IsNullOrEmpty(GetAssetPath(state.state))) + { state.state.SaveToAsset(controller); + } + if (state.state.motion is BlendTree tree) + { SaveUnsavedBlendtreesToController(tree, controller); + } } foreach (AnimatorStateTransition transition in transitions) - if (GetAssetPath(transition) == "") transition.SaveToAsset(controller); + { + if (string.IsNullOrEmpty(GetAssetPath(transition))) + { + transition.SaveToAsset(controller); + } + } } public static void SaveUnsavedBlendtreesToController(BlendTree blendTree, UnityEngine.Object saveTo) @@ -436,9 +563,18 @@ public static void SaveUnsavedBlendtreesToController(BlendTree blendTree, UnityE while (blendTrees.Count > 0) { BlendTree subBlendTree = blendTrees.Dequeue(); - if (GetAssetPath(subBlendTree) == "") subBlendTree.SaveToAsset(saveTo); + if (string.IsNullOrEmpty(GetAssetPath(subBlendTree))) + { + subBlendTree.SaveToAsset(saveTo); + } + foreach (ChildMotion child in subBlendTree.children) - if (child.motion is BlendTree tree) blendTrees.Enqueue(tree); + { + if (child.motion is BlendTree tree) + { + blendTrees.Enqueue(tree); + } + } } } @@ -451,20 +587,35 @@ public static void DeleteBlendTreeFromAsset(BlendTree blendTree) BlendTree subBlendTree = blendTrees.Dequeue(); AssetDatabase.RemoveObjectFromAsset(subBlendTree); foreach (ChildMotion child in subBlendTree.children) - if (child.motion is BlendTree tree) blendTrees.Enqueue(tree); + { + if (child.motion is BlendTree tree) + { + blendTrees.Enqueue(tree); + } + } } } public static AnimatorControllerParameter AddSmoothedVer(this AnimatorControllerParameter param, float minValue, float maxValue, AnimatorController controller, string smoothedParamName, string saveTo, string smoothingAmountParamName = "SmoothingAmount", string mainBlendTreeIdentifier = "MainBlendTree", string mainBlendTreeLayerName = "MainBlendTree", string smoothingParentTreeName = "SmoothingParentTree", string constantOneName = "ConstantOne") { BlendTree smoothingParentTree = GetOrGenerateChildTree(controller, smoothingParentTreeName, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); + AnimationClip smoothingAnimMin = MakeAAP(smoothedParamName, saveTo, minValue, 1, smoothedParamName + minValue); AnimationClip smoothingAnimMax = MakeAAP(smoothedParamName, saveTo, maxValue, 1, smoothedParamName + maxValue); + controller.AddUniqueParam(smoothingAmountParamName, AnimatorControllerParameterType.Float, 0.1f); + AnimatorControllerParameter constantOneParam = controller.AddUniqueParam(constantOneName, AnimatorControllerParameterType.Float, 1); AnimatorControllerParameter smoothedParam = controller.AddUniqueParam(smoothedParamName); - BlendTree smoothedValue = new BlendTree() { blendType = BlendTreeType.Simple1D, blendParameter = smoothedParamName, name = smoothedParamName, useAutomaticThresholds = false, hideFlags = HideFlags.HideInHierarchy }; + BlendTree smoothedValue = new BlendTree() + { + blendType = BlendTreeType.Simple1D, + blendParameter = smoothedParamName, + name = smoothedParamName, + useAutomaticThresholds = false, + hideFlags = HideFlags.HideInHierarchy + }; ChildMotion[] tempChildren = new ChildMotion[2]; tempChildren[0].motion = smoothingAnimMin; @@ -477,7 +628,15 @@ public static AnimatorControllerParameter AddSmoothedVer(this AnimatorController smoothedValue.children = tempChildren; - BlendTree originalValue = new BlendTree() { blendType = BlendTreeType.Simple1D, blendParameter = param.name, name = param.name + "_Original", useAutomaticThresholds = false, hideFlags = HideFlags.HideInHierarchy }; + BlendTree originalValue = new BlendTree() + { + blendType = BlendTreeType.Simple1D, + blendParameter = param.name, + name = param.name + "_Original", + useAutomaticThresholds = false, + hideFlags = HideFlags.HideInHierarchy + }; + tempChildren = new ChildMotion[2]; tempChildren[0].motion = smoothingAnimMin; tempChildren[0].timeScale = 1; @@ -487,7 +646,14 @@ public static AnimatorControllerParameter AddSmoothedVer(this AnimatorController tempChildren[1].threshold = maxValue; originalValue.children = tempChildren; - BlendTree smoother = new BlendTree() { blendType = BlendTreeType.Simple1D, blendParameter = smoothingAmountParamName, name = param.name + " Smoothing Tree", hideFlags = HideFlags.HideInHierarchy }; + BlendTree smoother = new BlendTree() + { + blendType = BlendTreeType.Simple1D, + blendParameter = smoothingAmountParamName, + name = param.name + " Smoothing Tree", + hideFlags = HideFlags.HideInHierarchy + }; + smoother.AddChild(smoothedValue); smoother.AddChild(originalValue); smoother.useAutomaticThresholds = false; @@ -509,8 +675,12 @@ public static AnimatorControllerParameter AddParamDifferential(AnimatorControlle { differentialParamName = param1.name + "_Minus_" + param2.name; for (int i = 0; i < differentialParamName.Length; i++) + { if (differentialParamName[i] == '/' || differentialParamName[i] == '\\') + { differentialParamName.Remove(i); + } + } } AnimatorControllerParameter differentialParam = controller.AddUniqueParam(differentialParamName); @@ -567,15 +737,16 @@ public static AnimatorControllerParameter AddParamDifferential(AnimatorControlle return differentialParam; } - public static BlendTree GetOrGenerateMainBlendTree(AnimatorController fxLayer, string mainBlendTreeIdentifier, string layerName, string constantOneName) - => GetMainBlendTree(fxLayer, mainBlendTreeIdentifier) ?? GenerateMainBlendTree(fxLayer, mainBlendTreeIdentifier, layerName, constantOneName); + public static BlendTree GetOrGenerateMainBlendTree(AnimatorController fxLayer, string mainBlendTreeIdentifier, string layerName, string constantOneName) => GetMainBlendTree(fxLayer, mainBlendTreeIdentifier) ?? GenerateMainBlendTree(fxLayer, mainBlendTreeIdentifier, layerName, constantOneName); private static BlendTree GetMainBlendTree(AnimatorController fxLayer, string mainBlendTreeIdentifier) { List mainBlendTrees = FindHiddenIdentifier(fxLayer, mainBlendTreeIdentifier); if (mainBlendTrees.Count > 0 && mainBlendTrees[0].stateMachine.states.Length > 0 && mainBlendTrees[0].stateMachine.states[0].state.motion is BlendTree tree) + { return tree; + } return null; } @@ -604,8 +775,7 @@ private static BlendTree GenerateMainBlendTree(AnimatorController fxLayer, strin return (BlendTree)state.motion; } - public static BlendTree GetOrGenerateChildTree(AnimatorController fxLayer, string name, string mainBlendTreeIdentifier, string mainBlendTreeLayerName, string constantOneName) - => GetChildTree(fxLayer, name, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName) ?? GenerateChildTree(fxLayer, name, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); + public static BlendTree GetOrGenerateChildTree(AnimatorController fxLayer, string name, string mainBlendTreeIdentifier, string mainBlendTreeLayerName, string constantOneName) => GetChildTree(fxLayer, name, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName) ?? GenerateChildTree(fxLayer, name, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); private static BlendTree GenerateChildTree(AnimatorController controller, string name, string mainBlendTreeIdentifier, string mainBlendTreeLayerName, string constantOneName) { @@ -618,6 +788,7 @@ private static BlendTree GenerateChildTree(AnimatorController controller, string blendParameter = constantOneName, name = name, }; + mainBlendTree.AddChild(smoothedParentTree); var tempChildren = mainBlendTree.children; @@ -632,8 +803,12 @@ private static BlendTree GetChildTree(AnimatorController controller, string name BlendTree mainBlendTree = GetOrGenerateMainBlendTree(controller, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); foreach (ChildMotion child in mainBlendTree.children) + { if (child.motion.name == name) + { return (BlendTree)child.motion; + } + } return null; } @@ -641,14 +816,28 @@ private static BlendTree GetChildTree(AnimatorController controller, string name public static int DecimalToBinary(this int i) { if (i <= 0) + { return 0; + } string result = ""; for (int j = i; j > 0; j /= 2) + { result = (j % 2).ToString() + result; + } return Int32.Parse(result); } + + public static int GetParameterCost(this VRCExpressionParameters.Parameter parameter) + { + return parameter.networkSynced ? 0 : parameter.valueType == VRCExpressionParameters.ValueType.Bool ? 1 : 8; + } + + public static string TranslateParameterValueType(this VRCExpressionParameters.ValueType valueType) + { + return _paramTypes[(int)valueType]; + } } } diff --git a/Helper/_InternalsVisibleTo.cs b/Helper/_InternalsVisibleTo.cs index 3fcc844..320c255 100644 --- a/Helper/_InternalsVisibleTo.cs +++ b/Helper/_InternalsVisibleTo.cs @@ -2,4 +2,3 @@ [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Component")] [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Editor")] -[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Pipeline")] diff --git a/Patcher.meta b/Patcher.meta deleted file mode 100644 index 862f5e6..0000000 --- a/Patcher.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 489926ef3f5c49e7b03d87ebcb0ad1e6 -timeCreated: 1727478969 \ No newline at end of file diff --git a/Patcher/_InternalsVisibleTo.cs.meta b/Patcher/_InternalsVisibleTo.cs.meta deleted file mode 100644 index 003212d..0000000 --- a/Patcher/_InternalsVisibleTo.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ca82bbc994354247a560244ff04e0823 -timeCreated: 1727551858 \ No newline at end of file diff --git a/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef.meta b/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef.meta deleted file mode 100644 index 1768f89..0000000 --- a/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 4ac41961b7af4a058bde479d16dacf91 -timeCreated: 1727551599 \ No newline at end of file diff --git a/Pipeline.meta b/Pipeline.meta deleted file mode 100644 index a15ac3c..0000000 --- a/Pipeline.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 32a354577d154391a412e7aaf1b06438 -timeCreated: 1727383235 \ No newline at end of file diff --git a/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef b/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef deleted file mode 100644 index f65cd43..0000000 --- a/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "dev.jetees.memoryoptimizer.Pipeline", - "references": [ - "VRC.SDK3A", - "VRC.SDK3A.Editor", - "VRC.SDKBase", - "VRC.SDKBase.Editor", - "dev.jetees.memoryoptimizer.Component", - "dev.jetees.memoryoptimizer.Editor", - "dev.jetees.memoryoptimizer.Helper", - "dev.jetees.memoryoptimizer.Patcher" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "autoReferenced": true, - "overrideReferences": false, - "precompiledReferences": [], - "defineConstraints": [], - "optionalUnityReferences": [] -} \ No newline at end of file diff --git a/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef.meta b/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef.meta deleted file mode 100644 index f6e38e6..0000000 --- a/Pipeline/dev.jetees.memoryoptimizer.Pipeline.asmdef.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 64e613a2a91b4204b0cb83c77ad7f2c2 -timeCreated: 1727383292 \ No newline at end of file diff --git a/Shared.meta b/Shared.meta new file mode 100644 index 0000000..7f8a9b6 --- /dev/null +++ b/Shared.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4fdcd2527c784d5abc7b281ac13604fe +timeCreated: 1727704132 \ No newline at end of file diff --git a/Shared/MemoryOptimizerListData.cs b/Shared/MemoryOptimizerListData.cs new file mode 100644 index 0000000..e97dbc0 --- /dev/null +++ b/Shared/MemoryOptimizerListData.cs @@ -0,0 +1,21 @@ +using System; +using UnityEngine; +using VRC.SDK3.Avatars.ScriptableObjects; + +namespace JeTeeS.MemoryOptimizer.Shared +{ + [Serializable] + internal class MemoryOptimizerListData + { + public VRCExpressionParameters.Parameter param; + public bool selected = false; + public bool willBeOptimized = false; + + public MemoryOptimizerListData(VRCExpressionParameters.Parameter parameter, bool isSelected, bool willOptimize) + { + param = parameter; + selected = isSelected; + willBeOptimized = willOptimize; + } + } +} \ No newline at end of file diff --git a/Shared/MemoryOptimizerListData.cs.meta b/Shared/MemoryOptimizerListData.cs.meta new file mode 100644 index 0000000..f89836c --- /dev/null +++ b/Shared/MemoryOptimizerListData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6113fc8e95544740ad0c045a7d6d1f5d +timeCreated: 1727704142 \ No newline at end of file diff --git a/Patcher/_InternalsVisibleTo.cs b/Shared/_InternalsVisibleTo.cs similarity index 60% rename from Patcher/_InternalsVisibleTo.cs rename to Shared/_InternalsVisibleTo.cs index 194b3ff..320c255 100644 --- a/Patcher/_InternalsVisibleTo.cs +++ b/Shared/_InternalsVisibleTo.cs @@ -1,4 +1,4 @@ using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Component")] [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Editor")] -[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Pipeline")] diff --git a/Shared/_InternalsVisibleTo.cs.meta b/Shared/_InternalsVisibleTo.cs.meta new file mode 100644 index 0000000..7b2543a --- /dev/null +++ b/Shared/_InternalsVisibleTo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 424e12f812594ccaa598d6f273345e28 +timeCreated: 1727704351 \ No newline at end of file diff --git a/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef b/Shared/dev.jetees.memoryoptimizer.Shared.asmdef similarity index 68% rename from Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef rename to Shared/dev.jetees.memoryoptimizer.Shared.asmdef index d832707..c6ee108 100644 --- a/Patcher/dev.jetees.memoryoptimizer.Patcher.asmdef +++ b/Shared/dev.jetees.memoryoptimizer.Shared.asmdef @@ -1,5 +1,5 @@ { - "name": "dev.jetees.memoryoptimizer.Patcher", + "name": "dev.jetees.memoryoptimizer.Shared", "references": [ "VRC.SDK3A", "VRC.SDK3A.Editor", @@ -16,14 +16,9 @@ "optionalUnityReferences": [], "versionDefines": [ { - "define": "VRCFury_Installed", + "define": "MemoryOptimizer_VRCFury_IsInstalled", "expression": "0.0.0", "name": "com.vrcfury.vrcfury" - }, - { - "define": "VRCFury_Tested", - "expression": "[1.0.0,1.1075.0]", - "name": "com.vrcfury.vrcfury" } ] } \ No newline at end of file diff --git a/Shared/dev.jetees.memoryoptimizer.Shared.asmdef.meta b/Shared/dev.jetees.memoryoptimizer.Shared.asmdef.meta new file mode 100644 index 0000000..ae1fecb --- /dev/null +++ b/Shared/dev.jetees.memoryoptimizer.Shared.asmdef.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cc6717a052474614acb1a2409d552580 +timeCreated: 1727704192 \ No newline at end of file From 17ba7d963f0246dec262f34a590d2e3e52daf7e3 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:08:26 +0200 Subject: [PATCH 04/16] Fix certain upload hooks failing --- Component/MemoryOptimizerComponent.cs | 6 +++++- Editor/Pipeline/MemoryOptimizerUploadPipeline.cs | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index 7bfe521..518c581 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -1,4 +1,6 @@ -using System; +#if UNITY_EDITOR + +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -281,3 +283,5 @@ private void AddOrReplaceParameterConfiguration(SavedParameterConfiguration conf } } } + +#endif diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index 8b99a77..cfc5be0 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -41,6 +41,12 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) var vrcAvatarDescriptor = avatarGameObject.GetComponent(); var memoryOptimizer = avatarGameObject.GetComponent(); + // if we don't have a component don't process + if (memoryOptimizer is null) + { + return true; + } + var parameters = vrcAvatarDescriptor.expressionParameters?.parameters ?? Array.Empty(); Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar running on {avatarGameObject.name} with {parameters.Length} parameters - loaded configuration: {memoryOptimizer.savedParameterConfigurations.Where(p => p.selected && p.willBeOptimized).ToList().Count}"); From 0d31a62f315a330489c1e87b0f4e48fa4b6b9346 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:46:31 +0200 Subject: [PATCH 05/16] extend README.md to include some information about this component --- Media/preview-component.gif | Bin 0 -> 490805 bytes Media/preview-component.gif.meta | 127 +++++++++++++++++++++++++++++++ Media/use-component.gif | Bin 0 -> 307135 bytes Media/use-component.gif.meta | 127 +++++++++++++++++++++++++++++++ README.md | 29 +++++++ 5 files changed, 283 insertions(+) create mode 100644 Media/preview-component.gif create mode 100644 Media/preview-component.gif.meta create mode 100644 Media/use-component.gif create mode 100644 Media/use-component.gif.meta diff --git a/Media/preview-component.gif b/Media/preview-component.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5be2cb2c88c049e8eb3574df0d529b70d4b6318 GIT binary patch literal 490805 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
BAKqjP*B%W*a3u9)xJ46 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

-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�%%1m?Aia4oS4qEA+6SxrLh$Y5)vPavExF4o=6 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

gc%zZv6r6AM2&4-%w!JcDkFX+ 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

CKpKug}eEPl39`vJ}5uOP=3 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Ͳpo$cWpo0_umy71IF-8=W%SW8}K;{k~^M(ziuwfcZ%w7aEPlyF_ zaTEryiHUCDVl+9}S_bMZA6R<}_?(ZL0RX5RtPu^OPeHeF0h>5*MK%sB%mlKr*9hYE z0{w)B9ApBN=r??8;KNM79U=M#4{Ha2_6t!TnE)w4-2wps<>TZz_ed0&DXm$2n)R9n z=%b*Fh|rrNlC1}+KAR1%6+pJp5Vx`+Hz^tQ0*DC%=1oUkrh$8_6&uqYM%;rcKY|`s z0=K1=zdebquEd{+Y^dWr7-Wi{J#-@%I7q_01YluAyetPkNCR;BX!%;qb0!)=5DVqt zYyq~8-RQ}N`v9;~vzVI%z&9eMkB;+VqTbOvZwgW0n2;tRS|1?(8y>$U;$9Ll6%5pK zHfE59mM7t$G=v)fw3mog#b5*Iz(FCp4}b;naUc%-qYzL+!dxZdB@batd6?%EY#$LY zO#{HVICl#AB@gqGgwojs(?EkGFeoPmDvbxL1)zT3hTfx~ZV*vBL~O`ymyAjP%CZ=G zi!Xkp+g5J3MYm_T!yrclz*Ag!J)PIuTdtswN76xV95{^wuX)~o=Xrks4P`siAHac^ zvQf9VLAfMQfDqIMK=lS@9U{Vu0H_!yM4p2?B&?y3P}jN0Yb2*=ergc!Vh|JdP8m_e zK<3jp*8r&77-+}$phNXi2xl=`g5qjSmlE>^Q}QHuVI$CWl1I9Z!)xzxpk{FhlOd)4<|pv7{25 z#K8YyULI=1uX50GOwc~!g&11av;A4UYne9U=ii2wWn=>$)q(^Gz%(Jyl!ECbUNEtF zbAqiXDJ(MLfX*-=u3I3su(ZsZv8&&sY=~ht;&17X?B7w%Zj3W$8-i%eH)FMLyqQqx zA@Dsm#(3Xqe0aO zpR~okP&!DL4%#aO+5(X3gnz;@N3fwDjSzJnavw3`92c^Sa;f4Q_~n)eJ~s6AXK=^g zGrGcIIt{vu^SOTyWS@u*vfzHUC4I7Bg0}O)x@_1v5?GCw>8}!OrV^|xAe%BysCq}w zAC9&YLQW7u-2rE8d8ex2(3bs?F7Tks7oV~Z%jMWWb6d7J2!U`0puz@Bq-AL{08Gx< zj8B#h33U52_}Jh_?qyJgN@%6y2v-FpwxWBafIL#bFAqa|OMv?*r>`eLzis(^ROgEc z?(={O^yQ0ly8uvQ)d*Y8@FyFH9v!w-II)`!8u^-MRqic_v&eX5B{|ooxY$ zabthn+kGQnZ(siAeR#x?4IzB@cRulk#*WN`1$E>L(3x_LW01`Rs5TvOfd|haOkSYC zLm87{A|fK30?+WB%m|)L@`a}}k-4_WLL#!@(o_x+8OKD%k&tD$=~P#EqVIH>AtH_k zzh#IBBO%jC$Z!(!j_u6-y2%H1la0Rc$E7n_t>WK-^5!Pl!O&!1c=Dy$zS7y0*4h4% z*_ulum)}SI{tB_9{P3CKtRH`xRr3AZz3&${z9-mDUSQ5vx=x4ECwp;Ip`4j(ty9JP zxgR(+B`b;sK+11-D-b_}??Wvu>ha)X}BPfhBg?k~{uauF;h9ktOe}U%hin zhe!Wpv@ISr`t4`5c<0jRlWtHEA56~wttpBRF zp9bGASlch0E^k9r;D7B=TQb4VI*X74bZ8lK>2=xsWbmwa$lqOe|9lAfTPhm;>pTj{ zyt_Vbw5U+F^0jRK^XOl~^1CDaZ|<9^=(Q-5RY{jhb}hEj^B80yuY9er z*m|a?tH|R-i8kCKXhL}EJFQ|zxM58^*eOdjZR6C@SMmLx`ZmRyI~Uw;4=NsPxdc_( zKkIe>*o)E~*Y^MLX*lz_HBsrn+@Z(eKSsLI`%|RVMZ4usJ3G--sBu{Ip|39wtKjBv z#TjO|U)Fl>&%AS5a?fOiTW`gktIs!|z2e_|d`DnM`hh8n=3$kufJd?Yfat}E+Vw^o_Svq_&L|MCTi93%!phxn|)xB4z`7>hfb4x5-&38R&;cMrj z%95%9T)9^F;dma1 z+ytW*1blf>JOdw1k4_H^Gm+J#Eowo(Q&9PpjRmLrd&1(xfn5V z&q*y7V&bfxynftNu3O(*I>1?P-~E~EVHaM6MS^1x<7l~rwFmGa-?AC6ylQw+3I z$MqK-lRz%p>sRFsS8jPZ^sVx``u3Twb2oR^dhIB?6lKXv)7~9-s#_MnBUB`ze1Wcy zkhS}xb$O<`G23~UQTJAlJ?3A-3|lu?<9B(ec%#<1I%@E>#H~toH%<PnhA#!$$x1nA^t5a1)v7Y^>LXC2A9~&MOevQih?jmre{mL40O}(5wX;4$B6i$Itvy~Izk+dVGv@T9#hA}+~yc3kdMb^8`)D(cwte#pBaAwAAFtvsJ3dH z@fIv8@5iEW;)p;Nn6i>x$dr#GT?9a?W_d-HrXa%EhWMG{KyabR_qY+@bw%E9B0M7=}7PC1#oKo_*T5QciC1n0Tmh(3XjyH7R%+ z+R#$$q#qOC7#5eKJs78Uy}44VIxAgj1D&=w@6%Me%H-@=1iF`tcO(Kq$*#kv@f+$g zHT#e0r~B(mbGR@YiXCWj$O%Lu#H&ow;ns|AE{TslI1AE9i>s&c0{wkAPCA9|xKia{ z{P;lY?_Y=CX9pTRxW4OfzUQ^~JL7hViIEt)cDNgJRwTs{Lb`L_l>QFu*jJR35Hm+C zF8I+dWpTba#+FsLuc%|+zI2trk-h@=L=fyaAq4~hNV4edxJrct75VZ4a?aD7+58)_7JUD4-_D^>sYLtI4q zr#*xB>ZA9uMN{q*rotR~ROqF>=_zE9v|eUI2O(vhBbJ7Ej` zW~a)xc5*)_&%^?VbmpZ=E!3#U%N6yQ-l*~}6cv~v%s)JJi%3tn_1bUnbg$L6x_NpY zQ>HswtMlx>LyYq^2}?9fo9`xdk0;~4Dimb*kQxF*Lz?ppPJTuC?Ch8*<{!UH1HP2B zHSsCzwbqsU$WKwds1I}@o4He_D44(m?y`_f(*RyC@ zimz@uhS#VSPiX+WU)3aq*B-M8^m+er@KH~AU3g2N@AAj@ZLkP#qD|0IxlcpAjuH3s zT7r(7fBGC-4Iva#DH_-w(a;qQ)-kKeTfM?CuU z`DapO^H-aYnD?JXmU|*wf3<{MTK+UDf<^J5whU36+^_)d6xAWq%1AOF9>XU`b!pj# zrX3g_m+Ot{+147G89Dq#4IbUM!}e@W!SIBRQ*{5n*0cGKhQAsmM?XJid+zG{;cw=> z(J#YW&y_9@e<#CZ_=&b*6>^^^ot$D`=e362F#kN|mK^i8$~L^_z~|`$y)lCiTf^%j zKhGS2pC9VBjksU%dG>_U`H$~fBN`rk{t=RVe)y|xav_ zH=Qm{?`w-0d^GawZt}(1W90K6#Sx81y%*=g+s=|;GP3p5D=&6lSm?WQskN%uto&(2VvUOMp7kgy6}1iw0nVl ze%ziA&9#9Cvf?DZG{!VRNK@6BNQhi?SI&9VtziIH1vmMbzJMz1Hto<6`JcNNrFr)3 zCTPj5<5P<&0~!{32jkmksG?Hvrbjkl2fcILpx z({H*P?s><4Hlxxye?`2TKAL9seikR1kZ?T=`A537{Q31~8qAL-=|Na>kTtecZ<_Gf zJzw@!WVsiTV5FWI@S*rT&f}}dbEI)nv)pyO-xylkM`4#_x4&bIr?h zYd?8#qjh1IT*&%-pU%K14UvI+@*h2*1soAMQ$pS z$ssn&4pn9BKhJwv7k`h4HpNnB9t=n?u6wv$`t?D{`8TYZ%z69s!q|4T^{eljm$L8T zCZvd9=t-OJ+k|n@jGY^`2ikxA!e1mp)IkI0Hh6tfyk)i;T%xaihgUiAC0ZRqoordR z?7E;EgjCtz*g7SV5dZqh7(#TWu(RZC7A}->R8rIqgnG5d{l4Ohv5&HYjdN4XKaBlF z*ukMeUjRnZ5X5z-o~bQyvF@|wtJ2O61~~~h5!X(I?c8hSMFp-7CCSu0a#C2$PCFCk zzk5QLV8!2?8cJhsU*DSv?hDC!hxXHqb#8$q-HpkWuH31qPT0xwBNj`i09Ie&FE-i( z_pHFxRshNS7TQs_6RI{JzSY04#+`V9_mu)^hx=~W6LKbxkyuZYX{U2Ew4M8a2o64W z#a`_zryaPP^5XOj&Q%eq9k_9CPcTli2m}=G%ZlPyhZfboH*3Q)EhVH8U2t8d4(i*K zs~Ul$_A*S{3_%dNDf1W077wwLXTv07QLGZeJd41g&~zwH@CC@`05uGU`hw3 zf*-GfP_Iz=+)hp-y;ju?hU@OR<#I6qqNb-#6?qj=MCu8uyd~mgbe6Pc9C(v}PPILq zLQzR%WB-0ZdPK#^R#Tvr$DOI$C#xxOE{Tvay&Eo*K$-fQgd4vF;)0nDDIb021*x?7>6Of=%?}^-UdGoHw)z`7jOLb8#Q}%IbVCA83>+Ojt(q5}s`Db0#>BlCico4MB zmRbwGrC(Zudf$d}xGyT4J!bmMyRhy#g0Zawu-c9fU+Po_A}By{A=V~mAVPfeC6hrs z_)#>zvq8kW6CCpF6UV9x=`OyiZQ#8B*_ZhMoIOkpbn(1urCw_j6^y@np3gO@hkF#x z#rZxq86Wwjc2FJ>`iKHuxcaDha@$WCee5w^|jUglmMOV*N?O|Mpp6o+D|qdZ7_XTz1u zp&iPe9YU&{q$pT1S*K>N14Kiw$VAUC@wKzhY+&cuP5B8XYSE$LB|E>?@e{E`ARZsZ zgd%(h;xf>&=TFf8jjMWDT>tXF`Hdu@|Lb^K|5x8gF{~o|x2N?#GGPCwuuAZ;+>=KY z#BPG4X}WduS?Qas^18?#Z@s?A9MH^m$h7+C?4LpUMPw89TF*nIcX8&sC~op&Y$*|~ zyerp*=2w;HsqY7o*+~RW>~fL5H$iq?q9pEc-L0;bxBoOtE8p?Z{Fed)%PC;)Hrl-o z@)7YFjnauyL4dSWN%S|e3!*Xs=W~+!eV3!WL>D<~QkaEv)J*FoKbaMi%62B2U-MEF z%ag8eYix?YlGQM=SK`Vgkq-!EtsB~DA!;_+Q!Q~zosUaxIPIYym>_gB=pB03wQd7lf~!*iIg$FTS8a=$rWfyD+6W_ZA|cgZyPtpC*aV$Pn!C_T~E8+eg}dH{a&7qR=t08{q;t~#QsX$Zh(ZV(a{>e_ojE<>(dBdmx`o@zCZJe z9Esn$obY2qbdIU%DOLY#Z}69vJ_@6A%kp^Crh4z+YkB2L(+At5VUtb+^!v}lL<({+s`yJf0MO=PiPL5%^i>(??)tI}vYfziJ zkErL%?s5q3i0tms`1F>Ce{JviDEkx;=C<8Ett@QY1j=#egVCOQ9Db^k$(cD4+pB5k*2rYG{fSsZs=`h=7Pn?i(GVgic|KIPruG(aerQLo~te6yFFNrZIb|#c!~D zBfzI^T+s~SoITp@HlXGjMzNm8XO5$pG<}N#&pJ;rV$=T^BJ6vM1lw*aM?|e9Bg*dYf-R6551mitpoY2 zJE92K9i+*{B);`RApdcK!HJMDh#CMQQ_-72+K=>x948=b7uAb@cR*~T&gyx0hl541 zP}`EXz#2f@6(SLF#B_vvpLL{x{*l!U>BN(EkcDt183p0A=jL?v@NED)lpHrg;+Gex zQq0!nkWuOB8wx8ZVBh-uRwMKnN+j!+owciF3G5uJ3)<$jrOk(lp)$cDQR66AsK(`n~Oc{u3^cws4Mn!h~YE5wL63qK96&qk|I*b_Z0YWU@Bv%MFz7aF`p|9*xB56K zV|Md*_B|KfN8($a>l z5Y6AnCUU<%ge~+I_fM=$1QflC%DwUe3;)}a^QRx_3@ZL>TlPQeM{>$R5qFiDb-lSJ zHuL>|)KmX*2fbS}zsqt5NlX1j)&EC7@+(P|`Dibv{YmBIBl~~2gZ`+ebZ-6*nL{A8 z&;L_Bb>PXPpUpL7RLfuLsnwz9r{4GP`23}wnl#Y9@AqEW*xlqW^^~T9%OStx9K7^@ zsHb+tGNVgOEEm&Cp8Qcyz52#`J<$BaANAC*t|4>gI@;fBM^~YICpFF7; z`JCk}ZIqK?vi+gz_b7~2o_V?7@*hi1*o)V@|A-y`PnVqk&(%}^&3@$nD0bY+rof`= z3-~P8_DWYS*9{(9T7FD7RQOguZtwH$$(wU5A@~$4cHGE_QCMl3z3sE|bfL6zrFpqw zY2_JTkofnOjn@NtBCBJLovan}{b2_Kw2DEifrgd7-`1SgG#`f!&;V@}$O9F`Dd`&^ z4=8>4{_^@xLT3QNazP(SQq))NxNxermaiyvzLS4oLLeYYOR>aY$hoto;~;mf>k%VP zpIY(|bHf!ZaAxqN_$afpphMr#aU+Vy(ERtvkS}X?D_|SY51d{f@BOvLWIfz$$FziD>gZ>V(N@}Q zV!E-B0p;Wi+I*&m23$0~b1enK94E#uqE8JQeaR`Tp@|1p?IT4?M)-Rqg2uzOR`@1( zj6{)2?aiLjIIHV=tvyfT76!oi*B6m<`z?A!$V-l9L|me&UP=DVU3^`7(68@}GAS)T zT8w73^e33y&wtQe4&P?2HfxadLp#Ambi`87)(_$w!*Phd44$I`m&_uY9mZ@RXJ3K^S)CRphaCZ zHI?6KR>G^yRAFx>DWg7)_nyEL8ChbwbT|ni!rL4jI2Pd)7%yQ`VQhb_6M-nW$FHwW zipvNPADnXA(@=#gIda`0rgnaf6BN)`4bRb!io`MiFTxy&0My#N%7M@QfxK3{-^ZoZ z53ZjeqO4F^46yFcyUdX=V+l0LBaW};E-#<)FhpcKmUzGvOkm9gg2H9>uk56NOIjg< zzk3XnE?6aHF^VwJ3kC<*$*u5ANdVGAYRWw$~7X&~>yx7N8u8m1k2fU2o@8bm5VoN~^S> zEc=|it`ak+BVNnv#0D1xMGbsZt@BB6ez|@2P4q@3dq-#-@9hMY5z_{2hF`Bw296%4 zf8z1L&;&(^Qt zj1>Lq+25uSRCTtuUp7mc$4Gk1d%ZBu7Zl1Xo6hYkyI=N{P{8aEQ z=?ZIGHrKu^;Z$=shDkibrWM}i0;owm-U0>xfV44D@AXb6I!$Ug6bM(I@a11V97DNt z=H>m1zG2$Dv{SQcXd)#b-N&Pi(IjrGTvrVO{mYv77a0Hm0>GF6=D!O!|7GFk-z(q$ zaOGR=R`|2>`FwxAJzx3##op%9_m=>6#no1bjeZx&l69hcnJbUHnqi15>EPzcT*cj~ zHhh#z4g+nhrK-$ z_WYQWs=4^F>)t)YD}459=*@SIVa&WBQ7Uuhs-E=$3)`s&M>Dpk-cHmud|*2I6ZjHf zbx&r_%i!8l?^Rd~p8_5wxqq4ZP8cIxh%9nb)BB zaOvWMfu%>7sS)wEkHw{pfk&R040+rC061>5_ZDEFsILLqB;)M%dsMIlhRTmYwSzZT zkq&5AcCA(*cVZ0_eE-&Eag1Ku&^}z1HpJSm@h{*Z@e$DrRfSyVWsjsAM#tsx;mNEm znA%tH6-vO3^C8mm1aE_~|i&CMNF*c6BeL6IcfU17$qZ7^HLSBJK2$i$7H8n;t0iA>Gt zJBKDDHGaKjMl59{sBN|!Sqr1t;f=}EP=W|ju z)K&FNtMcr`J?)FRrkVkloRi}y?YHmdxc%7oj?(43%BT11vU<$t{~xV+BE`5@Pvx$> zIAXP4Tq##scf%v0@9`hPr#FvzAa3n-3`DUQ0gwkRKK+@vD0#}Sx&aDZXlTTLhENi&Pl?K1Z5lnn8Xpw{*riyVVQz$YK(;_Cp;+Pjaw`}%43yw5(s}HXw zU*DU-AfNUc{f9O0-9N2)dvmyy|0At=*Y|(?XG&DH-O6|C#(U${O!XzN{Pj1H?>6ss z|1J$mIseh&-BudgesT23!Xb9Zzg~C#LW^hpH|DQ#|2|v(UqMK33J#HJ(`+Qa3}QE) zzacy|hFjGj=8$JqZHzEBzNz~lB59N^6u?;@L-OkMP8aek-_A=sM%?~mpbm~nf}Y6g zNY`^@ zj_F%7dP3c|rgH-VSRGcjna&(4?n7~0C@6}-Fkg>ZPUSSJ6bMOjHH&d^gj^>9CPbPiwF(A17+?14w{hb?MB z`8H_(rMt??w%va=`c+v9dGE@?b+|jvCXDy*j!1q$+jbDN_rU$i)hGq}1Nl?lEBG(> zp3xpx@CMJ4_^w!??t|JS$f`U#)p250nvl;`i$si6``FUGtEvnK6rXYa7*L%Q`7tEeRnR$X zxLgIfxmcvIQ7HJMS@sswv!C-g_!@zR>kB@D;^*p1lR6}uUcNr0c3J1gU^WKuaeGG)v2@v$ zUVLfmYKjc}W$Gf{{M@6R`P{23*XA#&y`_C2Z1{FA>YQ~+YOTC0yaUlJZo2&KM_6>>3dGx(9B1p-UNQCP!pYvXX~hae|qnot}y z9JYO?d<`lwm!Ge@JD(!<;@9U$G3Ku#^(dIoMl~m7q?}nLFIe@fhxb8EloX+mTBX3? z?MFo)rcQHk2Vw-JjfuE|HoxG023{?Tcr2L4<>T5>uITy9qvD&`xosm1NSs})Mx0B> zSnp6PDq69|4Qffy6Dz8zVf})<7L+k=W`AppdF`~Aky#=dJh-6t?rvMmHU$;}E`JJ^lx+tw$8a5ninx=tF`; z`01Jm0b7?9w!6>Ng4by0^&Gy@`Jt-%;s`Qp$xhW^*DGy{zGmFPhgpl#)&_DO;nbJT zuQ9T`HytNoezu*huF775L&9b1^V5YOW3vci;#sxgw;3}K=6P|pBx<`*00F{B$FLvI zlH|)GM~h?m?&@QtdAtcHgi0__>E6;~jdzFSv&8S}myEPPJC zg1osQ!)}hVVN2=$Uf4vDvcT`wD3g8LUBVbBpBIN#^k8lcuvu7ap6k*S@w#J^7~ObIIqurr=gn@52s>w1KHN-S!Ri zvyTE(f1P|A^7?U3=tKSmS0@Y$o7=2E)SRl0EXz01U|dR4uSvLAb*%V*G5{q0i^FZjE}f?v6@Ui+c~d@A2AvUc};7av{D zUz(bC-fo)Y^1tci6D=KxZaIgp_P=sFNPC*9mD7RfjTIUKSV>6G=lK5#+B>+sS^CB5MO6Nl=2kGCdxRJjj5 zIr@-ax-G%7^V)!vZp_(K1#fxF&wQJC`cX1#i5}y`3BfDt0c#>>WiIdZbw6pBNi_dz zW%O&@d-#}NdP|(0qWe4H7fNErWN*F0GNU%A2tISvjNO}Uu@~DtO1@PoU}MsOy={nB z7$e!q+oAq@==XrDN`6X6!Fu?9gBFX+6wtEUQ+TgSMWZI(4%;+^dY?l{)X35i8eM(**2fRpP#wW7 zLg@(~Ivrc%a^t%e-teKr=vU`SH~yYC*F*(}SMTL~cwd8s|`#o$LCz!#yQiEFOrTg6a;Mqybwu{js5yzbjy3ZP$XaQ<eUkk;qP&0{V7}uj_z|fc(50gck%*8 zgX3`xS8WHENc^f!_}#h!j*A9{A%3k6Bz&Vg3bq; zxK6YJPix#vWqLsu?YMVqu1?m#&i4YjC++fScG-^3dS0Osn?8;|z4aOq@=b_*6q{O; zV{akEmH=({f)8&YHvyOWy*$`k+0VzpgWiNcia9T`3Qz3;u1!Mn4siLe-jKQqi1`wf z8RUB)*mtJ~xa$hNR(5Ta5_7&OCP^mTA?re+gVQ00OFge4zt1`G8pSzjB)x)#d{FnC zq*CYE!-BWsgfu+!>68y_)U7v{BXC!AzTDz!fXM})Eq{Wz0q}g;?cqiRJ@1KE*hJdW z!R>dfSI!~dV33cCuyKXDOeAH6Hn$It>Jo40R*cj$;6(H`*J#X%WtlgV+87U z`fA!^CLyWt3wO437quT>?>Ah-? zyVKX;R|}<;#>SU=g`Q-)UTfq@TlDMx>3s2aOvRUw$Ez3e;BNU%S+{QaY4=>_?sm4b zKXtLe`HcY(2~X{shFB1wmH;Se6?mHtsbp~5dj)N}2Jso4m1qnwvG*)4b$U?YYbbEm zhY9m4VRM(Vzxnx^)9ze^Jv|mH;7U-Za~-CY$pePIt#iUn=cj7I+AKh2eY@r^>16Uw*u4oFMl(!FLZRSItsruVT1YVEP27M z97D}{6RRBOl6M|zzG{yXasa@$2nn{_p8El#&{Gp#o;KM|RZj{G2~e(V5u|1+8CUq=;MpO8fGK|V%sCr}3CIZy z+#(tg=xP_^3N6RMFFTh7GD_Fa+UeRk+uJ!Qzkw(_I{OFNrBiLgkCrRHvAgxo&VZQ> zq%aWrPfm?xUJpO!5HVp-eNYyyS)}M)eBzx``QkaNY%jCTb8HCbKopw}Bc8KAuo?!n zp#i0-;1s*cDgDYO%}QwiOpQ<}jr+q$Go*ss5RlI1%3cJl?*hoM1}sYj{VDIE9*)I> zwF>aQYQ!xs`E3%-Py1oY= z!9c(qP&Taw@9PaD`kl}nq>lpRq5?!`wSh#17&3s2qqSbM4{R9_n;PI(X()-NL&h|{ zef-#w3UywM_uPQoN`Pump{zNHzMFw#GD@(sYW2o2|)B zK0XcS%o=1Y6_^Tn>r@5P>rS(^Hl@@sL zZHw`QYn#Z_orqt7K3dJ#DQy>OORro@zX4%#NIhhP`!muBqMjA38hiMRU0m!xh>`8|76+oN_Q11e8_4cV=xn{6pQ|Gg0N%Kbh z5;%+EvClxhqW}*8Bmxq^$}#QT%-^`IeONJ9ykyXK( zkqNACBBP8!*$_~~dJ$3!P|3cNMDI6dxI59IWf<;zG$@FG1dt)26tL+kn|do)iVk%q zvm6ZUrw9$00w9TYQD+szs;3ImK}rM;AxsM|wK0Xx!TIibg;rCwLX!(%*i)_H<}&g( zs&}8j384dz6tKU_?(Kcn`!>B(RHSb^G570cODMeKj$)%Jt#dLec zD$_<)REdzLfXT~^z3=;NC{Ql|2cwl!5&-yu0C zizCp=d8dH0iHsN^BX$PIeTCcK{%DXUu!_luy@KJ_1)Tki_*a?`gVl+qy!TH(xYu%? zj>n)Z3m`9CA}@+gvhu~~QRU88FP?9IN4Oq#(Kh9M5SS4KxmQCI!rD zoiDg@9(F|xuL5e006yUWU@A9+##K=R4zJ-1qj5UZMj|W6O+(*B4;(o|fIdL=Rxywj zC;(dl&}EgaDrCI*1B3hYs3E=Yh;*u#-qbbsDJFG_Pqd}=J+uPAMZ_R_$;hxg_yGpQ z7zce`z$Nd>xj+H3=qMK{5HKA<2OtK?0BZmOKxI|w0n<1Zi4k$M7105Jceb+K=V~|c zYw|UNI*~P`e3?YYd*pWIIUc<+#rJ%= z_Zb@tMxy-zq)q2wK?G>8$Ch1@9M>|F)DZRPC4aYAuO zPAXuOi))a;IkAekM&{}xzx(yDxje7g1qTIlLP99OksrvXWWY%b)QAEx&h2zNy>vSC zJjc}$8aRvVkVglN(Gd4hh=3`0A@x(m(rnRi16ZV)g9-@2K!F7AUpPSRX~RQT5{E-bQ6WZ{el3wzH$N!Kn)gy27I^qL(~%b&9N#4sU4v@u|9+)o$LcD*wjA#^qe!0F@FKY?csS%v-Z zOc`nU1`)Z`p?tWd;@hkd?Wg+)=)7_Md{)uF^I8ASXZ_!?kpG)}*4I)t ziA$7c4~6*h+(r++Q^Ky`FBUxOZhlvrU?Y5%Hp$a*gSAwwro^z7Sn9a$_(R8~!cv3J=A2{DQq7A}^i*x5r0T4MTH zO$B@xWEbTeb%W{|0=R=2%CA+dLe0>| zlXmEYUP9E$tN9@Mbn^m0=-%$P+L6;e%X+E%BiMwhI=Vzer^R(Dt?c48+k_htJ6|d$ zfqNT0uNsF)qayo#D^X<^q2J9z$LKQYw$-0hI5RuQqOsL4>57#`QoZ>0?@Bxfr<^d+ z!=sd%7A+BPG5tsE{Ov=QsK6SrC4oBd?{K4F4siwv;(f<;PY=Sqm;6JwFyC^yhwBY7kO}=z3`l|=Gbw1^ryF?+{}l#gzszN zlsYpv{cYUKFyo?I8pqv42{7GZD+2rst3X`nfhXP|p?1ANd|XEC*!@Uua)$AzmD}pX zjKi0(cZ>Awo7!WRSH&EsiY}Y8yn@>*(6rT9ymtXrq-H2Z+A$7JaRs5(*2Sc=+VEr? z*wi{LoK>dvAlLAsmjTdYlsI%U045pSD(?QugCeq%B2_;G$wHOj83h2Lnj}9tZ((l1 zx`D6_0OI8a5FK?eYF$=+S~7CB>CbgR@6 z6bMl+7mZa5%(M3P(*JTCEmiO^kLe1OUvuI;v?mE)K$~eF0F8ucOqXCzkXU{gBawo3 zG0ru1{4xJ<{@Jz^!=^HmtD4rb#%*vH+<9`?*hoe|pp>XA$bq1FJN?mM1zE?7clUgR zcvHQY>Zv%44iPG_t&(Dz@YUq%ZhFYg@p6~rUrh)F<8rf?fi(kWlo~(AIiEd1&qlHJdK~oCkTQtr>Bv@FpSs-SgYhJJ!VonTp{i( zm&+>?fgZ!7>5r`R6zhRtLCy{_Bo%nDi4rBeEm8;*=Th=EG<)5h{kq~&Uj%P5Oa9I} zVFzv->4GrP5>uOHmnOcQ3l{!RzW2H!^KJyHi3(Gtxv{|(y43bn`mdQztBo0O1({tx zRgRd3`OxM$H*i2fjQjCVkcBfL zsMy>!oe}!fl+88muc|ZU(Xo0T_6@3RP~glXom1Z|dN-Svuzc`^_VK&=#J!q?=+bM}g zLgyuk8bza%2Q6NBb>sDC$x@k)4J-jW$bUTr3pR0wWr5q;;CC;=$53K!pVdu7n61aj zqQ3G^dhtP1*Ty6$ul-S?{?2WuaiA`hTZDAQ^->n>Z#N~INpE8>V2)St<#R5|jpYR# zgDesZGbTF;8Hf_^vS0z*2gIPN-L%|=TuMfvYcv`%w?n&-eS84Jxnq$$&z6*+qvNwg&V09_GB3 z`CRHO+k8tp{v#)IeBJW6*d7kW$2}BauJ)Q2&E=9TU3n-Qw6>1KaljSH&5%?DdRr`L zYD|7oqvWA!KX-j3?~;=*4|_DP{x_g@C@VgByzja=T-0++=kbI4{e3;iv>N8yM&r5*&*!nX$J&CLKkgTMje|!oJa`@8?y6sI zU#ZSg9ILza&gB-X!n55vh^Xu$j;KBvigDU5p0X;w+k=9W4*2jkaypvL8>r zAd;n7d5pg>I~L3>4Io9rnG8TLil8x~t*=qw+Ri=nDY2dVJu?!7*p5KnB#JqDg4Q+A zYLVOEpBOs#8zvufOZJ8<6F(&%PnWB+_9Pn73$SX^0HEGlkQno#%tPzBr+c zc1pX1sNF<6gt3B=TZRRM*CCZAD2_9^5du(E6EW*iaTj{KKnBGy(zh_l$oC#z`={IosAc|NxtMTjHf60t?V7{YY^8!C7{wy5JhZ*s)jeQ2`sqyA4Lzjy=eXI1&}%5EZU4mQE%$$k>_q8Ww-tcip4;Orf)Foyfmt>+-e5S7_BaN9 zvAm7Yyqa>D;f9fH1sG)%KqM0>_mW#?v{D?Rqm6O-%)#?`Xy0H=%|=;-EeM_ktC8+u7t%-wVZdDjdW5EhJ?x>zojU5!2Hk zl4!Sp^Kaxyj~I5hBRs2uMVGFR31zyNx^W~28>sUJL`mfGOI|y%>^9QjP|gZxxzO6- z5DZGWO278nhf3*RU!#{Wa8oP_(sBK*w4zA{=k7roamB=wkYvl5`269V@biCXRA;%_FmynRgk|$X8s4u&HtZ}1^=(>m;v)_ z2Ymt^ZwrGTx)sH_hyPh*YRUzLy$9L5J-nmhKHIA8d5{p&t1@sIrt$h6>bxcdYNe&NYkru&8c>QkSwiM zaU%L=h*hD#nmAo1eBOliAYHL8o{#`zTCw0`SeXsMG? zWpDo$*r3Sy=m0SYwvH5wF#gpi19reS4tCH!73%TFP&#kZRa+PI@(y{*JB|sJlvSPM){kwO-hT|fj?duZszDe;D%UexT_%p^xnKWQx?+eP z#7k6t`D!y)gk2*x#3)Gdqg3~-`=mz;r3;~U2-$(fQF&Bq8oky#HC-^^8$KPPM1J=8 zP~fbw_53fZLRF;a{S5z-5N}a`McxGo-;kXYp5;PPEDd@hBL0mt0zFU2GOpaH2lFUe zzZ8^&#HI-yHG5J3c1n6u%_heLdWDEEs9;RQWiALeLR7hlAS<$mL@^7fU=;fjUCLB; zA&xW;4Mpt`;*1VylEi{nt`TK(b*s5^ZT68!uqd#X`yhR*lb|P}--*|CCDM?PIqqG2 z9QZH_-3mrRi8_dkc3z&NmMsKZ!YFusfTc)f9pNPHNkVoYnP*<;kv1?d z2s%}t4hiUO?~fcjDRP*`bCQGA`LQIof8&;bO8OEJ*4r+`67q|Kgz3;Pks#KV10us& zBR==b`gtz7I%3ob3aul8s-);@QXnxXQ=Y7Vb=7HYi^U}3#&gf8xF!@~4oHfqLbuDTa&$|a$sU=s3P zYg-tu*5uT<1-t7OQo+!Z^OAhT&J{qk;BQF|2eo|O3z(=q{*u$St{wQ!UOcx11;d_O zfa;fN!`iCAO=L+tAticIn6^Zb!4kfbnm!BnbupLn14zDr=bKK*#QDfim^*K<;pER^ z2oYmu!>e!!)+~kt$41ka*!HxHgo$6N+z} z5IMArl{x;jEtblYc%QTEX9jK{4042T9vH4v2H@q*EW{2e#!33q*c5ZWVJ@-S`Kofy zcx8U3T-VvQKK{0NIJ_oZ&O$>16$6NKz(yeeijuL25I(P2pyaF?h<_Z#;fIZ4HzM#D z6q2Cwo2=tO!ve`Ugy0UL4riBz~tKk}R~A z!y6b$Tb*e2P?KAq;|JE?RGHo|9{U{s(G1BG^*CAZ0n`i*#Vy@C)qz*XPj~b%Vc{UO@CYq}j{81Ug(7oe4aWG7 ztI&ARd{JP2TaC5#KYnlIgrV%TR;L;ijk^(uEOG3X0Q zAUx^|n_poUPm*VbK8lGAWz85^B$WdWRXm;iE+T6wXlp^wYe?BWrM>Sug5sBjxQ-VF zeIFDXe-3D^JNF05v#uTbDm=Ob;bg3vaBjCKyttyAs%smsH^cAqO;isI41u3g{q zQy4wQtzlbBLrVLqg!~v$Fa{hP50|4QN%9lAh0vdGMVJ#X!?LiCbysLuM|y;_a2#(r z6{<8#6!&E~v#Hy*hTB?VF=UtqTUtV#V-3axN8%}%huLCh5wtj^YebP~7Ev zv`8&Y(tJcuC#oM^S_75KV2FVMw!HbIhQD4t!RWwP8aTi^{@9|vEKVX?!nlx&b4>zX z=9;eT8|53cB+3YYbeER(LDDD?g-3KGj=XnwcnO=`#SZs*4-=zBC{r9 zT0i?Zti}HHvtU2rG0Vz$Q>A`|clcb0oil&1?^3IQ8B}@fD&tdCg}3_c>+pI;U-tQ# zY_6QkuH%W0%tgM16}~oU`8mXX$XMQFTb#k}bCcB-e3^vgqwL(Kfc7Vve)CTft$4+B z1Ebbc)%wW25!_+|85<+wONrqJIMDhsxGxFmhD1F1)Zbd3n20uc!5p?70l)@|~Hd24apeStxJ!UX%nRR77pMBX%Qf?E6;m zSVt_1sY_TxB1k1v5&|sl&BG;ie7ciBHl9wSlF(LBJP<2!8n3PQc1o=9{$ps2ps6tp z4dPadL@{A&XW}ijRp@ehI>EGCvhYF(QA5!G6W*Cz7)`MCU7N;J$yPN8490f2okhETl3mr)?9f(Cki_bO0!k4p`14WQM@iSJ0r1n4D9w$3CP@=o@I3~~a#9UZhPt`Z#)qjz;xqo@L!rLf` z4Z3?jhi3w78z_?E9A)~&)s{(WuT`XDq$4TXVe1@5ydqtRNRTSgzxV5e;eH{D8`<+x zR5swfVWG#d711MPh?wqmM(k(**lkB;3M?s153<`Dpt9R`2$a9E3hatSt$bweFbS#c zvG8?D9t^Eo%$_XD^cB9gZV4yK*D_7Sy_pOFaSK@OAvBmc3ckX`$fk!{sJ+2Ze>;^F z@aTANjqo|Z^rHn_yw_3$s8n$p+GV>jKZFe1MuvZaPJFtFv&Kfpv%~$PQKo|h68ub> zRTRNvucMpWl3Wo-=YvrB> zh9yo?#D=@GdQs|`L{zxo^SVL8C&wKKH+yvMKSY!~iV8bbfJNj?lj z0p$R~tXpFcz=Vr9dKC~gnJA%?|5>ojIkR^?rndNR%px9{!W(b&dhzHZu8-8V^)VS? zx&_bdK;)nIzATQL zWf13+KN(!Z&3YV3n&!g%Z}Z0;SR_X+Tx6((kM{r0c|yC>k;Fc5eovM**$|mu#I-k@ z-0{**R{fr~_v$B^cr8gbDLL{di3pL9`IG&&ZuA&kuiw7eWI9Q~GIal0R(eWF}aN%?@t_&T>E(QjzL85h8 znX?iDt%0lz4{Qa%{H;gz?9Ys};g!#=n-dcVzW_1Km8G=dWe|DZ zQ|0>bt`tmqoQMhUEi_FQDq(Vb%}oC`PU?|UvEk5x6cvx#JlT_{LjXxV~r)ulJ^d?nPNastMpe#Y7Nt{Hr8)R zQfsDQgE|r47P9z&ii7O~0P*Z0e-`RuASyC2{O6H> zZ)pJl*#HQD6&r#n020c#jcPDy0-Vhvi5T`<2==pSoPiSl;pt&ADD$=^%)rZVVRnff zW8B~30)H;ywSVgFe;*-Z&F(}x@yZXX&VM=(?#;S{|M8%{FxC5?{u^a&9-Qo}W4%b= zJd#=82Gbr57w-QT&c(Ez^`O>`ls(mND>qg~{tw-KrK64Xbordy>uT4(a4t^e7pHCz zA>F-i8!7+5xvY#H0fjHu4K!ANdPxQ6bp3+HF*@S-6iyFjl?YWQNt)d=f2!)#!W?(} z3+I9xsX7a6u3vmrPL$D%gav$^tnnCl^z0mGQJDKVmPPVe5y#!4ThjrMj8XD(1uxj@9xPk$yPwqSO`P43fA(KB_oO^*?_8hjs zuc8l1p+CnfHY|Kjz;(;cB&xmko=MV}FP}-)-dvbTA+$Rh()0z+&!!qnSInlFA6uMF zCmYJmW!T!EpUZSSS25>gvv*|nwrh;se3s`hzy4kC(u#Rj%WH8yhte(gB{%T(`7e3F z^A%t2-Prs;4d?P-m)Z~buC~Ess#e=M)t6U0P)3StooEN&wJt%gsu}etWvNae}6CyVEshD%<$e1H(J^CGQVCLs`Hqw7#7_{2TItOi`fy7x~lR;@x}Kmmg2wY?_;zNq)X;0y(tL!oC$o@maH9?A*=}JDl&rbZzT5 zFliz}KdHc1o-quUzw1UBz6mD)!s8P%rV-4AHi6`^7tA&p3h3zxbyaJPnd3DkHoYm! z5LzbN=^AZ|tO!1VH!RBbG)xSV&PO(m3DZ!Db_fx9)r5hl_O3+ZGSWClq@Rhz_xUO> z7b2OB8x7(@{vL-|S+2A=UTJwNQ;Qo#=rZFjdFQow$H5|j#@;UFkhKI?&SJqH<8IaL zwM1|8Vxh_2?qkhsNtDE5kvVkN@kiy!S0Frxek>H~tgDb57RJOpJllwm%4snW9tpmK zg?qRFgXA07I0-ouq*Yy7Qs*r8=uV+oKpOtuUdc_8T>mz$F5~-gDfxloe!Jwd%twRV ziXPYUoW@j-H?++82UM7STCKa&vLl5Hk{opFFU{(X;!;h&n|)UGhuZLsbLWfXhDOMb zv-6%xA5$+L^0P0^`IyV8(Q)vue_FcAymp!UScOGr&Evd?YckqE$&qWj_wQ}aa_IhW zV%`Z|zpT8!=XDY!Pj5uk7o0mTOX@44N5|hU#3ZDN71Xi7bRu7esFSRb6O$q zQ7J>6uO?{^#?x?5DkQJT+v-V7RNO3iVE+wf|F}8zVZc#?Gv5*%IxeKvre#W;(^0rN zZhEJ_ZsOsE=q0B)Q~TzaiAQI;6dZnL+r4m}sJ4MB+Ctykw#!e{7#S#9@eA8_?~d1M zMJrlJx!6=Er98Y;TP3FAlKIkqQ}Nz!U#DXV&JQq!^8xoB02!#e^f(w z}F7a_~rKDv(2_Ew5SK80IMyZw1@204@+P^cM0j$3g(9~bf;@_A5 zFUsCCsHv!b+YM=igoJ=d7eh~|kq#n+(2EcRr3grsDh5Qv9zqg221JUYhF*n$h+x6c zi>MJ1v4t5OGcV8DC-D3rl0Pmb%At?0< z?^3tjkhUiFUl!RN{h>CGM-ax?WGaXRSAt+rk6W`t|4o~bQm4Ds&;Cz%*#D%BzKR0!{lF! z9|dW1tVnDxyp4sifgzPp3PY^qmXLw$JvPq?XXC?1iuQ%JkDB(Sy1tn&cMF~%!R*o`NP$#d8ehwWXCD@E!)w&&rGgFu! z(J?X!i@NgX2k(guKVs+R!Su^}!M8TNmGA#=UgeG(dXI77hVb0p>zDmtQ@vK$?Oib0 zbFlxA7Pot$^87}RehC-b76Ef|J5-4-x%$VQad;@0K{&hZ*`IN^a^F;DQ031TyWAha zLbK)R9HNNgWX=Chn+b4_m3$=HT8h6UY=1eR&#`~EXQGmTYsvfRpmdQP50wwHo$B3n zfVL@y0tBHAX-Bu{mCs5Y46xPh;#sx{}LkIoWE~C z#&^~nvfC?iwi~9{X0q^Kcvx!4$_wdzrxW^i`?tMJ(|M850+sd(%(IgXBgfmzP7q&0 z+Ag`qL!~`qTkPe-wpHvJ_^}>+QZ4O2-K9gfuYTM8Ncq1A74``k0t<5R=m#%aMe;bs zvkCOyv>Ck$3dgS54w$zG{Wopc)(gd2`6~aDHc!$B!xmC4)=&Q@Z5$79_Wd_)E=g&k zLEeB9YcCx&0&Z~m=#MHAz6hU(ch=v< z-v7S-o;;}Y=R@Lu;9<%0cm903@JEm~pDDusVLD64ZA_(WG;K_0n=Eh4FdcL^XA8XJ zHop`{{I^rQInPSd-CC$DiW5LmYMQnd8}Bb~ePa*m{#|N&6ZiN3h3VY9y*g_0WBV7^ zLGRz%xcA9_zb7M_|E+&G^W)ziUYg#{#%$5aoy~=s=AEsj`#*O6t_jxAMp;mkp>EW5i`D5=BFO>gGQ)NZJ4Y(q>-3bbj|UH+i%|@z2np<<`$D6wykIu+tDxZk3ttTB$5O zJY;Xan#atpRMn_6yaEY^7mrq|zdF22*FQ5qV}A+OeOz2 zjrI-E_OH~qa|Xp0II8KOnOpI_uu>-y%&dR&3TA}|hHf}W_;D%9mHOATho$d^mGd>z zbMA-&kPFW_bKt=JrwqRDT2Pnf3Kn~ZqmDjsA3zQ7zI z&fKmxjtV}7DW32%-`Ia`@1N{C*OwD_wG#!)q)t?9D-TR3V3}+ zqqkP>>V7a}!Q-Q)6X7>*D0^W@M*(7vBNB$&4(da;^#q9)Jj?8`3h6M+&Bpm~r;KC+ zpTI$mU=HUtT4VlRaB9vqbM`R5CuVhG(d+fdk(5TGniFd9gHxK`4<6VeLpP|TW2@ja zkFsWsQ_)gBIK*wU-8ISqF(G;RBe#04IbZmau8b~&*p7#_Y_)zJM$4;e@J+K7XE)O1 z6SUBNL(}qYr-zZVT#1yVwT__!jR{3hKg^l`>Ez}#CH~(KDk0vOkdKJi%MYB39+e?S zL%IzE6X@6rQ$ZC4nmEvV4bq2u06Br)Ad`*qcMTTev-{1c@AEN3N;Rx&^;GFb-b=;s zNAVvgygqB9jaYB)jd8!Vw&58N&{`uOn;P{`GONxUBqlIQ!X|FePj0J7f5zw@T;953 zz%shC_c%M(I(z8L7_G;8^Xu+~MW4c@Q;)?VBze;h!F9RgNcKlWe(~1TW0FEn-(iDR z$vpPi?HTd=Yx5p$zcENxWQe=j_BnO~INifV~0crJu zr;wR={+#nnhdEEEIcylHKu$q|Q-m_4e(nwv&qZO%4gh^@WbIig2!CGfE?ASk5rE>j zZ6kx>fO4Lk)-$}}+Zlb_9c)Ml&i%3|>JiPhFBPrI|M>d($=qL(BkVi+7Z6;z#|?5x zfDF?1jAR}AKEa0zeUmG6M6tTTt8A8rZP_p4I0RHXCs@`+&%u2=dSq8H!t$vjNPVAF zg$DxFsM9t_uByT23lE$NG!zNo``AcTQ)pTpLL&(sw0*ZeW@xLHL#<_6M?6O3tO}+i zGfaCAKIEnuZIn&NVQp0e_}an_B}B{uQ9?HlhPhm<7WH_aqgu)L^Ix35eE;--NK*_+ z88@oG{`igT2g1BQW$~E~fwBu+ALMzdY{riOqV4ct+AC&ck2DRD;e~j`DD!&GYqu0L+=Pm~VA^b4_<=lR%n%LBhZI!f1+M z#Kp19Pi1$)UiHWXz=fqbuNXY!Is}U_tvRg6Bq@hjtX4ietyAoq&YMwk!dcrqih zm=WE1}j(HVR2z+xCso+30Ll_5up)#d{A$UyuGP%0?4wm7rCBeQWbvuPuf zEt6GensM7Ft35fZqd4n9N7kdstgekLj!brsX?CAa_CRv>P;vH1NA~Ds_VbNw?m~7! zdZrX9N8BT4GCk++Q07&~to+HGR-cSl>6tQkAqeZJBj?f@J*lA$n#@iO<#@z#VVAg& z+H&FC8sTKFFn03F&g7MgXeKa&s&|I|?hF%F!h~<);!V$^HkoMIJPETrN#8uFvw1Ql zd6Jt~6yD}3ZsuWR^Oeo=Rekf-&*o!G@-;j2wcqCJZsy}g3bE zy?(BfjLgoLNhDnEPg-7&1D?^-MJw4c3+z^KKaUqsCLkxs5C;qZhzIyM0pystqZC+l zvcDO_>krs7)X8%ru`skwJOt-?{Ex5aMj==2*w1^RiM~ZiXN!_ciq3TwU3gn`X|sqT zTTC@8ruh~#oQf~?UmdxB!S={GTrt5?*T6Y%LG+;cAFE>iqBC+$ea@QbEvbT@! zCebk`*~Ytw{7 z8Ih;vyd2q7vxp?Nq4(!jXD242ng_my7k#(_`?^SpA&K;wSJz-flgSX&Rknx^*aQP_ z=L(0P(<4q6#?{r}B(9RLUtohAStKu+FH zI48$OjRNAI;S!4$(*f-U#z}DA3j7uuC1@6| zFkyM@hkA~Y;(Q={fL!Hb2C<+BePANoxNsg<1TxsFZCzuu|H<0XC+k@?@Hwa(`u+%4 zq>_W2U^_G4LiR9`-vDBtF{0nds7?}$yiglJi4?R_YlN@)^7ie~M4#Gyv<2UN9p4y( zhX&vvf$v3$Ja{on_zg?!6AO@m0l#Z4tfM)_kP+XQNGTTZ13+w)38`TTT+T2RHlmZ; z*akqd(E>C8qBBS|j{twjM$`$!(j;gf8lg#o>TozUf02&~@Lncjlz@o9i+&^sctWCg zxNzGg(K@E+a8T7K8EO|RI)DcTFcG~3#1*bc?}}I*>waAjs*(e04noi&4im#r3GVcFu z;=;2}RY3`Y1})_=4+EbAh_zB0EH(i$004+7x`+pOvTns;t_V7qHE59=;hx&(yTw-p zjvAN5Lak;rqJ;~uBim z0}QKC#9G;iZ+PGaPxJ{%a6gLvMhlGup?V3Z6?3uYe4fZOUNnayb|;9M$3|I@A=ZNK zX%J$Ajo<>ra)J=Qf2h*VNUez3&epn+i+ za9NtKfr6SN8?i({e!w7mIieE)_*xM1GX>Sm6l=x^|3rhEIVcm}xFh~)@JAS(i&!AQ z$5&uVM@5#H)s6%t_b>7iPvkoWev5)C=fdVGqMbp=f)&IE4rrJnD0z!nb0MukNUb>J zECICvK<-}_kuL^6<{~e0A0xOBLHk;RC;FKa6BmRS;|hJmBP}SXYZ&wh;I%X!AX+L` zjsbjQzn%X32-1c@S+h}VWRVdJvW6{Y!h|)Gfg3?^UoI+w3*RIQjjtf|@yO>Z@Cg!> zPKGS8U&rw-?jrp#Vu}d5-yLYwB{KXQ7hZ%x)sVnb7|~7u%5en|pu@`%xJCeoMJ6J7 z1@;*)YQcnivJpHqn9lxjXXRZH1~G>g5xCU@IHGR}2p%5dungq#Iikq~F%}6}aTC7A zgKBb7Nf+S|?y)H*B7h9P!dp!My!Hg3H1~E(VNfGvP#a4$hBJMKDY(QP$!xLr(F+*_ z!J-131|Y>Ks1dZ1pz3~VoxPv&HIBbdK3M}dhL~^>!XHG&NIXlK5FsO>cO20LfY=lZ z^-dtN-|-@!Lp0+PRg=$Yus_NLhc3;Dl&}+fjG-r(kWe0Qf-APlL#(n8{I_D0D?%{@ z$je+`k_n`pfI104&as3hf{^knUwIrPpMt8R2yZgMAKd_*XcQNNY9k;%6GWVd$X^76 zRx;=!7cmb&&9hM#gG3=a$aiE=K@e)5FPORyYWYQi4ik_%m}zUaSO8$QH2|o~N6wKE zZ3Gmy9a_MJjI&W6(PCV(5aYQhpu5StDK>^#q80M2B>Nnfb?>TywSsBlMA(P@hXJ>> zeR+*{zP*0xuk5$h;m^3bJ?**79!fN6F>zfiR_4b9AH2-&eoBdZX9g zs*=mkHLcS8{dxKFp*M*?+v>7wZ2NZ&N2zMQuF$@<;xB%$8a-~$I#g0V8{t`@g$%o+ zHB+6vOXHgE+112>9POAk+ue&Z1H0-BlJ&zMc;ODINMD0@=G9+2LU8K4;&LeO%WcP% zAhej-tdGsZ%WmB&=|+)f>83LhQI%PqZoZ*=)>`k56nM$`R*0K5u_~`ByG7X*IB&01 zFo|xRJvp9CM_`75pRdL)l+}mIE0%6~UnEVolF7(}j!~62J%fJsT`}5XeUTuImVxoL z2_OU4eS@lZT@7B?8XPow6L$BY$!D5@o7sHj-RDLx6KrxXQj-C^}t-*2miyqvv_t1cd`*Y(E}axq?$I$2t`{Cbfl;D0fq`X7>&iY}~n z3-3L@G?jMSCzn7&a5%Fk?$?w*AVMv4A5Xv3sy0>0s8KBF9nxizr*C__C?;~lM&GKX z>jG4+q-iVrf-<}+<13ij)y&`~quj@daEoZHj%JO*{uzU)_pir22DYZVAsUKGCo{F6 ziXEb7&aT)h2#Y*k6@RkgDAo0;aWRHuHL@^Mroi=;Aj7uhGC{t1W`28NMm+lkcDDKPKm5J$J6aD%GF0&w*ACTb z>@R$zyXwE8_lCb{({D-0vw3SI<2wBz>tityrQxQCWDmXQ=*b|WPKSU)eijzKi?q}2 zJ)~hiwWq&xWkn?&v$nlE^2ZZls|!B|H7;Lh@!y*``>+OEe(KM`i%k29FUdFcT57n@ z#HRSZtsZV4H-sZBu0md_byKu(EOeznbVuk$hShdY4e)3>%oGHr;jLHlsU}=@6Q6+o zrf@eqsov6GNQA$yAky@R=5bjZ?2=<&MEmaIXb*Knh7YJUpDWmb;sg0i8(Ce(ZVT7r z!R2z-{zAV%p_^3*KFfcwb*$TfGM9vmCdp!3pbE>+_PHA7r;Z$EJU*Q5C$1^`1v4kv zAOgQ61`K?>YS?@Fbn}HXeW8lKI~**RW3}blZpi1|y{7BhEn<``B_ZicQ;vL*XWb#x zI)azAF&DagWJ(lpm`6cI0zh(;1gr^H=nz#vUN%jE9$}@RvH{>dE0s_JnJUiCFSsvS z1x?&^3Ru@KYP|48!z4&3Fb)9LEhY%tia4VqF~B`oAsihy65P59l;KZO@CPyk@1ugi zQpI0H2tlLb;{?c_4OQ4cT?)d71(GVJ=!KpIhSvWosI{;b4r5VIwG%)Z8>&!0(o=*Z z5BO~9i}5b!gAC*GGBJ9jt(v(<=6{^U{gL)Y4?J>{#w+$hq8#na59JpYlvh2Xz#nvu z#VqO%77b!Kb^i>Wc>U}q(qmpgdPsd&T21AO}^ioYc?$`#o z&*pdz*x$EYf8Bf;5*q~BKZ*a66$A{833+=C_Yx8dAA4887usTag2~G!k_Nu>v-GzX z9{0qIG->YkLnim!2I7)zK1V9rwq@R|KNWVheki@r^23sSYV?R!;Agn^qXY4G!*k&M zg%6HUe>?jP-cb#ikM^H4e$)9MXK~g3fW;$k9=z#~OS<s~ky5-yvL$*H71ZWPe8a0&EdruE&9bHKTLbZ*SSQ;uu-{aJ`b#DI%UGl@9k%zy&Mnd z)`q-4I=Du^--UVB7(Br|6&k|Is zCR0je`{@4OgZ>tg#Q!*p?Gwv)pZNGnt>dKwBeBvXIgIM`tjC*>D?i|T#KYt1^Ml{1 zyWB{CQj~8DI;m}(R!o!gFB2fAI50mZO?-ug-gw_yait%m__mXoflNS`*G$YUvY!BL zh_zW<`RF}6AXS4ylhH4HpRxMDgK^Mla2r1@QF;&e*%l@9s>AzpzjK zKb*yuf4qMD8*<`u)NETsWLK)b5`GZ(dWAS(*biE70rELu6?F_b?fNfZJ3t{8VQ1H$_yN~0^Rh_rbxA+Kgg9bvs_(Q1 zMHVHoAiD)#+aan{M>c9PRdtev*|;f>1xh>i=xzweyd0;>KIgVRm%cvN#`}=ew%QW& zCkciX@-z9F24pId#kd%mc9tTX?kmE88=@jU3JVSng?#VOvW2OX~Li{lH z3o$}d=X-+*c|@1C1m@gE^^TY^d)7(1*l`A}|CJ!4r;*Kny*MK=o$|gzF3- z8!BB}loAg`vjO3g5WnKa4?&Jq@_e)3GT`{6@VTJ0^DB0z32CQz7BM7PIG*9fF*W{`J z3?PCh_uU4+Sdo13 zQ`H@)Frs20>4_Ik0;G8lF_Q7Z9)$j|6#B(cv2+&Nv?>l)Z5aTEd;**@( zRg!72KnsktJII0xZrwv%fGU9LIYiHiX9y)zq8w?#Ogf4M3FdUk?Sb}wrP^~+bvYC| znh}78o?W9^vYS-fp`Z@R~A-`YyD9Wbjy|F&2LK&-F|Z)hqHFuwhQ;u71cm|VTKM-zNzhpqR5svMK+qt9#}H3G7)l04 zaOnQU3>56hPkF6KY>I@;q&S;F{{ZnMQ<+1Mh!wCR0UFE&kOWPyk6`iH6fHI-wisYh zMUP6S1(?#mkAe$+f8>9LeByn#?Ml7xEH9JKg+>6na3!mLBnN+j>>ogLJW$2(mc7eCD{fSF4%d&(2SQ-1E5D6 zmbqXcw<*fgQ8fDwNl0tQ?D4i}g)SW6trnZ=0b7sXdiGfJ%lkn&vjZ5Y*n18RGO! z%#4)6@@LQ5a^=D=zSUpsuC=K$O#Gop#jS#`WD}dbl!#ZmTs%^=;`$)ioWH=EUaYj! z7~xZtR{)v5(rB8tt%&accYbj=_oou+(hFPzyR@VE%yv}-!U-{?i%IiT$ zzR5;bJv-BHU?F>A!S?kR-5@4R+l1;XnmJ&W(rJm^5|-Xb+a50x0q1xIrDdSgN^V6Z zY%qdL87Evn9(_#Hr#Li58$2kftoz!0HnhpbAh4${TSP(YRIem8Dr!8XJ;b-eY`vMD z+Fov4ccyS z;G98yVPX4o#cR)Bc-?IkI3$me{o2A#oS^un1sx6UpnI{vCM@tFKxyxsR(X39|3zTq zv#$O7hL@()m#1$TH%%s_?cCMeWym6OJWKWw3-A_t^V87Q0NV#}uQ88mh z>SP3y6i#3Wt|+?M=$M}SNmEP2#^`Hi95@SarCizN*S0D1X zuc_(>w|Mow&9+9>l zX_eHK0(W_lgMM&>{#5)x9)hG-L0AUKx8#Ejt_QqndrTH>d~|y4tcoe|beG7U>9;wy z$=|}S?wfv~>AXOf;6s8pCIS{9f{lWe758XS7q(U72irdQH zy!T)d2C_!D;>M-@?V$C&5bO8;+jn{N_TjJgoRv@5Pew8+&J=pU5dFtph#wQ;gQ0&< z&rBKUu${b?X2J?e%GBzRq4PyMCk-1F7wBh9xZMg?$zUBNI$yglm2{?lk(k?Z9W`3>NS-ijV?aIzl(az$Vo#j6}KZN-!()^zq{8bbF zF9-gbH-F*D&iWbtpEUkP5r4Dh@*n<=B^Irc0hVb^ehEm&d1rblf2s4V^uBZGr9_oe zL9Hh%hWUOkm1Q#mQl?)TfZ#Uo98@4T(j^0nF*CB%%`jd;(< z@VyoRL1)J_2NS;7<|*!uE~xh?AFubm8~1(7Xlb%FSi1hiU*qKu56=8r{{Giwh1Zj| zOD}HQG-2j$k-^F3ZL_t7=l=|&Y4ffsi^)fBbtce-ah_AnwYvrnD%^3qH4BqJj*zSJ zuhUN$hdHa{BU-}SNAz7G{@-Gq_VRcHoSFM9TuKHY@N4M(C4l%$#q2QYLmSV z@sl^E(tNj7rZ45Gw&r_ULevK%A~sG-9}~CJKPFX2Q65C{T|F3k!-u%^U6&-|ot2$7 zQXJ5}jqw9&F{XJF?kUKLG>smf2TZ%9RDU$;)}vM@Wj?(P=&W^f+;#-lncnK8S(iLE zq*m9K55tDNO_)A0_O)~V)bQq}1}g<_jxD3l4QP~SXg*koNt2jMQ@AL(IwYrQoz!n- zkzSsMwOdI&q;e~gm~Hgj^s2haZL z-G`uR*B9E3$nyP*rx=c>_f4m};9lFIBi2qADI`a}cQ_tr3Xuwo*?yI&q3fULDBH|b zg9qQZES$eRw`YJ|{i@DelV9Sh`N#T5vYDZix!k ziCZT+Yf8Kw6T$VA5}kD`IU!HO&+4DkAHg*|(tpa=dAO}Vy6>sNjkpZMd>6eQn9b7) zW=iE(byoTzkY(NE7*qeVsLd6_hov(j=EKaYz>9yrq(wRH|1RmI@wgKBR7>_M&{<=D z)S+RyVNNgVz;DrCycX}$_*9`Q_@`6u7dKUPf+Bn#zL9-9-Cce^;sT_}JDE8K$N6=> zP1C;KA(SZ}s-EyvE@4tRO}mIE^i=Lo(wFHc5v2=h8m6}oIjXihE`HHzQ4JBjKVmqB zIM&J>OT)33Lby8gVq(@_;iD0&qr+NHEPg%P&$n26CMdXLJ7s>kXk1J9a~FHFIKdgc z!rGNW+O#*Kx%mh9seDsr!C2M%mji~E{Fblj|E<2GaA*B8OQ7T4&u z9ZI|3QTkO1QnCY?6=L)0bPf1)MtV9`vT}0#^~&HbNSSJ=g(DG>&rCm@c`8GP?Eau{!m}Hxf9}GF)^u=W%sU$n-=CTB;D!=F(@Y@NU(~$ z07-}rw=K(oHf$X8NW=11-HVH>SKS}}>~*f45k5$Ovp%#I?lHMnC$(Y|(qT$Bu6+ql z@(Gn*!={=tgy7*`RN2Z6x=xp{6O-qzZcs98$WY2XUD~T~vVx|ekep$XN8AsxdM-KNwS{BB+^}?bkX;Rv{pvq%WAi2VxF>RN%Yv1?HwG-;#pl*iZR98LP#so0Be1x4*SE+%lQ5y2 zU_zK@LXeAuTRx^FENp*XG`QJZ>6NpB?XE}Xn7C%{E8+?P0>c82J^~>WZYl4|8^R=3 zJT^N2*qwbX{c@PM?HuH#l@Cq$79IL$D@ ztzKNLL01XxIpiYAzvkGlVw;z~)iELBNhYdjdhE&1rm6bA`kb1OKl9Iw6!TKD$vu@! zol*Y-Z-dEehbh6o>YF_<>8Sh%J`|>b>Fy5~P+F>aS1ZhgRBOWE-rMW4HxAc~9yd0K zlKTm>Qk@o$OZrjr(*NdDnGMdaE`wXY8s`uE>U?qO5;+Dlb6+kPaiZD~>LQlCxXK!SuonhCT}7UBC4BsO}k zu>+=GJF<;NzR&N`iFvzU*WK)@@1^+cR|+$TCuYx2F5lD+eQRTfC03n$zFM~H@q)dT z`PkK_wJL+hU)?U7k5}mauJe4nc;t!s#NDRfcTPS2<`=k;b@vdXaeD@;Dbp>Ixq8L< z_G-V`2niicP8AGzi|UfHo>jzt_4$c`S?U2lo+YPh{9^r}7M-6;CD`Ga@X z4rR~3zLRm}p1b^@Cdr~xUB61-Sd2cI?tXc-Yi)hm1B`YjlmaPZ{nA)N=afQ z_{>KQ@q2?X^tltag^~id)mT7X49J)Tvc!PxS%Uemjf>!a7rB4pKdmAIq$~6JbsQ^< zwQpx>8VobK2Los9g*0Ih?JPtWMs$EB+QSQ=K!kE{L*rP5;ns+48&yoV2%aF`M*BUS z|L^S~XxwK}UB1#T zKfFs>d!StVxw6hgxy~nL-MMnzWo5nfa=jg8JhTFjn$bnEG!=u_Av4^6eUjrGpg$3} zV}thcZSMa(a$?WX1(tD~ib+z1$t4w2Mn&J(bko8LvrD0ERTbvt-X`io5|Swl{~oJS zieWxqWwU?!W!229J1SP|Dpt2t2uXX)psLnVv#*hr*6Ni+xtmtTl{S`PR{FQoFe!{} z7S3|-zH^FCtyLY8DjjrH9gX)88LCcg0? z+nnnDYE^gCVfP(X610lscGFEt&CNVTR0g2N_5)#xMuJDIK2>_Sg*%|Cocz>|9IraE zu6j7>i;bJL*bWPB_{DTWFy*P{S6$`Tq;|BaA^@=0f1t`gKT!LC8oa!8;aOGSvf8n+ z@BruFM5VHT2MRuJm9x9Md9Mk`A&O`R0ntW*+g69UsfQn_4i8j6e!Tj4oO(o3b;KpU zdL*MdGIuWG7629th_0@VZc>kFua4UhQZ_(Dp8uEr_-niJD=(gW3rZW^bL)SM2~NID*olms{!Mlz!&IalLs zVa?fF8u7~WFzmcYn?^Vl)}X^N3{jAHH1h(dcxkTY(z3?o^_t5&8Wdnyq!d$)Yf~)+hX%DYw^|zN)76)xi@;kvUu;@ZZQ3PlI-@o{x0bH{>BV7>i`BK6 z)wRCuwfnm&rafx2pJQ_-YI8nebLVPvr{^=)Yp?8Jnb0~W3YRApb)_jX6UxV>2jyQ- zJp9b=!x8(s0^&y}=oc7-Ym(|~E-kX=zTSdr))m&*-O{u&w=SaM8rq{9sG5xf(KTar zjnh$gK4~`1)i*6`Hm^r#C8%Bvl&D8(wMfO>uCMR!tZ&u*_H48M?s|Re*oRSE{osLy zdx2W*#~a$Gaklk~Kv+WyqoE^L%f!EXW+gQZK2Q&R=`Hl}K8XkYr z>bf58a89cuzv0P_7DwVn{R1CFV#@wc^HVz2A-dYV#*Mv}+I{*8sgXY+QIPJ^EwbW^i9QEoDRN&`-{=FArx1rk4CK@}=#pF&lK3|Tl zoA@B9YRzqv`WM-EaA|k#9-T4uJ7d)At}8Tk67pZ$$U(z&4bc-XFTIN$wyn*$eo|mI zHgv3vr=7&XYDx;;-qLw@{mw+A&ikhCIbUtn)~wOR4V|lvA3vQqdQJhf0{FCk=d)bZ zi(4r;+Y{pnw&Tij)9Ovrx^dGIx>M?M|6)ffUJJh-5}Wdin>zBHOMG{bz(3J2BsLwl zJe#ZgHMeOdx=-Z;=h4LX&+Sd$lENg02p~-Nw~40jO`*>Mx{>KJv*t}dc63*u%`5hC zDhI}@VL4ncod)!Y*OvJU?}W=QHqF5g#+Wq|TPE!Z;MGGXf1vbM3Y!`}2v6k~BO*%% zTb939H*Ya`Ru-JmCcW*Q6U%Nw#v(d@lA8a_HLpa|aQ?&!B|qgb;KgmY#=Rrr7U^rz zCshtF;}mFI89ha7Fj3nN^uooyw8s^Fa$)i03iSt9QCH>Kj~7W%+l4FN#+E^jl_Je6 z&&Nu03%YG0^@LyGkxzPTjP#7Z90tvxwa15XAF{W+bY5o{uQJlskMN1$v@|ZWe^Ax$ zPqMpK;*09hEZZUWzp<6Cg-t(*eP#DJq>l=Sv=*5w`(*z{-3uuR=)>=X?33Rchoup9 zXKi#7shTt*&Vp#XL{u!Ls+-yv(ST6-RC5@}B+*9OABbrHs?wWqF=s=i_q6JXP3uIIa(xvt2lY33PY%sJQmDyBHi&I8iA`WX~WSXiC z2Aa608m$qHT~pOnZS*gI46^$T$sj}KQxjJkleHgOG=8elY>yfqWDsVf9}C30r{XFS z^n`y**K;^M2|Chk)_W6WJ$)Z7dTW}r*;uXN)`SEG56ebtrEwcQE>)o-)v&L}f&@~d z5H-hpWj+kblX~>HsoJi+CKf=eQmPRr702$?E48uUQjPF7x{V+m$5c~8qRrbLOD4c# ziKs20rIz+uyt2_70-6=Hmg@)%t$O7mhB7LKM^An)c}Cq-Td@ z3oreaD_R$I@3tVM9{7=}Fl(dI0We=8MqjfA?4~--rfNvOFdynU@FYctnJV~I#3XS) zSqRW?qYo3(r}W}oLDHo?W~3fVOpnY`FSapNvcozu%SJbrXtGVzOtb;*Z-yRgi9Me_ zqkLWZm{H99{YyVg>K+)sKddjzPmSd_;kY2{M(h2PKoh2o{)&wry4M_UbHEiu^CIeV zdrcZsjhHkO65orW!C)4FE=>u_>pH_L{qb%nXV9 zm#FHEsZw;1(WuvjtLv1L{P>t_dY69P&(|}%Dy`Og_&OnMbWO?(*-O+_ki&6-x~fFI zZQvxY8^1*C_wP|TOvPhU@nO_+JmPuD9(C1T6;7T42dFJDKg!tX()4vOsr$Tu*vdgH zCSL_>qd!YkOg^Z-O?@y#)v+a};&rd_b<2kV)#${l$IPoE&e=k55-yA?XBgF*2!vVqph?kFnd%MthHi^Y8QHSyr?#kw2VD|DondtS{lv} zh&7~E9st%gm|=^ll}@KC-<*m0K3*Sf-X3wjov+<1Leot%?=V=FPa|q%?}yv~K9E28 zLs1SpE5ldd_whbCXq4t?i!PrxY01dw!6v`3Nu+L|ba0~umH+fA-T%(CPawU_x1#q8 z?&+8(GQFqY@~C?K-WFf46S1*9@+Ya*wQ1)>Pq?}Mc%&yWd1U#K0c>#S;l&HOYO&Oe z0}pK-uRlH2w7R-)?s!Z8(d}*<+n!?&d-)dJnBQ4O#|rHpPCK8dRC_$8ci`12@T>D; zokcwz4u05dBKE>xXwh=Vc_Nnl*xrY#6@T#!C;?|W)^X+Um&|5d!{ctgu7hd!Zq>8g z7Y9CSto4NZqla=@zyJI6Fy%A<08hByqnU_6Z&>nXz{9L)~Mz8H$^Qi4!l#KQ7AAt1; zD>NVl#-zwhQjh@a4Nx~yL1=Kjc4U>ZX|Qnl+>&5=d;2~C#<>g|r=TXS2G{4s!QDH5 ztO#InQ)ZBLs<1d*n+kTyS9QbKC$3%zvCER)cYM4fFVx}6UTcP=S$>$)RSl17ug?5% zmm^`xNA4(Fx-uGPkr1t3g>6kao!Gnbd zj#dQsSARBUq#t(lxQoSy?qt8$d4JFA)*9(yyH5Q4i^H!9EpMJX{q0T5487~X@^gks z=hJW(`pEp;)XOu^yKY@P|L4aP|KM%K->&26=J7kX&+Tli&dejwO&c(6E(atY>rU8G zEq8%yDEgCnL@sY>l!Nz;l6sM57czP_6=*BH;Px#$*9#s42)(eE z1M>0w(Y$uqvr8`>FzYm{ZLmaEk@>T}eqMh`vJIovk( zRPW`?q0xQA7sN&lUK-vRHF_Is&~7-D{YuB=YvZfuk7q|cU+mvpdgY$Krs^?FaQgd- zYa?Ej&b52tI{wn(Ynay|Eu}l-hjcZbNe;W1eIIu`X#M5oD-Wl8`^G&3v=6^Nyl*y& z6(PtWIx-8=bqjQAm8D(8$dN!sAWqnjNa#LSaVUQ?0y zo%gPAB^G}Y=Xv)3V(%^7qTaiHf106(VQ7S*hZGP66oH|0q?ATb6r@2!LX__Ac0jsI zB$V#%Ryw4lTjn>o%YEN_@8|kG=Q`K*oOAB~;rm^mwbpyRUvJV-p%Is@CrY8*p=fge zfky+L4`26sg&TRXt4ut$QZukD;ClYBzw>jizRDjrHb6>fvMfg@rxFGtMm zFwo>5^VWzrJ?>`Aq}d}ia!G#{Z=gBuwM%|<>|A6cIyRl{4vai7Pac8KP(n;=QO>Ec z{n0B7t~Z_$N6}P8Us5#XUD7Dq$OPxsZo>WKhIVIz{S`veEPj+Xd9>F4dpNX`n$Z1-!Chxo2!nyNlnRdw`fEqHn*jX>ccoIolMd<9#COXcESf}#P{wQl+F z*DbJKt3KxZq*#|SN*J;<+|SXTQI=B}foC^>r(>p)re4)d&l{m4{%Sr;SeX3StXPoK zWP!YUsfDf&PnJV70C>qLc@#_%^rR&^Us$~{LRHE2vzJlG1A8n_1rH`wNHaJ__&Q!< zM40*z6Hq6zod%YVlp$)JSnyhy!wn0o$uBo@y^#Zvc2qm!QA|6X3HP3BtSH zDX$W`Co2{a!juG6R4)>ciF6?1#O!2JE{lx4)&#LIs*cq6wGVrL@FZV(l1V3TFRqmZ zc;+a=OGOiv&`$WYDRxr%nITY~A!tRg)Hy|uX)|&1Aj_eWquBa&RB{Pkc2k2E{6*q^ z!i@6j?fL4&=S>#LyA`GnS9FS8zC^v9dX_CbJ9*FJEGlYgYE^=@^tH?TEIslKiBD(upSc|r9JA!NPfU$D)!omOiQy9eimy@oWi-{9HBa|5 zzIN7Y;v(ba{M+9ZN1M}QN?wp}KFUs*$VenF^S3H6WYE)jsyLP#J-R6*l0W)M>;OxY zh)4GB#=wv|JS+P!$C$KcDxrp=AXg>FQqOg=J{A0dC)28Os$=?1$=HXQ`|;#bQ+lzN zj)fYdIrzSJ^cLA}=9BpF+Qr>5$bN8KK51fI;X7qu|N79od{Kt(;y zEjG`nD%0nW!mH7(ZhoC+7S>E!LhP_f-}1L+5B6!sFt(3%+QT94THX#I zI>^NNzPfj9NJLxk^028Wffk~seG7Y8Z7ef=-0`x-b|pZT@rQl3e? zrKvK9L+K?9%qVMhN4aJy-rY8^c!&IaTdjKRMUPVm^dXX_sKDAfFTm}i5rg?eCq;H? zqmqTG6wOq6>|sS%rKQ*wzxXc_0ab92C?y;1$e!n+ue&in9%_*uF{!PS#K z=hVF@_V{HO@?=1Z*x}vA@G6_u*-*^n0Vn0P_4eNC7AwO;*M})zbjHtgGvT*)CyzGf zh|ZH^mJZAMH#a+#&fj-)U}CZ`A;%=!Po}PaJ`&rw_RatGoibzMmy#ML_%~1Fm~U^^ zZsC8a^%fFcI8(^*iwd(WOq*iY^5OIRt3D{utW+YDuK{`OwD1UKs8R zV~vNW{o|igO0Q?H8ict_;~MS{wS507b^Ywsx75S(@$c(zLND4r(4R~$pS8w>_0D>I zIVD}T`*zRLWnHQ2-B{b@)AtM;Yf-1$(!|K!0P(|v>$4~2GWuKXvoH6GXTR>o)hBgd z|9Ua|aN>Nm0(tuFp0~}(=5;h|A~aVbbRyskIDC@E7X5q3ef2(MsXT+Rpbs|VgHDz zmmY=?V@pd;3cSxB{{{Q^;48TYCr}lCGOJ+vSL|O=V~jO%4W>I)q25Wc~(>k0|KcaNoM^GMc=V&uNO4YJ-*ZERz}e$ptT2a>Fi z^_9TkFp-U%eCbQ;Mkt7FeDJB_5%q2aU^==4ufmts!e3Y>$P@(vr2~fW`%;*gtG%PR zPkrENNYc298!r{gGWlO%|6a1q_U4QQC8Bqd@+X zK(r5jqnO3k`w2-bQ+MJQ=$mDezFgbylNAmu-Y;h5Zc_89*uO%n9zGQI&yuo>uS15L4m7kh0L$ z!LX_v&*6xs))k1!^eQFr<<{Z2k>3@FDbDI>((JE5OiH~bj~qylaYE(EjXg*8Z|+QY zd=3ErBZvt(-2V3~^sK?*=i!0!=pAG_}>Sr`s}! zXu%Cxe(2Iu&*IBCkM9LYJv#dY*EABkc>$63kZUHP_uw zoao8A^`W!Z+GRg!jxbxeU7^oDaX)!YIs5jwvot%zBV{KzTXa>S-(_k)^`s|T?6|X{ z|Ml7aTQs5^30%biPnrV+KqW_#vTMNi_CXpjBuAQEaWGK#Af2i=2L)mp40Snp2O-Lp zms1>yOgzYds^ltabq&SV9Axr^WC{1?!e4d`r=A^TOAzI$`YDd2(;Vi= ztK_N2xx7ai)R^IJd9u9F(O}j0d6d98dP`Lk5$Wx|<2E?U|u-Z;uO8NwnY5u}*oh&!YJOk!DK?J_x zt;_n2s26yMw!q*|$|}EhO}VOM9u>O9eCnF+z1R}|gWtN>!$hn2%FVL6eDy~mSNXwj z)%a1!H?H`tzY_JH|KPWx3b_{n1N>J6?!&&1)%&ZcLjD&1spb&HZ?%~1`&5e}>NN*l z74na#`)kAb5Bux>+mSz=&-~U{eaElMali0eW1p@3AI5LB zi330)WGGLbrhTi^3HBJI-jDP{74ny9z(&mFS{rJM3k^&d0Bl#>baCWLO8o>&^b7eF zzqJvQeFnRp@D8IFIwrX-1_}2*u%(-?K6sFTCTM)GmwOhW+ATxaa^-Ke+b3eKl2N0; zc#onMS~0Rlo71 zB0!cOP((dUyAUC7H*KUt8>P#)&&EuqP@XD3iyRMsid*uJLwNDkV6F2+m!B(S5=R32IgZSkr9 zFdo<1X%Cr~lre}-!y}RJNb6v*1eml?APYR)c8{;wpwY{VDyvbOcBsjc;%xA#_9Foi z2d~kNY3eoMA4la#Z&D3V%4xfzfFd)sVdy|xacb^4e1Zrsx|M9;-3~_gqru5l`bQ|Y z7crx%g%|A%TH}c_5groiO%}U~6%LWKGTNAXrSI-8c_D=ZsG5Vd*<$l%sQRGQG-Buj zq_6~9{Dd#Uh>-+?H!#t5Ay#JHN1hXJ1xAd}-|88D29{O5sW1*up6MqO_j}KwJ{YKT zaE}N$=f`AJ=!s(|eTcOe!nfXz;(FnZnK%KZPx7Bz_w-X&o=7sUkiwq08#BoIyE9+f zNf>B<5f8NW#N_mL^6R-rp{t4}1cqS~K=oJ%G!_I=vWIF z@%}lF_Bb0br4+h#r}kp2dNO%mc6J+{?Zq_^X7TwcfCNEgchMftQTNSBvGeW3FU=cm zY|DgmM;n`K4X_9fdKG(`J^!VUf8|tN@DH64U<<9w%`jz?PFb3P6K&pnfAVaINJGk0 zw0<9XOKO|!E^N({F>1gMaxpCGgoX_hFvh=!^$l@V$O(pSeE$BJ47+qqy1Ka%_A~^N zJ^^*2ISSLkmwv}|zn2whT%2qI_r2UCqJR2NgCHQO-{rLHr>-e`h8N6;aGeiyjaAkh7TU%{;_Hj})U@5d%@f{fP&lmU z#b#1Klh{O_bIQvuI*5I}dlKb`!xVJ{a5GQ5tu1Tt!Vz{X9>ipu4J^hMjM<_1utlng-d4Ak9P2- zQ-zi%;Nq@jpxJa3nT@@JolSPYkxJ1clnk$ueEFn1nZ^4(Sto1Bb5McNN^*K*KYFV> zV*#D2c6?JOBerkc<5?m~({+BgKWUdBwl}xoUK$hj=#Vk&jfmn-V!c6q3;w#yBAt7gQ}47(yRR(vL(ej= z>uI+Uad~{Z@`^yxX^$DaJaN2deppsMP3C$2!? zs;o)Uo(=fJE7B=@*JSUU4TgtSWU#AzRn$8hitnq)66*a5cRd?M5WmlnQ(0F}n!0^M z?7f_Np?N4;o$HhK_5-Smg>J@_9;x!TuQ&D|bV&L5jB#$@xUbEhRjygw3bZ z8DxEJ@~ZN z5G$95(_hBgUcOiI-*7xnoIyhhHQ>T`yllhgQf@qJq`V}FCVuq-OQ->h8oujOTe3ja zU)3hmw;Squu?Qil?vR7;MJ8P=LEY|EcWL$Q#nxUd^MzISn8NoHr!Q87`>Xq2_U)&h zU!ce|H3NR|gLK;OYx4JMhT{4TvhIBUsv1@^k_|u1dpUz=RE^cxdHFDG2eQl_9NTPqK-nBvAOF0R&KWP1EXyK@i z1om$o$v=#i9A&-))H3qF6Xky$EonbTa|~l=_rI0!!oT)|@hejf`F*rZapCK%7tky> z|J-#oT56VhUQ?Zp; zi&CsF&ik|Mz3_#dU+njZpJhOm0{Gg5$M6V+E83i}P#TUo3Dr)RXFvxkC=E^xX%`1c zviL|$lcI?7O4OZdxT>Ix#u#j4o#j{-B1kwPscp3yg^8hYR)R@j?ur~vN9BsFX`9aH zB!{tpsASVA6j7dk{u$d_cO1?&gg1rxTADvw-dcL_t@X8c;j)}xGol}uf6a`4n)fv; z*>U}AHo}*4Jtrg9d_6ZOD{noopmKdZzvRbg+4qE>y|4=BrA#8SV9=zfAuv|v9=1wp z8#n?h-_lh6;_M!&{ftCc*@$_pKW!>dGXR>Bp}zHD4mDa@m2GVf zfe9d?{Ku>eon2!oY&@{2Q$yLG>E#Qez=ei-LRp`mX05#EVGVa(3AbQ3cBBD$zh-4j zmaDk|4t7l-01xhg-{|F;WrwIPDdMC1FO|)h*P!a6c8?@*zWv9nb^0`}3$--+B`f2q zvi)b)`k$DUk@y+ydVt1^d&5VXE`%omcINA8;tWp3a^2jSQPje@KRg4nb{EM z*Q^XWR*&5_GNqm?dijMB0h3a^Hvx{OcH4iImC-IbMg)tdn+LOJd>o)rRGN^XRnt=0 zrZyFx_Z=mUY&`VTxsW;>2T1aSgH4!ocEsm0tPqoywFYxkm`|9GJuZk@!g!Hu$YGLO z3=M8VZ%z+B_s?Nag!YRc?d;#<_RrUn!~{o_zCg!dl@P&Lw{sttj4!;T+z$*HHOY0;c&2b znDa;|+2uTL$bC;p2EgPcn60XiL*OP%xKTW?p(L5FAQFi%v`O#y^U`cDI!8H^Q>(M< zfv3I9SJ$PNk2wB%*6Lvrfkm}?69aCA_dLD5pD=K>G)qusxnO=a9^rAzLe-0Q2Q8@# z3)_*26i-nz9Tbi5UZ>}P-!p0_+wsnp5R+4xtGbbz3h`lEr$#0_c}gZPEM?p5oc2p| z?%^YVJ`xzZDQ|8IriFcM;sB%eXJTN4$H;^jHa;DT_C79n5wul$|qC z{fm<%nAIxR8kLptxuhbiI*kLhG-GDRnl~10?S*)umS#0dC~i;(e>NI+mLWR6oyH0AYlYYnU#IVwjG z6`IK@O${X;Rph7?{+5+d5>jYssx&=yGIdm0)mv!&vU~c=+0lmvq9R*ArI`hqY??Ag?D-H98E&VKjo%?f@%l9?2RP1SOu$LxlRPd#SBo$Q!W!HBd9 zeoUcsgkQYKt9m11iI%`Sb|jO(-e_~_&$Cvn&(Dux1KL|O1iHa*DQ7$iX|P_f(q=ixn1d?slrNh&=Eyix{@(`Ka0vnneMAL-$$Ah=G{F_zH&+a zQ-t1Meq7zqf5`~^lRWtqn1+gv{6F&Jve|C>o2_=zF)~&1Z?@Xm`qe{sK3;uX&^dQ3 z3hflhx|`{9zkXb@(0On012dF7`Sh2ME6o$hQl`hq604nV4}Bfe@pq|Y%wZh9s1%al zQpqxcVE>v*#t|Rz*IRA8tl0ncRI*#n*w9R-mx_68u zW^F1av*(=QC$p!oadO+V(NF7@bRET7mJi6*#*o3lj8@ig{cf$F*AajDDgCET{XbZz z6o0Q%D|z`3;TO;GIckZo>XZknPPIFGqUw}?`es?P2tlE3mcRXGMFV<}m2H(Z!A$uV zUoLAc7?_{e20L~7zy7@bQ>p%>zx`iasZiT4LxqcX0nmJmAC>A84VPWX7tUl31R{^i zHudDp!Y0Eha--zqwIFVrCf?elvOZZZo(FI&{;Nt=`xl>5#D6*}l$87bc1Lw}lk-bQ z^_P_j1HY()_$7XMFEOrFMMHuB&-=QoN;PiXoy3l+RNGpjSCvXf*rTO-vvOm*_WxHD zC*E-lh+I>dAG&fQcMNL(}$AUyx#P3;f<}!u6T^$%Lq(17gRW!nC)ENMytz)($*Urr?(ex?*pN`hRovi=!EKuXxKm(LLccLx+_n9qoyH`Kf>|lUN zcA|(*)HS($PFFuM45$;*{8ehzsUiK=@OY1Iyfz|1{} zyy^tTA`=$xg%_dRNjt&Rj{o5kRSVkaATVNw1Uu50;6h>Ez#HQ2F#_}vh*koDtN4dm zjUR|q5LD6wA`2nu_bg}xnJ{B=D8UQi0dgbSB$@K9?0cM$pH$52sP)DR42gf+_5Y?~ z3OZ$_w+8)b0#zu>_+tVMCj0Y&?Em=n#@|e!e{omE?3i%x?dyy4wQ{9N4MT~Kp&pw{^LpRF5xvTOwSQAP!w;nNjM{7~wq2@=ue3gs+FYApT z6DY6FU~oC>qvaS3R`rfppOg8&yQ`X9iA91Xmn}k;a!pgUj-D;2xSO{x|BZ@ClVcb2 zhl)vodPM$J#l%Ol$T0*ssI8L6wd8H+Cz$N@vsOPC&148UVGK`km`~d*LmkL&q9#zT zt%{KcR|m3B^M5HBWn_*EomHut_i_9TjH)(jte@DmlB0NQqhO7yJ3bN$EREZBmgJ4i zL;{2?iyG9ILJakQ{AE-iD>vO}Es(&$wh8=J<{MZ`v%t;_Xi7KgOJ>8pr*$pN(%y{9 z$o98fY}{D8_HTxkH$DMB|C)>4%8y$(+#`y(-+QQE!LOD zIWOEg7|hd)uL+e@S|a!R4x;NaVk z>GfeEp%Dm5okaz;tYUtj{zSOeJts-<>MhD=$Lsy=(;4r`+t+9FLB(!U#KWT&#fcLw zY{VD^ikb_cgaL01%n3XdeI`&e9|DVuGyq?Bz%$z4i1lck{{0{}I317%1qc**MQ=b5 zCw}a=8N}Um29l#?Z!Bs?nED9`5Z~JeW6+ow`AnFRc1*?}4{si(yc?!T z*aF7WOovHBC7H_F{iQSsI5a21c`m&Iu&cc(h2{f*kr=_)^J(O>kEPj78o`D$K~N)T zphkE)X*QyT1BLwI$zq}qrh7z)TP=H7p$4&=QR0L)5V{qLjs=!V-4D^sj`jA4g-2nvZ^;%awD3C87?=( z9oJTItZKvj3oNpB@Kk@ElmbnHU}u1DlS#Q2N1^C&EykO-DlN_O#`XFUrHAjo23sA) ze5+emdYF3uL4A$l7jerwM%&w)^=Q8L-3Ws9kdOEqnHOz@88-#+?!`B;NAdYSZkr_v zt8At(Lgg#cE|3WIzho^canUGPATJkg{%~zK$T)c663?lPRCd?jCU}v~HN4^O5r2Re zcNxvQxDI)ES!7(#65E~APSwz|=xpWx_Fa|O`RRY}uIg+g2mU@!t9SiD?b&Ea==%aw zl?~nLv$3ka_eC#zHw@3u#v6z$OZ-$eAJL-js^FDnalM;Q@0?E#gjQB$tNiJ%%JqDD zj`%}WyUMnG()r99{6o!n@3v#@`RAR`4v&?e+QjEE-AG)m@b* z?Zq76UR4ui-;VE{i+NyJRSP?OHxQQ%Pk>K?iTjVcs(n!(cT&eCSrv{`@uxw1>B^1R zI7ZIhetUcI{i4f!ai_f=>d#ZY&9L7^o~p8)g?Zq8XD7SqJ{a~T3UT8*`_1~D;pg_) z@z>qfHT^`&O8O2Z|%6GAKMgf&TU@GztjC7@L1Dhy}AQ?Q=uCVw5OSM);NNd>EoNVQm}eJJ-qwtyQl^b^hFqm8xU_7OJQxJM=*kg&(d{#}`o z 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�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

nlnxOxL= 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
_f!B0`Dd3 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%0DIU$h~$@it$j!9 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 O#s3S<gxX|G_|y~G_=Sl6j_t3t);D_tEaE5 ztgoxT6wCCNEn9A8xXjSd$k2#lWNc(?qNQnSY`O$96EmtQ)!fY7oN8gAt7mC$X=Pz$ zZE0<5ZA$|Hnhnj)#MI8#&R$>7!Op?a-qFd*#>v6S+1}aN(b)x!a&dBTaiY`JRO!xi zI^D(9#r1z+u63ikySX{LJ2|@3-P~Q>Jv22v9PB;ZJUn4=Pdw4n-P6;<%hSul%ht-v z-D3sCc!lQ*hKf4F!;9g?_#c>_45l~JK$q#oWUgScoE%sTmNy*XZEoq!^!9Oe@mXqF zK0d3%e6d7dbxmJyUq70SpVtaMA3r~K)Jk`^mEJ2?`mXfX(et;r_xE1u@8|!&SQ+3S z!3}^R0&+%R$Vie6T1{~q3h#f;^Os| z#mB@Y#3dxeCu~XFl9-UV)!ce(;@0HonB=77ZCg{eW#y(Mr=+B8-|p$TJ$Wa0XX-8s z>)qVlskU}|Qq$7+re~yOWCr?Y?#s-wcgo7l`tQJh|NX~oI7Z#TsDJ&}~TZ;11@{00`<58O{k5yJyRafmuuBxm$ zdE%t_w74!YvF=P`LuOiIePd&D>)D307g{b{+PmlS(frm+t*uwuyLiyGZfSr1p@Ei` zfx(+2mB((&$6vg9^XbFKA3qj=MZj+J}kmUb~A^(4R{C}4l|8EfE|94pN|0*RG|8Kx70=ka=3<-zNL#bIr4oM6JIRpZ$ z%Ku``Kt9xPLOLaF(s3A>}hc3bp7?s%Js({P&w=rtF!zAqLhP$Uc z%;*e=!IRb!$;Jr*s%P&vuxkTP23~0zKNo&E`RVYLb72CwZ6t?M{(j<8(%mMfTh7*x zP+CU}s@zHD_q#H_&OW_$^}_QWXsy9s#U&b|FIU-eO=JZZ?9E@ktgR`O(tqaQwd7|b z9hcwS6}wup3!!gGNZ*iJgUx%cyn7(ocq{F&n+*1Zu=d@v+g(>bJ(mjb%hq(ae||Ys zVi|p>yW{H{dF?9n9R(e%kseBZe&l&x>tlDN`59#(N$yTfR%#9wVz36{&#C^E`M6JG`GGg@;5#E zsyN8`?W+eRFF6{M$FDA(X|8Sg4siQ=MztG*eUHJezcgoHWF&G7QD_qI6QASTrRZ z;wh~}s0fwW{_6%*s&Ohp5?jx(|D0rSv1zuc>A|c(+5MG8A9`t&mMC&4R3ehbN@VED zkB@3Fh82x9hwijsYA^I?Zfb7O3CB0rKZtNDCH(4@zzK+24h?52F6_mjb*tdLII~GfFX{p?hcg#am>BEb z9Gh#D9IG!w#>Y~=+@v-%e;KyA`o0BaC}d&Ln$jUAa+y%|tVqXCDpRT%6$`L&a!D_q zr8wt}HXpH=ZEpI-?LS`&KVaG74(YIv?mu+=?dx+TvNfJr-Ar^v@q#tVAWqCfqG%jv z$(Du>+b&E6pG&XTD_oQ^3yin8ry&v-Z_5xG5Y+Z0We-iZ2}-V-k90uOk=5L%Qo# z3$e}g%S6Yqf?bxxl^L;UV(qM0K(d#^)b~?b0Ua9j?>}qV_f(_FEHNP0mxWpkgf3eIwmnCojtnMVxOZxgeA$PM4#jX`Uu$?3JIYT z&e)}?7<<0x#)hFeoCB$qk@Mw4{ic3L_f&t88H~b?CXChUIED9;%3)YTOf1H6rkEt6 zavmqtNc)mi zHZqEfzzY=^ayU~XIjkk)tygavR%M7cx!^w>z3<6=(1f<8xnpF*li7OWqldvi4^lj-!Lb z9!j=VDR4L;C{|kzWIKpuxJ?oWQY~Ejv?mCgPoji~0hX z3gpWL03~mz{(dhI`&i*eZ!A)ZqQN6^lJ%tRXuB1wsc?krl{+YjsUZ1rpa>wEA zM25^mA$z$mqZe?mM%nJJ29h~b$XildCx6)C7)3AI>po;DE)ufU`I^lnp7lXPcwlI) z`mJ05oA>%0kORQo#eR4T-p23ydKa~CinERK425x_z3KyO$iYZVaO3o9w-v&S1J_}Y zb8sEJucYSW44~aTj1I)y@MyPFPB31L8P9M4+6@t#xZc_?$le<-R-;4y#FpnS43zJS zK_}4#S`;>4Y4>{YqzKv$tDme%zx^)i_v6N{SCDgVQNgZUDXbC>L&UR{zU>c`xFkKZ@7{zzK?2vMn3HTzYL;n5am}e+ezV zw4UG*-Y2RW4gplFb-C*AW$0+B4fBlHDoEecUB2f> zAFNx5TuIq$Bwm{a!R)zPCKF&rQifV#v|X{K${c)f6mH6ZvnlDjaso2Et&OxYEZX^2 z6MUNmKCL2sTZlbHNS`kDdZ_C2?!JW=31Q0sjU{k<3Rt6x(3RRLrwXkp&bl1oN*as_ zI2ckaoJ{wcN*#0nn2rJ&B|(@<0lQtmiah|D1|TIc3=Kd5FeDA|P6yQHU^tE_(gD!m z0w@lQK+4%VWki z$N=+xhdCpg)AYQ$@VxqryvB;WruMw%iM*CZ!^7o{S1)a51C~E(EJA86B590Z3XIU3lS)so%2~L?iN~XY#NM2<| zaGgS$Ap>qoJL-73Fsa1+#pnT1c#&wrw2EJ3Du<~;g34frHzDR^sipp0wD%je3m6BL zxAs<#ifyn~7jvB$A;Qa=h|6ImtVMxsV7gQL)QVuUy}m;wHtjM_>JXTHkO~a-*d^dWbra+ zDuHuv(##pF(0d)N=iq1)5dXE@T7JxS?ijT3*na_x!g>TKbZjvy_+hlSeH89;+=V|FAgu==i1Js=<9#L&vLzJE}$=Ro(enHLP6{?(O7BEp4~A z*x+DMv)ifT%ZXuIQ5hIr?knDk4$hg7W|QJn;#_5esG z?FcFlmBv9QGSJH`YSJX=Om2-?GMd_1vn;R1q7$73p}e>y*{%o|3Fr)=Qc5v}BvTH> zbhB#RW|n)991+Q_+cJktk{R4(ZHFwx%Dh5GKm|gRVm&{L#?u?Hp)bW(@-Jz z%i<&Iw{(_`9#vVI=vFlsOkZ%E5*$f#_{>}=ToxZ&Wh21uuo@75@c zXcT2O=2kZ51vYvu1~lYnHvGG9xn3M}CF5kV0-FzP=#b#KzSvv^R-A`DMQN(e!`37> zH6}OJHZ?WQV)M8b`5as+1)D{}bwJo`2wN&XSIWSa&7G6#G*`@>>%=v8<(<9c+;AO( zbdrD@0o+y^CY^&hTZrRw(E<);D}WLdqVDOOKcuKM>O}7WFllT|E>N2}SN(ptWe=r( z4+UE&#gzfrdqU3zJz9c5x;p8zX^yJ0nAhz=2`^y$K!MMU(b~)u!R7&I|5tl*3^Z=22;S(vx&o! z%a02Q$09J7aoFo_=VC3fot+p?7bYIxbUC@z*?ccm6A>)7-AKb6;((nL*j*{S6F_ej zpPzKYJi@gLI3OLWjuT^curH*su?^o)8}d-fnW(@BB$JKFpTmDd;oB70tU_Y8F=8(_kupN(a=M{v9Y{DrL;U)>6FUDk2u*G7`=}owr;ht-_w))DRT$Y1-plXUs@NKY%wN}D=qKZ6|@PPN5UBIzhLB18>|(}gpf`& zFu53Ym!tfgt$df!cfa%e)6VnH+}i03bP@$~lSb&L5e7J`kKC$@tQ5zwk*va=W9u;< zxA4Ujr3DLYHXFmEo$J%_-S+EJ)Sm%PbAu8WoCr8>%7I6{1C1Eq<*s^yfTk-gylTH~ zXlyzCGuf$kxgBr${>d8$|J;D|hWH*s!pI@f{-NBep}fWJp@PYwBY%bp^==kh4JiSz zWn%DixOrs|+!K3BwX5MO;)q=r>~+@lx97lOHgZyeIVvYSWhnJsjw&qdf$u!#!dBY@b?!Mm9$wXlh~igP^- zLNSEtDoop1j;|LJdO8ziQoKZZArI<(Mn|#ckk(bmtpM6;j(`>4y~{Q^xaxc-2h+(# zZyW8~DMeglV8z@EjdDa5usr=Y#mo54Ie5khFUI*(Gpq zvs%%HRnHa<)3TgWg22{Lr;lU=TZ{;wJN&>0yv-%< zkYFk}_(uxD4KCr4c<-%3LKmBOQ%tx85t|`wk6fv>fl$clkiW+!iHWK~_pd9E!wUQ@ z4z`q=G_OIJm|K^!o;Z)k<|znYp>bdg{2_GC5z;A7xxiAw zhjEHjp5daoi;VVHzp%p$>}dd7K8JOyJTv_LRx=ItsST4T#m~`{K5~^Z_bTmSW7`x; z^C)6t(`e7zQMi{vqyuX|4)2l&_b5PP1@;z$*fV#!^~qS`2n;8IzbJLG8wIk %

Bm7BXs0L= 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
XBM2sX&zTrIP)lSQlY0}1P=Y^uM^T!u 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 J(}Dy906Q@;#~}a! literal 0 HcmV?d00001 diff --git a/Media/use-component.gif.meta b/Media/use-component.gif.meta new file mode 100644 index 0000000..2db8201 --- /dev/null +++ b/Media/use-component.gif.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 0e28b6ba44fe04143a3efd7e872bd95b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md index 41a7506..7696b4c 100644 --- a/README.md +++ b/README.md @@ -81,3 +81,32 @@ It is generally recommended to have as few sync steps as possible, as the more s > [!TIP] > By default the sync steps slider is limited to 4 steps, but this can be unlocked in the settings. + +## How to use with VRCFury + +> [!NOTE] +> VRCFury does offer a component "Parameter Compressor" (formerly "Unlimited Parameters") though **MemoryOptimizer** offers more fine control of which parameters you would like to optimize. + +> [!TIP] +> This component is not exclusive to be used with VRCFury, it works without it as well. + + +If you wish to use this with VRCFury, you will need to add the MemoryOptimizerComponent to your avatar. + +> [!WARNING] +> The component needs to be placed on the same object where the `VRC Avatar Descriptor` is present. + +MemoryOptimizer Component + +From there just click `Configure` and you have the same workflow as above ([**How to use**](https://github.com/JeTeeS/MemoryOptimizer#parameters-selection)), but with a major difference: We resolve VRCFury parameters (to the best of our ability) so you can configure those without needing to create a build of the Avatar! + +MemoryOptimizer Component Usage + +> [!NOTE] +> Whenever you are done, remember to press `Save` at the bottom to actually save your optimizer configuration. + +### How does it work in comparison? + +The core difference from this to the normal workflow is that the MemoryOptimizer gets installed **during** the upload rather than before, which means whenever you upload, it will process the optimization configuration and apply it! + +When used with VRCFury, it runs after VRCFury is done with all its magic, and then collects and maps the parameters so the configured ones get optimized. \ No newline at end of file From 9625210ce22e2a3e406f05f6ff00255577262363 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:06:58 +0200 Subject: [PATCH 06/16] Changed: - constants are now all together in one file - some functions have moved to be available everywhere - component now lists issues it may have such as compability with UnlimitedParameters Fix: - if system was already installed, it was not checked during build - parameters and fx layer are now copied on the uploading clone to avoid breaking assets - comparison checks now use pre-calculated hash codes to be faster and many more things i can't remember / don't wanna list. --- .gitignore | 3 + Component/MemoryOptimizerComponent.cs | 96 +++- Editor/MemoryOptimizerComponentEditor.cs | 71 ++- Editor/MemoryOptimizerMain.cs | 432 ++++++++---------- Editor/MemoryOptimizerWindow.cs | 45 +- .../Pipeline/MemoryOptimizerUploadPipeline.cs | 60 ++- Helper/MemoryOptimizerHelper.cs | 39 ++ Helper/MemoryOptimizerHelper.cs.meta | 3 + Helper/TESHelperFunctions.cs | 339 +++++++------- .../dev.jetees.memoryoptimizer.Helper.asmdef | 3 +- Shared/MemoryOptimizerConstants.cs | 40 ++ Shared/MemoryOptimizerConstants.cs.meta | 3 + Shared/MemoryOptimizerListData.cs | 8 +- Shared/_InternalsVisibleTo.cs | 1 + 14 files changed, 661 insertions(+), 482 deletions(-) create mode 100644 Helper/MemoryOptimizerHelper.cs create mode 100644 Helper/MemoryOptimizerHelper.cs.meta create mode 100644 Shared/MemoryOptimizerConstants.cs create mode 100644 Shared/MemoryOptimizerConstants.cs.meta diff --git a/.gitignore b/.gitignore index a297d11..cb80522 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,9 @@ ExportedObj/ *.pdb.meta *.mdb.meta +# Unity3D temp meta files +[Tt]emp.meta + # Unity3D generated file on crash reports sysinfo.txt diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index 518c581..b8fddab 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -13,6 +13,7 @@ using VRC.SDK3.Avatars.Components; using VRC.SDK3.Avatars.ScriptableObjects; using VRC.SDKBase; +using static JeTeeS.MemoryOptimizer.Shared.MemoryOptimizerConstants; namespace JeTeeS.MemoryOptimizer { @@ -26,9 +27,12 @@ internal class SavedParameterConfiguration : MemoryOptimizerListData { public bool isVRCFuryParameter = false; public string info = string.Empty; - + + [NonSerialized] private int _hashCode = -1; + public SavedParameterConfiguration(VRCExpressionParameters.Parameter parameter) : base(parameter, false, false) { + CalculateHashCode(); } public SavedParameterConfiguration(string parameterName, VRCExpressionParameters.ValueType parameterType) : base(new VRCExpressionParameters.Parameter() @@ -38,11 +42,22 @@ public SavedParameterConfiguration(string parameterName, VRCExpressionParameters networkSynced = true }, false, false) { + CalculateHashCode(); } + private void CalculateHashCode() + { + _hashCode = $"name:{this.param.name}-level:{paramTypes[(int)this.param.valueType]}".GetHashCode(); + } + public override int GetHashCode() { - return $"{this.param.name}{TESHelperFunctions._paramTypes[(int)this.param.valueType]}".GetHashCode(); + if (_hashCode == -1) + { + CalculateHashCode(); + } + + return _hashCode; } public override bool Equals(object obj) @@ -52,9 +67,9 @@ public override bool Equals(object obj) return false; } - if (obj is SavedParameterConfiguration typed) + if (obj is SavedParameterConfiguration o) { - return typed.param.name.Equals(this.param.name) && typed.param.valueType == this.param.valueType; + return o.GetHashCode() == GetHashCode(); } return base.Equals(obj); @@ -81,24 +96,63 @@ public MemoryOptimizerListData Pure() } } + [Serializable] + internal struct ComponentIssue + { + public string message; + public int level; + private int _hashCode; + + public static implicit operator ComponentIssue((string, int) data) + { + return new ComponentIssue() + { + message = data.Item1, + level = data.Item2, + _hashCode = $"{data.Item1}-level:{data.Item2}".GetHashCode() + }; + } + + public override bool Equals(object obj) + { + if (obj is ComponentIssue o) + { + return o._hashCode == _hashCode; + } + + return base.Equals(obj); + } + + public override int GetHashCode() + { + return _hashCode; + } + } + [NonSerialized] private VRCAvatarDescriptor _vrcAvatarDescriptor; public bool changeDetection = false; public int syncSteps = 2; public float stepDelay = 0.2f; public int wdOption = 0; - [SerializeReference] internal DefaultAsset savePathOverride = null; - - [NonSerialized] internal int longestParameterName = 0; + [SerializeField] internal List componentIssues = new(0); [SerializeField] internal List savedParameterConfigurations = new(0); internal void Load() { + componentIssues = new(0); + // get descriptor - _vrcAvatarDescriptor = gameObject.GetComponent(); + _vrcAvatarDescriptor ??= gameObject.GetComponent(); + var descriptorParameters = (_vrcAvatarDescriptor?.expressionParameters?.parameters ?? Array.Empty()).Where(p => p.networkSynced).ToList(); + if (MemoryOptimizerHelper.IsSystemInstalled(_vrcAvatarDescriptor)) + { + componentIssues.Add(("MemoryOptimizer is already installed in the current FX-Layer.", 3 /* Error */)); + } + // collect all descriptor parameters that are synced foreach (var savedParameterConfiguration in descriptorParameters.Select(p => new SavedParameterConfiguration(p) { @@ -111,8 +165,7 @@ internal void Load() #if MemoryOptimizer_VRCFury_IsInstalled // since all VRCFury components are IEditorOnly, we can find them like this // there is no better way as VRCFury has decided to mark their classes as internal only - List vrcfComponents = (gameObject.GetComponents()) - .Concat(gameObject.GetComponentsInChildren(true)) + List vrcfComponents = gameObject.GetComponentsInChildren(true) .Where(x => x.GetType().ToString().Contains("VRCFury")) .ToList(); @@ -149,9 +202,15 @@ internal void Load() // Notes: // VRCFury generates parameters with the following format: VF\d+_{name} // since we have no access to the number unless we build the avatar, we just display VF##_{name} and map it correctly later + + Debug.Log(contentType); + if (contentType.Contains("UnlimitedParameters")) + { + componentIssues.Add(("VRCFury 'Parameter Compressor' (formerly 'Unlimited Parameters') was found on Avatar.\nOur system IS NOT COMPATIBLE with this.", 3 /* Error */)); + } // Toggle - if (contentType.Contains("Toggle")) + else if (contentType.Contains("Toggle")) { // Toggles are rather simple, they can be in any of these configurations: // 1. being a normal toggle (auto-generated bool parameter) @@ -250,6 +309,10 @@ internal void Load() } } #endif + if (savedParameterConfigurations.Count <= 0) + { + componentIssues.Add(("This avatar has no configured parameters.", 2 /* Warning */)); + } } private void Awake() @@ -270,17 +333,24 @@ private void AddOrReplaceParameterConfiguration(SavedParameterConfiguration conf // we replace it with the one costing more, as mapping from a float to a bool // usually is handled much better than bool to a float var saved = savedParameterConfigurations.FirstOrDefault(p => p == configuration); - if (saved is not null && saved.param.GetParameterCost() < configuration.param.GetParameterCost()) + if (saved is not null && saved.param.GetVRCExpressionParameterCost() < configuration.param.GetVRCExpressionParameterCost()) { saved.param = configuration.param; } } else { - longestParameterName = Math.Max(longestParameterName, configuration.param.name.Count()); savedParameterConfigurations.Add(configuration); } } + + private void AddIssue(ComponentIssue issue) + { + if (!componentIssues.Contains(issue)) + { + componentIssues.Add(issue); + } + } } } diff --git a/Editor/MemoryOptimizerComponentEditor.cs b/Editor/MemoryOptimizerComponentEditor.cs index 319f261..bbee08d 100644 --- a/Editor/MemoryOptimizerComponentEditor.cs +++ b/Editor/MemoryOptimizerComponentEditor.cs @@ -1,20 +1,28 @@ using System; +using System.Linq; using JeTeeS.MemoryOptimizer.Patcher; using JeTeeS.TES.HelperFunctions; using UnityEditor; using UnityEngine; +using static JeTeeS.MemoryOptimizer.Shared.MemoryOptimizerConstants; namespace JeTeeS.MemoryOptimizer { [CustomEditor(typeof(MemoryOptimizerComponent))] internal class MemoryOptimizerComponentEditor : Editor { - private const string EditorKeyInspectComponent = "dev.jetees.memoryoptimizer_inspectcomponent"; - private const string EditorKeyInspectParameters = "dev.jetees.memoryoptimizer_inspectparameters"; + private MemoryOptimizerComponent _component; + private void Awake() + { + _component ??= (MemoryOptimizerComponent)target; + + _component.Load(); + } + public override void OnInspectorGUI() { - var typed = ((MemoryOptimizerComponent)target); + bool hasErrors = _component.componentIssues.Any(x => x.level >= 3); #if MemoryOptimizer_VRCFury_IsInstalled if (MemoryOptimizerVRCFuryPatcher.AreVRCFuryScriptsPatched()) @@ -35,16 +43,44 @@ public override void OnInspectorGUI() GUILayout.Space(5); #endif + if (_component.componentIssues.Any()) + { + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) + { + GUILayout.Label("Problems:"); + } + + foreach (var issue in _component.componentIssues) + { + var type = issue.level switch + { + 0 => MessageType.None, + 1 => MessageType.Info, + 2 => MessageType.Warning, + 3 => MessageType.Error, + _ => MessageType.None + }; + + EditorGUILayout.HelpBox(issue.message, type); + } + + GUILayout.Space(5); + } + using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) { + GUI.enabled = !hasErrors; + if (GUILayout.Button("Configure")) { - typed.Load(); + _component.Load(); - MemoryOptimizerWindow._component = typed; + MemoryOptimizerWindow._component = _component; EditorWindow window = EditorWindow.GetWindow(typeof(MemoryOptimizerWindow), false, "Memory Optimizer (Configuration)", true); window.minSize = new Vector2(600, 900); } + + GUI.enabled = true; } var foldoutState = EditorGUILayout.Foldout(EditorPrefs.GetBool(EditorKeyInspectComponent), "Component Configuration"); @@ -56,34 +92,28 @@ public override void OnInspectorGUI() using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) { GUILayout.Label("Write Defaults:"); - GUILayout.Label($"{MemoryOptimizerWindow.wdOptions[typed.wdOption]}", GUILayout.Width(100)); + GUILayout.Label($"{wdOptions[_component.wdOption]}", GUILayout.Width(100)); } using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) { GUILayout.Label("Change Detection"); - GUI.backgroundColor = typed.changeDetection ? Color.green : Color.red; - GUILayout.Button(typed.changeDetection ? "On" : "Off", GUILayout.Width(100)); + GUI.backgroundColor = _component.changeDetection ? Color.green : Color.red; + GUILayout.Button(_component.changeDetection ? "On" : "Off", GUILayout.Width(100)); GUI.backgroundColor = Color.white; } using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) { GUILayout.Label("Sync Steps:"); - GUILayout.Label($"{typed.syncSteps}", GUILayout.Width(100)); + GUILayout.Label($"{_component.syncSteps}", GUILayout.Width(100)); } using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) { GUILayout.Label("Step Delay:"); - GUILayout.Label($"{typed.stepDelay}s", GUILayout.Width(100)); - } - - using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) - { - GUILayout.Label("Save Path Override:"); - GUILayout.Label($"{typed.savePathOverride?.ToString() ?? "None"}", GUILayout.Width(100)); + GUILayout.Label($"{_component.stepDelay}s", GUILayout.Width(100)); } GUI.enabled = true; @@ -92,16 +122,15 @@ public override void OnInspectorGUI() EditorPrefs.SetBool(EditorKeyInspectParameters, foldoutState); if (foldoutState) { - foreach (var savedParameterConfiguration in typed.savedParameterConfigurations) + foreach (var savedParameterConfiguration in _component.savedParameterConfigurations) { - var (parameterName, parameterType, isSelected, willOptimize) = (savedParameterConfiguration.param.name, savedParameterConfiguration.param.valueType.TranslateParameterValueType(), savedParameterConfiguration.selected, savedParameterConfiguration.willBeOptimized); + var (parameterName, parameterType, isSelected, willOptimize) = (savedParameterConfiguration.param.name, savedParameterConfiguration.param.valueType, savedParameterConfiguration.selected, savedParameterConfiguration.willBeOptimized); using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal))) { GUILayout.Space(5); - - GUILayout.Label(new GUIContent(parameterName, savedParameterConfiguration.info), GUILayout.MinWidth(typed.longestParameterName * 8)); - GUILayout.Label($"{parameterType}", GUILayout.Width(50)); + + EditorGUILayout.HelpBox($"{parameterName} - {paramTypes[(int)parameterType]}\n -> {savedParameterConfiguration.info}", MessageType.None); GUI.backgroundColor = isSelected ? (willOptimize ? Color.green : Color.yellow) : Color.red; GUI.enabled = false; diff --git a/Editor/MemoryOptimizerMain.cs b/Editor/MemoryOptimizerMain.cs index a584404..ef9447e 100644 --- a/Editor/MemoryOptimizerMain.cs +++ b/Editor/MemoryOptimizerMain.cs @@ -9,6 +9,7 @@ using VRC.SDK3.Avatars.ScriptableObjects; using VRC.SDKBase; using JeTeeS.TES.HelperFunctions; +using static JeTeeS.MemoryOptimizer.Shared.MemoryOptimizerConstants; using static JeTeeS.TES.HelperFunctions.TESHelperFunctions; namespace JeTeeS.MemoryOptimizer @@ -18,28 +19,9 @@ internal static class MemoryOptimizerMain internal class ParamDriversAndStates { public VRCAvatarParameterDriver paramDriver = ScriptableObject.CreateInstance(); - public List states = new List(); + public List states = new(); } - private const string discordLink = "https://discord.gg/N7snuJhzkd"; - private const string prefix = "MemOpt_"; - private const string syncingLayerName = prefix + "Syncing Layer"; - private const string syncingLayerIdentifier = prefix + "Syncer"; - private const string mainBlendTreeIdentifier = prefix + "MainBlendTree"; - private const string mainBlendTreeLayerName = prefix + "Main BlendTree"; - private const string smoothingAmountParamName = prefix + "ParamSmoothing"; - private const string smoothedVerSuffix = "_S"; - private const string SmoothingTreeName = "SmoothingParentTree"; - private const string DifferentialTreeName = "DifferentialParentTree"; - private const string DifferentialSuffix = "_Delta"; - private const string constantOneName = prefix + "ConstantOne"; - private const string indexerParamName = prefix + "Indexer "; - private const string boolSyncerParamName = prefix + "BoolSyncer "; - private const string intNFloatSyncerParamName = prefix + "IntNFloatSyncer "; - private const string oneFrameBufferAnimName = prefix + "OneFrameBuffer"; - private const string oneSecBufferAnimName = prefix + "OneSecBuffer"; - private const float changeSensitivity = 0.05f; - private class MemoryOptimizerState { public AnimationClip oneSecBuffer; @@ -55,50 +37,30 @@ private class MemoryOptimizerState public AnimatorControllerLayer syncingLayer; } - public static bool IsSystemInstalled(AnimatorController controller) - { - if (controller is null) - { - return false; - } - - if (controller.FindHiddenIdentifier(syncingLayerIdentifier).Count == 1) - { - return true; - } - - if (controller.FindHiddenIdentifier(mainBlendTreeIdentifier).Count == 1) - { - return true; - } - - return false; - } - - public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorController fxLayer, VRCExpressionParameters expressionParameters, List boolsToOptimize, List intsNFloatsToOptimize, int syncSteps, float stepDelay, bool generateChangeDetection, int wdOption, string mainFilePath) + public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorController fxLayer, VRCExpressionParameters expressionParameters, List optimizeBoolList, List optimizeIntNFloatList, int syncSteps, float stepDelay, bool generateChangeDetection, int wdOption, string mainFilePath) { - string generatedAssetsFilePath = mainFilePath + "/GeneratedAssets/"; + var generatedAssetsFilePath = mainFilePath + "/GeneratedAssets/"; ReadyPath(generatedAssetsFilePath); - MemoryOptimizerState optimizerState = new MemoryOptimizerState + MemoryOptimizerState optimizerState = new() { avatar = avatarIn, FXController = fxLayer, expressionParameters = expressionParameters, - boolsToOptimize = boolsToOptimize, - intsNFloatsToOptimize = intsNFloatsToOptimize, - boolsNIntsWithCopies = new List(), + boolsToOptimize = optimizeBoolList, + intsNFloatsToOptimize = optimizeIntNFloatList, + boolsNIntsWithCopies = new(), - syncingLayer = new AnimatorControllerLayer + syncingLayer = new() { defaultWeight = 1, name = syncingLayerName, - stateMachine = new AnimatorStateMachine + stateMachine = new() { hideFlags = HideFlags.HideInHierarchy, name = syncingLayerName, - anyStatePosition = new Vector3(20, 20, 0), - entryPosition = new Vector3(20, 50, 0) + anyStatePosition = new(20, 20, 0), + entryPosition = new(20, 50, 0) } } }; @@ -107,22 +69,21 @@ public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorControlle (optimizerState.oneFrameBuffer, optimizerState.oneSecBuffer) = BufferAnims(generatedAssetsFilePath); fxLayer.AddUniqueParam("IsLocal", AnimatorControllerParameterType.Bool); - - AnimatorControllerParameter constantOneParam = fxLayer.AddUniqueParam(constantOneName, AnimatorControllerParameterType.Float, 1); + fxLayer.AddUniqueParam(constantOneName, AnimatorControllerParameterType.Float, 1); fxLayer.AddUniqueParam(smoothingAmountParamName); - string syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); - for (int i = 0; i < syncStepsBinary.Count(); i++) + var syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); + for (var i = 0; i < syncStepsBinary.Count(); i++) { AddUniqueSyncedParamToController(indexerParamName + (i + 1).ToString(), fxLayer, expressionParameters, AnimatorControllerParameterType.Bool, VRCExpressionParameters.ValueType.Bool); } - for (int j = 0; j < boolsToOptimize.Count / syncSteps; j++) + for (var j = 0; j < optimizeBoolList.Count / syncSteps; j++) { AddUniqueSyncedParamToController(boolSyncerParamName + j, optimizerState.FXController, optimizerState.expressionParameters, AnimatorControllerParameterType.Bool, VRCExpressionParameters.ValueType.Bool); } - for (int j = 0; j < intsNFloatsToOptimize.Count / syncSteps; j++) + for (var j = 0; j < optimizeIntNFloatList.Count / syncSteps; j++) { AddUniqueSyncedParamToController(intNFloatSyncerParamName + j, optimizerState.FXController, optimizerState.expressionParameters, AnimatorControllerParameterType.Int, VRCExpressionParameters.ValueType.Int); } @@ -134,7 +95,7 @@ public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorControlle GenerateDeltas(optimizerState, generatedAssetsFilePath); } - AnimatorState localEntryState = optimizerState.localStateMachine.AddState("Entry", new Vector3(0, 100, 0)); + var localEntryState = optimizerState.localStateMachine.AddState("Entry", new(0, 100, 0)); localEntryState.hideFlags = HideFlags.HideInHierarchy; localEntryState.motion = optimizerState.oneFrameBuffer; @@ -147,30 +108,27 @@ public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorControlle CreateParameterDrivers(optimizerState, syncSteps, generateChangeDetection); - bool setWD = true; - if (wdOption == 0) + var setWD = true; + switch (wdOption) { - int foundWD = fxLayer.FindWDInController(); - if (foundWD == -1) + case 0: { - setWD = true; + var foundWD = fxLayer.FindWDInController(); + setWD = foundWD switch + { + -1 => true, + 0 => false, + 1 => true, + _ => setWD + }; + break; } - else if (foundWD == 0) - { + case 1: setWD = false; - } - else if (foundWD == 1) - { + break; + default: setWD = true; - } - } - else if (wdOption == 1) - { - setWD = false; - } - else - { - setWD = true; + break; } foreach (var state in optimizerState.syncingLayer.FindAllStatesInLayer()) @@ -181,12 +139,12 @@ public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorControlle optimizerState.FXController.AddLayer(optimizerState.syncingLayer); optimizerState.FXController.SaveUnsavedAssetsToController(); - foreach (var param in boolsToOptimize) + foreach (var param in optimizeBoolList) { param.param.networkSynced = false; } - foreach (var param in intsNFloatsToOptimize) + foreach (var param in optimizeIntNFloatList) { param.param.networkSynced = false; } @@ -197,33 +155,34 @@ public static void InstallMemOpt(VRCAvatarDescriptor avatarIn, AnimatorControlle SetupParameterDrivers(optimizerState); - EditorApplication.Beep(); + // EditorApplication.Beep(); Debug.Log("[MemoryOptimizer] Installation Complete"); } private static void GenerateDeltas(MemoryOptimizerState optimizerState, string generatedAssetsFilePath) { - List boolsToOptimize = optimizerState.boolsToOptimize; - List intsNFloatsToOptimize = optimizerState.intsNFloatsToOptimize; + var boolsToOptimize = optimizerState.boolsToOptimize; + var intsNFloatsToOptimize = optimizerState.intsNFloatsToOptimize; - List boolsDifferentials = new List(); - List intsNFloatsDifferentials = new List(); + List boolsDifferentials = new(); + List intsNFloatsDifferentials = new(); //Add smoothed ver of every param in the list - foreach (MemoryOptimizerListData param in boolsToOptimize) + foreach (var param in boolsToOptimize) { - List paramMatches = optimizerState.FXController.parameters.Where(x => x.name == param.param.name).ToList(); - AnimatorControllerParameter paramMatch = paramMatches[0]; + var paramMatches = optimizerState.FXController.parameters.Where(x => x.name == param.param.name).ToList(); + var paramMatch = paramMatches[0]; if (paramMatch.type is AnimatorControllerParameterType.Int or AnimatorControllerParameterType.Bool) { - AnimatorControllerParameter paramCopy = optimizerState.FXController.AddUniqueParam(prefix + paramMatch.name + "_Copy"); + var paramCopy = optimizerState.FXController.AddUniqueParam(prefix + paramMatch.name + "_Copy"); optimizerState.boolsNIntsWithCopies.Add(paramMatch); - AnimatorControllerParameter smoothedParam = paramCopy.AddSmoothedVer(0, 1, optimizerState.FXController, prefix + paramCopy.name + smoothedVerSuffix, generatedAssetsFilePath, smoothingAmountParamName, mainBlendTreeIdentifier, mainBlendTreeLayerName, SmoothingTreeName, constantOneName); + + var smoothedParam = paramCopy.AddSmoothedVer(0, 1, optimizerState.FXController, prefix + paramCopy.name + smoothedVerSuffix, generatedAssetsFilePath, smoothingAmountParamName, mainBlendTreeIdentifier, mainBlendTreeLayerName, SmoothingTreeName, constantOneName); boolsDifferentials.Add(AddParamDifferential(paramCopy, smoothedParam, optimizerState.FXController, generatedAssetsFilePath, 0, 1, prefix + paramCopy.name + DifferentialSuffix, mainBlendTreeIdentifier, mainBlendTreeLayerName, DifferentialTreeName, constantOneName)); } else if (paramMatch.type == AnimatorControllerParameterType.Float) { - AnimatorControllerParameter smoothedParam = paramMatch.AddSmoothedVer(0, 1, optimizerState.FXController, prefix + paramMatch.name + smoothedVerSuffix, generatedAssetsFilePath, smoothingAmountParamName, mainBlendTreeIdentifier, mainBlendTreeLayerName, SmoothingTreeName, constantOneName); + var smoothedParam = paramMatch.AddSmoothedVer(0, 1, optimizerState.FXController, prefix + paramMatch.name + smoothedVerSuffix, generatedAssetsFilePath, smoothingAmountParamName, mainBlendTreeIdentifier, mainBlendTreeLayerName, SmoothingTreeName, constantOneName); boolsDifferentials.Add(AddParamDifferential(paramMatch, smoothedParam, optimizerState.FXController, generatedAssetsFilePath, 0, 1, prefix + paramMatch.name + DifferentialSuffix, mainBlendTreeIdentifier, mainBlendTreeLayerName, DifferentialTreeName, constantOneName)); } else @@ -232,21 +191,22 @@ private static void GenerateDeltas(MemoryOptimizerState optimizerState, string g } } - foreach (MemoryOptimizerListData param in intsNFloatsToOptimize) + foreach (var param in intsNFloatsToOptimize) { - List paramMatches = optimizerState.FXController.parameters.Where(x => x.name == param.param.name).ToList(); - AnimatorControllerParameter paramMatch = paramMatches[0]; + var paramMatches = optimizerState.FXController.parameters.Where(x => x.name == param.param.name).ToList(); + var paramMatch = paramMatches[0]; if (paramMatch.type is AnimatorControllerParameterType.Int or AnimatorControllerParameterType.Bool) { - AnimatorControllerParameter paramCopy = optimizerState.FXController.AddUniqueParam(prefix + paramMatch.name + "_Copy"); + var paramCopy = optimizerState.FXController.AddUniqueParam(prefix + paramMatch.name + "_Copy"); optimizerState.boolsNIntsWithCopies.Add(paramMatch); - AnimatorControllerParameter smoothedParam = paramCopy.AddSmoothedVer(0, 1, optimizerState.FXController, prefix + paramCopy.name + smoothedVerSuffix, generatedAssetsFilePath, smoothingAmountParamName, mainBlendTreeIdentifier, mainBlendTreeLayerName, SmoothingTreeName, constantOneName); + + var smoothedParam = paramCopy.AddSmoothedVer(0, 1, optimizerState.FXController, prefix + paramCopy.name + smoothedVerSuffix, generatedAssetsFilePath, smoothingAmountParamName, mainBlendTreeIdentifier, mainBlendTreeLayerName, SmoothingTreeName, constantOneName); intsNFloatsDifferentials.Add(AddParamDifferential(paramCopy, smoothedParam, optimizerState.FXController, generatedAssetsFilePath, 0, 1, prefix + paramCopy.name + DifferentialSuffix, mainBlendTreeIdentifier, mainBlendTreeLayerName, DifferentialTreeName, constantOneName)); } else if (paramMatch.type == AnimatorControllerParameterType.Float) { - AnimatorControllerParameter smoothedParam = paramMatch.AddSmoothedVer(-1, 1, optimizerState.FXController, prefix + paramMatch.name + smoothedVerSuffix, generatedAssetsFilePath, smoothingAmountParamName, mainBlendTreeIdentifier, mainBlendTreeLayerName, SmoothingTreeName, constantOneName); + var smoothedParam = paramMatch.AddSmoothedVer(-1, 1, optimizerState.FXController, prefix + paramMatch.name + smoothedVerSuffix, generatedAssetsFilePath, smoothingAmountParamName, mainBlendTreeIdentifier, mainBlendTreeLayerName, SmoothingTreeName, constantOneName); intsNFloatsDifferentials.Add(AddParamDifferential(paramMatch, smoothedParam, optimizerState.FXController, generatedAssetsFilePath, -1, 1, prefix + paramMatch.name + DifferentialSuffix, mainBlendTreeIdentifier, mainBlendTreeLayerName, DifferentialTreeName, constantOneName)); } else @@ -261,30 +221,30 @@ private static void GenerateDeltas(MemoryOptimizerState optimizerState, string g private static void CreateTransitions(MemoryOptimizerState optimizerState, int syncSteps, float stepDelay, bool generateChangeDetection) { - List boolsToOptimize = optimizerState.boolsToOptimize; - List intsNFloatsToOptimize = optimizerState.intsNFloatsToOptimize; - List localSetStates = optimizerState.localSetStates; - List remoteSetStates = optimizerState.remoteSetStates; - List localResetStates = optimizerState.localResetStates; - List boolsDifferentials = optimizerState.boolsDifferentials; - List intsNFloatsDifferentials = optimizerState.intsNFloatsDifferentials; - AnimatorStateMachine remoteStateMachine = optimizerState.remoteStateMachine; - - string syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); - - AnimatorState waitForIndexer = remoteStateMachine.AddState("WaitForIndexer", new Vector3(0, 400, 0)); + var optimizeBoolList = optimizerState.boolsToOptimize; + var optimizeIntBFloatList = optimizerState.intsNFloatsToOptimize; + var localSetStates = optimizerState.localSetStates; + var remoteSetStates = optimizerState.remoteSetStates; + var localResetStates = optimizerState.localResetStates; + var differentialsBool = optimizerState.boolsDifferentials; + var differentialsIntNFloat = optimizerState.intsNFloatsDifferentials; + var remoteStateMachine = optimizerState.remoteStateMachine; + + var syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); + + var waitForIndexer = remoteStateMachine.AddState("WaitForIndexer", new(0, 400, 0)); waitForIndexer.hideFlags = HideFlags.HideInHierarchy; waitForIndexer.motion = optimizerState.oneFrameBuffer; - for (int i = 0; i < syncSteps; i++) + for (var i = 0; i < syncSteps; i++) { - string currentIndex = i.DecimalToBinary().ToString(); + var currentIndex = i.DecimalToBinary().ToString(); while (currentIndex.Length < syncStepsBinary.Length) { currentIndex = "0" + currentIndex; } - AnimatorStateTransition toSetterTransition = new AnimatorStateTransition() + AnimatorStateTransition toSetterTransition = new() { destinationState = remoteSetStates[i], exitTime = 0, @@ -295,15 +255,15 @@ private static void CreateTransitions(MemoryOptimizerState optimizerState, int s }; - //Make a list of transitions that go to the "wait" state - List toWaitTransitions = new List(); + // Make a list of transitions that go to the "wait" state + List toWaitTransitions = new(); - //loop through each character of the binary number - for (int j = 1; j <= currentIndex.Length; j++) + // loop through each character of the binary number + for (var j = 1; j <= currentIndex.Length; j++) { - bool isZero = currentIndex[currentIndex.Length - j].ToString() == "0"; + var isZero = currentIndex[^j].ToString() == "0"; toSetterTransition.AddCondition(isZero ? AnimatorConditionMode.IfNot : AnimatorConditionMode.If, 0, indexerParamName + j); - toWaitTransitions.Add(new AnimatorStateTransition + toWaitTransitions.Add(new() { destinationState = waitForIndexer, exitTime = 0, @@ -319,10 +279,10 @@ private static void CreateTransitions(MemoryOptimizerState optimizerState, int s { void SetupLocalResetStateTransitions(string differentialName) { - //add transitions from value changed state to appropriate reset state - foreach (AnimatorState state in localSetStates) + // add transitions from value changed state to appropriate reset state + foreach (var state in localSetStates) { - AnimatorStateTransition transition = new AnimatorStateTransition + AnimatorStateTransition transition = new() { destinationState = localResetStates[i], exitTime = 0, @@ -335,7 +295,7 @@ void SetupLocalResetStateTransitions(string differentialName) transition.AddCondition(AnimatorConditionMode.Less, changeSensitivity * -1, differentialName); state.AddTransition(transition); - transition = new AnimatorStateTransition + transition = new() { destinationState = localResetStates[i], exitTime = 0, @@ -350,21 +310,21 @@ void SetupLocalResetStateTransitions(string differentialName) } } - for (int j = 0; j < boolsToOptimize.Count / syncSteps; j++) + for (var j = 0; j < optimizeBoolList.Count / syncSteps; j++) { - string differentialName = boolsDifferentials[i * (boolsToOptimize.Count() / syncSteps) + j].name; + var differentialName = differentialsBool[i * (optimizeBoolList.Count() / syncSteps) + j].name; SetupLocalResetStateTransitions(differentialName); } - for (int j = 0; j < intsNFloatsToOptimize.Count / syncSteps; j++) + for (var j = 0; j < optimizeIntBFloatList.Count / syncSteps; j++) { - string differentialName = intsNFloatsDifferentials[i * (intsNFloatsToOptimize.Count() / syncSteps) + j].name; + var differentialName = differentialsIntNFloat[i * (optimizeIntBFloatList.Count() / syncSteps) + j].name; SetupLocalResetStateTransitions(differentialName); } } // add the transitions from remote set states to the wait state - foreach (AnimatorStateTransition transition in toWaitTransitions) + foreach (var transition in toWaitTransitions) { remoteSetStates[i].AddTransition(transition); } @@ -373,7 +333,7 @@ void SetupLocalResetStateTransitions(string differentialName) waitForIndexer.AddTransition(toSetterTransition); } - for (int i = 0; i < localSetStates.Count; i++) + for (var i = 0; i < localSetStates.Count; i++) { localSetStates[i].AddTransition(new AnimatorStateTransition() { @@ -389,34 +349,34 @@ void SetupLocalResetStateTransitions(string differentialName) private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, int syncSteps, bool generateChangeDetection) { - List localSetStates = optimizerState.localSetStates; - List localResetStates = optimizerState.localResetStates; - List remoteSetStates = optimizerState.remoteSetStates; + var localSetStates = optimizerState.localSetStates; + var localResetStates = optimizerState.localResetStates; + var remoteSetStates = optimizerState.remoteSetStates; - List boolsToOptimize = optimizerState.boolsToOptimize; - List intsNFloatsToOptimize = optimizerState.intsNFloatsToOptimize; + var optimizeBoolList = optimizerState.boolsToOptimize; + var optimizeIntNFloatList = optimizerState.intsNFloatsToOptimize; - List localSettersParameterDrivers = new List(); - List remoteSettersParameterDrivers = new List(); + List localSettersParameterDrivers = new(); + List remoteSettersParameterDrivers = new(); - string syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); - for (int i = 0; i < syncSteps; i++) + var syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); + for (var i = 0; i < syncSteps; i++) { - string currentIndex = i.DecimalToBinary().ToString(); + var currentIndex = i.DecimalToBinary().ToString(); while (currentIndex.Length < syncStepsBinary.Length) { currentIndex = "0" + currentIndex; } - localSettersParameterDrivers.Add(new ParamDriversAndStates()); + localSettersParameterDrivers.Add(new()); localSettersParameterDrivers.Last().states.Add(localSetStates[i]); if (generateChangeDetection) { localSettersParameterDrivers.Last().states.Add(localResetStates[i]); - foreach (AnimatorControllerParameter param in optimizerState.boolsNIntsWithCopies) + foreach (var param in optimizerState.boolsNIntsWithCopies) { - localSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + localSettersParameterDrivers.Last().paramDriver.parameters.Add(new() { name = prefix + param.name + "_Copy", source = param.name, @@ -425,28 +385,39 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, } } - remoteSettersParameterDrivers.Add(new ParamDriversAndStates()); + remoteSettersParameterDrivers.Add(new()); remoteSettersParameterDrivers.Last().states.Add(remoteSetStates[i]); - //loop through each character of the binary number - for (int j = 1; j <= currentIndex.Length; j++) + // loop through each character of the binary number + for (var j = 1; j <= currentIndex.Length; j++) { - int value = currentIndex[currentIndex.Length - j].ToString() == "0" ? 0 : 1; - localSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() { name = indexerParamName + j, value = value, type = VRC_AvatarParameterDriver.ChangeType.Set }); - remoteSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() { name = indexerParamName + j, value = value, type = VRC_AvatarParameterDriver.ChangeType.Set }); + var value = currentIndex[^j].ToString() == "0" ? 0 : 1; + localSettersParameterDrivers.Last().paramDriver.parameters.Add(new() + { + name = indexerParamName + j, + value = value, + type = VRC_AvatarParameterDriver.ChangeType.Set + }); + + remoteSettersParameterDrivers.Last().paramDriver.parameters.Add(new() + { + name = indexerParamName + j, + value = value, + type = VRC_AvatarParameterDriver.ChangeType.Set + }); } - for (int j = 0; j < boolsToOptimize.Count / syncSteps; j++) + for (var j = 0; j < optimizeBoolList.Count / syncSteps; j++) { - VRCExpressionParameters.Parameter param = boolsToOptimize.ElementAt(i * (boolsToOptimize.Count() / syncSteps) + j).param; - localSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + var param = optimizeBoolList.ElementAt(i * (optimizeBoolList.Count() / syncSteps) + j).param; + localSettersParameterDrivers.Last().paramDriver.parameters.Add(new() { name = boolSyncerParamName + j, source = param.name, type = VRC_AvatarParameterDriver.ChangeType.Copy }); - remoteSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + remoteSettersParameterDrivers.Last().paramDriver.parameters.Add(new() { name = param.name, source = boolSyncerParamName + j, @@ -454,12 +425,12 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, }); } - for (int j = 0; j < intsNFloatsToOptimize.Count / syncSteps; j++) + for (var j = 0; j < optimizeIntNFloatList.Count / syncSteps; j++) { - VRCExpressionParameters.Parameter param = intsNFloatsToOptimize.ElementAt(i * (intsNFloatsToOptimize.Count() / syncSteps) + j).param; + var param = optimizeIntNFloatList.ElementAt(i * (optimizeIntNFloatList.Count() / syncSteps) + j).param; if (param.valueType == VRCExpressionParameters.ValueType.Int) { - localSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + localSettersParameterDrivers.Last().paramDriver.parameters.Add(new() { name = intNFloatSyncerParamName + j, source = param.name, @@ -467,7 +438,7 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, }); remoteSettersParameterDrivers.Last().paramDriver.parameters.Add( - new VRC_AvatarParameterDriver.Parameter() + new() { name = param.name, source = intNFloatSyncerParamName + j, @@ -476,7 +447,7 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, } else if (param.valueType == VRCExpressionParameters.ValueType.Float) { - localSettersParameterDrivers.Last().paramDriver.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + localSettersParameterDrivers.Last().paramDriver.parameters.Add(new() { name = intNFloatSyncerParamName + j, source = param.name, @@ -488,18 +459,17 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, sourceMax = 1 }); - remoteSettersParameterDrivers.Last().paramDriver.parameters.Add( - new VRC_AvatarParameterDriver.Parameter() - { - name = param.name, - source = intNFloatSyncerParamName + j, - type = VRC_AvatarParameterDriver.ChangeType.Copy, - convertRange = true, - destMin = 0, - destMax = 1, - sourceMin = 0, - sourceMax = 255 - }); + remoteSettersParameterDrivers.Last().paramDriver.parameters.Add(new() + { + name = param.name, + source = intNFloatSyncerParamName + j, + type = VRC_AvatarParameterDriver.ChangeType.Copy, + convertRange = true, + destMin = 0, + destMax = 1, + sourceMin = 0, + sourceMax = 255 + }); } else { @@ -514,32 +484,32 @@ private static void CreateParameterDrivers(MemoryOptimizerState optimizerState, private static void CreateStates(MemoryOptimizerState optimizerState, int syncSteps, float stepDelay, bool generateChangeDetection) { - string syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); + var syncStepsBinary = (syncSteps - 1).DecimalToBinary().ToString(); - AnimatorStateMachine localStateMachine = optimizerState.localStateMachine; - AnimatorStateMachine remoteStateMachine = optimizerState.remoteStateMachine; + var localStateMachine = optimizerState.localStateMachine; + var remoteStateMachine = optimizerState.remoteStateMachine; - List localSetStates = new List(); - List localResetStates = new List(); - List remoteSetStates = new List(); + List localSetStates = new(); + List localResetStates = new(); + List remoteSetStates = new(); - for (int i = 0; i < syncSteps; i++) + for (var i = 0; i < syncSteps; i++) { // convert i to binary, so it can be used for the binary counter - string currentIndex = i.DecimalToBinary().ToString(); + var currentIndex = i.DecimalToBinary().ToString(); while (currentIndex.Length < syncStepsBinary.Length) { currentIndex = "0" + currentIndex; } // add the local set and reset states - localSetStates.Add(localStateMachine.AddState("Set Value " + (i + 1), AngleRadiusToPos(((float)i / syncSteps + 0.5f) * (float)Math.PI * 2f, 400f, new Vector3(0, 600, 0)))); + localSetStates.Add(localStateMachine.AddState("Set Value " + (i + 1), AngleRadiusToPos(((float)i / syncSteps + 0.5f) * (float)Math.PI * 2f, 400f, new(0, 600, 0)))); localSetStates.Last().hideFlags = HideFlags.HideInHierarchy; localSetStates.Last().motion = optimizerState.oneSecBuffer; if (generateChangeDetection) { - localResetStates.Add(localStateMachine.AddState("Reset Change Detection " + (i + 1), AngleRadiusToPos(((float)i / syncSteps + 0.5f) * (float)Math.PI * 2f + ((float)Math.PI * 0.25f), 480f, new Vector3(0, 600, 0)))); + localResetStates.Add(localStateMachine.AddState("Reset Change Detection " + (i + 1), AngleRadiusToPos(((float)i / syncSteps + 0.5f) * (float)Math.PI * 2f + ((float)Math.PI * 0.25f), 480f, new(0, 600, 0)))); localResetStates.Last().hideFlags = HideFlags.HideInHierarchy; localResetStates.Last().motion = optimizerState.oneSecBuffer; @@ -555,7 +525,7 @@ private static void CreateStates(MemoryOptimizerState optimizerState, int syncSt } // add the remote set states - remoteSetStates.Add(remoteStateMachine.AddState("Set values for index " + (i + 1), AngleRadiusToPos(((float)i / syncSteps + 0.5f) * (float)Math.PI * 2f, 250f, new Vector3(0, 400, 0)))); + remoteSetStates.Add(remoteStateMachine.AddState("Set values for index " + (i + 1), AngleRadiusToPos(((float)i / syncSteps + 0.5f) * (float)Math.PI * 2f, 250f, new(0, 400, 0)))); remoteSetStates.Last().hideFlags = HideFlags.HideInHierarchy; remoteSetStates.Last().motion = optimizerState.oneFrameBuffer; } @@ -568,22 +538,24 @@ private static void CreateStates(MemoryOptimizerState optimizerState, int syncSt private static (AnimationClip oneFrameBuffer, AnimationClip oneSecBuffer) BufferAnims(string generatedAssetsFilePath) { // create and overwrite single frame buffer animation - AnimationClip oneFrameBuffer = new AnimationClip() { name = oneFrameBufferAnimName, }; - AnimationCurve oneFrameBufferCurve = new AnimationCurve(); + AnimationClip oneFrameBuffer = new() { name = oneFrameBufferAnimName, }; + AnimationCurve oneFrameBufferCurve = new(); oneFrameBufferCurve.AddKey(0, 0); oneFrameBufferCurve.AddKey(1 / 60f, 1); + oneFrameBuffer.SetCurve("", typeof(GameObject), "DO NOT CHANGE THIS ANIMATION", oneFrameBufferCurve); AssetDatabase.DeleteAsset(generatedAssetsFilePath + oneFrameBuffer.name + ".anim"); AssetDatabase.CreateAsset(oneFrameBuffer, generatedAssetsFilePath + oneFrameBuffer.name + ".anim"); // create and overwrite one second buffer animation - AnimationClip oneSecBuffer = new AnimationClip() { name = oneSecBufferAnimName, }; - AnimationCurve oneSecBufferCurve = new AnimationCurve(); + AnimationClip oneSecBuffer = new() { name = oneSecBufferAnimName, }; + AnimationCurve oneSecBufferCurve = new(); oneSecBufferCurve.AddKey(0, 0); oneSecBufferCurve.AddKey(1, 1); + oneSecBuffer.SetCurve("", typeof(GameObject), "DO NOT CHANGE THIS ANIMATION", oneSecBufferCurve); AssetDatabase.DeleteAsset(generatedAssetsFilePath + oneSecBuffer.name + ".anim"); @@ -594,33 +566,33 @@ private static (AnimationClip oneFrameBuffer, AnimationClip oneSecBuffer) Buffer private static void SetupParameterDrivers(MemoryOptimizerState optimizerState) { - List localSettersParameterDrivers = optimizerState.localSettersParameterDrivers; - List remoteSettersParameterDrivers = optimizerState.remoteSettersParameterDrivers; - List localSetStates = optimizerState.localSetStates; - List localResetStates = optimizerState.localResetStates; + var localSettersParameterDrivers = optimizerState.localSettersParameterDrivers; + var remoteSettersParameterDrivers = optimizerState.remoteSettersParameterDrivers; + var localSetStates = optimizerState.localSetStates; + var localResetStates = optimizerState.localResetStates; - foreach (ParamDriversAndStates driver in localSettersParameterDrivers) + foreach (var driver in localSettersParameterDrivers) { - foreach (AnimatorState state in driver.states) + foreach (var state in driver.states) { - VRCAvatarParameterDriver temp = state.AddStateMachineBehaviour(); + var temp = state.AddStateMachineBehaviour(); temp.parameters = driver.paramDriver.parameters.ToList(); } } - foreach (ParamDriversAndStates driver in remoteSettersParameterDrivers) + foreach (var driver in remoteSettersParameterDrivers) { - foreach (AnimatorState state in driver.states) + foreach (var state in driver.states) { - VRCAvatarParameterDriver temp = state.AddStateMachineBehaviour(); + var temp = state.AddStateMachineBehaviour(); temp.parameters = driver.paramDriver.parameters; } } - foreach (AnimatorState state in localSetStates) + foreach (var state in localSetStates) { - VRCAvatarParameterDriver temp = (VRCAvatarParameterDriver)state.behaviours[0]; - temp.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + var temp = (VRCAvatarParameterDriver)state.behaviours[0]; + temp.parameters.Add(new() { name = smoothingAmountParamName, type = VRC_AvatarParameterDriver.ChangeType.Set, @@ -628,10 +600,10 @@ private static void SetupParameterDrivers(MemoryOptimizerState optimizerState) }); } - foreach (AnimatorState state in localResetStates) + foreach (var state in localResetStates) { - VRCAvatarParameterDriver temp = (VRCAvatarParameterDriver)state.behaviours[0]; - temp.parameters.Add(new VRC_AvatarParameterDriver.Parameter() + var temp = (VRCAvatarParameterDriver)state.behaviours[0]; + temp.parameters.Add(new() { name = smoothingAmountParamName, type = VRC_AvatarParameterDriver.ChangeType.Set, @@ -642,27 +614,27 @@ private static void SetupParameterDrivers(MemoryOptimizerState optimizerState) private static void CreateLocalRemoteSplit(MemoryOptimizerState optimizerState) { - AnimatorControllerLayer syncingLayer = optimizerState.syncingLayer; - AnimatorState localRemoteSplitState = syncingLayer.stateMachine.AddState("Local/Remote split", position: new Vector3(0, 100, 0)); + var syncingLayer = optimizerState.syncingLayer; + var localRemoteSplitState = syncingLayer.stateMachine.AddState("Local/Remote split", position: new(0, 100, 0)); localRemoteSplitState.motion = optimizerState.oneFrameBuffer; localRemoteSplitState.hideFlags = HideFlags.HideInHierarchy; syncingLayer.stateMachine.defaultState = localRemoteSplitState; - AnimatorStateMachine localStateMachine = syncingLayer.stateMachine.AddStateMachine("Local", position: new Vector3(100, 200, 0)); + var localStateMachine = syncingLayer.stateMachine.AddStateMachine("Local", position: new(100, 200, 0)); localStateMachine.hideFlags = HideFlags.HideInHierarchy; - AnimatorStateMachine remoteStateMachine = syncingLayer.stateMachine.AddStateMachine("Remote", position: new Vector3(-100, 200, 0)); + var remoteStateMachine = syncingLayer.stateMachine.AddStateMachine("Remote", position: new(-100, 200, 0)); remoteStateMachine.hideFlags = HideFlags.HideInHierarchy; - localStateMachine.anyStatePosition = new Vector3(20, 20, 0); - localStateMachine.entryPosition = new Vector3(20, 50, 0); + localStateMachine.anyStatePosition = new(20, 20, 0); + localStateMachine.entryPosition = new(20, 50, 0); - remoteStateMachine.anyStatePosition = new Vector3(20, 20, 0); - remoteStateMachine.entryPosition = new Vector3(20, 50, 0); + remoteStateMachine.anyStatePosition = new(20, 20, 0); + remoteStateMachine.entryPosition = new(20, 50, 0); - AnimatorStateTransition localTransition = localRemoteSplitState.AddTransition(localStateMachine); - AnimatorStateTransition remoteTransition = localRemoteSplitState.AddTransition(remoteStateMachine); + var localTransition = localRemoteSplitState.AddTransition(localStateMachine); + var remoteTransition = localRemoteSplitState.AddTransition(remoteStateMachine); // in some rare cases some types of FaceTracking (or other OSC based components) use a float-based IsLocal parameter // this will prevent the layer from working correctly as the transition binding no longer matches the type @@ -683,11 +655,11 @@ private static void CreateLocalRemoteSplit(MemoryOptimizerState optimizerState) public static void UninstallMemOpt(VRCAvatarDescriptor avatar, AnimatorController fxLayer, VRCExpressionParameters expressionParameters) { - List generatedExpressionParams = new List(); - List optimizedParams = new List(); - List generatedAnimatorParams = new List(); + List generatedExpressionParams = new(); + List optimizedParams = new(); + List generatedAnimatorParams = new(); - foreach (AnimatorControllerParameter controllerParam in fxLayer.parameters) + foreach (var controllerParam in fxLayer.parameters) { if (controllerParam.name.Contains(prefix)) { @@ -695,8 +667,8 @@ public static void UninstallMemOpt(VRCAvatarDescriptor avatar, AnimatorControlle } } - List mainBlendTreeLayers = fxLayer.FindHiddenIdentifier(mainBlendTreeIdentifier); - List syncingLayers = fxLayer.FindHiddenIdentifier(syncingLayerIdentifier); + var mainBlendTreeLayers = fxLayer.FindHiddenIdentifier(mainBlendTreeIdentifier); + var syncingLayers = fxLayer.FindHiddenIdentifier(syncingLayerIdentifier); if (mainBlendTreeLayers.Count > 1) { @@ -708,7 +680,7 @@ public static void UninstallMemOpt(VRCAvatarDescriptor avatar, AnimatorControlle if (syncingLayers.Count != 1) { - string s = (mainBlendTreeLayers.Count > 1) ? "many" : "few"; + var s = (mainBlendTreeLayers.Count > 1) ? "many" : "few"; if (UninstallErrorDialogWithDiscordLink($"Too {s} syncing layers found", $"Too {s} syncing layers found! {syncingLayers.Count} found. \nPlease join the discord for support. \nKeep in mind there are backups made by default by the script!", discordLink) != 0) { return; @@ -716,26 +688,20 @@ public static void UninstallMemOpt(VRCAvatarDescriptor avatar, AnimatorControlle } else { - List states = syncingLayers[0].FindAllStatesInLayer(); - List setStates = states.Where(x => x.state.name.Contains("Set Value ")).ToList(); - foreach (ChildAnimatorState state in setStates) + var states = syncingLayers[0].FindAllStatesInLayer(); + var setStates = states.Where(x => x.state.name.Contains("Set Value ")).ToList(); + foreach (var state in setStates) { - VRCAvatarParameterDriver paramdriver = (VRCAvatarParameterDriver)state.state.behaviours[0]; - List paramdriverParams = paramdriver.parameters; - foreach (VRC_AvatarParameterDriver.Parameter param in paramdriverParams) + var avatarParameterDriver = (VRCAvatarParameterDriver)state.state.behaviours[0]; + var avatarParameterDriverParameters = avatarParameterDriver.parameters; + foreach (var param in avatarParameterDriverParameters.Where(param => !string.IsNullOrEmpty(param.source))) { - if (!String.IsNullOrEmpty(param.source)) - { - foreach (VRCExpressionParameters.Parameter item in expressionParameters.parameters.Where(x => x.name == param.source)) - { - optimizedParams.Add(item); - } - } + optimizedParams.AddRange(expressionParameters.parameters.Where(x => x.name == param.source)); } } } - foreach (VRCExpressionParameters.Parameter item in expressionParameters.parameters.Where(x => x.name.Contains(prefix))) + foreach (var item in expressionParameters.parameters.Where(x => x.name.Contains(prefix))) { generatedExpressionParams.Add(item); } @@ -764,32 +730,32 @@ public static void UninstallMemOpt(VRCAvatarDescriptor avatar, AnimatorControlle } } - foreach (AnimatorControllerLayer mainBlendTreeLayer in mainBlendTreeLayers) + foreach (var mainBlendTreeLayer in mainBlendTreeLayers) { // Debug.Log("[MemoryOptimizer] Animator layer " + mainBlendTreeLayer.name + " of index " + fxLayer.FindLayerIndex(mainBlendTreeLayer) + " is being deleted"); DeleteBlendTreeFromAsset((BlendTree)mainBlendTreeLayer.stateMachine.states[0].state.motion); fxLayer.RemoveLayer(mainBlendTreeLayer); } - foreach (AnimatorControllerLayer syncingLayer in syncingLayers) + foreach (var syncingLayer in syncingLayers) { // Debug.Log("[MemoryOptimizer] Animator layer " + syncingLayer.name + " of index " + fxLayer.FindLayerIndex(syncingLayer) + " is being deleted"); fxLayer.RemoveLayer(syncingLayer); } - foreach (VRCExpressionParameters.Parameter param in generatedExpressionParams) + foreach (var param in generatedExpressionParams) { // Debug.Log("[MemoryOptimizer] Expression param " + param.name + " of type: " + param.valueType + " is being deleted"); expressionParameters.parameters = expressionParameters.parameters.Where(x => x != param).ToArray(); } - foreach (AnimatorControllerParameter param in generatedAnimatorParams) + foreach (var param in generatedAnimatorParams) { // Debug.Log("[MemoryOptimizer] Controller param " + param.name + " of type: " + param.type + " is being deleted"); fxLayer.RemoveParameter(param); } - foreach (VRCExpressionParameters.Parameter param in optimizedParams) + foreach (var param in optimizedParams) { // Debug.Log("[MemoryOptimizer] Optimized param " + param.name + " of type: " + param.valueType + " setting to sync"); param.networkSynced = true; diff --git a/Editor/MemoryOptimizerWindow.cs b/Editor/MemoryOptimizerWindow.cs index ad776c3..01dd339 100644 --- a/Editor/MemoryOptimizerWindow.cs +++ b/Editor/MemoryOptimizerWindow.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using JeTeeS.MemoryOptimizer.Helper; using JeTeeS.MemoryOptimizer.Shared; using JeTeeS.TES.HelperFunctions; using UnityEditor; @@ -11,19 +12,12 @@ using static JeTeeS.MemoryOptimizer.MemoryOptimizerWindow.SqueezeScope; using static JeTeeS.MemoryOptimizer.MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType; using static JeTeeS.TES.HelperFunctions.TESHelperFunctions; +using static JeTeeS.MemoryOptimizer.Shared.MemoryOptimizerConstants; namespace JeTeeS.MemoryOptimizer { internal class MemoryOptimizerWindow : EditorWindow { - private const string menuPath = "Tools/TES/MemoryOptimizer"; - private const string defaultSavePath = "Assets/TES/MemOpt"; - private const string prefKey = "Mem_Opt_Pref_"; - private const string unlockSyncStepsEPKey = prefKey + "UnlockSyncSteps"; - private const string backUpModeEPKey = prefKey + "BackUpMode"; - private const string savePathPPKey = prefKey + "SavePath"; - private const int maxUnsyncedParams = 8192; - internal static MemoryOptimizerComponent _component; private string currentSavePath; @@ -31,9 +25,6 @@ internal class MemoryOptimizerWindow : EditorWindow private bool unlockSyncSteps = false; private int backupMode = 0; - - internal static readonly string[] wdOptions = { "Auto-Detect", "Off", "On" }; - internal static readonly string[] backupModes = { "On", "Off", "Ask" }; private int tab = 0; private Vector2 scrollPosition; @@ -99,7 +90,6 @@ private void Awake() syncSteps = _component.syncSteps; stepDelay = _component.stepDelay; changeDetectionEnabled = _component.changeDetection; - savePathOverride = _component.savePathOverride; } } @@ -308,12 +298,12 @@ void OnAvatarChange() GUI.enabled = false; EditorGUILayout.TextArea(expressionParameters.parameters[i].name, GUILayout.MinWidth(longestParamName * 8)); - EditorGUILayout.Popup((int)expressionParameters.parameters[i].valueType, _paramTypes, GUILayout.Width(50)); + EditorGUILayout.Popup((int)expressionParameters.parameters[i].valueType, paramTypes, GUILayout.Width(50)); GUI.enabled = true; // System already installed - if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) + if (MemoryOptimizerHelper.IsSystemInstalled(avatarFXLayer)) { GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 1); GUI.enabled = false; @@ -402,7 +392,7 @@ void OnAvatarChange() using (new SqueezeScope((0, 0, EditorH, EditorStyles.helpBox))) { - if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) + if (MemoryOptimizerHelper.IsSystemInstalled(avatarFXLayer)) { GUI.backgroundColor = Color.black; GUILayout.Label("System Already Installed!", EditorStyles.boldLabel); @@ -438,7 +428,7 @@ void OnAvatarChange() if (_component is null) { - if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) + if (MemoryOptimizerHelper.IsSystemInstalled(avatarFXLayer)) { if (GUILayout.Button("Uninstall")) { @@ -468,7 +458,6 @@ void OnAvatarChange() _component.syncSteps = syncSteps; _component.stepDelay = stepDelay; _component.changeDetection = changeDetectionEnabled; - _component.savePathOverride = savePathOverride; foreach (var data in paramList) { @@ -488,7 +477,7 @@ void OnAvatarChange() Close(); } } - else if (MemoryOptimizerMain.IsSystemInstalled(avatarFXLayer)) + else if (MemoryOptimizerHelper.IsSystemInstalled(avatarFXLayer)) { GUI.enabled = false; GUI.backgroundColor = Color.black; @@ -544,15 +533,19 @@ void OnAvatarChange() case 1: using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { - // Backup Mode - using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) + // hide backup mode for component editing + if (_component is null) { - EditorGUILayout.LabelField("Backup Mode: ", EditorStyles.boldLabel); - EditorPrefs.SetInt(backUpModeEPKey, EditorGUILayout.Popup(backupMode, backupModes, new GUIStyle(EditorStyles.popup) { fixedHeight = 18, stretchWidth = false })); + // Backup Mode + using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) + { + EditorGUILayout.LabelField("Backup Mode: ", EditorStyles.boldLabel); + EditorPrefs.SetInt(backUpModeEPKey, EditorGUILayout.Popup(backupMode, backupModes, new GUIStyle(EditorStyles.popup) { fixedHeight = 18, stretchWidth = false })); + } + + GUILayout.Space(5); } - GUILayout.Space(5); - // Unlock sync steps button GUI.backgroundColor = unlockSyncSteps ? Color.green : Color.red; @@ -565,6 +558,10 @@ void OnAvatarChange() GUILayout.Space(5); + if (_component is null) + { + + } // save path using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index cfc5be0..a21a629 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -2,35 +2,20 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using JeTeeS.MemoryOptimizer.Helper; using JeTeeS.MemoryOptimizer.Shared; +using UnityEditor.Animations; using UnityEngine; using VRC.SDK3.Avatars.Components; using VRC.SDK3.Avatars.ScriptableObjects; using VRC.SDKBase.Editor.BuildPipeline; +using static JeTeeS.MemoryOptimizer.Shared.MemoryOptimizerConstants; using static JeTeeS.TES.HelperFunctions.TESHelperFunctions; namespace JeTeeS.MemoryOptimizer.Pipeline { internal class MemoryOptimizerUploadPipeline : IVRCSDKPreprocessAvatarCallback { - private readonly string[] _animatorParamTypes = - { - "", - // 1 - "Float", - "", - // 3 - "Int", - // 4 - "Bool", - "", - "", - "", - "", - // 9 - "Trigger" - }; - // VRCFury runs at -10000 // VRChat strips components at -1024 // So we preprocess in between but not too close to the stripping of components @@ -47,15 +32,50 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) return true; } + var fxLayer = FindFXLayer(vrcAvatarDescriptor); var parameters = vrcAvatarDescriptor.expressionParameters?.parameters ?? Array.Empty(); + // skip if we have no fx layer, or system is installed, or we don't have parameters + if (fxLayer is null || MemoryOptimizerHelper.IsSystemInstalled(fxLayer) || parameters.Length <= 0) + { + return true; + } + + var (copiedFxLayerSuccess, copiedFxLayer) = MakeCopyOf(fxLayer, $"Packages/dev.jetees.memoryoptimizer/Temp/Generated_{avatarGameObject.name.SanitizeFileName()}/", $"{prefix}_GeneratedFxLayer"); + var (copiedExpressionParametersSuccess, copiedExpressionParameters) = MakeCopyOf(vrcAvatarDescriptor.expressionParameters, $"Packages/dev.jetees.memoryoptimizer/Temp/Generated_{avatarGameObject.name.SanitizeFileName()}/", $"{prefix}_GeneratedExpressionParameters"); + + // throw error when copy fails + if (!copiedFxLayerSuccess || !copiedExpressionParametersSuccess) + { + return false; + } + + // setup copies + // we make the avatar reference copies to not break any original assets + fxLayer = copiedFxLayer; + parameters = copiedExpressionParameters.parameters; + + vrcAvatarDescriptor.expressionParameters = copiedExpressionParameters; + for (int i = 0, l = vrcAvatarDescriptor.baseAnimationLayers.Length; i < l; i++) + { + // find the fx layer and replace it + if (vrcAvatarDescriptor.baseAnimationLayers[i] is { type: VRCAvatarDescriptor.AnimLayerType.FX, animatorController: not null }) + { + var layer = vrcAvatarDescriptor.baseAnimationLayers[i]; + + layer.animatorController = fxLayer; + + vrcAvatarDescriptor.baseAnimationLayers[i] = layer; + + break; + } + } + Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar running on {avatarGameObject.name} with {parameters.Length} parameters - loaded configuration: {memoryOptimizer.savedParameterConfigurations.Where(p => p.selected && p.willBeOptimized).ToList().Count}"); var parametersBoolToOptimize = new List(0); var parametersIntNFloatToOptimize = new List(0); - var fxLayer = FindFXLayer(vrcAvatarDescriptor); - foreach (var savedParameterConfiguration in memoryOptimizer.savedParameterConfigurations) { // find actual parameter diff --git a/Helper/MemoryOptimizerHelper.cs b/Helper/MemoryOptimizerHelper.cs new file mode 100644 index 0000000..1e39f78 --- /dev/null +++ b/Helper/MemoryOptimizerHelper.cs @@ -0,0 +1,39 @@ +#if UNITY_EDITOR + +using JeTeeS.TES.HelperFunctions; +using UnityEditor.Animations; +using VRC.SDK3.Avatars.Components; +using static JeTeeS.MemoryOptimizer.Shared.MemoryOptimizerConstants; + +namespace JeTeeS.MemoryOptimizer.Helper +{ + internal static class MemoryOptimizerHelper + { + public static bool IsSystemInstalled(VRCAvatarDescriptor descriptor) + { + return IsSystemInstalled(TESHelperFunctions.FindFXLayer(descriptor)); + } + + public static bool IsSystemInstalled(AnimatorController controller) + { + if (controller is null) + { + return false; + } + + if (controller.FindHiddenIdentifier(syncingLayerIdentifier).Count == 1) + { + return true; + } + + if (controller.FindHiddenIdentifier(mainBlendTreeIdentifier).Count == 1) + { + return true; + } + + return false; + } + } +} + +#endif diff --git a/Helper/MemoryOptimizerHelper.cs.meta b/Helper/MemoryOptimizerHelper.cs.meta new file mode 100644 index 0000000..a0a38b6 --- /dev/null +++ b/Helper/MemoryOptimizerHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 89c06548ea0d4983bb65e6b12f3cca0a +timeCreated: 1727874331 \ No newline at end of file diff --git a/Helper/TESHelperFunctions.cs b/Helper/TESHelperFunctions.cs index 0667850..6c83ed2 100644 --- a/Helper/TESHelperFunctions.cs +++ b/Helper/TESHelperFunctions.cs @@ -13,22 +13,20 @@ namespace JeTeeS.TES.HelperFunctions { internal static class TESHelperFunctions { - internal static readonly string[] _paramTypes = { "Int", "Float", "Bool" }; - public static string SanitizeFileName(this string fileName) { - return String.Join("_", fileName.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)); + return string.Join("_", fileName.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)); } public static void MakeBackupOf(List things, string saveTo) { ReadyPath(saveTo); - foreach (UnityEngine.Object obj in things) + foreach (var obj in things) { - int i = 0; - List splitAssetname = GetAssetName(obj).Split('.').ToList(); - string assetName = ""; - foreach (string strng in splitAssetname.Take(splitAssetname.Count - 1)) + var i = 0; + var splitAssetname = GetAssetName(obj).Split('.').ToList(); + var assetName = ""; + foreach (var strng in splitAssetname.Take(splitAssetname.Count - 1)) { assetName += strng; } @@ -44,37 +42,59 @@ public static void MakeBackupOf(List things, string saveTo) } } } - - public static string GetFileType(UnityEngine.Object obj) + + /// + /// Makes a copy and returns the copy with a success status + /// + /// + /// + /// + /// + public static (bool, T) MakeCopyOf(UnityEngine.Object thing, string saveTo, string newThingName = null) where T : UnityEngine.Object { - string fileName = GetAssetName(obj); - if (!string.IsNullOrEmpty(fileName)) + bool success = false; + UnityEngine.Object copiedThing = null; + + ReadyPath(saveTo); + + string assetName = GetAssetName(thing); + string assetFileType = GetFileType(thing); + + string copiedAssetPath = saveTo + (string.IsNullOrEmpty(newThingName) ? assetName[..^$".{assetFileType}".Length] : newThingName) + "." + GetFileType(thing); + + if (!AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(thing), copiedAssetPath)) { - return fileName.Split('.').ToList().Last(); + Debug.LogWarning($"Failed to copy '{AssetDatabase.GetAssetPath(thing)}' to path: '{copiedAssetPath}'"); } - - return null; + else + { + success = true; + copiedThing = AssetDatabase.LoadAssetAtPath(copiedAssetPath); + } + + return (success, (T)copiedThing); + } + + public static string GetFileType(UnityEngine.Object obj) + { + var fileName = GetAssetName(obj); + return !string.IsNullOrEmpty(fileName) ? fileName.Split('.')[^1] : null; } public static string GetAssetName(string path) { - if (!string.IsNullOrEmpty(path)) - { - return path.Split(@"\/".ToCharArray()).ToList().Last(); - } - - return null; + return !string.IsNullOrEmpty(path) ? path.Split(@"\/".ToCharArray())[^1] : null; } public static string GetAssetName(UnityEngine.Object thing) { - string path = AssetDatabase.GetAssetPath(thing); + var path = AssetDatabase.GetAssetPath(thing); return GetAssetName(path); } public static int UninstallErrorDialogWithDiscordLink(string title, string mainMessage, string discordLink) { - int option = EditorUtility.DisplayDialogComplex(title, mainMessage, "Continue uninstall anyways (not recommended)", "Cancel uninstall", "Join the discord"); + var option = EditorUtility.DisplayDialogComplex(title, mainMessage, "Continue uninstall anyways (not recommended)", "Cancel uninstall", "Join the discord"); switch (option) { case 0: @@ -92,49 +112,49 @@ public static int UninstallErrorDialogWithDiscordLink(string title, string mainM public static AnimatorController FindFXLayer(VRCAvatarDescriptor descriptor) { - return (AnimatorController)descriptor.baseAnimationLayers.FirstOrDefault(x => x.type == VRCAvatarDescriptor.AnimLayerType.FX && x.animatorController != null).animatorController; - } + var controller = descriptor.baseAnimationLayers.FirstOrDefault(x => x is { type: VRCAvatarDescriptor.AnimLayerType.FX, animatorController: not null }).animatorController; - public static VRCExpressionParameters FindExpressionParams(VRCAvatarDescriptor descriptor) - { - if (descriptor is null) + if (controller is AnimatorController fxController) { - return null; + return fxController; } - return descriptor.expressionParameters; + return null; + } + + public static VRCExpressionParameters FindExpressionParams(VRCAvatarDescriptor descriptor) + { + return descriptor?.expressionParameters; } public static AnimatorControllerParameterType ValueTypeToParamType(this VRCExpressionParameters.ValueType valueType) { - switch (valueType) + return valueType switch { - case VRCExpressionParameters.ValueType.Float: return AnimatorControllerParameterType.Float; - case VRCExpressionParameters.ValueType.Int: return AnimatorControllerParameterType.Int; - case VRCExpressionParameters.ValueType.Bool: return AnimatorControllerParameterType.Bool; - - default: return AnimatorControllerParameterType.Float; - } + VRCExpressionParameters.ValueType.Float => AnimatorControllerParameterType.Float, + VRCExpressionParameters.ValueType.Int => AnimatorControllerParameterType.Int, + VRCExpressionParameters.ValueType.Bool => AnimatorControllerParameterType.Bool, + _ => AnimatorControllerParameterType.Float + }; } public static VRCExpressionParameters.ValueType ParamTypeToValueType(this AnimatorControllerParameterType paramType) { - switch (paramType) + return paramType switch { - case AnimatorControllerParameterType.Float: return VRCExpressionParameters.ValueType.Float; - case AnimatorControllerParameterType.Int: return VRCExpressionParameters.ValueType.Int; - case AnimatorControllerParameterType.Bool: return VRCExpressionParameters.ValueType.Bool; - - default: return VRCExpressionParameters.ValueType.Float; - } + AnimatorControllerParameterType.Float => VRCExpressionParameters.ValueType.Float, + AnimatorControllerParameterType.Int => VRCExpressionParameters.ValueType.Int, + AnimatorControllerParameterType.Bool => VRCExpressionParameters.ValueType.Bool, + _ => VRCExpressionParameters.ValueType.Float + }; } public static string GetControllerParentFolder(AnimatorController controller) { - List subPaths = controller.GetAssetPath().Split(@"\/".ToCharArray()).ToList(); + var subPaths = controller.GetAssetPath().Split(@"\/".ToCharArray()).ToList(); subPaths.RemoveAt(subPaths.Count - 1); - string returnString = ""; - foreach (string subPath in subPaths) + var returnString = ""; + foreach (var subPath in subPaths) { returnString += subPath + "/"; } @@ -144,7 +164,7 @@ public static string GetControllerParentFolder(AnimatorController controller) public static Vector3 AngleRadiusToPos(float angle, float radius, Vector3 offset) { - Vector3 result = new Vector3((float)Math.Sin(angle) * radius, (float)Math.Cos(angle) * radius, 0); + Vector3 result = new((float)Math.Sin(angle) * radius, (float)Math.Cos(angle) * radius, 0); result += offset; return result; @@ -159,7 +179,7 @@ public static void LabelWithHelpBox(string text) public static int FindLayerIndex(this AnimatorController controller, AnimatorControllerLayer layer) { - for (int i = 0; i < controller.layers.Count(); i++) + for (var i = 0; i < controller.layers.Count(); i++) { if (controller.layers[i].stateMachine == layer.stateMachine) { @@ -172,7 +192,7 @@ public static int FindLayerIndex(this AnimatorController controller, AnimatorCon public static void RemoveLayer(this AnimatorController controller, AnimatorControllerLayer layer) { - int i = controller.FindLayerIndex(layer); + var i = controller.FindLayerIndex(layer); if (i == -1) { Debug.LogError("Layer " + layer.name + "was not found in " + controller.name); @@ -184,19 +204,19 @@ public static void RemoveLayer(this AnimatorController controller, AnimatorContr public static List FindAllStatesInLayer(this AnimatorControllerLayer layer) { - List returnList = new List(); + List returnList = new(); - Queue stateMachines = new Queue(); + Queue stateMachines = new(); stateMachines.Enqueue(layer.stateMachine); while (stateMachines.Count > 0) { - AnimatorStateMachine currentStateMachine = stateMachines.Dequeue(); - foreach (ChildAnimatorState state in currentStateMachine.states) + var currentStateMachine = stateMachines.Dequeue(); + foreach (var state in currentStateMachine.states) { returnList.Add(state); } - foreach (ChildAnimatorStateMachine stateMachine in currentStateMachine.stateMachines) + foreach (var stateMachine in currentStateMachine.stateMachines) { stateMachines.Enqueue(stateMachine.stateMachine); } @@ -207,7 +227,7 @@ public static List FindAllStatesInLayer(this AnimatorControl public static int FindWDInLayer(this AnimatorControllerLayer layer) { - Queue stateQueue = new Queue(); + Queue stateQueue = new(); foreach (var state in layer.FindAllStatesInLayer()) { stateQueue.Enqueue(state); @@ -218,8 +238,8 @@ public static int FindWDInLayer(this AnimatorControllerLayer layer) return -2; } - ChildAnimatorState currentState = stateQueue.Dequeue(); - bool firstWD = currentState.state.writeDefaultValues; + var currentState = stateQueue.Dequeue(); + var firstWD = currentState.state.writeDefaultValues; while (stateQueue.Count > 1) { currentState = stateQueue.Dequeue(); @@ -235,9 +255,9 @@ public static int FindWDInLayer(this AnimatorControllerLayer layer) public static int FindWDInController(this AnimatorController controller) { - Queue layerQueue = new Queue(); - AnimatorControllerLayer currentLayer = new AnimatorControllerLayer(); - int firstWD = -2; + Queue layerQueue = new(); + AnimatorControllerLayer currentLayer = new(); + var firstWD = -2; foreach (var layer in controller.layers) { layerQueue.Enqueue(layer); @@ -286,7 +306,7 @@ public static bool IsBlendTreeLayer(this AnimatorControllerLayer layer) public static AnimatorControllerParameter AddUniqueParam(this AnimatorController controller, string paramName, AnimatorControllerParameterType paramType = AnimatorControllerParameterType.Float, float defaultValue = 0) { - foreach (AnimatorControllerParameter param in controller.parameters) + foreach (var param in controller.parameters) { if (param.name == paramName) { @@ -299,10 +319,10 @@ public static AnimatorControllerParameter AddUniqueParam(this AnimatorController } } - AnimatorControllerParameter controllerParam = new AnimatorControllerParameter(); + AnimatorControllerParameter controllerParam = new(); if (paramType == AnimatorControllerParameterType.Float) { - controllerParam = new AnimatorControllerParameter() + controllerParam = new() { name = paramName, type = paramType, @@ -311,7 +331,7 @@ public static AnimatorControllerParameter AddUniqueParam(this AnimatorController } else if (paramType == AnimatorControllerParameterType.Int) { - controllerParam = new AnimatorControllerParameter() + controllerParam = new() { name = paramName, type = paramType, @@ -320,7 +340,7 @@ public static AnimatorControllerParameter AddUniqueParam(this AnimatorController } else if (paramType == AnimatorControllerParameterType.Bool) { - controllerParam = new AnimatorControllerParameter() + controllerParam = new() { name = paramName, type = paramType, @@ -339,7 +359,7 @@ public static AnimatorControllerParameter AddUniqueParam(this AnimatorController public static void AddUniqueSyncedParam(this VRCExpressionParameters vrcExpressionParameters, string name, VRCExpressionParameters.ValueType valueType, bool isNetworkSynced = true, bool isSaved = true, float defaultValue = 0) { - foreach (VRCExpressionParameters.Parameter param in vrcExpressionParameters.parameters) + foreach (var param in vrcExpressionParameters.parameters) { if (param.name == name) { @@ -352,13 +372,13 @@ public static void AddUniqueSyncedParam(this VRCExpressionParameters vrcExpressi } } - VRCExpressionParameters.Parameter[] newList = new VRCExpressionParameters.Parameter[vrcExpressionParameters.parameters.Length + 1]; - for (int i = 0; i < vrcExpressionParameters.parameters.Length; i++) + var newList = new VRCExpressionParameters.Parameter[vrcExpressionParameters.parameters.Length + 1]; + for (var i = 0; i < vrcExpressionParameters.parameters.Length; i++) { newList[i] = vrcExpressionParameters.parameters[i]; } - newList[newList.Length - 1] = new VRCExpressionParameters.Parameter() + newList[^1] = new() { name = name, valueType = valueType, @@ -378,11 +398,11 @@ public static void AddUniqueSyncedParamToController(string name, AnimatorControl public static AnimatorControllerLayer AddLayer(this AnimatorController controller, string name, float defaultWeight = 1) { - AnimatorControllerLayer layer = new AnimatorControllerLayer() + AnimatorControllerLayer layer = new() { name = name, defaultWeight = defaultWeight, - stateMachine = new AnimatorStateMachine() { hideFlags = HideFlags.HideInHierarchy }, + stateMachine = new() { hideFlags = HideFlags.HideInHierarchy }, }; controller.AddLayer(layer); @@ -392,7 +412,7 @@ public static AnimatorControllerLayer AddLayer(this AnimatorController controlle public static void AddHiddenIdentifier(this AnimatorStateMachine animatorStateMachine, string identifierString) { - AnimatorStateTransition identifier = animatorStateMachine.AddAnyStateTransition((AnimatorStateMachine)null); + var identifier = animatorStateMachine.AddAnyStateTransition((AnimatorStateMachine)null); identifier.canTransitionToSelf = false; identifier.mute = true; identifier.isExit = true; @@ -406,11 +426,11 @@ public static List FindHiddenIdentifier(this AnimatorCo return null; } - List returnList = new List(); + List returnList = new(); - foreach (AnimatorControllerLayer layer in animatorController.layers) + foreach (var layer in animatorController.layers) { - foreach (AnimatorStateTransition anyStateTransition in layer.stateMachine.anyStateTransitions) + foreach (var anyStateTransition in layer.stateMachine.anyStateTransitions) { if (anyStateTransition.isExit && anyStateTransition.mute && anyStateTransition.name == identifierString) { @@ -445,9 +465,9 @@ public static AnimationClip MakeAAP(string[] paramNames, string saveAssetsTo, fl assetName = paramNames[0] + "_AAP " + value; } - string saveName = assetName.Replace('/', '_').SanitizeFileName(); - AnimationClip animClip = (AnimationClip)AssetDatabase.LoadAssetAtPath(saveAssetsTo + saveName + ".anim", typeof(AnimationClip)); - if (animClip != null) + var saveName = assetName.Replace('/', '_').SanitizeFileName(); + var animClip = (AnimationClip)AssetDatabase.LoadAssetAtPath(saveAssetsTo + saveName + ".anim", typeof(AnimationClip)); + if (animClip is not null) { return animClip; } @@ -455,17 +475,18 @@ public static AnimationClip MakeAAP(string[] paramNames, string saveAssetsTo, fl ReadyPath(saveAssetsTo); animLength /= 60f; - animClip = new AnimationClip + animClip = new() { name = assetName, wrapMode = WrapMode.Clamp, }; - foreach (string paramName in paramNames) + foreach (var paramName in paramNames) { - AnimationCurve curve = new AnimationCurve(); + AnimationCurve curve = new(); curve.AddKey(0, value); curve.AddKey(animLength, value); + animClip.SetCurve("", typeof(Animator), paramName, curve); } @@ -480,41 +501,32 @@ public static AnimationClip MakeAAP(string[] paramNames, string saveAssetsTo, fl public static void SaveUnsavedAssetsToController(this AnimatorController controller) { - Queue childStateMachines = new Queue(); - List states = new List(); - List transitions = new List(); + Queue childStateMachines = new(); + List states = new(); + List transitions = new(); - foreach (AnimatorControllerLayer layer in controller.layers) + foreach (var layer in controller.layers) { if (GetAssetPath(layer.stateMachine) == "") { layer.stateMachine.SaveToAsset(controller); } - - foreach (var state in layer.stateMachine.states) - { - states.Add(state); - } - foreach (ChildAnimatorStateMachine tempChildStateMachine in layer.stateMachine.stateMachines) + states.AddRange(layer.stateMachine.states); + + foreach (var tempChildStateMachine in layer.stateMachine.stateMachines) { childStateMachines.Enqueue(tempChildStateMachine); - foreach (ChildAnimatorState state in tempChildStateMachine.stateMachine.states) - { - states.Add(state); - } + states.AddRange(tempChildStateMachine.stateMachine.states); } while (childStateMachines.Count > 0) { - ChildAnimatorStateMachine childStateMachine = childStateMachines.Dequeue(); - foreach (ChildAnimatorStateMachine tempChildStateMachine in childStateMachine.stateMachine.stateMachines) + var childStateMachine = childStateMachines.Dequeue(); + foreach (var tempChildStateMachine in childStateMachine.stateMachine.stateMachines) { childStateMachines.Enqueue(tempChildStateMachine); - foreach (ChildAnimatorState state in tempChildStateMachine.stateMachine.states) - { - states.Add(state); - } + states.AddRange(tempChildStateMachine.stateMachine.states); } if (string.IsNullOrEmpty(GetAssetPath(childStateMachine.stateMachine))) @@ -523,19 +535,13 @@ public static void SaveUnsavedAssetsToController(this AnimatorController control } } - foreach (AnimatorStateTransition anyState in layer.stateMachine.anyStateTransitions) - { - transitions.Add(anyState); - } + transitions.AddRange(layer.stateMachine.anyStateTransitions); } - foreach (ChildAnimatorState state in states) + foreach (var state in states) { - foreach (AnimatorStateTransition transition in state.state.transitions) - { - transitions.Add(transition); - } - + transitions.AddRange(state.state.transitions); + if (string.IsNullOrEmpty(GetAssetPath(state.state))) { state.state.SaveToAsset(controller); @@ -547,28 +553,25 @@ public static void SaveUnsavedAssetsToController(this AnimatorController control } } - foreach (AnimatorStateTransition transition in transitions) + foreach (var transition in transitions.Where(transition => string.IsNullOrEmpty(GetAssetPath(transition)))) { - if (string.IsNullOrEmpty(GetAssetPath(transition))) - { - transition.SaveToAsset(controller); - } + transition.SaveToAsset(controller); } } public static void SaveUnsavedBlendtreesToController(BlendTree blendTree, UnityEngine.Object saveTo) { - Queue blendTrees = new Queue(); + Queue blendTrees = new(); blendTrees.Enqueue(blendTree); while (blendTrees.Count > 0) { - BlendTree subBlendTree = blendTrees.Dequeue(); + var subBlendTree = blendTrees.Dequeue(); if (string.IsNullOrEmpty(GetAssetPath(subBlendTree))) { subBlendTree.SaveToAsset(saveTo); } - foreach (ChildMotion child in subBlendTree.children) + foreach (var child in subBlendTree.children) { if (child.motion is BlendTree tree) { @@ -580,13 +583,13 @@ public static void SaveUnsavedBlendtreesToController(BlendTree blendTree, UnityE public static void DeleteBlendTreeFromAsset(BlendTree blendTree) { - Queue blendTrees = new Queue(); + Queue blendTrees = new(); blendTrees.Enqueue(blendTree); while (blendTrees.Count > 0) { - BlendTree subBlendTree = blendTrees.Dequeue(); + var subBlendTree = blendTrees.Dequeue(); AssetDatabase.RemoveObjectFromAsset(subBlendTree); - foreach (ChildMotion child in subBlendTree.children) + foreach (var child in subBlendTree.children) { if (child.motion is BlendTree tree) { @@ -598,17 +601,17 @@ public static void DeleteBlendTreeFromAsset(BlendTree blendTree) public static AnimatorControllerParameter AddSmoothedVer(this AnimatorControllerParameter param, float minValue, float maxValue, AnimatorController controller, string smoothedParamName, string saveTo, string smoothingAmountParamName = "SmoothingAmount", string mainBlendTreeIdentifier = "MainBlendTree", string mainBlendTreeLayerName = "MainBlendTree", string smoothingParentTreeName = "SmoothingParentTree", string constantOneName = "ConstantOne") { - BlendTree smoothingParentTree = GetOrGenerateChildTree(controller, smoothingParentTreeName, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); + var smoothingParentTree = GetOrGenerateChildTree(controller, smoothingParentTreeName, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); - AnimationClip smoothingAnimMin = MakeAAP(smoothedParamName, saveTo, minValue, 1, smoothedParamName + minValue); - AnimationClip smoothingAnimMax = MakeAAP(smoothedParamName, saveTo, maxValue, 1, smoothedParamName + maxValue); + var smoothingAnimMin = MakeAAP(smoothedParamName, saveTo, minValue, 1, smoothedParamName + minValue); + var smoothingAnimMax = MakeAAP(smoothedParamName, saveTo, maxValue, 1, smoothedParamName + maxValue); controller.AddUniqueParam(smoothingAmountParamName, AnimatorControllerParameterType.Float, 0.1f); - AnimatorControllerParameter constantOneParam = controller.AddUniqueParam(constantOneName, AnimatorControllerParameterType.Float, 1); - AnimatorControllerParameter smoothedParam = controller.AddUniqueParam(smoothedParamName); + var constantOneParam = controller.AddUniqueParam(constantOneName, AnimatorControllerParameterType.Float, 1); + var smoothedParam = controller.AddUniqueParam(smoothedParamName); - BlendTree smoothedValue = new BlendTree() + BlendTree smoothedValue = new() { blendType = BlendTreeType.Simple1D, blendParameter = smoothedParamName, @@ -617,7 +620,7 @@ public static AnimatorControllerParameter AddSmoothedVer(this AnimatorController hideFlags = HideFlags.HideInHierarchy }; - ChildMotion[] tempChildren = new ChildMotion[2]; + var tempChildren = new ChildMotion[2]; tempChildren[0].motion = smoothingAnimMin; tempChildren[0].timeScale = 1; tempChildren[0].threshold = minValue; @@ -628,7 +631,7 @@ public static AnimatorControllerParameter AddSmoothedVer(this AnimatorController smoothedValue.children = tempChildren; - BlendTree originalValue = new BlendTree() + BlendTree originalValue = new() { blendType = BlendTreeType.Simple1D, blendParameter = param.name, @@ -646,7 +649,7 @@ public static AnimatorControllerParameter AddSmoothedVer(this AnimatorController tempChildren[1].threshold = maxValue; originalValue.children = tempChildren; - BlendTree smoother = new BlendTree() + BlendTree smoother = new() { blendType = BlendTreeType.Simple1D, blendParameter = smoothingAmountParamName, @@ -662,19 +665,19 @@ public static AnimatorControllerParameter AddSmoothedVer(this AnimatorController smoothingParentTree.AddChild(smoother); tempChildren = smoothingParentTree.children; - tempChildren[tempChildren.Length - 1].directBlendParameter = constantOneParam.name; + tempChildren[^1].directBlendParameter = constantOneParam.name; smoothingParentTree.children = tempChildren; return smoothedParam; } public static AnimatorControllerParameter AddParamDifferential(AnimatorControllerParameter param1, AnimatorControllerParameter param2, AnimatorController controller, string saveTo, float minValue = -1, float maxValue = 1, string differentialParamName = "", string mainBlendTreeIdentifier = "MainBlendTree", string mainBlendTreeLayerName = "MainBlendTree", string differentialParentTreeName = "DifferentialParentTree", string constantOneName = "ConstantOne") { - BlendTree differentialParentTree = GetOrGenerateChildTree(controller, differentialParentTreeName, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); - AnimatorControllerParameter constantOneParam = controller.AddUniqueParam(constantOneName, AnimatorControllerParameterType.Float, 1); + var differentialParentTree = GetOrGenerateChildTree(controller, differentialParentTreeName, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); + var constantOneParam = controller.AddUniqueParam(constantOneName, AnimatorControllerParameterType.Float, 1); if (differentialParamName == "") { differentialParamName = param1.name + "_Minus_" + param2.name; - for (int i = 0; i < differentialParamName.Length; i++) + for (var i = 0; i < differentialParamName.Length; i++) { if (differentialParamName[i] == '/' || differentialParamName[i] == '\\') { @@ -683,31 +686,31 @@ public static AnimatorControllerParameter AddParamDifferential(AnimatorControlle } } - AnimatorControllerParameter differentialParam = controller.AddUniqueParam(differentialParamName); + var differentialParam = controller.AddUniqueParam(differentialParamName); if (minValue >= 0 && maxValue >= 0) { - AnimationClip animationClipNegative = MakeAAP(differentialParamName, saveTo, -1); - AnimationClip animationClipPositive = MakeAAP(differentialParamName, saveTo, 1); + var animationClipNegative = MakeAAP(differentialParamName, saveTo, -1); + var animationClipPositive = MakeAAP(differentialParamName, saveTo, 1); differentialParentTree.AddChild(animationClipPositive); differentialParentTree.AddChild(animationClipNegative); - ChildMotion[] tempChildren = differentialParentTree.children; - tempChildren[tempChildren.Length - 2].directBlendParameter = param1.name; - tempChildren[tempChildren.Length - 1].directBlendParameter = param2.name; + var tempChildren = differentialParentTree.children; + tempChildren[^2].directBlendParameter = param1.name; + tempChildren[^1].directBlendParameter = param2.name; differentialParentTree.children = tempChildren; } else { - AnimationClip animationClipMin = MakeAAP(differentialParamName, saveTo, minValue); - AnimationClip animationClipMax = MakeAAP(differentialParamName, saveTo, maxValue); + var animationClipMin = MakeAAP(differentialParamName, saveTo, minValue); + var animationClipMax = MakeAAP(differentialParamName, saveTo, maxValue); controller.AddUniqueParam(differentialParamName); - BlendTree param1Tree = new BlendTree() { blendType = BlendTreeType.Simple1D, blendParameter = param1.name, name = param1.name + "Tree", useAutomaticThresholds = false, hideFlags = HideFlags.HideInHierarchy }; - BlendTree param2Tree = new BlendTree() { blendType = BlendTreeType.Simple1D, blendParameter = param2.name, name = param2.name + "Tree", useAutomaticThresholds = false, hideFlags = HideFlags.HideInHierarchy }; + BlendTree param1Tree = new() { blendType = BlendTreeType.Simple1D, blendParameter = param1.name, name = param1.name + "Tree", useAutomaticThresholds = false, hideFlags = HideFlags.HideInHierarchy }; + BlendTree param2Tree = new() { blendType = BlendTreeType.Simple1D, blendParameter = param2.name, name = param2.name + "Tree", useAutomaticThresholds = false, hideFlags = HideFlags.HideInHierarchy }; - ChildMotion[] tempChildren = new ChildMotion[2]; + var tempChildren = new ChildMotion[2]; tempChildren[0].motion = animationClipMin; tempChildren[0].threshold = -1; tempChildren[0].timeScale = 1; @@ -729,8 +732,8 @@ public static AnimatorControllerParameter AddParamDifferential(AnimatorControlle differentialParentTree.AddChild(param2Tree); tempChildren = differentialParentTree.children; - tempChildren[tempChildren.Length - 2].directBlendParameter = constantOneParam.name; - tempChildren[tempChildren.Length - 1].directBlendParameter = constantOneParam.name; + tempChildren[^2].directBlendParameter = constantOneParam.name; + tempChildren[^1].directBlendParameter = constantOneParam.name; differentialParentTree.children = tempChildren; } @@ -741,7 +744,7 @@ public static AnimatorControllerParameter AddParamDifferential(AnimatorControlle private static BlendTree GetMainBlendTree(AnimatorController fxLayer, string mainBlendTreeIdentifier) { - List mainBlendTrees = FindHiddenIdentifier(fxLayer, mainBlendTreeIdentifier); + var mainBlendTrees = FindHiddenIdentifier(fxLayer, mainBlendTreeIdentifier); if (mainBlendTrees.Count > 0 && mainBlendTrees[0].stateMachine.states.Length > 0 && mainBlendTrees[0].stateMachine.states[0].state.motion is BlendTree tree) { @@ -755,23 +758,28 @@ private static BlendTree GenerateMainBlendTree(AnimatorController fxLayer, strin { fxLayer.AddUniqueParam(constantOneName, AnimatorControllerParameterType.Float, 1); - AnimatorControllerLayer mainBlendTreeLayer = AddLayer(fxLayer, layerName); + var mainBlendTreeLayer = AddLayer(fxLayer, layerName); mainBlendTreeLayer.stateMachine.name = layerName; - mainBlendTreeLayer.stateMachine.anyStatePosition = new Vector3(20, 20, 0); - mainBlendTreeLayer.stateMachine.entryPosition = new Vector3(20, 50, 0); - AnimatorState state = mainBlendTreeLayer.stateMachine.AddState("MainBlendTree (WD On)", new Vector3(0, 100, 0)); + mainBlendTreeLayer.stateMachine.anyStatePosition = new(20, 20, 0); + mainBlendTreeLayer.stateMachine.entryPosition = new(20, 50, 0); + + var state = mainBlendTreeLayer.stateMachine.AddState("MainBlendTree (WD On)", new(0, 100, 0)); state.hideFlags = HideFlags.HideInHierarchy; - BlendTree mainBlendTree = new BlendTree() + + BlendTree mainBlendTree = new() { hideFlags = HideFlags.HideInHierarchy, blendType = BlendTreeType.Direct, blendParameter = constantOneName, name = "MainBlendTree", }; + state.motion = mainBlendTree; state.writeDefaultValues = true; + mainBlendTreeLayer.stateMachine.AddHiddenIdentifier(mainBlendTreeIdentifier); + return (BlendTree)state.motion; } @@ -779,9 +787,9 @@ private static BlendTree GenerateMainBlendTree(AnimatorController fxLayer, strin private static BlendTree GenerateChildTree(AnimatorController controller, string name, string mainBlendTreeIdentifier, string mainBlendTreeLayerName, string constantOneName) { - BlendTree mainBlendTree = GetOrGenerateMainBlendTree(controller, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); + var mainBlendTree = GetOrGenerateMainBlendTree(controller, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); - BlendTree smoothedParentTree = new BlendTree() + BlendTree smoothedParentTree = new() { hideFlags = HideFlags.HideInHierarchy, blendType = BlendTreeType.Direct, @@ -792,7 +800,7 @@ private static BlendTree GenerateChildTree(AnimatorController controller, string mainBlendTree.AddChild(smoothedParentTree); var tempChildren = mainBlendTree.children; - tempChildren[tempChildren.Length - 1].directBlendParameter = constantOneName; + tempChildren[^1].directBlendParameter = constantOneName; mainBlendTree.children = tempChildren; return (BlendTree)mainBlendTree.children.Last().motion; @@ -800,9 +808,9 @@ private static BlendTree GenerateChildTree(AnimatorController controller, string private static BlendTree GetChildTree(AnimatorController controller, string name, string mainBlendTreeIdentifier, string mainBlendTreeLayerName, string constantOneName) { - BlendTree mainBlendTree = GetOrGenerateMainBlendTree(controller, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); + var mainBlendTree = GetOrGenerateMainBlendTree(controller, mainBlendTreeIdentifier, mainBlendTreeLayerName, constantOneName); - foreach (ChildMotion child in mainBlendTree.children) + foreach (var child in mainBlendTree.children) { if (child.motion.name == name) { @@ -820,8 +828,8 @@ public static int DecimalToBinary(this int i) return 0; } - string result = ""; - for (int j = i; j > 0; j /= 2) + var result = ""; + for (var j = i; j > 0; j /= 2) { result = (j % 2).ToString() + result; } @@ -829,15 +837,10 @@ public static int DecimalToBinary(this int i) return Int32.Parse(result); } - public static int GetParameterCost(this VRCExpressionParameters.Parameter parameter) + public static int GetVRCExpressionParameterCost(this VRCExpressionParameters.Parameter parameter) { return parameter.networkSynced ? 0 : parameter.valueType == VRCExpressionParameters.ValueType.Bool ? 1 : 8; } - - public static string TranslateParameterValueType(this VRCExpressionParameters.ValueType valueType) - { - return _paramTypes[(int)valueType]; - } } } diff --git a/Helper/dev.jetees.memoryoptimizer.Helper.asmdef b/Helper/dev.jetees.memoryoptimizer.Helper.asmdef index 3f95218..0bd6703 100644 --- a/Helper/dev.jetees.memoryoptimizer.Helper.asmdef +++ b/Helper/dev.jetees.memoryoptimizer.Helper.asmdef @@ -4,7 +4,8 @@ "VRC.SDK3A", "VRC.SDK3A.Editor", "VRC.SDKBase", - "VRC.SDKBase.Editor" + "VRC.SDKBase.Editor", + "dev.jetees.memoryoptimizer.Shared" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Shared/MemoryOptimizerConstants.cs b/Shared/MemoryOptimizerConstants.cs new file mode 100644 index 0000000..95e2a16 --- /dev/null +++ b/Shared/MemoryOptimizerConstants.cs @@ -0,0 +1,40 @@ +namespace JeTeeS.MemoryOptimizer.Shared +{ + internal static class MemoryOptimizerConstants + { + internal const string menuPath = "Tools/TES/MemoryOptimizer"; + internal const string defaultSavePath = "Assets/TES/MemOpt"; + internal const string prefKey = "Mem_Opt_Pref_"; + internal const string unlockSyncStepsEPKey = prefKey + "UnlockSyncSteps"; + internal const string backUpModeEPKey = prefKey + "BackUpMode"; + internal const string savePathPPKey = prefKey + "SavePath"; + internal const int maxUnsyncedParams = 8192; + + internal const string discordLink = "https://discord.gg/N7snuJhzkd"; + internal const string prefix = "MemOpt_"; + internal const string syncingLayerName = prefix + "Syncing Layer"; + internal const string syncingLayerIdentifier = prefix + "Syncer"; + internal const string mainBlendTreeIdentifier = prefix + "MainBlendTree"; + internal const string mainBlendTreeLayerName = prefix + "Main BlendTree"; + internal const string smoothingAmountParamName = prefix + "ParamSmoothing"; + internal const string smoothedVerSuffix = "_S"; + internal const string SmoothingTreeName = "SmoothingParentTree"; + internal const string DifferentialTreeName = "DifferentialParentTree"; + internal const string DifferentialSuffix = "_Delta"; + internal const string constantOneName = prefix + "ConstantOne"; + internal const string indexerParamName = prefix + "Indexer "; + internal const string boolSyncerParamName = prefix + "BoolSyncer "; + internal const string intNFloatSyncerParamName = prefix + "IntNFloatSyncer "; + internal const string oneFrameBufferAnimName = prefix + "OneFrameBuffer"; + internal const string oneSecBufferAnimName = prefix + "OneSecBuffer"; + internal const float changeSensitivity = 0.05f; + + internal const string EditorKeyInspectComponent = "dev.jetees.memoryoptimizer_inspectcomponent"; + internal const string EditorKeyInspectParameters = "dev.jetees.memoryoptimizer_inspectparameters"; + + internal static readonly string[] wdOptions = { "Auto-Detect", "Off", "On" }; + internal static readonly string[] backupModes = { "On", "Off", "Ask" }; + internal static readonly string[] paramTypes = { "Int", "Float", "Bool" }; + internal static readonly string[] animatorParamTypes = { "", /* 1 */ "Float", "", /* 3 */ "Int", /* 4 */ "Bool", "", "", "", "", /* 9 */ "Trigger" }; + } +} \ No newline at end of file diff --git a/Shared/MemoryOptimizerConstants.cs.meta b/Shared/MemoryOptimizerConstants.cs.meta new file mode 100644 index 0000000..c5c21eb --- /dev/null +++ b/Shared/MemoryOptimizerConstants.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 314562f99108491983248671d6f063ba +timeCreated: 1727874408 \ No newline at end of file diff --git a/Shared/MemoryOptimizerListData.cs b/Shared/MemoryOptimizerListData.cs index e97dbc0..df7986d 100644 --- a/Shared/MemoryOptimizerListData.cs +++ b/Shared/MemoryOptimizerListData.cs @@ -1,4 +1,6 @@ -using System; +#if UNITY_EDITOR + +using System; using UnityEngine; using VRC.SDK3.Avatars.ScriptableObjects; @@ -18,4 +20,6 @@ public MemoryOptimizerListData(VRCExpressionParameters.Parameter parameter, bool willBeOptimized = willOptimize; } } -} \ No newline at end of file +} + +#endif diff --git a/Shared/_InternalsVisibleTo.cs b/Shared/_InternalsVisibleTo.cs index 320c255..65c9cf9 100644 --- a/Shared/_InternalsVisibleTo.cs +++ b/Shared/_InternalsVisibleTo.cs @@ -2,3 +2,4 @@ [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Component")] [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Editor")] +[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Helper")] From 19f7ba3a1e9268d012b7ae46d9cc71d4c48a0b16 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:12:46 +0200 Subject: [PATCH 07/16] hash should stay saved when otherwise issues occur when switching component --- Component/MemoryOptimizerComponent.cs | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index b8fddab..2a91f3b 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -26,9 +26,9 @@ internal class MemoryOptimizerComponent : MonoBehaviour, IEditorOnly internal class SavedParameterConfiguration : MemoryOptimizerListData { public bool isVRCFuryParameter = false; - public string info = string.Empty; + public string info = string.Empty; - [NonSerialized] private int _hashCode = -1; + [SerializeField] private int hashCode = -1; public SavedParameterConfiguration(VRCExpressionParameters.Parameter parameter) : base(parameter, false, false) { @@ -45,28 +45,23 @@ public SavedParameterConfiguration(string parameterName, VRCExpressionParameters CalculateHashCode(); } - private void CalculateHashCode() + internal void CalculateHashCode() { - _hashCode = $"name:{this.param.name}-level:{paramTypes[(int)this.param.valueType]}".GetHashCode(); + hashCode = $"name:{this.param.name}-level:{paramTypes[(int)this.param.valueType]}".GetHashCode(); } public override int GetHashCode() { - if (_hashCode == -1) + if (hashCode == -1) { CalculateHashCode(); } - return _hashCode; + return hashCode; } public override bool Equals(object obj) { - if (obj is null) - { - return false; - } - if (obj is SavedParameterConfiguration o) { return o.GetHashCode() == GetHashCode(); @@ -101,7 +96,8 @@ internal struct ComponentIssue { public string message; public int level; - private int _hashCode; + + [SerializeField] private int hashCode; public static implicit operator ComponentIssue((string, int) data) { @@ -109,7 +105,7 @@ public static implicit operator ComponentIssue((string, int) data) { message = data.Item1, level = data.Item2, - _hashCode = $"{data.Item1}-level:{data.Item2}".GetHashCode() + hashCode = $"{data.Item1}-level:{data.Item2}".GetHashCode() }; } @@ -117,7 +113,7 @@ public override bool Equals(object obj) { if (obj is ComponentIssue o) { - return o._hashCode == _hashCode; + return o.hashCode == hashCode; } return base.Equals(obj); @@ -125,7 +121,7 @@ public override bool Equals(object obj) public override int GetHashCode() { - return _hashCode; + return hashCode; } } @@ -336,6 +332,7 @@ private void AddOrReplaceParameterConfiguration(SavedParameterConfiguration conf if (saved is not null && saved.param.GetVRCExpressionParameterCost() < configuration.param.GetVRCExpressionParameterCost()) { saved.param = configuration.param; + saved.CalculateHashCode(); } } else From 6459c1f31fbfe7423b46474d288beda17c1045e2 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:19:31 +0200 Subject: [PATCH 08/16] remove some unused stuff and add some more logging --- Component/MemoryOptimizerComponent.cs | 16 +++------------- Editor/Pipeline/MemoryOptimizerUploadPipeline.cs | 3 ++- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index 2a91f3b..6d1e052 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -79,16 +79,6 @@ public MemoryOptimizerListData Pure() networkSynced = true }, this.selected, this.willBeOptimized); } - - public static bool operator ==(SavedParameterConfiguration a, object b) - { - return a?.Equals(b) ?? false; - } - - public static bool operator !=(SavedParameterConfiguration a, object b) - { - return !(a == b); - } } [Serializable] @@ -198,8 +188,6 @@ internal void Load() // Notes: // VRCFury generates parameters with the following format: VF\d+_{name} // since we have no access to the number unless we build the avatar, we just display VF##_{name} and map it correctly later - - Debug.Log(contentType); if (contentType.Contains("UnlimitedParameters")) { @@ -328,9 +316,11 @@ private void AddOrReplaceParameterConfiguration(SavedParameterConfiguration conf // in the odd case a parameter is defined multiple times // we replace it with the one costing more, as mapping from a float to a bool // usually is handled much better than bool to a float - var saved = savedParameterConfigurations.FirstOrDefault(p => p == configuration); + var saved = savedParameterConfigurations.FirstOrDefault(p => p.Equals(configuration)); if (saved is not null && saved.param.GetVRCExpressionParameterCost() < configuration.param.GetVRCExpressionParameterCost()) { + Debug.LogWarning($"[MemoryOptimizer] Parameter '{saved.param.name}' from '{saved.info}' was already loaded as {paramTypes[(int)saved.param.valueType]} but has been replaced by {paramTypes[(int)configuration.param.valueType]} from '{configuration.info}'"); + saved.param = configuration.param; saved.CalculateHashCode(); } diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index a21a629..49081c7 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -38,6 +38,7 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) // skip if we have no fx layer, or system is installed, or we don't have parameters if (fxLayer is null || MemoryOptimizerHelper.IsSystemInstalled(fxLayer) || parameters.Length <= 0) { + Debug.LogWarning("[MemoryOptimizer] System was not installed as it either: was already installed, there was no fx layer or no parameters."); return true; } @@ -166,7 +167,7 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) return vrcAvatarDescriptor.expressionParameters?.CalcTotalCost() < VRCExpressionParameters.MAX_PARAMETER_COST; } - Debug.Log("[MemoryOptimizer] System was not installed as there were no parameters to optimize."); + Debug.LogWarning("[MemoryOptimizer] System was not installed as there were no parameters to optimize."); return true; } } From a5b1cae23b6a58647d67479d19f74fb8caa82db6 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:43:41 +0200 Subject: [PATCH 09/16] lots of small bug and general fixes Mention-worthy: - MemoryOptimizer-EditorWindow will attempt to connect to a component if present on the selected avatar - MemoryOptimizer-EditorWindow cannot be opened more than once now since component editing is active-instance based. - a bunch of performance fixes in certain areas - MemoryOptimizerComponent no longer loads duplicates of VRCFury-Components --- Component/MemoryOptimizerComponent.cs | 43 +-- ...ev.jetees.memoryoptimizer.Component.asmdef | 51 +-- Editor/MemoryOptimizerComponentEditor.cs | 14 +- Editor/MemoryOptimizerMain.cs | 13 +- Editor/MemoryOptimizerWindow.cs | 335 +++++++++++------- .../VRCFury-FinalValidationService.txt | 1 + ...ryOptimizerDisableVRCFuryParameterCheck.cs | 5 +- .../Pipeline/MemoryOptimizerUploadPipeline.cs | 1 + Editor/_InternalsVisibleTo.cs | 1 - .../dev.jetees.memoryoptimizer.Editor.asmdef | 66 ++-- Helper/TESHelperFunctions.cs | 64 +++- .../dev.jetees.memoryoptimizer.Helper.asmdef | 36 +- Shared/MemoryOptimizerListData.cs | 1 - .../dev.jetees.memoryoptimizer.Shared.asmdef | 41 +-- 14 files changed, 389 insertions(+), 283 deletions(-) diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index 6d1e052..0916ef2 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -7,9 +7,7 @@ using JeTeeS.MemoryOptimizer.Helper; using JeTeeS.MemoryOptimizer.Shared; using JeTeeS.TES.HelperFunctions; -using UnityEditor; using UnityEngine; -using UnityEngine.Serialization; using VRC.SDK3.Avatars.Components; using VRC.SDK3.Avatars.ScriptableObjects; using VRC.SDKBase; @@ -47,7 +45,7 @@ public SavedParameterConfiguration(string parameterName, VRCExpressionParameters internal void CalculateHashCode() { - hashCode = $"name:{this.param.name}-level:{paramTypes[(int)this.param.valueType]}".GetHashCode(); + hashCode = $"name:{this.param.name}-type:{paramTypes[(int)this.param.valueType]}".GetHashCode(); } public override int GetHashCode() @@ -74,10 +72,10 @@ public MemoryOptimizerListData Pure() { return new MemoryOptimizerListData(new VRCExpressionParameters.Parameter() { - name = this.param.name, - valueType = this.param.valueType, + name = param.name, + valueType = param.valueType, networkSynced = true - }, this.selected, this.willBeOptimized); + }, selected, willBeOptimized); } } @@ -125,7 +123,7 @@ public override int GetHashCode() [SerializeField] internal List componentIssues = new(0); [SerializeField] internal List savedParameterConfigurations = new(0); - internal void Load() + internal void LoadParameters() { componentIssues = new(0); @@ -140,10 +138,7 @@ internal void Load() } // collect all descriptor parameters that are synced - foreach (var savedParameterConfiguration in descriptorParameters.Select(p => new SavedParameterConfiguration(p) - { - info = "From Avatar Descriptor" - })) + foreach (var savedParameterConfiguration in descriptorParameters.Select(p => new SavedParameterConfiguration(p) { info = "From Avatar Descriptor" })) { AddOrReplaceParameterConfiguration(savedParameterConfiguration); } @@ -161,9 +156,8 @@ internal void Load() { foreach (IEditorOnly vrcfComponent in vrcfComponents) { - // some systems use EditorOnly components to be optimized away + // for the offset var vrcfGameObject = ((Component)vrcfComponent).gameObject; - var isEditorOnly = vrcfGameObject.tag.Equals("EditorOnly"); // extract the content field from VRCFury, this is where the actual "component" data can be found object contentValue = null; @@ -231,7 +225,7 @@ internal void Load() SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration(useGlobalParameter ? globalParameter : $"VF##_{toggleName}", isSlider ? VRCExpressionParameters.ValueType.Float : VRCExpressionParameters.ValueType.Bool) { isVRCFuryParameter = true, - info = isEditorOnly ? "(EditorOnly) " : string.Empty + $"From Toggle: {toggleName} on {gameObject.name}" + info = $"From Toggle: {toggleName} on {gameObject.name}" }; AddOrReplaceParameterConfiguration(savedParameterConfiguration); @@ -255,16 +249,10 @@ internal void Load() var extractedParametersList = new List(); foreach (object slot in _parametersList) { - VRCExpressionParameters extracted = null; // the parameters are a field which is wrapped again if (slot.GetFieldValue("parameters")?.GetFieldValue("objRef") is VRCExpressionParameters cast) { - extracted = cast; - } - - if (extracted is not null) - { - extractedParametersList.Add(extracted); + extractedParametersList.Add(cast); } } @@ -279,10 +267,10 @@ internal void Load() continue; } - SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration((containsStar && !globalParameters.Contains($"!{parameter.name}")) || globalParameters.Contains(parameter.name) ? parameter.name : $"VF##_{parameter.name}", parameter.valueType) + var savedParameterConfiguration = new SavedParameterConfiguration((containsStar && !globalParameters.Contains($"!{parameter.name}")) || globalParameters.Contains(parameter.name) ? parameter.name : $"VF##_{parameter.name}", parameter.valueType) { isVRCFuryParameter = true, - info = isEditorOnly ? "(EditorOnly) " : string.Empty + $"From FullController on {vrcfGameObject.name}" + info = $"From FullController on {vrcfGameObject.name}" }; AddOrReplaceParameterConfiguration(savedParameterConfiguration); @@ -295,18 +283,15 @@ internal void Load() #endif if (savedParameterConfigurations.Count <= 0) { - componentIssues.Add(("This avatar has no configured parameters.", 2 /* Warning */)); + componentIssues.Add(("This avatar has no loaded parameters.", 2 /* Warning */)); } } - private void Awake() - { - Load(); - } - private void Reset() { savedParameterConfigurations = new(0); + + LoadParameters(); } private void AddOrReplaceParameterConfiguration(SavedParameterConfiguration configuration) diff --git a/Component/dev.jetees.memoryoptimizer.Component.asmdef b/Component/dev.jetees.memoryoptimizer.Component.asmdef index 1df1971..03c1b1d 100644 --- a/Component/dev.jetees.memoryoptimizer.Component.asmdef +++ b/Component/dev.jetees.memoryoptimizer.Component.asmdef @@ -1,26 +1,27 @@ -{ - "name": "dev.jetees.memoryoptimizer.Component", - "references": [ - "VRC.SDK3A", - "VRC.SDK3A.Editor", - "VRC.SDKBase", - "VRC.SDKBase.Editor", - "dev.jetees.memoryoptimizer.Helper", - "dev.jetees.memoryoptimizer.Shared" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "autoReferenced": true, - "overrideReferences": false, - "precompiledReferences": [], - "defineConstraints": [], - "optionalUnityReferences": [], - "versionDefines": [ - { - "define": "MemoryOptimizer_VRCFury_IsInstalled", - "expression": "0.0.0", - "name": "com.vrcfury.vrcfury" - } - ] +{ + "name": "dev.jetees.memoryoptimizer.Component", + "rootNamespace": "", + "references": [ + "VRC.SDK3A", + "VRC.SDK3A.Editor", + "VRC.SDKBase", + "VRC.SDKBase.Editor", + "dev.jetees.memoryoptimizer.Helper", + "dev.jetees.memoryoptimizer.Shared" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.vrcfury.vrcfury", + "expression": "0.0.0", + "define": "MemoryOptimizer_VRCFury_IsInstalled" + } + ], + "noEngineReferences": false } \ No newline at end of file diff --git a/Editor/MemoryOptimizerComponentEditor.cs b/Editor/MemoryOptimizerComponentEditor.cs index bbee08d..7916d50 100644 --- a/Editor/MemoryOptimizerComponentEditor.cs +++ b/Editor/MemoryOptimizerComponentEditor.cs @@ -1,7 +1,5 @@ -using System; -using System.Linq; +using System.Linq; using JeTeeS.MemoryOptimizer.Patcher; -using JeTeeS.TES.HelperFunctions; using UnityEditor; using UnityEngine; using static JeTeeS.MemoryOptimizer.Shared.MemoryOptimizerConstants; @@ -17,7 +15,7 @@ private void Awake() { _component ??= (MemoryOptimizerComponent)target; - _component.Load(); + _component.LoadParameters(); } public override void OnInspectorGUI() @@ -73,11 +71,9 @@ public override void OnInspectorGUI() if (GUILayout.Button("Configure")) { - _component.Load(); - - MemoryOptimizerWindow._component = _component; - EditorWindow window = EditorWindow.GetWindow(typeof(MemoryOptimizerWindow), false, "Memory Optimizer (Configuration)", true); - window.minSize = new Vector2(600, 900); + _component.LoadParameters(); + + MemoryOptimizerWindow.ShowWindowInternal(_component); } GUI.enabled = true; diff --git a/Editor/MemoryOptimizerMain.cs b/Editor/MemoryOptimizerMain.cs index ef9447e..6bf6415 100644 --- a/Editor/MemoryOptimizerMain.cs +++ b/Editor/MemoryOptimizerMain.cs @@ -167,11 +167,12 @@ private static void GenerateDeltas(MemoryOptimizerState optimizerState, string g List boolsDifferentials = new(); List intsNFloatsDifferentials = new(); - //Add smoothed ver of every param in the list + // Add smoothed ver of every param in the list foreach (var param in boolsToOptimize) { var paramMatches = optimizerState.FXController.parameters.Where(x => x.name == param.param.name).ToList(); var paramMatch = paramMatches[0]; + if (paramMatch.type is AnimatorControllerParameterType.Int or AnimatorControllerParameterType.Bool) { var paramCopy = optimizerState.FXController.AddUniqueParam(prefix + paramMatch.name + "_Copy"); @@ -222,7 +223,7 @@ private static void GenerateDeltas(MemoryOptimizerState optimizerState, string g private static void CreateTransitions(MemoryOptimizerState optimizerState, int syncSteps, float stepDelay, bool generateChangeDetection) { var optimizeBoolList = optimizerState.boolsToOptimize; - var optimizeIntBFloatList = optimizerState.intsNFloatsToOptimize; + var optimizeIntNFloatList = optimizerState.intsNFloatsToOptimize; var localSetStates = optimizerState.localSetStates; var remoteSetStates = optimizerState.remoteSetStates; var localResetStates = optimizerState.localResetStates; @@ -312,14 +313,12 @@ void SetupLocalResetStateTransitions(string differentialName) for (var j = 0; j < optimizeBoolList.Count / syncSteps; j++) { - var differentialName = differentialsBool[i * (optimizeBoolList.Count() / syncSteps) + j].name; - SetupLocalResetStateTransitions(differentialName); + SetupLocalResetStateTransitions(differentialsBool[i * (optimizeBoolList.Count() / syncSteps) + j].name); } - for (var j = 0; j < optimizeIntBFloatList.Count / syncSteps; j++) + for (var j = 0; j < optimizeIntNFloatList.Count / syncSteps; j++) { - var differentialName = differentialsIntNFloat[i * (optimizeIntBFloatList.Count() / syncSteps) + j].name; - SetupLocalResetStateTransitions(differentialName); + SetupLocalResetStateTransitions(differentialsIntNFloat[i * (optimizeIntNFloatList.Count() / syncSteps) + j].name); } } diff --git a/Editor/MemoryOptimizerWindow.cs b/Editor/MemoryOptimizerWindow.cs index 01dd339..b98bd4d 100644 --- a/Editor/MemoryOptimizerWindow.cs +++ b/Editor/MemoryOptimizerWindow.cs @@ -18,7 +18,9 @@ namespace JeTeeS.MemoryOptimizer { internal class MemoryOptimizerWindow : EditorWindow { - internal static MemoryOptimizerComponent _component; + private static MemoryOptimizerComponent _component; + + private DateTime _nextReconnectCheck = DateTime.Now.AddDays(-1); private string currentSavePath; private DefaultAsset savePathOverride = null; @@ -55,10 +57,21 @@ internal class MemoryOptimizerWindow : EditorWindow public static void ShowWindow() { // if you open by menu path, open the normal editor - MemoryOptimizerWindow._component = null; + ShowWindowInternal(null); + } + + internal static void ShowWindowInternal(MemoryOptimizerComponent component) + { + // make sure to re-open for bindings and avoiding bugs + if (HasOpenInstances() && GetWindow() is { } instance) + { + instance.Close(); + } - // Show existing window instance. If one doesn't exist, make one. - EditorWindow window = GetWindow(typeof(MemoryOptimizerWindow), false, "Memory Optimizer", true); + _component = component; + + // Open new instance + EditorWindow window = GetWindow(false, "Memory Optimizer" + (component is not null ? " (Component Editor)" : string.Empty), true); window.minSize = new Vector2(600, 900); } @@ -66,30 +79,11 @@ private void Awake() { if (_component is not null) { - avatarDescriptor = _component.gameObject.GetComponent(); - avatarFXLayer = new AnimatorController(); - expressionParameters = ScriptableObject.CreateInstance(); - - avatarFXLayer.name = "Temporary Generated FX Layer"; - expressionParameters.name = "Temporary Generated Parameters"; - - expressionParameters.parameters = _component.savedParameterConfigurations.Select(s => - { - avatarFXLayer.AddUniqueParam(s.param.name, s.param.valueType.ValueTypeToParamType()); - return s.param; - }).ToArray(); - - if (_component.syncSteps > 4) - { - unlockSyncSteps = true; - EditorPrefs.SetBool(unlockSyncStepsEPKey, true); - } - - wdOptionSelected = _component.wdOption; - maxSyncSteps = _component.syncSteps; - syncSteps = _component.syncSteps; - stepDelay = _component.stepDelay; - changeDetectionEnabled = _component.changeDetection; + LoadFromComponent(); + } + else + { + TryReconnectingWithComponent(); } } @@ -104,7 +98,7 @@ private void OnGUI() savePathOverride = (DefaultAsset)AssetDatabase.LoadAssetAtPath(savePathEP, typeof(DefaultAsset)); } - if (savePathOverride && AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(savePathOverride))) + if (savePathOverride is not null && AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(savePathOverride))) { currentSavePath = AssetDatabase.GetAssetPath(savePathOverride); } @@ -113,6 +107,11 @@ private void OnGUI() currentSavePath = defaultSavePath; } + if (_component is null) + { + TryReconnectingWithComponent(); + } + tab = GUILayout.Toolbar(tab, new[] { _component is null ? "Install menu" : "Configure", "Settings menu" }); switch (tab) { @@ -129,8 +128,11 @@ void OnAvatarChange() { if (avatarDescriptor) { - avatarFXLayer = FindFXLayer(avatarDescriptor); - expressionParameters = FindExpressionParams(avatarDescriptor); + if (!TryReconnectingWithComponent()) + { + avatarFXLayer = FindFXLayer(avatarDescriptor); + expressionParameters = FindExpressionParams(avatarDescriptor); + } } else { @@ -161,7 +163,7 @@ void OnAvatarChange() using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) { avatarFXLayer = (AnimatorController)EditorGUILayout.ObjectField("FX Layer", avatarFXLayer, typeof(AnimatorController), true); - if (_component is null && avatarFXLayer is null) + if (avatarFXLayer is null) { if (GUILayout.Button("Auto-Detect")) { @@ -173,7 +175,7 @@ void OnAvatarChange() using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) { expressionParameters = (VRCExpressionParameters)EditorGUILayout.ObjectField("Parameters", expressionParameters, typeof(VRCExpressionParameters), true); - if (_component is null && expressionParameters is null) + if (expressionParameters is null) { if (GUILayout.Button("Auto-Detect")) { @@ -185,7 +187,12 @@ void OnAvatarChange() if (!runOnce) { - FillAvatarFields(null, null, null); + // skip for component editor + if (_component is null) + { + FillAvatarFields(null, null, null); + } + runOnce = true; } @@ -239,11 +246,7 @@ void OnAvatarChange() if (avatarDescriptor is not null && avatarFXLayer is not null && expressionParameters is not null) { - longestParamName = 0; - foreach (var x in expressionParameters.parameters) - { - longestParamName = Math.Max(longestParamName, x.name.Count()); - } + longestParamName = expressionParameters.parameters.Max(x => x.name.Length); using (new SqueezeScope((0, 0, Horizontal, EditorStyles.helpBox))) { @@ -253,26 +256,35 @@ void OnAvatarChange() { EditorInputDialog.Show("", "Please enter your prefix to deselect", "", prefix => { - if (!string.IsNullOrEmpty(prefix)) + using (new TESPerformanceLogger("MemoryOptimizer.OnGUI:'Deselect Prefix' finished in {0}")) { - foreach (MemoryOptimizerListData param in paramList.FindAll(x => x.param.name.StartsWith(prefix, true, null))) + // skip for null or empty prefix + if (string.IsNullOrEmpty(prefix)) { - param.selected = false; + return; } + + foreach (var data in paramList.Where(data => data.param.name.StartsWith(prefix, true, null))) + { + data.selected = false; + } + + OnChangeUpdate(); } - - OnChangeUpdate(); }); } if (GUILayout.Button("Select All")) { - foreach (MemoryOptimizerListData param in paramList) + using (new TESPerformanceLogger("MemoryOptimizer.OnGUI:'Select All' finished in {0}")) { - param.selected = true; - } + foreach (MemoryOptimizerListData param in paramList) + { + param.selected = true; + } - OnChangeUpdate(); + OnChangeUpdate(); + } } if (GUILayout.Button("Clear Selected Parameters")) @@ -282,44 +294,49 @@ void OnAvatarChange() } scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, true); - + + // make sure the param list is always the same size as avatar's expression parameters + if (paramList.Count != expressionParameters.parameters.Length) + { + ResetParamSelection(); + } + + var isSystemInstalled = MemoryOptimizerHelper.IsSystemInstalled(avatarFXLayer); + for (int i = 0; i < expressionParameters.parameters.Length; i++) { + var data = paramList[i]; + var param = expressionParameters.parameters[i]; + using (new SqueezeScope((0, 0, Horizontal))) { - // make sure the param list is always the same size as avatar's expression parameters - if (paramList.Count != expressionParameters.parameters.Length) - { - ResetParamSelection(); - } - using (new SqueezeScope((0, 0, Horizontal))) { GUI.enabled = false; - EditorGUILayout.TextArea(expressionParameters.parameters[i].name, GUILayout.MinWidth(longestParamName * 8)); - EditorGUILayout.Popup((int)expressionParameters.parameters[i].valueType, paramTypes, GUILayout.Width(50)); + EditorGUILayout.TextArea(param.name, GUILayout.MinWidth(longestParamName * 8)); + EditorGUILayout.Popup((int)param.valueType, paramTypes, GUILayout.Width(50)); GUI.enabled = true; - // System already installed - if (MemoryOptimizerHelper.IsSystemInstalled(avatarFXLayer)) + // system already installed + if (isSystemInstalled) { GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 1); GUI.enabled = false; GUILayout.Button("System Already Installed!", GUILayout.Width(203)); } - // Param isn't network synced - else if (!expressionParameters.parameters[i].networkSynced) + // param isn't network synced + else if (!param.networkSynced) { GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 1); GUI.enabled = false; GUILayout.Button("Param Not Synced", GUILayout.Width(203)); } - // Param isn't in FX layer - else if (!(avatarFXLayer.parameters.Count(x => x.name == expressionParameters.parameters[i].name) > 0)) + // ignore check if parameter editor otherwise check if param isn't in FX layer + else if (_component is null && !avatarFXLayer.parameters.Any(x => x.name.Equals(param.name))) { - paramList[i].selected = false; + data.selected = false; GUI.backgroundColor = Color.yellow; if (GUILayout.Button("Add To FX", GUILayout.Width(100))) { @@ -331,26 +348,26 @@ void OnAvatarChange() GUILayout.Button("Param Not In FX", GUILayout.Width(100)); } // Param isn't selected - else if (!paramList[i].selected) + else if (!data.selected) { GUI.backgroundColor = Color.red; using (new ChangeCheckScope(OnChangeUpdate)) { if (GUILayout.Button("Optimize", GUILayout.Width(203))) { - paramList[i].selected = !paramList[i].selected; + data.selected = !data.selected; } } } // Param won't be optimized - else if (!paramList[i].willBeOptimized) + else if (!data.willBeOptimized) { GUI.backgroundColor = Color.yellow; using (new ChangeCheckScope(OnChangeUpdate)) { if (GUILayout.Button("Optimize", GUILayout.Width(203))) { - paramList[i].selected = !paramList[i].selected; + data.selected = !data.selected; } } } @@ -362,7 +379,7 @@ void OnAvatarChange() { if (GUILayout.Button("Optimize", GUILayout.Width(203))) { - paramList[i].selected = !paramList[i].selected; + data.selected = !data.selected; } } } @@ -392,7 +409,7 @@ void OnAvatarChange() using (new SqueezeScope((0, 0, EditorH, EditorStyles.helpBox))) { - if (MemoryOptimizerHelper.IsSystemInstalled(avatarFXLayer)) + if (isSystemInstalled) { GUI.backgroundColor = Color.black; GUILayout.Label("System Already Installed!", EditorStyles.boldLabel); @@ -459,15 +476,18 @@ void OnAvatarChange() _component.stepDelay = stepDelay; _component.changeDetection = changeDetectionEnabled; - foreach (var data in paramList) + foreach (var param in paramList) { - var match = _component.savedParameterConfigurations.FirstOrDefault(p => p.param.name.Equals(data.param.name) && p.param.valueType == data.param.valueType); + var match = _component.savedParameterConfigurations.FirstOrDefault(p => p.param.name.Equals(param.param.name) && p.param.valueType == param.param.valueType); - if (match is not null) + // skip if we have no match + if (match is null) { - match.selected = data.selected; - match.willBeOptimized = data.willBeOptimized; + continue; } + + match.selected = param.selected; + match.willBeOptimized = param.willBeOptimized; } // clear reference @@ -558,39 +578,39 @@ void OnAvatarChange() GUILayout.Space(5); + // hide save path for component editing if (_component is null) { - - } - // save path - using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) - { - using (new SqueezeScope((0, 0, Horizontal))) + // save path + using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { - using (new ChangeCheckScope(SavePathChange)) + using (new SqueezeScope((0, 0, Horizontal))) { - EditorGUILayout.LabelField("Select folder to save generated assets to: "); - savePathOverride = (DefaultAsset)EditorGUILayout.ObjectField("", savePathOverride, typeof(DefaultAsset), false); + using (new ChangeCheckScope(SavePathChange)) + { + EditorGUILayout.LabelField("Select folder to save generated assets to: "); + savePathOverride = (DefaultAsset)EditorGUILayout.ObjectField("", savePathOverride, typeof(DefaultAsset), false); + } + + void SavePathChange() + { + PlayerPrefs.SetString(savePathPPKey, AssetDatabase.GetAssetPath(savePathOverride)); + } } - void SavePathChange() + if (savePathOverride && AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(savePathOverride))) + { + EditorGUILayout.HelpBox($"Valid folder! Now saving to: {currentSavePath}", MessageType.Info, true); + } + else { - PlayerPrefs.SetString(savePathPPKey, AssetDatabase.GetAssetPath(savePathOverride)); + EditorGUILayout.HelpBox($"Not valid! Now saving to: {currentSavePath}", MessageType.Info, true); } } - if (savePathOverride && AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(savePathOverride))) - { - EditorGUILayout.HelpBox($"Valid folder! Now saving to: {currentSavePath}", MessageType.Info, true); - } - else - { - EditorGUILayout.HelpBox($"Not valid! Now saving to: {currentSavePath}", MessageType.Info, true); - } + GUILayout.Space(5); } - GUILayout.Space(5); - // Step delay using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) { @@ -618,41 +638,99 @@ void SavePathChange() GUI.enabled = true; } - internal void OnChangeUpdate() + /// + /// Attempts to reconnect with a MemoryOptimizerComponent on the avatar + /// + private bool TryReconnectingWithComponent() { - foreach (MemoryOptimizerListData param in paramList) + if (_nextReconnectCheck > DateTime.Now) { - param.willBeOptimized = false; - if (avatarFXLayer && (!param.param.networkSynced || !(avatarFXLayer.parameters.Count(x => x.name == param.param.name) > 0))) - { - param.selected = false; - } + return false; } + + if (avatarDescriptor?.gameObject.GetComponent() is not { } foundComponent) + { + // only try to reconnect all 10 seconds + _nextReconnectCheck = DateTime.Now.AddSeconds(10); + return false; + } + + _nextReconnectCheck = DateTime.Now.AddDays(-1); + + _component = foundComponent; + + LoadFromComponent(); + return true; + } + + private void LoadFromComponent() + { + avatarDescriptor = _component.gameObject.GetComponent(); + + avatarFXLayer = new AnimatorController(); + expressionParameters = CreateInstance(); + + avatarFXLayer.name = "Temporary Generated FX Layer"; + expressionParameters.name = "Temporary Generated Parameters"; + + expressionParameters.parameters = _component.savedParameterConfigurations.Select(s => + { + avatarFXLayer.AddUniqueParam(s.param.name, s.param.valueType.ValueTypeToParamType()); + return s.param; + }).ToArray(); + + if (_component.syncSteps > 4) + { + unlockSyncSteps = true; + EditorPrefs.SetBool(unlockSyncStepsEPKey, true); + } + + wdOptionSelected = _component.wdOption; + maxSyncSteps = unlockSyncSteps ? 32 : 4; + syncSteps = _component.syncSteps; + stepDelay = _component.stepDelay; + changeDetectionEnabled = _component.changeDetection; + } + + private void OnChangeUpdate() + { selectedBools = new List(); selectedIntsNFloats = new List(); foreach (var param in paramList) { + param.willBeOptimized = false; + + // ignore for component editing + if (_component is null && avatarFXLayer is not null && (!param.param.networkSynced || !(avatarFXLayer.parameters.Count(x => x.name == param.param.name) > 0))) + { + param.selected = false; + } + if (param.selected) { - if (param.param.valueType == VRCExpressionParameters.ValueType.Bool) + switch (param.param.valueType) { - selectedBools.Add(param); - } - else - { - selectedIntsNFloats.Add(param); + case VRCExpressionParameters.ValueType.Bool: + selectedBools.Add(param); + break; + case VRCExpressionParameters.ValueType.Int: + case VRCExpressionParameters.ValueType.Float: + default: + selectedIntsNFloats.Add(param); + break; } } } - maxSyncSteps = Math.Max(Math.Max(selectedBools.Count(), selectedIntsNFloats.Count()), 1); + maxSyncSteps = Math.Max(Math.Max(selectedBools.Count, selectedIntsNFloats.Count), 1); if (maxSyncSteps == 1) { installationIndexers = 0; installationBoolSyncers = 0; installationIntSyncers = 0; + newParamCost = expressionParameters?.CalcTotalCost() ?? 0; return; @@ -663,27 +741,44 @@ internal void OnChangeUpdate() syncSteps = 2; } - boolsToOptimize = selectedBools.Take(selectedBools.Count - (selectedBools.Count % syncSteps)).ToList(); - intsNFloatsToOptimize = selectedIntsNFloats.Take(selectedIntsNFloats.Count - (selectedIntsNFloats.Count % syncSteps)).ToList(); + var allocationBool = selectedBools.Count - (selectedBools.Count % syncSteps); + var allocationIntNFloat = selectedIntsNFloats.Count - (selectedIntsNFloats.Count % syncSteps); + + boolsToOptimize = new(allocationBool); + intsNFloatsToOptimize = new(allocationIntNFloat); - foreach (MemoryOptimizerListData param in boolsToOptimize) + foreach (var param in selectedBools) { - param.willBeOptimized = true; + if (allocationBool > 0) + { + param.willBeOptimized = true; + + boolsToOptimize.Add(param); + } + + allocationBool--; } - foreach (MemoryOptimizerListData param in intsNFloatsToOptimize) + foreach (var param in selectedIntsNFloats) { - param.willBeOptimized = true; - } + if (allocationIntNFloat > 0) + { + param.willBeOptimized = true; + + intsNFloatsToOptimize.Add(param); + } - installationIndexers = (syncSteps - 1).DecimalToBinary().ToString().Count(); + allocationIntNFloat--; + } + + installationIndexers = Convert.ToString((syncSteps - 1), 2).Length; installationBoolSyncers = boolsToOptimize.Count / syncSteps; installationIntSyncers = intsNFloatsToOptimize.Count / syncSteps; newParamCost = expressionParameters.CalcTotalCost() + installationIndexers + installationBoolSyncers + (installationIntSyncers * 8) - (boolsToOptimize.Count + (intsNFloatsToOptimize.Count * 8)); } - internal void ResetParamSelection() + private void ResetParamSelection() { paramList = new List(); @@ -711,7 +806,7 @@ internal void ResetParamSelection() OnChangeUpdate(); } - internal void FillAvatarFields(VRCAvatarDescriptor descriptor, AnimatorController controller, VRCExpressionParameters parameters) + private void FillAvatarFields(VRCAvatarDescriptor descriptor, AnimatorController controller, VRCExpressionParameters parameters) { if (descriptor is null) { diff --git a/Editor/Patcher/VRCFury-FinalValidationService.txt b/Editor/Patcher/VRCFury-FinalValidationService.txt index 9648eec..f35fa17 100644 --- a/Editor/Patcher/VRCFury-FinalValidationService.txt +++ b/Editor/Patcher/VRCFury-FinalValidationService.txt @@ -13,6 +13,7 @@ namespace VF.Service { /** * Many of these checks are copied from or modified from the validation checks in the VRCSDK * patched by >>> dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher + * This patch is required in order for VRCFury not to fail us during the upload process */ [VFService] internal class FinalValidationService { diff --git a/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs b/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs index de4415c..db7aeed 100644 --- a/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs +++ b/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs @@ -1,7 +1,4 @@ -using System; -using System.IO; -using JeTeeS.MemoryOptimizer.Patcher; -using UnityEditor; +using JeTeeS.MemoryOptimizer.Patcher; using UnityEngine; using VRC.SDKBase.Editor.BuildPipeline; diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index 49081c7..01f1aab 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -168,6 +168,7 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) } Debug.LogWarning("[MemoryOptimizer] System was not installed as there were no parameters to optimize."); + return true; } } diff --git a/Editor/_InternalsVisibleTo.cs b/Editor/_InternalsVisibleTo.cs index b911687..4c0313a 100644 --- a/Editor/_InternalsVisibleTo.cs +++ b/Editor/_InternalsVisibleTo.cs @@ -2,4 +2,3 @@ [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer")] [assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Component")] -[assembly: InternalsVisibleTo("dev.jetees.memoryoptimizer.Pipeline")] diff --git a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef index 7158ede..5cbf836 100644 --- a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef +++ b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef @@ -1,35 +1,35 @@ { - "name": "dev.jetees.memoryoptimizer.Editor", - "references": [ - "VRC.SDK3A", - "VRC.SDK3A.Editor", - "VRC.SDKBase", - "VRC.SDKBase.Editor", - "dev.jetees.memoryoptimizer", - "dev.jetees.memoryoptimizer.Component", - "dev.jetees.memoryoptimizer.Helper", - "dev.jetees.memoryoptimizer.Shared" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "autoReferenced": true, - "overrideReferences": false, - "precompiledReferences": [], - "defineConstraints": [], - "optionalUnityReferences": [], - "versionDefines": [ - { - "define": "MemoryOptimizer_VRCFury_IsInstalled", - "expression": "0.0.0", - "name": "com.vrcfury.vrcfury" - }, - { - "define": "MemoryOptimizer_VRCFury_IsTested", - "expression": "[1.0.0,1.1075.0]", - "name": "com.vrcfury.vrcfury" - } - ] + "name": "dev.jetees.memoryoptimizer.Editor", + "rootNamespace": "", + "references": [ + "VRC.SDK3A", + "VRC.SDK3A.Editor", + "VRC.SDKBase", + "VRC.SDKBase.Editor", + "dev.jetees.memoryoptimizer.Component", + "dev.jetees.memoryoptimizer.Helper", + "dev.jetees.memoryoptimizer.Shared" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.vrcfury.vrcfury", + "expression": "0.0.0", + "define": "MemoryOptimizer_VRCFury_IsInstalled" + }, + { + "name": "com.vrcfury.vrcfury", + "expression": "[1.0.0,1.1075.0]", + "define": "MemoryOptimizer_VRCFury_IsTested" + } + ], + "noEngineReferences": false } \ No newline at end of file diff --git a/Helper/TESHelperFunctions.cs b/Helper/TESHelperFunctions.cs index 6c83ed2..ef1b061 100644 --- a/Helper/TESHelperFunctions.cs +++ b/Helper/TESHelperFunctions.cs @@ -2,12 +2,14 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using UnityEngine; using UnityEditor; using UnityEditor.Animations; using VRC.SDK3.Avatars.Components; using VRC.SDK3.Avatars.ScriptableObjects; +using Debug = UnityEngine.Debug; namespace JeTeeS.TES.HelperFunctions { @@ -95,19 +97,19 @@ public static string GetAssetName(UnityEngine.Object thing) public static int UninstallErrorDialogWithDiscordLink(string title, string mainMessage, string discordLink) { var option = EditorUtility.DisplayDialogComplex(title, mainMessage, "Continue uninstall anyways (not recommended)", "Cancel uninstall", "Join the discord"); - switch (option) - { - case 0: - return 0; - case 1: - return 1; - case 2: - Application.OpenURL(discordLink); - return 2; - default: - Debug.LogError("Unrecognized option."); - return -1; - } + switch (option) + { + case 0: + return 0; + case 1: + return 1; + case 2: + Application.OpenURL(discordLink); + return 2; + default: + Debug.LogError("Unrecognized option."); + return -1; + } } public static AnimatorController FindFXLayer(VRCAvatarDescriptor descriptor) @@ -834,13 +836,47 @@ public static int DecimalToBinary(this int i) result = (j % 2).ToString() + result; } - return Int32.Parse(result); + return int.Parse(result); } public static int GetVRCExpressionParameterCost(this VRCExpressionParameters.Parameter parameter) { return parameter.networkSynced ? 0 : parameter.valueType == VRCExpressionParameters.ValueType.Bool ? 1 : 8; } + + internal class TESPerformanceLogger : IDisposable + { + private readonly string _message; + private readonly UnityEngine.Object _context; + private readonly Stopwatch _w; + + public TESPerformanceLogger(string message = null, UnityEngine.Object context = null) + { + _message = string.IsNullOrEmpty(message) ? "TESPerformanceLogger finished in {0}" : message; + + _context = context; + + _w = new Stopwatch(); + _w.Start(); + } + + public void Dispose() + { + _w.Stop(); + + var elapsed = _w.Elapsed; + var message = string.Format(_message, $"{elapsed.TotalSeconds:#0}s-{elapsed.TotalMilliseconds:##0}ms"); + + if (_context is not null) + { + Debug.LogWarning(message, _context); + } + else + { + Debug.LogWarning(message); + } + } + } } } diff --git a/Helper/dev.jetees.memoryoptimizer.Helper.asmdef b/Helper/dev.jetees.memoryoptimizer.Helper.asmdef index 0bd6703..21884ec 100644 --- a/Helper/dev.jetees.memoryoptimizer.Helper.asmdef +++ b/Helper/dev.jetees.memoryoptimizer.Helper.asmdef @@ -1,18 +1,20 @@ -{ - "name": "dev.jetees.memoryoptimizer.Helper", - "references": [ - "VRC.SDK3A", - "VRC.SDK3A.Editor", - "VRC.SDKBase", - "VRC.SDKBase.Editor", - "dev.jetees.memoryoptimizer.Shared" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "autoReferenced": true, - "overrideReferences": false, - "precompiledReferences": [], - "defineConstraints": [], - "optionalUnityReferences": [] +{ + "name": "dev.jetees.memoryoptimizer.Helper", + "rootNamespace": "", + "references": [ + "VRC.SDK3A", + "VRC.SDK3A.Editor", + "VRC.SDKBase", + "VRC.SDKBase.Editor", + "dev.jetees.memoryoptimizer.Shared" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Shared/MemoryOptimizerListData.cs b/Shared/MemoryOptimizerListData.cs index df7986d..e437f13 100644 --- a/Shared/MemoryOptimizerListData.cs +++ b/Shared/MemoryOptimizerListData.cs @@ -1,7 +1,6 @@ #if UNITY_EDITOR using System; -using UnityEngine; using VRC.SDK3.Avatars.ScriptableObjects; namespace JeTeeS.MemoryOptimizer.Shared diff --git a/Shared/dev.jetees.memoryoptimizer.Shared.asmdef b/Shared/dev.jetees.memoryoptimizer.Shared.asmdef index c6ee108..5aa136c 100644 --- a/Shared/dev.jetees.memoryoptimizer.Shared.asmdef +++ b/Shared/dev.jetees.memoryoptimizer.Shared.asmdef @@ -1,24 +1,19 @@ -{ - "name": "dev.jetees.memoryoptimizer.Shared", - "references": [ - "VRC.SDK3A", - "VRC.SDK3A.Editor", - "VRC.SDKBase", - "VRC.SDKBase.Editor" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "autoReferenced": true, - "overrideReferences": false, - "precompiledReferences": [], - "defineConstraints": [], - "optionalUnityReferences": [], - "versionDefines": [ - { - "define": "MemoryOptimizer_VRCFury_IsInstalled", - "expression": "0.0.0", - "name": "com.vrcfury.vrcfury" - } - ] +{ + "name": "dev.jetees.memoryoptimizer.Shared", + "rootNamespace": "", + "references": [ + "VRC.SDK3A", + "VRC.SDK3A.Editor", + "VRC.SDKBase", + "VRC.SDKBase.Editor" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file From 90d2c3707a14a8e12fd9fa23442c9e22bf836561 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:49:01 +0200 Subject: [PATCH 10/16] update README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7696b4c..04b6701 100644 --- a/README.md +++ b/README.md @@ -87,10 +87,6 @@ It is generally recommended to have as few sync steps as possible, as the more s > [!NOTE] > VRCFury does offer a component "Parameter Compressor" (formerly "Unlimited Parameters") though **MemoryOptimizer** offers more fine control of which parameters you would like to optimize. -> [!TIP] -> This component is not exclusive to be used with VRCFury, it works without it as well. - - If you wish to use this with VRCFury, you will need to add the MemoryOptimizerComponent to your avatar. > [!WARNING] @@ -98,6 +94,9 @@ If you wish to use this with VRCFury, you will need to add the MemoryOptimizerCo MemoryOptimizer Component +> [!TIP] +> This component is not exclusive to be used with VRCFury, it works without it as well. + From there just click `Configure` and you have the same workflow as above ([**How to use**](https://github.com/JeTeeS/MemoryOptimizer#parameters-selection)), but with a major difference: We resolve VRCFury parameters (to the best of our ability) so you can configure those without needing to create a build of the Avatar! MemoryOptimizer Component Usage @@ -109,4 +108,7 @@ From there just click `Configure` and you have the same workflow as above ([**Ho The core difference from this to the normal workflow is that the MemoryOptimizer gets installed **during** the upload rather than before, which means whenever you upload, it will process the optimization configuration and apply it! +> [!NOTE] +> The component upload pipeline is non-destructive! we create a copy of your parameters and fx-layer to avoid touching the originals! + When used with VRCFury, it runs after VRCFury is done with all its magic, and then collects and maps the parameters so the configured ones get optimized. \ No newline at end of file From 81a09111ae6a3b17293243a9f60eabc17dcd2c5a Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:21:59 +0200 Subject: [PATCH 11/16] update VRCFury Patching --- Editor/MemoryOptimizerComponentEditor.cs | 1 + .../Patcher/MemoryOptimizerVRCFuryPatcher.cs | 6 +- .../VRCFury-FinalValidationService.txt | 20 ++- ...ryOptimizerDisableVRCFuryParameterCheck.cs | 17 --- .../Pipeline/MemoryOptimizerUploadPipeline.cs | 7 +- ...emoryOptimizerWrapVRCFuryUploadPipeline.cs | 124 ++++++++++++++++++ ...ptimizerWrapVRCFuryUploadPipeline.cs.meta} | 0 Helper/ReflectionHelper.cs | 10 +- 8 files changed, 150 insertions(+), 35 deletions(-) delete mode 100644 Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs create mode 100644 Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs rename Editor/Pipeline/{MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta => MemoryOptimizerWrapVRCFuryUploadPipeline.cs.meta} (100%) diff --git a/Editor/MemoryOptimizerComponentEditor.cs b/Editor/MemoryOptimizerComponentEditor.cs index 7916d50..6420cc5 100644 --- a/Editor/MemoryOptimizerComponentEditor.cs +++ b/Editor/MemoryOptimizerComponentEditor.cs @@ -1,5 +1,6 @@ using System.Linq; using JeTeeS.MemoryOptimizer.Patcher; +using JeTeeS.MemoryOptimizer.Pipeline; using UnityEditor; using UnityEngine; using static JeTeeS.MemoryOptimizer.Shared.MemoryOptimizerConstants; diff --git a/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs b/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs index 0be0aa8..4392b7e 100644 --- a/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs +++ b/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs @@ -13,7 +13,7 @@ private static void Load() { if (_refFinalValidationService is null || !_refIsPatched) { - if (AssetDatabase.LoadAssetAtPath("Packages/com.vrcfury.vrcfury/Editor/VF/Service/FinalValidationService.cs") is MonoScript scriptToPatch) + if (AssetDatabase.LoadAssetAtPath("Packages/com.vrcfury.vrcfury/Editor/VF/Service/FinalValidationService.cs") is { } scriptToPatch) { _refFinalValidationService = scriptToPatch; _refIsPatched = scriptToPatch.text.Contains("patched by >>> dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher"); @@ -51,11 +51,11 @@ public static bool PatchVRCFuryScripts() if (_refFinalValidationService is not null) { - if (AssetDatabase.LoadAssetAtPath("Packages/dev.jetees.memoryoptimizer/Patcher/VRCFury-FinalValidationService.txt") is TextAsset patch) + if (AssetDatabase.LoadAssetAtPath("Packages/dev.jetees.memoryoptimizer/Editor/Patcher/VRCFury-FinalValidationService.txt") is { } patch) { File.WriteAllText(AssetDatabase.GetAssetPath(_refFinalValidationService), patch.text); EditorUtility.SetDirty(_refFinalValidationService); - Debug.Log("MemoryOptimizerVRCFuryPatcher: Patched FinalValidationService."); + Debug.Log("[MemoryOptimizer] MemoryOptimizerVRCFuryPatcher patched VF.Service.FinalValidationService!"); } } diff --git a/Editor/Patcher/VRCFury-FinalValidationService.txt b/Editor/Patcher/VRCFury-FinalValidationService.txt index f35fa17..42ffd78 100644 --- a/Editor/Patcher/VRCFury-FinalValidationService.txt +++ b/Editor/Patcher/VRCFury-FinalValidationService.txt @@ -11,12 +11,16 @@ using VRC.SDK3.Avatars.ScriptableObjects; namespace VF.Service { /** - * Many of these checks are copied from or modified from the validation checks in the VRCSDK * patched by >>> dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher - * This patch is required in order for VRCFury not to fail us during the upload process + * Sorry VRCFury, but we need to have the ability to skip the param check in order to work properly. + * Many of these checks are copied from or modified from the validation checks in the VRCSDK */ [VFService] internal class FinalValidationService { + /** + * This variable was added by dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher + */ + public static bool _checkDisabledByMemoryOptimizer = false; [VFAutowired] private readonly ExceptionService excService; [VFAutowired] private readonly ParamsService paramsService; private ParamManager paramz => paramsService.GetParams(); @@ -29,18 +33,12 @@ namespace VF.Service { } private void CheckParams() { - if (paramz.GetRaw().parameters.Length > 8192) { - excService.ThrowIfActuallyUploading(new SneakyException( - $"Your avatar is using too many synced and unsynced expression parameters ({paramz.GetRaw().parameters.Length})!" - + " There's a limit of 8192 total expression parameters.")); - } - return; - /*var maxBits = VRCExpressionParameters.MAX_PARAMETER_COST; + var maxBits = VRCExpressionParameters.MAX_PARAMETER_COST; if (maxBits > 9999) { // Some modified versions of the VRChat SDK have a broken value for this maxBits = 256; } - if (paramz.GetRaw().CalcTotalCost() > maxBits) { + if (!_checkDisabledByMemoryOptimizer && paramz.GetRaw().CalcTotalCost() > maxBits) { excService.ThrowIfActuallyUploading(new SneakyException( "Your avatar is out of space for parameters! Used " + paramz.GetRaw().CalcTotalCost() + "/" + maxBits @@ -51,7 +49,7 @@ namespace VF.Service { excService.ThrowIfActuallyUploading(new SneakyException( $"Your avatar is using too many synced and unsynced expression parameters ({paramz.GetRaw().parameters.Length})!" + " There's a limit of 8192 total expression parameters.")); - }*/ + } } private void CheckContacts() { diff --git a/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs b/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs deleted file mode 100644 index db7aeed..0000000 --- a/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs +++ /dev/null @@ -1,17 +0,0 @@ -using JeTeeS.MemoryOptimizer.Patcher; -using UnityEngine; -using VRC.SDKBase.Editor.BuildPipeline; - -namespace JeTeeS.MemoryOptimizer.Pipeline -{ - internal class MemoryOptimizerDisableVRCFuryParameterCheck : IVRCSDKPreprocessAvatarCallback - { - // run before VRCFury does - public int callbackOrder => -20000; - - public bool OnPreprocessAvatar(GameObject avatarGameObject) - { - return MemoryOptimizerVRCFuryPatcher.PatchVRCFuryScripts(); - } - } -} diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index 01f1aab..54b405b 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -132,11 +132,13 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) case VRCExpressionParameters.ValueType.Int: type = AnimatorControllerParameterType.Int; break; - case VRCExpressionParameters.ValueType.Float: - break; case VRCExpressionParameters.ValueType.Bool: type = AnimatorControllerParameterType.Bool; break; + default: + case VRCExpressionParameters.ValueType.Float: + // since we already assign float at the beginning, skip + break; } fxLayer.AddUniqueParam(parameter.name, type); @@ -151,7 +153,6 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) break; case VRCExpressionParameters.ValueType.Int: case VRCExpressionParameters.ValueType.Float: - parametersIntNFloatToOptimize.Add(pure); break; } diff --git a/Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs new file mode 100644 index 0000000..ca32baa --- /dev/null +++ b/Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using JeTeeS.MemoryOptimizer.Helper; +using JeTeeS.MemoryOptimizer.Patcher; +using UnityEditor.Callbacks; +using UnityEngine; +using VRC.SDKBase.Editor.BuildPipeline; + +namespace JeTeeS.MemoryOptimizer.Pipeline +{ + internal static class MemoryOptimizerWrapVRCFuryUploadPipeline + { + [DidReloadScripts] + public static void FindAndWrap() + { +#if MemoryOptimizer_VRCFury_IsInstalled + var pipelineCallbacks = ReflectionHelper.FindTypeInAssemblies("VRC.SDKBase.Editor.BuildPipeline.VRCBuildPipelineCallbacks"); + var pipelineCallbacksField = pipelineCallbacks?.GetField("_preprocessAvatarCallbacks", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + var pipelineCallbacksValues = pipelineCallbacksField?.GetValue(null); + if (pipelineCallbacksValues is List callbacks) + { + foreach (var callback in callbacks.ToArray()) + { + var callbackType = callback.GetType(); + var callbackTypeName = callbackType.Name; + var callbackAssembly = string.IsNullOrEmpty(callbackType.AssemblyQualifiedName) ? "" : callbackType.AssemblyQualifiedName; + + if (callbackTypeName.Equals("VrcPreuploadHook") && callbackAssembly.Contains("VF.Hook")) + { + var wrap = new MemoryOptimizerVRCFuryUploadPipelineWrapper(callback); + callbacks.Remove(callback); + callbacks.Add(wrap); + + Debug.Log($"[MemoryOptimizer] wrapped the VRCFury Upload Pipeline! ({callbackAssembly} -> {wrap.GetType().AssemblyQualifiedName})"); + + break; + } + } + + pipelineCallbacksField.SetValue(null, callbacks); + } +#endif + } + + internal class MemoryOptimizerVRCFuryUploadPipelineWrapper : IVRCSDKPreprocessAvatarCallback + { + private readonly IVRCSDKPreprocessAvatarCallback _wrapped; + + public int callbackOrder => _wrapped?.callbackOrder ?? 0; + + public MemoryOptimizerVRCFuryUploadPipelineWrapper() + { + _wrapped = null; + } + + public MemoryOptimizerVRCFuryUploadPipelineWrapper(IVRCSDKPreprocessAvatarCallback wrap) + { + _wrapped = wrap; + } + + public bool OnPreprocessAvatar(GameObject avatarGameObject) + { + if (_wrapped is null) return true; + + var status = false; + using (new PreprocessAvatarMemoryOptimizerScope(avatarGameObject)) + { + Debug.Log("[MemoryOptimizer] Hello from wrapped VRCFury Upload Pipeline!"); + + // run VRCFury + status = _wrapped.OnPreprocessAvatar(avatarGameObject); + } + + return status; + } + + internal class PreprocessAvatarMemoryOptimizerScope : IDisposable + { + private readonly MemoryOptimizerComponent _component; + private Type _validationService; + private FieldInfo _validationServiceField; + + public PreprocessAvatarMemoryOptimizerScope(GameObject avatarObject) + { + if (avatarObject?.GetComponent() is { } component) + { + _component = component; + } + + if (_component is not null) + { + Init(); + } + } + + private void Init() + { + try + { + if (!MemoryOptimizerVRCFuryPatcher.AreVRCFuryScriptsPatched()) + { + MemoryOptimizerVRCFuryPatcher.PatchVRCFuryScripts(); + } + + _validationService = ReflectionHelper.FindTypeInAssemblies("VF.Service.FinalValidationService"); + _validationServiceField = _validationService?.GetField("_checkDisabledByMemoryOptimizer", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + + _validationServiceField?.SetValue(null, true); + } + catch (Exception e) + { + Debug.Log($"[MemoryOptimizer] Setting the VF.Service.FinalValidationService flag resulted in an error: {e}"); + } + } + + public void Dispose() + { + _validationServiceField?.SetValue(null, false); + } + } + } + } +} diff --git a/Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta b/Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs.meta similarity index 100% rename from Editor/Pipeline/MemoryOptimizerDisableVRCFuryParameterCheck.cs.meta rename to Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs.meta diff --git a/Helper/ReflectionHelper.cs b/Helper/ReflectionHelper.cs index 5923a82..345592a 100644 --- a/Helper/ReflectionHelper.cs +++ b/Helper/ReflectionHelper.cs @@ -1,4 +1,7 @@ -namespace JeTeeS.MemoryOptimizer.Helper +using System; +using System.Linq; + +namespace JeTeeS.MemoryOptimizer.Helper { internal static class ReflectionHelper { @@ -6,5 +9,10 @@ internal static object GetFieldValue(this object obj, string field) { return obj.GetType().GetField(field).GetValue(obj); } + + internal static Type FindTypeInAssemblies(string type) + { + return AppDomain.CurrentDomain.GetAssemblies().Select(assembly => assembly.GetType(type)).FirstOrDefault(t => t is not null); + } } } \ No newline at end of file From a498633cfaf4f40596040b598c07b1f477d16776 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Fri, 4 Oct 2024 16:10:25 +0200 Subject: [PATCH 12/16] fix issue where parameters may not be present even though configured, we have to re-adjust the count to optimize --- .../Pipeline/MemoryOptimizerUploadPipeline.cs | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index 54b405b..5a3fa71 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -74,8 +74,10 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar running on {avatarGameObject.name} with {parameters.Length} parameters - loaded configuration: {memoryOptimizer.savedParameterConfigurations.Where(p => p.selected && p.willBeOptimized).ToList().Count}"); - var parametersBoolToOptimize = new List(0); - var parametersIntNFloatToOptimize = new List(0); + var parametersBoolToOptimize = new List(memoryOptimizer.savedParameterConfigurations.Count); + var parametersIntNFloatToOptimize = new List(memoryOptimizer.savedParameterConfigurations.Count); + + int countBoolShould = 0, countBoolIs = 0, countIntNFloatShould = 0, countIntNFloatIs = 0; foreach (var savedParameterConfiguration in memoryOptimizer.savedParameterConfigurations) { @@ -114,6 +116,18 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) }); } + switch (savedParameterConfiguration.param.valueType) + { + case VRCExpressionParameters.ValueType.Bool: + countBoolShould++; + break; + case VRCExpressionParameters.ValueType.Int: + case VRCExpressionParameters.ValueType.Float: + countIntNFloatShould++; + break; + } + + // didn't find parameter, skip if (parameter is null) { continue; @@ -149,16 +163,30 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) switch (savedParameterConfiguration.param.valueType) { case VRCExpressionParameters.ValueType.Bool: + countBoolIs++; parametersBoolToOptimize.Add(pure); break; case VRCExpressionParameters.ValueType.Int: case VRCExpressionParameters.ValueType.Float: + countIntNFloatIs++; parametersIntNFloatToOptimize.Add(pure); break; } } } + // ensure the bool parameters that are left still match what we can optimize + if (countBoolIs < countBoolShould) + { + parametersBoolToOptimize = parametersBoolToOptimize.Take(parametersBoolToOptimize.Count - (parametersBoolToOptimize.Count % memoryOptimizer.syncSteps)).ToList(); + } + + // ensure the int and float parameters that are left still match what we can optimize + if (countIntNFloatIs < countIntNFloatShould) + { + parametersIntNFloatToOptimize = parametersIntNFloatToOptimize.Take(parametersIntNFloatToOptimize.Count - (parametersIntNFloatToOptimize.Count % memoryOptimizer.syncSteps)).ToList(); + } + if (parametersBoolToOptimize.Any() || parametersIntNFloatToOptimize.Any()) { MemoryOptimizerMain.InstallMemOpt(vrcAvatarDescriptor, fxLayer, vrcAvatarDescriptor.expressionParameters, parametersBoolToOptimize, parametersIntNFloatToOptimize, memoryOptimizer.syncSteps, memoryOptimizer.stepDelay, memoryOptimizer.changeDetection, memoryOptimizer.wdOption, "Assets/TES/MemOpt"); From 969f1a9f9402ac69a10f8d467ae5f4a031459d98 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Fri, 4 Oct 2024 23:51:26 +0200 Subject: [PATCH 13/16] add some performance fixes and build validations to improve the component upload --- Component/MemoryOptimizerComponent.cs | 4 +- Editor/MemoryOptimizerWindow.cs | 2 +- .../Pipeline/MemoryOptimizerUploadPipeline.cs | 98 ++++++++++++------- Helper/TESHelperFunctions.cs | 16 +++ 4 files changed, 81 insertions(+), 39 deletions(-) diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index 0916ef2..5e455ea 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -68,9 +68,9 @@ public override bool Equals(object obj) return base.Equals(obj); } - public MemoryOptimizerListData Pure() + public MemoryOptimizerListData CopyBase(VRCExpressionParameters.Parameter inherit = null) { - return new MemoryOptimizerListData(new VRCExpressionParameters.Parameter() + return new MemoryOptimizerListData(inherit ?? new VRCExpressionParameters.Parameter() { name = param.name, valueType = param.valueType, diff --git a/Editor/MemoryOptimizerWindow.cs b/Editor/MemoryOptimizerWindow.cs index b98bd4d..7bcccd9 100644 --- a/Editor/MemoryOptimizerWindow.cs +++ b/Editor/MemoryOptimizerWindow.cs @@ -786,7 +786,7 @@ private void ResetParamSelection() { foreach (var value in _component.savedParameterConfigurations) { - paramList.Add(value.Pure()); + paramList.Add(value.CopyBase()); } } else diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index 5a3fa71..7da0171 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -32,43 +32,66 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) return true; } - var fxLayer = FindFXLayer(vrcAvatarDescriptor); - var parameters = vrcAvatarDescriptor.expressionParameters?.parameters ?? Array.Empty(); - - // skip if we have no fx layer, or system is installed, or we don't have parameters - if (fxLayer is null || MemoryOptimizerHelper.IsSystemInstalled(fxLayer) || parameters.Length <= 0) + // generate temporary fx layer if we don't find one, as parameters can be used in other layers as well + // but need to be synced on FX + var fxLayer = FindFXLayer(vrcAvatarDescriptor) ?? GenerateTemporaryFXLayer(vrcAvatarDescriptor); + var avatarParameters = vrcAvatarDescriptor.expressionParameters; + var parameters = Array.Empty(); + + // skip if: + // - no parameters (null or empty) + // - parameters are within budget, optimizing should only be done if we actually need it + // - the system is already installed { - Debug.LogWarning("[MemoryOptimizer] System was not installed as it either: was already installed, there was no fx layer or no parameters."); - return true; - } + var skipReasons = new List(); + + if (avatarParameters is null || avatarParameters?.parameters.Length <= 0 || (avatarParameters?.IsWithinBudget() ?? true)) + { + skipReasons.Add(" - No parameters to optimize."); + } - var (copiedFxLayerSuccess, copiedFxLayer) = MakeCopyOf(fxLayer, $"Packages/dev.jetees.memoryoptimizer/Temp/Generated_{avatarGameObject.name.SanitizeFileName()}/", $"{prefix}_GeneratedFxLayer"); - var (copiedExpressionParametersSuccess, copiedExpressionParameters) = MakeCopyOf(vrcAvatarDescriptor.expressionParameters, $"Packages/dev.jetees.memoryoptimizer/Temp/Generated_{avatarGameObject.name.SanitizeFileName()}/", $"{prefix}_GeneratedExpressionParameters"); + if (MemoryOptimizerHelper.IsSystemInstalled(fxLayer)) + { + skipReasons.Add(" - System is already installed."); + } - // throw error when copy fails - if (!copiedFxLayerSuccess || !copiedExpressionParametersSuccess) - { - return false; + if (skipReasons.Any()) + { + Debug.LogWarning($"[MemoryOptimizer] System was not installed:\n{string.Join("\n", skipReasons)}"); + return true; + } } - - // setup copies - // we make the avatar reference copies to not break any original assets - fxLayer = copiedFxLayer; - parameters = copiedExpressionParameters.parameters; - - vrcAvatarDescriptor.expressionParameters = copiedExpressionParameters; - for (int i = 0, l = vrcAvatarDescriptor.baseAnimationLayers.Length; i < l; i++) + + // make the avatar upload clone reference copies to not modify original assets { - // find the fx layer and replace it - if (vrcAvatarDescriptor.baseAnimationLayers[i] is { type: VRCAvatarDescriptor.AnimLayerType.FX, animatorController: not null }) + // setup copies + var pathBase = $"Packages/dev.jetees.memoryoptimizer/Temp/Generated_{avatarGameObject.name.SanitizeFileName()}/"; + var (copiedFxLayerSuccess, copiedFxLayer) = MakeCopyOf(fxLayer, pathBase, $"{prefix}_GeneratedFxLayer"); + var (copiedExpressionParametersSuccess, copiedExpressionParameters) = MakeCopyOf(vrcAvatarDescriptor.expressionParameters, pathBase, $"{prefix}_GeneratedExpressionParameters"); + + // throw error when copy fails + if (!copiedFxLayerSuccess || !copiedExpressionParametersSuccess) + { + return false; + } + + fxLayer = copiedFxLayer; + parameters = copiedExpressionParameters.parameters; + + vrcAvatarDescriptor.expressionParameters = copiedExpressionParameters; + for (int i = 0, l = vrcAvatarDescriptor.baseAnimationLayers.Length; i < l; i++) { - var layer = vrcAvatarDescriptor.baseAnimationLayers[i]; + // find the fx layer and replace it + if (vrcAvatarDescriptor.baseAnimationLayers[i] is { type: VRCAvatarDescriptor.AnimLayerType.FX, animatorController: not null }) + { + var layer = vrcAvatarDescriptor.baseAnimationLayers[i]; - layer.animatorController = fxLayer; + layer.animatorController = fxLayer; - vrcAvatarDescriptor.baseAnimationLayers[i] = layer; + vrcAvatarDescriptor.baseAnimationLayers[i] = layer; - break; + break; + } } } @@ -132,10 +155,6 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) { continue; } - - // create pure copy to reference the proper parameter - var pure = savedParameterConfiguration.Pure(); - pure.param = parameter; // add the parameter to the fx layer if it's missing if (fxLayer.parameters.All(p => !p.name.Equals(parameter.name))) @@ -160,16 +179,19 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) if (savedParameterConfiguration.selected && savedParameterConfiguration.willBeOptimized) { + // create copy to reference the proper parameter + var baseCopy = savedParameterConfiguration.CopyBase(parameter); + switch (savedParameterConfiguration.param.valueType) { case VRCExpressionParameters.ValueType.Bool: countBoolIs++; - parametersBoolToOptimize.Add(pure); + parametersBoolToOptimize.Add(baseCopy); break; case VRCExpressionParameters.ValueType.Int: case VRCExpressionParameters.ValueType.Float: countIntNFloatIs++; - parametersIntNFloatToOptimize.Add(pure); + parametersIntNFloatToOptimize.Add(baseCopy); break; } } @@ -178,13 +200,17 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) // ensure the bool parameters that are left still match what we can optimize if (countBoolIs < countBoolShould) { - parametersBoolToOptimize = parametersBoolToOptimize.Take(parametersBoolToOptimize.Count - (parametersBoolToOptimize.Count % memoryOptimizer.syncSteps)).ToList(); + var newBoolCount = parametersBoolToOptimize.Count - (parametersBoolToOptimize.Count % memoryOptimizer.syncSteps); + Debug.LogWarning($"[MemoryOptimizer] Bool count did not match, expected: {countBoolShould} got: {countBoolIs} - now taking: {newBoolCount}"); + parametersBoolToOptimize = parametersBoolToOptimize.Take(newBoolCount).ToList(); } // ensure the int and float parameters that are left still match what we can optimize if (countIntNFloatIs < countIntNFloatShould) { - parametersIntNFloatToOptimize = parametersIntNFloatToOptimize.Take(parametersIntNFloatToOptimize.Count - (parametersIntNFloatToOptimize.Count % memoryOptimizer.syncSteps)).ToList(); + var newIntNFloatCount = parametersIntNFloatToOptimize.Count - (parametersIntNFloatToOptimize.Count % memoryOptimizer.syncSteps); + Debug.LogWarning($"[MemoryOptimizer] IntNFloat count did not match, expected: {countIntNFloatShould} got: {countIntNFloatIs} - now taking: {newIntNFloatCount}"); + parametersIntNFloatToOptimize = parametersIntNFloatToOptimize.Take(newIntNFloatCount).ToList(); } if (parametersBoolToOptimize.Any() || parametersIntNFloatToOptimize.Any()) diff --git a/Helper/TESHelperFunctions.cs b/Helper/TESHelperFunctions.cs index ef1b061..7d6a85e 100644 --- a/Helper/TESHelperFunctions.cs +++ b/Helper/TESHelperFunctions.cs @@ -124,6 +124,22 @@ public static AnimatorController FindFXLayer(VRCAvatarDescriptor descriptor) return null; } + public static AnimatorController GenerateTemporaryFXLayer(VRCAvatarDescriptor descriptor) + { + var pathBase = $"Packages/dev.jetees.memoryoptimizer/Temp/Generated_{descriptor.gameObject.name.SanitizeFileName()}/MemOpt_Temp_GeneratedFXLayer.controller"; + + var temp = new AnimatorController() + { + name = "MemOpt_Temp_GeneratedFXLayer" + }; + + AssetDatabase.CreateAsset(temp, pathBase); + AssetDatabase.SaveAssets(); + AssetDatabase.ImportAsset(pathBase, ImportAssetOptions.ForceUpdate); + + return temp; + } + public static VRCExpressionParameters FindExpressionParams(VRCAvatarDescriptor descriptor) { return descriptor?.expressionParameters; From e1923008c9208c1cc401c6d6d9d0df18e8f896ee Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Sat, 5 Oct 2024 18:11:08 +0200 Subject: [PATCH 14/16] change to harmony patching to avoid including any sources --- Editor/MemoryOptimizerComponentEditor.cs | 19 ---- .../Patcher/MemoryOptimizerVRCFuryPatcher.cs | 93 ++++++++++--------- .../VRCFury-FinalValidationService.txt | 80 ---------------- .../VRCFury-FinalValidationService.txt.meta | 3 - .../Pipeline/MemoryOptimizerUploadPipeline.cs | 10 +- ...emoryOptimizerWrapVRCFuryUploadPipeline.cs | 59 +----------- .../dev.jetees.memoryoptimizer.Editor.asmdef | 5 - 7 files changed, 58 insertions(+), 211 deletions(-) delete mode 100644 Editor/Patcher/VRCFury-FinalValidationService.txt delete mode 100644 Editor/Patcher/VRCFury-FinalValidationService.txt.meta diff --git a/Editor/MemoryOptimizerComponentEditor.cs b/Editor/MemoryOptimizerComponentEditor.cs index 6420cc5..51778a9 100644 --- a/Editor/MemoryOptimizerComponentEditor.cs +++ b/Editor/MemoryOptimizerComponentEditor.cs @@ -23,25 +23,6 @@ public override void OnInspectorGUI() { bool hasErrors = _component.componentIssues.Any(x => x.level >= 3); -#if MemoryOptimizer_VRCFury_IsInstalled - if (MemoryOptimizerVRCFuryPatcher.AreVRCFuryScriptsPatched()) - { - EditorGUILayout.HelpBox("VRCFury is patched already!", MessageType.Info); - } - else - { - EditorGUILayout.HelpBox("VRCFury requires to be patched in order for this to correctly work when uploading.\nPatching will be done automatically during upload, however it is recommended todo this before.", MessageType.Warning); - using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) - { - if (GUILayout.Button("Patch VRCFury") && EditorUtility.DisplayDialog("Patch VRCFury?", "This will patch some VRCFury files to disable upload check hooks for parameters as we preprocess after, this will cause a script rebuild.\nContinue?", "Yes, Patch!", "No.")) - { - MemoryOptimizerVRCFuryPatcher.PatchVRCFuryScripts(); - } - } - } - - GUILayout.Space(5); -#endif if (_component.componentIssues.Any()) { using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal, EditorStyles.helpBox))) diff --git a/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs b/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs index 4392b7e..b489b5d 100644 --- a/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs +++ b/Editor/Patcher/MemoryOptimizerVRCFuryPatcher.cs @@ -1,67 +1,68 @@ -using System.IO; -using UnityEditor; +using System.Reflection; +using HarmonyLib; +using JeTeeS.MemoryOptimizer.Helper; using UnityEngine; namespace JeTeeS.MemoryOptimizer.Patcher { - internal static class MemoryOptimizerVRCFuryPatcher + public static class FinalValidationServicePatch { - private static bool _refIsPatched = false; - private static MonoScript _refFinalValidationService = null; - - private static void Load() + public static bool PatchedCheckParams() { - if (_refFinalValidationService is null || !_refIsPatched) - { - if (AssetDatabase.LoadAssetAtPath("Packages/com.vrcfury.vrcfury/Editor/VF/Service/FinalValidationService.cs") is { } scriptToPatch) - { - _refFinalValidationService = scriptToPatch; - _refIsPatched = scriptToPatch.text.Contains("patched by >>> dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher"); - } - } - } - - public static bool AreVRCFuryScriptsPatched() - { -#if MemoryOptimizer_VRCFury_IsInstalled -#if !MemoryOptimizer_VRCFury_IsTested - Debug.LogWarning($"The pipeline is running on an untested version of VRCFury, probably fine though."); -#endif - Load(); - - return _refIsPatched; -#else - return true; -#endif + Debug.Log("[MemoryOptimizer] MemoryOptimizerVRCFuryPatcher hello from patched CheckParams!"); + // skip original method + return false; } + } + + internal static class MemoryOptimizerVRCFuryPatcher + { + private const string HarmonyId = "dev.jetees.memoryoptimizer.Patcher"; + private static bool _refIsPatched = false; - public static bool PatchVRCFuryScripts() + public static void FindAndPatch() { #if MemoryOptimizer_VRCFury_IsInstalled -#if !MemoryOptimizer_VRCFury_IsTested - Debug.LogWarning($"The pipeline is running on an untested version of VRCFury, probably fine though."); -#endif - Load(); + // check that we are patched + if (!Harmony.HasAnyPatches(HarmonyId)) + { + _refIsPatched = false; + } + // if we are patched, just skip if (_refIsPatched) { - Debug.Log("MemoryOptimizerVRCFuryPatcher: Already patched, skipping."); - return true; + return; } - if (_refFinalValidationService is not null) + var harmony = new Harmony(HarmonyId); + + // make sure we unpatch everything from us first, just in case + harmony.UnpatchAll(HarmonyId); + + if (ReflectionHelper.FindTypeInAssemblies("VF.Service.FinalValidationService") is not { } vfService) + { + Debug.LogError("[MemoryOptimizer] MemoryOptimizerVRCFuryPatcher failed: did not find type VF.Service.FinalValidationService"); + return; + } + + if (vfService.GetMethod("CheckParams", BindingFlags.NonPublic | BindingFlags.Instance) is not { } original) { - if (AssetDatabase.LoadAssetAtPath("Packages/dev.jetees.memoryoptimizer/Editor/Patcher/VRCFury-FinalValidationService.txt") is { } patch) - { - File.WriteAllText(AssetDatabase.GetAssetPath(_refFinalValidationService), patch.text); - EditorUtility.SetDirty(_refFinalValidationService); - Debug.Log("[MemoryOptimizer] MemoryOptimizerVRCFuryPatcher patched VF.Service.FinalValidationService!"); - } + Debug.LogError("[MemoryOptimizer] MemoryOptimizerVRCFuryPatcher failed: did not find method VF.Service.FinalValidationService.CheckParams"); + return; } - return AreVRCFuryScriptsPatched(); -#else - return true; + if (typeof(FinalValidationServicePatch).GetMethod("PatchedCheckParams", BindingFlags.Public | BindingFlags.Static) is not { } patch) + { + Debug.LogError("[MemoryOptimizer] MemoryOptimizerVRCFuryPatcher failed: did not find method JeTeeS.MemoryOptimizer.PatcherFinalValidationService.PatchedCheckParams"); + return; + } + + harmony.Patch(original, new HarmonyMethod(patch)); + + _refIsPatched = true; + + Debug.Log($"[MemoryOptimizer] MemoryOptimizerVRCFuryPatcher harmony patched {patch} to {original}"); #endif } } diff --git a/Editor/Patcher/VRCFury-FinalValidationService.txt b/Editor/Patcher/VRCFury-FinalValidationService.txt deleted file mode 100644 index 42ffd78..0000000 --- a/Editor/Patcher/VRCFury-FinalValidationService.txt +++ /dev/null @@ -1,80 +0,0 @@ -using System.Linq; -using UnityEngine; -using VF.Builder; -using VF.Builder.Exceptions; -using VF.Component; -using VF.Feature.Base; -using VF.Injector; -using VF.Utils; -using VRC.Dynamics; -using VRC.SDK3.Avatars.ScriptableObjects; - -namespace VF.Service { - /** - * patched by >>> dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher - * Sorry VRCFury, but we need to have the ability to skip the param check in order to work properly. - * Many of these checks are copied from or modified from the validation checks in the VRCSDK - */ - [VFService] - internal class FinalValidationService { - /** - * This variable was added by dev.jetees.memoryoptimizer.MemoryOptimizerVRCFuryPatcher - */ - public static bool _checkDisabledByMemoryOptimizer = false; - [VFAutowired] private readonly ExceptionService excService; - [VFAutowired] private readonly ParamsService paramsService; - private ParamManager paramz => paramsService.GetParams(); - [VFAutowired] private readonly VFGameObject avatarObject; - - [FeatureBuilderAction(FeatureOrder.Validation)] - public void Apply() { - CheckParams(); - CheckContacts(); - } - - private void CheckParams() { - var maxBits = VRCExpressionParameters.MAX_PARAMETER_COST; - if (maxBits > 9999) { - // Some modified versions of the VRChat SDK have a broken value for this - maxBits = 256; - } - if (!_checkDisabledByMemoryOptimizer && paramz.GetRaw().CalcTotalCost() > maxBits) { - excService.ThrowIfActuallyUploading(new SneakyException( - "Your avatar is out of space for parameters! Used " - + paramz.GetRaw().CalcTotalCost() + "/" + maxBits - + " bits. Ask your avatar creator, or the creator of the last prop you've added, if there are any parameters you can remove to make space.")); - } - - if (paramz.GetRaw().parameters.Length > 8192) { - excService.ThrowIfActuallyUploading(new SneakyException( - $"Your avatar is using too many synced and unsynced expression parameters ({paramz.GetRaw().parameters.Length})!" - + " There's a limit of 8192 total expression parameters.")); - } - } - - private void CheckContacts() { - var contacts = avatarObject.GetComponentsInSelfAndChildren().ToArray(); - var contactLimit = 256; - if (contacts.Length > contactLimit) { - var contactPaths = contacts - .Select(c => c.owner().GetPath(avatarObject)) - .OrderBy(path => path) - .ToArray(); - Debug.Log("Contact report:\n" + string.Join("\n", contactPaths)); - var usesSps = avatarObject.GetComponentsInSelfAndChildren().Any() - || avatarObject.GetComponentsInSelfAndChildren().Any(); - if (usesSps) { - excService.ThrowIfActuallyUploading(new SneakyException( - "Your avatar is using more than the allowed number of contacts! Used " - + contacts.Length + "/" + contactLimit - + ". Delete some contacts or DPS/SPS items from your avatar.")); - } else { - excService.ThrowIfActuallyUploading(new SneakyException( - "Your avatar is using more than the allowed number of contacts! Used " - + contacts.Length + "/" + contactLimit - + ". Delete some contacts from your avatar.")); - } - } - } - } -} diff --git a/Editor/Patcher/VRCFury-FinalValidationService.txt.meta b/Editor/Patcher/VRCFury-FinalValidationService.txt.meta deleted file mode 100644 index f340270..0000000 --- a/Editor/Patcher/VRCFury-FinalValidationService.txt.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: f0bb5fb0c47d4abcb3e76ea34fc498fd -timeCreated: 1727478991 \ No newline at end of file diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index 7da0171..f362644 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -216,10 +216,16 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) if (parametersBoolToOptimize.Any() || parametersIntNFloatToOptimize.Any()) { MemoryOptimizerMain.InstallMemOpt(vrcAvatarDescriptor, fxLayer, vrcAvatarDescriptor.expressionParameters, parametersBoolToOptimize, parametersIntNFloatToOptimize, memoryOptimizer.syncSteps, memoryOptimizer.stepDelay, memoryOptimizer.changeDetection, memoryOptimizer.wdOption, "Assets/TES/MemOpt"); - + + if (vrcAvatarDescriptor.expressionParameters.parameters.Length > 8192) + { + Debug.LogError($"[MemoryOptimizer] Exceeded maximum expression parameter count of 8192."); + return false; + } + Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar optimized:\n- Bools:\n{string.Join("\n", parametersBoolToOptimize.Select(p => $" > {p.param.name}"))}\n- IntNFloats:\n{string.Join("\n", parametersIntNFloatToOptimize.Select(p => $" > {p.param.name}"))}"); - return vrcAvatarDescriptor.expressionParameters?.CalcTotalCost() < VRCExpressionParameters.MAX_PARAMETER_COST; + return vrcAvatarDescriptor.expressionParameters.IsWithinBudget(); } Debug.LogWarning("[MemoryOptimizer] System was not installed as there were no parameters to optimize."); diff --git a/Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs index ca32baa..02c03f2 100644 --- a/Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerWrapVRCFuryUploadPipeline.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Reflection; using JeTeeS.MemoryOptimizer.Helper; using JeTeeS.MemoryOptimizer.Patcher; @@ -63,61 +62,9 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) { if (_wrapped is null) return true; - var status = false; - using (new PreprocessAvatarMemoryOptimizerScope(avatarGameObject)) - { - Debug.Log("[MemoryOptimizer] Hello from wrapped VRCFury Upload Pipeline!"); - - // run VRCFury - status = _wrapped.OnPreprocessAvatar(avatarGameObject); - } - - return status; - } - - internal class PreprocessAvatarMemoryOptimizerScope : IDisposable - { - private readonly MemoryOptimizerComponent _component; - private Type _validationService; - private FieldInfo _validationServiceField; - - public PreprocessAvatarMemoryOptimizerScope(GameObject avatarObject) - { - if (avatarObject?.GetComponent() is { } component) - { - _component = component; - } - - if (_component is not null) - { - Init(); - } - } + MemoryOptimizerVRCFuryPatcher.FindAndPatch(); - private void Init() - { - try - { - if (!MemoryOptimizerVRCFuryPatcher.AreVRCFuryScriptsPatched()) - { - MemoryOptimizerVRCFuryPatcher.PatchVRCFuryScripts(); - } - - _validationService = ReflectionHelper.FindTypeInAssemblies("VF.Service.FinalValidationService"); - _validationServiceField = _validationService?.GetField("_checkDisabledByMemoryOptimizer", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); - - _validationServiceField?.SetValue(null, true); - } - catch (Exception e) - { - Debug.Log($"[MemoryOptimizer] Setting the VF.Service.FinalValidationService flag resulted in an error: {e}"); - } - } - - public void Dispose() - { - _validationServiceField?.SetValue(null, false); - } + return _wrapped.OnPreprocessAvatar(avatarGameObject); } } } diff --git a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef index 5cbf836..8dc6e9a 100644 --- a/Editor/dev.jetees.memoryoptimizer.Editor.asmdef +++ b/Editor/dev.jetees.memoryoptimizer.Editor.asmdef @@ -24,11 +24,6 @@ "name": "com.vrcfury.vrcfury", "expression": "0.0.0", "define": "MemoryOptimizer_VRCFury_IsInstalled" - }, - { - "name": "com.vrcfury.vrcfury", - "expression": "[1.0.0,1.1075.0]", - "define": "MemoryOptimizer_VRCFury_IsTested" } ], "noEngineReferences": false From 0894cad4a0ee579c647fd0be5a5265fed34f3820 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Sat, 5 Oct 2024 22:05:07 +0200 Subject: [PATCH 15/16] fixed some things: - added proper validation for the pipeline since we unhook VRCFury. - optimized the lookup speed in the component by using a dictionary to check. - parameters can be saved as orphans in the event they lose their original link, and will automatically be re-linked, can also be cleared in the settings tab. - GeneratedAssets now get written in the Temp/ directory of the Packages instead of the Assets/, as people tend to dislike clutter in their Assets/ --- Component/MemoryOptimizerComponent.cs | 185 +++++++++++++----- Editor/MemoryOptimizerComponentEditor.cs | 23 ++- Editor/MemoryOptimizerWindow.cs | 22 ++- .../MemoryOptimizerIsActuallyUploading.cs | 64 ++++++ ...MemoryOptimizerIsActuallyUploading.cs.meta | 3 + .../Pipeline/MemoryOptimizerUploadPipeline.cs | 83 +++++--- Shared/MemoryOptimizerConstants.cs | 55 +++++- 7 files changed, 355 insertions(+), 80 deletions(-) create mode 100644 Editor/Pipeline/MemoryOptimizerIsActuallyUploading.cs create mode 100644 Editor/Pipeline/MemoryOptimizerIsActuallyUploading.cs.meta diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index 5e455ea..e53706d 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -6,7 +6,6 @@ using System.Linq; using JeTeeS.MemoryOptimizer.Helper; using JeTeeS.MemoryOptimizer.Shared; -using JeTeeS.TES.HelperFunctions; using UnityEngine; using VRC.SDK3.Avatars.Components; using VRC.SDK3.Avatars.ScriptableObjects; @@ -18,22 +17,26 @@ namespace JeTeeS.MemoryOptimizer [Serializable] [DisallowMultipleComponent] [RequireComponent(typeof(VRCAvatarDescriptor))] - internal class MemoryOptimizerComponent : MonoBehaviour, IEditorOnly + internal class MemoryOptimizerComponent : MonoBehaviour, IEditorOnly, ISerializationCallbackReceiver { [Serializable] - internal class SavedParameterConfiguration : MemoryOptimizerListData + internal class ParameterConfig : MemoryOptimizerListData { - public bool isVRCFuryParameter = false; - public string info = string.Empty; + public string info = string.Empty; + + /** + * We set this flag for parameters that have lost their connection, but may re-gain it + */ + public bool isOrphanParameter = false; [SerializeField] private int hashCode = -1; - public SavedParameterConfiguration(VRCExpressionParameters.Parameter parameter) : base(parameter, false, false) + public ParameterConfig(VRCExpressionParameters.Parameter parameter) : base(parameter, false, false) { CalculateHashCode(); } - public SavedParameterConfiguration(string parameterName, VRCExpressionParameters.ValueType parameterType) : base(new VRCExpressionParameters.Parameter() + public ParameterConfig(string parameterName, VRCExpressionParameters.ValueType parameterType) : base(new VRCExpressionParameters.Parameter() { name = parameterName, valueType = parameterType, @@ -60,7 +63,7 @@ public override int GetHashCode() public override bool Equals(object obj) { - if (obj is SavedParameterConfiguration o) + if (obj is ParameterConfig o) { return o.GetHashCode() == GetHashCode(); } @@ -120,12 +123,30 @@ public override int GetHashCode() public float stepDelay = 0.2f; public int wdOption = 0; - [SerializeField] internal List componentIssues = new(0); - [SerializeField] internal List savedParameterConfigurations = new(0); + [SerializeField] internal List componentIssues = new(16); + [SerializeField] internal List parameterConfigs = new(1024); + + [NonSerialized] private Dictionary lookupParameterConfigs = new(1024); + + public void OnBeforeSerialize() + { } + + public void OnAfterDeserialize() + { + foreach (var parameterConfig in parameterConfigs) + { + lookupParameterConfigs.Add(parameterConfig.GetHashCode(), parameterConfig); + } + } internal void LoadParameters() { componentIssues = new(0); + + foreach (var parameterConfig in parameterConfigs) + { + parameterConfig.isOrphanParameter = true; + } // get descriptor _vrcAvatarDescriptor ??= gameObject.GetComponent(); @@ -138,9 +159,9 @@ internal void LoadParameters() } // collect all descriptor parameters that are synced - foreach (var savedParameterConfiguration in descriptorParameters.Select(p => new SavedParameterConfiguration(p) { info = "From Avatar Descriptor" })) + foreach (var savedParameterConfiguration in descriptorParameters.Select(p => new ParameterConfig(p) { info = "From Avatar Descriptor" })) { - AddOrReplaceParameterConfiguration(savedParameterConfiguration); + AddParameterConfig(savedParameterConfiguration); } #if MemoryOptimizer_VRCFury_IsInstalled @@ -156,9 +177,44 @@ internal void LoadParameters() { foreach (IEditorOnly vrcfComponent in vrcfComponents) { - // for the offset + // get type name + var vrcfType = vrcfComponent.GetType().ToString(); + + // get containing object var vrcfGameObject = ((Component)vrcfComponent).gameObject; + + // VRCFuryHapticSocket components are handled differently + if (vrcfType.Contains("VRCFuryHapticSocket")) + { + var hapticName = string.Empty; + if (vrcfComponent.GetFieldValue("name") is string _name && !string.IsNullOrEmpty(_name)) + { + hapticName = _name; + } + + // VRCFuryHapticSocket generate a parameter called _stealth + AddParameterConfig(new ParameterConfig("VF##_stealth", VRCExpressionParameters.ValueType.Bool)); + + var hapticAddMenuItem = vrcfComponent.GetFieldValue("addMenuItem") is true; + + // ignore _Unknown or no menu item + if (string.IsNullOrEmpty(hapticName) || !hapticAddMenuItem) + { + continue; + } + + AddParameterConfig(new ParameterConfig($"VF##_{hapticName}", VRCExpressionParameters.ValueType.Bool)); + + // we can go to the next component + continue; + } + // VRCFuryHapticPlug don't generate a parameter because ??? + else if (vrcfType.Contains("VRCFuryHapticPlug")) + { + continue; + } + // the normal components are handled via VRCFury.content // extract the content field from VRCFury, this is where the actual "component" data can be found object contentValue = null; try @@ -222,13 +278,12 @@ internal void LoadParameters() continue; } - SavedParameterConfiguration savedParameterConfiguration = new SavedParameterConfiguration(useGlobalParameter ? globalParameter : $"VF##_{toggleName}", isSlider ? VRCExpressionParameters.ValueType.Float : VRCExpressionParameters.ValueType.Bool) + ParameterConfig parameterConfig = new ParameterConfig(useGlobalParameter ? globalParameter : $"VF##_{toggleName}", isSlider ? VRCExpressionParameters.ValueType.Float : VRCExpressionParameters.ValueType.Bool) { - isVRCFuryParameter = true, info = $"From Toggle: {toggleName} on {gameObject.name}" }; - AddOrReplaceParameterConfiguration(savedParameterConfiguration); + AddParameterConfig(parameterConfig); } // Full Controller else if (contentType.Contains("FullController")) @@ -241,79 +296,119 @@ internal void LoadParameters() } var containsStar = globalParameters.Contains("*"); + var isGoGo = false; // get the parameter list if (contentValue.GetFieldValue("prms") is IEnumerable _parametersList) { + var generatedConfigs = new Dictionary(1024); // remap to actual expression parameters - var extractedParametersList = new List(); - foreach (object slot in _parametersList) + foreach (var slot in _parametersList) { // the parameters are a field which is wrapped again if (slot.GetFieldValue("parameters")?.GetFieldValue("objRef") is VRCExpressionParameters cast) { - extractedParametersList.Add(cast); + // add parameters + foreach (var parameter in cast.parameters) + { + // so we can fix them later + if (parameter.name.Equals("Go/Locomotion")) + { + isGoGo = true; + } + + // ignore un-synced + if (!parameter.networkSynced) + { + continue; + } + + var parameterConfig = new ParameterConfig((containsStar && !globalParameters.Contains($"!{parameter.name}")) || globalParameters.Contains(parameter.name) ? parameter.name : $"VF##_{parameter.name}", parameter.valueType) + { + info = $"From FullController on {vrcfGameObject.name}" + }; + + // avoid duplicates + generatedConfigs.TryAdd(parameterConfig.GetHashCode(), parameterConfig); + } } } - // flatten parameters down - foreach (VRCExpressionParameters vrcExpressionParameters in extractedParametersList) + // add to component + foreach (var parameterConfig in generatedConfigs.Select(generatedConfig => generatedConfig.Value)) { - foreach (VRCExpressionParameters.Parameter parameter in vrcExpressionParameters.parameters) + // since GoGo has an issue with their global parameters using 'a *' in most versions, we remap them ourselves correctly + if (isGoGo) { - // ignore un-synced - if (!parameter.networkSynced) + var fixedName = parameterConfig.param.name["VF##_".Length..]; + if (!fixedName.StartsWith("Go/")) { - continue; + fixedName = "Go/" + fixedName; } - var savedParameterConfiguration = new SavedParameterConfiguration((containsStar && !globalParameters.Contains($"!{parameter.name}")) || globalParameters.Contains(parameter.name) ? parameter.name : $"VF##_{parameter.name}", parameter.valueType) + parameterConfig.param = new VRCExpressionParameters.Parameter() { - isVRCFuryParameter = true, - info = $"From FullController on {vrcfGameObject.name}" + name = fixedName, + valueType = parameterConfig.param.valueType, + networkSynced = parameterConfig.param.networkSynced }; - AddOrReplaceParameterConfiguration(savedParameterConfiguration); + parameterConfig.CalculateHashCode(); } + + AddParameterConfig(parameterConfig); } } } } } #endif - if (savedParameterConfigurations.Count <= 0) + if (parameterConfigs.Count <= 0) { componentIssues.Add(("This avatar has no loaded parameters.", 2 /* Warning */)); } } + internal void ClearOrphans() + { + foreach (var parameterConfig in parameterConfigs.ToArray()) + { + if (parameterConfig.isOrphanParameter) + { + parameterConfigs.Remove(parameterConfig); + lookupParameterConfigs.Remove(parameterConfig.GetHashCode()); + } + } + } + private void Reset() { - savedParameterConfigurations = new(0); + parameterConfigs = new(1024); + lookupParameterConfigs = new Dictionary(1024); LoadParameters(); } - private void AddOrReplaceParameterConfiguration(SavedParameterConfiguration configuration) + private bool AddParameterConfig(ParameterConfig config) { - if (savedParameterConfigurations.Contains(configuration)) + if (AnimatorExclusions.Contains(config.param.name)) { - // in the odd case a parameter is defined multiple times - // we replace it with the one costing more, as mapping from a float to a bool - // usually is handled much better than bool to a float - var saved = savedParameterConfigurations.FirstOrDefault(p => p.Equals(configuration)); - if (saved is not null && saved.param.GetVRCExpressionParameterCost() < configuration.param.GetVRCExpressionParameterCost()) - { - Debug.LogWarning($"[MemoryOptimizer] Parameter '{saved.param.name}' from '{saved.info}' was already loaded as {paramTypes[(int)saved.param.valueType]} but has been replaced by {paramTypes[(int)configuration.param.valueType]} from '{configuration.info}'"); - - saved.param = configuration.param; - saved.CalculateHashCode(); - } + return false; + } + + if (lookupParameterConfigs.TryGetValue(config.GetHashCode(), out var stored)) + { + stored.isOrphanParameter = false; } else { - savedParameterConfigurations.Add(configuration); + if (lookupParameterConfigs.TryAdd(config.GetHashCode(), config)) + { + parameterConfigs.Add(config); + } } + + return true; } private void AddIssue(ComponentIssue issue) diff --git a/Editor/MemoryOptimizerComponentEditor.cs b/Editor/MemoryOptimizerComponentEditor.cs index 51778a9..665c013 100644 --- a/Editor/MemoryOptimizerComponentEditor.cs +++ b/Editor/MemoryOptimizerComponentEditor.cs @@ -100,20 +100,29 @@ public override void OnInspectorGUI() EditorPrefs.SetBool(EditorKeyInspectParameters, foldoutState); if (foldoutState) { - foreach (var savedParameterConfiguration in _component.savedParameterConfigurations) + foreach (var parameterConfig in _component.parameterConfigs) { - var (parameterName, parameterType, isSelected, willOptimize) = (savedParameterConfiguration.param.name, savedParameterConfiguration.param.valueType, savedParameterConfiguration.selected, savedParameterConfiguration.willBeOptimized); - using (new MemoryOptimizerWindow.SqueezeScope((0, 0, MemoryOptimizerWindow.SqueezeScope.SqueezeScopeType.Horizontal))) { GUILayout.Space(5); - EditorGUILayout.HelpBox($"{parameterName} - {paramTypes[(int)parameterType]}\n -> {savedParameterConfiguration.info}", MessageType.None); - - GUI.backgroundColor = isSelected ? (willOptimize ? Color.green : Color.yellow) : Color.red; + EditorGUILayout.HelpBox($"{parameterConfig.param.name} - {paramTypes[(int)parameterConfig.param.valueType]}\n -> {parameterConfig.info}", MessageType.None); + GUI.enabled = false; - GUILayout.Button($"{(isSelected ? (willOptimize ? "Will optimize." : "Can't be optimized." ) : "Won't be optimized.")}", GUILayout.Width(203)); + + if (parameterConfig.isOrphanParameter) + { + GUI.backgroundColor = Color.gray; + GUILayout.Button("Orphan", GUILayout.Width(203)); + } + else + { + GUI.backgroundColor = parameterConfig.selected ? (parameterConfig.willBeOptimized ? Color.green : Color.yellow) : Color.red; + GUILayout.Button($"{(parameterConfig.selected ? (parameterConfig.willBeOptimized ? "Will optimize." : "Can't be optimized." ) : "Won't be optimized.")}", GUILayout.Width(203)); + } + GUI.enabled = true; + GUI.backgroundColor = Color.white; } } diff --git a/Editor/MemoryOptimizerWindow.cs b/Editor/MemoryOptimizerWindow.cs index 7bcccd9..df7e133 100644 --- a/Editor/MemoryOptimizerWindow.cs +++ b/Editor/MemoryOptimizerWindow.cs @@ -478,7 +478,7 @@ void OnAvatarChange() foreach (var param in paramList) { - var match = _component.savedParameterConfigurations.FirstOrDefault(p => p.param.name.Equals(param.param.name) && p.param.valueType == param.param.valueType); + var match = _component.parameterConfigs.FirstOrDefault(p => p.param.name.Equals(param.param.name) && p.param.valueType == param.param.valueType); // skip if we have no match if (match is null) @@ -629,6 +629,20 @@ void SavePathChange() stepDelay = 0.2f; } } + + if (_component is not null) + { + // delete orphans option + using (new SqueezeScope((0, 0, Vertical, EditorStyles.helpBox))) + { + EditorGUILayout.HelpBox("Clearing Orphans will delete their configurations!", MessageType.Error, true); + GUILayout.Label($"Current Orphan count: {_component.parameterConfigs.Count(x => x.isOrphanParameter)}"); + if (GUILayout.Button("Clear Orphans")) + { + _component.ClearOrphans(); + } + } + } } break; @@ -674,7 +688,7 @@ private void LoadFromComponent() avatarFXLayer.name = "Temporary Generated FX Layer"; expressionParameters.name = "Temporary Generated Parameters"; - expressionParameters.parameters = _component.savedParameterConfigurations.Select(s => + expressionParameters.parameters = _component.parameterConfigs.Where(p => !p.isOrphanParameter).Select(s => { avatarFXLayer.AddUniqueParam(s.param.name, s.param.valueType.ValueTypeToParamType()); return s.param; @@ -784,7 +798,7 @@ private void ResetParamSelection() if (_component is not null) { - foreach (var value in _component.savedParameterConfigurations) + foreach (var value in _component.parameterConfigs) { paramList.Add(value.CopyBase()); } @@ -793,7 +807,7 @@ private void ResetParamSelection() { if (expressionParameters is not null && expressionParameters.parameters.Length > 0) { - foreach (VRCExpressionParameters.Parameter param in expressionParameters.parameters) + foreach (var param in expressionParameters.parameters) { paramList.Add(new MemoryOptimizerListData(param, false, false)); } diff --git a/Editor/Pipeline/MemoryOptimizerIsActuallyUploading.cs b/Editor/Pipeline/MemoryOptimizerIsActuallyUploading.cs new file mode 100644 index 0000000..5ef917c --- /dev/null +++ b/Editor/Pipeline/MemoryOptimizerIsActuallyUploading.cs @@ -0,0 +1,64 @@ +using System.Diagnostics; +using System.Linq; +using UnityEditor; +using UnityEngine; +using VRC.SDKBase.Editor.BuildPipeline; + +namespace JeTeeS.MemoryOptimizer.Pipeline +{ + internal class MemoryOptimizerIsActuallyUploading : IVRCSDKPreprocessAvatarCallback + { + private static bool _isActuallyUploading = false; + + public int callbackOrder => int.MinValue; + + public bool OnPreprocessAvatar(GameObject avatarGameObject) + { + EditorApplication.delayCall += () => _isActuallyUploading = false; + + _isActuallyUploading = IsActuallyUploadingCheck(); + + return true; + } + + private static bool IsActuallyUploadingCheck() + { + if (Application.isPlaying) + { + return false; + } + + var stack = new StackTrace().GetFrames(); + + if (stack is null) + { + return true; + } + + var preprocessFrame = stack + .Select((frame, i) => (frame, i)) + .Where(f => f.frame.GetMethod().Name == "OnPreprocessAvatar" && (f.frame.GetMethod().DeclaringType?.FullName ?? "").StartsWith("VRC.")) + .Select(pair => pair.i) + .DefaultIfEmpty(-1) + .Last(); + + if (preprocessFrame < 0) + { + return false; + } + + if (preprocessFrame >= stack.Length - 1) + { + return true; + } + + var callingClass = stack[preprocessFrame + 1].GetMethod().DeclaringType?.FullName; + return callingClass is null || callingClass.StartsWith("VRC."); + } + + public static bool Check() + { + return _isActuallyUploading; + } + } +} \ No newline at end of file diff --git a/Editor/Pipeline/MemoryOptimizerIsActuallyUploading.cs.meta b/Editor/Pipeline/MemoryOptimizerIsActuallyUploading.cs.meta new file mode 100644 index 0000000..6434a12 --- /dev/null +++ b/Editor/Pipeline/MemoryOptimizerIsActuallyUploading.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9b190dc30d604109a7b1f93277d55f7a +timeCreated: 1728153899 \ No newline at end of file diff --git a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs index f362644..d947f65 100644 --- a/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs +++ b/Editor/Pipeline/MemoryOptimizerUploadPipeline.cs @@ -29,7 +29,7 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) // if we don't have a component don't process if (memoryOptimizer is null) { - return true; + return PreprocessFinalValidation(vrcAvatarDescriptor); } // generate temporary fx layer if we don't find one, as parameters can be used in other layers as well @@ -42,6 +42,7 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) // - no parameters (null or empty) // - parameters are within budget, optimizing should only be done if we actually need it // - the system is already installed + // - no configurations { var skipReasons = new List(); @@ -55,10 +56,16 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) skipReasons.Add(" - System is already installed."); } + // if none are selected, skip + if (memoryOptimizer.parameterConfigs.All(x => !x.selected)) + { + skipReasons.Add(" - No Parameters were selected to be optimized."); + } + if (skipReasons.Any()) { Debug.LogWarning($"[MemoryOptimizer] System was not installed:\n{string.Join("\n", skipReasons)}"); - return true; + return PreprocessFinalValidation(vrcAvatarDescriptor); } } @@ -95,25 +102,31 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) } } - Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar running on {avatarGameObject.name} with {parameters.Length} parameters - loaded configuration: {memoryOptimizer.savedParameterConfigurations.Where(p => p.selected && p.willBeOptimized).ToList().Count}"); + Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar running on {avatarGameObject.name} with {parameters.Length} parameters - loaded configuration: {memoryOptimizer.parameterConfigs.Where(p => p.selected && p.willBeOptimized).ToList().Count}"); - var parametersBoolToOptimize = new List(memoryOptimizer.savedParameterConfigurations.Count); - var parametersIntNFloatToOptimize = new List(memoryOptimizer.savedParameterConfigurations.Count); + var parametersBoolToOptimize = new List(memoryOptimizer.parameterConfigs.Count); + var parametersIntNFloatToOptimize = new List(memoryOptimizer.parameterConfigs.Count); int countBoolShould = 0, countBoolIs = 0, countIntNFloatShould = 0, countIntNFloatIs = 0; - foreach (var savedParameterConfiguration in memoryOptimizer.savedParameterConfigurations) + foreach (var parameterConfig in memoryOptimizer.parameterConfigs) { + // ignore orphans + if (parameterConfig.isOrphanParameter) + { + continue; + } + // find actual parameter VRCExpressionParameters.Parameter parameter = null; - if (savedParameterConfiguration.param.name.StartsWith("VF##_")) + if (parameterConfig.param.name.StartsWith("VF##_")) { parameter = parameters.FirstOrDefault(p => { if (p.networkSynced) { // match VRCFury parameters by regex replacing VF\d+_ and replacing VF##_ and then matching name and type - if (p.name.StartsWith("VF") && new Regex("^VF\\d+_").Replace(p.name, string.Empty).Equals(savedParameterConfiguration.param.name.Replace("VF##_", string.Empty)) && p.valueType == savedParameterConfiguration.param.valueType) + if (p.name.StartsWith("VF") && new Regex("^VF\\d+_").Replace(p.name, string.Empty).Equals(parameterConfig.param.name.Replace("VF##_", string.Empty)) && p.valueType == parameterConfig.param.valueType) { return true; } @@ -129,7 +142,7 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) if (p.networkSynced) { // match parameters by name and type - if (p.name.Equals(savedParameterConfiguration.param.name) && p.valueType == savedParameterConfiguration.param.valueType) + if (p.name.Equals(parameterConfig.param.name) && p.valueType == parameterConfig.param.valueType) { return true; } @@ -139,7 +152,7 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) }); } - switch (savedParameterConfiguration.param.valueType) + switch (parameterConfig.param.valueType) { case VRCExpressionParameters.ValueType.Bool: countBoolShould++; @@ -177,12 +190,12 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) fxLayer.AddUniqueParam(parameter.name, type); } - if (savedParameterConfiguration.selected && savedParameterConfiguration.willBeOptimized) + if (parameterConfig.selected && parameterConfig.willBeOptimized) { // create copy to reference the proper parameter - var baseCopy = savedParameterConfiguration.CopyBase(parameter); + var baseCopy = parameterConfig.CopyBase(parameter); - switch (savedParameterConfiguration.param.valueType) + switch (parameterConfig.param.valueType) { case VRCExpressionParameters.ValueType.Bool: countBoolIs++; @@ -215,21 +228,47 @@ public bool OnPreprocessAvatar(GameObject avatarGameObject) if (parametersBoolToOptimize.Any() || parametersIntNFloatToOptimize.Any()) { - MemoryOptimizerMain.InstallMemOpt(vrcAvatarDescriptor, fxLayer, vrcAvatarDescriptor.expressionParameters, parametersBoolToOptimize, parametersIntNFloatToOptimize, memoryOptimizer.syncSteps, memoryOptimizer.stepDelay, memoryOptimizer.changeDetection, memoryOptimizer.wdOption, "Assets/TES/MemOpt"); - - if (vrcAvatarDescriptor.expressionParameters.parameters.Length > 8192) - { - Debug.LogError($"[MemoryOptimizer] Exceeded maximum expression parameter count of 8192."); - return false; - } + MemoryOptimizerMain.InstallMemOpt(vrcAvatarDescriptor, fxLayer, vrcAvatarDescriptor.expressionParameters, parametersBoolToOptimize, parametersIntNFloatToOptimize, memoryOptimizer.syncSteps, memoryOptimizer.stepDelay, memoryOptimizer.changeDetection, memoryOptimizer.wdOption, defaultSavePath); Debug.Log($"[MemoryOptimizer] OnPreprocessAvatar optimized:\n- Bools:\n{string.Join("\n", parametersBoolToOptimize.Select(p => $" > {p.param.name}"))}\n- IntNFloats:\n{string.Join("\n", parametersIntNFloatToOptimize.Select(p => $" > {p.param.name}"))}"); - - return vrcAvatarDescriptor.expressionParameters.IsWithinBudget(); + + return PreprocessFinalValidation(vrcAvatarDescriptor); } Debug.LogWarning("[MemoryOptimizer] System was not installed as there were no parameters to optimize."); + return PreprocessFinalValidation(vrcAvatarDescriptor); + } + + private static bool PreprocessFinalValidation(VRCAvatarDescriptor vrcAvatarDescriptor) + { + var shouldFail = false; + if (vrcAvatarDescriptor.expressionParameters.parameters.Length > 8192) + { + Debug.LogError($"[MemoryOptimizer] Exceeded maximum expression parameter count of 8192."); + + shouldFail = true; + } + + if (!vrcAvatarDescriptor.expressionParameters.IsWithinBudget()) + { + Debug.LogError($"[MemoryOptimizer] Exceeded maximum synced expression parameter bit count: {vrcAvatarDescriptor.expressionParameters.CalcTotalCost()}/{VRCExpressionParameters.MAX_PARAMETER_COST}."); + + shouldFail = true; + } + + // only return the actual fail status if we actually are uploading + if (MemoryOptimizerIsActuallyUploading.Check()) + { + // invert since false -> failed + return !shouldFail; + } + + if (shouldFail) + { + Debug.LogWarning("[MemoryOptimizer] Pipeline passed build even though there were errors, as we are not uploading."); + } + return true; } } diff --git a/Shared/MemoryOptimizerConstants.cs b/Shared/MemoryOptimizerConstants.cs index 95e2a16..ca89093 100644 --- a/Shared/MemoryOptimizerConstants.cs +++ b/Shared/MemoryOptimizerConstants.cs @@ -1,9 +1,11 @@ -namespace JeTeeS.MemoryOptimizer.Shared +using System.Collections.Generic; + +namespace JeTeeS.MemoryOptimizer.Shared { internal static class MemoryOptimizerConstants { internal const string menuPath = "Tools/TES/MemoryOptimizer"; - internal const string defaultSavePath = "Assets/TES/MemOpt"; + internal const string defaultSavePath = "Packages/dev.jetees.memoryoptimizer/Temp/Save"; internal const string prefKey = "Mem_Opt_Pref_"; internal const string unlockSyncStepsEPKey = prefKey + "UnlockSyncSteps"; internal const string backUpModeEPKey = prefKey + "BackUpMode"; @@ -36,5 +38,54 @@ internal static class MemoryOptimizerConstants internal static readonly string[] backupModes = { "On", "Off", "Ask" }; internal static readonly string[] paramTypes = { "Int", "Float", "Bool" }; internal static readonly string[] animatorParamTypes = { "", /* 1 */ "Float", "", /* 3 */ "Int", /* 4 */ "Bool", "", "", "", "", /* 9 */ "Trigger" }; + + // exclude certain names, like VRC Animator Parameters, we don't want to optimize those + internal static readonly List AnimatorExclusions = new() + { + "IsLocal", + "Viseme", + "Voice", + "GestureLeft", + "GestureRight", + "GestureLeftWeight", + "GestureRightWeight", + "AngularY", + "VelocityX", + "VelocityY", + "VelocityZ", + "VelocityMagnitude", + "Upright", + "Grounded", + "Seated", + "AFK", + "Expression1", + "Expression2", + "Expression3", + "Expression4", + "Expression5", + "Expression6", + "Expression7", + "Expression8", + "Expression9", + "Expression10", + "Expression11", + "Expression12", + "Expression13", + "Expression14", + "Expression15", + "Expression16", + "TrackingType", + "VRMode", + "MuteSelf", + "InStation", + "Earmuffs", + "IsOnFriendsList", + "AvatarVersion", + "ScaleModified", + "ScaleFactor", + "ScaleFactorInverse", + "EyeHeightAsMeters", + "EyeHeightAsPercent" + }; } } \ No newline at end of file From 6c3459060f095133520edf9c3b8adf5ed4133ca7 Mon Sep 17 00:00:00 2001 From: Penguini <20129564+PenguiniVogel@users.noreply.github.com> Date: Mon, 7 Oct 2024 22:35:56 +0200 Subject: [PATCH 16/16] fix issue with Orphans and GoGo parameters getting cut off --- Component/MemoryOptimizerComponent.cs | 7 ++++++- Editor/MemoryOptimizerWindow.cs | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Component/MemoryOptimizerComponent.cs b/Component/MemoryOptimizerComponent.cs index e53706d..c634841 100644 --- a/Component/MemoryOptimizerComponent.cs +++ b/Component/MemoryOptimizerComponent.cs @@ -340,7 +340,12 @@ internal void LoadParameters() // since GoGo has an issue with their global parameters using 'a *' in most versions, we remap them ourselves correctly if (isGoGo) { - var fixedName = parameterConfig.param.name["VF##_".Length..]; + var fixedName = parameterConfig.param.name; + if (fixedName.StartsWith("VF##_")) + { + fixedName = fixedName["VF##_".Length..]; + } + if (!fixedName.StartsWith("Go/")) { fixedName = "Go/" + fixedName; diff --git a/Editor/MemoryOptimizerWindow.cs b/Editor/MemoryOptimizerWindow.cs index df7e133..a5565e2 100644 --- a/Editor/MemoryOptimizerWindow.cs +++ b/Editor/MemoryOptimizerWindow.cs @@ -705,6 +705,8 @@ private void LoadFromComponent() syncSteps = _component.syncSteps; stepDelay = _component.stepDelay; changeDetectionEnabled = _component.changeDetection; + + OnChangeUpdate(); } private void OnChangeUpdate() @@ -798,7 +800,7 @@ private void ResetParamSelection() if (_component is not null) { - foreach (var value in _component.parameterConfigs) + foreach (var value in _component.parameterConfigs.Where(p => !p.isOrphanParameter)) { paramList.Add(value.CopyBase()); }

KKF`HgRl`O(>*b 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�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