sdraw_mods_cvr/ml_lme/vendor/LeapCSharp/Controller.cs
SDraw 56686834d0
LeapCSharp update to 6.14.0
Fixed interaction input
2024-01-28 14:33:24 +03:00

990 lines
No EOL
36 KiB
C#

/******************************************************************************
* Copyright (C) Ultraleap, Inc. 2011-2024. *
* *
* Use subject to the terms of the Apache License 2.0 available at *
* http://www.apache.org/licenses/LICENSE-2.0, or another agreement *
* between Ultraleap and you, your company or other organization. *
******************************************************************************/
namespace Leap
{
using LeapInternal;
using System;
using System.Threading;
using UnityEngine;
/// <summary>
/// The Controller class is your main interface to the Leap Motion Controller.
///
/// Create an instance of this Controller class to access frames of tracking
/// data and configuration information.Frame data can be polled at any time
/// using the Controller.Frame() function.Call frame() or frame(0) to get the
/// most recent frame.Set the history parameter to a positive integer to access
/// previous frames.A controller stores up to 60 frames in its frame history.
///
///
/// Polling is an appropriate strategy for applications which already have an
/// intrinsic update loop, such as a game. You can also subscribe to the FrameReady
/// event to get tracking frames through an event delegate.
///
/// If the current thread implements a SynchronizationContext that contains a message
/// loop, events are posted to that threads message loop. Otherwise, events are called
/// on an independent thread and applications must perform any needed synchronization
/// or marshalling of data between threads. Note that Unity3D does not create an
/// appropriate SynchronizationContext object. Typically, event handlers cannot access
/// any Unity objects.
///
/// @since 1.0
/// </summary>
public class Controller :
IController
{
Connection _connection;
bool _disposed = false;
bool _supportsMultipleDevices = true;
string _serverNamespace = "Leap Service";
/// <summary>
/// The SynchronizationContext used for dispatching events.
///
/// By default the synchronization context of the thread creating the controller
/// instance is used. You can change the context if desired.
/// </summary>
public SynchronizationContext EventContext
{
get
{
return _connection.EventContext;
}
set
{
_connection.EventContext = value;
}
}
/// <summary>
/// Dispatched when the connection is initialized (but not necessarily connected).
///
/// Can be dispatched more than once, if connection is restarted.
/// @since 3.0
/// </summary>
public event EventHandler<LeapEventArgs> Init
{
add
{
if (_hasInitialized)
value(this, new LeapEventArgs(LeapEvent.EVENT_INIT));
_init += value;
}
remove { _init -= value; }
}
private bool _hasInitialized = false;
private EventHandler<LeapEventArgs> _init;
/// <summary>
/// Dispatched when the connection to the service is established.
/// @since 3.0
/// </summary>
public event EventHandler<ConnectionEventArgs> Connect
{
add
{
_connection.LeapConnection += value;
}
remove
{
_connection.LeapConnection -= value;
}
}
private EventHandler<ConnectionEventArgs> _connect;
/// <summary>
/// Dispatched if the connection to the service is lost.
/// @since 3.0
/// </summary>
public event EventHandler<ConnectionLostEventArgs> Disconnect
{
add
{
_connection.LeapConnectionLost += value;
}
remove
{
_connection.LeapConnectionLost -= value;
}
}
/// <summary>
/// Dispatched when a tracking frame is ready.
/// @since 3.0
/// </summary>
public event EventHandler<FrameEventArgs> FrameReady
{
add
{
_connection.LeapFrame += value;
}
remove
{
_connection.LeapFrame -= value;
}
}
/// <summary>
/// Dispatched when an internal tracking frame is ready.
/// @since 3.0
/// </summary>
public event EventHandler<InternalFrameEventArgs> InternalFrameReady
{
add
{
_connection.LeapInternalFrame += value;
}
remove
{
_connection.LeapInternalFrame -= value;
}
}
/// <summary>
/// Dispatched when a Leap Motion device is connected.
/// @since 3.0
/// </summary>
public event EventHandler<DeviceEventArgs> Device
{
add
{
_connection.LeapDevice += value;
}
remove
{
_connection.LeapDevice -= value;
}
}
/// <summary>
/// Dispatched when a Leap Motion device is disconnected.
/// @since 3.0
/// </summary>
public event EventHandler<DeviceEventArgs> DeviceLost
{
add
{
_connection.LeapDeviceLost += value;
}
remove
{
_connection.LeapDeviceLost -= value;
}
}
/// <summary>
/// Dispatched when a Leap device fails to initialize.
/// @since 3.0
/// </summary>
public event EventHandler<DeviceFailureEventArgs> DeviceFailure
{
add
{
_connection.LeapDeviceFailure += value;
}
remove
{
_connection.LeapDeviceFailure -= value;
}
}
/// <summary>
/// Dispatched when the system generates a loggable event.
/// @since 3.0
/// </summary>
public event EventHandler<LogEventArgs> LogMessage
{
add
{
_connection.LeapLogEvent += value;
}
remove
{
_connection.LeapLogEvent -= value;
}
}
/// <summary>
/// Dispatched when a policy changes.
/// @since 3.0
/// </summary>
public event EventHandler<PolicyEventArgs> PolicyChange
{
add
{
_connection.LeapPolicyChange += value;
}
remove
{
_connection.LeapPolicyChange -= value;
}
}
/// <summary>
/// Dispatched when a configuration setting changes.
/// @since 3.0
/// </summary>
public event EventHandler<ConfigChangeEventArgs> ConfigChange
{
add
{
_connection.LeapConfigChange += value;
}
remove
{
_connection.LeapConfigChange -= value;
}
}
/// <summary>
/// Dispatched when the image distortion map changes.
/// The distortion map can change when the Leap device switches orientation,
/// or a new device becomes active.
/// @since 3.0
/// </summary>
public event EventHandler<DistortionEventArgs> DistortionChange
{
add
{
_connection.LeapDistortionChange += value;
}
remove
{
_connection.LeapDistortionChange -= value;
}
}
/// <summary>
/// Dispatched when the service drops a tracking frame.
/// </summary>
public event EventHandler<DroppedFrameEventArgs> DroppedFrame
{
add
{
_connection.LeapDroppedFrame += value;
}
remove
{
_connection.LeapDroppedFrame -= value;
}
}
/// <summary>
/// Dispatched when an unrequested image is ready.
/// @since 4.0
/// </summary>
public event EventHandler<ImageEventArgs> ImageReady
{
add
{
_connection.LeapImage += value;
}
remove
{
_connection.LeapImage -= value;
}
}
/// <summary>
/// Dispatched whenever a thread wants to start profiling for a custom thread.
/// The event is always dispatched from the thread itself.
///
/// The event data will contain the name of the thread, as well as an array of
/// all possible profiling blocks that could be entered on that thread.
///
/// @since 4.0
/// </summary>
public event Action<BeginProfilingForThreadArgs> BeginProfilingForThread
{
add
{
_connection.LeapBeginProfilingForThread += value;
}
remove
{
_connection.LeapBeginProfilingForThread -= value;
}
}
/// <summary>
/// Dispatched whenever a thread is finished profiling. The event is always
/// dispatched from the thread itself.
///
/// @since 4.0
/// </summary>
public event Action<EndProfilingForThreadArgs> EndProfilingForThread
{
add
{
_connection.LeapEndProfilingForThread += value;
}
remove
{
_connection.LeapEndProfilingForThread -= value;
}
}
/// <summary>
/// Dispatched whenever a thread enters a profiling block. The event is always
/// dispatched from the thread itself.
///
/// The event data will contain the name of the profiling block.
///
/// @since 4.0
/// </summary>
public event Action<BeginProfilingBlockArgs> BeginProfilingBlock
{
add
{
_connection.LeapBeginProfilingBlock += value;
}
remove
{
_connection.LeapBeginProfilingBlock -= value;
}
}
/// <summary>
/// Dispatched whenever a thread ends a profiling block. The event is always
/// dispatched from the thread itself.
///
/// The event data will contain the name of the profiling block.
///
/// @since 4.0
/// </summary>
public event Action<EndProfilingBlockArgs> EndProfilingBlock
{
add
{
_connection.LeapEndProfilingBlock += value;
}
remove
{
_connection.LeapEndProfilingBlock -= value;
}
}
/// <summary>
/// Dispatched when point mapping change events are generated by the service.
/// @since 4.0
/// </summary>
public event EventHandler<PointMappingChangeEventArgs> PointMappingChange
{
add
{
_connection.LeapPointMappingChange += value;
}
remove
{
_connection.LeapPointMappingChange -= value;
}
}
/// <summary>
/// Dispatched when a new HeadPose is available.
/// </summary>
public event EventHandler<HeadPoseEventArgs> HeadPoseChange
{
add
{
_connection.LeapHeadPoseChange += value;
}
remove
{
_connection.LeapHeadPoseChange -= value;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
_connection.Dispose();
_disposed = true;
}
/// <summary>
/// Constructs a Controller object.
///
/// The default constructor uses a connection key of 0.
///
/// @since 1.0
/// </summary>
public Controller() : this(0) { }
/// <summary>
/// Constructs a Controller object using the specified connection key.
///
/// All controller instances using the same key will use the same connection
/// to the service. In general, an application should not use more than one connection
/// for all its controllers. Each connection keeps its own cache of frames and images.
///
/// @param connectionKey An identifier specifying the connection to use. If a
/// connection with the specified key already exists, that connection is used.
/// Otherwise, a new connection is created.
/// @since 3.0
/// </summary>
public Controller(int connectionKey, string serverNamespace = "Leap Service", bool supportsMultipleDevices = true)
{
_connection = Connection.GetConnection(new Connection.Key(connectionKey, serverNamespace));
_connection.EventContext = SynchronizationContext.Current;
_connection.LeapInit += OnInit;
_connection.LeapConnection += OnConnect;
_connection.LeapConnectionLost += OnDisconnect;
_supportsMultipleDevices = supportsMultipleDevices;
_serverNamespace = serverNamespace;
_connection.Start(serverNamespace, supportsMultipleDevices);
}
/// <summary>
/// Starts the connection.
///
/// A connection starts automatically when created, but you can
/// use this function to restart the connection after stopping it.
///
/// @since 3.0
/// </summary>
public void StartConnection()
{
_connection.Start(_serverNamespace, _supportsMultipleDevices);
}
/// <summary>
/// Stops the connection.
///
/// No more frames or other events are received from a stopped connection. You can
/// restart with StartConnection().
///
/// @since 3.0
/// </summary>
public void StopConnection()
{
_connection.Stop();
}
/// <summary>
/// Reports whether your application has a connection to the Leap Motion
/// daemon/service. Can be true even if the Leap Motion hardware is not available.
/// @since 1.2
/// </summary>
public bool IsServiceConnected
{
get
{
return _connection.IsServiceConnected;
}
}
/// <summary>
/// Returns the current Leap service version information.
/// </summary>
public LEAP_VERSION ServiceVersion
{
get
{
return _connection.GetCurrentServiceVersion();
}
}
/// <summary>
/// Checks whether a minimum or required tracking service version is installed.
/// Gets the currently installed service version from the connection and checks whether
/// the argument minServiceVersion is smaller or equal to it
/// </summary>
/// <param name="minServiceVersion">The minimum service version to check against</param>
/// <param name="connection">The connection</param>
/// <returns>True if the version of the running service is equal to or less than the minimum version specified</returns>
public static bool CheckRequiredServiceVersion(LEAP_VERSION minServiceVersion, Connection connection)
{
LEAP_VERSION currentServiceVersion = connection.GetCurrentServiceVersion();
// check that minServiceVersion is smaller or equal to the current service version
if (minServiceVersion.major < currentServiceVersion.major) return true;
else if (minServiceVersion.major == currentServiceVersion.major)
{
if (minServiceVersion.minor < currentServiceVersion.minor) return true;
else if (minServiceVersion.minor == currentServiceVersion.minor && minServiceVersion.patch <= currentServiceVersion.patch) return true;
}
return false;
}
/// <summary>
/// Checks whether a minimum or required tracking service version is installed.
/// Gets the currently installed service version from the connection and checks whether
/// the argument minServiceVersion is smaller or equal to it
/// </summary>
/// <param name="minServiceVersion">The minimum service version to check against</param>
/// <returns>True if the version of the running service is equal to or less than the minimum version specified</returns>
public bool CheckRequiredServiceVersion(LEAP_VERSION minServiceVersion)
{
return Controller.CheckRequiredServiceVersion(minServiceVersion, _connection);
}
/// <summary>
/// Requests setting and clearing policy flags on a specific device
///
/// A request to change a policy is subject to user approval and a policy
/// can be changed by the user at any time (using the Leap Motion settings dialog).
/// The desired policy flags must be set every time an application runs.
///
/// Policy changes are completed asynchronously and, because they are subject
/// to user approval or system compatibility checks, may not complete successfully. Call
/// Controller.IsPolicySet() after a suitable interval to test whether
/// the change was accepted.
/// @since 2.1.6 (5.4.4 for specific device)
/// </summary>
public void SetAndClearPolicy(PolicyFlag set, PolicyFlag clear, Device device = null)
{
_connection.SetAndClearPolicy(set, clear, device);
}
/// <summary>
/// Requests setting a policy on a specific device
///
/// A request to change a policy is subject to user approval and a policy
/// can be changed by the user at any time (using the Leap Motion settings dialog).
/// The desired policy flags must be set every time an application runs.
///
/// Policy changes are completed asynchronously and, because they are subject
/// to user approval or system compatibility checks, may not complete successfully. Call
/// Controller.IsPolicySet() after a suitable interval to test whether
/// the change was accepted.
/// @since 2.1.6 (5.4.4 for specific device)
/// </summary>
public void SetPolicy(PolicyFlag policy, Device device = null)
{
_connection.SetPolicy(policy, device);
}
/// <summary>
/// Requests clearing a policy on a specific device
///
/// Policy changes are completed asynchronously and, because they are subject
/// to user approval or system compatibility checks, may not complete successfully. Call
/// Controller.IsPolicySet() after a suitable interval to test whether
/// the change was accepted.
/// @since 2.1.6 (5.4.4 for specific device)
/// </summary>
public void ClearPolicy(PolicyFlag policy, Device device = null)
{
_connection.ClearPolicy(policy, device);
}
/// <summary>
/// Gets the active setting for a specific device.
///
/// Keep in mind that setting a policy flag is asynchronous, so changes are
/// not effective immediately after calling setPolicyFlag(). In addition, a
/// policy request can be declined by the user. You should always set the
/// policy flags required by your application at startup and check that the
/// policy change request was successful after an appropriate interval.
///
/// If the controller object is not connected to the Leap Motion software, then the default
/// state for the selected policy is returned.
///
/// @since 2.1.6 (5.4.4 for specific device)
/// </summary>
public bool IsPolicySet(PolicyFlag policy, Device device = null)
{
return _connection.IsPolicySet(policy, device);
}
/// <summary>
/// Checks if the specified device is available.
///
/// Device availability is determined by checking it has active policy flags set against it
/// via its connection.
/// </summary>
public bool IsDeviceAvailable(Device device = null)
{
return _connection.IsDeviceAvailable(device);
}
/// <summary>
/// In most cases you should get Frame objects using the LeapProvider.CurrentFrame
/// property. The data in Frame objects taken directly from a Leap.Controller instance
/// is still in the Leap Motion frame of reference and will not match the hands
/// displayed in a Unity scene.
///
/// Returns a frame of tracking data from the Leap Motion software. Use the optional
/// history parameter to specify which frame to retrieve. Call frame() or
/// frame(0) to access the most recent frame; call frame(1) to access the
/// previous frame, and so on. If you use a history value greater than the
/// number of stored frames, then the controller returns an empty frame.
///
/// @param history The age of the frame to return, counting backwards from
/// the most recent frame (0) into the past and up to the maximum age (59).
/// @returns The specified frame; or, if no history parameter is specified,
/// the newest frame. If a frame is not available at the specified history
/// position, an invalid Frame is returned.
/// @since 1.0
/// </summary>
public Frame Frame(int history = 0)
{
Frame frame = new Frame();
Frame(frame, history);
return frame;
}
/// <summary>
/// Identical to Frame(history) but instead of constructing a new frame and returning
/// it, the user provides a frame object to be filled with data instead.
/// </summary>
public void Frame(Frame toFill, int history = 0)
{
LEAP_TRACKING_EVENT trackingEvent;
_connection.Frames.Get(out trackingEvent, history);
toFill.CopyFrom(ref trackingEvent);
}
/// <summary>
/// Returns the timestamp of a recent tracking frame. Use the
/// optional history parameter to specify how many frames in the past
/// to retrieve the timestamp. Leave the history parameter as
/// it's default value to return the timestamp of the most recent
/// tracked frame.
/// </summary>
public long FrameTimestamp(int history = 0)
{
LEAP_TRACKING_EVENT trackingEvent;
_connection.Frames.Get(out trackingEvent, history);
return trackingEvent.info.timestamp;
}
/// <summary>
/// Returns the frame object with all hands transformed by the specified
/// transform matrix.
/// </summary>
public Frame GetTransformedFrame(LeapTransform trs, int history = 0)
{
return new Frame().CopyFrom(Frame(history)).Transform(trs);
}
/// <summary>
/// Returns the Frame at the specified time, interpolating the data between existing frames, if necessary.
/// </summary>
public Frame GetInterpolatedFrame(Int64 time, Device device = null)
{
return _connection.GetInterpolatedFrame(time, device);
}
/// <summary>
/// Returns the Frame at the specified time, interpolating the data between existing frames, if necessary.
/// </summary>
public Frame GetInterpolatedFrame(Int64 time)
{
return GetInterpolatedFrame(time, null);
}
/// <summary>
/// Fills the Frame with data taken at the specified time, interpolating the data between existing frames, if necessary.
/// </summary>
public void GetInterpolatedFrame(Frame toFill, Int64 time, Device device = null)
{
_connection.GetInterpolatedFrame(toFill, time, device);
}
/// <summary>
/// Returns the Head pose at the specified time, interpolating the data between existing frames, if necessary.
/// </summary>
public LEAP_HEAD_POSE_EVENT GetInterpolatedHeadPose(Int64 time)
{
return _connection.GetInterpolatedHeadPose(time);
}
public void GetInterpolatedHeadPose(ref LEAP_HEAD_POSE_EVENT toFill, Int64 time)
{
_connection.GetInterpolatedHeadPose(ref toFill, time);
}
/// <summary>
/// Subscribes to the events coming from an individual device
///
/// If this is not called, only the primary device will be subscribed.
/// Will automatically unsubscribe the primary device if this is called
/// on a secondary device, but not a primary one.
///
/// @since 4.1
/// </summary>
public void SubscribeToDeviceEvents(Device device)
{
_connection.SubscribeToDeviceEvents(device);
}
/// <summary>
/// Unsubscribes from the events coming from an individual device
///
/// This can be called safely, even if the device has not been subscribed.
///
/// @since 4.1
/// </summary>
public void UnsubscribeFromDeviceEvents(Device device)
{
_connection.UnsubscribeFromDeviceEvents(device);
}
/// <summary>
/// Subscribes to the events coming from all devices
///
/// @since 4.1
/// </summary>
public void SubscribeToAllDevices()
{
for (int i = 1; i < Devices.Count; i++)
{
_connection.SubscribeToDeviceEvents(Devices[i]);
}
}
/// <summary>
/// Unsubscribes from the events coming from all devices
///
/// @since 4.1
/// </summary>
public void UnsubscribeFromAllDevices()
{
for (int i = 1; i < Devices.Count; i++)
{
_connection.UnsubscribeFromDeviceEvents(Devices[i]);
}
}
public void TelemetryProfiling(ref LEAP_TELEMETRY_DATA telemetryData)
{
_connection.TelemetryProfiling(ref telemetryData);
}
public UInt64 TelemetryGetNow()
{
return LeapC.TelemetryGetNow();
}
public void GetPointMapping(ref PointMapping pointMapping)
{
_connection.GetPointMapping(ref pointMapping);
}
/// <summary>
/// This is a special variant of GetInterpolatedFrameFromTime, for use with special
/// features that only require the position and orientation of the palm positions, and do
/// not care about pose data or any other data.
///
/// You must specify the id of the hand that you wish to get a transform for. If you specify
/// an id that is not present in the interpolated frame, the output transform will be the
/// identity transform.
/// </summary>
public void GetInterpolatedLeftRightTransform(Int64 time,
Int64 sourceTime,
int leftId,
int rightId,
Device device,
out LeapTransform leftTransform,
out LeapTransform rightTransform)
{
_connection.GetInterpolatedLeftRightTransform(time, sourceTime, leftId, rightId, device, out leftTransform, out rightTransform);
}
/// <summary>
/// This is a special variant of GetInterpolatedFrameFromTime, for use with special
/// features that only require the position and orientation of the palm positions, and do
/// not care about pose data or any other data.
///
/// You must specify the id of the hand that you wish to get a transform for. If you specify
/// an id that is not present in the interpolated frame, the output transform will be the
/// identity transform.
/// </summary>
public void GetInterpolatedLeftRightTransform(Int64 time,
Int64 sourceTime,
int leftId,
int rightId,
out LeapTransform leftTransform,
out LeapTransform rightTransform)
{
GetInterpolatedLeftRightTransform(time, sourceTime, leftId, rightId, null, out leftTransform, out rightTransform);
}
public void GetInterpolatedFrameFromTime(Frame toFill, Int64 time, Int64 sourceTime, Device device = null)
{
_connection.GetInterpolatedFrameFromTime(toFill, time, sourceTime, device);
}
/// <summary>
/// Returns a timestamp value as close as possible to the current time.
/// Values are in microseconds, as with all the other timestamp values.
///
/// @since 2.2.7
/// </summary>
public long Now()
{
return LeapC.GetNow();
}
/// <summary>
/// Reports whether this Controller is connected to the Leap Motion service and
/// the Leap Motion hardware is plugged in.
///
/// When you first create a Controller object, isConnected() returns false.
/// After the controller finishes initializing and connects to the Leap Motion
/// software and if the Leap Motion hardware is plugged in, isConnected() returns true.
///
/// You can either handle the onConnect event using a Listener instance or
/// poll the isConnected() function if you need to wait for your
/// application to be connected to the Leap Motion software before performing some other
/// operation.
///
/// @since 1.0
/// </summary>
public bool IsConnected
{
get
{
return IsServiceConnected && Devices.Count > 0;
}
}
/// <summary>
/// Returns a Config object, which you can use to query the Leap Motion system for
/// configuration information.
///
/// @since 1.0
/// </summary>
[Obsolete("Config.cs is not used in Ultraleap's Tracking Service 5.X+. This will be removed in the next Major release")]
public Config Config
{
get
{
return null;
}
}
/// <summary>
/// The list of currently attached and recognized Leap Motion controller devices.
///
/// The Device objects in the list describe information such as the range and
/// tracking volume.
///
/// Currently, the Leap Motion Controller only allows a single active device at a time,
/// however there may be multiple devices physically attached and listed here. Any active
/// device(s) are guaranteed to be listed first, however order is not determined beyond that.
///
/// @since 1.0
/// </summary>
public DeviceList Devices
{
get
{
return _connection.Devices;
}
}
/// <summary>
/// A list of any Leap Motion hardware devices that are physically connected to
/// the client computer, but are not functioning correctly. The list contains
/// FailedDevice objects containing the pnpID and the reason for failure. No
/// other device information is available.
///
/// @since 3.0
/// </summary>
public FailedDeviceList FailedDevices()
{
return _connection.FailedDevices;
}
/// <summary>
/// The supported controller policies.
///
/// The supported policy flags are:
///
/// **POLICY_BACKGROUND_FRAMES** -- requests that your application receives frames
/// when it is not the foreground application for user input.
///
/// The background frames policy determines whether an application
/// receives frames of tracking data while in the background. By
/// default, the Leap Motion software only sends tracking data to the foreground application.
/// Only applications that need this ability should request the background
/// frames policy. The "Allow Background Apps" checkbox must be enabled in the
/// Leap Motion Control Panel or this policy will be denied.
///
/// **POLICY_OPTIMIZE_HMD** -- request that the tracking be optimized for head-mounted
/// tracking.
///
/// The optimize HMD policy improves tracking in situations where the Leap
/// Motion hardware is attached to a head-mounted display. This policy is
/// not granted for devices that cannot be mounted to an HMD, such as
/// Leap Motion controllers embedded in a laptop or keyboard.
///
/// Some policies can be denied if the user has disabled the feature on
/// their Leap Motion control panel.
///
/// @since 1.0
/// </summary>
public enum PolicyFlag
{
/// <summary>
/// The default policy.
/// </summary>
POLICY_DEFAULT = 0,
/// <summary>
/// Receive background frames.
/// </summary>
POLICY_BACKGROUND_FRAMES = (1 << 0),
/// <summary>
/// Allow streaming images.
/// </summary>
POLICY_IMAGES = (1 << 1),
/// <summary>
/// Optimize the tracking for head-mounted device.
/// </summary>
POLICY_OPTIMIZE_HMD = (1 << 2),
/// <summary>
/// Allow pausing and unpausing of the Leap Motion service.
/// </summary>
POLICY_ALLOW_PAUSE_RESUME = (1 << 3),
/// <summary>
/// Allow streaming map point
/// </summary>
POLICY_MAP_POINTS = (1 << 7),
/// <summary>
/// Optimize the tracking for screen-top device.
/// @since 5.0.0
/// </summary>
POLICY_OPTIMIZE_SCREENTOP = (1 << 8),
}
protected virtual void OnInit(object sender, LeapEventArgs eventArgs)
{
_hasInitialized = true;
}
protected virtual void OnConnect(object sender, ConnectionEventArgs eventArgs)
{
}
protected virtual void OnDisconnect(object sender, ConnectionLostEventArgs eventArgs)
{
_hasInitialized = false;
}
}
}