Skip to content

Commit

Permalink
# OpenVR SDK 1.10.30
Browse files Browse the repository at this point in the history
IVRHeadsetView:
* Allows scene applications access the contents of the "VR View" window, including modifying properties of their own instances of that window. See the header file for details.

IVROverlayView:
* Allows applications to read overlay textures and send mouse events to those overlays. See the header file for details.

IVRCompositor:
* Added Submit_FrameDiscontinuity flag which can be passed to Submit to identify a discontinuity with the previous frame (e.g. when the player teleports).  This prevents SteamVR’s Motion Smoothing from being applied using that pair of frames.
* IVRCompositor::Submit – Can now handle DirectX Texture Arrays. Index 0 for the left eye, Index 1 for the right eye

IVRRenderModels:
* Added VRComponentProperty_IsHighlighted, which is set to true for any render model component that should be highlighted for an input binding. 

IVROverlay:
* The DualAnalog input method is no longer supported.
* Added VROverlayFlags_WantsModalBehavior. This flag causes an overlay to get a VREvent_Modal_Cancel event whenever the user clicks off of the overlay. This is ignored for dashboard overlays.
* Added flags for keyboard usage. “minimal mode” is now specified with KeyboardFlag_Minimal.  
* Made modal keyboard behavior optional. To get the behavior from pre-1.10 SDKs, pass KeyboardFlag_Modal.
* Added VREvent_LockMousePosition and VREvent_UnlockMousePosition, which are sent to overlays when a user is laser mousing over the overlay and performs the LockMousePosition compositor action.
* Removed support for rendermodels attached to overlays. This feature is no longer supported.

IVRInput:
* Added global action set priority. When this is enabled in settings, overlay applications can override part or all of the input available to scene applications. See the header file comments for more details.
* Added GetDominandHand/SetDominantHand. This allows an application to flip left and right hands on bindings. Applications that support this must add “supports_dominant_hand_setting” to true in their action manifest file.
* Added GetComponentStateForBinding. This allows applications to get the render model component transform for any component on a render model for a set of input bindings.
* Added GetBindingVariant. This allows applications to provide multiple binding files for a controller type and determine which of them the user currently has selected. The value returned here is the “variant” field from the options block in the binding JSON file.

[git-p4: depot-paths = "//vr/steamvr/sdk_release/": change = 5759046]
  • Loading branch information
JoeLudwig committed Mar 17, 2020
1 parent 39205f6 commit 26fa19e
Show file tree
Hide file tree
Showing 29 changed files with 1,344 additions and 450 deletions.
Binary file modified bin/linux32/libopenvr_api.so
Binary file not shown.
Binary file modified bin/linux32/libopenvr_api.so.dbg
Binary file not shown.
Binary file modified bin/linux64/libopenvr_api.so
Binary file not shown.
Binary file modified bin/linux64/libopenvr_api.so.dbg
Binary file not shown.
Binary file modified bin/win32/openvr_api.dll
Binary file not shown.
Binary file modified bin/win32/openvr_api.dll.sig
Binary file not shown.
Binary file modified bin/win32/openvr_api.pdb
Binary file not shown.
Binary file modified bin/win64/openvr_api.dll
Binary file not shown.
Binary file modified bin/win64/openvr_api.dll.sig
Binary file not shown.
Binary file modified bin/win64/openvr_api.pdb
Binary file not shown.
448 changes: 354 additions & 94 deletions headers/openvr.h

Large diffs are not rendered by default.

504 changes: 397 additions & 107 deletions headers/openvr_api.cs

Large diffs are not rendered by default.

368 changes: 267 additions & 101 deletions headers/openvr_api.json

Large diffs are not rendered by default.

200 changes: 130 additions & 70 deletions headers/openvr_capi.h

Large diffs are not rendered by default.

125 changes: 83 additions & 42 deletions headers/openvr_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
namespace vr
{
static const uint32_t k_nSteamVRVersionMajor = 1;
static const uint32_t k_nSteamVRVersionMinor = 9;
static const uint32_t k_nSteamVRVersionBuild = 16;
static const uint32_t k_nSteamVRVersionMinor = 10;
static const uint32_t k_nSteamVRVersionBuild = 30;
} // namespace vr

// vrtypes.h
Expand Down Expand Up @@ -206,7 +206,7 @@ enum ETrackedControllerRole
TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand
TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand
TrackedControllerRole_OptOut = 3, // Tracked device is opting out of left/right hand selection
TrackedControllerRole_Treadmill = 4, // Tracked device is a treadmill
TrackedControllerRole_Treadmill = 4, // Tracked device is a treadmill or other locomotion device
TrackedControllerRole_Stylus = 5, // Tracked device is a stylus
TrackedControllerRole_Max = 5
};
Expand Down Expand Up @@ -278,6 +278,7 @@ static const PropertyTypeTag_t k_unUint64PropertyTag = 3;
static const PropertyTypeTag_t k_unBoolPropertyTag = 4;
static const PropertyTypeTag_t k_unStringPropertyTag = 5;
static const PropertyTypeTag_t k_unErrorPropertyTag = 6;
static const PropertyTypeTag_t k_unDoublePropertyTag = 7;

static const PropertyTypeTag_t k_unHmdMatrix34PropertyTag = 20;
static const PropertyTypeTag_t k_unHmdMatrix44PropertyTag = 21;
Expand Down Expand Up @@ -450,7 +451,7 @@ enum ETrackedDeviceProperty
Prop_DisplayMinAnalogGain_Float = 2086,
Prop_DisplayMaxAnalogGain_Float = 2087,

Prop_DashboardLayoutPathName_String = 2090,
// Prop_DashboardLayoutPathName_String = 2090, // DELETED
Prop_DashboardScale_Float = 2091,
Prop_IpdUIRangeMinMeters_Float = 2100,
Prop_IpdUIRangeMaxMeters_Float = 2101,
Expand Down Expand Up @@ -629,6 +630,10 @@ enum EVRSubmitFlags
// Set to indicate that pTexture is a pointer to a VRTextureWithDepth_t.
// This flag can be combined with Submit_TextureWithPose to pass a VRTextureWithPoseAndDepth_t.
Submit_TextureWithDepth = 0x10,

// Set to indicate a discontinuity between this and the last frame.
// This will prevent motion smoothing from attempting to extrapolate using the pair.
Submit_FrameDiscontinuty = 0x20,
};

/** Data required for passing Vulkan textures to IVRCompositor::Submit.
Expand Down Expand Up @@ -693,14 +698,14 @@ enum EVREventType
VREvent_ButtonTouch = 202, // data is controller
VREvent_ButtonUntouch = 203, // data is controller

VREvent_DualAnalog_Press = 250, // data is dualAnalog
VREvent_DualAnalog_Unpress = 251, // data is dualAnalog
VREvent_DualAnalog_Touch = 252, // data is dualAnalog
VREvent_DualAnalog_Untouch = 253, // data is dualAnalog
VREvent_DualAnalog_Move = 254, // data is dualAnalog
VREvent_DualAnalog_ModeSwitch1 = 255, // data is dualAnalog
VREvent_DualAnalog_ModeSwitch2 = 256, // data is dualAnalog
VREvent_DualAnalog_Cancel = 257, // data is dualAnalog
// VREvent_DualAnalog_Press = 250, // No longer sent
// VREvent_DualAnalog_Unpress = 251, // No longer sent
// VREvent_DualAnalog_Touch = 252, // No longer sent
// VREvent_DualAnalog_Untouch = 253, // No longer sent
// VREvent_DualAnalog_Move = 254, // No longer sent
// VREvent_DualAnalog_ModeSwitch1 = 255, // No longer sent
// VREvent_DualAnalog_ModeSwitch2 = 256, // No longer sent
VREvent_Modal_Cancel = 257, // Sent to overlays with the

VREvent_MouseMove = 300, // data is mouse
VREvent_MouseButtonDown = 301, // data is mouse
Expand All @@ -712,6 +717,8 @@ enum EVREventType
VREvent_OverlayFocusChanged = 307, // data is overlay, global event
VREvent_ReloadOverlays = 308,
VREvent_ScrollSmooth = 309, // data is scroll
VREvent_LockMousePosition = 310,
VREvent_UnlockMousePosition = 311,

VREvent_InputFocusCaptured = 400, // data is process DEPRECATED
VREvent_InputFocusReleased = 401, // data is process DEPRECATED
Expand Down Expand Up @@ -1092,19 +1099,6 @@ struct VREvent_Property_t
ETrackedDeviceProperty prop;
};

enum EDualAnalogWhich
{
k_EDualAnalog_Left = 0,
k_EDualAnalog_Right = 1,
};

struct VREvent_DualAnalog_t
{
float x, y; // coordinates are -1..1 analog values
float transformedX, transformedY; // transformed by the center and radius numbers provided by the overlay
EDualAnalogWhich which;
};

struct VREvent_HapticVibration_t
{
uint64_t containerHandle; // property container handle of the device with the haptic component
Expand Down Expand Up @@ -1159,6 +1153,7 @@ enum EShowUIType
ShowUI_Settings = 4,
ShowUI_DebugCommands = 5,
ShowUI_FullControllerBinding = 6,
ShowUI_ManageDrivers = 7,
};

struct VREvent_ShowUI_t
Expand Down Expand Up @@ -1207,7 +1202,6 @@ typedef union
VREvent_EditingCameraSurface_t cameraSurface;
VREvent_MessageOverlay_t messageOverlay;
VREvent_Property_t property;
VREvent_DualAnalog_t dualAnalog;
VREvent_HapticVibration_t hapticVibration;
VREvent_WebConsole_t webConsole;
VREvent_InputBindingLoad_t inputBinding;
Expand Down Expand Up @@ -1241,6 +1235,28 @@ struct VREvent_t
#pragma pack( pop )
#endif

typedef uint32_t VRComponentProperties;

enum EVRComponentProperty
{
VRComponentProperty_IsStatic = (1 << 0),
VRComponentProperty_IsVisible = (1 << 1),
VRComponentProperty_IsTouched = (1 << 2),
VRComponentProperty_IsPressed = (1 << 3),
VRComponentProperty_IsScrolled = (1 << 4),
VRComponentProperty_IsHighlighted = (1 << 5),
};


/** Describes state information about a render-model component, including transforms and other dynamic properties */
struct RenderModel_ComponentState_t
{
HmdMatrix34_t mTrackingToComponentRenderModel; // Transform required when drawing the component render model
HmdMatrix34_t mTrackingToComponentLocal; // Transform available for attaching to a local component coordinate system (-Z out from surface )
VRComponentProperties uProperties;
};


enum EVRInputError
{
VRInputError_None = 0,
Expand All @@ -1261,6 +1277,9 @@ enum EVRInputError
VRInputError_MismatchedActionManifest = 15,
VRInputError_MissingSkeletonData = 16,
VRInputError_InvalidBoneIndex = 17,
VRInputError_InvalidPriority = 18,
VRInputError_PermissionDenied = 19,
VRInputError_InvalidRenderModel = 20,
};

enum EVRSpatialAnchorError
Expand Down Expand Up @@ -1377,17 +1396,6 @@ enum ECollisionBoundsStyle
COLLISION_BOUNDS_STYLE_COUNT
};

/** Allows the application to customize how the overlay appears in the compositor */
struct Compositor_OverlaySettings
{
uint32_t size; // sizeof(Compositor_OverlaySettings)
bool curved, antialias;
float scale, distance, alpha;
float uOffset, vOffset, uScale, vScale;
float gridDivs, gridWidth, gridScale;
HmdMatrix44_t transform;
};

/** used to refer to a single VR overlay */
typedef uint64_t VROverlayHandle_t;

Expand Down Expand Up @@ -1486,11 +1494,11 @@ enum EVRSkeletalTrackingLevel
// body part location can be measured directly but with fewer degrees of freedom than the actual body
// part. Certain body part positions may be unmeasured by the device and estimated from other input data.
// E.g. Index Controllers, gloves that only measure finger curl
VRSkeletalTracking_Partial,
VRSkeletalTracking_Partial = 1,

// Body part location can be measured directly throughout the entire range of motion of the body part.
// E.g. Mocap suit for the full body, gloves that measure rotation of each finger segment
VRSkeletalTracking_Full,
VRSkeletalTracking_Full = 2,

VRSkeletalTrackingLevel_Count,
VRSkeletalTrackingLevel_Max = VRSkeletalTrackingLevel_Count - 1
Expand Down Expand Up @@ -1674,15 +1682,18 @@ enum EVRInitError
VRInitError_Compositor_CreateFallbackSyncTexture = 477,
VRInitError_Compositor_ShareFallbackSyncTexture = 478,
VRInitError_Compositor_CreateOverlayIndexBuffer = 479,
VRInitError_Compositor_CreateOverlayVertextBuffer = 480,
VRInitError_Compositor_CreateOverlayVertexBuffer = 480,
VRInitError_Compositor_CreateTextVertexBuffer = 481,
VRInitError_Compositor_CreateTextIndexBuffer = 482,
VRInitError_Compositor_CreateMirrorTextures = 483,
VRInitError_Compositor_CreateLastFrameRenderTexture = 484,
VRInitError_Compositor_CreateMirrorOverlay = 485,
VRInitError_Compositor_FailedToCreateVirtualDisplayBackbuffer = 486,
VRInitError_Compositor_DisplayModeNotSupported = 487,

VRInitError_Compositor_CreateOverlayInvalidCall = 488,
VRInitError_Compositor_CreateOverlayAlreadyInitialized = 489,
VRInitError_Compositor_FailedToCreateMailbox = 490,

VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000,
VRInitError_VendorSpecific_WindowsNotInDevMode = 1001,

Expand Down Expand Up @@ -1862,6 +1873,13 @@ struct Compositor_FrameTiming
uint32_t m_nNumVSyncsToFirstView;
};

/** Provides compositor benchmark results to the app */
struct Compositor_BenchmarkResults
{
float m_flMegaPixelsPerSecond; // Measurement of GPU MP/s performed by compositor benchmark
float m_flHmdRecommendedMegaPixelsPerSecond; // Recommended default MP/s given the HMD resolution, refresh, and panel mask.
};

/** Frame timing data provided by direct mode drivers. */
struct DriverDirectMode_FrameTiming
{
Expand All @@ -1872,6 +1890,12 @@ struct DriverDirectMode_FrameTiming
uint32_t m_nReprojectionFlags;
};

/** These flags will be set on DriverDirectMode_FrameTiming::m_nReprojectionFlags when IVRDriverDirectModeComponent::GetFrameTiming is called for drivers to optionally respond to. */
const uint32_t VRCompositor_ReprojectionMotion_Enabled = 0x100; // Motion Smoothing is enabled in the UI for the currently running application
const uint32_t VRCompositor_ReprojectionMotion_ForcedOn = 0x200; // Motion Smoothing is forced on in the UI for the currently running application
const uint32_t VRCompositor_ReprojectionMotion_AppThrottled = 0x400; // Application is requesting throttling via ForceInterleavedReprojectionOn


enum EVSync
{
VSync_None,
Expand Down Expand Up @@ -2254,6 +2278,8 @@ namespace vr
static const char * const k_pch_SteamVR_CustomIconStyle_String = "customIconStyle";
static const char * const k_pch_SteamVR_CustomOffIconStyle_String = "customOffIconStyle";
static const char * const k_pch_SteamVR_CustomIconForceUpdate_String = "customIconForceUpdate";
static const char * const k_pch_SteamVR_AllowGlobalActionSetPriority = "globalActionSetPriority";
static const char * const k_pch_SteamVR_OverlayRenderQuality = "overlayRenderQuality_2";

//-----------------------------------------------------------------------------
// direct mode keys
Expand Down Expand Up @@ -2387,7 +2413,6 @@ namespace vr
static const char * const k_pch_Dashboard_Section = "dashboard";
static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard";
static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode";
static const char * const k_pch_Dashboard_UseWebKeyboard = "useWebKeyboard";
static const char * const k_pch_Dashboard_UseWebSettings = "useWebSettings";
static const char * const k_pch_Dashboard_Position = "position";
static const char * const k_pch_Dashboard_DesktopScale = "desktopScale";
Expand All @@ -2400,6 +2425,7 @@ namespace vr
//-----------------------------------------------------------------------------
// driver keys - These could be checked in any driver_<name> section
static const char * const k_pch_Driver_Enable_Bool = "enable";
static const char * const k_pch_Driver_BlockedBySafemode_Bool = "blocked_by_safe_mode";
static const char * const k_pch_Driver_LoadPriority_Int32 = "loadPriority";

//-----------------------------------------------------------------------------
Expand All @@ -2420,9 +2446,12 @@ namespace vr
//-----------------------------------------------------------------------------
// per-app keys - the section name for these is the app key itself. Some of these are prefixed by the controller type
static const char* const k_pch_App_BindingAutosaveURLSuffix_String = "AutosaveURL";
static const char* const k_pch_App_BindingLegacyAPISuffix_String = "_legacy";
static const char* const k_pch_App_BindingSteamVRInputAPISuffix_String = "_steamvrinput";
static const char* const k_pch_App_BindingCurrentURLSuffix_String = "CurrentURL";
static const char* const k_pch_App_BindingPreviousURLSuffix_String = "PreviousURL";
static const char* const k_pch_App_NeedToUpdateAutosaveSuffix_Bool = "NeedToUpdateAutosave";
static const char* const k_pch_App_DominantHand_Int32 = "DominantHand";

//-----------------------------------------------------------------------------
// configuration for trackers
Expand Down Expand Up @@ -2915,6 +2944,7 @@ class CVRPropertyHelpers
HmdVector2_t GetVec2Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L );
HmdVector3_t GetVec3Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L );
HmdVector4_t GetVec4Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L );
double GetDoubleProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L );

/** Returns a single typed property. If the device index is not valid or the property is not a string type this function will
* return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
Expand Down Expand Up @@ -2943,6 +2973,7 @@ class CVRPropertyHelpers
ETrackedPropertyError SetVec2Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const HmdVector2_t & vNewValue );
ETrackedPropertyError SetVec3Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const HmdVector3_t & vNewValue );
ETrackedPropertyError SetVec4Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const HmdVector4_t & vNewValue );
ETrackedPropertyError SetDoubleProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, double vNewValue );

/** Sets a string property. The new value will be returned on any subsequent call to get this property in any process. */
ETrackedPropertyError SetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const char *pchNewValue );
Expand Down Expand Up @@ -3125,6 +3156,11 @@ inline float CVRPropertyHelpers::GetFloatProperty( PropertyContainerHandle_t ulC
return GetPropertyHelper<float>( ulContainerHandle, prop, pError, 0.f, k_unFloatPropertyTag );
}

inline double CVRPropertyHelpers::GetDoubleProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError )
{
return GetPropertyHelper<double>( ulContainerHandle, prop, pError, 0., k_unDoublePropertyTag );
}

inline int32_t CVRPropertyHelpers::GetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError )
{
return GetPropertyHelper<int32_t>( ulContainerHandle, prop, pError, 0, k_unInt32PropertyTag );
Expand Down Expand Up @@ -3163,6 +3199,11 @@ inline ETrackedPropertyError CVRPropertyHelpers::SetFloatProperty( PropertyConta
return SetProperty( ulContainerHandle, prop, &fNewValue, sizeof( fNewValue ), k_unFloatPropertyTag );
}

inline ETrackedPropertyError CVRPropertyHelpers::SetDoubleProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, double fNewValue )
{
return SetProperty( ulContainerHandle, prop, &fNewValue, sizeof( fNewValue ), k_unDoublePropertyTag );
}

inline ETrackedPropertyError CVRPropertyHelpers::SetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, int32_t nNewValue )
{
return SetProperty( ulContainerHandle, prop, &nNewValue, sizeof( nNewValue ), k_unInt32PropertyTag );
Expand Down
Binary file modified lib/linux32/libopenvr_api.so
Binary file not shown.
Binary file modified lib/linux64/libopenvr_api.so
Binary file not shown.
Binary file modified lib/win32/openvr_api.lib
Binary file not shown.
Binary file modified lib/win64/openvr_api.lib
Binary file not shown.
Binary file modified samples/bin/linux32/libopenvr_api.so
Binary file not shown.
Binary file modified samples/bin/linux64/libopenvr_api.so
Binary file not shown.
Binary file modified samples/bin/win32/openvr_api.dll
Binary file not shown.
Binary file modified samples/bin/win64/openvr_api.dll
Binary file not shown.
5 changes: 4 additions & 1 deletion src/vrcommon/hmderrors_public.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -281,14 +281,17 @@ const char *GetIDForVRInitError( vr::EVRInitError eError )
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateFallbackSyncTexture );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_ShareFallbackSyncTexture );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayIndexBuffer );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayVertextBuffer );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayVertexBuffer );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateTextVertexBuffer );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateTextIndexBuffer );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateMirrorTextures );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateLastFrameRenderTexture );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateMirrorOverlay );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateVirtualDisplayBackbuffer );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_DisplayModeNotSupported );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayInvalidCall );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayAlreadyInitialized );
RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateMailbox );

// Vendor-specific errors
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_UnableToConnectToOculusRuntime);
Expand Down
5 changes: 3 additions & 2 deletions src/vrcommon/pathtools_public.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -361,8 +361,9 @@ std::string Path_Compact( const std::string & sRawPath, char slash )
std::string::size_type len = sPath.length();
if( sPath[ len-1 ] == '.' && sPath[ len-2 ] == slash )
{
// sPath.pop_back();
sPath[len-1] = 0; // for now, at least
sPath.pop_back();
//Not sure why the following line of code was used for a while. It causes problems with strlen.
//sPath[len-1] = 0; // for now, at least
}
}

Expand Down
Loading

0 comments on commit 26fa19e

Please sign in to comment.