Skip to content

Commit 272d5fd

Browse files
authored
Merge pull request #1379 from Railboy/MotionControllers
Motion controller script updates
2 parents da355f8 + b44444a commit 272d5fd

File tree

4 files changed

+371
-34
lines changed

4 files changed

+371
-34
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See LICENSE in the project root for license information.
3+
4+
using HoloToolkit.Unity.InputModule;
5+
using UnityEngine;
6+
#if UNITY_2017_2_OR_NEWER
7+
using UnityEngine.XR.WSA.Input;
8+
#else
9+
using UnityEngine.VR.WSA.Input;
10+
#endif
11+
12+
namespace HoloToolkit.Unity.InputModule
13+
{
14+
/// <summary>
15+
/// Waits for a controller to be instantiated, then attaches itself to a specified element
16+
/// </summary>
17+
public class AttachToController : MonoBehaviour
18+
{
19+
public InteractionSourceHandedness Handedness { get { return handedness; } }
20+
21+
public MotionControllerInfo.ControllerElementEnum Element { get { return element; } }
22+
23+
[Header("AttachToController Elements")]
24+
[SerializeField]
25+
protected InteractionSourceHandedness handedness = InteractionSourceHandedness.Left;
26+
27+
[SerializeField]
28+
protected MotionControllerInfo.ControllerElementEnum element = MotionControllerInfo.ControllerElementEnum.PointingPose;
29+
30+
public bool SetChildrenInactiveWhenDetached = true;
31+
32+
[SerializeField]
33+
protected Vector3 positionOffset = Vector3.zero;
34+
35+
[SerializeField]
36+
protected Vector3 rotationOffset = Vector3.zero;
37+
38+
[SerializeField]
39+
protected Vector3 scale = Vector3.one;
40+
41+
[SerializeField]
42+
protected bool setScaleOnAttach = false;
43+
44+
public bool IsAttached { get; private set; }
45+
46+
private Transform elementTransform;
47+
public Transform ElementTransform { get; private set; }
48+
49+
protected MotionControllerInfo controller;
50+
51+
protected virtual void OnAttachToController() { }
52+
protected virtual void OnDetachFromController() { }
53+
54+
protected virtual void OnEnable()
55+
{
56+
SetChildrenActive(false);
57+
58+
// Look if the controller has loaded.
59+
if (MotionControllerVisualizer.Instance.TryGetControllerModel(handedness, out controller))
60+
{
61+
AttachElementToController(controller);
62+
}
63+
64+
MotionControllerVisualizer.Instance.OnControllerModelLoaded += AttachElementToController;
65+
MotionControllerVisualizer.Instance.OnControllerModelUnloaded += DetachElementFromController;
66+
}
67+
68+
protected virtual void OnDisable()
69+
{
70+
if (MotionControllerVisualizer.IsInitialized)
71+
{
72+
MotionControllerVisualizer.Instance.OnControllerModelLoaded -= AttachElementToController;
73+
MotionControllerVisualizer.Instance.OnControllerModelUnloaded -= DetachElementFromController;
74+
}
75+
}
76+
77+
protected virtual void OnDestroy()
78+
{
79+
if (MotionControllerVisualizer.IsInitialized)
80+
{
81+
MotionControllerVisualizer.Instance.OnControllerModelLoaded -= AttachElementToController;
82+
MotionControllerVisualizer.Instance.OnControllerModelUnloaded -= DetachElementFromController;
83+
}
84+
}
85+
86+
private void AttachElementToController(MotionControllerInfo newController)
87+
{
88+
if (!IsAttached && newController.Handedness == handedness)
89+
{
90+
if (!newController.TryGetElement(element, out elementTransform))
91+
{
92+
Debug.LogError("Unable to find element of type " + element + " under controller " + newController.ControllerParent.name + "; not attaching.");
93+
return;
94+
}
95+
96+
controller = newController;
97+
98+
SetChildrenActive(true);
99+
100+
// Parent ourselves under the element and set our offsets
101+
transform.parent = elementTransform;
102+
transform.localPosition = positionOffset;
103+
transform.localEulerAngles = rotationOffset;
104+
if (setScaleOnAttach)
105+
{
106+
transform.localScale = scale;
107+
}
108+
109+
// Announce that we're attached
110+
OnAttachToController();
111+
112+
IsAttached = true;
113+
}
114+
}
115+
116+
private void DetachElementFromController(MotionControllerInfo oldController)
117+
{
118+
if (IsAttached && oldController.Handedness == handedness)
119+
{
120+
OnDetachFromController();
121+
122+
controller = null;
123+
transform.parent = null;
124+
125+
SetChildrenActive(false);
126+
127+
IsAttached = false;
128+
}
129+
}
130+
131+
private void SetChildrenActive(bool isActive)
132+
{
133+
if (SetChildrenInactiveWhenDetached)
134+
{
135+
foreach (Transform child in transform)
136+
{
137+
child.gameObject.SetActive(isActive);
138+
}
139+
}
140+
}
141+
}
142+
}

Assets/HoloToolkit/Input/Scripts/Utilities/AttachToController.cs.meta

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/HoloToolkit/Input/Scripts/Utilities/MotionControllerInfo.cs

Lines changed: 104 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
// Licensed under the MIT License. See LICENSE in the project root for license information.
33

44
using UnityEngine;
5+
#if UNITY_2017_2_OR_NEWER
6+
using UnityEngine.XR.WSA.Input;
7+
#else
8+
using UnityEngine.VR.WSA.Input;
9+
#endif
510

611
namespace HoloToolkit.Unity.InputModule
712
{
@@ -11,7 +16,8 @@ namespace HoloToolkit.Unity.InputModule
1116
/// </summary>
1217
public class MotionControllerInfo
1318
{
14-
public GameObject ControllerParent;
19+
public readonly GameObject ControllerParent;
20+
public readonly InteractionSourceHandedness Handedness;
1521

1622
private GameObject home;
1723
private Transform homePressed;
@@ -44,6 +50,7 @@ public class MotionControllerInfo
4450
private Transform touchpadTouchYMin;
4551
private Transform touchpadTouchYMax;
4652
private GameObject touchpadTouchVisualizer;
53+
private GameObject pointingPose;
4754

4855
// These values are used to determine if a button's state has changed.
4956
private bool wasGrasped;
@@ -56,14 +63,94 @@ public class MotionControllerInfo
5663
private Vector2 lastTouchpadPosition;
5764
private double lastSelectPressedAmount;
5865

66+
public MotionControllerInfo(GameObject controllerParent, InteractionSourceHandedness handedness)
67+
{
68+
ControllerParent = controllerParent;
69+
Handedness = handedness;
70+
}
71+
72+
public enum ControllerElementEnum
73+
{
74+
// Controller button elements
75+
Home,
76+
Menu,
77+
Grasp,
78+
Thumbstick,
79+
Select,
80+
Touchpad,
81+
// Controller body elements & poses
82+
PointingPose
83+
}
84+
85+
public bool TryGetElement(ControllerElementEnum element, out Transform elementTransform)
86+
{
87+
switch (element)
88+
{
89+
// control elements
90+
case ControllerElementEnum.Home:
91+
if (home != null)
92+
{
93+
elementTransform = home.transform;
94+
return true;
95+
}
96+
break;
97+
case ControllerElementEnum.Menu:
98+
if (menu != null)
99+
{
100+
elementTransform = menu.transform;
101+
return true;
102+
}
103+
break;
104+
case ControllerElementEnum.Select:
105+
if (select != null)
106+
{
107+
elementTransform = select.transform;
108+
return true;
109+
}
110+
break;
111+
case ControllerElementEnum.Grasp:
112+
if (grasp != null)
113+
{
114+
elementTransform = grasp.transform;
115+
return true;
116+
}
117+
break;
118+
case ControllerElementEnum.Thumbstick:
119+
if (thumbstickPress != null)
120+
{
121+
elementTransform = thumbstickPress.transform;
122+
return true;
123+
}
124+
break;
125+
case ControllerElementEnum.Touchpad:
126+
if (touchpadPress != null)
127+
{
128+
elementTransform = touchpadPress.transform;
129+
return true;
130+
}
131+
break;
132+
// body elements & poses
133+
case ControllerElementEnum.PointingPose:
134+
if (pointingPose != null)
135+
{
136+
elementTransform = pointingPose.transform;
137+
return true;
138+
}
139+
break;
140+
}
141+
142+
elementTransform = null;
143+
return false;
144+
}
145+
59146
/// <summary>
60147
/// Iterates through the Transform array to find specifically named GameObjects.
61148
/// These GameObjects specify the animation bounds and the GameObject to modify for button,
62149
/// thumbstick, and touchpad animation.
63150
/// </summary>
64151
/// <param name="childTransforms">The transforms of the glTF model.</param>
65152
/// <param name="visualizerScript">The script containing references to any objects to spawn.</param>
66-
public void LoadInfo(Transform[] childTransforms, MotionControllerVisualizer visualizerScript)
153+
public void LoadInfo(Transform[] childTransforms)
67154
{
68155
foreach (Transform child in childTransforms)
69156
{
@@ -75,6 +162,12 @@ public void LoadInfo(Transform[] childTransforms, MotionControllerVisualizer vis
75162
// visualizer.
76163
switch (child.name.ToLower())
77164
{
165+
case "touch":
166+
touchpadTouchVisualizer = MotionControllerVisualizer.Instance.SpawnTouchpadVisualizer(child);
167+
break;
168+
case "pointing_pose":
169+
pointingPose = child.gameObject;
170+
break;
78171
case "pressed":
79172
switch (child.parent.name.ToLower())
80173
{
@@ -190,9 +283,6 @@ public void LoadInfo(Transform[] childTransforms, MotionControllerVisualizer vis
190283
break;
191284
}
192285
break;
193-
case "touch":
194-
touchpadTouchVisualizer = visualizerScript.SpawnTouchpadVisualizer(child);
195-
break;
196286
}
197287
}
198288
}
@@ -289,5 +379,14 @@ private void SetLocalPositionAndRotation(GameObject buttonGameObject, Transform
289379
buttonGameObject.transform.localPosition = newTransform.localPosition;
290380
buttonGameObject.transform.localRotation = newTransform.localRotation;
291381
}
382+
383+
public void SetRenderersVisible(bool visible)
384+
{
385+
MeshRenderer[] renderers = ControllerParent.GetComponentsInChildren<MeshRenderer>();
386+
for (int i = 0; i < renderers.Length; i++)
387+
{
388+
renderers[i].enabled = visible;
389+
}
390+
}
292391
}
293392
}

0 commit comments

Comments
 (0)