11using System.Collections.Generic;
28 public static class LeapRigUpgrader {
32 public enum SceneScanStatus { NotScanned, ContainsOldRigs, NoOldRigsFound }
33 private static SceneScanStatus _currentSceneScanStatus = SceneScanStatus.NotScanned;
34 public static SceneScanStatus currentSceneScanStatus {
36 return _currentSceneScanStatus;
40 [InitializeOnLoadMethod]
41 private static void Init() {
42 EditorSceneManager.sceneOpened -= onSceneOpened;
43 EditorSceneManager.sceneOpened += onSceneOpened;
45 #if UNITY_2018_1_OR_NEWER
46 EditorApplication.hierarchyChanged -= onHierarchyChanged;
47 EditorApplication.hierarchyChanged += onHierarchyChanged;
49 EditorApplication.hierarchyWindowChanged -= onHierarchyChanged;
50 EditorApplication.hierarchyWindowChanged += onHierarchyChanged;
53 _currentSceneScanStatus = SceneScanStatus.NotScanned;
56 private static void onSceneOpened(Scene scene, OpenSceneMode openSceneMode) {
57 _currentSceneScanStatus = SceneScanStatus.NotScanned;
60 private static void onHierarchyChanged() {
61 _currentSceneScanStatus = SceneScanStatus.NotScanned;
69 #region Convenience Properties
71 public static GUIStyle boldLabel {
72 get {
return EditorStyles.boldLabel; }
75 private static GUIStyle _backingWrapLabel;
76 public static GUIStyle wrapLabel {
78 if (_backingWrapLabel ==
null) {
79 _backingWrapLabel =
new GUIStyle(EditorStyles.label);
80 _backingWrapLabel.wordWrap =
true;
82 return _backingWrapLabel;
88 #region Project Check GUI
94 [LeapProjectCheck(
"Core", 0)]
95 private static bool drawRigUpgraderCheckGUI() {
96 EditorGUILayout.LabelField(
"Leap Rig Upgrader", boldLabel);
98 EditorGUILayout.LabelField(
99 "If you have upgraded from Core version 4.3.4 or earlier to Core version 4.4 or "
100 +
"later, you can check the currently-open scene for out-of-date rigs. Instances of "
101 +
"older Leap Rig prefabs can be automatically upgraded to match the updated rig, "
102 +
"which is much simpler.",
105 EditorGUILayout.Space();
107 drawScanCurrentSceneButtonAndStatus();
109 EditorGUILayout.Space();
114 private static void drawScanCurrentSceneButtonAndStatus() {
116 using (
new EditorGUILayout.HorizontalScope()) {
117 if (GUILayout.Button(
new GUIContent(
"Scan Current Scene"),
118 GUILayout.MaxWidth(200f))) {
119 var oldRigsDetected = ScanCurrentSceneForOldLeapRigs();
120 if (oldRigsDetected) {
121 _currentSceneScanStatus = SceneScanStatus.ContainsOldRigs;
122 if (LeapUnityWindow.isWindowOpen) {
123 LeapUnityWindow.ShowTab(1);
127 _currentSceneScanStatus = SceneScanStatus.NoOldRigsFound;
132 switch (_currentSceneScanStatus) {
133 case SceneScanStatus.ContainsOldRigs:
134 scanText =
"Scene contained old Leap rigs as of the last scan.";
136 case SceneScanStatus.NoOldRigsFound:
137 scanText =
"Scene contained no old Leap rigs as of the last scan.";
139 case SceneScanStatus.NotScanned:
141 scanText =
"Scene not yet scanned.";
144 EditorGUILayout.LabelField(scanText);
153 private static Dictionary<OldRigHierarchy, bool> _rigFoldoutStates
154 =
new Dictionary<OldRigHierarchy, bool>();
155 private static OldRigHierarchy.UpgradeOptions _upgradeOptions
156 =
new OldRigHierarchy.UpgradeOptions();
158 public static void DrawUpgraderGUI() {
159 var origIndent = EditorGUI.indentLevel;
160 EditorGUI.indentLevel = 0;
162 using (
new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) {
163 drawRigUpgraderCheckGUI();
166 EditorGUILayout.Space();
167 EditorGUILayout.Space();
169 drawRigScanResultsGUI();
171 var splitterStyle =
new GUIStyle(LeapUnityWindow.windowSkin.box);
172 splitterStyle.fixedHeight = 1f;
173 splitterStyle.stretchWidth =
true;
174 splitterStyle.margin =
new RectOffset(0, 0, 0, 0);
175 GUILayout.Box(
"", splitterStyle);
177 _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition,
178 GUILayout.ExpandWidth(
true));
180 foreach (var oldRig
in _oldRigs) {
181 EditorGUILayout.Space();
182 drawOldRigUpgradeGUI(oldRig);
185 EditorGUILayout.EndScrollView();
187 EditorGUI.indentLevel = origIndent;
190 private static void drawRigScanResultsGUI() {
191 var safetyWarning =
"To be safe, you should make sure you've backed up your scene "
192 +
"before upgrading.";
193 EditorGUILayout.LabelField(safetyWarning, wrapLabel);
195 var singleRig = _oldRigs.Count == 1;
196 EditorGUILayout.LabelField(
197 "Detected " + _oldRigs.Count +
" old rig"
198 + (singleRig ?
"" :
"s") +
". "
202 private static void drawOldRigUpgradeGUI(OldRigHierarchy oldRig) {
203 using (
new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) {
205 var rigDescFoldoutState =
false;
206 if (!_rigFoldoutStates.TryGetValue(oldRig, out rigDescFoldoutState)) {
207 _rigFoldoutStates[oldRig] =
false;
209 string foldoutName = getName(oldRig.rigTransform);
210 if (!rigDescFoldoutState) {
211 foldoutName +=
" (click to expand upgrade details)";
214 foldoutName +=
" (click to hide upgrade details)";
216 using (
new EditorGUILayout.HorizontalScope()) {
217 _rigFoldoutStates[oldRig] = EditorGUILayout.Foldout(_rigFoldoutStates[oldRig],
218 foldoutName, toggleOnLabelClick:
true);
220 EditorGUI.BeginDisabledGroup(
true);
221 EditorGUILayout.ObjectField(oldRig.rigTransform, typeof(Transform),
true,
222 GUILayout.ExpandWidth(
false));
223 EditorGUI.EndDisabledGroup();
226 if (_rigFoldoutStates[oldRig]) {
227 EditorGUILayout.Space();
229 drawOldRigCameraGUI(oldRig);
231 drawOldRigLeapSpaceGUI(oldRig);
233 drawOldRigLHCGUI(oldRig);
236 if (GUILayout.Button(
"Update Rig")) {
237 oldRig.Upgrade(_upgradeOptions);
239 EditorApplication.delayCall += () => {
240 ScanCurrentSceneForOldLeapRigs();
246 #region Old Rig Component Drawing
248 private static void drawOldRigCameraGUI(OldRigHierarchy oldRig) {
249 EditorGUI.indentLevel = 1;
250 drawRigItem(
"Rig Camera", oldRig.cameraData.cameraComponent,
252 EditorGUI.indentLevel = 2;
254 var camera_enableDepthBuffer = oldRig.cameraData.enableDepthBuffer;
255 if (camera_enableDepthBuffer !=
null) {
256 EditorGUILayout.Space();
257 drawRigItem(
"Remove Enable Depth Buffer", camera_enableDepthBuffer,
258 typeof(EnableDepthBuffer));
259 EditorGUILayout.LabelField(
260 "The EnableDepthBuffer script used to be a part of Leap camera rigs by "
261 +
"default but can cause shader issues in certain situations. If you're "
262 +
"not sure you need this component, you should remove it.",
265 yesOption:
"Remove the EnableDepthBuffer script from the camera.",
266 noOption:
"Don't remove the EnableDepthBuffer script, I'm using it for "
268 yesOptionFlag: ref _upgradeOptions.camera_removeEnableDepthBufferScript
273 if (oldRig.isImageRig) {
274 EditorGUILayout.Space();
275 var rightEyeCamera = oldRig.imageRigData.rightEyeCamData.cameraComponent;
276 if (rightEyeCamera !=
null) {
277 drawRigItem(
"Remove Right Eye Camera", rightEyeCamera, typeof(Camera));
278 EditorGUILayout.LabelField(
279 "Separate cameras for the left and right eyes are no longer necessary "
280 +
"for IR viewer rigs.",
284 yesOption:
"Remove this camera object.",
285 noOption:
"Don't remove this camera, I'm using it for something else.",
286 yesOptionFlag: ref _upgradeOptions.camera_removeRightEyeCamera
291 EditorGUILayout.Space();
292 var primaryLeapEyeDislocator = oldRig.cameraData.leapEyeDislocator;
293 if (primaryLeapEyeDislocator !=
null) {
294 drawRigItem(
"Remove Leap Eye Dislocator", primaryLeapEyeDislocator,
295 typeof(LeapEyeDislocator));
296 EditorGUILayout.LabelField(
297 "LeapEyeDislocator was found on this object, but it was not detected "
298 +
"to be an IR viewer rig. LeapEyeDislocator is not necessary "
299 +
"on non-IR viewer rigs.",
303 yesOption:
"Remove the LeapEyeDislocator script from the camera.",
304 noOption:
"Don't remove LeapEyeDislocator.",
305 yesOptionFlag: ref _upgradeOptions.camera_removeLeapEyeDislocator
310 EditorGUILayout.Space();
313 private static void drawOldRigLeapSpaceGUI(OldRigHierarchy oldRig) {
314 EditorGUILayout.Space();
315 EditorGUI.indentLevel = 1;
316 drawRigItem(
"LeapSpace Transform (to be deleted.)",
317 oldRig.leapSpaceData.leapSpaceTransform, typeof(Transform));
318 EditorGUI.indentLevel = 2;
319 EditorGUILayout.LabelField(
320 "The LeapSpace transform and its temporal warping functionality have been "
321 +
"migrated into the LeapXRServiceProvider for XR rigs. As a part of this upgrade, "
322 +
"this transform (including any components on it) will be deleted.",
325 var leapSpace_nonLHCChildren
326 = oldRig.leapSpaceData.nonLHCChildTransforms;
327 if (leapSpace_nonLHCChildren.Count > 0) {
328 EditorGUILayout.Space();
329 drawMergeUpwardsSetting(
330 originalTransformName:
"LeapSpace",
331 numExtraChildren: leapSpace_nonLHCChildren.Count,
332 mergeExtraChildrenUpwardFlag:
333 ref _upgradeOptions.leapSpace_mergeExtraChildrenUpward
337 EditorGUILayout.Space();
340 private static void drawOldRigLHCGUI(OldRigHierarchy oldRig) {
341 EditorGUILayout.Space();
342 EditorGUI.indentLevel = 1;
343 drawRigItem(
"LeapHandController Transform (to be deleted.)",
344 oldRig.lhcData.leapServiceProvider, typeof(Transform));
345 EditorGUI.indentLevel = 2;
346 EditorGUILayout.LabelField(
347 "The LeapHandController transform and its LeapHandController, "
348 +
"LeapServiceProvider, and HandPool components have been simplified.",
351 EditorGUILayout.LabelField(
352 "The LeapServiceProvider will be removed. In its place, a "
353 +
"LeapXRServiceProvider will be added directly to the Camera. The "
354 +
"LeapXRServiceProvider handles temporal warping (latency correction) "
355 +
"automatically for XR rigs. Applicable settings will be transferred to "
356 +
"the LeapXRServiceProvider.", wrapLabel);
358 EditorGUILayout.LabelField(
359 "The HandPool and HandController objects have been combined into a single "
360 +
"HandModelManager script, which should be moved to the parent transform of the "
361 +
"hand models. This clarifies its separation from the hand data pipeline "
362 +
"as one of (potentially many) consumers of hand data from a device.",
365 var handModelParent = oldRig.handModelParentTransform;
366 var handModelManager = oldRig.lhcData.handModelManager;
367 if (handModelParent !=
null && handModelManager !=
null) {
368 EditorGUILayout.Space();
369 drawRigItem(
"Move the HandModelManager...", handModelManager, typeof(HandModelManager));
370 drawRigItem(
"...to the hand model parent transform", handModelParent, typeof(Transform));
371 EditorGUILayout.LabelField(
372 "The HandModelManager will be moved to the " + handModelParent.name
373 +
" transform because it is the parent transform of the hand models.",
380 var lhc_extraComponents = oldRig.lhcData.extraComponents;
381 if (lhc_extraComponents !=
null && lhc_extraComponents.Count > 0) {
382 EditorGUILayout.Space();
383 drawRigItem(
"Extra Components Detected",
null,
null);
385 var sb =
new StringBuilder();
387 for (
int i = 0; i < lhc_extraComponents.Count; i++) {
388 var component = lhc_extraComponents[i];
389 sb.Append(component.GetType().Name);
390 if (i != lhc_extraComponents.Count - 1) sb.Append(
", ");
391 if (i == lhc_extraComponents.Count - 2) sb.Append(
"and ");
393 var isPlural = lhc_extraComponents.Count != 1;
395 sb.Append(
" components (and references to them) will be migrated to the camera "
399 sb.Append(
" component (and references to it) will be migrated to the camera "
403 EditorGUILayout.LabelField(
408 var lhc_extraChildren = oldRig.lhcData.extraChildTransforms;
409 if (lhc_extraChildren.Count > 0) {
410 EditorGUILayout.Space();
411 drawMergeUpwardsSetting(
412 originalTransformName:
"LeapHandController",
413 numExtraChildren: lhc_extraChildren.Count,
414 mergeExtraChildrenUpwardFlag: ref _upgradeOptions.lhc_mergeExtraChildrenUpward
421 #region Drawing Helper Methods
423 private static void drawRigItem(
string label,
UnityObject obj, Type objType) {
424 using (
new EditorGUILayout.HorizontalScope()) {
425 EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(
true));
427 EditorGUI.BeginDisabledGroup(
true);
428 EditorGUILayout.ObjectField(obj, objType,
true, GUILayout.ExpandWidth(
false));
429 EditorGUI.EndDisabledGroup();
434 private static void drawMergeUpwardsSetting(
string originalTransformName,
435 int numExtraChildren,
436 ref
bool mergeExtraChildrenUpwardFlag) {
437 var isPlural = numExtraChildren == 1;
438 EditorGUILayout.LabelField(
440 + (isPlural ?
" transforms are attached as children "
441 :
" transform is attached as a child")
442 +
" to the " + originalTransformName +
" transform, which is deprecated and will be "
446 yesOption:
"Move these objects to be children of the camera.",
447 noOption:
"Remove these objects.",
448 yesOptionFlag: ref mergeExtraChildrenUpwardFlag
452 private static void drawYesNoToggle(
string yesOption,
string noOption,
453 ref
bool yesOptionFlag) {
454 yesOptionFlag = EditorGUILayout.ToggleLeft(yesOption, yesOptionFlag);
456 bool temp = EditorGUILayout.ToggleLeft(noOption, !yesOptionFlag);
457 yesOptionFlag = !temp;
460 private static void drawObjField(
UnityObject obj, Type objType) {
461 EditorGUI.BeginDisabledGroup(
true);
462 EditorGUILayout.ObjectField(obj, objType,
true);
463 EditorGUI.EndDisabledGroup();
466 private static string getName(Transform t) {
467 if (t ==
null)
return "";
477 #region Upgrader Memory
479 private static List<Transform> _backingTransformsBuffer =
null;
480 private static List<Transform> _transformsBuffer {
482 if (_backingTransformsBuffer ==
null)
483 _backingTransformsBuffer =
new List<Transform>();
484 return _backingTransformsBuffer;
488 private static List<OldRigHierarchy> _backingOldRigs =
null;
489 private static List<OldRigHierarchy> _oldRigs {
491 if (_backingOldRigs ==
null) {
492 _backingOldRigs =
new List<OldRigHierarchy>();
494 return _backingOldRigs;
505 public static void ClearScanData() {
514 public static bool ScanCurrentSceneForOldLeapRigs() {
517 var currentScene = SceneManager.GetActiveScene();
518 var rootObjs = currentScene.GetRootGameObjects();
519 foreach (var rootObj
in rootObjs) {
520 rootObj.transform.GetComponentsInChildren(_transformsBuffer);
521 foreach (var transform
in _transformsBuffer) {
522 var oldRig = OldRigHierarchy.DetectFor(transform);
523 if (oldRig !=
null) {
524 _oldRigs.Add(oldRig);
527 _transformsBuffer.Clear();
530 return _oldRigs.Count > 0;
612 =
"Rig data has not been collected. Call OldRigHierarchy.DetectFor(transform) to "
617 #region Scanned Rig Data
627 #region Rig Camera Data
650 #region Other Rig Data
691 if (transform ==
null)
return false;
693 var didDetectOldRig =
false;
694 var scannedRig = toFill;
698 var camDataBuffer =
new List<OldCameraData>();
699 camDataBuffer.Clear();
700 detectPotentialOldRigCameras(transform, camDataBuffer);
702 if (camDataBuffer.Count == 0) {
762 var secondaryCamDatas =
new List<OldCameraData>();
764 for (
int i = 0; i < camDataBuffer.Count; i++) {
765 var camData = camDataBuffer[i];
766 var expectingFirstLeapSpaceData = firstLeapSpaceData ==
null;
768 var camTransform = camData.cameraTransform;
769 foreach (var child
in camTransform.GetChildren()) {
770 var expectingFirstLHCData = firstLHCData ==
null;
774 foreach (var grandchild
in child.GetChildren()) {
780 if (leapServiceProvider !=
null) {
782 firstLHCData.lhcTransform = grandchild;
783 firstLHCData.leapServiceProvider = leapServiceProvider;
785 firstLHCData.extraChildTransforms =
new List<Transform>();
786 foreach (var greatGrandchild
in grandchild.GetChildren()) {
787 firstLHCData.extraChildTransforms.Add(greatGrandchild);
790 firstLHCData.handModelManager
793 var components = grandchild.GetComponents<
Component>();
794 foreach (var component
in components) {
795 if (component ==
null)
continue;
796 if (component == firstLHCData.lhcTransform)
continue;
797 if (component == firstLHCData.leapServiceProvider)
continue;
798 if (component == firstLHCData.handModelManager)
continue;
800 if (firstLHCData.extraComponents ==
null) {
801 firstLHCData.extraComponents =
new List<Component>();
803 firstLHCData.extraComponents.Add(component);
810 if (firstLHCData !=
null && expectingFirstLHCData) {
812 firstLeapSpaceData.leapSpaceTransform = child;
813 firstLeapSpaceData.nonLHCChildTransforms =
new List<Transform>();
814 foreach (var leapSpaceChild
in child.GetChildren()) {
815 if (leapSpaceChild == firstLHCData.lhcTransform)
continue;
816 firstLeapSpaceData.nonLHCChildTransforms.Add(leapSpaceChild);
822 if (firstLeapSpaceData !=
null && expectingFirstLeapSpaceData) {
824 primaryCamData = camData;
829 secondaryCamDatas.Add(camData);
842 if (primaryCamData ==
null) {
843 scannedRig.isUpgradeableOldRig =
false;
844 scannedRig.cameraData =
null;
845 scannedRig.detectedAsPotentialRig =
false;
846 scannedRig.leapSpaceData =
null;
847 scannedRig.lhcData =
null;
848 scannedRig.handModelParentTransform =
null;
849 scannedRig.reasonRigCannotBeUpgraded =
"Scanned transform does not look like "
850 +
"an old Leap rig.";
855 didDetectOldRig =
true;
857 scannedRig.cameraData = primaryCamData;
858 scannedRig.detectedAsPotentialRig =
true;
859 scannedRig.leapSpaceData = firstLeapSpaceData;
860 scannedRig.lhcData = firstLHCData;
861 scannedRig.isUpgradeableOldRig =
true;
862 scannedRig.reasonRigCannotBeUpgraded =
"";
869 var firstReasonableHandModelTransform = scannedRig.rigTransform.GetChildren()
870 .Query().Where(child =>
871 child.GetChildren().Query()
872 .Where(gc => gc.GetComponent<
HandModelBase>() !=
null).Count() > 0)
874 scannedRig.handModelParentTransform = firstReasonableHandModelTransform;
878 var leapImageRetriever = primaryCamData.cameraTransform
881 if (leapImageRetriever !=
null) {
884 rightEyeCamData = secondaryCamDatas.Query()
888 if (rightEyeCamData !=
null) {
890 scannedRig.imageRigData.rightEyeCamData = rightEyeCamData;
896 return didDetectOldRig;
903 private static void detectPotentialOldRigCameras(Transform
rigTransform,
904 List<OldCameraData> detectedCameras) {
907 var camera = child.GetComponent<Camera>();
911 if (camera ==
null) {
915 else if (leapXRProvider !=
null) {
922 var oldCamData =
new OldCameraData();
923 oldCamData.cameraTransform = child;
924 oldCamData.cameraComponent = camera;
925 oldCamData.leapEyeDislocator = eyeDislocator;
926 oldCamData.enableDepthBuffer = enableDepthBuffer;
929 detectedCameras.Add(oldCamData);
941 var didDetectOldRig =
DetectFor(transform, scannedRig);
942 if (!didDetectOldRig)
return null;
946 private static void fillMissingComponentIndices(Transform transform, List<int> toFill) {
948 var tempList =
new List<Component>();
949 transform.GetComponents(tempList);
950 for (
int i = 0; i < tempList.Count; i++) {
951 var component = tempList[i];
952 if (component ==
null) {
975 if (!this.isUpgradeableOldRig) {
976 throw new InvalidOperationException(
977 "Aborting upgrade attempt: This rig is not upgradeable.");
984 Debug.LogError(
"No camera data available for this rig during upgrade attempt.");
989 && enableDepthBufferScript !=
null) {
990 Undo.DestroyObjectImmediate(enableDepthBufferScript);
995 && eyeDislocator !=
null) {
996 Undo.DestroyObjectImmediate(eyeDislocator);
1001 if (rightEyeCamData !=
null) {
1004 && rightEyeTransform !=
null) {
1005 Undo.DestroyObjectImmediate(rightEyeTransform.gameObject);
1017 Debug.LogError(
"No LeapSpace data available for this rig during upgrade "
1023 && leapSpaceExtraChildren !=
null) {
1024 foreach (var extraChild
in leapSpaceExtraChildren.Query().Where(t => t !=
null)) {
1025 Undo.SetTransformParent(extraChild, cameraTransform,
1026 "Move LeapSpace child to Camera");
1033 Debug.LogError(
"No LeapHandController data available for this rig during "
1034 +
"upgrade attempt.");
1039 && lhcExtraChildren !=
null) {
1040 foreach (var extraChild
in lhcExtraChildren.Query().Where(t => t !=
null)) {
1041 Undo.SetTransformParent(extraChild, cameraTransform,
1042 "Move LHC child to Camera");
1050 if (handModelManager !=
null && this.handModelParentTransform !=
null) {
1053 EditorUtility.CopySerialized(handModelManager, newHandModelManager);
1055 EditorUtils.ReplaceSceneReferences(handModelManager, newHandModelManager);
1062 if (leapServiceProvider !=
null) {
1069 EditorUtils.ReplaceSceneReferences(leapServiceProvider,
1070 leapXRServiceProvider);
1073 if (newHandModelManager !=
null && leapXRServiceProvider !=
null) {
1074 newHandModelManager.leapProvider = leapXRServiceProvider;
1079 if (extraComponents !=
null && extraComponents.Count > 0) {
1080 foreach (var component
in extraComponents.Query().Where(c => c !=
null)) {
1082 = cameraTransform.gameObject.AddComponent(component.GetType());
1084 EditorUtility.CopySerialized(component, newComponent);
1086 EditorUtils.ReplaceSceneReferences(component, newComponent);
1093 if (leapSpaceTransform !=
null) {
1094 Undo.DestroyObjectImmediate(leapSpaceTransform.gameObject);
UnityEngine.Object UnityObject
UnityEngine.Component Component
The HandModelManager manages a pool of HandModelBases and makes HandRepresentations when a it detects...
Moves the camera to each eye position on pre-render. Only necessary for image pass-through (IR viewer...
Acquires images from a LeapServiceProvider and uploads image data as shader global data for use by an...
The LeapServiceProvider provides tracked Leap Hand data and images from the device via the Leap servi...
void CopySettingsToLeapXRServiceProvider(LeapXRServiceProvider leapXRServiceProvider)
Copies property settings from this LeapServiceProvider to the target LeapXRServiceProvider where appl...
The LeapXRServiceProvider expands on the standard LeapServiceProvider to account for the offset of th...
OldCameraData rightEyeCamData
Old camera objects that weren't modified at all would have had a LeapEyeDislocator (formerly LeapVRCa...
EnableDepthBuffer enableDepthBuffer
bool containsCameraComponent
Transform cameraTransform
LeapEyeDislocator leapEyeDislocator
LeapServiceProvider leapServiceProvider
List< Transform > extraChildTransforms
List< Component > extraComponents
HandModelManager handModelManager
Transform leapSpaceTransform
List< Transform > nonLHCChildTransforms
Some rigs, like the old image rig or modifications to the old standard rig, may have non-LeapHandCont...
bool camera_removeEnableDepthBufferScript
bool camera_removeLeapEyeDislocator
bool camera_removeRightEyeCamera
bool lhc_mergeExtraChildrenUpward
bool leapSpace_removeMissingScripts
bool lhc_removeMissingScripts
bool leapSpace_mergeExtraChildrenUpward
Description of an old Leap VR rig from before Core version 4.4.
static OldRigHierarchy DetectFor(Transform transform)
Detects if the argument Transform is the rig root of an old Leap rig, in which case an OldRigHierarch...
OldCameraData cameraData
The driven camera transform and component info of the rig hierarchy, or that of the LEFT eye if this ...
Transform handModelParentTransform
The parent of hand models in this rig that will receive the HandModelManager.
void Upgrade(UpgradeOptions options)
static bool DetectFor(Transform transform, OldRigHierarchy toFill)
Detects if the argument Transform is the rig root of an old Leap rig, modifying the passed-in old rig...
OldLeapHandControllerData lhcData
bool isUpgradeableOldRig
Whether this rig can be upgraded. Set after a DetectFor(transform) call.
ImageRigData imageRigData
string reasonRigCannotBeUpgraded
If the rig was detected as a potential rig but not upgradeable, this is the reason the rig cannot be ...
OldLeapSpaceData leapSpaceData
Transform rigTransform
The root transform of the old rig hierarchy.
bool detectedAsPotentialRig
Whether the scan data indicates the scanned transform is potentially an old Leap rig....