private bool findAvatarAndAnimationPath(Transform cur) { // Find the avatar root and record the animation path along the way. avatarDescriptor = null; avatarTransform = null; string path = ""; do { avatarDescriptor = cur.GetComponent <VRCAvatarDescriptor>(); if (avatarDescriptor != null) { avatarTransform = cur; break; } if (path.Length > 0) { path = cur.name + "/" + path; } else { path = cur.name; } cur = cur.parent; } while (cur != null); if (avatarTransform != null) { animationPath = path; return(true); } return(false); }
private void OnGUI() { EditorStyles.label.wordWrap = true; EditorGUILayout.Space(); EditorGUILayout.LabelField($"{Product} - {Version}"); EditorGUILayout.Space(); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { EditorGUILayout.LabelField("作成したパーティクルライブなどのオブジェクトを出したり閉まったりするための設定を生成するツールです。"); EditorGUILayout.LabelField("※このツールは Avatar に設定してある Animator の Deep Copy を変更し、それをアバターに自動設定します。"); } _avatar = ObjectPicker("Avatar", _avatar); _animator = ObjectPicker("切り替えたい Object", _animator); _animation = ObjectPicker("基準となる Animation", _animation); using (new EditorGUI.DisabledGroupScope(_avatar == null || _animator == null || _animation == null)) { if (GUILayout.Button("生成する")) { OnSubmit(_avatar, _animator, _animation); } } }
private bool Initialized() { if (_initialized) { return(true); } VRCAvatarDescriptor avatar = TEA_Manager.current.Avatar; if (null == avatar) { return(false); } base.Start(); mainMenu = avatar.expressionsMenu; parameters = avatar.expressionParameters; if (null == mainMenu || null == parameters) { TEA_Manager.SDKError($"Expression Menu [{null!=mainMenu}] or Parameters [{null!=parameters}]"); return(true); } root = CreateMainMenu(mainMenu, parameters); root.gameObject.SetActive(true); RadialPuppet.transform.SetAsLastSibling(); MultiAxisPuppet.transform.SetAsLastSibling(); _initialized = true; return(true); }
private static VRCExpressionParameters CreateExpressionParameters(VRCAvatarDescriptor avatar) { var dest = EditorUtility.SaveFilePanelInProject("Save Copied Expression Parameters to...", "NewExpressionParameter", "asset", ""); if (string.IsNullOrWhiteSpace(dest)) { return(null); } var parameters = CreateInstance <VRCExpressionParameters>(); parameters.InitExpressionParameters(true); if (avatar.customExpressions && avatar.expressionParameters != null) { parameters.MergeParameters(avatar.expressionParameters); } if (!parameters.HasParameter(InternalName)) { parameters.AddParameter(new VRCExpressionParameters.Parameter { defaultValue = 0, name = InternalName, saved = false, valueType = VRCExpressionParameters.ValueType.Bool }); } AssetDatabase.CreateAsset(parameters, dest); return(parameters); }
// ----- ------ Avatar ----- ----- public static Dictionary <string, VRCAvatarDescriptor> GetAvatars(out bool crossScene) { crossScene = false; Dictionary <string, VRCAvatarDescriptor> avatars = new Dictionary <string, VRCAvatarDescriptor>(); for (int i = 0; i < SceneManager.sceneCount; i++) { Scene scene = SceneManager.GetSceneAt(i); if (!scene.isLoaded) { continue; } GameObject[] rootObjects = scene.GetRootGameObjects(); foreach (GameObject root in rootObjects) { VRCAvatarDescriptor avatar = root.GetComponent <VRCAvatarDescriptor>(); if (null != avatar) { avatars.Add(TEA_Manager.GetSceneAvatarKey(scene, avatar), avatar); if (scene != SceneManager.GetActiveScene()) { crossScene = true; } } } } return(avatars); }
public ComboGestureCompilerInternal( ComboGestureIntegrator integrator) { _animatorController = (AnimatorController)integrator.animatorController; _conflictPrevention = ConflictPrevention.OfIntegrator(integrator.writeDefaults); // FIXME: Incorrect pattern in use here, none of those are necessary _comboLayers = new List <GestureComboStageMapper>(); _parameterGeneration = ParameterGeneration.Unique; _gesturePlayableLayerController = null; _customEmptyClip = null; _analogBlinkingUpperThreshold = 0f; _featuresToggles = 0; _conflictPreventionTempGestureLayer = ConflictPrevention.OfFxLayer(WriteDefaultsRecommendationMode.UseUnsupportedWriteDefaultsOn); _compilerConflictFxLayerMode = ConflictFxLayerMode.KeepBoth; _compilerIgnoreParamList = new AnimationClip(); _compilerFallbackParamList = new AnimationClip(); _avatarDescriptor = null; _expressionsAvatarMask = null; _logicalAvatarMask = null; _weightCorrectionAvatarMask = null; _gesturePlayableLayerExpressionsAvatarMask = null; _gesturePlayableLayerTechnicalAvatarMask = null; _integrateLimitedLipsync = false; _limitedLipsync = null; _assetContainer = null; _useGestureWeightCorrection = false; _useSmoothing = _useGestureWeightCorrection; }
public static bool SetEyeLookCheck() { GameObject newAvatar = Selection.activeGameObject; if (null == newAvatar) { EditorUtility.DisplayDialog(SET_EYE_LOOK, $"Nothing Selected (probably unity donking up)", "Cancel"); return(false); } VRCAvatarDescriptor descriptor = newAvatar.GetComponent <VRCAvatarDescriptor>(); if (null == descriptor) { EditorUtility.DisplayDialog(SET_EYE_LOOK, $"[{newAvatar.name}] is has no Avatar Descriptor", "Cancel"); return(false); } if (!descriptor.enableEyeLook) { EditorUtility.DisplayDialog(SET_EYE_LOOK, $"[{newAvatar.name}] does not custom eye look", "Cancel"); return(false); } bool accept = accept = EditorUtility.DisplayDialog(SET_EYE_LOOK, $"Use [{newAvatar.name}]'s Eye Look settings as the default when using '{MAKE_AVATAR}'", "Accept", "Cancel"); return(accept); }
// --- --- Validation --- --- #region private void ValidateCustomExpressions(VRCAvatarDescriptor avatar, AnimatorController superAnimator) { if(avatar.customExpressions) { if(null == avatar.expressionsMenu) issues.ExpressionsMenu.Add(new Issue("CustomExpressions is set but you have no ExpressionsMenu", avatar)); if(null == avatar.expressionParameters) issues.ExpressionParameters.Add(new Issue("CustomExpressions is set but you have no ExpressionParameters", avatar)); if(null == avatar.expressionParameters || null == avatar.expressionsMenu) return; EMenus = new List<VRCExpressionsMenu>(); EMenusText = new List<string>(); ValidateExpressionsMenu(avatar, avatar.expressionsMenu); foreach(VRCExpressionParameters.Parameter parameter in avatar.expressionParameters.parameters) { bool exists = false; if(string.IsNullOrEmpty(parameter.name)) continue; foreach(AnimatorControllerParameter aParam in superAnimator.parameters) { if(aParam.name == parameter.name) { exists = true; break; } }//for aParam if(!exists) issues.ParametersNotInAnimators.Add(parameter.name); }//for parameter } }
public static void SetAnimationLayer(this VRCAvatarDescriptor avatar, VRCAvatarDescriptor.AnimLayerType layer, VRCAvatarDescriptor.CustomAnimLayer animation) { switch (layer) { case VRCAvatarDescriptor.AnimLayerType.Base: case VRCAvatarDescriptor.AnimLayerType.Additive: case VRCAvatarDescriptor.AnimLayerType.Gesture: case VRCAvatarDescriptor.AnimLayerType.Action: case VRCAvatarDescriptor.AnimLayerType.FX: var(_, bIndex) = avatar.baseAnimationLayers.Select((w, i) => (Value: w, Index: i)).First(w => w.Value.type == layer); avatar.baseAnimationLayers[bIndex] = animation; break; case VRCAvatarDescriptor.AnimLayerType.SpecialIK: case VRCAvatarDescriptor.AnimLayerType.Sitting: case VRCAvatarDescriptor.AnimLayerType.TPose: case VRCAvatarDescriptor.AnimLayerType.IKPose: var(_, sIndex) = avatar.specialAnimationLayers.Select((w, i) => (Value: w, Index: i)).First(w => w.Value.type == layer); avatar.specialAnimationLayers[sIndex] = animation; break; default: throw new ArgumentOutOfRangeException(nameof(layer), layer, null); } }
public void OnEnable() { /* * if (EyelidSkinnedMesh == null) * EyelidSkinnedMesh = (target as Component).GetComponentInChildren<SkinnedMeshRenderer>(true); * if (EyelidBlendShapes == null) * EyelidBlendShapes = GetBlendShapeNames(EyelidSkinnedMesh); */ if (avatarDescriptor == null) { avatarDescriptor = (VRCAvatarDescriptor)target; } if (pipelineManager == null) { pipelineManager = avatarDescriptor.GetComponent <VRC.Core.PipelineManager>(); if (pipelineManager == null) { avatarDescriptor.gameObject.AddComponent <VRC.Core.PipelineManager>(); } } if (!_doCustomizeAnimLayers.boolValue) { ResetAnimLayersToDefault(); } EnforceAnimLayerSetup(true); serializedObject.ApplyModifiedProperties(); InitEyeLook(); Init_Expressions(); }
private static VRCExpressionsMenu CreateExpressionMenus(VRCAvatarDescriptor avatar) { var dest = EditorUtility.SaveFilePanelInProject("Save Copied Expressions Menu to...", "NewExpressionsMenu", "asset", ""); if (string.IsNullOrWhiteSpace(dest)) { return(null); } var expression = CreateInstance <VRCExpressionsMenu>(); if (avatar.customExpressions && avatar.expressionsMenu != null) { expression.MergeExpressions(avatar.expressionsMenu); } expression.controls.Add(new VRCExpressionsMenu.Control { name = "Toggle Animation", parameter = new VRCExpressionsMenu.Control.Parameter { name = InternalName }, type = VRCExpressionsMenu.Control.ControlType.Toggle }); AssetDatabase.CreateAsset(expression, dest); return(expression); }
void SelectAvatarDescriptor(VRCAvatarDescriptor desc) { if (desc == manager.avatar) { return; } manager.avatar = desc; if (manager.avatar != null) { if (manager.controller == null) { manager.controller = manager.avatar.baseAnimationLayers.Length == 5 ? ((manager.avatar.baseAnimationLayers[4].animatorController != null) ? (AnimatorController)manager.avatar.baseAnimationLayers[4].animatorController : null) : ((manager.avatar.baseAnimationLayers[2].animatorController != null) ? (AnimatorController)manager.avatar.baseAnimationLayers[2].animatorController : null); } if (manager.controller != null) { manager.PreviewRemoval(out layers, out parameters, out expression); } if (manager.menu == null) { manager.menu = manager.avatar.expressionsMenu != null ? manager.avatar.expressionsMenu : null; } } }
public static void CopyPlayableLayer(VRCAvatarDescriptor vrcd, TEA_Settings settings, string controller_folder, string animation_folder) { CopyPlayableLayer(vrcd, 0, controller_folder, animation_folder, AssetDatabase.GetAssetPath(settings.Base), settings.BaseCopy, settings.BaseCopyAnimations); CopyPlayableLayer(vrcd, 1, controller_folder, animation_folder, AssetDatabase.GetAssetPath(settings.Additive), settings.AdditiveCopy, settings.AdditiveCopyAnimations); CopyPlayableLayer(vrcd, 2, controller_folder, animation_folder, AssetDatabase.GetAssetPath(settings.Gesture), settings.GestureCopy, settings.GestureCopyAnimations); CopyPlayableLayer(vrcd, 3, controller_folder, animation_folder, AssetDatabase.GetAssetPath(settings.Action), settings.ActionCopy, settings.ActionCopyAnimations); CopyPlayableLayer(vrcd, 4, controller_folder, animation_folder, AssetDatabase.GetAssetPath(settings.FX), settings.FXCopy, settings.FXCopyAnimations); }
private static List <AnimationClip> CreateAnimations(VRCAvatarDescriptor avatar, Animator animator, AnimationClip animation) { return(new List <AnimationClip> { CreateActivationAnimation(avatar, animator, animation), CreateDeactivationAnimation(avatar, animator) }); }
public static ViewPositionVisualizer AddVisualizerObject(VRCAvatarDescriptor avatar = null) { var container = new GameObject(avatar != null ? $"{avatar.gameObject.name}_ViewPosition" : "ViewPositionVisualizer"); var visualizer = container.AddComponent <ViewPositionVisualizer>(); visualizer.avatar = avatar; return(visualizer); }
public VRCAvatar3(VRCAvatarDescriptor descriptor) : this() { if (descriptor == null) { return; } LoadAvatarInfo(descriptor); }
private static AnimatorController CreateAnimatorController(VRCAvatarDescriptor avatar, List <AnimationClip> animations) { var dest = EditorUtility.SaveFilePanelInProject("Save Copied Animator Controller to...", "NewAnimatorController", "controller", ""); if (string.IsNullOrWhiteSpace(dest)) { return(null); } var controller = new AnimatorController(); AssetDatabase.CreateAsset(controller, dest); if (avatar.customizeAnimationLayers && avatar.HasAnimationLayer(VRCAvatarDescriptor.AnimLayerType.FX, false)) { controller.MergeControllers((AnimatorController)avatar.GetAnimationLayer(VRCAvatarDescriptor.AnimLayerType.FX).animatorController); } if (controller.HasLayer(InternalName)) { AssetDatabase.SaveAssets(); return(controller); } controller.AddParameter(InternalName, AnimatorControllerParameterType.Bool); controller.AddLayer(InternalName); var layer = controller.GetLayer(InternalName); layer.defaultWeight = 1.0f; controller.SetLayer(InternalName, layer); var stateMachine = layer.stateMachine; var deactivationState = stateMachine.AddState("Deactivation"); deactivationState.motion = animations[1]; deactivationState.writeDefaultValues = false; deactivationState.AddExitTransition(true); var activationState = stateMachine.AddState("Activation"); activationState.motion = animations[0]; activationState.writeDefaultValues = false; var transitionFromAny = stateMachine.AddAnyStateTransition(activationState); transitionFromAny.AddCondition(AnimatorConditionMode.If, 1.0f, InternalName); // true var transitionToDeactivation = activationState.AddTransition(deactivationState); transitionToDeactivation.AddCondition(AnimatorConditionMode.IfNot, 1.0f, InternalName); // false transitionToDeactivation.hasExitTime = false; AssetDatabase.SaveAssets(); return(controller); }
public BitActionSwitchCreator(VRCAvatarDescriptor avatarDescriptor, AnimatorController animatorController, VRCExpressionParameters expressionParameters, Scripts.BitActionSwitch bitActionSwitch, string workingDirectory) { this.animatorController = animatorController; this.expressionParameters = expressionParameters; this.bitActionSwitch = bitActionSwitch; this.avatarDescriptor = avatarDescriptor; this.workingDirectory = workingDirectory; }
void SelectAvatarDescriptor(VRCAvatarDescriptor desc) { if (desc == manager.avatar) { return; } manager.avatar = desc; }
public static void SetExpressions(this VRCAvatarDescriptor avatar, VRCExpressionsMenu expr, VRCExpressionParameters parameters) { if (!avatar.customExpressions) { avatar.customExpressions = true; } avatar.expressionsMenu = expr; avatar.expressionParameters = parameters; }
private static AnimatorController MakeCopy(VRCAvatarDescriptor avi, AnimatorController c) { Directory.CreateDirectory(path + avi.name); string newPath = AssetDatabase.GenerateUniqueAssetPath(path + avi.name + "/" + c.name + ".controller"); AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(c), newPath); c = AssetDatabase.LoadAssetAtPath(newPath, typeof(AnimatorController)) as AnimatorController; EditorUtility.SetDirty(c); return(c); }
public static AnimatorController GetPlayableLayer(this VRCAvatarDescriptor avatarDescriptor, VRCAvatarDescriptor.AnimLayerType animLayerType) { var customAnimLayer = avatarDescriptor.baseAnimationLayers?.First(x => x.type == animLayerType); if (customAnimLayer?.animatorController == null) { return(null); } return((AnimatorController)customAnimLayer.Value.animatorController); }
public static bool HasAnimationLayer(this VRCAvatarDescriptor avatar, VRCAvatarDescriptor.AnimLayerType layer) { if (!avatar.customizeAnimationLayers) { return(false); } var anim = avatar.GetAnimationLayer(layer); return(!anim.isDefault && anim.isEnabled && anim.animatorController != null); }
private static void OnSubmit(VRCAvatarDescriptor avatar, Animator animator, AnimationClip animation) { var parameters = CreateExpressionParameters(avatar); var expression = CreateExpressionMenus(avatar); var animations = CreateAnimations(avatar, animator, animation); var controller = CreateAnimatorController(avatar, animations); avatar.expressionParameters = parameters; avatar.expressionsMenu = expression; avatar.SetAnimationLayer(VRCAvatarDescriptor.AnimLayerType.FX, controller); }
public static void SetExpressionsMenu(this VRCAvatarDescriptor avatarDescriptor, VRCExpressionsMenu menu) { var avatarDesctiptorSerializedObject = new SerializedObject(avatarDescriptor); avatarDesctiptorSerializedObject.Update(); avatarDescriptor.expressionsMenu = menu; avatarDescriptor.customExpressions = avatarDescriptor.expressionParameters != null || avatarDescriptor.expressionsMenu != null; avatarDesctiptorSerializedObject.ApplyModifiedProperties(); }
//Draw GUI public void OnGUI() { // Show message if in play mode if (EditorApplication.isPlaying) { GUILayout.Space(10); EditorGUILayout.LabelField(Content.PlaymodeError); return; } _mainScrollviewPosition = EditorGUILayout.BeginScrollView(_mainScrollviewPosition); GUILayout.Space(10); EditorGUI.BeginChangeCheck(); _avatar = (VRCAvatarDescriptor)EditorGUILayout.ObjectField(Content.Avatar, _avatar, typeof(VRCAvatarDescriptor), true); if (EditorGUI.EndChangeCheck()) { _showLayers = _avatar != null; if (_avatar != null) { _avatar.customExpressions = true; if (_avatar.expressionParameters == null) { GenerateNewExpressionParametersAsset(); } if (_avatar.expressionsMenu == null) { GenerateNewExpressionMenuAsset(); } UsedParameterSlots = _avatar.expressionParameters.CalcTotalCost(); _layers = new LayerOptions[_avatar.baseAnimationLayers.Length]; for (int i = 0; i < _avatar.baseAnimationLayers.Length; i++) { _layers[i] = new LayerOptions(this, _avatar.baseAnimationLayers[i], i); } } } if (_showLayers) { if (_layers == null) { RebuildLayers(); } foreach (var l in _layers) { GUILayout.Space(10); l.DrawLayerOptions(); } } EditorGUILayout.EndScrollView(); }
internal static VRCAvatarDescriptor GetFirstAvatar(Scene scene) { GameObject[] rootObjects = scene.GetRootGameObjects(); foreach (GameObject root in rootObjects) { VRCAvatarDescriptor avatar = root.GetComponent <VRCAvatarDescriptor>(); if (null != avatar) { return(avatar); } } return(null); }
private void InitializeCusomizeAnimationLayers(VRCAvatarDescriptor avatar) { avatar.customizeAnimationLayers = true; avatar.baseAnimationLayers = new VRCAvatarDescriptor.CustomAnimLayer[] { new VRCAvatarDescriptor.CustomAnimLayer { type = VRCAvatarDescriptor.AnimLayerType.Base, isDefault = true }, new VRCAvatarDescriptor.CustomAnimLayer { type = VRCAvatarDescriptor.AnimLayerType.Additive, isDefault = true }, new VRCAvatarDescriptor.CustomAnimLayer { type = VRCAvatarDescriptor.AnimLayerType.Gesture, isDefault = true }, new VRCAvatarDescriptor.CustomAnimLayer { type = VRCAvatarDescriptor.AnimLayerType.Action, isDefault = true }, new VRCAvatarDescriptor.CustomAnimLayer { type = VRCAvatarDescriptor.AnimLayerType.FX, isDefault = true } }; avatar.specialAnimationLayers = new VRCAvatarDescriptor.CustomAnimLayer[] { new VRCAvatarDescriptor.CustomAnimLayer { type = VRCAvatarDescriptor.AnimLayerType.Sitting, isDefault = true }, new VRCAvatarDescriptor.CustomAnimLayer { type = VRCAvatarDescriptor.AnimLayerType.TPose, isDefault = true }, new VRCAvatarDescriptor.CustomAnimLayer { type = VRCAvatarDescriptor.AnimLayerType.IKPose, isDefault = true } }; }
//Draw GUI public void OnGUI() { // Show message if in play mode if (EditorApplication.isPlaying) { GUILayout.Space(10); EditorGUILayout.LabelField(Content.PlaymodeError); return; } GUILayout.Space(10); EditorGUI.BeginChangeCheck(); _avatar = (VRCAvatarDescriptor)EditorGUILayout.ObjectField(Content.Avatar, _avatar, typeof(VRCAvatarDescriptor), true); if (EditorGUI.EndChangeCheck()) { _showLayers = _avatar != null; if (_avatar != null) { _avatar.customExpressions = true; if (_avatar.expressionParameters == null) { GenerateNewExpressionParametersAsset(); } if (_avatar.expressionsMenu == null) { GenerateNewExpressionMenuAsset(); } HasFreeParameterSlots = _avatar.expressionParameters.parameters.Count(x => string.IsNullOrEmpty(x.name)) > 0; _layers = new LayerOptions[_avatar.baseAnimationLayers.Length]; for (int i = 0; i < _avatar.baseAnimationLayers.Length; i++) { _layers[i] = new LayerOptions(this, _avatar.baseAnimationLayers[i], i); } } } if (_showLayers) { if (_layers == null) { RebuildLayers(); } foreach (var l in _layers) { GUILayout.Space(10); l.DrawLayerOptions(); } } }
public Avatar8TrackEditor(VRCAvatarDescriptor avatar) { var assets = AssetDatabase.FindAssets("t:Avatar8TrackSettings"); if (null != assets || assets.Length != 0) { settings = AssetDatabase.LoadAssetAtPath <Avatar8TrackSettings>(AssetDatabase.GUIDToAssetPath(assets[0])); FolderIcon = settings.FolderIcon; StopIcon = settings.StopIcon; VolumeIcon = settings.VolumeIcon; DiskIcon = settings.DiskIcon; TrackIcon = settings.TrackIcon; } SetFromAvatar(avatar); }