From b0c1b7db305c4293575c7c57d4173d0c165ba77c Mon Sep 17 00:00:00 2001 From: RogPodge Date: Mon, 23 May 2022 11:20:45 -0700 Subject: [PATCH 1/4] reworked the handtracking profile to distinguish between rigged and system mesh visualizations --- .../Devices/MixedRealityHandTrackingProfile.cs | 18 ++++++++++++++++++ ...MixedRealityHandTrackingProfileInspector.cs | 9 ++++++--- .../Core/Providers/Hands/BaseHandVisualizer.cs | 13 +++++++++---- .../RiggedHandVisualizer.cs | 11 ++++++++--- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/Assets/MRTK/Core/Definitions/Devices/MixedRealityHandTrackingProfile.cs b/Assets/MRTK/Core/Definitions/Devices/MixedRealityHandTrackingProfile.cs index ee75bf743fa..1a4122f044a 100644 --- a/Assets/MRTK/Core/Definitions/Devices/MixedRealityHandTrackingProfile.cs +++ b/Assets/MRTK/Core/Definitions/Devices/MixedRealityHandTrackingProfile.cs @@ -37,6 +37,24 @@ public class MixedRealityHandTrackingProfile : BaseMixedRealityProfile /// public GameObject FingerTipPrefab => fingertipPrefab; + [SerializeField] + [Tooltip("The hand mesh material to use for system generated hand meshes")] + private Material systemHandMeshMaterial; + + /// + /// The hand mesh material to use for system generated hand meshes + /// + public Material SystemHandMeshMaterial => systemHandMeshMaterial; + + [SerializeField] + [Tooltip("The hand mesh material to use for rigged hand meshes")] + private Material riggedHandMeshMaterial; + + /// + /// The hand mesh material to use for rigged hand meshes + /// + public Material RiggedHandMeshMaterial => riggedHandMeshMaterial; + [SerializeField] [Tooltip("If this is not null and hand system supports hand meshes, use this mesh to render hand mesh.")] private GameObject handMeshPrefab = null; diff --git a/Assets/MRTK/Core/Inspectors/Profiles/MixedRealityHandTrackingProfileInspector.cs b/Assets/MRTK/Core/Inspectors/Profiles/MixedRealityHandTrackingProfileInspector.cs index 9d6a28c657b..6e2ebf65183 100644 --- a/Assets/MRTK/Core/Inspectors/Profiles/MixedRealityHandTrackingProfileInspector.cs +++ b/Assets/MRTK/Core/Inspectors/Profiles/MixedRealityHandTrackingProfileInspector.cs @@ -13,7 +13,8 @@ public class MixedRealityHandTrackingProfileInspector : BaseMixedRealityToolkitC private SerializedProperty jointPrefab; private SerializedProperty palmPrefab; private SerializedProperty fingertipPrefab; - private SerializedProperty handMeshPrefab; + private SerializedProperty systemHandMeshMaterial; + private SerializedProperty riggedHandMeshMaterial; private SerializedProperty handMeshVisualizationModes; private SerializedProperty handJointVisualizationModes; @@ -27,7 +28,8 @@ protected override void OnEnable() jointPrefab = serializedObject.FindProperty("jointPrefab"); fingertipPrefab = serializedObject.FindProperty("fingertipPrefab"); palmPrefab = serializedObject.FindProperty("palmPrefab"); - handMeshPrefab = serializedObject.FindProperty("handMeshPrefab"); + systemHandMeshMaterial = serializedObject.FindProperty("systemHandMeshMaterial"); + riggedHandMeshMaterial = serializedObject.FindProperty("riggedHandMeshMaterial"); handMeshVisualizationModes = serializedObject.FindProperty("handMeshVisualizationModes"); handJointVisualizationModes = serializedObject.FindProperty("handJointVisualizationModes"); } @@ -47,7 +49,8 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(jointPrefab); EditorGUILayout.PropertyField(palmPrefab); EditorGUILayout.PropertyField(fingertipPrefab); - EditorGUILayout.PropertyField(handMeshPrefab); + EditorGUILayout.PropertyField(systemHandMeshMaterial); + EditorGUILayout.PropertyField(riggedHandMeshMaterial); EditorGUILayout.LabelField("Visualization settings", EditorStyles.boldLabel); EditorGUILayout.PropertyField(handMeshVisualizationModes); diff --git a/Assets/MRTK/Core/Providers/Hands/BaseHandVisualizer.cs b/Assets/MRTK/Core/Providers/Hands/BaseHandVisualizer.cs index 1278e3d7274..c4938adfdc8 100644 --- a/Assets/MRTK/Core/Providers/Hands/BaseHandVisualizer.cs +++ b/Assets/MRTK/Core/Providers/Hands/BaseHandVisualizer.cs @@ -192,12 +192,16 @@ public virtual void OnHandMeshUpdated(InputEventData eventData) bool newMesh = handMeshFilter == null; + IMixedRealityInputSystem inputSystem = CoreServices.InputSystem; + MixedRealityHandTrackingProfile handTrackingProfile = inputSystem?.InputSystemProfile != null ? inputSystem.InputSystemProfile.HandTrackingProfile : null; if (newMesh && - CoreServices.InputSystem?.InputSystemProfile != null && - CoreServices.InputSystem.InputSystemProfile.HandTrackingProfile != null && - CoreServices.InputSystem.InputSystemProfile.HandTrackingProfile.HandMeshPrefab != null) + handTrackingProfile != null && + handTrackingProfile.SystemHandMeshMaterial != null) { - handMeshFilter = Instantiate(CoreServices.InputSystem.InputSystemProfile.HandTrackingProfile.HandMeshPrefab).GetComponent(); + // Create the hand mesh in the scene and assign the proper material to it + handMeshFilter = new GameObject("System Hand Mesh").EnsureComponent(); + handMeshFilter.EnsureComponent().material = CoreServices.InputSystem.InputSystemProfile.HandTrackingProfile.SystemHandMeshMaterial; + lastHandMeshVerticesCount = handMeshFilter.mesh.vertices.Length; } @@ -236,6 +240,7 @@ public virtual void OnHandMeshUpdated(InputEventData eventData) } handMeshFilter.transform.SetPositionAndRotation(eventData.InputData.position, eventData.InputData.rotation); + handMeshFilter.transform.parent = transform; } } } diff --git a/Assets/MRTK/SDK/Features/UX/Scripts/RiggedHandVisualizer/RiggedHandVisualizer.cs b/Assets/MRTK/SDK/Features/UX/Scripts/RiggedHandVisualizer/RiggedHandVisualizer.cs index 951ed2a359f..9fe86de83e1 100644 --- a/Assets/MRTK/SDK/Features/UX/Scripts/RiggedHandVisualizer/RiggedHandVisualizer.cs +++ b/Assets/MRTK/SDK/Features/UX/Scripts/RiggedHandVisualizer/RiggedHandVisualizer.cs @@ -101,13 +101,15 @@ public class RiggedHandVisualizer : BaseHandVisualizer /// public SkinnedMeshRenderer HandRenderer => handRenderer; - [SerializeField] - [Tooltip("Hand material to use for hand tracking hand mesh.")] + /// + /// Caching the hand material from CoreServices.InputSystem.InputSystemProfile.HandTrackingProfile.RiggedHandMeshMaterial + /// private Material handMaterial = null; /// /// Hand material to use for hand tracking hand mesh. /// + [Obsolete("Use the CoreServices.InputSystem.InputSystemProfile.HandTrackingProfile.RiggedHandMeshMaterial instead")] public Material HandMaterial => handMaterial; /// @@ -265,7 +267,10 @@ protected override void Start() } // Give the hand mesh its own material to avoid modifying both hand materials when making property changes - var handMaterialInstance = new Material(handMaterial); + MixedRealityHandTrackingProfile handTrackingProfile = CoreServices.InputSystem?.InputSystemProfile.HandTrackingProfile; + + handMaterial = handTrackingProfile.RiggedHandMeshMaterial; + Material handMaterialInstance = new Material(handMaterial); handRenderer.sharedMaterial = handMaterialInstance; handRendererInitialized = true; } From dd393bab2af093a791192e585df00e419df834ac Mon Sep 17 00:00:00 2001 From: Roger Liu Date: Mon, 23 May 2022 14:49:05 -0700 Subject: [PATCH 2/4] back compat fixes --- .../MixedRealityHandTrackingProfile.cs | 2 ++ .../Providers/Hands/BaseHandVisualizer.cs | 29 +++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Assets/MRTK/Core/Definitions/Devices/MixedRealityHandTrackingProfile.cs b/Assets/MRTK/Core/Definitions/Devices/MixedRealityHandTrackingProfile.cs index 1a4122f044a..bdb0e77d250 100644 --- a/Assets/MRTK/Core/Definitions/Devices/MixedRealityHandTrackingProfile.cs +++ b/Assets/MRTK/Core/Definitions/Devices/MixedRealityHandTrackingProfile.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using Microsoft.MixedReality.Toolkit.Utilities; +using System; using UnityEngine; namespace Microsoft.MixedReality.Toolkit.Input @@ -62,6 +63,7 @@ public class MixedRealityHandTrackingProfile : BaseMixedRealityProfile /// /// The hand mesh prefab to use to render the hand /// + [Obsolete("The GameObject which generates the system handmesh is now created at runtime. This prefab is not used")] public GameObject HandMeshPrefab => handMeshPrefab; /// diff --git a/Assets/MRTK/Core/Providers/Hands/BaseHandVisualizer.cs b/Assets/MRTK/Core/Providers/Hands/BaseHandVisualizer.cs index 1127debffcc..909859402e9 100644 --- a/Assets/MRTK/Core/Providers/Hands/BaseHandVisualizer.cs +++ b/Assets/MRTK/Core/Providers/Hands/BaseHandVisualizer.cs @@ -254,16 +254,27 @@ protected virtual void UpdateHandMesh() IMixedRealityInputSystem inputSystem = CoreServices.InputSystem; MixedRealityHandTrackingProfile handTrackingProfile = inputSystem?.InputSystemProfile != null ? inputSystem.InputSystemProfile.HandTrackingProfile : null; - if (newMesh && - handTrackingProfile != null && - handTrackingProfile.SystemHandMeshMaterial != null) + if (newMesh && handTrackingProfile != null) { // Create the hand mesh in the scene and assign the proper material to it - handMeshFilter = new GameObject("System Hand Mesh").EnsureComponent(); - handMeshFilter.EnsureComponent().material = CoreServices.InputSystem.InputSystemProfile.HandTrackingProfile.SystemHandMeshMaterial; - - lastHandMeshVerticesCount = handMeshFilter.mesh.vertices.Length; - handMeshFilter.transform.parent = transform; + if(handTrackingProfile.SystemHandMeshMaterial.IsNotNull()) + { + handMeshFilter = new GameObject("System Hand Mesh").EnsureComponent(); + handMeshFilter.EnsureComponent().material = handTrackingProfile.SystemHandMeshMaterial; + } +#pragma warning disable 0618 + else if (handTrackingProfile.HandMeshPrefab.IsNotNull()) + { + handMeshFilter = Instantiate(handTrackingProfile.HandMeshPrefab).GetComponent(); + } +#pragma warning restore 0618 + + // Initialize the hand mesh if we generated it successfully + if (handMeshFilter != null) + { + lastHandMeshVerticesCount = handMeshFilter.mesh.vertices.Length; + handMeshFilter.transform.parent = transform; + } } if (handMeshFilter != null) @@ -300,7 +311,7 @@ protected virtual void UpdateHandMesh() mesh.RecalculateBounds(); } - handMeshFilter.transform.SetPositionAndRotation(eventData.InputData.position, eventData.InputData.rotation); + handMeshFilter.transform.SetPositionAndRotation(lastHandMeshInfo.position, lastHandMeshInfo.rotation); } } } From 54a2742e4386f6de8fe64f7c88088d1c44ad66e2 Mon Sep 17 00:00:00 2001 From: Roger Liu Date: Mon, 23 May 2022 14:55:23 -0700 Subject: [PATCH 3/4] updating profiles with materials --- .../PulseShader/Profile/PulseShaderHandTrackingProfile.asset | 4 ++++ .../SDK/Profiles/DefaultMixedRealityHandTrackingProfile.asset | 4 ++++ .../HoloLens1/DefaultHoloLens1HandTrackingProfile.asset | 4 ++++ .../HoloLens2/DefaultHoloLens2HandTrackingProfile.asset | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/Assets/MRTK/Examples/Demos/PulseShader/Profile/PulseShaderHandTrackingProfile.asset b/Assets/MRTK/Examples/Demos/PulseShader/Profile/PulseShaderHandTrackingProfile.asset index 45c3e69e2b3..ec6ceea428d 100644 --- a/Assets/MRTK/Examples/Demos/PulseShader/Profile/PulseShaderHandTrackingProfile.asset +++ b/Assets/MRTK/Examples/Demos/PulseShader/Profile/PulseShaderHandTrackingProfile.asset @@ -19,6 +19,10 @@ MonoBehaviour: type: 3} fingertipPrefab: {fileID: 7094064642998883381, guid: b37dde41a983d664c8a09a91313733e7, type: 3} + systemHandMeshMaterial: {fileID: 2100000, guid: 45082b98567b3d44ca3bdbe39f46041a, + type: 2} + riggedHandMeshMaterial: {fileID: 2100000, guid: 46180a965b426614f97a7239d1248a1a, + type: 2} handMeshPrefab: {fileID: 1887883006053652, guid: 308140ab26e8edd4f920cadc10af5c4f, type: 3} handMeshVisualizationModes: -1 diff --git a/Assets/MRTK/SDK/Profiles/DefaultMixedRealityHandTrackingProfile.asset b/Assets/MRTK/SDK/Profiles/DefaultMixedRealityHandTrackingProfile.asset index 8623dc856c3..a4773f8d9b4 100644 --- a/Assets/MRTK/SDK/Profiles/DefaultMixedRealityHandTrackingProfile.asset +++ b/Assets/MRTK/SDK/Profiles/DefaultMixedRealityHandTrackingProfile.asset @@ -19,6 +19,10 @@ MonoBehaviour: type: 3} fingertipPrefab: {fileID: 7094064642998883381, guid: b37dde41a983d664c8a09a91313733e7, type: 3} + systemHandMeshMaterial: {fileID: 2100000, guid: 45082b98567b3d44ca3bdbe39f46041a, + type: 2} + riggedHandMeshMaterial: {fileID: 2100000, guid: 46180a965b426614f97a7239d1248a1a, + type: 2} handMeshPrefab: {fileID: 1887883006053652, guid: a86f479797fea8f4189f924b3b6ad979, type: 3} handMeshVisualizationModes: -1 diff --git a/Assets/MRTK/SDK/Profiles/HoloLens1/DefaultHoloLens1HandTrackingProfile.asset b/Assets/MRTK/SDK/Profiles/HoloLens1/DefaultHoloLens1HandTrackingProfile.asset index b072f017922..eadcbd666e1 100644 --- a/Assets/MRTK/SDK/Profiles/HoloLens1/DefaultHoloLens1HandTrackingProfile.asset +++ b/Assets/MRTK/SDK/Profiles/HoloLens1/DefaultHoloLens1HandTrackingProfile.asset @@ -19,6 +19,10 @@ MonoBehaviour: type: 3} fingertipPrefab: {fileID: 7094064642998883381, guid: b37dde41a983d664c8a09a91313733e7, type: 3} + systemHandMeshMaterial: {fileID: 2100000, guid: 45082b98567b3d44ca3bdbe39f46041a, + type: 2} + riggedHandMeshMaterial: {fileID: 2100000, guid: 46180a965b426614f97a7239d1248a1a, + type: 2} handMeshPrefab: {fileID: 1887883006053652, guid: a86f479797fea8f4189f924b3b6ad979, type: 3} handMeshVisualizationModes: 0 diff --git a/Assets/MRTK/SDK/Profiles/HoloLens2/DefaultHoloLens2HandTrackingProfile.asset b/Assets/MRTK/SDK/Profiles/HoloLens2/DefaultHoloLens2HandTrackingProfile.asset index 95b573cd369..dec0c76c7fa 100644 --- a/Assets/MRTK/SDK/Profiles/HoloLens2/DefaultHoloLens2HandTrackingProfile.asset +++ b/Assets/MRTK/SDK/Profiles/HoloLens2/DefaultHoloLens2HandTrackingProfile.asset @@ -19,6 +19,10 @@ MonoBehaviour: type: 3} fingertipPrefab: {fileID: 7094064642998883381, guid: b37dde41a983d664c8a09a91313733e7, type: 3} + systemHandMeshMaterial: {fileID: 2100000, guid: 45082b98567b3d44ca3bdbe39f46041a, + type: 2} + riggedHandMeshMaterial: {fileID: 2100000, guid: 46180a965b426614f97a7239d1248a1a, + type: 2} handMeshPrefab: {fileID: 1887883006053652, guid: a86f479797fea8f4189f924b3b6ad979, type: 3} handMeshVisualizationModes: 1 From 707633c7f107d6f6eb712892a37e4f390ec89aa1 Mon Sep 17 00:00:00 2001 From: Roger Liu Date: Mon, 23 May 2022 14:57:05 -0700 Subject: [PATCH 4/4] refactor part 2 --- .../PulseShader/Profile/PulseShaderHandTrackingProfile.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/MRTK/Examples/Demos/PulseShader/Profile/PulseShaderHandTrackingProfile.asset b/Assets/MRTK/Examples/Demos/PulseShader/Profile/PulseShaderHandTrackingProfile.asset index ec6ceea428d..725cec255df 100644 --- a/Assets/MRTK/Examples/Demos/PulseShader/Profile/PulseShaderHandTrackingProfile.asset +++ b/Assets/MRTK/Examples/Demos/PulseShader/Profile/PulseShaderHandTrackingProfile.asset @@ -19,7 +19,7 @@ MonoBehaviour: type: 3} fingertipPrefab: {fileID: 7094064642998883381, guid: b37dde41a983d664c8a09a91313733e7, type: 3} - systemHandMeshMaterial: {fileID: 2100000, guid: 45082b98567b3d44ca3bdbe39f46041a, + systemHandMeshMaterial: {fileID: 2100000, guid: 8898ca407d928454d876a616ba1be32e, type: 2} riggedHandMeshMaterial: {fileID: 2100000, guid: 46180a965b426614f97a7239d1248a1a, type: 2}