UX Tools 0.10.0 release notes
This release of the UX Tools supports only HoloLens 2. Support for other MR platforms remains a goal for us but is not the current focus.
Unreal 4.25 required.
What's new
UI elements
The new UxtUIElementComponent allows an actor's visibility to be controlled by its parent actor, allowing for easy construction of hierarchical UIs. The hierarchies can be constructed using actor attachment or child actor components.
UxtPressableButtonComponent, UxtPinchSliderComponent and UxtTouchableVolumeComponent now inherit from UxtUIElementComponent.

Hand menus
Hand menus are a convenient hand-attached UI that are great for frequently used functions. An example level has been added to demonstrate various types of hand menus and to act as a guide for building custom menus.

Tap to Place
Tap to place is a new far interaction component that can be used to easily place primitive components against surfaces. It works with collidable surfaces in the scene, as well as with the spatial mesh.

Surface Magnetism (experimental)
This new component (far interaction only) allows an actor to stick to a surface.
It works both with other actors in the scene

as well as a spatial mesh

Follow component
The follow component now has the ability to maintain a fixed vertical distance from the camera. This can be used to prevent the actor from obstructing the user's vision.

UMG widgets
The new Widget component allows interaction with Unreal Engine's UMG widgets.

Visual Logging
UXTools hand interaction supports visual logging now. This is useful for debugging interactions intuitively in the editor. To enable visual logging simply follow the standard Unreal Editor instructions here.
Currently supported features include:
- Basic hand tracking (joint positions and pointer pose)
- Near pointers (grab and poke)
- Far pointer
- Proximity detection (switching near vs. far)

Breaking changes
BP_BaseButton and derived buttons
BP_BaseButton and the buttons derived from it have been moved to native code.
BP_BaseButtonhas been replaced byAUxtBasePressableButtonActor.BP_ButtonHoloLens2has been replaced byAUxtPressableButtonActor.BP_ButtonHoloLens2Togglehas been replaced byAUxtPressableToggleButtonActor.BP_ButtonHoloLens2ToggleCheckhas been replaced byAUxtPressableCheckButtonActor.BP_ButtonHoloLens2ToggleSwitchhas been replaced byAUxtPressableSwitchButtonActor.
Toggle button state and event dispatchers are now accessible through the UUxtToggleStateComponent instead of directly on the actor.
BP_SimpleSlider
BP_SimpleSlider has been replaced by AUxtPinchSliderActor. It has the same feature set as BP_SimpleSlider and can be extended from either Blueprints or C++.
AUxtPinchSliderActornow faces positive X.
BP_TextActor
BP_TextActor has been replaced by AUxtTextRenderActor. It has the same feature set as BP_TextActor and can be extended from either Blueprints or C++.
EUxtInteractionMode
EUxtInteractionMode has moved from Interactions/UxtManipulationFlags.h to Interactions/UxtInteractionMode.h.
UxtBackPlateComponent
UxtBackPlateComponents now scale correctly when parent components are scaled. Any existing UxtBackPlateComponents may need to have their 'x' and 'z' scales swapped.
Unreal doesn't account for parent child rotations when applying parent child scales, so it was possible to run into situations where scaling the parent would not scale the child back plate appropriately. Before this change back plates where scaled as "height x width x depth" and are now scaled via the Unreal's traditional "depth x width x height" convention. For more information please see the graphics documentation.
UxtBoundsControlComponent
The Preset property of the bounds control component has been replaced with a data asset, which can be more easily copied and customized by users. All six presets exist as data assets in UXTools Content/Bounds Control/Presets. The Config property on existing bounds control components may need to be updated.
- Default: corners resize bounds, edges rotate them.
- Slate2D: only has front side affordances, all of them resize bounds.
- AllResize, AllScale, AllTranslate, AllRotate: have all possible affordances with the same action, mostly for testing.
The preset assets contain a list of affordance configs, each of which consist of
- A placement enum, e.g. "Corner Front Top Left", "Edge Right Bottom".
- The action performed by the affordance (resize, scale, translate, rotate).
- Flag to toggle uniform actions, i.e. allow non-uniform scaling of the bounds.
FUxtBoundsControlAffordanceInfo has been replaced with FUxtAffordanceInstance.
- Data that was available in
FUxtBoundsControlAffordanceInfocan be accessed through it'sConfigproperty.
Bounds control component now uses simple mesh assets for affordances instead of full blueprint classes. The existing static meshes from affordance BPs can continue to be used.
- If the affordances classes (e.g.
CornerAffordanceClass) on a BoundsControlComponent have been customized then the new equivalent mesh property (e.g.CornerAffordanceMesh) needs to be set.
UxtFarPointerComponent
The UxtFarPointerComponent now uses simple collision primitives instead of complex collision primitives for its interactions. Any objects that require the complex collision mesh be used with the far pointer should set the mesh's Collision Complexity to Use Complex Collision As Simple under its collision settings.
UxtFarTarget
The interface for handling far interactions has been moved from IUxtFarTarget into IUxtFarHandler. There are three changes necessary to update classes inheriting from IUxtFarTarget:
- Inherit from
IUxtFarHandleralongsideIUxtFarTarget - Add an implementation for
IUxtFarHandler::CanHandleFarto the class. - Update
IsFarFocusableto be aconstmember function.
UxtFollowComponent
MoveToDefaultDistanceLerpTime has been renamed to LerpTime.
UxtGrabTarget
The interface for handling far interactions has been moved from IUxtGrabTarget into IUxtGrabHandler. There are three changes necessary to update classes inheriting from IUxtGrabTarget:
- Inherit from
IUxtGrabHandleralongsideIUxtGrabTarget - Add an implementation for
IUxtGrabHandler::CanHandleGrabto the class. - Update
IsGrabFocusableto be aconstmember function.
UxtGrabTargetComponent
GetGrabPointCentroidhas been updated to return anFTransforminstead of just a location vector.GetGrabPointCentroidTransformhas been removed. InsteadGetGrabPointCentroidcan be used by passing the target component's world transform.
UxtHandInteractionActor
NearActivationDistance has been removed. The proximity detection is defined by the ProximityCone parameters now.
UxtNearPointerComponent
GetFocusedGrabTarget and GetFocusedPokeTarget now also return the surface normal as an output parameter.
UxtPinchSliderComponent
The UxtPinchSliderComponent has been simplified and streamlined. It now operates on the same principles as the UxtPressableButtonComponent.
Interface changes:
GetCurrentStatehas been renamed toGetState.GetThumbVisuals/SetThumbVisualshas been renamed toGetVisuals/SetVisuals.GetSliderValue/SetSliderValuehave been renamed toGetValue/SetValue.GetSliderLowerBound/SetSliderLowerBoundhave been renamed toGetValueLowerBound/SetValueLowerBound.GetSliderUpperBound/SetSliderUpperBoundhave been renamed toGetValueUpperBound/SetValueUpperBound.IsGrabbed,IsFocusedandIsEnabledhave been removed in favor of usingGetState.- Any references to the track and tick mark visuals have been removed as they are now managed by
AUxtPinchSliderActor. SliderStartDistanceandSliderEndDistancehave been replaced by a singleTrackLengthproperty that dictates the length of the track.
Event changes:
OnBeginInteractionhas been renamed toOnBeginGrab.OnEndInteractionhas been renamed toOnEndGrab.OnSliderEnabledhas been renamed toOnEnable.OnSliderDisabledhas been renamed toOnDisable.
EUxtSliderState changes:
Focushas been renamed toFocused.Grabhas been renamed toGrabbed.
Other changes:
- The min / max positions on the slider have been swapped to make sliders face positive X.
UxtPokeTarget
The interface for handling far interactions has been moved from IUxtPokeTarget into IUxtPokeHandler. There are three changes necessary to update classes inheriting from IUxtPokeTarget:
- Inherit from
IUxtPokeHandleralongsideIUxtPokeTarget - Add an implementation for
IUxtPokeHandler::CanHandlePoketo the class. - Update
IsPokeFocusableto be aconstmember function.