Skip to content

Commit 68f4ccf

Browse files
Merge pull request #284 from Unity-Technologies/features/dan/annotation
Annotation Tool
2 parents ed8236a + f271e94 commit 68f4ccf

70 files changed

Lines changed: 7711 additions & 357 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Menus/MainMenu/MainMenu.cs

Lines changed: 89 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,13 @@ sealed class MainMenu : MonoBehaviour, IMainMenu, IConnectInterfaces, IInstantia
4343
float m_LastRotationInput;
4444
MenuHideFlags m_MenuHideFlags = MenuHideFlags.Hidden;
4545
readonly Dictionary<Type, MainMenuButton> m_ToolButtons = new Dictionary<Type, MainMenuButton>();
46+
readonly Dictionary<ISettingsMenuProvider, GameObject> m_SettingsMenus = new Dictionary<ISettingsMenuProvider, GameObject>();
47+
readonly Dictionary<ISettingsMenuItemProvider, GameObject> m_SettingsMenuItems = new Dictionary<ISettingsMenuItemProvider, GameObject>();
4648

4749
public List<Type> menuTools { private get; set; }
4850
public List<Type> menuWorkspaces { private get; set; }
49-
public Dictionary<KeyValuePair<Type, Transform>, ISettingsMenuProvider> settingsMenuProviders { private get; set; }
50-
public Dictionary<KeyValuePair<Type, Transform>, ISettingsMenuItemProvider> settingsMenuItemProviders { private get; set; }
51+
public Dictionary<KeyValuePair<Type, Transform>, ISettingsMenuProvider> settingsMenuProviders { get; set; }
52+
public Dictionary<KeyValuePair<Type, Transform>, ISettingsMenuItemProvider> settingsMenuItemProviders { get; set; }
5153
public List<ActionMenuData> menuActions { get; set; }
5254
public Transform targetRayOrigin { private get; set; }
5355
public Type proxyType { private get; set; }
@@ -112,14 +114,7 @@ void Start()
112114
m_MainMenuUI.menuOrigin = menuOrigin;
113115
m_MainMenuUI.Setup();
114116

115-
var types = new HashSet<Type>();
116-
types.UnionWith(menuTools);
117-
types.UnionWith(menuWorkspaces);
118-
types.UnionWith(settingsMenuProviders.Keys.Select(provider => provider.Key));
119-
types.UnionWith(settingsMenuItemProviders.Keys.Select(provider => provider.Key));
120-
121-
CreateFaceButtons(types.ToList());
122-
m_MainMenuUI.SetupMenuFaces();
117+
CreateFaceButtons();
123118
UpdateToolButtons();
124119
}
125120

@@ -151,8 +146,14 @@ void OnDestroy()
151146
ObjectUtils.Destroy(m_MainMenuUI.gameObject);
152147
}
153148

154-
void CreateFaceButtons(List<Type> types)
149+
void CreateFaceButtons()
155150
{
151+
var types = new HashSet<Type>();
152+
types.UnionWith(menuTools);
153+
types.UnionWith(menuWorkspaces);
154+
types.UnionWith(settingsMenuProviders.Keys.Select(provider => provider.Key));
155+
types.UnionWith(settingsMenuItemProviders.Keys.Select(provider => provider.Key));
156+
156157
foreach (var type in types)
157158
{
158159
var customMenuAttribute = (MainMenuItemAttribute)type.GetCustomAttributes(typeof(MainMenuItemAttribute), false).FirstOrDefault();
@@ -191,7 +192,8 @@ void CreateFaceButtons(List<Type> types)
191192
});
192193

193194
// Assign Tools Menu button preview properties
194-
mainMenuButton.toolType = selectedType;
195+
if (mainMenuButton != null)
196+
mainMenuButton.toolType = selectedType;
195197
}
196198

197199
if (isWorkspace)
@@ -212,18 +214,7 @@ void CreateFaceButtons(List<Type> types)
212214
{
213215
var kvp = providerPair.Key;
214216
if (kvp.Key == type && (kvp.Value == null || kvp.Value == rayOrigin))
215-
{
216-
var menuProvider = providerPair.Value;
217-
if (buttonData == null)
218-
buttonData = new MainMenuUI.ButtonData(type.Name);
219-
220-
buttonData.sectionName = k_SettingsMenuSectionName;
221-
222-
CreateFaceButton(buttonData, tooltip, () =>
223-
{
224-
menuProvider.settingsMenuInstance = m_MainMenuUI.AddSubmenu(k_SettingsMenuSectionName, menuProvider.settingsMenuPrefab);
225-
});
226-
}
217+
AddSettingsMenu(providerPair.Value, buttonData, tooltip);
227218
}
228219
}
229220

@@ -233,15 +224,7 @@ void CreateFaceButtons(List<Type> types)
233224
{
234225
var kvp = providerPair.Key;
235226
if (kvp.Key == type && (kvp.Value == null || kvp.Value == rayOrigin))
236-
{
237-
var itemProvider = providerPair.Value;
238-
if (buttonData == null)
239-
buttonData = new MainMenuUI.ButtonData(type.Name);
240-
241-
buttonData.sectionName = "Settings";
242-
243-
itemProvider.settingsMenuItemInstance = m_MainMenuUI.CreateCustomButton(itemProvider.settingsMenuItemPrefab, buttonData);
244-
}
227+
AddSettingsMenuItem(providerPair.Value);
245228
}
246229
}
247230
}
@@ -250,6 +233,9 @@ void CreateFaceButtons(List<Type> types)
250233
MainMenuButton CreateFaceButton(MainMenuUI.ButtonData buttonData, ITooltip tooltip, Action buttonClickCallback)
251234
{
252235
var mainMenuButton = m_MainMenuUI.CreateFaceButton(buttonData);
236+
if (mainMenuButton == null)
237+
return null;
238+
253239
var button = mainMenuButton.button;
254240
button.onClick.RemoveAllListeners();
255241
button.onClick.AddListener(() =>
@@ -295,6 +281,76 @@ void SendVisibilityPulse()
295281
{
296282
this.Pulse(node, m_MenuHideFlags == 0 ? m_HidePulse : m_ShowPulse);
297283
}
284+
285+
public void AddSettingsMenu(ISettingsMenuProvider provider)
286+
{
287+
var type = provider.GetType();
288+
var customMenuAttribute = (MainMenuItemAttribute)type.GetCustomAttributes(typeof(MainMenuItemAttribute), false).FirstOrDefault();
289+
290+
ITooltip tooltip = null;
291+
MainMenuUI.ButtonData buttonData;
292+
if (customMenuAttribute != null && customMenuAttribute.shown)
293+
{
294+
tooltip = customMenuAttribute.tooltip;
295+
296+
buttonData = new MainMenuUI.ButtonData(customMenuAttribute.name)
297+
{
298+
sectionName = customMenuAttribute.sectionName,
299+
description = customMenuAttribute.description
300+
};
301+
}
302+
else
303+
{
304+
buttonData = new MainMenuUI.ButtonData(type.Name);
305+
}
306+
307+
AddSettingsMenu(provider, buttonData, tooltip);
308+
}
309+
310+
void AddSettingsMenu(ISettingsMenuProvider provider, MainMenuUI.ButtonData buttonData, ITooltip tooltip)
311+
{
312+
buttonData.sectionName = k_SettingsMenuSectionName;
313+
314+
CreateFaceButton(buttonData, tooltip, () =>
315+
{
316+
var instance = m_MainMenuUI.AddSubmenu(k_SettingsMenuSectionName, provider.settingsMenuPrefab);
317+
m_SettingsMenus[provider] = instance;
318+
provider.settingsMenuInstance = instance;
319+
});
320+
}
321+
322+
public void RemoveSettingsMenu(ISettingsMenuProvider provider)
323+
{
324+
GameObject instance;
325+
if (m_SettingsMenus.TryGetValue(provider, out instance))
326+
{
327+
if (instance)
328+
ObjectUtils.Destroy(instance);
329+
330+
m_SettingsMenus.Remove(provider);
331+
}
332+
provider.settingsMenuInstance = null;
333+
}
334+
335+
public void AddSettingsMenuItem(ISettingsMenuItemProvider provider)
336+
{
337+
var instance = m_MainMenuUI.CreateCustomButton(provider.settingsMenuItemPrefab, k_SettingsMenuSectionName);
338+
m_SettingsMenuItems[provider] = instance;
339+
provider.settingsMenuItemInstance = instance;
340+
}
341+
342+
public void RemoveSettingsMenuItem(ISettingsMenuItemProvider provider)
343+
{
344+
GameObject instance;
345+
if (m_SettingsMenuItems.TryGetValue(provider, out instance))
346+
{
347+
if (instance)
348+
ObjectUtils.Destroy(instance);
349+
350+
m_SettingsMenuItems.Remove(provider);
351+
}
352+
provider.settingsMenuItemInstance = null;
353+
}
298354
}
299355
}
300356
#endif

Menus/MainMenu/Scripts/MainMenuFace.cs

Lines changed: 96 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ namespace UnityEditor.Experimental.EditorVR.Menus
1212
{
1313
sealed class MainMenuFace : MonoBehaviour
1414
{
15+
static readonly Vector3 k_LocalOffset = Vector3.down * 0.15f;
16+
1517
[SerializeField]
1618
MeshRenderer m_BorderOutline;
1719

@@ -33,15 +35,40 @@ sealed class MainMenuFace : MonoBehaviour
3335
Material m_BorderOutlineMaterial;
3436
Vector3 m_BorderOutlineOriginalLocalScale;
3537
Transform m_BorderOutlineTransform;
36-
List<Transform> m_MenuButtons;
3738
Material m_TitleIconMaterial;
3839
Coroutine m_VisibilityCoroutine;
40+
Coroutine m_RevealCoroutine;
41+
GradientPair m_GradientPair;
42+
Vector3 m_OriginalLocalScale;
43+
Vector3 m_HiddenLocalScale;
44+
readonly Stack<GameObject> m_Submenus = new Stack<GameObject>();
3945

4046
const string k_BottomGradientProperty = "_ColorBottom";
4147
const string k_TopGradientProperty = "_ColorTop";
4248
readonly GradientPair k_EmptyGradient = new GradientPair(UnityBrandColorScheme.light, UnityBrandColorScheme.darker);
4349

44-
public GradientPair gradientPair { get; private set; }
50+
public GradientPair gradientPair
51+
{
52+
get { return m_GradientPair; }
53+
set
54+
{
55+
m_GradientPair = value;
56+
m_BorderOutlineMaterial.SetColor(k_TopGradientProperty, gradientPair.a);
57+
m_BorderOutlineMaterial.SetColor(k_BottomGradientProperty, gradientPair.b);
58+
m_TitleIconMaterial.SetColor(k_TopGradientProperty, gradientPair.a);
59+
m_TitleIconMaterial.SetColor(k_BottomGradientProperty, gradientPair.b);
60+
}
61+
}
62+
63+
public string title { set { m_FaceTitle.text = value; } }
64+
65+
public bool visible
66+
{
67+
set
68+
{
69+
this.RestartCoroutine(ref m_VisibilityCoroutine, AnimateVisibility(value));
70+
}
71+
}
4572

4673
void Awake()
4774
{
@@ -50,63 +77,31 @@ void Awake()
5077
m_BorderOutlineMaterial = MaterialUtils.GetMaterialClone(m_BorderOutline);
5178
m_BorderOutlineTransform = m_BorderOutline.transform;
5279
m_BorderOutlineOriginalLocalScale = m_BorderOutlineTransform.localScale;
53-
m_FaceTitle.text = "Not Set";
5480
m_TitleIconMaterial = MaterialUtils.GetMaterialClone(m_TitleIcon);
5581

56-
SetGradientColors(k_EmptyGradient);
57-
}
58-
59-
public void SetFaceData(string faceName, List<Transform> buttons, GradientPair gradientPair)
60-
{
61-
if (m_MenuButtons != null && m_MenuButtons.Any())
62-
{
63-
foreach (var button in m_MenuButtons)
64-
{
65-
ObjectUtils.Destroy(button);
66-
}
67-
}
68-
69-
m_FaceTitle.text = faceName;
70-
m_MenuButtons = buttons;
82+
m_OriginalLocalScale = transform.localScale;
83+
m_HiddenLocalScale = new Vector3(0f, m_OriginalLocalScale.y * 0.5f, m_OriginalLocalScale.z);
7184

72-
foreach (var button in buttons)
73-
{
74-
var buttonTransform = button.transform;
75-
buttonTransform.SetParent(m_GridTransform);
76-
buttonTransform.localRotation = Quaternion.identity;
77-
buttonTransform.localScale = Vector3.one;
78-
buttonTransform.localPosition = Vector3.zero;
79-
}
80-
81-
SetGradientColors(gradientPair);
85+
gradientPair = k_EmptyGradient;
8286
}
8387

84-
void SetGradientColors(GradientPair gradientPair)
88+
public void AddButton(Transform button)
8589
{
86-
this.gradientPair = gradientPair;
87-
m_BorderOutlineMaterial.SetColor(k_TopGradientProperty, gradientPair.a);
88-
m_BorderOutlineMaterial.SetColor(k_BottomGradientProperty, gradientPair.b);
89-
m_TitleIconMaterial.SetColor(k_TopGradientProperty, gradientPair.a);
90-
m_TitleIconMaterial.SetColor(k_BottomGradientProperty, gradientPair.b);
90+
button.SetParent(m_GridTransform);
91+
button.localRotation = Quaternion.identity;
92+
button.localScale = Vector3.one;
93+
button.localPosition = Vector3.zero;
9194
}
9295

93-
public void Show()
96+
public void Reveal(float delay = 0f)
9497
{
95-
m_BorderOutlineTransform.localScale = m_BorderOutlineOriginalLocalScale;
96-
this.StopCoroutine(ref m_VisibilityCoroutine);
97-
m_VisibilityCoroutine = StartCoroutine(AnimateVisibility(true));
98-
}
99-
100-
public void Hide()
101-
{
102-
this.StopCoroutine(ref m_VisibilityCoroutine);
103-
m_VisibilityCoroutine = StartCoroutine(AnimateVisibility(false));
98+
this.RestartCoroutine(ref m_RevealCoroutine, AnimateReveal(delay));
10499
}
105100

106101
IEnumerator AnimateVisibility(bool show)
107102
{
108-
if (m_VisibilityCoroutine != null)
109-
yield break;
103+
if (show)
104+
m_BorderOutlineTransform.localScale = m_BorderOutlineOriginalLocalScale;
110105

111106
m_CanvasGroup.interactable = false;
112107

@@ -129,8 +124,62 @@ IEnumerator AnimateVisibility(bool show)
129124
m_CanvasGroup.interactable = true;
130125
else
131126
m_TitleIcon.SetBlendShapeWeight(0, 0);
127+
}
132128

133-
m_VisibilityCoroutine = null;
129+
IEnumerator AnimateReveal(float delay = 0f)
130+
{
131+
var targetScale = m_OriginalLocalScale;
132+
var targetPosition = Vector3.zero;
133+
var currentScale = m_HiddenLocalScale;
134+
var currentPosition = k_LocalOffset;
135+
136+
transform.localScale = currentScale;
137+
transform.localPosition = currentPosition;
138+
139+
const float kSmoothTime = 0.1f;
140+
var currentDelay = 0f;
141+
var delayTarget = 0.25f + delay; // delay duration before starting the face reveal
142+
while (currentDelay < delayTarget) // delay the reveal of each face slightly more than the previous
143+
{
144+
currentDelay += Time.deltaTime;
145+
yield return null;
146+
}
147+
148+
var smoothVelocity = Vector3.zero;
149+
while (!Mathf.Approximately(currentScale.x, targetScale.x))
150+
{
151+
currentScale = Vector3.SmoothDamp(currentScale, targetScale, ref smoothVelocity, kSmoothTime, Mathf.Infinity, Time.deltaTime);
152+
currentPosition = Vector3.Lerp(currentPosition, targetPosition, Mathf.Pow(currentScale.x / targetScale.x, 2)); // lerp the position with extra emphasis on the beginning transition
153+
transform.localScale = currentScale;
154+
transform.localPosition = currentPosition;
155+
yield return null;
156+
}
157+
158+
transform.localScale = targetScale;
159+
transform.localPosition = targetPosition;
160+
}
161+
162+
public void AddSubmenu(Transform submenu)
163+
{
164+
submenu.SetParent(transform.parent);
165+
166+
submenu.localPosition = Vector3.zero;
167+
submenu.localScale = Vector3.one;
168+
submenu.localRotation = Quaternion.identity;
169+
m_Submenus.Push(submenu.gameObject);
170+
visible = false;
171+
}
172+
173+
public void RemoveSubmenu()
174+
{
175+
var target = m_Submenus.Pop();
176+
target.SetActive(false);
177+
ObjectUtils.Destroy(target, .1f);
178+
179+
if (m_Submenus.Count > 1)
180+
m_Submenus.Last().SetActive(true);
181+
else
182+
visible = true;
134183
}
135184
}
136185
}

0 commit comments

Comments
 (0)