// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.Toolkit.Utilities;
using System;
using UnityEngine;
#if WINDOWS_UWP
using System.IO;
#endif
namespace Microsoft.MixedReality.Toolkit.Input
{
///
/// Record joint positions of a hand and log them for use in simulated hands.
///
[AddComponentMenu("Scripts/MRTK/Providers/WindowsMixedRealityHandRecorder")]
public class WindowsMixedRealityHandRecorder : MonoBehaviour
{
///
/// The joint positioned at the origin at the start of the recording.
///
///
/// If the reference joint moves between start and stop of recording then final position is used as an offset.
/// Example: A "poke" gesture can be simulated by moving the index finger forward between start and stop,
/// giving an offset that creates a poking motion when interpolated.
///
public TrackedHandJoint ReferenceJoint { get; set; } = TrackedHandJoint.IndexTip;
///
/// Default output filename for saving the recorded pose.
///
public string OutputFileName { get; } = "ArticulatedHandPose";
private Vector3 offset = Vector3.zero;
private Handedness recordingHand = Handedness.None;
public void RecordLeftHandStart()
{
RecordHandStart(Handedness.Left);
}
public void RecordRightHandStart()
{
RecordHandStart(Handedness.Right);
}
private void RecordHandStart(Handedness handedness)
{
HandJointUtils.TryGetJointPose(ReferenceJoint, handedness, out MixedRealityPose joint);
offset = joint.Position;
recordingHand = handedness;
}
public void RecordHandStop()
{
MixedRealityPose[] jointPoses = new MixedRealityPose[ArticulatedHandPose.JointCount];
for (int i = 0; i < ArticulatedHandPose.JointCount; ++i)
{
HandJointUtils.TryGetJointPose((TrackedHandJoint)i, recordingHand, out jointPoses[i]);
}
ArticulatedHandPose pose = new ArticulatedHandPose();
pose.ParseFromJointPoses(jointPoses, recordingHand, Quaternion.identity, offset);
recordingHand = Handedness.None;
var filename = String.Format("{0}-{1}.json", OutputFileName, DateTime.UtcNow.ToString("yyyyMMdd-HHmmss"));
StoreRecordedHandPose(pose.ToJson(), filename);
}
private static void StoreRecordedHandPose(string data, string filename)
{
#if WINDOWS_UWP
string path = Path.Combine(Application.persistentDataPath, filename);
using (TextWriter writer = File.CreateText(path))
{
writer.Write(data);
}
#else
Debug.Log($"{filename}: {data}");
#endif
}
}
}