October3d55/M/UltraleapTracking/Source/ThirdParty/LeapSDK/Include/LeapC.h

3307 lines
122 KiB
C

/* Copyright (C) 2012-2022 Ultraleap Limited. All rights reserved.
*
* Use of this code is subject to the terms of the Ultraleap SDK agreement
* available at https://central.leapmotion.com/agreements/SdkAgreement unless
* Ultraleap has signed a separate license agreement with you or your
* organisation.
*
*/
#ifndef _LEAP_C_H
#define _LEAP_C_H
#ifndef LEAP_EXPORT
# ifdef _MSC_VER
# define LEAP_EXPORT __declspec(dllimport)
# else
# define LEAP_EXPORT
# endif
#endif
#ifdef _MSC_VER
# define LEAP_CALL __stdcall
#else
# define LEAP_CALL
#endif
#if defined(__cplusplus) && __cplusplus >= 201103L
# define LEAP_STATIC_ASSERT static_assert
#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
# define LEAP_STATIC_ASSERT _Static_assert
#else
# define LEAP_STATIC_ASSERT(x, y)
#endif
// Define integer types for Visual Studio 2008 and earlier
#if defined(_MSC_VER) && (_MSC_VER < 1600)
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
#else
#include <stdint.h>
#endif
#include <stdbool.h>
#include <stddef.h>
#pragma pack(1)
#ifdef __cplusplus
extern "C" {
#endif
/** \defgroup Functions Functions
* Functions exported by the LeapC library.
* \defgroup Enum Enumerations
* Enumerations used by the LeapC functions and data structures.
* \defgroup Structs Data Structures
* Structs passed to and received from LeapC functions.
*/
/** \ingroup Enum
* Defines the codes returned by all LeapC functions.
* @since 3.0.0
*/
typedef enum _eLeapRS {
/**
* The operation completed successfully.
*/
eLeapRS_Success = 0x00000000,
/**
* An undetermined error has occurred.
* This is usually the result of an abnormal operating condition in LeapC,
* the Ultraleap Tracking Service, or the host computer itself.
* @since 3.0.0
*/
eLeapRS_UnknownError = 0xE2010000,
/**
* An invalid argument was specified.
* @since 3.0.0
*/
eLeapRS_InvalidArgument = 0xE2010001,
/**
* Insufficient resources existed to complete the request.
* @since 3.0.0
*/
eLeapRS_InsufficientResources = 0xE2010002,
/**
* The specified buffer was not large enough to complete the request.
* @since 3.0.0
*/
eLeapRS_InsufficientBuffer = 0xE2010003,
/**
* The requested operation has timed out.
* @since 3.0.0
*/
eLeapRS_Timeout = 0xE2010004,
/**
* The operation is invalid because there is no current connection.
* @since 3.0.0
*/
eLeapRS_NotConnected = 0xE2010005,
/**
* The operation is invalid because the connection is not complete.
* @since 3.0.0
*/
eLeapRS_HandshakeIncomplete = 0xE2010006,
/**
* The specified buffer size is too large.
* @since 3.0.0
*/
eLeapRS_BufferSizeOverflow = 0xE2010007,
/**
* A communications protocol error occurred.
* @since 3.0.0
*/
eLeapRS_ProtocolError = 0xE2010008,
/**
* The server incorrectly specified zero as a client ID.
* @since 3.0.0
*/
eLeapRS_InvalidClientID = 0xE2010009,
/**
* The connection to the service was unexpectedly closed while reading or writing a message.
* The server may have terminated.
* @since 3.0.0
*/
eLeapRS_UnexpectedClosed = 0xE201000A,
/**
* The specified request token does not appear to be valid
*
* Provided that the token value which identifies the request itself was, at one point, valid, this
* error condition occurs when the request to which the token refers has already been satisfied or
* is currently being satisfied.
* @since 3.0.0
*/
eLeapRS_UnknownImageFrameRequest = 0xE201000B,
/**
* The specified frame ID is not valid or is no longer valid
*
* Provided that frame ID was, at one point, valid, this error condition occurs when the identifier
* refers to a frame that occurred further in the past than is currently recorded in the rolling
* frame window.
* @since 3.0.0
*/
eLeapRS_UnknownTrackingFrameID = 0xE201000C,
/**
* The specified timestamp references a future point in time
*
* The related routine can only operate on time points having occurred in the past, and the
* provided timestamp occurs in the future.
* @since 3.1.2
*/
eLeapRS_RoutineIsNotSeer = 0xE201000D,
/**
* The specified timestamp references a point too far in the past
*
* The related routine can only operate on time points occurring within its immediate record of
* the past.
* @since 3.1.2
*/
eLeapRS_TimestampTooEarly = 0xE201000E,
/**
* LeapPollConnection is called concurrently.
* @since 3.1.2
*/
eLeapRS_ConcurrentPoll = 0xE201000F,
/**
* A connection to the Ultraleap Tracking Service could not be established.
@since 3.0.0
*/
eLeapRS_NotAvailable = 0xE7010002,
/**
* The requested operation can only be performed while the device is sending data.
* @since 3.0.0
*/
eLeapRS_NotStreaming = 0xE7010004,
/**
* The specified device could not be opened. It is possible that the device identifier
* is invalid, or that the device has been disconnected since being enumerated.
* @since 3.0.0
*/
eLeapRS_CannotOpenDevice = 0xE7010005,
/**
* The request is not supported by this version of the service.
* @since 5.4.0
*/
eLeapRS_Unsupported = 0xE7010006,
} eLeapRS;
LEAP_STATIC_ASSERT(sizeof(eLeapRS) == 4, "Incorrect enum size");
/** \ingroup Enum
* Enumerates values for the tracking mode.
*/
typedef enum _eLeapTrackingMode {
/** The tracking mode optimised for desktop devices @since 5.0.0 */
eLeapTrackingMode_Desktop = 0,
/** The tracking mode optimised for head-mounted devices @since 5.0.0 */
eLeapTrackingMode_HMD = 1,
/** The tracking mode optimised for screen top-mounted devices @since 5.0.0 */
eLeapTrackingMode_ScreenTop = 2,
/** Tracking mode is not known (allows triggering of a new LEAP_TRACKING_MODE_EVENT) @since 5.0.0 */
eLeapTrackingMode_Unknown = 3
} eLeapTrackingMode;
LEAP_STATIC_ASSERT(sizeof(eLeapTrackingMode) == 4, "Incorrect enum size");
/**
* Evaluates to true if the specified return code is a success code
* @since 3.1.3
*/
#define LEAP_SUCCEEDED(rs) ((rs & 0x80000000) == 0)
/**
* Evaluates to true if the specified return code is a failure code
* @since 3.1.3
*/
#define LEAP_FAILED(rs) ((rs & 0x80000000) != 0)
/** \ingroup Structs
* \struct LEAP_CONNECTION
* A handle to the Leap connection object.
* Use this handle to specify the connection for an operation.
* @since 3.0.0
*/
typedef struct _LEAP_CONNECTION *LEAP_CONNECTION;
/** \ingroup Structs
* \struct LEAP_DEVICE
* A handle to a Leap device object.
* Use this handle to specify the device for an operation.
* @since 3.0.0
*/
typedef struct _LEAP_DEVICE *LEAP_DEVICE;
/** \ingroup Structs
* Represents a calibration object.
* Not currently of any particular use.
* @since 3.0.0
*/
typedef struct _LEAP_CALIBRATION *LEAP_CALIBRATION;
/** \ingroup Structs
* A reference to a Leap device.
*
* Get a LEAP_DEVICE_REF by calling LeapGetDeviceList(). Access a device by
* calling LeapOpenDevice() with this reference. LeapOpenDevice() provides a
* LEAP_DEVICE struct, which is a handle to an open device.
*/
typedef struct _LEAP_DEVICE_REF {
/** An opaque handle. @since 3.0.0 */
void* handle;
/** a generic identifier. @since 3.0.0 */
uint32_t id;
} LEAP_DEVICE_REF;
/** \ingroup Enum
* Defines the type of connection that the client wants to open.
* @since 3.0.0
*/
typedef enum _eLeapConnectionConfig {
/**
* The client is aware of how to handle multiple devices through the API.
* @since 4.1.0
*/
eLeapConnectionConfig_MultiDeviceAware = 0x00000001,
} eLeapConnectionConfig;
LEAP_STATIC_ASSERT(sizeof(eLeapConnectionConfig) == 4, "Incorrect enum size");
typedef enum _eLeapTrackingOrigin {
/**
* A Device Center Origin results in tracking data relative to the center of the hand-tracking cameras.
* @since 5.12.0
*/
eLeapTrackingOrigin_DeviceCenter = 0,
/**
* A Device Primary Camera Origin will give tracking data relative to position and orientation of
* the first hand-tracking camera sensor on a device.
* @since 5.12.0
*/
eLeapTrackingOrigin_DevicePrimaryCamera = 1
} eLeapTrackingOrigin;
LEAP_STATIC_ASSERT(sizeof(eLeapTrackingOrigin) == 4, "Incorrect enum size");
/** \ingroup Structs
* Specifies the configuration for a connection.
* @since 3.0.0
*/
typedef struct _LEAP_CONNECTION_CONFIG {
/** Set to the final size of the structure. @since 3.0.0 */
uint32_t size;
/**
* A combination of eLeapConnectionConfig flags. Set to 0 to indicate no
* special flags. @since 3.0.0
*/
uint32_t flags;
/**
* Specifies the server namespace to be used. Leave NULL to use the default namespace.
*
* Passing valid json with a `tracking_server_ip` and `tracking_server_port` fields
* will change the server ip and port the connection will attempt to connect to.
*
*/
/** For public use. @since 5.12.0 */
const char* server_namespace;
/**
* The client can specify that hand tracking data should be relative to
* the position and orientation of different locations on a device.
*
* The options are described in the eLeapTrackingOrigin enum.
*
* @since 5.12.0
*/
eLeapTrackingOrigin tracking_origin;
} LEAP_CONNECTION_CONFIG;
/** \ingroup Enum
* Defines the various types of data that may be allocated using the allocator.
* @since 4.0.0
*/
typedef enum _eLeapAllocatorType {
/** Signed 8-bit integer (char) @since 4.0.0 */
eLeapAllocatorType_Int8 = 0,
/** Unsigned 8-bit integer (byte) @since 4.0.0 */
eLeapAllocatorType_Uint8 = 1,
/** Signed 16-bit integer @since 4.0.0 */
eLeapAllocatorType_Int16 = 2,
/** Unsigned 16-bit integer @since 4.0.0 */
eLeapAllocatorType_UInt16 = 3,
/** Signed 32-bit integer @since 4.0.0 */
eLeapAllocatorType_Int32 = 4,
/** Unsigned 32-bit integer @since 4.0.0 */
eLeapAllocatorType_UInt32 = 5,
/** Single-precision 32-bit floating-point @since 4.0.0 */
eLeapAllocatorType_Float = 6,
/** Signed 64-bit integer @since 4.0.0 */
eLeapAllocatorType_Int64 = 8,
/** Unsigned 64-bit integer @since 4.0.0 */
eLeapAllocatorType_UInt64 = 9,
/** Double-precision 64-bit floating-point @since 4.0.0 */
eLeapAllocatorType_Double = 10,
} eLeapAllocatorType;
LEAP_STATIC_ASSERT(sizeof(eLeapAllocatorType) == 4, "Incorrect enum size");
/** \ingroup Structs
* Specifies the allocator/deallocator functions to be used when the library
* needs to dynamically manage memory.
* @since 4.0.0
*/
typedef struct LEAP_ALLOCATOR {
/**
* Function pointer to an allocator function that is expected to return a
* pointer to memory of at least the specified size in bytes. This will be
* called when the library needs a block of memory that will be provided
* back to the client in a subsequent event or response. A type hint is
* provided in the case where the underlying buffer type needs to be known
* at allocation time.
*/
void* (*allocate)(uint32_t size, eLeapAllocatorType typeHint, void* state);
/**
* Function pointer to a deallocator function. The function receives the
* address of a previously allocated block of memory from the ``allocate``
* function pointer. The caller is not required to deallocate the memory,
* but rather this call is used by the library to indicate to the client
* that it will no longer reference the memory at this address, and that
* the callee _may_ deallocate the memory when it is ready to do so.
*/
void (*deallocate)(void* ptr, void* state);
/**
* Pointer to state to be passed to the allocate and deallocate functions.
*/
void* state;
} LEAP_ALLOCATOR;
/** \ingroup Functions
* Samples the universal clock used by the system to timestamp image and tracking frames.
*
* The returned counter value is given in microseconds since an epoch time. The clock used for the
* counter itself is implementation-defined, but generally speaking, it is global, monotonic, and
* makes use of the most accurate high-performance counter available on the system.
* @returns microseconds since an unspecified epoch.
* @since 3.0.0
*/
LEAP_EXPORT int64_t LEAP_CALL LeapGetNow(void);
/** \ingroup Functions
* Creates a new LEAP_CONNECTION object.
*
* Pass the LEAP_CONNECTION pointer to LeapOpenConnection() to establish a
* connection to the Ultraleap Tracking Service; and to subsequent operations
* on the same connection.
*
* @param pConfig The configuration to be used with the newly created connection.
* If pConfig is null, a connection is created with a default configuration.
* @param[out] phConnection Receives a pointer to the connection object, set to invalid on failure
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapCreateConnection(const LEAP_CONNECTION_CONFIG* pConfig, LEAP_CONNECTION* phConnection);
/** \ingroup Functions
* Optionally sets connection metadata prior to opening the connection to the service.
*
* This optional function has no functional effect.
*
* If used, this must be called before a call to LeapOpenConnection.
*
* Caller can safely free the memory after the function returns.
*
* Note: Any null characters will be copied into the string if they are within the length defined.
*
* @param hConnection A handle to the connection object, created by LeapCreateConnection().
* @param metadata A char array representing the metadata string.
* @param len The length of the metadata string, not including the null terminator.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.10.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSetConnectionMetadata(LEAP_CONNECTION hConnection, const char* metadata, size_t len);
/** \ingroup Functions
* Opens a connection to the service.
*
* This routine will not block. A connection to the service will not be established until the first
* invocation of LeapPollConnection.
*
* @param hConnection A handle to the connection object, created by LeapCreateConnection().
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapOpenConnection(LEAP_CONNECTION hConnection);
typedef enum _eLeapServiceDisposition {
/**
* The service cannot receive frames fast enough from the underlying hardware.
* @since 3.1.3
*/
eLeapServiceState_LowFpsDetected = 0x00000001,
/**
* The service has paused itself due to an insufficient frame rate from the hardware.
* @since 3.1.3
*/
eLeapServiceState_PoorPerformancePause = 0x00000002,
/**
* The service has failed to start tracking due to unknown reasons.
* @since 5.1.16
*/
eLeapServiceState_TrackingErrorUnknown = 0x00000004,
/**
* The combination of all valid flags in this enumeration
*/
eLeapServiceState_ALL = eLeapServiceState_LowFpsDetected
| eLeapServiceState_PoorPerformancePause
| eLeapServiceState_TrackingErrorUnknown
} eLeapServiceDisposition;
LEAP_STATIC_ASSERT(sizeof(eLeapServiceDisposition) == 4, "Incorrect enum size");
/** \ingroup Structs
* Received from LeapPollConnection() when a connection to the Ultraleap Tracking Service is established.
* @since 3.0.0
*/
typedef struct _LEAP_CONNECTION_EVENT {
/** A combination of eLeapServiceDisposition flags. @since 3.1.3 */
uint32_t flags;
} LEAP_CONNECTION_EVENT;
/** \ingroup Structs
* Received from LeapPollConnection() when a connection to the Ultraleap Tracking Service is lost.
*
* If a LeapC function that performs a transaction with the Ultraleap Tracking Service is called
* after the connection is lost, the next call to LeapPollConnection() will return
* this event. Otherwise, it can take up to 5 seconds of polling the connection to
* receive this event.
* @since 3.0.0
*/
typedef struct _LEAP_CONNECTION_LOST_EVENT {
/** Reserved for future use. @since 3.0.0 */
uint32_t flags;
} LEAP_CONNECTION_LOST_EVENT;
/** \ingroup Enums
* The connection status codes.
* These codes can be read from the LEAP_CONNECTION_INFO struct created by
* a call to LeapGetConnectionInfo().
* @since 3.0.0
*/
typedef enum _eLeapConnectionStatus {
/**
* The connection is not open.
* Call LeapOpenConnection() to open a connection to the Ultraleap Tracking Service.
* @since 3.0.0
*/
eLeapConnectionStatus_NotConnected = 0,
/**
* The connection is open.
* @since 3.0.0
*/
eLeapConnectionStatus_Connected,
/**
* Opening the connection is underway, but not complete.
* @since 3.0.0
*/
eLeapConnectionStatus_HandshakeIncomplete,
/**
* The connection could not be opened because the Ultraleap Tracking Service does not
* appear to be running.
* @since 3.0.0
*/
eLeapConnectionStatus_NotRunning = 0xE7030004
} eLeapConnectionStatus;
LEAP_STATIC_ASSERT(sizeof(eLeapConnectionStatus) == 4, "Incorrect enum size");
/** \ingroup Structs
* Information about a connection.
*
* Call LeapCreateConnection() to generate the handle for the connection;
* call LeapOpenConnection() to establish the connection; then call
* LeapGetConnectionInfo(), which creates this struct, to check the connection status.
* @since 3.0.0
*/
typedef struct _LEAP_CONNECTION_INFO {
/** The size of this structure. @since 3.0.0 */
uint32_t size;
/** The current status of this connection. @since 3.0.0 */
eLeapConnectionStatus status;
} LEAP_CONNECTION_INFO;
/** \ingroup Functions
* Retrieves status information about the specified connection.
*
* Call LeapCreateConnection() to generate the handle for the connection;
* call LeapOpenConnection() to establish the connection; then call
* this function to check the connection status.
*
* @param hConnection The handle of the connection of interest. Created by LeapCreateConnection.
* @param[out] pInfo A pointer to a buffer that receives additional connection information. One input,
* the size field of pInfo is the size of the buffer(i.e. the size of a LEAP_CONNECTION_INFO
* struct); On output, the size field of pInfo receives the size necessary to hold
* the entire information block.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetConnectionInfo(LEAP_CONNECTION hConnection, LEAP_CONNECTION_INFO* pInfo);
/** \ingroup Enum
* Enumerates flags for the service policies.
*/
typedef enum _eLeapPolicyFlag {
/** The policy allowing an application to receive frames in the background. @since 3.0.0 */
eLeapPolicyFlag_BackgroundFrames = 0x00000001,
/** The policy specifying whether to automatically stream images from the device. @since 4.0.0 */
eLeapPolicyFlag_Images = 0x00000002,
/** The policy specifying whether to optimize tracking for head-mounted device. @since 3.0.0 */
eLeapPolicyFlag_OptimizeHMD = 0x00000004,
/** The policy allowing an application to pause or resume service tracking. @since 3.0.0 */
eLeapPolicyFlag_AllowPauseResume = 0x00000008,
/** The policy allowing an application to receive per-frame map points. @since 4.0.0 */
eLeapPolicyFlag_MapPoints = 0x00000080,
/** The policy specifying whether to optimize tracking for screen-top device. @since 5.0.0 */
eLeapPolicyFlag_OptimizeScreenTop = 0x00000100,
} eLeapPolicyFlag;
LEAP_STATIC_ASSERT(sizeof(eLeapPolicyFlag) == 4, "Incorrect enum size");
/** \ingroup Structs
* The response from a request to get or set a policy.
* LeapPollConnection() creates this struct when the response becomes available.
* @since 3.0.0
*/
typedef struct _LEAP_POLICY_EVENT {
/** Reserved for future use. @since 3.0.0 */
uint32_t reserved;
/**
* A bitfield containing the policies effective at the
* time the policy event was processed. @since 3.0.0
*/
uint32_t current_policy;
} LEAP_POLICY_EVENT;
/** \ingroup Structs
* The response from a request to get or set a policy.
* LeapPollConnection() creates this struct when the response becomes available.
* @since 3.0.0
*/
typedef struct _LEAP_TRACKING_MODE_EVENT {
/** Reserved for future use. @since 5.0.0 */
uint32_t reserved;
/**
* An enum specifying the tracking mode effective at the
* time the tracking mode event was processed. @since 5.0.0
*/
eLeapTrackingMode current_tracking_mode;
} LEAP_TRACKING_MODE_EVENT;
/** \ingroup Functions
* Sets or clears one or more policy flags.
*
* Changing policies is asynchronous. After you call this function, a subsequent
* call to LeapPollConnection provides a LEAP_POLICY_EVENT containing the current
* policies, reflecting any changes.
*
* To get the current policies without changes, specify zero for both the set
* and clear parameters. When ready, LeapPollConnection() provides a LEAP_POLICY_EVENT
* containing the current settings.
*
* The eLeapPolicyFlag enumeration defines the policy flags.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param set A bitwise combination of flags to be set. Set to 0 if not setting any flags.
* @param clear A bitwise combination of flags to be cleared. Set to 0 to if not clearing any flags.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSetPolicyFlags(LEAP_CONNECTION hConnection, uint64_t set, uint64_t clear);
/** \ingroup Functions
* Sets or clears one or more policy flags for a particular device.
*
* Changing policies is asynchronous. After you call this function, a subsequent
* call to LeapPollConnection provides a LEAP_POLICY_EVENT containing the current
* policies, reflecting any changes.
*
* To get the current policies without changes, specify zero for both the set
* and clear parameters. When ready, LeapPollConnection() provides a LEAP_POLICY_EVENT
* containing the current settings.
*
* The eLeapPolicyFlag enumeration defines the policy flags.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param set A bitwise combination of flags to be set. Set to 0 if not setting any flags.
* @param clear A bitwise combination of flags to be cleared. Set to 0 if not clearing any flags.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSetPolicyFlagsEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, uint64_t set, uint64_t clear);
/** \ingroup Functions
* Requests a tracking mode.
*
* Changing tracking modes is asynchronous. After you call this function, a subsequent
* call to LeapPollConnection provides a LEAP_POLICY_EVENT containing the current
* policies, reflecting any changes.
*
* The eLeapTrackingMode enumeration defines the tracking mode.
*.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param mode The enum value specifying the requested tracking mode
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSetTrackingMode(LEAP_CONNECTION hConnection, eLeapTrackingMode mode);
/** \ingroup Functions
* Requests a tracking mode for a particular device.
*
* Changing tracking modes is asynchronous. After you call this function, a subsequent
* call to LeapPollConnection provides a LEAP_POLICY_EVENT containing the current
* policies, reflecting any changes.
*
* The eLeapTrackingMode enumeration defines the tracking mode.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param mode The enum value specifying the requested tracking mode.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSetTrackingModeEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, eLeapTrackingMode mode);
/** \ingroup Functions
* Requests the currently set tracking mode.
*
* Requesting the current tracking mode is asynchronous. After you call this function, a subsequent
* call to LeapPollConnection provides a LEAP_TRACKING_MODE_EVENT containing the current
* tracking mode, reflecting any changes.
*
* The eLeapTrackingMode enumeration defines the tracking mode.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetTrackingMode(LEAP_CONNECTION hConnection);
/** \ingroup Functions
* Requests the currently set tracking mode for a particular device.
*
* Requesting the current tracking mode is asynchronous. After you call this function, a subsequent
* call to LeapPollConnection provides a LEAP_TRACKING_MODE_EVENT containing the current
* tracking mode, reflecting any changes.
*
* The eLeapTrackingMode enumeration defines the tracking mode.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetTrackingModeEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice);
/** \ingroup Functions
* Pauses the service
*
* Attempts to pause or unpause the service depending on the argument.
* This is treated as a 'user pause', as though a user had requested a pause through the
* Leap Control Panel. The connection must have the AllowPauseResume policy set
* or it will fail with eLeapRS_InvalidArgument.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param pause Set to 'true' to pause, or 'false' to unpause.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 4.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSetPause(LEAP_CONNECTION hConnection, bool pause);
/** \ingroup Functions
* Sets the allocator functions to use for a particular connection.
*
* If user-supplied allocator functions are not supplied, the functions that require
* dynamic memory allocation will not be available.
*
* @param hConnection A handle to the connection object, created by LeapCreateConnection().
* @param allocator A pointer to a structure containing the allocator functions to be called
* as needed by the library.
* @since 4.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSetAllocator(LEAP_CONNECTION hConnection, const LEAP_ALLOCATOR* allocator);
/** \ingroup Enum
* Identifies the operative data type of a LEAP_VARIANT struct instance.
* @since 3.0.0
*/
typedef enum _eLeapValueType {
/** The type is unknown (which is an abnormal condition). @since 3.0.0 */
eLeapValueType_Unknown,
/** A boolean value. @since 3.0.0 */
eLeapValueType_Boolean,
/** An integer value. @since 3.0.0 */
eLeapValueType_Int32,
/** A floating point value. @since 3.0.0 */
eLeapValueType_Float,
/** A string value. @since 3.0.0 */
eLeapValueType_String,
FORCE_DWORD = 0x7FFFFFFF
} eLeapValueType;
LEAP_STATIC_ASSERT(sizeof(eLeapValueType) == 4, "Incorrect enum size");
/** \ingroup Structs
* A variant data type used to get and set service configuration values.
* @since 3.0.0
*/
typedef struct _LEAP_VARIANT {
/** The active data type in this instance. @since 3.0.0 */
eLeapValueType type;
union {
/** A Boolean value. @since 3.0.0 */
bool boolValue;
/** An integer value. @since 3.0.0 */
int32_t iValue;
/** A floating point value. @since 3.0.0 */
float fValue;
/** A pointer to a string buffer. @since 3.0.0 */
const char* strValue;
};
} LEAP_VARIANT;
/** \ingroup Structs
* Contains the response to a configuration value request.
* Call LeapRequestConfigValue() to request a service config value. The value is
* fetched asynchronously since it requires a service transaction. LeapPollConnection()
* returns this event structure when the request has been processed. Use the requestID
* value to correlate the response to the originating request.
* @since 3.0.0
*/
typedef struct _LEAP_CONFIG_RESPONSE_EVENT {
/** An identifier for correlating the request and response. @since 3.0.0 */
uint32_t requestID;
/**
* The configuration value retrieved from the service. Do not free any memory pointed to by
* this member. The value held is only valid until the next call to LeapPollConnection().
* @since 3.0.0
*/
LEAP_VARIANT value;
} LEAP_CONFIG_RESPONSE_EVENT;
/** \ingroup Structs
* The result of a configuration change request. Contains a status of true for a
* successful change.
* Call LeapSaveConfigValue() to request a service config change. The change is
* performed asynchronously -- and may fail. LeapPollConnection()
* returns this event structure when the request has been processed. Use the requestID
* value to correlate the response to the originating request.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
typedef struct _LEAP_CONFIG_CHANGE_EVENT {
/** An identifier for correlating the request and response. @since 3.0.0 */
uint32_t requestID;
/** The result of the change operation: true on success; false on failure. @since 3.0.0 */
bool status;
} LEAP_CONFIG_CHANGE_EVENT;
/** \ingroup Functions
* Causes the client to commit a configuration change to the Ultraleap Tracking Service.
*
* The change is performed asynchronously -- and may fail. LeapPollConnection()
* returns this event structure when the request has been processed. Use the pRequestID
* value to correlate the response to the originating request.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param key The key of the configuration to commit.
* @param value The value of the configuration to commit.
* @param[out] pRequestID A pointer to a memory location to which the id for this request is written, or nullptr if this value is not needed.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSaveConfigValue(LEAP_CONNECTION hConnection, const char* key, const LEAP_VARIANT* value, uint32_t* pRequestID);
/** \ingroup Functions
* Requests the current value of a service configuration setting.
* The value is fetched asynchronously since it requires a service transaction. LeapPollConnection()
* returns this event structure when the request has been processed. Use the pRequestID
* value to correlate the response to the originating request.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param key The key of the configuration to request
* @param[out] pRequestID A pointer to a memory location to which the id for this request is written.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapRequestConfigValue(LEAP_CONNECTION hConnection, const char* key, uint32_t* pRequestID);
/** \ingroup Functions
* Retrieves a list of Ultraleap Tracking camera devices currently attached to the system.
*
* To get the number of connected devices, call this function with the pArray parameter
* set to null. The number of devices is written to the memory specified by pnArray.
* Use the device count to create an array of LEAP_DEVICE_REF structs large enough to
* hold the number of connected devices. Finally, call LeapGetDeviceList() with this
* array and known count to get the list of Leap devices. A device must be opened with
* LeapOpenDevice() before device properties can be queried.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param[out] pArray A pointer to an array that LeapC fills with the device list.
* @param[in,out] pnArray On input, set to the number of elements in pArray; on output,
* LeapC sets this to the number of valid device handles.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetDeviceList(LEAP_CONNECTION hConnection, LEAP_DEVICE_REF* pArray, uint32_t* pnArray);
/** \ingroup Functions
* Opens a device reference and retrieves a handle to the device.
*
* To ensure resources are properly freed, users must call LeapCloseDevice()
* when finished with the device, even if the retrieved device has problems
* or cannot stream.
*
* @param rDevice A device reference.
* @param[out] phDevice A pointer that receives the opened device handle.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapOpenDevice(LEAP_DEVICE_REF rDevice, LEAP_DEVICE* phDevice);
/** \ingroup Functions
* For a multi-device aware client, sets the device to use in the context of
* non-"Ex" API functions which are logically device-specific but don't provide
* a device parameter.
*
* Automatically subscribes to the specified device (see LeapSubscribeEvents()),
* and if \p unsubscribeOthers is \c true, then unsubscribes from all other devices
* as well (see LeapUnsubscribeEvents()).
*
* Affects future invocations of the following functions:
* - LeapCameraMatrix()
* - LeapDistortionCoeffs()
* - LeapGetFrameSize()
* - LeapInterpolateFrame()
* - LeapInterpolateFrameFromTime()
* - LeapPixelToRectilinear()
* - LeapRectilinearToPixel()
*
* It is not necessary to call this function from a client that does not claim
* to be multi-device-aware (see ::eLeapConnectionConfig and
* ::LeapCreateConnection).
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param unsubscribeOthers If \c true, unsubscribe from all other devices.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSetPrimaryDevice(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, bool unsubscribeOthers);
/** \ingroup Functions
* Subscribe to event messages based on device.
*
* If events from multiple devices are being sent from a service, this function
* allows the client to receive events from the specified device. Clients that
* claim to be multi-device-aware (see ::eLeapConnectionConfig and
* ::LeapCreateConnection) must subscribe to a device to receive various
* device-specific events.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A handle to the device for which events are desired.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapSubscribeEvents(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice);
/** \ingroup Functions
* Unsubscribe from event messages based on device.
*
* If events from multiple devices are being sent from a service, this function
* prevents receiving further events from the specified device that had
* previously been enabled using a call to LeapSubscribeEvents().
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A handle to the device for which events are desired.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapUnsubscribeEvents(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice);
/** \ingroup Enum
* Flags enumerating Leap device capabilities. @since 3.0.0
*/
enum eLeapDeviceCaps {
/** The device can send color images. @since 3.0.0 */
eLeapDeviceCaps_Color = 0x00000001,
};
/** \ingroup Enum
* Device hardware types. @since 3.0.0
*/
typedef enum _eLeapDevicePID {
/** An unknown device that is compatible with the tracking software. @since 3.1.3 */
eLeapDevicePID_Unknown = 0x0000,
/** The Leap Motion Controller (the first consumer peripheral). @since 3.0.0 */
eLeapDevicePID_Peripheral = 0x0003,
/** Internal research product codename "Dragonfly". @since 3.0.0 */
eLeapDevicePID_Dragonfly = 0x1102,
/** Internal research product codename "Nightcrawler". @since 3.0.0 */
eLeapDevicePID_Nightcrawler = 0x1201,
/** Research product codename "Rigel". @since 4.0.0 */
eLeapDevicePID_Rigel = 0x1202,
/** The Ultraleap Stereo IR 170 (SIR170) hand tracking module. @since 5.3.0 */
eLeapDevicePID_SIR170 = 0x1203,
/** The Ultraleap 3Di hand tracking camera. @since 5.3.0 */
eLeapDevicePID_3Di = 0x1204,
/** The Ultraleap Leap Motion Controller 2 hand tracking camera. @since 5.11.0 */
eLeapDevicePID_LMC2 = 0x1206,
/** An invalid device type. Not currently in use. @since 3.1.3 */
eLeapDevicePID_Invalid = 0xFFFFFFFF
} eLeapDevicePID;
LEAP_STATIC_ASSERT(sizeof(eLeapDevicePID) == 4, "Incorrect enum size");
/** \ingroup Structs
* Properties of a Leap device.
* Get a LEAP_DEVICE_INFO by calling LeapGetDeviceInfo() with the handle for
* device. The device must be open.
* @since 3.0.0
**/
typedef struct _LEAP_DEVICE_INFO {
/** Size of this structure. @since 3.0.0 */
uint32_t size;
/** A combination of eLeapDeviceStatus flags. @since 3.0.0 */
uint32_t status;
/** A combination of eLeapDeviceCaps flags. @since 3.0.0 */
uint32_t caps;
/** One of the eLeapDevicePID members. @since 3.0.0 */
eLeapDevicePID pid;
/**
* The device baseline, in micrometers.
*
* The baseline is defined as the distance between the center axis of each lens in a stereo camera
* system. For other camera systems, this value is set to zero.
* @since 3.0.0
*/
uint32_t baseline;
/** The required length of the serial number char buffer including the null character. @since 3.0.0 */
uint32_t serial_length;
/** A pointer to the null-terminated device serial number string. @since 3.0.0 */
char* serial;
/** The horizontal field of view of this device in radians. @since 3.0.0 */
float h_fov;
/** The vertical field of view of this device in radians. @since 3.0.0 */
float v_fov;
/** The maximum range for this device, in micrometers. @since 3.0.0 */
uint32_t range;
} LEAP_DEVICE_INFO;
/** \ingroup Structs
* Properties of a device from the LeapGetServerStatus function call.
* @since 5.8.0
**/
typedef struct _LEAP_SERVER_STATUS_DEVICE {
/** Device's serial number, pointer to a null-terminated string. @since 5.8.0 */
const char* serial;
/** Device's model type, pointer to a null-terminated string. @since 5.8.0 */
const char* type;
} LEAP_SERVER_STATUS_DEVICE;
/** \ingroup Structs
* Properties of the server from the LeapGetServerStatus function call.
* @since 5.8.0
**/
typedef struct _LEAP_SERVER_STATUS {
/** Server's full version string, pointer to a null-terminated string.
* For example: "v5.8.0-ec113355".
* @since 5.8.0
**/
const char* version;
/** Count of devices connected to the server. This is the array size
* pointed to by the "devices" field in this structure.
* @since 5.8.0
**/
uint32_t device_count;
/** Pointer to an array of LEAP_SERVER_STATUS_DEVICEs, the array size
* will match the device_count field.
* @since 5.8.0
**/
const LEAP_SERVER_STATUS_DEVICE* devices;
} LEAP_SERVER_STATUS;
/** \ingroup Functions
* Retrieves server status information without requiring a LeapConnection object
* and a LeapPollConnection tracking loop. This function is for clients that
* want server information but do not want to use the heavier-weight
* LeapPollConnection functions. Typically these would be applications that want
* to check if hand tracking is available before choosing to start hand tracking.
*
* Calling LeapGetServerStatus will synchronously retrieve server status information
* and may block for up to the timeout value.
*
* The status output parameter will remain valid until the client calls
* LeapReleaseServerStatus.
*
* @param timeout The maximum amount of time to wait, in milliseconds.
* @param[out] status Address of a pointer that will be updated to reference a
* LEAP_SERVER_STATUS structure (on eLeapRS_Success)
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.8.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetServerStatus(uint32_t timeout, const LEAP_SERVER_STATUS** status);
/** \ingroup Functions
* Release memory allocations for a LEAP_SERVER_STATUS from an earlier call to
* LeapGetServerStatus.
*
* @param status Pointer to a LEAP_SERVER_STATUS to release.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.8.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapReleaseServerStatus(const LEAP_SERVER_STATUS* status);
/** \ingroup Functions
* Gets device properties.
*
* To get the device serial number, you must supply a LEAP_DEVICE_INFO struct whose
* serial member points to a char array large enough to hold the null-terminated
* serial number string. To get the required length, call LeapGetDeviceInfo() using
* a LEAP_DEVICE_INFO struct that has serial set to NULL. LeapC sets serial_length field of
* the struct to the required length. You can then allocate memory for the string,
* set the serial field, and call this function again.
*
* @param hDevice A handle to the device to be queried.
* @param[out] info The struct to receive the device property data.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetDeviceInfo(LEAP_DEVICE hDevice, LEAP_DEVICE_INFO* info);
/** \ingroup Functions
* Get the transform to world coordinates from 3D Leap coordinates.
*
* To get the transform, you must supply an array of 16 elements.
*
* The function will return a an array representing a 4 x 4 matrix of the form:
*
* R, t
* 0, 1
*
* where:
* R is a 3 x 3 rotation matrix
* t is a 3 x 1 translation vector
*
* Note that the matrix is in column major, e.g. transform[12] corresponds to the x coordinate of the
* translation vector t.
*
* A possible pipeline would be, for example:
* 1) Get "palm_pos" the position of the center of the palm (as a 3x1 vector)
* 2) Construct a 4x1 vector using the palm_position: palm_pos_4 = (palm_pos.x; palm_pos.y; palm_pos.z; 1.0f)
* 3) Create a 4x4 matrix "trans_mat" as illustrated above using the returned transform
* 4) Get the position of the center of the palm in world coordinates by multiplying trans_mat and palm_pos_4:
* center_world_4 = trans_mat * palm_pos_4
*
* This function returns eLeapRS_Unsupported in the case where this functionality is not yet supported.
*
* @param hDevice A handle to the device to be queried.
* @param[out] transform A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetDeviceTransform(LEAP_DEVICE hDevice, float* transform);
/** \ingroup Functions
* Returns whether a device transform is available for the device.
*
* @param hDevice A handle to the device to be queried.
* @returns Returns boolean.
* @since 5.13.0
*/
LEAP_EXPORT bool LEAP_CALL LeapDeviceTransformAvailable(LEAP_DEVICE hDevice);
/** \ingroup Functions
* Get the camera count of the specified device from the hand tracking service.
*
* @param hDevice A handle to the device to be queried.
* @param[out] cameraCount The device's camera count.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.11.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetDeviceCameraCount(LEAP_DEVICE hDevice, uint8_t* cameraCount);
/** \ingroup Structs
* Device event information.
*
* LeapPollConnection() produces a message containing this event when a new
* device is detected. You can use the handle provided by the device filed to
* open a device so that you can access its properties.
*
* This can be used when the connection is set to multi device mode to
* interact with or enable multiple leap devices.
*
* Note that while this struct will contain a device ID via the field
* `device.id`, it is not itself a multi-connection event (so the
* value of device_id in LEAP_CONNECTION_MESSAGE will be 0).
*
* @since 3.0.0
*/
typedef struct _LEAP_DEVICE_EVENT {
/** Reserved for future use. @since 3.0.0 */
uint32_t flags;
/** The handle reference of to the newly attached device. @since 3.0.0 */
LEAP_DEVICE_REF device;
/** The status of the connected device. A combination of flags from the eLeapDeviceStatus collection. */
uint32_t status;
} LEAP_DEVICE_EVENT;
/** \ingroup Enum
* Enumerates the device status codes.
* @since 3.0.0
*/
typedef enum _eLeapDeviceStatus {
/** The device is sending out frames. @since 3.0.0*/
eLeapDeviceStatus_Streaming = 0x00000001,
/** Device streaming has been paused. @since 3.0.0 */
eLeapDeviceStatus_Paused = 0x00000002,
/**
* There are known sources of infrared interference. Device has transitioned to
* robust mode in order to compensate. @since 3.1.3
*/
eLeapDeviceStatus_Robust = 0x00000004,
/** The device's window is smudged, tracking may be degraded. @since 3.1.3 */
eLeapDeviceStatus_Smudged = 0x00000008,
/** The device has entered low-resource mode. @since 4.0.0 */
eLeapDeviceStatus_LowResource = 0x00000010,
/** The device has failed, but the failure reason is not known. @since 3.0.0 */
eLeapDeviceStatus_UnknownFailure = 0xE8010000,
/** The device has a bad calibration record and cannot send frames. @since 3.0.0 */
eLeapDeviceStatus_BadCalibration = 0xE8010001,
/** The device reports corrupt firmware or cannot install a required firmware update. @since 3.0.0 */
eLeapDeviceStatus_BadFirmware = 0xE8010002,
/** The device USB connection is faulty. @since 3.0.0 */
eLeapDeviceStatus_BadTransport = 0xE8010003,
/** The device USB control interfaces failed to initialize. @since 3.0.0 */
eLeapDeviceStatus_BadControl = 0xE8010004,
} eLeapDeviceStatus;
LEAP_STATIC_ASSERT(sizeof(eLeapDeviceStatus) == 4, "Incorrect enum size");
/** \ingroup Structs
* Device failure information.
* LeapPollConnection() produces a message containing this event when a
* device fails. Only partial information may be available. If hDevice is
* non-null, then you can use it to identify the failed device with a known,
* open device.
* @since 3.0.0
*/
typedef struct _LEAP_DEVICE_FAILURE_EVENT {
/** The status of this failure event. @since 3.0.0 */
eLeapDeviceStatus status;
/**
* A handle to the device generating this failure event, if available, otherwise NULL.
*
* You are not responsible for closing this handle.
* @since 3.0.0
*/
LEAP_DEVICE hDevice;
} LEAP_DEVICE_FAILURE_EVENT;
/** \ingroup Structs
* Identifying information for a frame of tracking data. @since 3.0.0
*/
typedef struct _LEAP_FRAME_HEADER {
/** Reserved, set to zero. @since 3.0.0 */
void* reserved;
/**
* A unique identifier for this frame
*
* All frames carrying this frame ID are part of the same unit of processing. This counter
* is generally an increasing counter, but may reset to another value if the user stops and
* restarts streaming.
*
* For interpolated frames, this value corresponds to the identifier of the frame upper bound.
* @since 3.0.0
*/
int64_t frame_id;
/**
* The timestamp for this image, in microseconds, referenced against LeapGetNow().
* @since 3.0.0
*/
int64_t timestamp;
} LEAP_FRAME_HEADER;
/** \ingroup Enum
* Functional image types (not data formats).
*/
typedef enum _eLeapImageType {
/** An invalid or unknown type. @since 3.0.0 */
eLeapImageType_UNKNOWN = 0,
/** Default, processed IR images. @since 3.0.0 */
eLeapImageType_Default,
/** Raw images from the device. @since 3.0.0 */
eLeapImageType_Raw
} eLeapImageType;
LEAP_STATIC_ASSERT(sizeof(eLeapImageType) == 4, "Incorrect enum size");
/** \ingroup Enum
* Image formats.
* @since 3.0.0
*/
typedef enum _eLeapImageFormat {
/** An invalid or unknown format. @since 3.0.0 */
eLeapImageFormat_UNKNOWN = 0,
/** An infrared image. @since 3.0.0 */
eLeapImageFormat_IR = 0x317249,
/** A Bayer RGBIr image with uncorrected RGB channels. @since 3.0.0 */
eLeapImageFormat_RGBIr_Bayer = 0x49425247,
} eLeapImageFormat;
LEAP_STATIC_ASSERT(sizeof(eLeapImageFormat) == 4, "Incorrect enum size");
/** \ingroup Enum
* Camera perspective types.
* @since 3.0.0
*/
typedef enum _eLeapPerspectiveType {
/** An unknown or invalid type. @since 3.0.0 */
eLeapPerspectiveType_invalid = 0,
/** A canonically left image. @since 3.0.0 */
eLeapPerspectiveType_stereo_left = 1,
/** A canonically right image. @since 3.0.0 */
eLeapPerspectiveType_stereo_right = 2,
/** Reserved for future use. @since 3.0.0 */
eLeapPerspectiveType_mono = 3,
} eLeapPerspectiveType;
LEAP_STATIC_ASSERT(sizeof(eLeapPerspectiveType) == 4, "Incorrect enum size");
/** \ingroup Enum
* Camera calibration types.
* @since 3.0.0
*/
typedef enum _eLeapCameraCalibrationType {
/** Infrared calibration (default). @since 4.1.0 */
eLeapCameraCalibrationType_infrared = 0,
/** Visual calibration. @since 4.1.0 */
eLeapCameraCalibrationType_visual = 1,
} eLeapCameraCalibrationType;
LEAP_STATIC_ASSERT(sizeof(eLeapCameraCalibrationType) == 4, "Incorrect enum size");
/** \ingroup Structs
* Properties of a sensor image.
* @since 3.0.0
*/
typedef struct _LEAP_IMAGE_PROPERTIES {
/** The type of this image. @since 3.0.0 */
eLeapImageType type;
/** The format of this image. @since 3.0.0 */
eLeapImageFormat format;
/** The number of bytes per image pixel. @since 3.0.0 */
uint32_t bpp;
/** The number of horizontal pixels in the image. @since 3.0.0 */
uint32_t width;
/** The number of rows of pixels in the image. @since 3.0.0 */
uint32_t height;
/** Reserved for future use. @since 3.0.0 */
float x_scale;
/** Reserved for future use. @since 3.0.0 */
float y_scale;
/** Reserved for future use. @since 3.0.0 */
float x_offset;
/** Reserved for future use. @since 3.0.0 */
float y_offset;
} LEAP_IMAGE_PROPERTIES;
#define LEAP_DISTORTION_MATRIX_N 64
/** \ingroup Structs
* A matrix containing lens distortion correction coordinates.
*
* Each point in the grid contains the coordinates of the pixel in the image buffer that
* contains the data for the pixel in the undistorted image corresponding
* to that point in the grid.
* Interpolate between points in the matrix to correct image pixels that don't
* fall directly underneath a point in the distortion grid.
*
* Current devices use a 64x64 point distortion grid.
* @since 3.0.0
*/
typedef struct _LEAP_DISTORTION_MATRIX {
/** A point in the distortion grid. @since 3.0.0 */
struct {
/** The x-pixel coordinate. @since 3.0.0 */
float x;
/** The y-pixel coordinate. @since 3.0.0 */
float y;
}
/** A grid of 2D points. @since 3.0.0 */
matrix[LEAP_DISTORTION_MATRIX_N][LEAP_DISTORTION_MATRIX_N];
} LEAP_DISTORTION_MATRIX;
/** \ingroup Structs
* Describes the image to request.
* Pass this struct to the LeapImageRequest() function.
* @since 3.0.0
*/
typedef struct _LEAP_IMAGE_FRAME_DESCRIPTION {
/**
* The ID of the frame corresponding to the desired image. @since 3.0.0
*/
int64_t frame_id;
/**
* The type of the desired image. @since 3.0.0
*/
eLeapImageType type;
/**
* Length of your image buffer. The buffer must be large enough to
* hold the request image.
*/
uint64_t buffer_len;
/**
* An allocated buffer large enough to contain the requested image. The buffer
* must remain valid until the image request completes or fails.
* @since 3.0.0
*/
void* pBuffer;
} LEAP_IMAGE_FRAME_DESCRIPTION;
/** \ingroup Structs
* A three element, floating-point vector.
* @since 3.0.0
*/
typedef struct _LEAP_VECTOR {
/** You can access the vector members as either an array or individual float values. */
union {
/** The vector as an array. @since 3.0.0 */
float v[3];
struct {
/** The x spatial coordinate. @since 3.0.0 */
float x;
/** The y spatial coordinate. @since 3.0.0 */
float y;
/** The z spatial coordinate. @since 3.0.0 */
float z;
};
};
} LEAP_VECTOR;
typedef struct _LEAP_MATRIX_3x3 {
LEAP_VECTOR m[3];
} LEAP_MATRIX_3x3;
/** \ingroup Structs
* A four element, floating point quaternion. @since 3.1.2
*/
typedef struct _LEAP_QUATERNION {
union {
/** The quaternion as an array. @since 3.1.3 */
float v[4];
struct {
/** The x coefficient of the vector portion of the quaternion. @since 3.1.2 */
float x;
/** The y coefficient of the vector portion of the quaternion. @since 3.1.2 */
float y;
/** The z coefficient of the vector portion of the quaternion. @since 3.1.2 */
float z;
/** The scalar portion of the quaternion. @since 3.1.2 */
float w;
};
};
} LEAP_QUATERNION;
/** \ingroup Structs
* Describes a bone's position and orientation.
*
* Bones are members of the LEAP_DIGIT struct.
* @since 3.0.0
*/
typedef struct _LEAP_BONE {
/** The base of the bone, closer to the heart. The bones origin. @since 3.0.0 */
LEAP_VECTOR prev_joint;
/** The end of the bone, further from the heart. @since 3.0.0 */
LEAP_VECTOR next_joint;
/** The average width of the flesh around the bone in millimeters. @since 3.0.0 */
float width;
/** Rotation in world space from the forward direction.
* Convert the quaternion to a matrix to derive the basis vectors.
* @since 3.1.2
*/
LEAP_QUATERNION rotation;
} LEAP_BONE;
/** \ingroup Structs
* Describes the digit of a hand.
* Digits are members of the LEAP_HAND struct.
* @since 3.0.0
*/
typedef struct _LEAP_DIGIT {
/** The Leap identifier of this finger. @since 3.0.0 */
int32_t finger_id;
union {
/** All the bones of a digit as an iterable collection. @since 3.0.0 */
LEAP_BONE bones[4];
struct {
/**
* The finger bone wholly inside the hand.
* For thumbs, this bone is set to have zero length and width, an identity basis matrix,
* and its joint positions are equal.
* Note that this is anatomically incorrect; in anatomical terms, the intermediate phalange
* is absent in a real thumb, rather than the metacarpal bone. In the Ultraleap Tracking model,
* however, we use a "zero" metacarpal bone instead for ease of programming.
* @since 3.0.0
*/
LEAP_BONE metacarpal;
/** The phalange extending from the knuckle. @since 3.0.0 */
LEAP_BONE proximal;
/** The bone between the proximal phalange and the distal phalange. @since 3.0.0 */
LEAP_BONE intermediate;
/** The distal phalange terminating at the finger tip. @since 3.0.0 */
LEAP_BONE distal;
};
};
/** Reports whether the finger is more or less straight. @since 3.0.0 */
uint32_t is_extended;
} LEAP_DIGIT;
/** \ingroup Structs
* Properties associated with the palm of the hand.
* The Palm is a member of the LEAP_HAND struct.
* @since 3.0.0
*/
typedef struct _LEAP_PALM {
/**
* The center position of the palm in millimeters from the Ultraleap Tracking camera device origin.
* @since 3.0.0
*/
LEAP_VECTOR position;
/**
* The time-filtered and stabilized position of the palm.
*
* Smoothing and stabilization is performed in order to make
* this value more suitable for interaction with 2D content. The stabilized
* position lags behind the palm position by a variable amount, depending
* primarily on the speed of movement.
* @since 3.0.0
*/
LEAP_VECTOR stabilized_position;
/**
* The rate of change of the palm position in millimeters per second.
* @since 3.0.0
*/
LEAP_VECTOR velocity;
/**
* The normal vector to the palm. If your hand is flat, this vector will
* point downward, or "out" of the front surface of your palm.
* @since 3.0.0
*/
LEAP_VECTOR normal;
/**
* The estimated width of the palm when the hand is in a flat position.
* @since 3.0.0
*/
float width;
/**
* The unit direction vector pointing from the palm position toward the fingers.
* @since 3.0.0
*/
LEAP_VECTOR direction;
/**
* The quaternion representing the palm's orientation
* corresponding to the basis {normal x direction, -normal, -direction}
* @since 3.1.3
*/
LEAP_QUATERNION orientation;
} LEAP_PALM;
/** \ingroup Enum
* The Hand chirality types.
* Used in the LEAP_HAND struct.
* @since 3.0.0
*/
typedef enum _eLeapHandType {
/** A left hand. @since 3.0.0 */
eLeapHandType_Left,
/** A right hand. @since 3.0.0 */
eLeapHandType_Right
} eLeapHandType;
LEAP_STATIC_ASSERT(sizeof(eLeapHandType) == 4, "Incorrect enum size");
/** \ingroup Structs
* Describes a tracked hand. @since 3.0.0
*/
typedef struct _LEAP_HAND {
/**
* A unique ID for a hand tracked across frames.
* If tracking of a physical hand is lost, a new ID is assigned when
* tracking is reacquired.
* @since 3.0.0
*/
uint32_t id;
/**
* Reserved for future use. @since 3.0.0
*/
uint32_t flags;
/**
* Identifies the chirality of this hand. @since 3.0.0
*/
eLeapHandType type;
/**
* How confident we are with a given hand pose. Not currently used (always 1.0).
* @since 3.0.0
*/
float confidence;
/**
* The total amount of time this hand has been tracked, in microseconds.
* @since 3.0.0
*/
uint64_t visible_time;
/**
* The distance between index finger and thumb. @since 3.0.0
*/
float pinch_distance;
/**
* The average angle of fingers to palm. @since 3.0.0
*/
float grab_angle;
/**
* The normalized estimate of the pinch pose - a pinch is between
* the thumb and any other finger.
* Zero is not pinching; one is fully pinched.
* @since 3.0.0
*/
float pinch_strength;
/**
* The normalized estimate of the grab hand pose - a grab is all four fingers
* (excluding thumb) curled towards the palm.
* Zero is not grabbing; one is fully grabbing.
* @since 3.0.0
*/
float grab_strength;
/**
* Additional information associated with the palm. @since 3.0.0
*/
LEAP_PALM palm;
/** The fingers of this hand. @since 3.0.0 */
union {
struct {
/** The thumb. @since 3.0.0 */
LEAP_DIGIT thumb;
/** The index finger. @since 3.0.0 */
LEAP_DIGIT index;
/** The middle finger. @since 3.0.0 */
LEAP_DIGIT middle;
/** The ring finger. @since 3.0.0 */
LEAP_DIGIT ring;
/** The pinky finger. @since 3.0.0 */
LEAP_DIGIT pinky;
};
/** The fingers of the hand as an array. @since 3.0.0 */
LEAP_DIGIT digits[5];
};
/**
* The arm to which this hand is attached.
* An arm consists of a single LEAP_BONE struct.
* @since 3.0.0
*/
LEAP_BONE arm;
} LEAP_HAND;
/** \ingroup Structs
* A snapshot, or frame of data, containing the tracking data for a single moment in time.
* The LEAP_FRAME struct is the container for all the tracking data.
* @since 3.0.0
*/
typedef struct _LEAP_TRACKING_EVENT {
/** A universal frame identification header. @since 3.0.0 */
LEAP_FRAME_HEADER info;
/**
* An identifier for this tracking frame. This identifier is meant to be monotonically
* increasing, but values may be skipped if the client application does not poll for messages
* fast enough. This number also generally increases at the same rate as info.frame_id, but
* if the server cannot process every image received from the device cameras, the info.frame_id
* identifier may increase faster.
* @since 3.0.0
*/
int64_t tracking_frame_id;
/** The number of hands tracked in this frame, i.e. the number of elements in
* the pHands array.
* @since 3.0.0
*/
uint32_t nHands;
/**
* A pointer to the array of hands tracked in this frame.
* @since 3.0.0
*/
LEAP_HAND* pHands;
/**
* Current tracking frame rate in hertz.
*
* This frame rate is distinct from the image frame rate, which is the rate that images are
* being read from the device. Depending on host CPU limitations, the tracking frame rate
* may be substantially less than the device frame rate.
*
* This number is generally equal to or less than the device frame rate, but there is one
* case where this number may be _higher_ than the device frame rate: When the device rate
* drops. In this case, the device frame rate will fall sooner than the tracking frame rate.
*
* This number is equal to zero if there are not enough frames to estimate frame rate.
*
* This number cannot be negative.
* @since 3.0.0
*/
float framerate;
} LEAP_TRACKING_EVENT;
/** \ingroup Enum
* System message severity types. @since 3.0.0
*/
typedef enum _eLeapLogSeverity {
/** The message severity is not known or was not specified. @since 3.0.0 */
eLeapLogSeverity_Unknown = 0,
/** A message about a fault that could render the software or device non-functional. @since 3.0.0 */
eLeapLogSeverity_Critical,
/** A message warning about a condition that could degrade device capabilities. @since 3.0.0 */
eLeapLogSeverity_Warning,
/** A system status message. @since 3.0.0 */
eLeapLogSeverity_Information
} eLeapLogSeverity;
LEAP_STATIC_ASSERT(sizeof(eLeapLogSeverity) == 4, "Incorrect enum size");
/** \ingroup Structs
* A system log message. @since 3.0.0
*/
typedef struct _LEAP_LOG_EVENT {
/** The type of message. @since 4.0.0 */
eLeapLogSeverity severity;
/**
* The timestamp of the message in microseconds.
* Compare with the current values of LeapGetNow() and the system clock to
* calculate the absolute time of the message.
* @since 4.0.0
*/
int64_t timestamp;
/**
* A pointer to a null-terminated string containing the current log message.
* @since 4.0.0
*/
const char* message;
} LEAP_LOG_EVENT;
typedef struct _LEAP_LOG_EVENTS {
/** The number of log events being pointed to by the events field.
* @since 4.0.0
*/
uint32_t nEvents;
/** An array of ``nEvent`` LEAP_LOG_EVENT structures.
* @since 4.0.0
*/
LEAP_LOG_EVENT* events;
} LEAP_LOG_EVENTS;
/** \ingroup Structs
* A notification that a device's status has changed. One of these messages is received by the client
* as soon as the service is connected, or when a new device is attached.
* @since 3.1.3
*/
typedef struct _LEAP_DEVICE_STATUS_CHANGE_EVENT {
/** A reference to the device whose status has changed */
LEAP_DEVICE_REF device;
/** The last known status of the device. This is a combination of eLeapDeviceStatus flags. @since 3.1.3*/
uint32_t last_status;
/** The current status of the device. This is a combination of eLeapDeviceStatus flags. @since 3.1.3*/
uint32_t status;
} LEAP_DEVICE_STATUS_CHANGE_EVENT;
typedef enum _eLeapDroppedFrameType {
eLeapDroppedFrameType_PreprocessingQueue,
eLeapDroppedFrameType_TrackingQueue,
eLeapDroppedFrameType_Other
} eLeapDroppedFrameType;
LEAP_STATIC_ASSERT(sizeof(eLeapDroppedFrameType) == 4, "Incorrect enum size");
typedef struct _LEAP_DROPPED_FRAME_EVENT {
int64_t frame_id;
eLeapDroppedFrameType type;
} LEAP_DROPPED_FRAME_EVENT;
/** \ingroup Structs
* An image associated with a frame of data.
* @since 4.0.0
*/
typedef struct _LEAP_IMAGE {
/** The properties of the received image. */
LEAP_IMAGE_PROPERTIES properties;
/**
* A version number for the distortion matrix. When the distortion matrix
* changes, this number is updated. This number is guaranteed not to repeat
* for the lifetime of the connection. This version number is also guaranteed
* to be distinct for each perspective of an image.
*
* This value is guaranteed to be nonzero if it is valid.
*
* The distortion matrix only changes when the streaming device changes or when the
* device orientation flips -- inverting the image and the distortion grid.
* Since building a matrix to undistort an image can be a time-consuming task,
* you can optimize the process by only rebuilding this matrix (or whatever
* data type you use to correct image distortion) when the grid actually changes.
*/
uint64_t matrix_version;
/** Pointers to the camera's distortion matrix. */
LEAP_DISTORTION_MATRIX* distortion_matrix;
/** A pointer to the image data. */
void* data;
/** Offset, in bytes, from the beginning of the data ptr to the actual beginning of the image data */
uint32_t offset;
} LEAP_IMAGE;
typedef struct _LEAP_POINT_MAPPING_CHANGE_EVENT {
/** The ID of the frame corresponding to the source of the currently tracked points. @since 4.0.0 */
int64_t frame_id;
/** The timestamp of the frame, in microseconds, referenced against LeapGetNow(). @since 4.0.0 */
int64_t timestamp;
/** The number of points being tracked. @since 4.0.0 */
uint32_t nPoints;
} LEAP_POINT_MAPPING_CHANGE_EVENT;
typedef struct _LEAP_POINT_MAPPING {
/** The ID of the frame corresponding to the source of the currently tracked points. @since 4.0.0 */
int64_t frame_id;
/** The timestamp of the frame, in microseconds, referenced against LeapGetNow(). @since 4.0.0 */
int64_t timestamp;
/** The number of points being tracked. @since 4.0.0 */
uint32_t nPoints;
/** The 3D points being mapped. @since 4.0.0 */
LEAP_VECTOR* pPoints;
/** The IDs of the 3D points being mapped. @since 4.0.0 */
uint32_t* pIDs;
} LEAP_POINT_MAPPING;
typedef struct _LEAP_HEAD_POSE_EVENT {
/**
* The timestamp for this image, in microseconds, referenced against LeapGetNow().
* @since 4.1.0
*/
int64_t timestamp;
/**
* The position and orientation of the user's head. Positional tracking must be enabled.
* @since 4.1.0
*/
LEAP_VECTOR head_position;
LEAP_QUATERNION head_orientation;
/**
* The linear and angular velocity of the user's head. Positional tracking must be enabled.
* @since 4.1.0
*/
LEAP_VECTOR head_linear_velocity;
LEAP_VECTOR head_angular_velocity;
} LEAP_HEAD_POSE_EVENT;
typedef struct _LEAP_EYE_EVENT {
/**
* The ID of the frame corresponding to the source of the currently tracked
* eye positions.
* @since 4.1.0
*/
int64_t frame_id;
/**
* The timestamp for this image, in microseconds, referenced against
* LeapGetNow().
* @since 4.1.0
*/
int64_t timestamp;
/**
* The position of the user's left eye.
* @since 4.1.0
*/
LEAP_VECTOR left_eye_position;
/**
* The position of the user's right eye.
* @since 4.1.0
*/
LEAP_VECTOR right_eye_position;
/**
* An error estimate of the tracked left eye position. Higher values indicate
* uncertain tracking and a higher likelihood of there being no such eye in
* view of the sensor.
* @since 4.1.0
*/
float left_eye_estimated_error;
/**
* An error estimate of the tracked right eye position. Higher values indicate
* uncertain tracking and a higher likelihood of there being no such eye in
* view of the sensor.
* @since 4.1.0
*/
float right_eye_estimated_error;
} LEAP_EYE_EVENT;
typedef enum _eLeapIMUFlag {
/** Has accelerometer measurements. @since 4.1.0 */
eLeapIMUFlag_HasAccelerometer = 0x00000001,
/** Has gyroscope measurements. @since 4.1.0 */
eLeapIMUFlag_HasGyroscope = 0x00000002,
/** Has a temperature measurement. @since 4.1.0 */
eLeapIMUFlag_HasTemperature = 0x00000004,
} eLeapIMUFlag;
LEAP_STATIC_ASSERT(sizeof(eLeapIMUFlag) == 4, "Incorrect enum size");
typedef struct _LEAP_IMU_EVENT {
/**
* The timestamp for these measurements, in microseconds, referenced against
* LeapGetNow().
* @since 4.1.0
*/
int64_t timestamp;
/**
* The timestamp for these measurements, in microseconds, referenced against
* the device's internal clock.
* @since 4.1.0
*/
int64_t timestamp_hw;
/**
* A combination of eLeapIMUFlag flags.
* @since 4.1.0
*/
uint32_t flags;
/**
* The accelerometer measurements, in m/s^2.
* @since 4.1.0
*/
LEAP_VECTOR accelerometer;
/**
* The gyroscope measurements, in rad/s.
* @since 4.1.0
*/
LEAP_VECTOR gyroscope;
/**
* The measured temperature, in deg C.
* @since 4.1.0
*/
float temperature;
} LEAP_IMU_EVENT;
typedef struct _LEAP_NEW_DEVICE_TRANSFORM {
/** Reserved for future use. @since 5.13.0 */
uint32_t reserved;
} LEAP_NEW_DEVICE_TRANSFORM;
/** \ingroup Structs
* Streaming stereo image pairs from the device.
*
* LeapPollConnection() produces this message when an image is available.
* The struct contains image properties, the distortion grid, and a pointer to
* the buffer containing the image data -- which was allocated using the allocator
* function passed to LeapC using the LeapSetAllocator.
* @since 4.0.0
*/
typedef struct _LEAP_IMAGE_EVENT {
/** The information header identifying the images tracking frame. */
LEAP_FRAME_HEADER info;
/** The left and right images. */
LEAP_IMAGE image[2];
/** For internal use only. */
LEAP_CALIBRATION calib;
} LEAP_IMAGE_EVENT;
/** \ingroup Enum
* The types of event messages resulting from calling LeapPollConnection().
* @since 3.0.0
*/
typedef enum _eLeapEventType {
/**
* No event has occurred within the timeout period specified when calling LeapPollConnection().
* @since 3.0.0
*/
eLeapEventType_None = 0,
/**
* A connection to the Ultraleap Tracking Service has been established.
* This event is stored in union member connection_event (LEAP_CONNECTION_EVENT).
* @since 3.0.0
*/
eLeapEventType_Connection,
/**
* The connection to the Ultraleap Tracking Service has been lost.
* This event is stored in union member connection_lost_event (LEAP_CONNECTION_LOST_EVENT).
* @since 3.0.0
*/
eLeapEventType_ConnectionLost,
/**
* A device has been detected or plugged-in.
* A device event is dispatched after a connection is established for any
* devices already plugged in. (The system currently only supports one
* streaming device at a time.)
* This event is stored in union member device_event (LEAP_DEVICE_EVENT).
* @since 3.0.0
*/
eLeapEventType_Device,
/**
* A device has failed.
* Device failure could be caused by hardware failure, USB controller issues, or
* other system instability. Note that unplugging a device generates an
* eLeapEventType_DeviceLost event message, not a failure message.
* This event is no longer generated, enum present for historic API compatibility.
* @since 3.0.0
*/
eLeapEventType_DeviceFailure,
/**
* A policy change has occurred.
* This can be due to setting a policy with LeapSetPolicyFlags() or due to changing
* or policy-related config settings, including images_mode.
* (A user can also change these policies using the Ultraleap Tracking Control Panel.)
* This event is stored in union member policy_event (LEAP_POLICY_EVENT).
* @since 3.0.0
*/
eLeapEventType_Policy,
/**
* A tracking frame. The message contains the tracking data for the frame.
* This event is stored in union member tracking_mode_event (LEAP_TRACKING_MODE_EVENT).
* @since 3.0.0
*/
eLeapEventType_Tracking = 0x100,
/**
* The request for an image has failed.
* The message contains information about the failure. The client application
* will not receive the requested image set.
* This event is no longer generated, enum present for historic API compatibility.
* @since 3.0.0
*/
eLeapEventType_ImageRequestError,
/**
* The request for an image is complete.
* The image data has been completely written to the application-provided
* buffer.
* This event is no longer generated, enum present for historic API compatibility.
* @since 3.0.0
*/
eLeapEventType_ImageComplete,
/**
* A system message. @since 3.0.0
* This event is stored in union member log_event (LEAP_LOG_EVENT).
*/
eLeapEventType_LogEvent,
/**
* The device connection has been lost.
*
* This event is generally asserted when the device has been detached from the system, when the
* connection to the service has been lost, or if the device is closed while streaming. Generally,
* any event where the system can conclude no further frames will be received will result in this
* message. The DeviceEvent field will be filled with the id of the formerly attached device.
* This event is stored in union member device_event (LEAP_DEVICE_EVENT).
* @since 3.0.0
*/
eLeapEventType_DeviceLost,
/**
* The asynchronous response to a call to LeapRequestConfigValue().
* Contains the value of requested configuration item.
* This event is stored in union member config_response_event (LEAP_CONFIG_RESPONSE_EVENT).
* @since 3.0.0
*/
eLeapEventType_ConfigResponse,
/**
* The asynchronous response to a call to LeapSaveConfigValue().
* Reports whether the change succeeded or failed.
* This event is stored in union member config_change_event (LEAP_CONFIG_CHANGE_EVENT).
* @since 3.0.0
*/
eLeapEventType_ConfigChange,
/**
* Notification that a status change has been detected on an attached device
* This event is stored in union member device_status_change_event (LEAP_DEVICE_STATUS_CHANGE_EVENT).
* @since 3.1.3
*/
eLeapEventType_DeviceStatusChange,
eLeapEventType_DroppedFrame,
/**
* Notification that an unrequested stereo image pair is available
* This event is stored in union member image_event (LEAP_IMAGE_EVENT).
* @since 4.0.0
*/
eLeapEventType_Image,
/**
* Notification that point mapping has changed
* This event is no longer generated, enum present for historic API compatibility.
*
* @since 4.0.0
*/
eLeapEventType_PointMappingChange,
/**
* A tracking mode change has occurred.
* This can be due to changing the hmd or screentop policy with LeapSetPolicyFlags().
* or setting the tracking mode using LeapSetTrackingMode().
* This event is stored in union member tracking_mode_event (LEAP_TRACKING_MODE_EVENT).
* @since 5.0.0
*/
eLeapEventType_TrackingMode,
/**
* An array of system messages. @since 4.0.0
* This event is stored in union member log_events (LEAP_LOG_EVENTS).
*/
eLeapEventType_LogEvents,
/**
* A head pose. The message contains the timestamped head position and orientation.
* This event is no longer generated, enum present for historic API compatibility.
* @since 4.1.0
*/
eLeapEventType_HeadPose,
/**
* Tracked eye positions. @since 4.1.0
* This event is no longer generated, enum present for historic API compatibility.
*/
eLeapEventType_Eyes,
/**
* An IMU reading. @since 4.1.0
* This event is stored in union member imu_event (LEAP_IMU_EVENT).
*/
eLeapEventType_IMU,
/**
* Notification that the service received a new device transformation matrix
* Use LeapGetDeviceTransform to update your cached information.
*
* @since 5.13.0
*/
eLeapEventType_NewDeviceTransform
} eLeapEventType;
LEAP_STATIC_ASSERT(sizeof(eLeapEventType) == 4, "Incorrect enum size");
/** \ingroup Structs
* Defines a basic message from the LeapC message queue.
* Set by calling LeapPollConnection().
* @since 3.0.0
*/
typedef struct _LEAP_CONNECTION_MESSAGE {
/**
* The size of this message struct. @since 3.0.0
*/
uint32_t size;
/**
* The message type. @since 3.0.0
*/
eLeapEventType type;
/**
* A pointer to the event data for the current type of message. @since 3.0.0
*/
union {
/** An untyped pointer. @since 3.0.0 */
const void* pointer;
/** A connection message. @since 3.0.0 */
const LEAP_CONNECTION_EVENT* connection_event;
/** A connection lost. @since 3.0.0 */
const LEAP_CONNECTION_LOST_EVENT* connection_lost_event;
/** A device detected message. @since 3.0.0 */
const LEAP_DEVICE_EVENT* device_event;
/** A device's status has changed. @since 3.1.3 */
const LEAP_DEVICE_STATUS_CHANGE_EVENT* device_status_change_event;
/** A policy message. @since 3.0.0 */
const LEAP_POLICY_EVENT* policy_event;
/** A device failure message. @since 3.0.0 */
const LEAP_DEVICE_FAILURE_EVENT* device_failure_event;
/** A tracking message. @since 3.0.0 */
const LEAP_TRACKING_EVENT* tracking_event;
/** A tracking mode message. @since 5.0.0 */
const LEAP_TRACKING_MODE_EVENT* tracking_mode_event;
/** A log message. @since 3.0.0 */
const LEAP_LOG_EVENT* log_event;
/** A log messages. @since 4.0.0 */
const LEAP_LOG_EVENTS* log_events;
/** A get config value message. @since 3.0.0 */
const LEAP_CONFIG_RESPONSE_EVENT* config_response_event;
/** A set config value message. @since 3.0.0 */
const LEAP_CONFIG_CHANGE_EVENT* config_change_event;
const LEAP_DROPPED_FRAME_EVENT* dropped_frame_event;
/** A streaming image message. @since 4.0.0 */
const LEAP_IMAGE_EVENT* image_event;
/** A point mapping message. @since 4.0.0 */
const LEAP_POINT_MAPPING_CHANGE_EVENT* point_mapping_change_event;
/** A head pose message. @since 4.1.0 */
const LEAP_HEAD_POSE_EVENT* head_pose_event;
/** An eye positions message for both the left and right eyes. @since 4.1.0 */
const LEAP_EYE_EVENT* eye_event;
/** An IMU message. @since 4.1.0 */
const LEAP_IMU_EVENT* imu_event;
/** A notification message. @since 5.13.0 */
const LEAP_NEW_DEVICE_TRANSFORM* new_device_transform_event;
};
/** A unique ID for the attached device that sent this message. A value of
* 0 indicates that it was a system-wide message, and not device specific.
* Use this ID to distinguish messages sent from multiple attached devices.
* @since 4.1.0
*/
uint32_t device_id;
} LEAP_CONNECTION_MESSAGE;
/** \ingroup Functions
* Polls the connection for a new event.
*
* The specific types of events that may be received are not configurable in this entrypoint. Configure
* the device or connection object directly to change what events will be received.
*
* Pointers in the retrieved event message structure will be valid until the associated connection or device is
* closed, or the next call to LeapPollConnection().
*
* Calling this method concurrently will return eLeapRS_ConcurrentPoll.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param timeout The maximum amount of time to wait, in milliseconds. If this value is zero,
* the evt pointer references the next queued message, if there is one, and returns immediately.
* @param[out] evt A pointer to a structure that is filled with event information. This structure will be valid
* as long as the LEAP_CONNECTION object is valid.
*
* @returns The operation result code, a member of the eLeapRS enumeration. If the operation
* times out, this method will return eLeapRS_Timeout. The evt pointer will reference a
* message of type eLeapEventType_None.
* @since 3.0.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapPollConnection(LEAP_CONNECTION hConnection, uint32_t timeout, LEAP_CONNECTION_MESSAGE* evt);
/** \ingroup Functions
* Retrieves the number of bytes required to allocate an interpolated frame at the specified time.
*
* Use this function to determine the size of the buffer to allocate when calling
* LeapInterpolateFrame().
* @param hConnection The connection handle created by LeapCreateConnection().
* @param timestamp The timestamp of the frame whose size is to be queried.
* @param[out] pncbEvent A pointer that receives the number of bytes required to store the specified frame.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.1.1
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetFrameSize(LEAP_CONNECTION hConnection, int64_t timestamp, uint64_t* pncbEvent);
/** \ingroup Functions
* Retrieves the number of bytes required to allocate an interpolated frame at the specified time
* for a particular device.
*
* Use this function to determine the size of the buffer to allocate when calling
* LeapInterpolateFrameEx().
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param timestamp The timestamp of the frame whose size is to be queried.
* @param[out] pncbEvent A pointer that receives the number of bytes required to store the specified frame.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetFrameSizeEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, int64_t timestamp, uint64_t* pncbEvent);
/** \ingroup Functions
* Constructs a frame at the specified timestamp by interpolating between measured
* frames.
*
* Caller is responsible for allocating a buffer large enough to hold the data of the frame.
* Use LeapGetFrameSize() to calculate the minimum size of this buffer.
*
* Use LeapCreateClockRebaser(), LeapUpdateRebase(), and LeapRebaseClock() to
* synchronize time measurements in the application with time measurements in
* the Ultraleap Tracking Service. This process is required to achieve accurate, smooth
* interpolation.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param timestamp The timestamp at which to interpolate the frame data.
* @param[out] pEvent A pointer to a flat buffer which is filled with an interpolated frame.
* @param ncbEvent The number of bytes pointed to by pEvent.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.1.1
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapInterpolateFrame(LEAP_CONNECTION hConnection, int64_t timestamp, LEAP_TRACKING_EVENT* pEvent, uint64_t ncbEvent);
/** \ingroup Functions
* Constructs a frame at the specified timestamp for a particular device by
* interpolating between measured frames.
*
* Caller is responsible for allocating a buffer large enough to hold the data of the frame.
* Use LeapGetFrameSizeEx() to calculate the minimum size of this buffer.
*
* Use LeapCreateClockRebaser(), LeapUpdateRebase(), and LeapRebaseClock() to
* synchronize time measurements in the application with time measurements in
* the Ultraleap Tracking Service. This process is required to achieve accurate, smooth
* interpolation.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param timestamp The timestamp at which to interpolate the frame data.
* @param[out] pEvent A pointer to a flat buffer which is filled with an interpolated frame.
* @param ncbEvent The number of bytes pointed to by pEvent.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapInterpolateFrameEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, int64_t timestamp, LEAP_TRACKING_EVENT* pEvent, uint64_t ncbEvent);
/** \ingroup Functions
* Constructs a frame at the specified timestamp by interpolating between a frame near the timestamp
* and a frame near the sourceTimestamp.
*
* Caller is responsible for allocating a buffer large enough to hold the data of the frame.
* Use LeapGetFrameSize() to calculate the minimum size of this buffer.
*
* Use LeapCreateClockRebaser(), LeapUpdateRebase(), and LeapRebaseClock() to
* synchronize time measurements in the application with time measurements in
* the Ultraleap Tracking Service. This process is required to achieve accurate, smooth
* interpolation.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param timestamp The timestamp to which to interpolate the frame data.
* @param sourceTimestamp The timestamp of the beginning frame from which to interpolate the frame data.
* @param[out] pEvent A pointer to a flat buffer which is filled with an interpolated frame.
* @param ncbEvent The number of bytes pointed to by pEvent.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.1.1
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapInterpolateFrameFromTime(LEAP_CONNECTION hConnection, int64_t timestamp, int64_t sourceTimestamp, LEAP_TRACKING_EVENT* pEvent, uint64_t ncbEvent);
/** \ingroup Functions
* Constructs a frame at the specified timestamp for a particular device by
* interpolating between a frame near the timestamp and a frame near the
* sourceTimestamp.
*
* Caller is responsible for allocating a buffer large enough to hold the data of the frame.
* Use LeapGetFrameSizeEx() to calculate the minimum size of this buffer.
*
* Use LeapCreateClockRebaser(), LeapUpdateRebase(), and LeapRebaseClock() to
* synchronize time measurements in the application with time measurements in
* the Ultraleap Tracking Service. This process is required to achieve accurate, smooth
* interpolation.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param timestamp The timestamp to which to interpolate the frame data.
* @param sourceTimestamp The timestamp of the beginning frame from which to interpolate the frame data.
* @param[out] pEvent A pointer to a flat buffer which is filled with an interpolated frame.
* @param ncbEvent The number of bytes pointed to by pEvent.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.4.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapInterpolateFrameFromTimeEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, int64_t timestamp, int64_t sourceTimestamp, LEAP_TRACKING_EVENT* pEvent, uint64_t ncbEvent);
/** \ingroup Functions
* Get the frequency the default device is providing the hand tracking service with images.
* @sa LeapGetDeviceFrameRateEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param[out] framesPerSecond The device frame rate.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.8.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetDeviceFrameRate(LEAP_CONNECTION hConnection, float* framesPerSecond);
/** \ingroup Functions
* Get the frequency the device is providing the hand tracking service with images.
*
* This is only implemented for some devices. In case of missing implementation, the function will
* return a frequency of 0.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A handle to the device to be queried.
* @param[out] framesPerSecond The given device frame rate.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.8.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetDeviceFrameRateEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, float* framesPerSecond);
/** \ingroup Functions
* Closes a device handle previously opened with LeapOpenDevice.
*
* @param hDevice The device handle to close.
* @since 3.0.0
*/
LEAP_EXPORT void LEAP_CALL LeapCloseDevice(LEAP_DEVICE hDevice);
/** \ingroup Functions
* Closes a previously opened connection.
*
* This method closes the specified connection object if it is opened
*
* This method never fails.
*
* @param hConnection A handle to the connection object to be closed.
* @since 4.0.0
*/
LEAP_EXPORT void LEAP_CALL LeapCloseConnection(LEAP_CONNECTION hConnection);
/** \ingroup Functions
* Destroys a previously opened connection.
*
* This method closes the specified connection object if it is opened, destroys the underlying
* object, and releases all resources associated with it.
*
* This method never fails.
*
* Be sure that no other functions are accessing the connection when this function is called.
*
* @param hConnection A handle to the connection object to be destroyed.
* @since 3.0.0
*/
LEAP_EXPORT void LEAP_CALL LeapDestroyConnection(LEAP_CONNECTION hConnection);
/** \ingroup Structs
* \struct LEAP_CLOCK_REBASER
* An opaque clock rebase state structure. @since 3.1.2
*/
typedef struct _LEAP_CLOCK_REBASER *LEAP_CLOCK_REBASER;
/** \ingroup Functions
* Initializes a new Leap clock-rebaser handle object.
*
* Pass the filled-in LEAP_CLOCK_REBASER object to calls to LeapUpdateRebase(),
* LeapRebaseClock(), and LeapDestroyClockRebaser().
*
* @param[out] phClockRebaser The pointer to the clock-rebaser object to be initialized.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.1.2
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapCreateClockRebaser(LEAP_CLOCK_REBASER* phClockRebaser);
/** \ingroup Functions
* Updates the relationship between the Ultraleap Tracking Service clock and the user clock.
*
* When using LeapInterpolateFrame(), call this function for every graphics frame
* rendered by your application. The function should be called as close to the
* actual point of rendering as possible.
*
* The relationship between the application clock and the Ultraleap Tracking Service clock is
* neither fixed nor stable. Simulation restarts can cause user clock values to change
* instantaneously. Certain systems simulate slow motion, or respond to heavy load, by reducing the tick rate
* of the user clock. As a result, the LeapUpdateRebase() function must be called for every rendered frame.
*
* @param hClockRebaser The handle to a rebaser object created by LeapCreateClockRebaser().
* @param userClock A clock value supplied by the application, sampled at about the same time as LeapGetNow() was sampled.
* @param leapClock The Ultraleap Tracking Service clock value sampled by a call to LeapGetNow().
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.1.2
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapUpdateRebase(LEAP_CLOCK_REBASER hClockRebaser, int64_t userClock, int64_t leapClock);
/** \ingroup Functions
* Computes the Ultraleap Tracking Service clock corresponding to a specified application clock value.
*
* Use this function to translate your application clock to the Ultraleap Tracking Service clock
* when interpolating frames. LeapUpdateRebase() must be called for every rendered
* frame for the relationship between the two clocks to remain synchronized.
*
* @param hClockRebaser The handle to a rebaser object created by LeapCreateClockRebaser().
* @param userClock The clock in microseconds referenced to the application clock.
* @param[out] pLeapClock The corresponding Ultraleap Tracking Service clock value.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.1.2
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapRebaseClock(LEAP_CLOCK_REBASER hClockRebaser, int64_t userClock, int64_t* pLeapClock);
/** \ingroup Functions
* Destroys a previously created clock-rebaser object.
*
* This method destroys the specified clock-rebaser object, and releases all resources associated with it.
*
* @param hClockRebaser A handle to the clock-rebaser object to be destroyed.
* @since 3.1.2
*/
LEAP_EXPORT void LEAP_CALL LeapDestroyClockRebaser(LEAP_CLOCK_REBASER hClockRebaser);
/** \ingroup Functions
* This finds the default device and returns the result of LeapPixelToRectilinearEx()
* @sa LeapPixelToRectilinearEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param pixel A Vector containing the position of a pixel in the image.
* @returns A Vector containing the ray direction (the z-component of the vector is always 1).
* May return [NaN, NaN, 1] (quiet NaN type) under the following conditions:
* *) You do not have a valid connection or device handle.
* *) You passed an invalid camera enum.
* *) You have never received any images from LeapC as detailed above.
* @since 3.1.3
*/
LEAP_EXPORT LEAP_VECTOR LEAP_CALL LeapPixelToRectilinear(LEAP_CONNECTION hConnection, eLeapPerspectiveType camera, LEAP_VECTOR pixel);
/** \ingroup Functions
* This converts the camera perspective to an index and returns the result of LeapPixelToRectilinearByIndexEx()
* @sa LeapPixelToRectilinearByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param pixel A Vector containing the position of a pixel in the image.
* @returns A Vector containing the ray direction (the z-component of the vector is always 1).
* May return [NaN, NaN, 1] (quiet NaN type) under the following conditions:
* *) You do not have a valid connection or device handle.
* *) You passed an invalid camera enum.
* *) You have never received any images from LeapC as detailed above.
*
* @since 5.4.0
*/
LEAP_EXPORT LEAP_VECTOR LEAP_CALL LeapPixelToRectilinearEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, eLeapPerspectiveType camera, LEAP_VECTOR pixel);
/** \ingroup Functions
* This finds the default device and returns the result of LeapPixelToRectilinearByIndexEx()
* @sa LeapPixelToRectilinearByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param cameraIndex The index of the camera to use
* @param pixel A Vector containing the position of a pixel in the image.
* @returns A Vector containing the ray direction (the z-component of the vector is always 1).
* May return [NaN, NaN, 1] (quiet NaN type) under the following conditions:
* *) You do not have a valid connection or device handle.
* *) You passed an invalid camera index.
* *) You have never received any images from LeapC as detailed above.
*
* @since 5.8.0
*/
LEAP_EXPORT LEAP_VECTOR LEAP_CALL LeapPixelToRectilinearByIndex(LEAP_CONNECTION hConnection, uint8_t cameraIndex, LEAP_VECTOR pixel);
/** \ingroup Functions
* Provides the corrected camera ray intercepting the specified point
* on the image for a particular device.
*
* Given a point on the image, ``LeapPixelToRectilinearByIndex()`` corrects for camera distortion
* and returns the true direction from the camera to the source of that image point
* within the Devices field of view.
*
* This direction vector has an x and y component [x, y, 1], with the third element
* always 1. Note that this vector uses the 2D camera coordinate system
* where the x-axis parallels the longer (typically horizontal) dimension and
* the y-axis parallels the shorter (vertical) dimension. The camera coordinate
* system does not correlate to the 3D Ultraleap coordinate system.
*
* For this function to work, you must have fetched at least 1 image from the LeapC polling event loop,
* i.e. call LeapSetPolicyFlags(eLeapPolicyFlag_Images, 0), and received one LEAP_IMAGE_EVENT type
* for your given device handle.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param cameraIndex The index of the camera to use
* @param pixel A Vector containing the position of a pixel in the image.
* @returns A Vector containing the ray direction (the z-component of the vector is always 1).
* May return [NaN, NaN, 1] (quiet NaN type) under the following conditions:
* *) You do not have a valid connection or device handle.
* *) You passed an invalid camera index.
* *) You have never received any images from LeapC as detailed above.
*
* @since 5.8.0
*/
LEAP_EXPORT LEAP_VECTOR LEAP_CALL LeapPixelToRectilinearByIndexEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, uint8_t cameraIndex, LEAP_VECTOR pixel);
/** \ingroup Functions
* This finds the default device and returns the result of LeapRectilinearToPixelEx()
* @sa LeapRectilinearToPixelEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param rectilinear A Vector containing the ray direction.
* @returns A Vector containing the pixel coordinates [x, y, 1] (with z always 1).
* May return [NaN, NaN, 1] (quiet NaN type) under the following conditions:
* *) You do not have a valid connection or device handle.
* *) You passed an invalid camera enum.
* *) You have never received any images from LeapC as detailed above.
*
* @since 3.1.3
*/
LEAP_EXPORT LEAP_VECTOR LEAP_CALL LeapRectilinearToPixel(LEAP_CONNECTION hConnection, eLeapPerspectiveType camera, LEAP_VECTOR rectilinear);
/** \ingroup Functions
* This converts the camera perspective to an index and returns the result of LeapRectilinearToPixelByIndexEx()
* @sa LeapRectilinearToPixelByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param rectilinear A Vector containing the ray direction.
* @returns A Vector containing the pixel coordinates [x, y, 1] (with z always 1).
* May return [NaN, NaN, 1] (quiet NaN type) under the following conditions:
* *) You do not have a valid connection or device handle.
* *) You passed an invalid camera enum.
* *) You have never received any images from LeapC as detailed above.
*
* @since 5.4.0
*/
LEAP_EXPORT LEAP_VECTOR LEAP_CALL LeapRectilinearToPixelEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, eLeapPerspectiveType camera, LEAP_VECTOR rectilinear);
/** \ingroup Functions
* This finds the default device and returns the result of LeapRectilinearToPixelByIndexEx()
* @sa LeapRectilinearToPixelByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param cameraIndex The index of the camera to use
* @param rectilinear A Vector containing the ray direction.
* @returns A Vector containing the pixel coordinates [x, y, 1] (with z always 1).
* May return [NaN, NaN, 1] (quiet NaN type) under the following conditions:
* *) You do not have a valid connection or device handle.
* *) You passed an invalid camera index.
* *) You have never received any images from LeapC as detailed above.
*
* @since 5.8.0
*/
LEAP_EXPORT LEAP_VECTOR LEAP_CALL LeapRectilinearToPixelByIndex(LEAP_CONNECTION hConnection, uint8_t cameraIndex, LEAP_VECTOR rectilinear);
/** \ingroup Functions
* Provides the point in the image corresponding to a ray projecting
* from the camera for a particular device.
*
* Given a ray projected from the camera in the specified direction, ``LeapRectilinearToPixelByIndex()``
* corrects for camera distortion and returns the corresponding pixel
* coordinates in the image.
*
* The ray direction is specified in relationship to the camera. The first
* vector element is the tangent of the "horizontal" view angle; the second
* element is the tangent of the "vertical" view angle.
*
* The ``LeapRectilinearToPixelByIndex()`` function returns pixel coordinates outside of the image bounds
* if you project a ray toward a point for which there is no recorded data.
*
* ``LeapRectilinearToPixelByIndex()`` is typically not fast enough for realtime distortion correction.
* For better performance, use a shader program executed on a GPU.
*
* For this function to work, you must have fetched at least 1 image from the LeapC polling event loop,
* i.e. call LeapSetPolicyFlags(eLeapPolicyFlag_Images, 0), and received one LEAP_IMAGE_EVENT type
* for your given device handle.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param cameraIndex The index of the camera to use
* @param rectilinear A Vector containing the ray direction.
* @returns A Vector containing the pixel coordinates [x, y, 1] (with z always 1).
* May return [NaN, NaN, 1] (quiet NaN type) under the following conditions:
* *) You do not have a valid connection or device handle.
* *) You passed an invalid camera index.
* *) You have never received any images from LeapC as detailed above.
*
* @since 5.8.0
*/
LEAP_EXPORT LEAP_VECTOR LEAP_CALL LeapRectilinearToPixelByIndexEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, uint8_t cameraIndex, LEAP_VECTOR rectilinear);
/** \ingroup Functions
* Returns an OpenCV-compatible camera matrix.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param[out] dest A pointer to a single-precision float array of size 9
* @since 3.2.1
*/
LEAP_EXPORT void LEAP_CALL LeapCameraMatrix(LEAP_CONNECTION hConnection, eLeapPerspectiveType camera, float* dest);
/** \ingroup Functions
* Returns an OpenCV-compatible camera matrix for a particular device.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param[out] dest A pointer to a single-precision float array of size 9
* @since 5.4.0
*/
LEAP_EXPORT void LEAP_CALL LeapCameraMatrixEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, eLeapPerspectiveType camera, float* dest);
/** \ingroup Functions
* Returns an OpenCV-compatible camera matrix for a particular device.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param cameraIndex The index of the camera to use
* @param[out] dest A pointer to a single-precision float array of size 9
* @since 5.8.0
*/
LEAP_EXPORT void LEAP_CALL LeapCameraMatrixByIndex(LEAP_CONNECTION hConnection, uint8_t cameraIndex, float* dest);
/** \ingroup Functions
* Returns an OpenCV-compatible camera matrix for a particular device.
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param cameraIndex The index of the camera to use
* @param[out] dest A pointer to a single-precision float array of size 9
* @since 5.8.0
*/
LEAP_EXPORT void LEAP_CALL LeapCameraMatrixByIndexEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, uint8_t cameraIndex, float* dest);
/** \ingroup Functions
* This finds the default device and returns the result LeapExtrinsicCameraMatrixEx()
* @sa LeapExtrinsicCameraMatrixEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param[out] dest A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order
* @since 5.1.0
*/
LEAP_EXPORT void LEAP_CALL LeapExtrinsicCameraMatrix(LEAP_CONNECTION hConnection, eLeapPerspectiveType camera, float* dest);
/** \ingroup Functions
* This converts the camera perspective to an index and returns the result of LeapExtrinsicCameraMatrixByIndexEx()
* @sa LeapExtrinsicCameraMatrixByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param[out] dest A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order
* @since 5.1.0
*/
LEAP_EXPORT void LEAP_CALL LeapExtrinsicCameraMatrixEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, eLeapPerspectiveType camera, float* dest);
/** \ingroup Functions
* This finds the default device and returns the result of LeapPixelToRectilinearByIndexEx()
* @sa LeapPixelToRectilinearByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param cameraIndex The index of the camera to use
* @param[out] dest A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order
* @since 5.8.0
*/
LEAP_EXPORT void LEAP_CALL LeapExtrinsicCameraMatrixByIndex(LEAP_CONNECTION hConnection, uint8_t cameraIndex, float* dest);
/** \ingroup Functions
*
* Returns a transformation matrix from the coordinate system of the requested camera to 3D Leap coordinate space
* This is composed of a 4 x 4 matrix of the form:
*
* R, t <br>
* 0, 1
*
* R is a 3 x 3 rotation matrix <br>
* t is a 3 x 1 translation vector
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param cameraIndex The index of the camera to use
* @param[out] dest A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order
* @since 5.8.0
*/
LEAP_EXPORT void LEAP_CALL LeapExtrinsicCameraMatrixByIndexEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, uint8_t cameraIndex, float* dest);
/** \ingroup Functions
* This finds the default device and returns the result of LeapDistortionCoeffsEx()
* @sa LeapDistortionCoeffsEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param[out] dest A pointer to a single-precision float array of size 8.
* @since 3.2.1
*/
LEAP_EXPORT void LEAP_CALL LeapDistortionCoeffs(LEAP_CONNECTION hConnection, eLeapPerspectiveType camera, float* dest);
/** \ingroup Functions
* This converts the camera perspective to an index and returns the result of LeapDistortionCoeffsByIndexEx()
* @sa LeapDistortionCoeffsByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param[out] dest A pointer to a single-precision float array of size 8.
* @since 5.4.0
*/
LEAP_EXPORT void LEAP_CALL LeapDistortionCoeffsEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, eLeapPerspectiveType camera, float* dest);
/** \ingroup Functions
* This finds the default device and returns the result of LeapDistortionCoeffsByIndexEx()
* @sa LeapDistortionCoeffsByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param cameraIndex The index of the camera to use
* @param[out] dest A pointer to a single-precision float array of size 8.
* @since 5.8.0
*/
LEAP_EXPORT void LEAP_CALL LeapDistortionCoeffsByIndex(LEAP_CONNECTION hConnection, uint8_t cameraIndex, float* dest);
/** \ingroup Functions
* Returns an OpenCV-compatible lens distortion for a particular device, using
* the 8-parameter rational model.
*
* The order of the returned array is: [k1, k2, p1, p2, k3, k4, k5, k6]
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param cameraIndex The index of the camera to use
* @param[out] dest A pointer to a single-precision float array of size 8.
* @since 5.8.0
*/
LEAP_EXPORT void LEAP_CALL LeapDistortionCoeffsByIndexEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, uint8_t cameraIndex, float* dest);
/** \ingroup Functions
* Provides the human-readable canonical name of the specified device model.
*
* This method is guaranteed to never return null for the LEAP_DEVICE_INFO.pid field
* returned by a successful call to LeapGetDeviceInfo
*
* @param pid The pid of the device
* @returns The string name of the device model, or null if the device type string is invalid.
*
*/
LEAP_EXPORT const char* LEAP_CALL LeapDevicePIDToString(eLeapDevicePID pid);
/** \ingroup Enum
* Defines the recording mode provided to the LeapRecordingOpen()
* function. Also used in members of LEAP_RECORDING_PARAMETERS and LEAP_RECORDING_STATUS.
* @since 3.2.0
*/
typedef enum _eLeapRecordingFlags {
eLeapRecordingFlags_Error = 0x00000000,
eLeapRecordingFlags_Reading = 0x00000001,
eLeapRecordingFlags_Writing = 0x00000002,
eLeapRecordingFlags_Flushing = 0x00000004,
eLeapRecordingFlags_Compressed = 0x00000008
} eLeapRecordingFlags;
LEAP_STATIC_ASSERT(sizeof(eLeapRecordingFlags) == 4, "Incorrect enum size");
/** \ingroup Structs
* A Leap recording.
* @since 3.2.0
*/
typedef struct _LEAP_RECORDING *LEAP_RECORDING;
/** \ingroup Structs
* Read/Write mode for opening a LEAP_RECORDING.
* since 3.2.0
*/
typedef struct _LEAP_RECORDING_PARAMETERS {
/** A combination of eLeapRecordingFlags indicating the desired operations. @since 3.2.0 */
uint32_t mode;
} LEAP_RECORDING_PARAMETERS;
/** \ingroup Structs
* Information about a current LEAP_RECORDING.
* Filled in by a call to LeapRecordingGetStatus().
* @since 3.2.0
*/
typedef struct _LEAP_RECORDING_STATUS {
/** Some combination of eLeapRecordingFlags indicating the status of the recording. @since 3.2.0 */
uint32_t mode;
} LEAP_RECORDING_STATUS;
/** \ingroup Functions
* Opens or creates a LEAP_RECORDING.
*
* Pass the LEAP_RECORDING pointer to LeapRecordingOpen() to initiate reading from
* or writing to a recording. The recording path is relative to the "user path"
* which is the SD card on Android.
*
* @param ppRecording The recording being opened.
* @param filePath The file path. This will be passed directly to the OS without modification. An ".lmt" suffix is suggested.
* @param params The LEAP_RECORDING_PARAMETERS describing what operations are requested.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.2.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapRecordingOpen(LEAP_RECORDING* ppRecording, const char* filePath, LEAP_RECORDING_PARAMETERS params);
/** \ingroup Functions
* Closes a LEAP_RECORDING.
*
* @param[out] ppRecording The recording being closed. Will modify *ppRecording to be null.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.2.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapRecordingClose(LEAP_RECORDING* ppRecording);
/** \ingroup Functions
* Fills in a LEAP_RECORDING_STATUS struct for an open recording.
* This struct provides the applicable eLeapRecordingFlags.
*
* @param pRecording The open recording.
* @param[out] pstatus A LEAP_RECORDING_STATUS struct to receive the recording status.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.2.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapRecordingGetStatus(LEAP_RECORDING pRecording, LEAP_RECORDING_STATUS* pstatus);
/** \ingroup Functions
* Retrieves the number of bytes required to allocate the next frame in a recording.
*
* Use this function to determine the size of the buffer to allocate before calling
* LeapRecordingRead().
*
* @param pRecording The recording being read from.
* @param[out] pncbEvent A pointer that receives the number of bytes required to store the next frame.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.2.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapRecordingReadSize(LEAP_RECORDING pRecording, uint64_t* pncbEvent);
/** \ingroup Functions
* Reads a tracking frame from a LEAP_RECORDING file.
*
* Caller is responsible for allocating a buffer large enough to hold the data of the frame.
* Use LeapGetFrameSize() to calculate the minimum size of this buffer.
*
* @param pRecording The recording being read from.
* @param[out] pEvent A pointer to a flat buffer which is filled with the next recorded frame.
* @param ncbEvent The number of bytes pointed to by pEvent.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.2.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapRecordingRead(LEAP_RECORDING pRecording, LEAP_TRACKING_EVENT* pEvent, uint64_t ncbEvent);
/** \ingroup Functions
* Writes a tracking frame to a LEAP_RECORDING file.
*
* @param pRecording The recording being written to.
* @param[out] pEvent A pointer to a flat buffer which is filled with an interpolated frame.
* @param pnBytesWritten If non-null the number of bytes written.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 3.2.0
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapRecordingWrite(LEAP_RECORDING pRecording, LEAP_TRACKING_EVENT* pEvent, uint64_t* pnBytesWritten);
/** \ingroup Functions
* This finds the default device and returns the result of LeapScaleOffsetMatrixEx()
* @sa LeapScaleOffsetMatrixEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param[out] dest A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order
* @since 5.x.x
*/
LEAP_EXPORT void LEAP_CALL LeapScaleOffsetMatrix(LEAP_CONNECTION hConnection, eLeapPerspectiveType camera, float* dest);
/** \ingroup Functions
*
* This converts the camera perspective to an index and returns the result of LeapScaleOffsetMatrixByIndexEx()
* @sa LeapScaleOffsetMatrixByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param camera The camera to use, a member of the eLeapPerspectiveType enumeration
* @param[out] dest A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order
* @since 5.x.x
*/
LEAP_EXPORT void LEAP_CALL LeapScaleOffsetMatrixEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, eLeapPerspectiveType camera, float* dest);
/** \ingroup Functions
* This finds the default device and returns the result of LeapScaleOffsetMatrixByIndexEx()
* @sa LeapScaleOffsetMatrixByIndexEx for additional information
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param cameraIndex The index of the camera to use
* @param[out] dest A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order
* @since 5.8.0
*/
LEAP_EXPORT void LEAP_CALL LeapScaleOffsetMatrixByIndex(LEAP_CONNECTION hConnection, uint8_t cameraIndex, float* dest);
/** \ingroup Functions
*
* Returns the appropriate scale and offset coefficients required to project
* normalised Rectilinear coordinates to image-scale coordinates.
*
* This is composed of a 4 x 4 matrix of the form:
*
* scale_x, 0, 0, offset_x,
* 0, 1, 0, 0,
* 0, 0, scale_z, offset_z
* 0, 0, 0, 1
*
* This matrix is specific to the size of the current image as contained within LEAP_IMAGE.
*
* In practical terms, use this matrix in combination with normalised rays
* to project 3D points into a rectilinear image space (i.e. to visualise hands on an undistorted image).
*
* The pipeline would be:
* 1) Take 3D points from hand tracking.
* 2) Apply an extrinsic transformation to a specific camera's coordinate system
* 3) Apply a perspective division to transform 3D points to rays.
* 4) Apply the ScaleOffset matrix to these points.
*
* These points will now be in the correct coordinate system consistent with the undistorted rectilinear image
* provided by LEAP_IMAGE::distortion_matrix.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param cameraIndex The index of the camera to use
* @param[out] dest A pointer to a single-precision float array of size 16, containing
* the coefficients of the 4x4 matrix in Column Major order
* @since 5.8.0
*/
LEAP_EXPORT void LEAP_CALL LeapScaleOffsetMatrixByIndexEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, uint8_t cameraIndex, float* dest);
/** \ingroup Enum
* Defines the parameters used to access version information.
* @since 5.2.x
*/
typedef enum _eLeapVersionPart {
/**
* The parameter for requesting the version of the client.
* @since 5.2.x
*/
eLeapVersionPart_ClientLibrary = 0,
/**
* The parameter for requesting the protocol version of the client.
* @since 5.2.x
*/
eLeapVersionPart_ClientProtocol = 1,
/**
* The parameter for requesting the version of the server.
* @since 5.2.x
*/
eLeapVersionPart_ServerLibrary = 2,
/**
* The parameter for requesting the protocol version of the server.
* @since 5.2.x
*/
eLeapVersionPart_ServerProtocol = 3,
} eLeapVersionPart;
LEAP_STATIC_ASSERT(sizeof(eLeapVersionPart) == 4, "Incorrect enum size");
/** \ingroup Structs
* Version information.
*
* The members can be converted to a version string using the format:
*
* major.minor.patch.build
*
* @since 5.2.0
*/
typedef struct _LEAP_VERSION {
/**
* The major version.
* @since 5.2.0
*/
int32_t major;
/**
* The minor version.
* @since 5.2.0
*/
int32_t minor;
/**
* The patch version.
* @since 5.2.0
*/
int32_t patch;
} LEAP_VERSION;
/** \ingroup Functions
*
* Returns the version of a specified part of the system.
*
* If an invalid connection handle is provided only the version details of the client will be available.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param versionPart The version part to return, this will reference one part of the system.
* @param[out] pVersion A pointer to a struct used to store the version number.
* @returns The operation result code, a member of the eLeapRS enumeration.
* @since 5.2.x
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetVersion(LEAP_CONNECTION hConnection, eLeapVersionPart versionPart, LEAP_VERSION* pVersion);
/**
* Not Supported:
*
* The following functions are included for API compatibility with earlier LeapC version.
* They are no longer supported and calling them will have no effects.
*/
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetPointMappingSize(LEAP_CONNECTION hConnection, uint64_t* pSize);
LEAP_EXPORT eLeapRS LEAP_CALL LeapGetPointMapping(LEAP_CONNECTION hConnection, LEAP_POINT_MAPPING* pointMapping, uint64_t* pSize);
typedef struct _LEAP_TELEMETRY_DATA {
uint32_t thread_id;
uint64_t start_time;
uint64_t end_time;
uint32_t zone_depth;
const char* file_name;
uint32_t line_number;
const char* zone_name;
} LEAP_TELEMETRY_DATA;
LEAP_EXPORT eLeapRS LEAP_CALL LeapTelemetryProfiling(LEAP_CONNECTION hConnection, const LEAP_TELEMETRY_DATA* telemetryData);
LEAP_EXPORT uint64_t LEAP_CALL LeapTelemetryGetNow();
LEAP_EXPORT eLeapRS LEAP_CALL LeapInterpolateHeadPose(LEAP_CONNECTION hConnection, int64_t timestamp, LEAP_HEAD_POSE_EVENT* pEvent);
LEAP_EXPORT eLeapRS LEAP_CALL LeapInterpolateHeadPoseEx(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, int64_t timestamp, LEAP_HEAD_POSE_EVENT* pEvent);
LEAP_EXPORT eLeapRS LEAP_CALL LeapInterpolateEyePositions(LEAP_CONNECTION hConnection, int64_t timestamp, LEAP_EYE_EVENT* pEvent);
/**
* Public Hints
*
* Hints a client may pass to the server to influence hand tracking settings and behaviour.
*
* Some hints will represent an "Axis" (e.g. application type) where values are mutually exclusive.
* But other hints may not be explicitly on an axis (e.g. user is typing on a virtual keyboard and
* microgestures) but may not be actually compatible.
*
* Some hints values will only be supported when the hand tracking service has a Gemini Pro license.
* These will be indicated in the hint documentation below. (Requests for unlicensed hints will
* be ignored)
*
* Over time supported hints will be added and removed (unknown values will be ignored).
*/
/**
* Hint: Hand tracking is being used while holding objects (Gemini Pro license required)
*
* To confirm this hint is available the application can check for the presence of the
* "GeminiPro" feature flag.
*/
#define LEAP_HINT_HAND_ON_OBJECT "hand_on_object"
/**
* Hint: Tracked hands are expected to be moving quickly.
*
* The system will optimise for hands that move quickly at the cost of using more resources (CPU,
* camera bandwidth, memory and power)
*/
#define LEAP_HINT_FAST_HAND_MOTION "fast_hand_motion"
/**
* Hint: Hand position accuracy is very important.
*
* The system will optimise for accurate hand position at the cost of using more resources (CPU,
* camera bandwidth, memory and power)
*/
#define LEAP_HINT_HIGH_HAND_FIDELITY "high_hand_fidelity"
/**
* Hint: Minimising resource usage (CPU, camera bandwidth, memory and power) is very important.
*
* The system will minimise resource usage at the cost of hand tracking quality. Using this
* hint to avoid OS throttling on a resource-constrained system might produce the best hand
* tracking experience.
*/
#define LEAP_HINT_LOW_RESOURCE_USAGE "low_resource_usage"
/**
* Hint: Hand tracking is running in an environment with a high level of illumination,
* for an IR camera system it's only the IR illumination the is relevant.
*
* The system will optimise to track hands more reliably in these challenging conditions
* with a possible costs of latency, CPU and power.
*/
#define LEAP_HINT_HIGH_BACKGROUND_ILLUMINATION "high_background_illumination"
/**
* Application Type Axis: Hand tracking is being used by an immersive application, i.e. VR
*/
#define LEAP_HINT_APP_IMMERSIVE "app_immersive"
/**
* Application Type Axis: Hand tracking is being used by an application using passthrough, i.e. AR
*/
#define LEAP_HINT_APP_PASSTHROUGH "app_passthrough"
/**
* Sets a number of hints describing how the client and device will be using hand tracking. These
* hints will be used by the server to select an appropiate form of hand tracking for the client.
* The service will make its best guess at what to do when interpreting all the hints from all
* connected clients. It makes no guarantee to the client that it will follow any particular
* behaviour.
*
* The trait string may contain either public strings (defined above) or custom hints specific for a
* given customer.
*
* The function is called on a per device basis, so different hints can be applied to different
* cameras. Calling this function will override any and all previous hints from this device for this
* client connection.
*
* Hints will only be interpreted for "multi-device" aware clients (see
* @eLeapConnectionConfig_MultiDeviceAware). The function will return an error if the client is not
* "multi-device" aware.
*
* Warning: Over specialisation of hints may lead to degraded generic hand tracking. In most cases
* the device position axis is the only trait clients would specify. If an axis trait is not
* specified for a particular axis the hand tracking service will choose a sensible default.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param hDevice A device handle returned by LeapOpenDevice().
* @param hints An array of null terminated strings, one string for each hints, the array is
* terminated with a null pointer.
*/
LEAP_EXPORT eLeapRS LEAP_CALL
LeapSetDeviceHints(LEAP_CONNECTION hConnection, LEAP_DEVICE hDevice, const char* hints[]);
/**
* Check if a specific license feature flag is enabled in the hand tracking service.
*
* @param hConnection The connection handle created by LeapCreateConnection().
* @param flag A feature flag, pointer to a null terminated string. For example: "GeminiPro"
* @param flag_enabled An output parameter indicating if the feature flag is enabled.
*/
LEAP_EXPORT eLeapRS LEAP_CALL
LeapCheckLicenseFlag(LEAP_CONNECTION hConnection, const char* flag, bool* flag_enabled);
#ifdef __cplusplus
}
#endif
#pragma pack()
#endif