Skip to content

Commit e9540bb

Browse files
committed
Add ControllerFinder
1 parent c1df30f commit e9540bb

File tree

3 files changed

+214
-6
lines changed

3 files changed

+214
-6
lines changed
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
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 Microsoft.MixedReality.Toolkit.Core.Definitions.Utilities;
5+
using Microsoft.MixedReality.Toolkit.Core.EventDatum.Input;
6+
using Microsoft.MixedReality.Toolkit.Core.Interfaces.Devices;
7+
using Microsoft.MixedReality.Toolkit.Core.Interfaces.InputSystem.Handlers;
8+
using Microsoft.MixedReality.Toolkit.Core.Managers;
9+
using UnityEngine;
10+
11+
namespace Microsoft.MixedReality.Toolkit.SDK.Utilities.Solvers
12+
{
13+
/// <summary>
14+
/// ControllerFinder is a base class providing simple event handling for getting/releasing MotionController Transforms.
15+
/// </summary>
16+
public abstract class ControllerFinder : MonoBehaviour, IMixedRealitySourceStateHandler
17+
{
18+
//[SerializeField]
19+
//private ControllerElement trackedControllerElement = ControllerElement.PointingPose;
20+
21+
//public ControllerElement TrackedControllerElement
22+
//{
23+
// get { return trackedControllerElement; }
24+
// set { trackedControllerElement = value; }
25+
//}
26+
27+
[SerializeField]
28+
private Handedness handedness = Handedness.None;
29+
30+
public Handedness Handedness
31+
{
32+
get { return handedness; }
33+
set
34+
{
35+
// We need to refresh which controller we're attached to if we switch handedness.
36+
if (handedness != value)
37+
{
38+
handedness = value;
39+
RefreshControllerTransform();
40+
}
41+
}
42+
}
43+
44+
//public Transform ElementTransform { get; private set; }
45+
46+
protected Transform ControllerTransform;
47+
48+
private IMixedRealityDeviceManager BaseDeviceManager => baseDeviceManager ?? (baseDeviceManager = MixedRealityManager.Instance.GetManager<IMixedRealityDeviceManager>());
49+
private IMixedRealityDeviceManager baseDeviceManager = null;
50+
51+
#region MonoBehaviour Implementation
52+
53+
protected virtual void OnEnable()
54+
{
55+
if (BaseDeviceManager == null)
56+
{
57+
// The base device manager has not been set up yet.
58+
return;
59+
}
60+
61+
// Look if the controller has loaded.
62+
RefreshControllerTransform();
63+
}
64+
65+
#endregion MonoBehaviour Implementation
66+
67+
#region IMixedRealitySourceStateHandler Implementation
68+
69+
public void OnSourceDetected(SourceStateEventData eventData)
70+
{
71+
if (eventData.Controller.ControllerHandedness == handedness)
72+
{
73+
AddControllerTransform(eventData.Controller);
74+
}
75+
}
76+
77+
public void OnSourceLost(SourceStateEventData eventData)
78+
{
79+
if (eventData.Controller.ControllerHandedness == handedness)
80+
{
81+
RemoveControllerTransform();
82+
}
83+
}
84+
85+
#endregion IMixedRealitySourceStateHandler Implementation
86+
87+
/// <summary>
88+
/// Looks to see if the controller model already exists and registers it if so.
89+
/// </summary>
90+
protected virtual void TryAndAddControllerTransform()
91+
{
92+
// Look if the controller was already loaded. This could happen if the
93+
// GameObject was instantiated at runtime and the model loaded event has already fired.
94+
if (BaseDeviceManager == null)
95+
{
96+
// The BaseDeviceManager could not be found.
97+
return;
98+
}
99+
100+
IMixedRealityController[] controllers = BaseDeviceManager.GetActiveControllers();
101+
102+
for (int i = 0; i < controllers.Length; i++)
103+
{
104+
if (controllers[i].ControllerHandedness == handedness)
105+
{
106+
AddControllerTransform(controllers[i]);
107+
return;
108+
}
109+
}
110+
}
111+
112+
protected virtual void AddControllerTransform(IMixedRealityController newController)
113+
{
114+
if (newController.ControllerHandedness == handedness && !newController.Transform.Equals(ControllerTransform))
115+
{
116+
//Transform elementTransform;
117+
//if (!newController.TryGetElement(trackedControllerElement, out elementTransform))
118+
//{
119+
// Debug.LogError("Unable to find element of type " + trackedControllerElement + " under controller " + newController.ControllerParent.name + "; not attaching.");
120+
// return;
121+
//}
122+
123+
ControllerTransform = newController.Transform;
124+
125+
//// Update ElementTransform for consumption
126+
//ElementTransform = elementTransform;
127+
128+
OnControllerFound();
129+
}
130+
}
131+
132+
protected virtual void RemoveControllerTransform()
133+
{
134+
OnControllerLost();
135+
136+
ControllerTransform = null;
137+
//ElementTransform = null;
138+
}
139+
140+
protected virtual void RefreshControllerTransform()
141+
{
142+
if (ControllerTransform != null)
143+
{
144+
RemoveControllerTransform();
145+
}
146+
147+
TryAndAddControllerTransform();
148+
}
149+
150+
/// <summary>
151+
/// Override this method to act when the correct controller is actually found.
152+
/// This provides similar functionality to overriding AddControllerTransform,
153+
/// without the overhead of needing to check that handedness matches.
154+
/// </summary>
155+
protected virtual void OnControllerFound() { }
156+
157+
/// <summary>
158+
/// Override this method to act when the correct controller is actually lost.
159+
/// This provides similar functionality to overriding AddControllerTransform,
160+
/// without the overhead of needing to check that handedness matches.
161+
/// </summary>
162+
protected virtual void OnControllerLost() { }
163+
}
164+
}

Assets/MixedRealityToolkit-SDK/Features/Utilities/Solvers/ControllerFinder.cs.meta

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

Assets/MixedRealityToolkit-SDK/Features/Utilities/Solvers/SolverHandler.cs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Microsoft.MixedReality.Toolkit.SDK.Utilities.Solvers
1111
/// <summary>
1212
/// This class handles the solver components that are attached to this <see cref="GameObject"/>
1313
/// </summary>
14-
public class SolverHandler : MonoBehaviour
14+
public class SolverHandler : ControllerFinder
1515
{
1616
[SerializeField]
1717
[Tooltip("Tracked object to calculate position and orientation from. If you want to manually override and use a scene object, use the TransformTarget field.")]
@@ -46,7 +46,7 @@ public Vector3 AdditionalOffset
4646
set
4747
{
4848
additionalOffset = value;
49-
TransformTarget = MakeOffsetTransform(TransformTarget);
49+
transformTarget = MakeOffsetTransform(transformTarget);
5050
}
5151
}
5252

@@ -63,7 +63,7 @@ public Vector3 AdditionalRotation
6363
set
6464
{
6565
additionalRotation = value;
66-
TransformTarget = MakeOffsetTransform(TransformTarget);
66+
transformTarget = MakeOffsetTransform(transformTarget);
6767
}
6868
}
6969

@@ -136,7 +136,7 @@ private void Awake()
136136
solvers.AddRange(GetComponents<Solver>());
137137

138138
// TransformTarget overrides TrackedObjectToReference
139-
if (!TransformTarget)
139+
if (!transformTarget)
140140
{
141141
AttachToNewTrackedObject();
142142
}
@@ -174,12 +174,38 @@ protected void OnDestroy()
174174

175175
#endregion MonoBehaviour Implementation
176176

177+
protected override void OnControllerFound()
178+
{
179+
if (!transformTarget)
180+
{
181+
TrackTransform(ControllerTransform);
182+
}
183+
}
184+
185+
protected override void OnControllerLost()
186+
{
187+
transformTarget = null;
188+
189+
if (transformWithOffset != null)
190+
{
191+
Destroy(transformWithOffset);
192+
transformWithOffset = null;
193+
}
194+
}
195+
177196
/// <summary>
178197
/// Clears the transform target and attaches to the current <see cref="TrackedObjectToReference"/>.
179198
/// </summary>
180199
public void RefreshTrackedObject()
181200
{
182201
transformTarget = null;
202+
203+
if (transformWithOffset != null)
204+
{
205+
Destroy(transformWithOffset);
206+
transformWithOffset = null;
207+
}
208+
183209
AttachToNewTrackedObject();
184210
}
185211

@@ -188,15 +214,22 @@ protected virtual void AttachToNewTrackedObject()
188214
switch (TrackedObjectToReference)
189215
{
190216
case TrackedObjectType.Head:
217+
// No need to search for a controller if we've already attached to the head.
218+
Handedness = Handedness.None;
191219
TrackTransform(CameraCache.Main.transform);
192220
break;
193-
// Other cases will come online as ControllerFinder is ported appropriately.
221+
case TrackedObjectType.MotionControllerLeft:
222+
Handedness = Handedness.Left;
223+
break;
224+
case TrackedObjectType.MotionControllerRight:
225+
Handedness = Handedness.Right;
226+
break;
194227
}
195228
}
196229

197230
private void TrackTransform(Transform newTrackedTransform)
198231
{
199-
TransformTarget = RequiresOffset ? MakeOffsetTransform(newTrackedTransform) : newTrackedTransform;
232+
transformTarget = RequiresOffset ? MakeOffsetTransform(newTrackedTransform) : newTrackedTransform;
200233
}
201234

202235
private Transform MakeOffsetTransform(Transform parentTransform)

0 commit comments

Comments
 (0)