diff --git a/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult.meta b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult.meta
new file mode 100644
index 00000000000..f5bd5055b45
--- /dev/null
+++ b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 86e94af123da97b498f02211c7a0cdbb
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/PointerResultExample.unity b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/PointerResultExample.unity
new file mode 100644
index 00000000000..0c9f96c7503
--- /dev/null
+++ b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/PointerResultExample.unity
@@ -0,0 +1,655 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 0
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 1
+ m_LightmapEditorSettings:
+ serializedVersion: 10
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 500
+ m_PVRBounces: 2
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringMode: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ShowResolutionOverlay: 1
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &56727980
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 56727982}
+ - component: {fileID: 56727981}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &56727981
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 56727980}
+ m_Enabled: 1
+ serializedVersion: 8
+ m_Type: 1
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_Lightmapping: 4
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &56727982
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 56727980}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1001 &421603838
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 1951033628531078, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_Name
+ value: SceneDescriptionPanel
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0.496
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 2
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_RootOrder
+ value: 4
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4753320988497866, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 224849082003076088, guid: a900c08743a94c328074df8bbe3eb63c,
+ type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: 0.164
+ objectReference: {fileID: 0}
+ - target: {fileID: 1149545904682892, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_IsActive
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 1054075472835142, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+ propertyPath: m_IsActive
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 114107642412081004, guid: a900c08743a94c328074df8bbe3eb63c,
+ type: 3}
+ propertyPath: m_Text
+ value: Pointer Result Example
+ objectReference: {fileID: 0}
+ - target: {fileID: 114125765304321574, guid: a900c08743a94c328074df8bbe3eb63c,
+ type: 3}
+ propertyPath: m_Text
+ value: Setup
+ objectReference: {fileID: 0}
+ - target: {fileID: 114995780653097258, guid: a900c08743a94c328074df8bbe3eb63c,
+ type: 3}
+ propertyPath: m_Text
+ value: 'This scene shows how to use the pointer hit location to spawn on object
+ on pointer click.
+
+
+ Click on the Board game object with any pointer while playing the scene to
+ spawn a post-it note at the current pointer hit point.
+
+
+
+ To achieve this behavior we added a PointerHandler script to the Board game
+ obect to listen for pointer events. We then created the SpawnOnPointerEvent
+ script with a Spawn method that instantiates a game object at the hit location
+ containted in the pointer''s result. Finally, we wired up the Spawn method
+ to the OnPointerClicked event in PointerHandler.'
+ objectReference: {fileID: 0}
+ - target: {fileID: 114713125240876806, guid: a900c08743a94c328074df8bbe3eb63c,
+ type: 3}
+ propertyPath: m_Text
+ value: All Platforms
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: a900c08743a94c328074df8bbe3eb63c, type: 3}
+--- !u!1 &1326125284
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1326125285}
+ - component: {fileID: 1326125290}
+ - component: {fileID: 1326125289}
+ - component: {fileID: 1326125288}
+ - component: {fileID: 1326125287}
+ - component: {fileID: 1326125286}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1326125285
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1326125284}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1922676606}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1326125286
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1326125284}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: bf98dd1206224111a38765365e98e207, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ setCursorInvisibleWhenFocusLocked: 1
+ maxGazeCollisionDistance: 10
+ raycastLayerMasks:
+ - serializedVersion: 2
+ m_Bits: 4294967291
+ stabilizer:
+ storedStabilitySamples: 60
+ gazeTransform: {fileID: 0}
+ minHeadVelocityThreshold: 0.5
+ maxHeadVelocityThreshold: 2
+ useEyeTracking: 1
+--- !u!114 &1326125287
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1326125284}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 7a21b486d0bb44444b1418aaa38b44de, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalAxis: Horizontal
+ m_VerticalAxis: Vertical
+ m_SubmitButton: Submit
+ m_CancelButton: Cancel
+ m_InputActionsPerSecond: 10
+ m_RepeatDelay: 0.5
+ m_ForceModuleActive: 0
+--- !u!114 &1326125288
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1326125284}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_FirstSelected: {fileID: 0}
+ m_sendNavigationEvents: 1
+ m_DragThreshold: 10
+--- !u!81 &1326125289
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1326125284}
+ m_Enabled: 1
+--- !u!20 &1326125290
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1326125284}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1}
+ m_projectionMatrixMode: 1
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_GateFitMode: 2
+ m_FocalLength: 50
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.1
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!1 &1535182809
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1535182813}
+ - component: {fileID: 1535182812}
+ - component: {fileID: 1535182811}
+ - component: {fileID: 1535182810}
+ - component: {fileID: 1535182814}
+ - component: {fileID: 1535182815}
+ m_Layer: 0
+ m_Name: Board
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &1535182810
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1535182809}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &1535182811
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1535182809}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: a5e028070ace428d8971079be1d965a6, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1535182812
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1535182809}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1535182813
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1535182809}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0.386, y: 0.142, z: 2}
+ m_LocalScale: {x: 0.65457, y: 0.65457, z: 0.0327285}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1535182814
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1535182809}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b7e736ec19b1c5543a9bb27c150f94fb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ isFocusRequired: 1
+ MarkEventsAsUsed: 0
+ OnPointerDown:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: Microsoft.MixedReality.Toolkit.Input.PointerUnityEvent, Microsoft.MixedReality.Toolkit.SDK,
+ Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ OnPointerUp:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: Microsoft.MixedReality.Toolkit.Input.PointerUnityEvent, Microsoft.MixedReality.Toolkit.SDK,
+ Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ OnPointerClicked:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1535182815}
+ m_MethodName: Spawn
+ m_Mode: 0
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_TypeName: Microsoft.MixedReality.Toolkit.Input.PointerUnityEvent, Microsoft.MixedReality.Toolkit.SDK,
+ Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ OnPointerDragged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: Microsoft.MixedReality.Toolkit.Input.PointerUnityEvent, Microsoft.MixedReality.Toolkit.SDK,
+ Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+--- !u!114 &1535182815
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1535182809}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 42c32cfc6b533eb4cbe68169d9e77ead, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ PrefabToSpawn: {fileID: 1701302710211625092, guid: 1ee5e0ce73a0dd34baa2c1e6ec447d40,
+ type: 3}
+--- !u!1 &1922676605
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1922676606}
+ m_Layer: 0
+ m_Name: MixedRealityPlayspace
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1922676606
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1922676605}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1326125285}
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2146859012
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2146859014}
+ - component: {fileID: 2146859013}
+ m_Layer: 0
+ m_Name: MixedRealityToolkit
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &2146859013
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2146859012}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 83d9acc7968244a8886f3af591305bcb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ activeProfile: {fileID: 11400000, guid: 31a611a779d3499e8e35f1a2018ca841, type: 2}
+--- !u!4 &2146859014
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2146859012}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
diff --git a/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/PointerResultExample.unity.meta b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/PointerResultExample.unity.meta
new file mode 100644
index 00000000000..6888b33ea6d
--- /dev/null
+++ b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/PointerResultExample.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 096ed32ac2d49894c91d9594cb5e4dd7
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/Post-it.prefab b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/Post-it.prefab
new file mode 100644
index 00000000000..e0cab26293b
--- /dev/null
+++ b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/Post-it.prefab
@@ -0,0 +1,93 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1701302710211625092
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1872859498492346648}
+ - component: {fileID: 8601442887886900788}
+ - component: {fileID: 331252188843707158}
+ - component: {fileID: 6014210820290924052}
+ m_Layer: 0
+ m_Name: Post-it
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1872859498492346648
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1701302710211625092}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0.076, y: 0.076, z: 0.01}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &8601442887886900788
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1701302710211625092}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &331252188843707158
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1701302710211625092}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: cb74390ea57642f8b5ca0aa8f5fb38c1, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!65 &6014210820290924052
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1701302710211625092}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
diff --git a/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/Post-it.prefab.meta b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/Post-it.prefab.meta
new file mode 100644
index 00000000000..4615e88a9b9
--- /dev/null
+++ b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/Post-it.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1ee5e0ce73a0dd34baa2c1e6ec447d40
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/SpawnOnPointerEvent.cs b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/SpawnOnPointerEvent.cs
new file mode 100644
index 00000000000..6ab8b950821
--- /dev/null
+++ b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/SpawnOnPointerEvent.cs
@@ -0,0 +1,17 @@
+using Microsoft.MixedReality.Toolkit.Input;
+using UnityEngine;
+
+// Example script that spawns a prefab at the pointer hit location.
+public class SpawnOnPointerEvent : MonoBehaviour
+{
+ public GameObject PrefabToSpawn;
+
+ public void Spawn(MixedRealityPointerEventData eventData)
+ {
+ if (PrefabToSpawn != null)
+ {
+ var result = eventData.Pointer.Result;
+ Instantiate(PrefabToSpawn, result.Details.Point, Quaternion.LookRotation(result.Details.Normal));
+ }
+ }
+}
diff --git a/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/SpawnOnPointerEvent.cs.meta b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/SpawnOnPointerEvent.cs.meta
new file mode 100644
index 00000000000..793ca1bf256
--- /dev/null
+++ b/Assets/MixedRealityToolkit.Examples/Demos/Input/Scenes/PointerResult/SpawnOnPointerEvent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 42c32cfc6b533eb4cbe68169d9e77ead
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityToolkit.Examples/Demos/UX/BoundingBox/Scripts/BoundingBoxTest.cs b/Assets/MixedRealityToolkit.Examples/Demos/UX/BoundingBox/Scripts/BoundingBoxTest.cs
index db1f35efe16..6187fe45eb8 100644
--- a/Assets/MixedRealityToolkit.Examples/Demos/UX/BoundingBox/Scripts/BoundingBoxTest.cs
+++ b/Assets/MixedRealityToolkit.Examples/Demos/UX/BoundingBox/Scripts/BoundingBoxTest.cs
@@ -116,6 +116,17 @@ private IEnumerator Sequence()
bbox.BoxMaterial = null;
yield return WaitForSpeechCommand();
+ SetStatus("Scale X and update rig");
+ cube.transform.localScale = new Vector3(2, 1, 1);
+ bbox.CreateRig();
+ yield return WaitForSpeechCommand();
+
+ SetStatus("Rotate 20 degrees and update rig");
+ cube.transform.localRotation = Quaternion.Euler(0, 20, 0);
+ bbox.ShowRotationHandleForY = true;
+ bbox.CreateRig();
+ yield return WaitForSpeechCommand();
+
SetStatus("Wireframe radius 0.1");
bbox.WireframeEdgeRadius = 0.1f;
yield return WaitForSpeechCommand();
diff --git a/Assets/MixedRealityToolkit.SDK/Features/Input/Events/PointerUnityEvent.cs b/Assets/MixedRealityToolkit.SDK/Features/Input/Events/PointerUnityEvent.cs
new file mode 100644
index 00000000000..aad45236678
--- /dev/null
+++ b/Assets/MixedRealityToolkit.SDK/Features/Input/Events/PointerUnityEvent.cs
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.Events;
+
+namespace Microsoft.MixedReality.Toolkit.Input
+{
+ ///
+ /// Unity event for a pointer event. Contains the pointer event data.
+ ///
+ [System.Serializable]
+ public class PointerUnityEvent : UnityEvent { }
+}
diff --git a/Assets/MixedRealityToolkit.SDK/Features/Input/Events/PointerUnityEvent.cs.meta b/Assets/MixedRealityToolkit.SDK/Features/Input/Events/PointerUnityEvent.cs.meta
new file mode 100644
index 00000000000..bf132991100
--- /dev/null
+++ b/Assets/MixedRealityToolkit.SDK/Features/Input/Events/PointerUnityEvent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ad70f61a56017ee48838ce14afdb8a46
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityToolkit.SDK/Features/Input/Handlers/PointerHandler.cs b/Assets/MixedRealityToolkit.SDK/Features/Input/Handlers/PointerHandler.cs
new file mode 100644
index 00000000000..c75574185ea
--- /dev/null
+++ b/Assets/MixedRealityToolkit.SDK/Features/Input/Handlers/PointerHandler.cs
@@ -0,0 +1,88 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace Microsoft.MixedReality.Toolkit.Input
+{
+ ///
+ /// Script used to raise Unity Events in response to pointer events.
+ ///
+ public class PointerHandler : BaseInputHandler, IMixedRealityPointerHandler
+ {
+ [SerializeField]
+ [Tooltip("Whether input events should be marked as used after handling so other handlers in the same game object ignore them")]
+ private bool MarkEventsAsUsed = false;
+
+ ///
+ /// Unity event raised on pointer down.
+ ///
+ public PointerUnityEvent OnPointerDown;
+
+ ///
+ /// Unity event raised on pointer up.
+ ///
+ public PointerUnityEvent OnPointerUp;
+
+ ///
+ /// Unity event raised on pointer clicked.
+ ///
+ public PointerUnityEvent OnPointerClicked;
+
+ ///
+ /// Unity event raised every frame the pointer is down.
+ ///
+ public PointerUnityEvent OnPointerDragged;
+
+ #region IMixedRealityPointerHandler
+
+ void IMixedRealityPointerHandler.OnPointerDown(MixedRealityPointerEventData eventData)
+ {
+ if (!eventData.used)
+ {
+ OnPointerDown.Invoke(eventData);
+ if (MarkEventsAsUsed)
+ {
+ eventData.Use();
+ }
+ }
+ }
+
+ void IMixedRealityPointerHandler.OnPointerUp(MixedRealityPointerEventData eventData)
+ {
+ if (!eventData.used)
+ {
+ OnPointerUp.Invoke(eventData);
+ if (MarkEventsAsUsed)
+ {
+ eventData.Use();
+ }
+ }
+ }
+ void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
+ {
+ if (!eventData.used)
+ {
+ OnPointerClicked.Invoke(eventData);
+ if (MarkEventsAsUsed)
+ {
+ eventData.Use();
+ }
+ }
+ }
+
+ void IMixedRealityPointerHandler.OnPointerDragged(MixedRealityPointerEventData eventData)
+ {
+ if (!eventData.used)
+ {
+ OnPointerDragged.Invoke(eventData);
+ if (MarkEventsAsUsed)
+ {
+ eventData.Use();
+ }
+ }
+ }
+
+ #endregion IMixedRealityPointerHandler
+ }
+}
diff --git a/Assets/MixedRealityToolkit.SDK/Features/Input/Handlers/PointerHandler.cs.meta b/Assets/MixedRealityToolkit.SDK/Features/Input/Handlers/PointerHandler.cs.meta
new file mode 100644
index 00000000000..9102adb28c2
--- /dev/null
+++ b/Assets/MixedRealityToolkit.SDK/Features/Input/Handlers/PointerHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b7e736ec19b1c5543a9bb27c150f94fb
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/BoundingBox/BoundingBox.cs b/Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/BoundingBox/BoundingBox.cs
index 16201a5e9ee..66914442d6d 100644
--- a/Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/BoundingBox/BoundingBox.cs
+++ b/Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/BoundingBox/BoundingBox.cs
@@ -705,6 +705,25 @@ public void SetScaleLimits(float min, float max, bool relativeToInitialState = t
}
}
+ ///
+ /// Destroys and re-creates the rig around the bounding box
+ ///
+ public void CreateRig()
+ {
+ DestroyRig();
+ SetMaterials();
+ InitializeDataStructures();
+ SetBoundingBoxCollider();
+ UpdateBounds();
+ AddCorners();
+ AddLinks();
+ AddBoxDisplay();
+ UpdateRigHandles();
+ Flatten();
+ ResetHandleVisibility();
+ rigRoot.gameObject.SetActive(active);
+ UpdateRigVisibilityInInspector();
+ }
#endregion
#region MonoBehaviour Methods
@@ -744,22 +763,6 @@ private void Update()
#endregion MonoBehaviour Methods
#region Private Methods
- private void CreateRig()
- {
- DestroyRig();
- SetMaterials();
- InitializeDataStructures();
- SetBoundingBoxCollider();
- UpdateBounds();
- AddCorners();
- AddLinks();
- AddBoxDisplay();
- UpdateRigHandles();
- Flatten();
- ResetHandleVisibility();
- rigRoot.gameObject.SetActive(active);
- UpdateRigVisibilityInInspector();
- }
private void DestroyRig()
{
@@ -1563,7 +1566,6 @@ private void SetHighlighted(Transform activeHandle)
private void UpdateBounds()
{
-
if (cachedTargetCollider != null)
{
// Store current rotation then zero out the rotation so that the bounds
@@ -1602,6 +1604,10 @@ private void UpdateRigHandles()
{
if (rigRoot != null && Target != null)
{
+ // We move the rigRoot to the scene root to ensure that non-uniform scaling performed
+ // anywhere above the rigRoot does not impact the position of rig corners / edges
+ rigRoot.parent = null;
+
rigRoot.rotation = Quaternion.identity;
rigRoot.position = Vector3.zero;
@@ -1648,6 +1654,8 @@ private void UpdateRigHandles()
//move rig into position and rotation
rigRoot.position = cachedTargetCollider.bounds.center;
rigRoot.rotation = Target.transform.rotation;
+
+ rigRoot.parent = transform;
}
}
private HandleType GetHandleType(Transform handle)
diff --git a/Assets/MixedRealityToolkit/Extensions/BoundsExtensions.cs b/Assets/MixedRealityToolkit/Extensions/BoundsExtensions.cs
index 0f6d492cef4..99c1fa822c6 100644
--- a/Assets/MixedRealityToolkit/Extensions/BoundsExtensions.cs
+++ b/Assets/MixedRealityToolkit/Extensions/BoundsExtensions.cs
@@ -91,11 +91,11 @@ public static bool IsValid(this Bounds bounds)
}
///
- /// Gets all the corner points of the bounds in world space
+ /// Gets all the corner points of the bounds in world space by transforming input bounds using the given transform
///
- ///
- ///
- ///
+ /// Local to world transform
+ /// Output corner positions
+ /// Input bounds, in local space
///
/// Use BoxColliderExtensions.{Left|Right}{Bottom|Top}{Front|Back} consts to index into the output
/// corners array.
@@ -131,7 +131,7 @@ public static void GetCornerPositions(this Bounds bounds, Transform transform, r
}
///
- /// Gets all the corner points of the bounds in local space
+ /// Gets all the corner points of the bounds
///
///
///
diff --git a/Documentation/Images/Input/ControllerInputMappingProfile.PNG b/Documentation/Images/Input/ControllerInputMappingProfile.PNG
new file mode 100644
index 00000000000..a4df24255ce
Binary files /dev/null and b/Documentation/Images/Input/ControllerInputMappingProfile.PNG differ
diff --git a/Documentation/Images/Input/InputActionAssignment.PNG b/Documentation/Images/Input/InputActionAssignment.PNG
new file mode 100644
index 00000000000..0c8a41f322f
Binary files /dev/null and b/Documentation/Images/Input/InputActionAssignment.PNG differ
diff --git a/Documentation/Images/Input/InputActionHandler.PNG b/Documentation/Images/Input/InputActionHandler.PNG
new file mode 100644
index 00000000000..c405f7a66b7
Binary files /dev/null and b/Documentation/Images/Input/InputActionHandler.PNG differ
diff --git a/Documentation/Images/Input/InputActionsExample.PNG b/Documentation/Images/Input/InputActionsExample.PNG
new file mode 100644
index 00000000000..993ec4e4316
Binary files /dev/null and b/Documentation/Images/Input/InputActionsExample.PNG differ
diff --git a/Documentation/Images/Input/PointerHandler.PNG b/Documentation/Images/Input/PointerHandler.PNG
new file mode 100644
index 00000000000..e3e8710f342
Binary files /dev/null and b/Documentation/Images/Input/PointerHandler.PNG differ
diff --git a/Documentation/Images/Input/PointerResultExample.png b/Documentation/Images/Input/PointerResultExample.png
new file mode 100644
index 00000000000..fd135a53bfb
Binary files /dev/null and b/Documentation/Images/Input/PointerResultExample.png differ
diff --git a/Documentation/Input/InputActions.md b/Documentation/Input/InputActions.md
index a04b13eeb35..f86b225e39d 100644
--- a/Documentation/Input/InputActions.md
+++ b/Documentation/Input/InputActions.md
@@ -1,5 +1,63 @@
# Input Actions
-Input actions can be configured in the **Input Actions Profile**, inside the *Input System Profile* in the Mixed Reality Toolkit component, specifying a name for the action and the *Axis Type* of the physical inputs it can be mapped to. The input action mapped to a physical input, if any, is included in [*input events*](InputEvents.md).
+[**Input Actions**](InputActions.md) are abstractions over raw inputs meant to help isolating application logic from the specific input sources producing an input. It can be useful, for example, to define a *Select* action and map it to the left mouse button, a button in a gamepad and a trigger in a 6 DOF controller. You can then have your application logic listen for *Select* input action events instead of having to be aware of all the different inputs that can produce it.
-
\ No newline at end of file
+## Creating An Input Action
+
+Input actions are configured in the **Input Actions Profile**, inside the *Input System Profile* in the Mixed Reality Toolkit component, specifying a name for the action and the type of inputs (*Axis Constraint*) it can be mapped to:
+
+
+
+These are the most mostly commonly used values for **Axis Constraint**:
+
+Axis Constraint | Description
+--- | ---
+Digital | On/off input like a binary button in a gamepad or mouse.
+Single Axis | Single axis analogue input like an analog trigger in a gamepad.
+Dual Axis | Dual axis analogue input like a thumbstick.
+Six Dof | 3D pose with translation and rotation like the one produced by 6 DOF controllers.
+
+You can find the full list in [`AxisType`](xref:Microsoft.MixedReality.Toolkit.Utilities.AxisType).
+
+## Mapping Inputs To Actions
+
+The way you map an input to and action depends on the type of the input source:
+
+### Controller Inputs
+
+Go to the **Controller Input Mapping Profile**, under the *Input System Profile*. There you will find a list of all supported controllers:
+
+
+
+Select the one you want to configure and a dialog window will appear with all the controller inputs, allowing you to set an action for each of them:
+
+
+
+### Speech Inputs
+
+In the **Speech Command Profile**, under the *Input System Profile*, you'll find the list of currently defined speech commands. To map one of them to an action, just select it in the *Action* drop down.
+
+
+
+### Gesture Inputs
+
+The **Gestures Profile**, under the *Input System Profile*, contains all defined gestures. You can map each of them to an action by selecting it in the *Action* drop down.
+
+
+
+## Handling Input Actions
+
+> [!WARNING]
+> Currently only input actions of *Digital* type can be handled using the methods described in this section. For other action types, you'll have to handle directly the events for the corresponding inputs instead. For example, to handle a 6 DOF action mapped to controller inputs, you'll have to use [`IMixedRealityGestureHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityGestureHandler`1) with T = [`MixedRealityPose`](xref:Microsoft.MixedReality.Toolkit.Utilities.MixedRealityPose).
+
+The easiest way to handle input actions is to make use of the [`InputActionHandler`](xref:Microsoft.MixedReality.Toolkit.Input.InputActionHandler) script. This allows you to define the action you want to listen to and react to action started and ended events using Unity Events.
+
+
+
+If you want more control, you can implement the [`IMixedRealityInputActionHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityInputActionHandler) interface directly in your script. See the [**Input Events**](InputEvents.md) section for more details on event handling via handler interfaces.
+
+## Examples
+
+See `MixedRealityToolkit.Examples\Demos\Input\Scenes\InputActions` for an example scene showing how to create an action, map it to controller, speech and gesture inputs and use it to rotate an object on command.
+
+
\ No newline at end of file
diff --git a/Documentation/Input/InputEvents.md b/Documentation/Input/InputEvents.md
index 9167baae0f7..3911950a2ad 100644
--- a/Documentation/Input/InputEvents.md
+++ b/Documentation/Input/InputEvents.md
@@ -18,5 +18,6 @@ Handler | Events | Description
[`IMixedRealityGestureHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityGestureHandler) | Gesture Started / Updated / Completed / Canceled | Raised on gesture detection.
[`IMixedRealityGestureHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityGestureHandler`1) | Gesture Updated / Completed | Raised on detection of gestures containing additional data of the given type. See [**Gesture Events**](Gestures.md#gesture-events) for details on possible values for **T**.
[`IMixedRealityHandJointHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityHandJointHandler) | Hand Joints Updated | Raised by articulated hand controllers when hand joints are updated.
-[`IMixedRealityHandMeshHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityHandMeshHandler) | Hand Mesh Updated | Raised by articulated hand controllers when a hand mesh is updated.
+[`IMixedRealityHandMeshHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityHandMeshHandler) | Hand Mesh Updated | Raised by articulated hand controllers when a hand mesh is updated.
+[`IMixedRealityInputActionHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityInputActionHandler) | Action Started / Ended | Raise to indicate action start and end for inputs mapped to actions.
diff --git a/Documentation/Input/Overview.md b/Documentation/Input/Overview.md
index b16d454abb7..ed3e8823d07 100644
--- a/Documentation/Input/Overview.md
+++ b/Documentation/Input/Overview.md
@@ -7,11 +7,11 @@ The Input System in MRTK allows you to:
Inputs are produced by [**Input Providers**](InputProviders.md). Each provider corresponds to a particular source of input: Open VR, Windows Mixed Reality (WMR), Unity Joystick, Windows Speech, etc. Providers are added to your project via the **Registered Service Providers Profile** in the *Mixed Reality Toolkit* component and will produce [**Input Events**](InputEvents.md) automatically when the corresponding input sources are available, e.g. when a WMR controller is detected or a gamepad connected.
-[**Input Actions**](InputActions.md) are abstractions over raw inputs meant to help isolating application logic from the specific input sources producing an input. It can be useful, for example, to define a *Select* action and map it to the left mouse button, a button in a gamepad and a trigger in a 6 DOF controller. You can then have your application logic listen for input events mapped to that action instead of having to be aware of all the different input sources that can produce it. Input Actions are defined in the **Input Actions Profile**, found within the *Input System Profile* in the *Mixed Reality Toolkit* component.
+[**Input Actions**](InputActions.md) are abstractions over raw inputs meant to help isolating application logic from the specific input sources producing an input. It can be useful, for example, to define a *Select* action and map it to the left mouse button, a button in a gamepad and a trigger in a 6 DOF controller. You can then have your application logic listen for *Select* input action events instead of having to be aware of all the different inputs that can produce it. Input Actions are defined in the **Input Actions Profile**, found within the *Input System Profile* in the *Mixed Reality Toolkit* component.
[**Controllers**](Controllers.md) are created by *input providers* when input devices are detected and destroyed when they're lost or disconnected. The WMR input provider, for example, will create *WMR controllers* for 6 DOF devices and *WMR articulated hand controllers* for articulated hands. Controller inputs can be mapped to input actions via the **Controller Mapping Profile**, inside the *Input System Profile*. Inputs events raised by controllers will include the associated input action, if any.
-Controllers can have [**Pointers**](Pointers.md) attached to them that query the scene to determine the game object with focus and raise [**Pointer Events**](Pointers.md#pointer-events) on it. As an example, our *line pointer* performs a raycast against the scene using the controller pose to compute the origin and direction of the ray. The pointers created for each controller are set up in the **Pointer Profile**, under the *Input System Profile*.
+Controllers can have [**Pointers**](Pointers.md) attached to them that query the scene to determine the game object with focus and raise [**Pointer Events**](Pointers.md#events) on it. As an example, our *line pointer* performs a raycast against the scene using the controller pose to compute the origin and direction of the ray. The pointers created for each controller are set up in the **Pointer Profile**, under the *Input System Profile*.
diff --git a/Documentation/Input/Pointers.md b/Documentation/Input/Pointers.md
index b333c1f5d0a..3ec2558eb60 100644
--- a/Documentation/Input/Pointers.md
+++ b/Documentation/Input/Pointers.md
@@ -6,13 +6,32 @@ Pointers are instanced automatically at runtime when a new controller is detecte
MRTK provides a set of pointer prefabs in *Assets/MixedRealityToolkit.SDK/Features/UX/Prefabs/Pointers*. You can use your own prefabs as long as they contain one of the pointer scripts in *Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/Pointers* or any other script implementing [`IMixedRealityPointer`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityPointer).
-## Pointer Events
+## Events
-To receive pointer events, implement one of the following interfaces in your script:
+These are all the pointer-related events raised by MRTK:
-Handler | Events | Description
+Event | Description | Handler
--- | --- | ---
-[`IMixedRealityFocusChangedHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityFocusChangedHandler) | Before Focus Changed / Focus Changed | Raised on both the game object losing focus and the one gaining it every time a pointer changes focus.
-[`IMixedRealityFocusHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityFocusHandler) | Focus Enter / Exit | Raised on the game object gaining focus when the first pointer enters it and on the one losing focus when the last pointer leaves it.
-[`IMixedRealityPointerHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityPointerHandler) | Pointer Down / Dragged / Up / Clicked | Raised to report pointer press, drag and release.
-[`IMixedRealityTouchHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) | Touch Started / Updated / Completed | Raised by touch-aware pointers like [**PokePointer**](xref:Microsoft.MixedReality.Toolkit.Input.PokePointer) to report touch activity.
\ No newline at end of file
+Before Focus Changed / Focus Changed | Raised on both the game object losing focus and the one gaining it every time a pointer changes focus. | [`IMixedRealityFocusChangedHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityFocusChangedHandler)
+Focus Enter / Exit | Raised on the game object gaining focus when the first pointer enters it and on the one losing focus when the last pointer leaves it. | [`IMixedRealityFocusHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityFocusHandler)
+Pointer Down / Dragged / Up / Clicked | Raised to report pointer press, drag and release. | [`IMixedRealityPointerHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityPointerHandler)
+Touch Started / Updated / Completed | Raised by touch-aware pointers like [**PokePointer**](xref:Microsoft.MixedReality.Toolkit.Input.PokePointer) to report touch activity. | [`IMixedRealityTouchHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler)
+
+To handle them you must implement the corresponding interface in your script. Aditionally, if you want your game object to receive the events raised on all game objects instead of just the ones raised on itself and its children, you must register as a global event listener calling [`Register`](xref:Microsoft.MixedReality.Toolkit.IMixedRealityEventSystem.Register*) on the input system.
+
+> [!WARNING]
+> [`IMixedRealityFocusChangedHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityFocusChangedHandler) and [`IMixedRealityFocusHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityFocusHandler) are not raised as global events. You can only handle them in the objects they are raised on.
+
+Alternatively, you can derive your handler script from [`InputSystemGlobalListener`](xref:Microsoft.MixedReality.Toolkit.Input.InputSystemGlobalListener) if you require global registration or from [`BaseInputHandler`](xref:Microsoft.MixedReality.Toolkit.Input.BaseInputHandler) if you want to choose in the inspector whether to register as global listener.
+
+For pointer events, i.e. the ones handled by [`IMixedRealityPointerHandler`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityPointerHandler), we provide further conveniency in the form of [`PointerHandler`](xref:Microsoft.MixedReality.Toolkit.Input.PointerHandler). This script allows you to handle pointer events directly via Unity Events.
+
+
+
+## Pointer Result
+
+The pointer [`Result`](xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityPointer.Result) property contains the current result for the scene query used to determine the object with focus. For a raycast pointer, like the ones created by default for motion controllers, gaze input and hand rays, it will contain the location and normal of the raycast hit.
+
+The *Pointer Result Example* in `MixedRealityToolkit.Examples\Demos\Input\Scenes\PointerResult` shows how to use the pointer Result to spawn an object at the hit location.
+
+
\ No newline at end of file