예제 #1
0
        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;
        }
예제 #3
0
        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;
        }
예제 #5
0
 /// <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);
 }
예제 #6
0
 private DefaultExpressionValidator(VRM10ExpressionAvatar expressionAvatar)
 {
     _keys        = expressionAvatar.Clips.Select(ExpressionKey.CreateFromClip).ToArray();
     _expressions = expressionAvatar.Clips.ToDictionary(ExpressionKey.CreateFromClip, x => x);
 }
예제 #7
0
 public IExpressionValidator Create(VRM10ExpressionAvatar expressionAvatar)
 {
     return(new DefaultExpressionValidator(expressionAvatar));
 }