void SelectGUI() { if (m_avatar != null && m_avatar.Clips != null) { var array = m_avatar.Clips .Select(x => x != null ? ExpressionKey.CreateFromClip(x).ToString() : "null" ).ToArray(); SelectedIndex = GUILayout.SelectionGrid(SelectedIndex, array, 4); } if (GUILayout.Button("Add Expression")) { var dir = Path.GetDirectoryName(AssetDatabase.GetAssetPath(m_avatar)); var path = EditorUtility.SaveFilePanel( "Create Expression", dir, string.Format("Expression#{0}.asset", m_avatar.Clips.Count), "asset"); if (!string.IsNullOrEmpty(path)) { var clip = VRM10ExpressionAvatar.CreateExpression(path.ToUnityRelativePath()); //clip.Prefab = AssetDatabase.LoadAssetAtPath<GameObject>(AssetDatabase.GetAssetPath(target)); m_avatar.Clips.Add(clip); } } }
internal void Setup(Transform transform, ILookAtEyeDirectionProvider eyeDirectionProvider, ILookAtEyeDirectionApplicable eyeDirectionApplicable) { m_expressionAvatar = transform.GetComponent <VRM10ExpressionAvatar>(); if (m_expressionAvatar == null) { #if VRM_DEVELOP if (m_debugCount++ == 0) { Debug.LogWarning($"{nameof(VRM10ControllerExpression)}.{nameof(m_expressionAvatar)} is null."); } #endif return; } Restore(); _merger = new ExpressionMerger(m_expressionAvatar.Clips, transform); _keys = m_expressionAvatar.Clips.Select(ExpressionKey.CreateFromClip).ToList(); var oldInputWeights = _inputWeights; _inputWeights = _keys.ToDictionary(x => x, x => 0f); foreach (var key in _keys) { // remain user input weights. if (oldInputWeights.ContainsKey(key)) { _inputWeights[key] = oldInputWeights[key]; } } _actualWeights = _keys.ToDictionary(x => x, x => 0f); _validator = ExpressionValidatorFactory.Create(m_expressionAvatar); _eyeDirectionProvider = eyeDirectionProvider; _eyeDirectionApplicable = eyeDirectionApplicable; }
public ExpressionClipSelector(VRM10ExpressionAvatar avatar, SerializedObject serializedObject) { avatar.RemoveNullClip(); m_avatar = avatar; var prop = serializedObject.FindProperty("Clips"); m_clipList = new ReorderableExpressionList(serializedObject, prop, avatar); m_clipList.Selected += (selected) => { SelectedIndex = avatar.Clips.IndexOf(selected); }; }
public ReorderableExpressionList(SerializedObject serializedObject, SerializedProperty prop, UnityEngine.Object target) { m_list = new ReorderableList(serializedObject, prop); m_list.drawHeaderCallback = (rect) => EditorGUI.LabelField(rect, "Expressions"); m_list.drawElementCallback = (rect, index, isActive, isFocused) => { var element = prop.GetArrayElementAtIndex(index); rect.height -= 4; rect.y += 2; EditorGUI.PropertyField(rect, element); }; m_list.onAddCallback += (list) => { // Add slot prop.arraySize++; // select last item list.index = prop.arraySize - 1; // get last item var element = prop.GetArrayElementAtIndex(list.index); element.objectReferenceValue = null; var dir = Path.GetDirectoryName(AssetDatabase.GetAssetPath(target)); var path = EditorUtility.SaveFilePanel( "Create Expression", dir, string.Format("Expression#{0}.asset", list.count), "asset"); if (!string.IsNullOrEmpty(path)) { var clip = VRM10ExpressionAvatar.CreateExpression(path.ToUnityRelativePath()); //clip.Prefab = AssetDatabase.LoadAssetAtPath<GameObject>(AssetDatabase.GetAssetPath(target)); element.objectReferenceValue = clip; } }; m_list.onSelectCallback += (list) => { var a = list.serializedProperty; var selected = a.GetArrayElementAtIndex(list.index); RaiseSelected((VRM10Expression)selected.objectReferenceValue); }; //m_clipList.onCanRemoveCallback += list => true; }
/// <summary> /// initilaize /// </summary> /// <param name="avatar"></param> public void OnStart(VRM10ExpressionAvatar avatar) { m_clipMap = avatar.Clips.ToDictionary(x => ExpressionKey.CreateFromClip(x), x => x); expressionKeyWeights = m_clipMap.Keys.ToDictionary(x => x, x => 0.0f); }
private DefaultExpressionValidator(VRM10ExpressionAvatar expressionAvatar) { _keys = expressionAvatar.Clips.Select(ExpressionKey.CreateFromClip).ToArray(); _expressions = expressionAvatar.Clips.ToDictionary(ExpressionKey.CreateFromClip, x => x); }
public IExpressionValidator Create(VRM10ExpressionAvatar expressionAvatar) { return(new DefaultExpressionValidator(expressionAvatar)); }