BlendShapeClipSelector.cs
2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using System.Linq;
using UnityEngine;
using UnityEditor;
using System.IO;
using UniGLTF;
namespace VRM
{
class BlendShapeClipSelector
{
BlendShapeAvatar m_avatar;
public BlendShapeClip Selected
{
get
{
if (m_avatar == null || m_avatar.Clips == null)
{
return null;
}
if (m_selectedIndex < 0 || m_selectedIndex >= m_avatar.Clips.Count)
{
return null;
}
return m_avatar.Clips[m_selectedIndex];
}
}
int m_selectedIndex;
int SelectedIndex
{
get { return m_selectedIndex; }
set
{
if (m_selectedIndex == value) return;
m_selectedIndex = value;
if (m_onSelected != null)
{
m_onSelected(Selected);
}
}
}
Action<BlendShapeClip> m_onSelected;
public BlendShapeClipSelector(BlendShapeAvatar avatar, Action<BlendShapeClip> onSelected)
{
avatar.RemoveNullClip();
m_avatar = avatar;
m_onSelected = onSelected;
onSelected(Selected);
}
public void SelectGUI()
{
if (m_avatar != null && m_avatar.Clips != null)
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Select BlendShapeClip", EditorStyles.boldLabel);
var array = m_avatar.Clips
.Select(x => x != null
? BlendShapeKey.CreateFrom(x).ToString()
: "null"
).ToArray();
SelectedIndex = GUILayout.SelectionGrid(SelectedIndex, array, 4);
}
if (GUILayout.Button("Add BlendShapeClip"))
{
var dir = Path.GetDirectoryName(AssetDatabase.GetAssetPath(m_avatar));
var path = EditorUtility.SaveFilePanel(
"Create BlendShapeClip",
dir,
string.Format("BlendShapeClip#{0}.asset", m_avatar.Clips.Count),
"asset");
if (!string.IsNullOrEmpty(path))
{
var clip = BlendShapeAvatar.CreateBlendShapeClip(path.ToUnityRelativePath());
//clip.Prefab = AssetDatabase.LoadAssetAtPath<GameObject>(AssetDatabase.GetAssetPath(target));
m_avatar.Clips.Add(clip);
}
}
}
public void DuplicateWarn()
{
var key = BlendShapeKey.CreateFrom(Selected);
if (m_avatar.Clips.Where(x => key.Match(x)).Count() > 1)
{
EditorGUILayout.HelpBox("duplicate clip: " + key, MessageType.Error);
}
}
}
}