diff --git a/HoloBot/Assets/HoloToolkit.meta b/HoloBot/Assets/HoloToolkit.meta
new file mode 100644
index 0000000..d3448e9
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 5a7c0a4f12cac724ebe0214e2392fb36
+folderAsset: yes
+timeCreated: 1494566565
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build.meta b/HoloBot/Assets/HoloToolkit/Build.meta
new file mode 100644
index 0000000..e6578aa
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: d6b6f13a11bfa1c4f97b91ef1c37829a
+folderAsset: yes
+timeCreated: 1466615023
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor.meta b/HoloBot/Assets/HoloToolkit/Build/Editor.meta
new file mode 100644
index 0000000..5752db0
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: eb16359da8d1ac447a8795ea2b7b2a8f
+folderAsset: yes
+timeCreated: 1466615024
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPortal.cs b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPortal.cs
new file mode 100644
index 0000000..608b90f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPortal.cs
@@ -0,0 +1,446 @@
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+//
+
+using UnityEngine;
+using System.Collections;
+using System.Net;
+using System;
+using System.IO;
+using System.Collections.Generic;
+
+namespace HoloToolkit.Unity
+{
+ ///
+ /// Function used to communicate with the device through the REST API
+ ///
+ public class BuildDeployPortal
+ {
+ // Consts
+ public const float TimeOut = 6.0f;
+ public const int TimeoutMS = (int)(TimeOut * 1000.0f);
+ public const float MaxWaitTime = 20.0f;
+
+ public static readonly string kAPI_ProcessQuery = @"http://{0}/api/resourcemanager/processes";
+ public static readonly string kAPI_PackagesQuery = @"http://{0}/api/appx/packagemanager/packages";
+ public static readonly string kAPI_InstallQuery = @"http://{0}/api/app/packagemanager/package";
+ public static readonly string kAPI_InstallStatusQuery = @"http://{0}/api/app/packagemanager/state";
+ public static readonly string kAPI_AppQuery = @"http://{0}/api/taskmanager/app";
+ public static readonly string kAPI_FileQuery = @"http://{0}/api/filesystem/apps/file";
+
+ // Enums
+ public enum AppInstallStatus
+ {
+ Invalid,
+ Installing,
+ InstallSuccess,
+ InstallFail
+ }
+
+ // Classes & Structs
+ public struct ConnectInfo
+ {
+ public ConnectInfo(string ip, string user, string password)
+ {
+ IP = ip;
+ User = user;
+ Password = password;
+ }
+
+ public string IP;
+ public string User;
+ public string Password;
+ }
+ [Serializable]
+ public class AppDetails
+ {
+ public string Name;
+ public string PackageFamilyName;
+ public string PackageFullName;
+ public int PackageOrigin;
+ public string PackageRelativeId;
+ public string Publisher;
+ }
+ [Serializable]
+ public class AppList
+ {
+ public AppDetails[] InstalledPackages;
+ }
+ [Serializable]
+ public class ProcessDesc
+ {
+ public float CPUUsage;
+ public string ImageName;
+ public float PageFileUsage;
+ public int PrivateWorkingSet;
+ public int ProcessId;
+ public int SessionId;
+ public string UserName;
+ public int VirtualSize;
+ public int WorkingSetSize;
+ }
+ [Serializable]
+ public class ProcessList
+ {
+ public ProcessDesc[] Processes;
+ }
+ [Serializable]
+ public class InstallStatus
+ {
+ public int Code;
+ public string CodeText;
+ public string Reason;
+ public bool Success;
+ }
+ [Serializable]
+ public class Response
+ {
+ public string Reason;
+ }
+ private class TimeoutWebClient : WebClient
+ {
+ protected override WebRequest GetWebRequest(Uri uri)
+ {
+ WebRequest lWebRequest = base.GetWebRequest(uri);
+ lWebRequest.Timeout = BuildDeployPortal.TimeoutMS;
+ ((HttpWebRequest)lWebRequest).ReadWriteTimeout = BuildDeployPortal.TimeoutMS;
+ return lWebRequest;
+ }
+ }
+
+ // Functions
+ public static bool IsAppInstalled(string packageFamilyName, ConnectInfo connectInfo)
+ {
+ // Look at the device for a matching app name (if not there, then not installed)
+ return (QueryAppDetails(packageFamilyName, connectInfo) != null);
+ }
+
+ public static bool IsAppRunning(string appName, ConnectInfo connectInfo)
+ {
+ using (var client = new TimeoutWebClient())
+ {
+ client.Credentials = new NetworkCredential(connectInfo.User, connectInfo.Password);
+ string query = string.Format(kAPI_ProcessQuery, connectInfo.IP);
+ string procListJSON = client.DownloadString(query);
+
+ ProcessList procList = JsonUtility.FromJson(procListJSON);
+ for (int i = 0; i < procList.Processes.Length; ++i)
+ {
+ string procName = procList.Processes[i].ImageName;
+ if (procName.Contains(appName))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public static AppInstallStatus GetInstallStatus(ConnectInfo connectInfo)
+ {
+ using (var client = new TimeoutWebClient())
+ {
+ client.Credentials = new NetworkCredential(connectInfo.User, connectInfo.Password);
+ string query = string.Format(kAPI_InstallStatusQuery, connectInfo.IP);
+ string statusJSON = client.DownloadString(query);
+ InstallStatus status = JsonUtility.FromJson(statusJSON);
+
+ if (status == null)
+ {
+ return AppInstallStatus.Installing;
+ }
+ else if (status.Success == false)
+ {
+ Debug.LogError(status.Reason + "(" + status.CodeText + ")");
+ return AppInstallStatus.InstallFail;
+ }
+ return AppInstallStatus.InstallSuccess;
+ }
+ }
+
+ public static AppDetails QueryAppDetails(string packageFamilyName, ConnectInfo connectInfo)
+ {
+ using (var client = new TimeoutWebClient())
+ {
+ client.Credentials = new NetworkCredential(connectInfo.User, connectInfo.Password);
+ string query = string.Format(kAPI_PackagesQuery, connectInfo.IP);
+ string appListJSON = client.DownloadString(query);
+
+ AppList appList = JsonUtility.FromJson(appListJSON);
+ for (int i = 0; i < appList.InstalledPackages.Length; ++i)
+ {
+ string thisAppName = appList.InstalledPackages[i].PackageFamilyName;
+ if (thisAppName.Equals(packageFamilyName, StringComparison.OrdinalIgnoreCase))
+ {
+ return appList.InstalledPackages[i];
+ }
+ }
+ }
+ return null;
+ }
+
+ public static bool InstallApp(string appFullPath, ConnectInfo connectInfo, bool waitForDone = true)
+ {
+ try
+ {
+ // Calc the cert and dep paths
+ string fileName = Path.GetFileName(appFullPath);
+ string certFullPath = Path.ChangeExtension(appFullPath, ".cer");
+ string certName = Path.GetFileName(certFullPath);
+ string depPath = Path.GetDirectoryName(appFullPath) + @"\Dependencies\x86\";
+
+ // Post it using the REST API
+ WWWForm form = new WWWForm();
+
+ // APPX file
+ FileStream stream = new FileStream(appFullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
+ BinaryReader reader = new BinaryReader(stream);
+ form.AddBinaryData(fileName, reader.ReadBytes((int)reader.BaseStream.Length), fileName);
+ stream.Close();
+
+ // CERT file
+ stream = new FileStream(certFullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
+ reader = new BinaryReader(stream);
+ form.AddBinaryData(certName, reader.ReadBytes((int)reader.BaseStream.Length), certName);
+ stream.Close();
+
+ // Dependencies
+ FileInfo[] depFiles = (new DirectoryInfo(depPath)).GetFiles();
+ foreach (FileInfo dep in depFiles)
+ {
+ stream = new FileStream(dep.FullName, FileMode.Open, FileAccess.Read, FileShare.Read);
+ reader = new BinaryReader(stream);
+ string depFilename = Path.GetFileName(dep.FullName);
+ form.AddBinaryData(depFilename, reader.ReadBytes((int)reader.BaseStream.Length), depFilename);
+ stream.Close();
+ }
+
+ // Credentials
+ Dictionary headers = form.headers;
+ headers["Authorization"] = "Basic " + EncodeTo64(connectInfo.User + ":" + connectInfo.Password);
+
+ // Unity places an extra quote in the content-type boundary parameter that the device portal doesn't care for, remove it
+ if (headers.ContainsKey("Content-Type"))
+ {
+ headers["Content-Type"] = headers["Content-Type"].Replace("\"", "");
+ }
+
+ // Query
+ string query = string.Format(kAPI_InstallQuery, connectInfo.IP);
+ query += "?package=" + WWW.EscapeURL(fileName);
+ WWW www = new WWW(query, form.data, headers);
+ DateTime queryStartTime = DateTime.Now;
+ while (!www.isDone &&
+ ((DateTime.Now - queryStartTime).TotalSeconds < TimeOut))
+ {
+ System.Threading.Thread.Sleep(10);
+ }
+
+ // Give it a short time before checking
+ System.Threading.Thread.Sleep(250);
+
+ // Report
+ if (www.isDone)
+ {
+ if (!string.IsNullOrEmpty(www.error))
+ {
+ Debug.LogError(www.error);
+ }
+ else if (!string.IsNullOrEmpty(www.text))
+ {
+ Debug.Log(JsonUtility.FromJson(www.text).Reason);
+ }
+ else
+ {
+ Debug.LogWarning("Completed with null response string");
+ }
+ }
+
+ // Wait for done (if requested)
+ DateTime waitStartTime = DateTime.Now;
+ while (waitForDone &&
+ ((DateTime.Now - waitStartTime).TotalSeconds < MaxWaitTime))
+ {
+ AppInstallStatus status = GetInstallStatus(connectInfo);
+ if (status == AppInstallStatus.InstallSuccess)
+ {
+ Debug.Log("Install Successful!");
+ break;
+ }
+ else if (status == AppInstallStatus.InstallFail)
+ {
+ Debug.LogError("Install Failed!");
+ break;
+ }
+
+ // Wait a bit and we'll ask again
+ System.Threading.Thread.Sleep(1000);
+ }
+ }
+ catch (System.Exception ex)
+ {
+ Debug.LogError(ex.ToString());
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool UninstallApp(string packageFamilyName, ConnectInfo connectInfo)
+ {
+ try
+ {
+ // Find the app description
+ AppDetails appDetails = QueryAppDetails(packageFamilyName, connectInfo);
+ if (appDetails == null)
+ {
+ Debug.LogError(string.Format("Application '{0}' not found", packageFamilyName));
+ return false;
+ }
+
+ // Setup the command
+ string query = string.Format(kAPI_InstallQuery, connectInfo.IP);
+ query += "?package=" + WWW.EscapeURL(appDetails.PackageFullName);
+
+ // Use HttpWebRequest for a delete query
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(query);
+ request.Timeout = TimeoutMS;
+ request.Credentials = new NetworkCredential(connectInfo.User, connectInfo.Password);
+ request.Method = "DELETE";
+ using (HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse())
+ {
+ Debug.Log("Response = " + httpResponse.StatusDescription);
+ httpResponse.Close();
+ }
+ }
+ catch (System.Exception ex)
+ {
+ Debug.LogError(ex.ToString());
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool LaunchApp(string packageFamilyName, ConnectInfo connectInfo)
+ {
+ // Find the app description
+ AppDetails appDetails = QueryAppDetails(packageFamilyName, connectInfo);
+ if (appDetails == null)
+ {
+ Debug.LogError("Appliation not found");
+ return false;
+ }
+
+ // Setup the command
+ string query = string.Format(kAPI_AppQuery, connectInfo.IP);
+ query += "?appid=" + WWW.EscapeURL(EncodeTo64(appDetails.PackageRelativeId));
+ query += "&package=" + WWW.EscapeURL(EncodeTo64(appDetails.PackageFamilyName));
+
+ // Use HttpWebRequest
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(query);
+ request.Timeout = TimeoutMS;
+ request.Credentials = new NetworkCredential(connectInfo.User, connectInfo.Password);
+ request.Method = "POST";
+
+ // Query
+ using (HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse())
+ {
+ Debug.Log("Response = " + httpResponse.StatusDescription);
+ httpResponse.Close();
+ }
+
+ return true;
+ }
+
+ public static bool KillApp(string packageFamilyName, ConnectInfo connectInfo)
+ {
+ try
+ {
+ // Find the app description
+ AppDetails appDetails = QueryAppDetails(packageFamilyName, connectInfo);
+ if (appDetails == null)
+ {
+ Debug.LogError("Appliation not found");
+ return false;
+ }
+
+ // Setup the command
+ string query = string.Format(kAPI_AppQuery, connectInfo.IP);
+ query += "?package=" + WWW.EscapeURL(EncodeTo64(appDetails.PackageFullName));
+
+ // And send it across
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(query);
+ request.Timeout = TimeoutMS;
+ request.Credentials = new NetworkCredential(connectInfo.User, connectInfo.Password);
+ request.Method = "DELETE";
+ using (HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse())
+ {
+ Debug.Log("Response = " + httpResponse.StatusDescription);
+ httpResponse.Close();
+ }
+ }
+ catch (System.Exception ex)
+ {
+ Debug.LogError(ex.ToString());
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool DeviceLogFile_View(string packageFamilyName, ConnectInfo connectInfo)
+ {
+ using (var client = new TimeoutWebClient())
+ {
+ client.Credentials = new NetworkCredential(connectInfo.User, connectInfo.Password);
+ try
+ {
+ // Setup
+ string logFile = Application.temporaryCachePath + @"/deviceLog.txt";
+
+ // Get the app details...
+ AppDetails appDetails = QueryAppDetails(packageFamilyName, connectInfo);
+ if (appDetails == null)
+ {
+ Debug.LogError("Application not found on target device (" + packageFamilyName + ")");
+ return false;
+ }
+
+ // Download the file
+ string query = string.Format(kAPI_FileQuery, connectInfo.IP);
+ query += "?knownfolderid=LocalAppData";
+ query += "&filename=UnityPlayer.log";
+ query += "&packagefullname=" + appDetails.PackageFullName;
+ query += "&path=%5C%5CTempState";
+ client.DownloadFile(query, logFile);
+
+ // Open it up in default text editor
+ System.Diagnostics.Process.Start(logFile);
+ }
+ catch (System.Exception ex)
+ {
+ Debug.LogError(ex.ToString());
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ // Helpers
+ static string EncodeTo64(string toEncode)
+ {
+ byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
+ string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
+ return returnValue;
+ }
+ static string DecodeFrom64(string encodedData)
+ {
+ byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
+ string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
+ return returnValue;
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPortal.cs.meta b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPortal.cs.meta
new file mode 100644
index 0000000..99ba73b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPortal.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 09ea77b2be8b62b4a9c86c123cd5ddbe
+timeCreated: 1466615025
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPrefs.cs b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPrefs.cs
new file mode 100644
index 0000000..64ca831
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPrefs.cs
@@ -0,0 +1,102 @@
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+//
+
+using System.IO;
+using UnityEditor;
+using UnityEngine;
+
+namespace HoloToolkit.Unity
+{
+
+ public static class BuildDeployPrefs
+ {
+ // Constants
+ private const string EditorPrefs_BuildDir = "BuildDeployWindow_BuildDir";
+ private const string EditorPrefs_BuildConfig = "BuildDeployWindow_BuildConfig";
+ private const string EditorPrefs_ForceRebuild = "BuildDeployWindow_ForceBuild";
+ private const string EditorPrefs_IncrementBuildVersion = "BuildDeployWindow_IncrementBuildVersion";
+ private const string EditorPrefs_MSBuildVer = "BuildDeployWindow_MSBuildVer";
+ private const string EditorPrefs_TargetIPs = "BuildDeployWindow_DestIPs";
+ private const string EditorPrefs_DeviceUser = "BuildDeployWindow_DeviceUser";
+ private const string EditorPrefs_DevicePwd = "BuildDeployWindow_DevicePwd";
+ private const string EditorPrefs_FullReinstall = "BuildDeployWindow_FullReinstall";
+
+ public static string BuildDirectory
+ {
+ get { return GetEditorPref(EditorPrefs_BuildDir, "WindowsStoreApp"); }
+ set { EditorPrefs.SetString(EditorPrefs_BuildDir, value); }
+ }
+ public static string AbsoluteBuildDirectory
+ {
+ get { return Path.GetFullPath(Path.Combine(Path.Combine(Application.dataPath, ".."), BuildDirectory)); }
+ }
+ public static string MsBuildVersion
+ {
+ get { return GetEditorPref(EditorPrefs_MSBuildVer, BuildDeployTools.DefaultMSBuildVersion); }
+ set { EditorPrefs.SetString(EditorPrefs_MSBuildVer, value); }
+ }
+ public static string BuildConfig
+ {
+ get { return GetEditorPref(EditorPrefs_BuildConfig, "Debug"); }
+ set { EditorPrefs.SetString(EditorPrefs_BuildConfig, value); }
+ }
+ public static bool ForceRebuild
+ {
+ get { return GetEditorPref(EditorPrefs_ForceRebuild, false); }
+ set { EditorPrefs.SetBool(EditorPrefs_ForceRebuild, value); }
+ }
+ public static bool IncrementBuildVersion
+ {
+ get { return GetEditorPref(EditorPrefs_IncrementBuildVersion, true); }
+ set { EditorPrefs.SetBool(EditorPrefs_IncrementBuildVersion, value); }
+ }
+ public static string TargetIPs
+ {
+ get { return GetEditorPref(EditorPrefs_TargetIPs, "127.0.0.1"); }
+ set { EditorPrefs.SetString(EditorPrefs_TargetIPs, value); }
+ }
+ public static string DeviceUser
+ {
+ get { return GetEditorPref(EditorPrefs_DeviceUser, ""); }
+ set { EditorPrefs.SetString(EditorPrefs_DeviceUser, value); }
+ }
+ public static string DevicePassword
+ {
+ get { return GetEditorPref(EditorPrefs_DevicePwd, ""); }
+ set { EditorPrefs.SetString(EditorPrefs_DevicePwd, value); }
+ }
+ public static bool FullReinstall
+ {
+ get { return GetEditorPref(EditorPrefs_FullReinstall, true); }
+ set { EditorPrefs.SetBool(EditorPrefs_FullReinstall, value); }
+ }
+
+ private static string GetEditorPref(string key, string defaultValue)
+ {
+ if (EditorPrefs.HasKey(key))
+ {
+ return EditorPrefs.GetString(key);
+ }
+ else
+ {
+ EditorPrefs.SetString(key, defaultValue);
+ return defaultValue;
+ }
+ }
+
+ private static bool GetEditorPref(string key, bool defaultValue)
+ {
+ if (EditorPrefs.HasKey(key))
+ {
+ return EditorPrefs.GetBool(key);
+ }
+ else
+ {
+ EditorPrefs.SetBool(key, defaultValue);
+ return defaultValue;
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPrefs.cs.meta b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPrefs.cs.meta
new file mode 100644
index 0000000..69935eb
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployPrefs.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6762008b7153ae94ab1f370faf6bbca0
+timeCreated: 1468891604
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployTools.cs b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployTools.cs
new file mode 100644
index 0000000..3ad960b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployTools.cs
@@ -0,0 +1,187 @@
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+//
+
+using System;
+using System.IO;
+using System.Xml;
+using System.Linq;
+using System.Collections.Generic;
+using UnityEditor;
+using UnityEngine;
+using System.Xml.Linq;
+
+namespace HoloToolkit.Unity
+{
+ ///
+ /// Contains utility functions for building for the device
+ ///
+ public class BuildDeployTools
+ {
+ // Consts
+ public static readonly string DefaultMSBuildVersion = "14.0";
+
+ // Functions
+ public static bool BuildSLN(string buildDirectory, bool showConfDlg = true)
+ {
+ // Use BuildSLNUtilities to create the SLN
+ bool buildSuccess = false;
+ BuildSLNUtilities.PerformBuild(new BuildSLNUtilities.BuildInfo()
+ {
+ // These properties should all match what the Standalone.proj file specifies
+ OutputDirectory = buildDirectory,
+ Scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(scene => scene.path),
+ BuildTarget = BuildTarget.WSAPlayer,
+ WSASdk = WSASDK.UWP,
+ WSAUWPBuildType = WSAUWPBuildType.D3D,
+
+ // Configure a post build action that will compile the generated solution
+ PostBuildAction = (buildInfo, buildError) =>
+ {
+ if (!string.IsNullOrEmpty(buildError))
+ {
+ EditorUtility.DisplayDialog(PlayerSettings.productName + " WindowsStoreApp Build Failed!", buildError, "OK");
+ }
+ else
+ {
+ if (showConfDlg)
+ {
+ EditorUtility.DisplayDialog(PlayerSettings.productName, "Build Complete", "OK");
+ }
+ buildSuccess = true;
+ }
+ }
+ });
+
+ return buildSuccess;
+ }
+
+ public static string CalcMSBuildPath(string msBuildVersion)
+ {
+ using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(string.Format(@"Software\Microsoft\MSBuild\ToolsVersions\{0}", msBuildVersion)))
+ {
+ if (key == null)
+ {
+ return null;
+ }
+ string msBuildBinFolder = key.GetValue("MSBuildToolsPath") as string;
+ string msBuildPath = Path.Combine(msBuildBinFolder, "msbuild.exe");
+ return msBuildPath;
+ }
+ }
+
+ public static bool BuildAppxFromSolution(string productName, string msBuildVersion, bool forceRebuildAppx, string buildConfig, string buildDirectory, bool incrementVersion)
+ {
+ // Get and validate the msBuild path...
+ string vs = CalcMSBuildPath(msBuildVersion);
+ if (!File.Exists(vs))
+ {
+ Debug.LogError("MSBuild.exe is missing or invalid (path=" + vs + "). Note that the default version is " + DefaultMSBuildVersion);
+ return false;
+ }
+
+ // Get the path to the NuGet tool
+ string unity = Path.GetDirectoryName(EditorApplication.applicationPath);
+ string nugetPath = Path.Combine(unity, @"Data\PlaybackEngines\MetroSupport\Tools\NuGet.exe");
+ string storePath = Path.GetFullPath(Path.Combine(Path.Combine(Application.dataPath, ".."), buildDirectory));
+ string solutionProjectPath = Path.GetFullPath(Path.Combine(storePath, productName + @".sln"));
+
+ // Before building, need to run a nuget restore to generate a json.lock file. Failing to do
+ // this breaks the build in VS RTM
+ var nugetPInfo = new System.Diagnostics.ProcessStartInfo();
+ nugetPInfo.FileName = nugetPath;
+ nugetPInfo.WorkingDirectory = buildDirectory;
+ nugetPInfo.UseShellExecute = false;
+ nugetPInfo.Arguments = @"restore " + PlayerSettings.productName + "/project.json";
+ using (var nugetP = new System.Diagnostics.Process())
+ {
+ Debug.Log(nugetPath + " " + nugetPInfo.Arguments);
+ nugetP.StartInfo = nugetPInfo;
+ nugetP.Start();
+ nugetP.WaitForExit();
+ }
+
+ // Ensure that the generated .appx version increments by modifying
+ // Package.appxmanifest
+ if (incrementVersion)
+ {
+ IncrementPackageVersion();
+ }
+
+ // Now do the actual build
+ var pinfo = new System.Diagnostics.ProcessStartInfo();
+ pinfo.FileName = vs;
+ pinfo.UseShellExecute = false;
+ string buildType = forceRebuildAppx ? "Rebuild" : "Build";
+ pinfo.Arguments = string.Format("\"{0}\" /t:{2} /p:Configuration={1} /p:Platform=x86", solutionProjectPath, buildConfig, buildType);
+ var p = new System.Diagnostics.Process();
+
+ Debug.Log(vs + " " + pinfo.Arguments);
+ p.StartInfo = pinfo;
+ p.Start();
+
+ p.WaitForExit();
+ if (p.ExitCode == 0)
+ {
+ Debug.Log("APPX build succeeded!");
+ }
+ else
+ {
+ Debug.LogError("MSBuild error (code = " + p.ExitCode + ")");
+ }
+
+ if (p.ExitCode != 0)
+ {
+ EditorUtility.DisplayDialog(PlayerSettings.productName + " build Failed!", "Failed to build appx from solution. Error code: " + p.ExitCode, "OK");
+ return false;
+ }
+ else
+ {
+ // Build succeeded. Allow user to install build on remote PC
+ BuildDeployWindow.OpenWindow();
+ return true;
+ }
+ }
+
+ private static void IncrementPackageVersion()
+ {
+ // Find the manifest, assume the one we want is the first one
+ string[] manifests = Directory.GetFiles(BuildDeployPrefs.AbsoluteBuildDirectory, "Package.appxmanifest", SearchOption.AllDirectories);
+ if (manifests.Length == 0)
+ {
+ Debug.LogError("Unable to find Package.appxmanifest file for build (in path - " + BuildDeployPrefs.AbsoluteBuildDirectory + ")");
+ return;
+ }
+ string manifest = manifests[0];
+
+ XElement rootNode = XElement.Load(manifest);
+ XNamespace ns = rootNode.GetDefaultNamespace();
+ var identityNode = rootNode.Element(ns + "Identity");
+ if (identityNode == null)
+ {
+ Debug.LogError("Package.appxmanifest for build (in path - " + BuildDeployPrefs.AbsoluteBuildDirectory + ") is missing an node");
+ return;
+ }
+
+ // We use XName.Get instead of string -> XName implicit conversion because
+ // when we pass in the string "Version", the program doesn't find the attribute.
+ // Best guess as to why this happens is that implicit string conversion doesn't set the namespace to empty
+ var versionAttr = identityNode.Attribute(XName.Get("Version"));
+ if (versionAttr == null)
+ {
+ Debug.LogError("Package.appxmanifest for build (in path - " + BuildDeployPrefs.AbsoluteBuildDirectory + ") is missing a version attribute in the node.");
+ return;
+ }
+
+ // Assume package version always has a '.'.
+ // According to https://msdn.microsoft.com/en-us/library/windows/apps/br211441.aspx
+ // Package versions are always of the form Major.Minor.Build.Revision
+ var version = new Version(versionAttr.Value);
+ var newVersion = new Version(version.Major, version.Minor, version.Build, version.Revision + 1);
+
+ versionAttr.Value = newVersion.ToString();
+ rootNode.Save(manifest);
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployTools.cs.meta b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployTools.cs.meta
new file mode 100644
index 0000000..25928f3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployTools.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: bc185db46b00c9840b977f9e46183160
+timeCreated: 1466615028
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployWindow.cs b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployWindow.cs
new file mode 100644
index 0000000..fc2d280
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployWindow.cs
@@ -0,0 +1,719 @@
+//
+// Copyright (c) @jevertt
+// Copyright (c) Rafael Rivera
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+//
+
+using System.IO;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor;
+using UnityEngine;
+using System.Net;
+using System;
+using System.Xml;
+
+namespace HoloToolkit.Unity
+{
+ ///
+ /// Build window - supports SLN creation, APPX from SLN, Deploy on device, and misc helper utilities associated with the build/deploy/test iteration loop
+ /// Requires the device to be set in developer mode & to have secure connections disabled (in the security tab in the device portal)
+ ///
+ public class BuildDeployWindow : EditorWindow
+ {
+ private const float GUISectionOffset = 10.0f;
+ private const string GUIHorizSpacer = " ";
+ private const float UpdateBuildsPeriod = 1.0f;
+
+ // Properties
+ private bool ShouldOpenSLNBeEnabled { get { return !string.IsNullOrEmpty(BuildDeployPrefs.BuildDirectory); } }
+ private bool ShouldBuildSLNBeEnabled { get { return !string.IsNullOrEmpty(BuildDeployPrefs.BuildDirectory); } }
+ private bool ShouldBuildAppxBeEnabled
+ {
+ get { return
+ !string.IsNullOrEmpty(BuildDeployPrefs.BuildDirectory) &&
+ !string.IsNullOrEmpty(BuildDeployPrefs.MsBuildVersion) &&
+ !string.IsNullOrEmpty(BuildDeployPrefs.BuildConfig); }
+ }
+ private bool ShouldLaunchAppBeEnabled
+ {
+ get { return !string.IsNullOrEmpty(BuildDeployPrefs.TargetIPs) && !string.IsNullOrEmpty(BuildDeployPrefs.BuildDirectory); }
+ }
+ private bool ShouldWebPortalBeEnabled
+ {
+ get { return !string.IsNullOrEmpty(BuildDeployPrefs.TargetIPs) && !string.IsNullOrEmpty(BuildDeployPrefs.BuildDirectory); }
+ }
+ private bool ShouldLogViewBeEnabled
+ {
+ get { return !string.IsNullOrEmpty(BuildDeployPrefs.TargetIPs) && !string.IsNullOrEmpty(BuildDeployPrefs.BuildDirectory); }
+ }
+ private bool LocalIPsOnly { get { return true; } }
+
+ // Privates
+ private List builds = new List();
+ private float timeLastUpdatedBuilds = 0.0f;
+
+ // Functions
+ [MenuItem("HoloToolkit/Build Window", false, 0)]
+ public static void OpenWindow()
+ {
+ BuildDeployWindow window = GetWindow("Build Window") as BuildDeployWindow;
+ if (window != null)
+ {
+ window.Show();
+ }
+ }
+
+ void OnEnable()
+ {
+ Setup();
+ }
+
+ private void Setup()
+ {
+ this.titleContent = new GUIContent("Build Window");
+ this.minSize = new Vector2(600, 200);
+
+ UpdateXdeStatus();
+ UpdateBuilds();
+ }
+
+ private void UpdateXdeStatus()
+ {
+ XdeGuestLocator.FindGuestAddressAsync();
+ }
+
+ private void OnGUI()
+ {
+ GUILayout.Space(GUISectionOffset);
+
+ // Setup
+ int buttonWidth_Quarter = Screen.width / 4;
+ int buttonWidth_Half = Screen.width / 2;
+ int buttonWidth_Full = Screen.width - 25;
+ string appName = PlayerSettings.productName;
+
+ // Build section
+ GUILayout.BeginVertical();
+ GUILayout.Label("SLN");
+
+ EditorGUILayout.BeginHorizontal();
+ GUILayout.FlexibleSpace();
+ EditorGUILayout.EndHorizontal();
+
+ // Build directory (and save setting, if it's changed)
+ string curBuildDirectory = BuildDeployPrefs.BuildDirectory;
+ string newBuildDirectory = EditorGUILayout.TextField(GUIHorizSpacer + "Build directory", curBuildDirectory);
+ if (newBuildDirectory != curBuildDirectory)
+ {
+ BuildDeployPrefs.BuildDirectory = newBuildDirectory;
+ curBuildDirectory = newBuildDirectory;
+ }
+
+ // Build SLN button
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUILayout.FlexibleSpace();
+ GUI.enabled = ShouldOpenSLNBeEnabled;
+ if (GUILayout.Button("Open SLN", GUILayout.Width(buttonWidth_Quarter)))
+ {
+ // Open SLN
+ string slnFilename = Path.Combine(curBuildDirectory, PlayerSettings.productName + ".sln");
+ if (File.Exists(slnFilename))
+ {
+ FileInfo slnFile = new FileInfo(slnFilename);
+ System.Diagnostics.Process.Start(slnFile.FullName);
+ }
+ else if (EditorUtility.DisplayDialog("Solution Not Found", "We couldn't find the solution. Would you like to Build it?", "Yes, Build", "No"))
+ {
+ // Build SLN
+ EditorApplication.delayCall += () => { BuildDeployTools.BuildSLN(curBuildDirectory); };
+ }
+ }
+ GUI.enabled = ShouldBuildSLNBeEnabled;
+ if (GUILayout.Button("Build Visual Studio SLN", GUILayout.Width(buttonWidth_Half)))
+ {
+ // Build SLN
+ EditorApplication.delayCall += () => { BuildDeployTools.BuildSLN(curBuildDirectory); };
+ }
+ GUI.enabled = true;
+ }
+
+ // Build & Run button...
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUILayout.FlexibleSpace();
+ GUI.enabled = ShouldBuildSLNBeEnabled;
+ if (GUILayout.Button("Build SLN, Build APPX, then Install", GUILayout.Width(buttonWidth_Half)))
+ {
+ // Build SLN
+ EditorApplication.delayCall += () => { BuildAndRun(appName); };
+ }
+ GUI.enabled = true;
+ }
+
+ // Appx sub-section
+ GUILayout.BeginVertical();
+ GUILayout.Label("APPX");
+
+ // MSBuild Ver (and save setting, if it's changed)
+ string curMSBuildVer = BuildDeployPrefs.MsBuildVersion;
+ string newMSBuildVer = EditorGUILayout.TextField(GUIHorizSpacer + "MSBuild Version", curMSBuildVer);
+ if (newMSBuildVer != curMSBuildVer)
+ {
+ BuildDeployPrefs.MsBuildVersion = newMSBuildVer;
+ curMSBuildVer = newMSBuildVer;
+ }
+
+ // Build config (and save setting, if it's changed)
+ string curBuildConfig = BuildDeployPrefs.BuildConfig;
+ string newBuildConfig = EditorGUILayout.TextField(GUIHorizSpacer + "Build Configuration", curBuildConfig);
+ if (newBuildConfig != curBuildConfig)
+ {
+ BuildDeployPrefs.BuildConfig = newBuildConfig;
+ curBuildConfig = newBuildConfig;
+ }
+
+ // Build APPX button
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUILayout.FlexibleSpace();
+
+ float previousLabelWidth = EditorGUIUtility.labelWidth;
+
+ // Force rebuild
+ EditorGUIUtility.labelWidth = 50;
+ bool curForceRebuildAppx = BuildDeployPrefs.ForceRebuild;
+ bool newForceRebuildAppx = EditorGUILayout.Toggle("Rebuild", curForceRebuildAppx);
+ if (newForceRebuildAppx != curForceRebuildAppx)
+ {
+ BuildDeployPrefs.ForceRebuild = newForceRebuildAppx;
+ curForceRebuildAppx = newForceRebuildAppx;
+ }
+
+ // Increment version
+ EditorGUIUtility.labelWidth = 110;
+ bool curIncrementVersion = BuildDeployPrefs.IncrementBuildVersion;
+ bool newIncrementVersion = EditorGUILayout.Toggle("Increment version", curIncrementVersion);
+ if (newIncrementVersion != curIncrementVersion) {
+ BuildDeployPrefs.IncrementBuildVersion = newIncrementVersion;
+ curIncrementVersion = newIncrementVersion;
+ }
+
+ // Restore previous label width
+ EditorGUIUtility.labelWidth = previousLabelWidth;
+
+ // Build APPX
+ GUI.enabled = ShouldBuildAppxBeEnabled;
+ if (GUILayout.Button("Build APPX from SLN", GUILayout.Width(buttonWidth_Half)))
+ {
+ BuildDeployTools.BuildAppxFromSolution(appName, curMSBuildVer, curForceRebuildAppx, curBuildConfig, curBuildDirectory, curIncrementVersion);
+ }
+ GUI.enabled = true;
+ }
+ GUILayout.EndVertical();
+ GUILayout.EndVertical();
+
+ GUILayout.Space(GUISectionOffset);
+
+ // Deploy section
+ GUILayout.BeginVertical();
+ GUILayout.Label("Deploy");
+
+ // Target IPs (and save setting, if it's changed)
+ string curTargetIps = BuildDeployPrefs.TargetIPs;
+ if (!LocalIPsOnly)
+ {
+ string newTargetIPs = EditorGUILayout.TextField(
+ new GUIContent(GUIHorizSpacer + "IP Address(es)", "IP(s) of target devices (e.g. 127.0.0.1;10.11.12.13)"),
+ curTargetIps);
+
+ if (newTargetIPs != curTargetIps)
+ {
+ BuildDeployPrefs.TargetIPs = newTargetIPs;
+ curTargetIps = newTargetIPs;
+ }
+ }
+ else
+ {
+ var locatorIsSearching = XdeGuestLocator.IsSearching;
+ var locatorHasData = XdeGuestLocator.HasData;
+ var xdeGuestIpAddress = XdeGuestLocator.GuestIpAddress;
+
+ // Queue up a repaint if we're still busy, or we'll get stuck
+ // in a disabled state.
+
+ if (locatorIsSearching)
+ {
+ Repaint();
+ }
+
+ var addressesToPresent = new List();
+ addressesToPresent.Add("127.0.0.1");
+
+ if (!locatorIsSearching && locatorHasData)
+ {
+ addressesToPresent.Add(xdeGuestIpAddress.ToString());
+ }
+
+ var previouslySavedAddress = addressesToPresent.IndexOf(curTargetIps);
+ if (previouslySavedAddress == -1)
+ {
+ previouslySavedAddress = 0;
+ }
+
+ EditorGUILayout.BeginHorizontal();
+
+ if (locatorIsSearching && !locatorHasData)
+ {
+ GUI.enabled = false;
+ }
+
+ var selectedAddressIndex = EditorGUILayout.Popup(GUIHorizSpacer + "IP Address", previouslySavedAddress, addressesToPresent.ToArray());
+
+ if (GUILayout.Button(locatorIsSearching ? "Searching" : "Refresh", GUILayout.Width(buttonWidth_Quarter)))
+ {
+ UpdateXdeStatus();
+ }
+
+ GUI.enabled = true;
+ EditorGUILayout.EndHorizontal();
+
+ var selectedAddress = addressesToPresent[selectedAddressIndex];
+
+ if (curTargetIps != selectedAddress && !locatorIsSearching)
+ {
+ BuildDeployPrefs.TargetIPs = selectedAddress;
+ }
+ }
+
+ // Username/Password (and save seeings, if changed)
+ string curUsername = BuildDeployPrefs.DeviceUser;
+ string newUsername = EditorGUILayout.TextField(GUIHorizSpacer + "Username", curUsername);
+ string curPassword = BuildDeployPrefs.DevicePassword;
+ string newPassword = EditorGUILayout.PasswordField(GUIHorizSpacer + "Password", curPassword);
+ bool curFullReinstall = BuildDeployPrefs.FullReinstall;
+ bool newFullReinstall = EditorGUILayout.Toggle(
+ new GUIContent(GUIHorizSpacer + "Uninstall first", "Uninstall application before installing"), curFullReinstall);
+ if ((newUsername != curUsername) ||
+ (newPassword != curPassword) ||
+ (newFullReinstall != curFullReinstall))
+ {
+ BuildDeployPrefs.DeviceUser = newUsername;
+ BuildDeployPrefs.DevicePassword = newPassword;
+ BuildDeployPrefs.FullReinstall = newFullReinstall;
+
+ curUsername = newUsername;
+ curPassword = newPassword;
+ curFullReinstall = newFullReinstall;
+ }
+
+ // Build list (with install buttons)
+ if (this.builds.Count == 0)
+ {
+ GUILayout.Label(GUIHorizSpacer + "*** No builds found in build directory", EditorStyles.boldLabel);
+ }
+ else
+ {
+ foreach (var fullBuildLocation in this.builds)
+ {
+ int lastBackslashIndex = fullBuildLocation.LastIndexOf("\\");
+
+ var directoryDate = Directory.GetLastWriteTime(fullBuildLocation).ToString("yyyy/MM/dd HH:mm:ss");
+ string packageName = fullBuildLocation.Substring(lastBackslashIndex + 1);
+
+ EditorGUILayout.BeginHorizontal();
+ GUILayout.Space(GUISectionOffset + 15);
+ if (GUILayout.Button("Install", GUILayout.Width(120.0f)))
+ {
+ string thisBuildLocation = fullBuildLocation;
+ string[] IPlist = ParseIPList(curTargetIps);
+ EditorApplication.delayCall += () =>
+ {
+ InstallAppOnDevicesList(thisBuildLocation, curFullReinstall, IPlist);
+ };
+ }
+ GUILayout.Space(5);
+ GUILayout.Label(packageName + " (" + directoryDate + ")");
+ EditorGUILayout.EndHorizontal();
+ }
+ EditorGUILayout.Separator();
+ }
+ GUILayout.EndVertical();
+
+ GUILayout.Space(GUISectionOffset);
+
+ // Utilities section
+ GUILayout.BeginVertical();
+ GUILayout.Label("Utilities");
+
+ // Open web portal
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUI.enabled = ShouldWebPortalBeEnabled;
+ GUILayout.FlexibleSpace();
+ if (GUILayout.Button("Open Device Portal", GUILayout.Width(buttonWidth_Full)))
+ {
+ OpenWebPortalForIPs(curTargetIps);
+ }
+ GUI.enabled = true;
+ }
+
+ // Launch app..
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUI.enabled = ShouldLaunchAppBeEnabled;
+ GUILayout.FlexibleSpace();
+ if (GUILayout.Button("Launch Application", GUILayout.Width(buttonWidth_Full)))
+ {
+ // If already running, kill it (button is a toggle)
+ if (IsAppRunning_FirstIPCheck(appName, curTargetIps))
+ {
+ KillAppOnIPs(curTargetIps);
+ }
+ else
+ {
+ LaunchAppOnIPs(curTargetIps);
+ }
+ }
+ GUI.enabled = true;
+ }
+
+ // Log file
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUI.enabled = ShouldLogViewBeEnabled;
+ GUILayout.FlexibleSpace();
+ if (GUILayout.Button("View Log File", GUILayout.Width(buttonWidth_Full)))
+ {
+ OpenLogFileForIPs(curTargetIps);
+ }
+ GUI.enabled = true;
+ }
+
+ // Uninstall...
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUI.enabled = ShouldLogViewBeEnabled;
+ GUILayout.FlexibleSpace();
+ if (GUILayout.Button("Uninstall Application", GUILayout.Width(buttonWidth_Full)))
+ {
+ string[] IPlist = ParseIPList(curTargetIps);
+ EditorApplication.delayCall += () =>
+ {
+ UninstallAppOnDevicesList(IPlist);
+ };
+ }
+ GUI.enabled = true;
+ }
+ GUILayout.EndVertical();
+ }
+
+ void BuildAndRun(string appName)
+ {
+ // First build SLN
+ if (!BuildDeployTools.BuildSLN(BuildDeployPrefs.BuildDirectory, false))
+ {
+ return;
+ }
+
+ // Next, APPX
+ if (!BuildDeployTools.BuildAppxFromSolution(
+ appName,
+ BuildDeployPrefs.MsBuildVersion,
+ BuildDeployPrefs.ForceRebuild,
+ BuildDeployPrefs.BuildConfig,
+ BuildDeployPrefs.BuildDirectory,
+ BuildDeployPrefs.IncrementBuildVersion))
+ {
+ return;
+ }
+
+ // Next, Install
+ string fullBuildLocation = CalcMostRecentBuild();
+ string[] IPlist = ParseIPList(BuildDeployPrefs.TargetIPs);
+ InstallAppOnDevicesList(fullBuildLocation, BuildDeployPrefs.FullReinstall, IPlist);
+ }
+
+ private string CalcMostRecentBuild()
+ {
+ UpdateBuilds();
+ DateTime mostRecent = DateTime.MinValue;
+ string mostRecentBuild = "";
+ foreach (var fullBuildLocation in this.builds)
+ {
+ DateTime directoryDate = Directory.GetLastWriteTime(fullBuildLocation);
+ if (directoryDate > mostRecent)
+ {
+ mostRecentBuild = fullBuildLocation;
+ mostRecent = directoryDate;
+ }
+ }
+ return mostRecentBuild;
+ }
+
+ private string CalcPackageFamilyName()
+ {
+ // Find the manifest
+ string[] manifests = Directory.GetFiles(BuildDeployPrefs.AbsoluteBuildDirectory, "Package.appxmanifest", SearchOption.AllDirectories);
+ if (manifests.Length == 0)
+ {
+ Debug.LogError("Unable to find manifest file for build (in path - " + BuildDeployPrefs.AbsoluteBuildDirectory + ")");
+ return "";
+ }
+ string manifest = manifests[0];
+
+ // Parse it
+ using (XmlTextReader reader = new XmlTextReader(manifest))
+ {
+ while (reader.Read())
+ {
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.Element:
+ if (reader.Name.Equals("identity", StringComparison.OrdinalIgnoreCase))
+ {
+ while (reader.MoveToNextAttribute())
+ {
+ if (reader.Name.Equals("name", StringComparison.OrdinalIgnoreCase))
+ {
+ return reader.Value;
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ Debug.LogError("Unable to find PackageFamilyName in manifest file (" + manifest + ")");
+ return "";
+ }
+
+ private void InstallAppOnDevicesList(string buildPath, bool uninstallBeforeInstall, string[] targetList)
+ {
+ string packageFamilyName = CalcPackageFamilyName();
+ if (string.IsNullOrEmpty(packageFamilyName))
+ {
+ return;
+ }
+
+ for (int i = 0; i < targetList.Length; i++)
+ {
+ try
+ {
+ bool completedUninstall = false;
+ string IP = FinalizeIP(targetList[i]);
+ if (BuildDeployPrefs.FullReinstall &&
+ BuildDeployPortal.IsAppInstalled(packageFamilyName, new BuildDeployPortal.ConnectInfo(IP, BuildDeployPrefs.DeviceUser, BuildDeployPrefs.DevicePassword)))
+ {
+ EditorUtility.DisplayProgressBar("Installing on devices", "Uninstall (" + IP + ")", (float)i / (float)targetList.Length);
+ if (!UninstallApp(packageFamilyName, IP))
+ {
+ Debug.LogError("Uninstall failed - skipping install (" + IP + ")");
+ continue;
+ }
+ completedUninstall = true;
+ }
+ EditorUtility.DisplayProgressBar("Installing on devices", "Install (" + IP + ")", (float)(i + (completedUninstall ? 0.5f : 0.0f)) / (float)targetList.Length);
+ InstallApp(buildPath, packageFamilyName, IP);
+ }
+ catch (Exception ex)
+ {
+ Debug.LogError(ex.ToString());
+ }
+ }
+ EditorUtility.ClearProgressBar();
+ }
+
+ private bool InstallApp(string buildPath, string appName, string targetDevice)
+ {
+ // Get the appx path
+ FileInfo[] files = (new DirectoryInfo(buildPath)).GetFiles("*.appx");
+ files = (files.Length == 0) ? (new DirectoryInfo(buildPath)).GetFiles("*.appxbundle") : files;
+ if (files.Length == 0)
+ {
+ Debug.LogError("No APPX found in folder build folder (" + buildPath + ")");
+ return false;
+ }
+
+ // Connection info
+ var connectInfo = new BuildDeployPortal.ConnectInfo(targetDevice, BuildDeployPrefs.DeviceUser, BuildDeployPrefs.DevicePassword);
+
+ // Kick off the install
+ Debug.Log("Installing build on: " + targetDevice);
+ return BuildDeployPortal.InstallApp(files[0].FullName, connectInfo);
+ }
+
+ private void UninstallAppOnDevicesList(string[] targetList)
+ {
+ string packageFamilyName = CalcPackageFamilyName();
+ if (string.IsNullOrEmpty(packageFamilyName))
+ {
+ return;
+ }
+
+ try
+ {
+ for (int i = 0; i < targetList.Length; i++)
+ {
+ string IP = FinalizeIP(targetList[i]);
+ EditorUtility.DisplayProgressBar("Uninstalling application", "Uninstall (" + IP + ")", (float)i / (float)targetList.Length);
+ UninstallApp(packageFamilyName, IP);
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.LogError(ex.ToString());
+ }
+ EditorUtility.ClearProgressBar();
+ }
+
+ private bool UninstallApp(string packageFamilyName, string targetDevice)
+ {
+ // Connection info
+ var connectInfo = new BuildDeployPortal.ConnectInfo(targetDevice, BuildDeployPrefs.DeviceUser, BuildDeployPrefs.DevicePassword);
+
+ // Kick off the install
+ Debug.Log("Uninstall build: " + targetDevice);
+ return BuildDeployPortal.UninstallApp(packageFamilyName, connectInfo);
+ }
+
+ private void UpdateBuilds()
+ {
+ this.builds.Clear();
+
+ try
+ {
+ List appPackageDirectories = new List();
+ string[] buildList = Directory.GetDirectories(BuildDeployPrefs.AbsoluteBuildDirectory);
+ foreach (string appBuild in buildList)
+ {
+ string appPackageDirectory = appBuild + @"\AppPackages";
+ if (Directory.Exists(appPackageDirectory))
+ {
+ appPackageDirectories.AddRange(Directory.GetDirectories(appPackageDirectory));
+ }
+ }
+ IEnumerable selectedDirectories =
+ from string directory in appPackageDirectories
+ orderby Directory.GetLastWriteTime(directory) descending
+ select Path.GetFullPath(directory);
+ this.builds.AddRange(selectedDirectories);
+ }
+ catch (DirectoryNotFoundException)
+ {
+ }
+
+ timeLastUpdatedBuilds = Time.realtimeSinceStartup;
+ }
+
+ void Update()
+ {
+ if ((Time.realtimeSinceStartup - timeLastUpdatedBuilds) > UpdateBuildsPeriod)
+ {
+ UpdateBuilds();
+ }
+ }
+
+ public static string[] ParseIPList(string IPs)
+ {
+ string[] IPlist = { };
+
+ if (IPs == null || IPs == "")
+ return IPlist;
+
+ string[] separators = { ";", " " };
+ IPlist = IPs.Split(separators, System.StringSplitOptions.RemoveEmptyEntries);
+ return IPlist;
+ }
+
+ static string FinalizeIP(string ip)
+ {
+ // If it's local, add the port
+ if (ip == "127.0.0.1")
+ {
+ ip += ":10080";
+ }
+ return ip;
+ }
+
+ public static void OpenWebPortalForIPs(string IPs)
+ {
+ string[] ipList = ParseIPList(IPs);
+ for (int i = 0; i < ipList.Length; i++)
+ {
+ string url = string.Format("http://{0}", FinalizeIP(ipList[i]));
+
+ // Run the process
+ System.Diagnostics.Process.Start(url);
+ }
+ }
+
+ bool IsAppRunning_FirstIPCheck(string appName, string targetIPs)
+ {
+ // Just pick the first one and use it...
+ string[] IPlist = ParseIPList(targetIPs);
+ if (IPlist.Length > 0)
+ {
+ string targetIP = FinalizeIP(IPlist[0]);
+ return BuildDeployPortal.IsAppRunning(
+ appName, new BuildDeployPortal.ConnectInfo(targetIP, BuildDeployPrefs.DeviceUser, BuildDeployPrefs.DevicePassword));
+ }
+ return false;
+ }
+
+ void LaunchAppOnIPs(string targetIPs)
+ {
+ string packageFamilyName = CalcPackageFamilyName();
+ if (string.IsNullOrEmpty(packageFamilyName))
+ {
+ return;
+ }
+
+ string[] IPlist = ParseIPList(targetIPs);
+ for (int i = 0; i < IPlist.Length; i++)
+ {
+ string targetIP = FinalizeIP(IPlist[i]);
+ Debug.Log("Launch app on: " + targetIP);
+ BuildDeployPortal.LaunchApp(
+ packageFamilyName, new BuildDeployPortal.ConnectInfo(targetIP, BuildDeployPrefs.DeviceUser, BuildDeployPrefs.DevicePassword));
+ }
+ }
+
+ void KillAppOnIPs(string targetIPs)
+ {
+ string packageFamilyName = CalcPackageFamilyName();
+ if (string.IsNullOrEmpty(packageFamilyName))
+ {
+ return;
+ }
+
+ string[] IPlist = ParseIPList(targetIPs);
+ for (int i = 0; i < IPlist.Length; i++)
+ {
+ string targetIP = FinalizeIP(IPlist[i]);
+ Debug.Log("Kill app on: " + targetIP);
+ BuildDeployPortal.KillApp(
+ packageFamilyName, new BuildDeployPortal.ConnectInfo(targetIP, BuildDeployPrefs.DeviceUser, BuildDeployPrefs.DevicePassword));
+ }
+ }
+
+ public void OpenLogFileForIPs(string IPs)
+ {
+ string packageFamilyName = CalcPackageFamilyName();
+ if (string.IsNullOrEmpty(packageFamilyName))
+ {
+ return;
+ }
+
+ string[] ipList = ParseIPList(IPs);
+ for (int i = 0; i < ipList.Length; i++)
+ {
+ // Use the Device Portal REST API
+ BuildDeployPortal.DeviceLogFile_View(
+ packageFamilyName, new BuildDeployPortal.ConnectInfo(FinalizeIP(ipList[i]), BuildDeployPrefs.DeviceUser, BuildDeployPrefs.DevicePassword));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployWindow.cs.meta b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployWindow.cs.meta
new file mode 100644
index 0000000..07864ba
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildDeployWindow.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6d8b4a3eedcdf774bbc71cc2a08da79f
+timeCreated: 1466615027
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildSLNUtilities.cs b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildSLNUtilities.cs
new file mode 100644
index 0000000..30022b6
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildSLNUtilities.cs
@@ -0,0 +1,517 @@
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Xml;
+using UnityEditor;
+using UnityEngine;
+
+namespace HoloToolkit.Unity
+{
+ ///
+ /// Class containing various utility methods to build a WSA solution from a Unity project.
+ ///
+ public static class BuildSLNUtilities
+ {
+ public class CopyDirectoryInfo
+ {
+ public string Source { get; set; }
+ public string Destination { get; set; }
+ public string Filter { get; set; }
+ public bool Recursive { get; set; }
+
+ public CopyDirectoryInfo()
+ {
+ Source = null;
+ Destination = null;
+ Filter = "*";
+ Recursive = false;
+ }
+ }
+
+ public class BuildInfo
+ {
+ public string OutputDirectory { get; set; }
+ public IEnumerable Scenes { get; set; }
+ public IEnumerable CopyDirectories { get; set; }
+
+ public Action PreBuildAction { get; set; }
+ public Action PostBuildAction { get; set; }
+
+ public BuildOptions BuildOptions { get; set; }
+
+ // EditorUserBuildSettings
+ public BuildTarget BuildTarget { get; set; }
+
+ public WSASDK? WSASdk { get; set; }
+
+ public WSAUWPBuildType? WSAUWPBuildType { get; set; }
+
+ public Boolean? WSAGenerateReferenceProjects { get; set; }
+
+ public ColorSpace? ColorSpace { get; set; }
+ public bool IsCommandLine { get; set; }
+ public string BuildSymbols { get; private set; }
+
+ public BuildInfo()
+ {
+ BuildSymbols = string.Empty;
+ }
+
+ public void AppendSymbols(params string[] symbol)
+ {
+ this.AppendSymbols((IEnumerable)symbol);
+ }
+
+ public void AppendSymbols(IEnumerable symbols)
+ {
+ string[] toAdd = symbols.Except(this.BuildSymbols.Split(';'))
+ .Where(sym => !string.IsNullOrEmpty(sym)).ToArray();
+
+ if (!toAdd.Any())
+ {
+ return;
+ }
+
+ if (!String.IsNullOrEmpty(this.BuildSymbols))
+ {
+ this.BuildSymbols += ";";
+ }
+
+ this.BuildSymbols += String.Join(";", toAdd);
+ }
+
+ public bool HasAnySymbols(params string[] symbols)
+ {
+ return this.BuildSymbols.Split(';').Intersect(symbols).Any();
+ }
+
+ public bool HasConfigurationSymbol()
+ {
+ return HasAnySymbols(
+ BuildSLNUtilities.BuildSymbolDebug,
+ BuildSLNUtilities.BuildSymbolRelease,
+ BuildSLNUtilities.BuildSymbolMaster);
+ }
+
+ public static IEnumerable RemoveConfigurationSymbols(string symbolstring)
+ {
+ return symbolstring.Split(';').Except(new[]
+ {
+ BuildSLNUtilities.BuildSymbolDebug,
+ BuildSLNUtilities.BuildSymbolRelease,
+ BuildSLNUtilities.BuildSymbolMaster
+ });
+ }
+
+ public bool HasAnySymbols(IEnumerable symbols)
+ {
+ return this.BuildSymbols.Split(';').Intersect(symbols).Any();
+ }
+ }
+
+ // Build configurations. Exactly one of these should be defined for any given build.
+ public const string BuildSymbolDebug = "DEBUG";
+ public const string BuildSymbolRelease = "RELEASE";
+ public const string BuildSymbolMaster = "MASTER";
+
+ ///
+ /// Event triggered when a build starts.
+ ///
+ public static event Action BuildStarted;
+
+ ///
+ /// Event triggered when a build completes.
+ ///
+ public static event Action BuildCompleted;
+
+ public static void PerformBuild(BuildInfo buildInfo)
+ {
+ BuildTargetGroup buildTargetGroup = GetGroup(buildInfo.BuildTarget);
+ string oldBuildSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup);
+ if (!string.IsNullOrEmpty(oldBuildSymbols))
+ {
+ if (buildInfo.HasConfigurationSymbol())
+ {
+ buildInfo.AppendSymbols(BuildInfo.RemoveConfigurationSymbols(oldBuildSymbols));
+ }
+ else
+ {
+ buildInfo.AppendSymbols(oldBuildSymbols.Split(';'));
+ }
+ }
+
+ if ((buildInfo.BuildOptions & BuildOptions.Development) == BuildOptions.Development)
+ {
+ if (!buildInfo.HasConfigurationSymbol())
+ {
+ buildInfo.AppendSymbols(BuildSLNUtilities.BuildSymbolDebug);
+ }
+ }
+
+ if (buildInfo.HasAnySymbols(BuildSLNUtilities.BuildSymbolDebug))
+ {
+ buildInfo.BuildOptions |= BuildOptions.Development | BuildOptions.AllowDebugging;
+ }
+
+ if (buildInfo.HasAnySymbols(BuildSLNUtilities.BuildSymbolRelease))
+ {
+ //Unity automatically adds the DEBUG symbol if the BuildOptions.Development flag is
+ //specified. In order to have debug symbols and the RELEASE symbole we have to
+ //inject the symbol Unity relies on to enable the /debug+ flag of csc.exe which is "DEVELOPMENT_BUILD"
+ buildInfo.AppendSymbols("DEVELOPMENT_BUILD");
+ }
+
+ var oldBuildTarget = EditorUserBuildSettings.activeBuildTarget;
+ EditorUserBuildSettings.SwitchActiveBuildTarget(buildInfo.BuildTarget);
+
+ var oldWSASDK = EditorUserBuildSettings.wsaSDK;
+ if (buildInfo.WSASdk.HasValue)
+ {
+ EditorUserBuildSettings.wsaSDK = buildInfo.WSASdk.Value;
+ }
+
+ WSAUWPBuildType? oldWSAUWPBuildType = null;
+ if (EditorUserBuildSettings.wsaSDK == WSASDK.UWP)
+ {
+ oldWSAUWPBuildType = EditorUserBuildSettings.wsaUWPBuildType;
+ if (buildInfo.WSAUWPBuildType.HasValue)
+ {
+ EditorUserBuildSettings.wsaUWPBuildType = buildInfo.WSAUWPBuildType.Value;
+ }
+ }
+
+ var oldWSAGenerateReferenceProjects = EditorUserBuildSettings.wsaGenerateReferenceProjects;
+ if (buildInfo.WSAGenerateReferenceProjects.HasValue)
+ {
+ EditorUserBuildSettings.wsaGenerateReferenceProjects = buildInfo.WSAGenerateReferenceProjects.Value;
+ }
+
+ var oldColorSpace = PlayerSettings.colorSpace;
+ if (buildInfo.ColorSpace.HasValue)
+ {
+ PlayerSettings.colorSpace = buildInfo.ColorSpace.Value;
+ }
+
+ if (buildInfo.BuildSymbols != null)
+ {
+ PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, buildInfo.BuildSymbols);
+ }
+
+ string buildError = "Error";
+ try
+ {
+ // For the WSA player, Unity builds into a target directory.
+ // For other players, the OutputPath parameter indicates the
+ // path to the target executable to build.
+ if (buildInfo.BuildTarget == BuildTarget.WSAPlayer)
+ {
+ Directory.CreateDirectory(buildInfo.OutputDirectory);
+ }
+
+ OnPreProcessBuild(buildInfo);
+ buildError = BuildPipeline.BuildPlayer(
+ buildInfo.Scenes.ToArray(),
+ buildInfo.OutputDirectory,
+ buildInfo.BuildTarget,
+ buildInfo.BuildOptions);
+
+ if (buildError.StartsWith("Error"))
+ {
+ throw new Exception(buildError);
+ }
+ }
+ finally
+ {
+ OnPostProcessBuild(buildInfo, buildError);
+
+ PlayerSettings.colorSpace = oldColorSpace;
+ PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, oldBuildSymbols);
+
+ EditorUserBuildSettings.wsaSDK = oldWSASDK;
+
+ if (oldWSAUWPBuildType.HasValue)
+ {
+ EditorUserBuildSettings.wsaUWPBuildType = oldWSAUWPBuildType.Value;
+ }
+
+ EditorUserBuildSettings.wsaGenerateReferenceProjects = oldWSAGenerateReferenceProjects;
+
+ EditorUserBuildSettings.SwitchActiveBuildTarget(oldBuildTarget);
+ }
+ }
+
+ public static void ParseBuildCommandLine(ref BuildInfo buildInfo)
+ {
+ string[] arguments = System.Environment.GetCommandLineArgs();
+
+ buildInfo.IsCommandLine = true;
+
+ for (int i = 0; i < arguments.Length; ++i)
+ {
+ // Can't use -buildTarget which is something Unity already takes as an argument for something.
+ if (string.Equals(arguments[i], "-duskBuildTarget", StringComparison.InvariantCultureIgnoreCase))
+ {
+ buildInfo.BuildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), arguments[++i]);
+ }
+ else if (string.Equals(arguments[i], "-wsaSDK", StringComparison.InvariantCultureIgnoreCase))
+ {
+ string wsaSdkArg = arguments[++i];
+
+ buildInfo.WSASdk = (WSASDK)Enum.Parse(typeof(WSASDK), wsaSdkArg);
+ }
+ else if (string.Equals(arguments[i], "-wsaUWPBuildType", StringComparison.InvariantCultureIgnoreCase))
+ {
+
+ buildInfo.WSAUWPBuildType = (WSAUWPBuildType)Enum.Parse(typeof(WSAUWPBuildType), arguments[++i]);
+ }
+ else if (string.Equals(arguments[i], "-wsaGenerateReferenceProjects", StringComparison.InvariantCultureIgnoreCase))
+ {
+ buildInfo.WSAGenerateReferenceProjects = Boolean.Parse(arguments[++i]);
+ }
+ else if (string.Equals(arguments[i], "-buildOutput", StringComparison.InvariantCultureIgnoreCase))
+ {
+ buildInfo.OutputDirectory = arguments[++i];
+ }
+ else if (string.Equals(arguments[i], "-buildDesc", StringComparison.InvariantCultureIgnoreCase))
+ {
+ ParseBuildDescriptionFile(arguments[++i], ref buildInfo);
+ }
+ else if (string.Equals(arguments[i], "-unityBuildSymbols", StringComparison.InvariantCultureIgnoreCase))
+ {
+ string newBuildSymbols = arguments[++i];
+ buildInfo.AppendSymbols(newBuildSymbols.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries));
+ }
+ }
+ }
+
+ public static void PerformBuild_CommandLine()
+ {
+ BuildInfo buildInfo = new BuildInfo()
+ {
+ // Use scenes from the editor build settings.
+ Scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(scene => scene.path),
+ };
+
+ ParseBuildCommandLine(ref buildInfo);
+
+ PerformBuild(buildInfo);
+ }
+
+ public static void ParseBuildDescriptionFile(string filename, ref BuildInfo buildInfo)
+ {
+ Debug.Log(string.Format(CultureInfo.InvariantCulture, "Build: Using \"{0}\" as build description", filename));
+
+ // Parse the XML file
+ XmlTextReader reader = new XmlTextReader(filename);
+
+ while (reader.Read())
+ {
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.Element:
+ if (string.Equals(reader.Name, "SceneList", StringComparison.InvariantCultureIgnoreCase))
+ {
+ // Set the scenes we want to build
+ buildInfo.Scenes = ReadSceneList(reader);
+ }
+ else if (string.Equals(reader.Name, "CopyList", StringComparison.InvariantCultureIgnoreCase))
+ {
+ // Set the directories we want to copy
+ buildInfo.CopyDirectories = ReadCopyList(reader);
+ }
+ break;
+ }
+ }
+ }
+
+ private static BuildTargetGroup GetGroup(BuildTarget buildTarget)
+ {
+ switch (buildTarget)
+ {
+ case BuildTarget.WSAPlayer:
+ return BuildTargetGroup.WSA;
+ case BuildTarget.StandaloneWindows:
+ case BuildTarget.StandaloneWindows64:
+ return BuildTargetGroup.Standalone;
+ default:
+ return BuildTargetGroup.Unknown;
+ }
+ }
+
+ private static IEnumerable ReadSceneList(XmlTextReader reader)
+ {
+ List result = new List();
+ while (reader.Read())
+ {
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.Element:
+ if (string.Equals(reader.Name, "Scene", StringComparison.InvariantCultureIgnoreCase))
+ {
+ while (reader.MoveToNextAttribute())
+ {
+ if (string.Equals(reader.Name, "Name", StringComparison.InvariantCultureIgnoreCase))
+ {
+ result.Add(reader.Value);
+ Debug.Log(string.Format(CultureInfo.InvariantCulture, "Build: Adding scene \"{0}\"", reader.Value));
+ }
+ }
+ }
+ break;
+
+ case XmlNodeType.EndElement:
+ if (string.Equals(reader.Name, "SceneList", StringComparison.InvariantCultureIgnoreCase))
+ return result;
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ private static IEnumerable ReadCopyList(XmlTextReader reader)
+ {
+ List result = new List();
+ while (reader.Read())
+ {
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.Element:
+ if (string.Equals(reader.Name, "Copy", StringComparison.InvariantCultureIgnoreCase))
+ {
+ string source = null;
+ string dest = null;
+ string filter = null;
+ bool recursive = false;
+
+ while (reader.MoveToNextAttribute())
+ {
+ if (string.Equals(reader.Name, "Source", StringComparison.InvariantCultureIgnoreCase))
+ {
+ source = reader.Value;
+ }
+ else if (string.Equals(reader.Name, "Destination", StringComparison.InvariantCultureIgnoreCase))
+ {
+ dest = reader.Value;
+ }
+ else if (string.Equals(reader.Name, "Recursive", StringComparison.InvariantCultureIgnoreCase))
+ {
+ recursive = System.Convert.ToBoolean(reader.Value);
+ }
+ else if (string.Equals(reader.Name, "Filter", StringComparison.InvariantCultureIgnoreCase))
+ {
+ filter = reader.Value;
+ }
+ }
+
+ if (source != null)
+ {
+ // Either the file specifies the Destination as well, or else CopyDirectory will use Source for Destination
+ CopyDirectoryInfo info = new CopyDirectoryInfo();
+ info.Source = source;
+ if (dest != null)
+ {
+ info.Destination = dest;
+ }
+
+ if (filter != null)
+ {
+ info.Filter = filter;
+ }
+
+ info.Recursive = recursive;
+
+ Debug.Log(string.Format(CultureInfo.InvariantCulture, @"Build: Adding {0}copy ""{1}\{2}"" => ""{3}""", info.Recursive ? "Recursive " : "", info.Source, info.Filter, info.Destination ?? info.Source));
+
+ result.Add(info);
+ }
+ }
+ break;
+
+ case XmlNodeType.EndElement:
+ if (string.Equals(reader.Name, "CopyList", StringComparison.InvariantCultureIgnoreCase))
+ return result;
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ public static void CopyDirectory(string sourceDirectoryPath, string destinationDirectoryPath, CopyDirectoryInfo directoryInfo)
+ {
+ sourceDirectoryPath = Path.Combine(sourceDirectoryPath, directoryInfo.Source);
+ destinationDirectoryPath = Path.Combine(destinationDirectoryPath, directoryInfo.Destination ?? directoryInfo.Source);
+
+ Debug.Log(string.Format(CultureInfo.InvariantCulture, @"{0} ""{1}\{2}"" to ""{3}""", directoryInfo.Recursive ? "Recursively copying" : "Copying", sourceDirectoryPath, directoryInfo.Filter, destinationDirectoryPath));
+
+ foreach (string sourceFilePath in Directory.GetFiles(sourceDirectoryPath, directoryInfo.Filter, directoryInfo.Recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly))
+ {
+ string destinationFilePath = sourceFilePath.Replace(sourceDirectoryPath, destinationDirectoryPath);
+ try
+ {
+ Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath));
+ if (File.Exists(destinationFilePath))
+ {
+ File.SetAttributes(destinationFilePath, FileAttributes.Normal);
+ }
+ File.Copy(sourceFilePath, destinationFilePath, true);
+ File.SetAttributes(destinationFilePath, FileAttributes.Normal);
+ }
+ catch (Exception exception)
+ {
+ Debug.LogError(string.Format(CultureInfo.InvariantCulture, "Failed to copy \"{0}\" to \"{1}\" with \"{2}\"", sourceFilePath, destinationFilePath, exception));
+ }
+ }
+ }
+
+ private static void OnPreProcessBuild(BuildInfo buildInfo)
+ {
+ // Raise the global event for listeners
+ BuildStarted.RaiseEvent(buildInfo);
+
+ // Call the pre-build action, if any
+ if (buildInfo.PreBuildAction != null)
+ {
+ buildInfo.PreBuildAction(buildInfo);
+ }
+ }
+
+ private static void OnPostProcessBuild(BuildInfo buildInfo, string buildError)
+ {
+ if (string.IsNullOrEmpty(buildError))
+ {
+ if (buildInfo.CopyDirectories != null)
+ {
+ string inputProjectDirectoryPath = GetProjectPath();
+ string outputProjectDirectoryPath = Path.Combine(GetProjectPath(), buildInfo.OutputDirectory);
+ foreach (var directory in buildInfo.CopyDirectories)
+ {
+ CopyDirectory(inputProjectDirectoryPath, outputProjectDirectoryPath, directory);
+ }
+ }
+ }
+
+ // Raise the global event for listeners
+ BuildCompleted.RaiseEvent(buildInfo, buildError);
+
+ // Call the post-build action, if any
+ if (buildInfo.PostBuildAction != null)
+ {
+ buildInfo.PostBuildAction(buildInfo, buildError);
+ }
+ }
+
+ private static string GetProjectPath()
+ {
+ return Path.GetDirectoryName(Path.GetFullPath(Application.dataPath));
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/BuildSLNUtilities.cs.meta b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildSLNUtilities.cs.meta
new file mode 100644
index 0000000..d8ccbe5
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/BuildSLNUtilities.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b404a9703a0c1784b9c8f2de897cae3b
+timeCreated: 1466615028
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/HoloToolkitCommands.cs b/HoloBot/Assets/HoloToolkit/Build/Editor/HoloToolkitCommands.cs
new file mode 100644
index 0000000..b1d4805
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/HoloToolkitCommands.cs
@@ -0,0 +1,20 @@
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+//
+
+using HoloToolkit.Unity;
+
+///
+/// Implements functionality for building HoloLens applications
+///
+public static class HoloToolkitCommands
+{
+ ///
+ /// Do a build configured for the HoloLens, returns the error from BuildPipeline.BuildPlayer
+ ///
+ public static bool BuildSLN()
+ {
+ return BuildDeployTools.BuildSLN(BuildDeployPrefs.BuildDirectory, false);
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/HoloToolkitCommands.cs.meta b/HoloBot/Assets/HoloToolkit/Build/Editor/HoloToolkitCommands.cs.meta
new file mode 100644
index 0000000..d407d7d
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/HoloToolkitCommands.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 85636330e25a7ac4c81b19530c5b8282
+timeCreated: 1464366824
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/XdeGuestLocator.cs b/HoloBot/Assets/HoloToolkit/Build/Editor/XdeGuestLocator.cs
new file mode 100644
index 0000000..79ba22f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/XdeGuestLocator.cs
@@ -0,0 +1,150 @@
+//
+// Copyright (c) Microsoft Corporation
+// Copyright (c) Rafael Rivera
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+//
+
+using System;
+using System.Linq;
+using System.Net;
+using System.Net.NetworkInformation;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Threading;
+
+namespace HoloToolkit.Unity
+{
+ public static class XdeGuestLocator
+ {
+ [StructLayout(LayoutKind.Sequential, Pack = 4)]
+ struct XdePeerHostIdentifier
+ {
+ public Guid GuestDiscoveryGUID;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
+ public byte[] GuestMACAddress;
+ public int PeerDiscoveryPort;
+ }
+
+ [StructLayout(LayoutKind.Sequential, Pack = 4)]
+ struct XdePeerGuestIdentifier
+ {
+ public Guid GuestDiscoveryGUID;
+ public int GuestTcpPort;
+ public int GuestSvcVersion;
+ }
+
+ public static bool IsSearching { get; private set; }
+ public static bool HasData { get; private set; }
+ public static IPAddress GuestIpAddress { get; private set; }
+
+ static XdeGuestLocator()
+ {
+ HasData = false;
+ IsSearching = false;
+ }
+
+ public static void FindGuestAddressAsync()
+ {
+ if (IsSearching)
+ return;
+
+ ThreadPool.QueueUserWorkItem((_) =>
+ {
+ IsSearching = true;
+ HasData = false;
+ GuestIpAddress = IPAddress.None;
+
+ var internalSwitchAddressInfo = GetInternalSwitchAddressInfo();
+ if (internalSwitchAddressInfo != null)
+ {
+ using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
+ {
+ try
+ {
+ // Bind to next available UDP port for a listen operation
+ socket.Blocking = true;
+ socket.ReceiveTimeout = (int)TimeSpan.FromSeconds(5).TotalMilliseconds;
+
+ socket.Bind(new IPEndPoint(internalSwitchAddressInfo.Address, 0));
+ var localPort = (socket.LocalEndPoint as IPEndPoint).Port;
+
+ // Send out a probe to 'devices' connected to the internal switch
+ // listening on port 3553 (Microsoft Device Emulator specific)
+ var broadcastAddress = GetBroadcastAddressForAddress(internalSwitchAddressInfo.Address, internalSwitchAddressInfo.IPv4Mask);
+ var broadcastTarget = new IPEndPoint(broadcastAddress, 3553);
+
+ //
+ // WORKAROUND: We don't have easy access to WMI to go querying
+ // for virtual machine information so we just cover finding
+ // the first 255 potential candidates xx 00 - xx FF.
+ //
+ // It sounds like a lot but we're talking super tiny
+ // payloads on an internal interface. It's very fast.
+ //
+ for (int i = 0; i <= 0xFF; i++)
+ {
+ var probe = GenerateProbe(localPort, i);
+ socket.SendTo(probe, broadcastTarget);
+ }
+
+ // Return the endpoint information for the first 'device' that replies
+ // (we don't necessarily care about the returned identifier info)
+ var responseBytes = new byte[Marshal.SizeOf(typeof(XdePeerGuestIdentifier))];
+
+ EndPoint guestEndpoint = new IPEndPoint(broadcastAddress, 0);
+
+ socket.ReceiveFrom(responseBytes, ref guestEndpoint);
+ GuestIpAddress = (guestEndpoint as IPEndPoint).Address;
+ HasData = true;
+ }
+ catch (SocketException)
+ {
+ // Do nothing, our probe went unanswered or failed
+ }
+ }
+ }
+
+ IsSearching = false;
+ });
+ }
+
+ private static UnicastIPAddressInformation GetInternalSwitchAddressInfo()
+ {
+ var internalSwitch = GetInternalNetworkSwitchInterface();
+ return internalSwitch.GetIPProperties().UnicastAddresses.Where(a => a.Address.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault();
+ }
+
+ private static NetworkInterface GetInternalNetworkSwitchInterface()
+ {
+ return NetworkInterface.GetAllNetworkInterfaces().Where(i => i.Name.Contains("Windows Phone Emulator")).FirstOrDefault();
+ }
+
+ private static IPAddress GetBroadcastAddressForAddress(IPAddress address, IPAddress mask)
+ {
+ var addressInt = BitConverter.ToInt32(address.GetAddressBytes(), 0);
+ var maskInt = BitConverter.ToInt32(mask.GetAddressBytes(), 0);
+ return new IPAddress(BitConverter.GetBytes((addressInt | ~maskInt)));
+ }
+
+ private static byte[] GenerateProbe(int port, int machineIndex)
+ {
+ var identifier = new XdePeerHostIdentifier();
+ identifier.PeerDiscoveryPort = port;
+ identifier.GuestDiscoveryGUID = new Guid("{963ef858-2efe-4eb4-8d2d-fed5408e6441}");
+ identifier.GuestMACAddress = new byte[] { 0x02, 0xDE, 0xDE, 0xDE, 0xDE, (byte)machineIndex };
+
+ return GetStructureBytes(identifier);
+ }
+
+ private static byte[] GetStructureBytes(object obj)
+ {
+ var bytes = new byte[Marshal.SizeOf(obj)];
+
+ var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
+ Marshal.StructureToPtr(obj, handle.AddrOfPinnedObject(), false);
+ handle.Free();
+
+ return bytes;
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Build/Editor/XdeGuestLocator.cs.meta b/HoloBot/Assets/HoloToolkit/Build/Editor/XdeGuestLocator.cs.meta
new file mode 100644
index 0000000..ccb6283
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/Editor/XdeGuestLocator.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 05d1324a6d6a0d248848b4042ad6d6bf
+timeCreated: 1471035499
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Build/README.md b/HoloBot/Assets/HoloToolkit/Build/README.md
new file mode 100644
index 0000000..eb24e00
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/README.md
@@ -0,0 +1,20 @@
+## [Build]()
+Build and deploy automation window for building your VS solution, APPX, installing, launching, and getting the log file (and other related functionality). Requires that the device has been paired with the Editor PC & that the device is connected locally and/or the HTTPS requirement has been disabled in the device portal's security tab.
+
+### [Editor](Editor)
+
+#### BuildDeployPortal.cs
+Interface function with the device (REST API utility functions)
+
+#### BuildDeployTools.cs
+Supports building the APPX from the SLN
+
+#### BuildSLNUtilities.cs
+Supports building the project SLN
+
+#### BuildDeployWindow.cs
+Editor UI for the window and event functions
+
+---
+##### [Go back up to the table of contents.](../../../README.md)
+---
diff --git a/HoloBot/Assets/HoloToolkit/Build/README.md.meta b/HoloBot/Assets/HoloToolkit/Build/README.md.meta
new file mode 100644
index 0000000..10597bf
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Build/README.md.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5f2ca3e609a009d42a94ea2ff016c6d5
+timeCreated: 1470705588
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform.meta b/HoloBot/Assets/HoloToolkit/CrossPlatform.meta
new file mode 100644
index 0000000..e9a8d57
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: fda2aad5b5c133648a67aea343382f86
+folderAsset: yes
+timeCreated: 1460485043
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/README.md b/HoloBot/Assets/HoloToolkit/CrossPlatform/README.md
new file mode 100644
index 0000000..c5a78eb
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/README.md
@@ -0,0 +1,2 @@
+## [CrossPlatform]()
+Wrapper scripts for Win32 and WinRT APIs in a single API call that works in the Unity editor and in a UWP application.
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/README.md.meta b/HoloBot/Assets/HoloToolkit/CrossPlatform/README.md.meta
new file mode 100644
index 0000000..98107e1
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/README.md.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d783ff4004151e94ab8c4d4762ffb611
+timeCreated: 1470705588
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts.meta b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts.meta
new file mode 100644
index 0000000..f6bfc70
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 3d81668a4e43f244086c21406427364b
+folderAsset: yes
+timeCreated: 1461620414
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/MetroHandleRef.cs b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/MetroHandleRef.cs
new file mode 100644
index 0000000..e99837b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/MetroHandleRef.cs
@@ -0,0 +1,44 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#if UNITY_METRO && !UNITY_EDITOR
+
+using System;
+
+namespace System.Runtime.InteropServices
+{
+ [ComVisible (true)]
+ public struct HandleRef
+ {
+ object wrapper;
+ IntPtr handle;
+
+ public HandleRef (object wrapper, IntPtr handle)
+ {
+ this.wrapper = wrapper;
+ this.handle = handle;
+ }
+
+ public IntPtr Handle
+ {
+ get { return handle; }
+ }
+
+ public object Wrapper
+ {
+ get { return wrapper; }
+ }
+
+ public static explicit operator IntPtr (HandleRef value)
+ {
+ return value.Handle;
+ }
+
+ public static IntPtr ToIntPtr(HandleRef value)
+ {
+ return value.Handle;
+ }
+ }
+}
+
+#endif
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/MetroHandleRef.cs.meta b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/MetroHandleRef.cs.meta
new file mode 100644
index 0000000..c32a09b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/MetroHandleRef.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 500e1009ee758464a99d024a7119653a
+timeCreated: 1455735877
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection.meta b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection.meta
new file mode 100644
index 0000000..08c0258
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: bdeaecb2c7be32b4189a79a9406b9665
+folderAsset: yes
+timeCreated: 1455735875
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/ReflectionExtensions.cs b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/ReflectionExtensions.cs
new file mode 100644
index 0000000..a311f0e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/ReflectionExtensions.cs
@@ -0,0 +1,205 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+namespace HoloToolkit
+{
+#if UNITY_METRO && !UNITY_EDITOR
+
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Reflection;
+ using System.Text;
+
+ public static class ReflectionExtensions
+ {
+ public static EventInfo GetEvent(this Type type, string eventName)
+ {
+ return type.GetRuntimeEvent(eventName);
+ }
+
+ public static MethodInfo GetMethod(this Type type, string methodName)
+ {
+ return GetMethod(type, methodName, (BindingFlags)0x0);
+ }
+
+ public static MethodInfo GetMethod(this Type type, string methodName, BindingFlags flags)
+ {
+ var result = type.GetTypeInfo().GetDeclaredMethod(methodName);
+ if (((flags & BindingFlags.FlattenHierarchy) != 0) && result == null)
+ {
+ var baseType = type.GetBaseType();
+ if (baseType != null)
+ {
+ return GetMethod(baseType, methodName, flags);
+ }
+ }
+
+ return result;
+ }
+
+ public static MethodInfo GetMethod(this Type type, string methodName, BindingFlags bindingAttr, Object binder, Type[] parameters, Object[] modifiers)
+ {
+ var result = type.GetTypeInfo().GetDeclaredMethod(methodName);
+ if (result == null)
+ {
+ var baseType = type.GetBaseType();
+ if (baseType != null)
+ {
+ return GetMethod(baseType, methodName, bindingAttr, binder, parameters, modifiers);
+ }
+ }
+
+ return result;
+ }
+
+ public static MethodInfo GetMethod(this Type type, string methodName, Type[] parameters)
+ {
+ return GetMethods(type).Where(m => m.Name == methodName).FirstOrDefault(
+ m =>
+ {
+ var types = m.GetParameters().Select(p => p.ParameterType).ToArray();
+ if (types.Length == parameters.Length)
+ {
+ for (int idx = 0; idx < types.Length; idx++)
+ {
+ if (types[idx] != parameters[idx])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ );
+ }
+
+ public static IEnumerable GetMethods(this Type type)
+ {
+ return GetMethods(type, (BindingFlags)0x0);
+ }
+
+ public static IEnumerable GetMethods(this Type type, BindingFlags flags)
+ {
+ return type.GetTypeInfo().GetMethods(flags);
+ }
+
+ public static IEnumerable GetMethods(this TypeInfo type)
+ {
+ return GetMethods(type, (BindingFlags)0x0);
+ }
+
+ public static IEnumerable GetMethods(this TypeInfo type, BindingFlags flags)
+ {
+ return type.DeclaredMethods;
+ }
+
+ public static IEnumerable GetFields(this Type type)
+ {
+ return GetFields(type, (BindingFlags)0x0);
+ }
+
+ public static IEnumerable GetFields(this Type type, BindingFlags flags)
+ {
+ return type.GetTypeInfo().DeclaredFields;
+ }
+
+ public static FieldInfo GetField(this Type type, string fieldName)
+ {
+ return type.GetRuntimeField(fieldName);
+ }
+
+ public static IEnumerable GetProperties(this Type type, BindingFlags flags)
+ {
+ return type.GetTypeInfo().DeclaredProperties;
+ }
+
+ public static PropertyInfo GetProperty(this Type type, string propertyName)
+ {
+ return GetProperty(type, propertyName, (BindingFlags)0x0);
+ }
+
+ public static PropertyInfo GetProperty(this Type type, string propertyName, BindingFlags flags)
+ {
+ return type.GetRuntimeProperty (propertyName);
+ }
+
+ public static PropertyInfo GetProperty(this Type type, string propertyName, Type returnType)
+ {
+ return type.GetRuntimeProperty (propertyName);
+ }
+
+ public static IEnumerable GetTypes(this Assembly assembly)
+ {
+ return assembly.DefinedTypes;
+ }
+
+ public static bool IsSubclassOf(this Type type, Type c)
+ {
+ return type.GetTypeInfo().IsSubclassOf(c);
+ }
+
+ public static bool IsAssignableFrom(this Type type, Type c)
+ {
+ return type.IsAssignableFrom(c.GetTypeInfo());
+ }
+
+ public static bool IsEnum(this Type type)
+ {
+ return type.GetTypeInfo().IsEnum;
+ }
+
+ public static bool IsValueType(this Type type)
+ {
+ return type.GetTypeInfo().IsValueType;
+ }
+
+ public static bool IsAssignableFrom(this Type type, TypeInfo typeInfo)
+ {
+ return type.GetTypeInfo().IsAssignableFrom(typeInfo);
+ }
+
+ public static object[] GetCustomAttributes(this Type type, bool inherit)
+ {
+ return type.GetTypeInfo().GetCustomAttributes(inherit).ToArray();
+ }
+
+ public static object[] GetCustomAttributes(this Type type, Type attributeType, bool inherit)
+ {
+ return type.GetTypeInfo().GetCustomAttributes(attributeType, inherit).ToArray();
+ }
+ }
+#else
+
+ using System;
+
+ public static class ReflectionExtensions
+ {
+ public static Type GetTypeInfo(this Type type)
+ {
+ return type;
+ }
+
+ public static Type AsType(this Type type)
+ {
+ return type;
+ }
+
+ public static bool IsEnum(this Type type)
+ {
+ return type.IsEnum;
+ }
+
+ public static bool IsValueType(this Type type)
+ {
+ return type.IsValueType;
+ }
+ }
+
+#endif
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/ReflectionExtensions.cs.meta b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/ReflectionExtensions.cs.meta
new file mode 100644
index 0000000..64eafe2
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/ReflectionExtensions.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4c2b96480b1495240abdd386973208bc
+timeCreated: 1455735878
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/TypeUtils.cs b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/TypeUtils.cs
new file mode 100644
index 0000000..b427f9f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/TypeUtils.cs
@@ -0,0 +1,20 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+
+public static class TypeUtils
+{
+ public static Type GetBaseType(this Type type)
+ {
+#if UNITY_METRO && !UNITY_EDITOR
+ return type.GetTypeInfo().BaseType;
+#else
+ return type.BaseType;
+#endif
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/TypeUtils.cs.meta b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/TypeUtils.cs.meta
new file mode 100644
index 0000000..b3fe204
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/Reflection/TypeUtils.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9c0c186978d78cd47b7b1ab5eebef190
+timeCreated: 1455735877
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/SystemException.cs b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/SystemException.cs
new file mode 100644
index 0000000..3de8007
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/SystemException.cs
@@ -0,0 +1,14 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#if UNITY_METRO && !UNITY_EDITOR
+namespace System
+{
+ public class SystemException : Exception
+ {
+ public SystemException() {}
+ public SystemException(string message) : base(message) {}
+ public SystemException(string message, Exception innerException) : base(message, innerException) {}
+ }
+}
+#endif
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/SystemException.cs.meta b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/SystemException.cs.meta
new file mode 100644
index 0000000..c5aa5db
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/CrossPlatform/Scripts/SystemException.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 21fa6729dce79604cb2e68a4e4975f31
+timeCreated: 1455735878
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input.meta b/HoloBot/Assets/HoloToolkit/Input.meta
new file mode 100644
index 0000000..f00e2db
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 12e2218b44bb5d046b63543ecbec9320
+folderAsset: yes
+timeCreated: 1455735874
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations.meta b/HoloBot/Assets/HoloToolkit/Input/Animations.meta
new file mode 100644
index 0000000..95aee71
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a4f8cd12149a6a44daed964307564cf4
+folderAsset: yes
+timeCreated: 1469491980
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor.meta b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor.meta
new file mode 100644
index 0000000..08ffadf
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 012e902635965e648a446fdb85fbc0bc
+folderAsset: yes
+timeCreated: 1471370056
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleAnim.anim b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleAnim.anim
new file mode 100644
index 0000000..2519162
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleAnim.anim
@@ -0,0 +1,557 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: CursorIdleAnim
+ serializedVersion: 6
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.2, y: 0.12, z: 0.12}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_bottom/group_bottom_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.2, y: 0.12, z: 0.12}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_right/group_right_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.2, y: 0.12, z: 0.12}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_top/group_top_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.2, y: 0.12, z: 0.12}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_left/group_left_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 1e-12, y: 1, z: 1e-12}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 1e-12, y: 1, z: 1e-12}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 1e-12, y: 1, z: 1e-12}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 1e-12, y: 1, z: 1e-12}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ m_FloatCurves: []
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings:
+ - path: 3710432714
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 126587603
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 465560934
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 1727328515
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 3874640233
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 959005715
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 2642251072
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 666372584
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.2
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.2
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.2
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.2
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1e-12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1e-12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1e-12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1e-12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1e-12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1e-12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1e-12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1e-12
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_GenerateMotionCurves: 0
+ m_Events: []
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleAnim.anim.meta b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleAnim.anim.meta
new file mode 100644
index 0000000..938612a
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleAnim.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 723e3cf6cbe716d48a51b519af6c3d12
+timeCreated: 1469492030
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleRingAnim.anim b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleRingAnim.anim
new file mode 100644
index 0000000..b2ed197
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleRingAnim.anim
@@ -0,0 +1,557 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: CursorIdleRingAnim
+ serializedVersion: 6
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.25, y: 0.34, z: 0.34}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_bottom/group_bottom_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.25, y: 0.34, z: 0.34}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_right/group_right_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.25, y: 0.34, z: 0.34}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_top/group_top_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.25, y: 0.34, z: 0.34}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_left/group_left_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.4, y: 1, z: 0.4}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.4, y: 1, z: 0.4}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.4, y: 1, z: 0.4}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.4, y: 1, z: 0.4}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ m_FloatCurves: []
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings:
+ - path: 3710432714
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 126587603
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 465560934
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 1727328515
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 3874640233
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 959005715
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 2642251072
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 666372584
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.25
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.25
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.25
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.25
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_GenerateMotionCurves: 0
+ m_Events: []
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleRingAnim.anim.meta b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleRingAnim.anim.meta
new file mode 100644
index 0000000..08eb3bf
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorIdleRingAnim.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2839abb4143744c42a5a03638402bf3d
+timeCreated: 1469492812
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorSimple.controller b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorSimple.controller
new file mode 100644
index 0000000..d8704e2
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorSimple.controller
@@ -0,0 +1,395 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!91 &9100000
+AnimatorController:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: CursorSimple
+ serializedVersion: 5
+ m_AnimatorParameters:
+ - m_Name: CursorState
+ m_Type: 3
+ m_DefaultFloat: 0
+ m_DefaultInt: 0
+ m_DefaultBool: 0
+ m_Controller: {fileID: 9100000}
+ - m_Name: Waiting
+ m_Type: 4
+ m_DefaultFloat: 0
+ m_DefaultInt: 0
+ m_DefaultBool: 0
+ m_Controller: {fileID: 9100000}
+ m_AnimatorLayers:
+ - serializedVersion: 5
+ m_Name: Base Layer
+ m_StateMachine: {fileID: 1107000012411608062}
+ m_Mask: {fileID: 0}
+ m_Motions: []
+ m_Behaviours: []
+ m_BlendingMode: 0
+ m_SyncedLayerIndex: -1
+ m_DefaultWeight: 0
+ m_IKPass: 0
+ m_SyncedLayerAffectsTiming: 0
+ m_Controller: {fileID: 9100000}
+--- !u!1101 &1101000010828608862
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 6
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 1
+ - m_ConditionMode: 2
+ m_ConditionEvent: Waiting
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000011207584938}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000011440333832
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 6
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000011207584938}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.16698036
+ m_TransitionOffset: 0.009568994
+ m_ExitTime: 0.33066684
+ m_HasExitTime: 0
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 2
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000011538347200
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 1
+ m_ConditionEvent: Waiting
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000014076186502}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.15724894
+ m_TransitionOffset: 0.022260668
+ m_ExitTime: 0.32865316
+ m_HasExitTime: 0
+ m_HasFixedDuration: 0
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000011595753820
+AnimatorStateTransition:
+ m_ObjectHideFlags: 3
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions: []
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000010278683378}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000011596768198
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 7
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 0
+ - m_ConditionMode: 7
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 1
+ - m_ConditionMode: 7
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 4
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000010278683378}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.15544242
+ m_TransitionOffset: 0.019172242
+ m_ExitTime: 0.17148435
+ m_HasExitTime: 0
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 2
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000011705696456
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 6
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 4
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000011207584938}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.19568625
+ m_TransitionOffset: 0.00000029802337
+ m_ExitTime: 0.3163139
+ m_HasExitTime: 0
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000012715224120
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 7
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 0
+ - m_ConditionMode: 7
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 1
+ - m_ConditionMode: 2
+ m_ConditionEvent: Waiting
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000010278683378}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 0
+ m_HasFixedDuration: 0
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000013083093568
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 6
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 1
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000011207584938}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.1
+ m_TransitionOffset: 0
+ m_ExitTime: 0.9
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000013631508342
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 6
+ m_ConditionEvent: CursorState
+ m_EventTreshold: 0
+ - m_ConditionMode: 2
+ m_ConditionEvent: Waiting
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000011207584938}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1101 &1101000014013473872
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 1
+ m_ConditionEvent: Waiting
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 1102000014076186502}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.14526263
+ m_TransitionOffset: 0.0000004768374
+ m_ExitTime: 0.31158686
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1102 &1102000010278683378
+AnimatorState:
+ serializedVersion: 5
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: Ring_Idle
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: 1101000011538347200}
+ - {fileID: 1101000011440333832}
+ - {fileID: 1101000011705696456}
+ - {fileID: 1101000013083093568}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: 2839abb4143744c42a5a03638402bf3d, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+--- !u!1102 &1102000011207584938
+AnimatorState:
+ serializedVersion: 5
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: Dot_Idle
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: 1101000011596768198}
+ - {fileID: 1101000014013473872}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: 723e3cf6cbe716d48a51b519af6c3d12, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+--- !u!1102 &1102000014076186502
+AnimatorState:
+ serializedVersion: 5
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: Waiting
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: 1101000012715224120}
+ - {fileID: 1101000013631508342}
+ - {fileID: 1101000010828608862}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: 7caf8d0b09b859b4ea5102f8bd5c21f5, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+--- !u!1107 &1107000012411608062
+AnimatorStateMachine:
+ serializedVersion: 5
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: Base Layer
+ m_ChildStates:
+ - serializedVersion: 1
+ m_State: {fileID: 1102000011207584938}
+ m_Position: {x: 144, y: 276, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: 1102000010278683378}
+ m_Position: {x: 528, y: 276, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: 1102000014076186502}
+ m_Position: {x: 324, y: 144, z: 0}
+ m_ChildStateMachines: []
+ m_AnyStateTransitions: []
+ m_EntryTransitions: []
+ m_StateMachineTransitions: {}
+ m_StateMachineBehaviours: []
+ m_AnyStatePosition: {x: 240, y: -60, z: 0}
+ m_EntryPosition: {x: 84, y: 144, z: 0}
+ m_ExitPosition: {x: 240, y: 0, z: 0}
+ m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
+ m_DefaultState: {fileID: 1102000011207584938}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorSimple.controller.meta b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorSimple.controller.meta
new file mode 100644
index 0000000..cd0eec1
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorSimple.controller.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3f41b1c17f75cab40b11bb814443f19c
+timeCreated: 1478109884
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorWaitingAnim.anim b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorWaitingAnim.anim
new file mode 100644
index 0000000..70988c3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorWaitingAnim.anim
@@ -0,0 +1,874 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: CursorWaitingAnim
+ serializedVersion: 6
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: -0, y: 0, z: 0}
+ inSlope: {x: 0, y: 360, z: 0}
+ outSlope: {x: 0, y: 360, z: 0}
+ tangentMode: 0
+ - time: 0.25
+ value: {x: -0, y: 90, z: 0}
+ inSlope: {x: 0, y: 360, z: 0}
+ outSlope: {x: 0, y: 360, z: 0}
+ tangentMode: 0
+ - time: 0.5
+ value: {x: -0, y: 180, z: 0}
+ inSlope: {x: 0, y: 360, z: 0}
+ outSlope: {x: 0, y: 360, z: 0}
+ tangentMode: 0
+ - time: 0.75
+ value: {x: -0, y: 270, z: 0}
+ inSlope: {x: 0, y: 360.03345, z: 0}
+ outSlope: {x: 0, y: 360.03345, z: 0}
+ tangentMode: 0
+ - time: 1
+ value: {x: -0, y: 360.01672, z: 0}
+ inSlope: {x: 0, y: 360.0669, z: 0}
+ outSlope: {x: 0, y: 360.0669, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path:
+ m_PositionCurves: []
+ m_ScaleCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.25, y: 0.34, z: 0.34}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_bottom/group_bottom_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.25, y: 0.34, z: 0.34}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_right/group_right_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.25, y: 0.34, z: 0.34}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_top/group_top_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.25, y: 0.34, z: 0.34}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_left/group_left_joint_outer
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.4, y: 1, z: 0.4}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.4, y: 1, z: 0.4}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.4, y: 1, z: 0.4}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: {x: 0.4, y: 1, z: 0.4}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ m_FloatCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: material._Color.r
+ path: group_top/mesh_top
+ classID: 137
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.751724
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: material._Color.g
+ path: group_top/mesh_top
+ classID: 137
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: material._Color.b
+ path: group_top/mesh_top
+ classID: 137
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: material._Color.a
+ path: group_top/mesh_top
+ classID: 137
+ script: {fileID: 0}
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings:
+ - path: 0
+ attribute: 4
+ script: {fileID: 0}
+ classID: 4
+ customType: 14
+ isPPtrCurve: 0
+ - path: 3710432714
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 126587603
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 465560934
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 1727328515
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 3874640233
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 959005715
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 2642251072
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 666372584
+ attribute: 3
+ script: {fileID: 0}
+ classID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - path: 479252526
+ attribute: 1303350129
+ script: {fileID: 0}
+ classID: 137
+ customType: 22
+ isPPtrCurve: 0
+ - path: 479252526
+ attribute: 1571785585
+ script: {fileID: 0}
+ classID: 137
+ customType: 22
+ isPPtrCurve: 0
+ - path: 479252526
+ attribute: 1840221041
+ script: {fileID: 0}
+ classID: 137
+ customType: 22
+ isPPtrCurve: 0
+ - path: 479252526
+ attribute: 2108656497
+ script: {fileID: 0}
+ classID: 137
+ customType: 22
+ isPPtrCurve: 0
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 1
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 1
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: -0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ - time: 0.25
+ value: -0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ - time: 0.5
+ value: -0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ - time: 0.75
+ value: -0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ - time: 1
+ value: -0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: localEulerAnglesRaw.x
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0
+ inSlope: 360
+ outSlope: 360
+ tangentMode: 10
+ - time: 0.25
+ value: 90
+ inSlope: 360
+ outSlope: 360
+ tangentMode: 10
+ - time: 0.5
+ value: 180
+ inSlope: 360
+ outSlope: 360
+ tangentMode: 10
+ - time: 0.75
+ value: 270
+ inSlope: 360.03345
+ outSlope: 360.03345
+ tangentMode: 10
+ - time: 1
+ value: 360.01672
+ inSlope: 360.0669
+ outSlope: 360.0669
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: localEulerAnglesRaw.y
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ - time: 0.25
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ - time: 0.5
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ - time: 0.75
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ - time: 1
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: localEulerAnglesRaw.z
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.25
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_bottom/group_bottom_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.25
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_right/group_right_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.25
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_top/group_top_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.25
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.34
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_left/group_left_joint_outer
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_bottom/group_bottom_joint_outer/group_bottom_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_right/group_right_joint_outer/group_right_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_left/group_left_joint_outer/group_left_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.4
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: group_top/group_top_joint_outer/group_top_joint_inner
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: material._Color.r
+ path: group_top/mesh_top
+ classID: 137
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0.751724
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: material._Color.g
+ path: group_top/mesh_top
+ classID: 137
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: material._Color.b
+ path: group_top/mesh_top
+ classID: 137
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 10
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: material._Color.a
+ path: group_top/mesh_top
+ classID: 137
+ script: {fileID: 0}
+ m_EulerEditorCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve: []
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalEulerAngles.x
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve: []
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalEulerAngles.y
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve: []
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalEulerAngles.z
+ path:
+ classID: 4
+ script: {fileID: 0}
+ m_HasGenericRootTransform: 1
+ m_HasMotionFloatCurves: 0
+ m_GenerateMotionCurves: 0
+ m_Events: []
diff --git a/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorWaitingAnim.anim.meta b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorWaitingAnim.anim.meta
new file mode 100644
index 0000000..c72abc8
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Animations/Cursor/CursorWaitingAnim.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7caf8d0b09b859b4ea5102f8bd5c21f5
+timeCreated: 1469555750
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials.meta b/HoloBot/Assets/HoloToolkit/Input/Materials.meta
new file mode 100644
index 0000000..7f36a85
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 2e3fe1de8ee419a4fb5485ac62ee16a4
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials/CursorMaterial.mat b/HoloBot/Assets/HoloToolkit/Input/Materials/CursorMaterial.mat
new file mode 100644
index 0000000..94e5199
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials/CursorMaterial.mat
@@ -0,0 +1,204 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: CursorMaterial
+ m_Shader: {fileID: 4800000, guid: 51c87b08c4bd5cd4eabce20953fbe2e7, type: 3}
+ m_ShaderKeywords: ALBEDO_OFF ALPHA_USAGE_OFF AMBIENTLIGHT_OFF CUBEMAP_OFF EMISSIVE_OFF
+ FRESNEL_OFF LIGHTMAP_OFF LIGHTPROBES_OFF LIGHT_OFF NEARCLIP_OFF NORMAL_OFF SHOWDEBUG_OFF
+ TINT_OFF VERTCOLOR_OFF _FOG_OFF
+ m_LightmapFlags: 0
+ m_CustomRenderQueue: 2000
+ stringTagMap: {}
+ m_SavedProperties:
+ serializedVersion: 2
+ m_TexEnvs:
+ - first:
+ name: _Cubemap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _EmissionMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _LightmapTexture
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _MainTex
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _NormalMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _NormalMapAlpha
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - first:
+ name: ALBEDO
+ second: 0
+ - first:
+ name: ALPHA_TEST
+ second: 0
+ - first:
+ name: ALPHA_USAGE
+ second: 0
+ - first:
+ name: AMBIENTLIGHT
+ second: 0
+ - first:
+ name: CUBEMAP
+ second: 0
+ - first:
+ name: EMISSIVE
+ second: 0
+ - first:
+ name: FRESNEL
+ second: 0
+ - first:
+ name: LIGHT
+ second: 0
+ - first:
+ name: LIGHTMAP
+ second: 0
+ - first:
+ name: LIGHTPROBES
+ second: 0
+ - first:
+ name: NEARCLIP
+ second: 0
+ - first:
+ name: NORMAL
+ second: 0
+ - first:
+ name: SHOWDEBUG
+ second: 0
+ - first:
+ name: TINT
+ second: 0
+ - first:
+ name: VERTCOLOR
+ second: 0
+ - first:
+ name: ZOFFSET_CONSTANT
+ second: 0
+ - first:
+ name: ZOFFSET_SLOPE
+ second: 0
+ - first:
+ name: _AlphaTestThreshold
+ second: 0.05
+ - first:
+ name: _COLORMASK
+ second: 15
+ - first:
+ name: _CULL
+ second: 2
+ - first:
+ name: _CubemapContribution
+ second: 1
+ - first:
+ name: _DSTBLEND
+ second: 10
+ - first:
+ name: _FOG
+ second: 0
+ - first:
+ name: _LightProbeAmount
+ second: 1
+ - first:
+ name: _NormalAlphaAsEmissive
+ second: 0
+ - first:
+ name: _NormalAlphaAsSpecular
+ second: 0
+ - first:
+ name: _SRCBLEND
+ second: 5
+ - first:
+ name: _ShowDebugValue
+ second: 0
+ - first:
+ name: _VertColorScale
+ second: 1
+ - first:
+ name: _ZTEST
+ second: 8
+ - first:
+ name: _ZWRITE
+ second: 1
+ m_Colors:
+ - first:
+ name: _AlphaScale
+ second: {r: 1, g: 0, b: 0, a: 0}
+ - first:
+ name: _AmbientColor
+ second: {r: 0.125, g: 0.125, b: 0.125, a: 1}
+ - first:
+ name: _BounceColor
+ second: {r: 0.3, g: 0.3, b: 0.3, a: 1}
+ - first:
+ name: _Color
+ second: {r: 1, g: 1, b: 1, a: 1}
+ - first:
+ name: _CubemapBalance
+ second: {r: 0, g: 1, b: 0, a: 0}
+ - first:
+ name: _CubemapRoughness
+ second: {r: 0, g: 10, b: 0, a: 0}
+ - first:
+ name: _EmissiveColor
+ second: {r: 1, g: 1, b: 1, a: 1}
+ - first:
+ name: _FogColor
+ second: {r: 1, g: 1, b: 1, a: 1}
+ - first:
+ name: _FogRange
+ second: {r: 1, g: 10, b: 0, a: 0}
+ - first:
+ name: _FresnelColor
+ second: {r: 1, g: 1, b: 1, a: 1}
+ - first:
+ name: _FresnelScale
+ second: {r: 1, g: 1, b: 0, a: 0}
+ - first:
+ name: _LightmapParams
+ second: {r: 1, g: 0, b: 0, a: 0}
+ - first:
+ name: _NearClipDistance
+ second: {r: 0.2, g: 1, b: 0, a: 0}
+ - first:
+ name: _NormalAlphaScale
+ second: {r: 1, g: 0, b: 0, a: 0}
+ - first:
+ name: _NormalScale
+ second: {r: 1, g: 1, b: 1, a: 0}
+ - first:
+ name: _SpecPower
+ second: {r: 60, g: 0, b: 1, a: 0}
+ - first:
+ name: _TintColor
+ second: {r: 1, g: 1, b: 1, a: 1}
+ - first:
+ name: _UplightColor
+ second: {r: 0.3, g: 0.3, b: 0.3, a: 1}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials/CursorMaterial.mat.meta b/HoloBot/Assets/HoloToolkit/Input/Materials/CursorMaterial.mat.meta
new file mode 100644
index 0000000..90e5931
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials/CursorMaterial.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 79bdbec5416f3444da4c0362c0b957a5
+timeCreated: 1465337516
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials/hand_down.mat b/HoloBot/Assets/HoloToolkit/Input/Materials/hand_down.mat
new file mode 100644
index 0000000..42df57b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials/hand_down.mat
@@ -0,0 +1,158 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: hand_down
+ m_Shader: {fileID: 4800000, guid: 17b35d8a8e5e92d4ebcf1933bf853497, type: 3}
+ m_ShaderKeywords: _ALPHAPREMULTIPLY_ON _EMISSION
+ m_LightmapFlags: 1
+ m_CustomRenderQueue: 3000
+ stringTagMap:
+ RenderType: Transparent
+ m_SavedProperties:
+ serializedVersion: 2
+ m_TexEnvs:
+ - first:
+ name: _BumpMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _DetailAlbedoMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _DetailMask
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _DetailNormalMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _DetailTex
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _EmissionMap
+ second:
+ m_Texture: {fileID: 2800000, guid: d84aac8e3bc8fe344b50dab1e7382ad7, type: 3}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _MainTex
+ second:
+ m_Texture: {fileID: 2800000, guid: d84aac8e3bc8fe344b50dab1e7382ad7, type: 3}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _MetallicGlossMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _OcclusionMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _ParallaxMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - first:
+ name: PixelSnap
+ second: 0
+ - first:
+ name: _Brightness
+ second: 6
+ - first:
+ name: _BumpScale
+ second: 1
+ - first:
+ name: _ColorMask
+ second: 15
+ - first:
+ name: _Cutoff
+ second: 0.5
+ - first:
+ name: _DetailNormalMapScale
+ second: 1
+ - first:
+ name: _DstBlend
+ second: 10
+ - first:
+ name: _Glossiness
+ second: 1
+ - first:
+ name: _Metallic
+ second: 0
+ - first:
+ name: _Mode
+ second: 3
+ - first:
+ name: _OcclusionStrength
+ second: 1
+ - first:
+ name: _Opacity
+ second: 1
+ - first:
+ name: _Parallax
+ second: 0.02
+ - first:
+ name: _SrcBlend
+ second: 1
+ - first:
+ name: _Stencil
+ second: 0
+ - first:
+ name: _StencilComp
+ second: 8
+ - first:
+ name: _StencilOp
+ second: 0
+ - first:
+ name: _StencilReadMask
+ second: 255
+ - first:
+ name: _StencilWriteMask
+ second: 255
+ - first:
+ name: _Strength
+ second: 0.2
+ - first:
+ name: _UVSec
+ second: 0
+ - first:
+ name: _UseUIAlphaClip
+ second: 0
+ - first:
+ name: _ZWrite
+ second: 0
+ m_Colors:
+ - first:
+ name: _Color
+ second: {r: 0.3254902, g: 0.3764706, b: 0.92941177, a: 1}
+ - first:
+ name: _EmissionColor
+ second: {r: 0.3254902, g: 0.3764706, b: 0.92941177, a: 1}
+ - first:
+ name: _Tint
+ second: {r: 0.3254902, g: 0.3764706, b: 0.92941177, a: 1}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials/hand_down.mat.meta b/HoloBot/Assets/HoloToolkit/Input/Materials/hand_down.mat.meta
new file mode 100644
index 0000000..2c28def
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials/hand_down.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a4af844808c503d4dbe22d7d215745b1
+timeCreated: 1469563237
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials/hand_up.mat b/HoloBot/Assets/HoloToolkit/Input/Materials/hand_up.mat
new file mode 100644
index 0000000..f48218f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials/hand_up.mat
@@ -0,0 +1,194 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: hand_up
+ m_Shader: {fileID: 4800000, guid: 17b35d8a8e5e92d4ebcf1933bf853497, type: 3}
+ m_ShaderKeywords: _ALPHAPREMULTIPLY_ON _EMISSION
+ m_LightmapFlags: 1
+ m_CustomRenderQueue: 3000
+ stringTagMap:
+ RenderType: Transparent
+ m_SavedProperties:
+ serializedVersion: 2
+ m_TexEnvs:
+ data:
+ first:
+ name: _MainTex
+ second:
+ m_Texture: {fileID: 2800000, guid: 778e02a60d620bb419088e692a3584d3, type: 3}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _BumpMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _DetailNormalMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _ParallaxMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _OcclusionMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _EmissionMap
+ second:
+ m_Texture: {fileID: 2800000, guid: 778e02a60d620bb419088e692a3584d3, type: 3}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _DetailMask
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _DetailAlbedoMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _MetallicGlossMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ data:
+ first:
+ name: _DetailTex
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ data:
+ first:
+ name: _SrcBlend
+ second: 1
+ data:
+ first:
+ name: _DstBlend
+ second: 10
+ data:
+ first:
+ name: _Cutoff
+ second: 0.5
+ data:
+ first:
+ name: PixelSnap
+ second: 0
+ data:
+ first:
+ name: _Parallax
+ second: 0.02
+ data:
+ first:
+ name: _ZWrite
+ second: 0
+ data:
+ first:
+ name: _Glossiness
+ second: 1
+ data:
+ first:
+ name: _BumpScale
+ second: 1
+ data:
+ first:
+ name: _OcclusionStrength
+ second: 1
+ data:
+ first:
+ name: _DetailNormalMapScale
+ second: 1
+ data:
+ first:
+ name: _UVSec
+ second: 0
+ data:
+ first:
+ name: _Mode
+ second: 3
+ data:
+ first:
+ name: _Metallic
+ second: 0
+ data:
+ first:
+ name: _Brightness
+ second: 6
+ data:
+ first:
+ name: _Opacity
+ second: 1
+ data:
+ first:
+ name: _Stencil
+ second: 0
+ data:
+ first:
+ name: _StencilComp
+ second: 8
+ data:
+ first:
+ name: _StencilOp
+ second: 0
+ data:
+ first:
+ name: _StencilReadMask
+ second: 255
+ data:
+ first:
+ name: _StencilWriteMask
+ second: 255
+ data:
+ first:
+ name: _ColorMask
+ second: 15
+ data:
+ first:
+ name: _Strength
+ second: 0.2
+ data:
+ first:
+ name: _UseUIAlphaClip
+ second: 0
+ m_Colors:
+ data:
+ first:
+ name: _EmissionColor
+ second: {r: 0.3254902, g: 0.3764706, b: 0.92941177, a: 1}
+ data:
+ first:
+ name: _Color
+ second: {r: 0.3254902, g: 0.3764706, b: 0.92941177, a: 1}
+ data:
+ first:
+ name: _Tint
+ second: {r: 0.3254902, g: 0.3764706, b: 0.92941177, a: 1}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials/hand_up.mat.meta b/HoloBot/Assets/HoloToolkit/Input/Materials/hand_up.mat.meta
new file mode 100644
index 0000000..ac3a6ae
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials/hand_up.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e3614b053e3b0bd4b8efece8f50c21ad
+timeCreated: 1444068346
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials/ring_shadow.mat b/HoloBot/Assets/HoloToolkit/Input/Materials/ring_shadow.mat
new file mode 100644
index 0000000..372b2d0
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials/ring_shadow.mat
@@ -0,0 +1,145 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: ring_shadow
+ m_Shader: {fileID: 4800000, guid: 17b35d8a8e5e92d4ebcf1933bf853497, type: 3}
+ m_ShaderKeywords:
+ m_LightmapFlags: 5
+ m_CustomRenderQueue: 3000
+ stringTagMap: {}
+ m_SavedProperties:
+ serializedVersion: 2
+ m_TexEnvs:
+ - first:
+ name: _BumpMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _DetailAlbedoMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _DetailMask
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _DetailNormalMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _EmissionMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _MainTex
+ second:
+ m_Texture: {fileID: 2800000, guid: 94564d840c7fb0442b70a8a6ee003ac2, type: 3}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _MetallicGlossMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _OcclusionMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - first:
+ name: _ParallaxMap
+ second:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - first:
+ name: _BumpScale
+ second: 1
+ - first:
+ name: _ColorMask
+ second: 15
+ - first:
+ name: _Cutoff
+ second: 0.5
+ - first:
+ name: _DetailNormalMapScale
+ second: 1
+ - first:
+ name: _DstBlend
+ second: 0
+ - first:
+ name: _GlossMapScale
+ second: 1
+ - first:
+ name: _Glossiness
+ second: 0.5
+ - first:
+ name: _GlossyReflections
+ second: 1
+ - first:
+ name: _Metallic
+ second: 0
+ - first:
+ name: _Mode
+ second: 0
+ - first:
+ name: _OcclusionStrength
+ second: 1
+ - first:
+ name: _Parallax
+ second: 0.02
+ - first:
+ name: _SmoothnessTextureChannel
+ second: 0
+ - first:
+ name: _SpecularHighlights
+ second: 1
+ - first:
+ name: _SrcBlend
+ second: 1
+ - first:
+ name: _Stencil
+ second: 0
+ - first:
+ name: _StencilComp
+ second: 8
+ - first:
+ name: _StencilOp
+ second: 0
+ - first:
+ name: _StencilReadMask
+ second: 255
+ - first:
+ name: _StencilWriteMask
+ second: 255
+ - first:
+ name: _UVSec
+ second: 0
+ - first:
+ name: _ZWrite
+ second: 1
+ m_Colors:
+ - first:
+ name: _Color
+ second: {r: 0.3254902, g: 0.3764706, b: 0.92941177, a: 1}
+ - first:
+ name: _EmissionColor
+ second: {r: 0, g: 0, b: 0, a: 1}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Materials/ring_shadow.mat.meta b/HoloBot/Assets/HoloToolkit/Input/Materials/ring_shadow.mat.meta
new file mode 100644
index 0000000..01407d5
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Materials/ring_shadow.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a2c9c4679b0c3cf47b3ba3a449c985d7
+timeCreated: 1455735893
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models.meta b/HoloBot/Assets/HoloToolkit/Input/Models.meta
new file mode 100644
index 0000000..abc224f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 007c74dfb2f47d54cb03722769c30a83
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor.meta
new file mode 100644
index 0000000..2c5aa36
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 4ac5ecface4399542974797bd73a3d5f
+folderAsset: yes
+timeCreated: 1455735874
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/Cursor.fbx b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/Cursor.fbx
new file mode 100644
index 0000000..58d133b
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/Cursor.fbx differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/Cursor.fbx.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/Cursor.fbx.meta
new file mode 100644
index 0000000..4d81cf8
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/Cursor.fbx.meta
@@ -0,0 +1,166 @@
+fileFormatVersion: 2
+guid: 68471bd594667db46a10efbee4e188d5
+timeCreated: 1478288747
+licenseType: Pro
+ModelImporter:
+ serializedVersion: 19
+ fileIDToRecycleName:
+ 100000: //RootNode
+ 100002: group1
+ 100004: group1.001
+ 100006: group1.002
+ 100008: group1.003
+ 100010: group5
+ 100012: group5.001
+ 100014: group5.002
+ 100016: group5.003
+ 100018: group7
+ 100020: group7.001
+ 100022: group7.002
+ 100024: group7.003
+ 100026: groupBottom
+ 100028: groupLeft
+ 100030: groupRight
+ 100032: groupTop
+ 100034: joint1
+ 100036: joint1 1
+ 100038: joint1 2
+ 100040: joint1 3
+ 100042: joint2
+ 100044: joint2 1
+ 100046: joint2 2
+ 100048: joint2 3
+ 100050: joint2_end
+ 100052: joint2_end 1
+ 100054: joint2_end 2
+ 100056: joint2_end 3
+ 100058: pCylinderBottom
+ 100060: pCylinderLeft
+ 100062: pCylinderRight
+ 100064: pCylinderTop
+ 100066: polySurfaceBottom
+ 100068: polySurfaceLeft
+ 100070: polySurfaceRight
+ 100072: polySurfaceTop
+ 400000: //RootNode
+ 400002: group1
+ 400004: group1.001
+ 400006: group1.002
+ 400008: group1.003
+ 400010: group5
+ 400012: group5.001
+ 400014: group5.002
+ 400016: group5.003
+ 400018: group7
+ 400020: group7.001
+ 400022: group7.002
+ 400024: group7.003
+ 400026: groupBottom
+ 400028: groupLeft
+ 400030: groupRight
+ 400032: groupTop
+ 400034: joint1
+ 400036: joint1 1
+ 400038: joint1 2
+ 400040: joint1 3
+ 400042: joint2
+ 400044: joint2 1
+ 400046: joint2 2
+ 400048: joint2 3
+ 400050: joint2_end
+ 400052: joint2_end 1
+ 400054: joint2_end 2
+ 400056: joint2_end 3
+ 400058: pCylinderBottom
+ 400060: pCylinderLeft
+ 400062: pCylinderRight
+ 400064: pCylinderTop
+ 400066: polySurfaceBottom
+ 400068: polySurfaceLeft
+ 400070: polySurfaceRight
+ 400072: polySurfaceTop
+ 2300000: pCylinderBottom
+ 2300002: pCylinderLeft
+ 2300004: pCylinderRight
+ 2300006: pCylinderTop
+ 3300000: pCylinderBottom
+ 3300002: pCylinderLeft
+ 3300004: pCylinderRight
+ 3300006: pCylinderTop
+ 4300000: pCylinderRight
+ 4300002: polySurfaceRight
+ 4300004: pCylinderTop
+ 4300006: polySurfaceTop
+ 4300008: pCylinderLeft
+ 4300010: polySurfaceLeft
+ 4300012: pCylinderBottom
+ 4300014: polySurfaceBottom
+ 9500000: //RootNode
+ 13700000: polySurfaceBottom
+ 13700002: polySurfaceLeft
+ 13700004: polySurfaceRight
+ 13700006: polySurfaceTop
+ materials:
+ importMaterials: 0
+ materialName: 0
+ materialSearch: 1
+ animations:
+ legacyGenerateAnimations: 4
+ bakeSimulation: 0
+ resampleCurves: 1
+ optimizeGameObjects: 0
+ motionNodeName:
+ animationImportErrors:
+ animationImportWarnings:
+ animationRetargetingWarnings:
+ animationDoRetargetingWarnings: 0
+ animationCompression: 1
+ animationRotationError: 0.5
+ animationPositionError: 0.5
+ animationScaleError: 0.5
+ animationWrapMode: 0
+ extraExposedTransformPaths: []
+ clipAnimations: []
+ isReadable: 1
+ meshes:
+ lODScreenPercentages: []
+ globalScale: 100
+ meshCompression: 0
+ addColliders: 0
+ importBlendShapes: 1
+ swapUVChannels: 0
+ generateSecondaryUV: 0
+ useFileUnits: 1
+ optimizeMeshForGPU: 1
+ keepQuads: 0
+ weldVertices: 1
+ secondaryUVAngleDistortion: 8
+ secondaryUVAreaDistortion: 15.000001
+ secondaryUVHardAngle: 88
+ secondaryUVPackMargin: 4
+ useFileScale: 1
+ tangentSpace:
+ normalSmoothAngle: 60
+ normalImportMode: 1
+ tangentImportMode: 3
+ importAnimation: 0
+ copyAvatar: 0
+ humanDescription:
+ human: []
+ skeleton: []
+ armTwist: 0.5
+ foreArmTwist: 0.5
+ upperLegTwist: 0.5
+ legTwist: 0.5
+ armStretch: 0.05
+ legStretch: 0.05
+ feetSpacing: 0
+ rootMotionBoneName:
+ hasTranslationDoF: 0
+ lastHumanDescriptionAvatarSource: {instanceID: 0}
+ animationType: 2
+ humanoidOversampling: 1
+ additionalBone: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm.meta
new file mode 100644
index 0000000..f0ca836
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 0624081163014824eb575250d78c791e
+folderAsset: yes
+timeCreated: 1455737525
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_down.png b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_down.png
new file mode 100644
index 0000000..2c016d1
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_down.png differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_down.png.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_down.png.meta
new file mode 100644
index 0000000..d613afb
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_down.png.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: d84aac8e3bc8fe344b50dab1e7382ad7
+timeCreated: 1469563108
+licenseType: Pro
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ linearTexture: 0
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: -1
+ mipBias: -1
+ wrapMode: -1
+ nPOTScale: 1
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: -1
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_up.png b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_up.png
new file mode 100644
index 0000000..fc556ea
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_up.png differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_up.png.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_up.png.meta
new file mode 100644
index 0000000..b6e994a
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbm/hand_up.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: 778e02a60d620bb419088e692a3584d3
+timeCreated: 1444068346
+licenseType: Pro
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ linearTexture: 0
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: -1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 1
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: -1
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbx b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbx
new file mode 100644
index 0000000..6a4bbe8
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbx differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbx.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbx.meta
new file mode 100644
index 0000000..6a33a50
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_hand_ready.fbx.meta
@@ -0,0 +1,90 @@
+fileFormatVersion: 2
+guid: 20553dcf305b52a4e84f5e4f56e5afdc
+timeCreated: 1444068346
+licenseType: Pro
+ModelImporter:
+ serializedVersion: 18
+ fileIDToRecycleName:
+ 100000: cursor_cross_root
+ 100002: //RootNode
+ 100004: Cursor_Ring
+ 100006: Cursor_SizeNorthSouth
+ 100008: cursor_sizeNorthSouth_ring
+ 100010: cursor_sizeNorthSouth_ring_interaction
+ 100012: cursor_sizeNorthSouth_ring_interaction_root
+ 100014: cursor_sizeNorthSouth_ring_press_scale
+ 100016: ring_observation_scale
+ 400000: cursor_cross_root
+ 400002: //RootNode
+ 400004: Cursor_Ring
+ 400006: Cursor_SizeNorthSouth
+ 400008: cursor_sizeNorthSouth_ring
+ 400010: cursor_sizeNorthSouth_ring_interaction
+ 400012: cursor_sizeNorthSouth_ring_interaction_root
+ 400014: cursor_sizeNorthSouth_ring_press_scale
+ 400016: ring_observation_scale
+ 2300000: cursor_sizeNorthSouth_ring_interaction
+ 3300000: cursor_sizeNorthSouth_ring_interaction
+ 4300000: cursor_sizeNorthSouth_ring_interaction
+ materials:
+ importMaterials: 1
+ materialName: 0
+ materialSearch: 1
+ animations:
+ legacyGenerateAnimations: 4
+ bakeSimulation: 0
+ optimizeGameObjects: 0
+ motionNodeName:
+ animationImportErrors:
+ animationImportWarnings:
+ animationRetargetingWarnings:
+ animationDoRetargetingWarnings: 0
+ animationCompression: 1
+ animationRotationError: .5
+ animationPositionError: .5
+ animationScaleError: .5
+ animationWrapMode: 0
+ extraExposedTransformPaths: []
+ clipAnimations: []
+ isReadable: 1
+ meshes:
+ lODScreenPercentages: []
+ globalScale: 1
+ meshCompression: 0
+ addColliders: 0
+ importBlendShapes: 1
+ swapUVChannels: 0
+ generateSecondaryUV: 0
+ useFileUnits: 1
+ optimizeMeshForGPU: 1
+ keepQuads: 0
+ weldVertices: 1
+ secondaryUVAngleDistortion: 8
+ secondaryUVAreaDistortion: 15.000001
+ secondaryUVHardAngle: 88
+ secondaryUVPackMargin: 4
+ useFileScale: 1
+ tangentSpace:
+ normalSmoothAngle: 60
+ splitTangentsAcrossUV: 1
+ normalImportMode: 0
+ tangentImportMode: 1
+ importAnimation: 1
+ copyAvatar: 0
+ humanDescription:
+ human: []
+ skeleton: []
+ armTwist: .5
+ foreArmTwist: .5
+ upperLegTwist: .5
+ legTwist: .5
+ armStretch: .0500000007
+ legStretch: .0500000007
+ feetSpacing: 0
+ rootMotionBoneName:
+ lastHumanDescriptionAvatarSource: {instanceID: 0}
+ animationType: 0
+ additionalBone: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm.meta
new file mode 100644
index 0000000..6b882e3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 128255248c91cb141a6d3c07f93ef90c
+folderAsset: yes
+timeCreated: 1455735875
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm/ring_shadow.png b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm/ring_shadow.png
new file mode 100644
index 0000000..d0847ce
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm/ring_shadow.png differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm/ring_shadow.png.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm/ring_shadow.png.meta
new file mode 100644
index 0000000..756c526
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbm/ring_shadow.png.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 94564d840c7fb0442b70a8a6ee003ac2
+timeCreated: 1455735882
+licenseType: Pro
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ linearTexture: 0
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: -1
+ mipBias: -1
+ wrapMode: -1
+ nPOTScale: 1
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: -1
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbx b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbx
new file mode 100644
index 0000000..a032642
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbx differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbx.meta b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbx.meta
new file mode 100644
index 0000000..7b86f69
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Models/Cursor/cursor_ready.fbx.meta
@@ -0,0 +1,102 @@
+fileFormatVersion: 2
+guid: c1000081192be7347a0ad0c380ed6171
+timeCreated: 1455735916
+licenseType: Pro
+ModelImporter:
+ serializedVersion: 19
+ fileIDToRecycleName:
+ 100000: cursor_cross_root
+ 100002: Cursor_Joystick
+ 100004: //RootNode
+ 100006: Cursor_Ring
+ 100008: Cursor_SizeNorthSouth
+ 100010: cursor_sizeNorthSouth_ring
+ 100012: cursor_sizeNorthSouth_ring_interaction_root
+ 100014: cursor_sizeNorthSouth_ring_press_scale
+ 100016: joystick_move
+ 100018: js_tool_indictators
+ 100020: ring_interaction_geo
+ 100022: ring_interaction_root
+ 100024: ring_observation_scale
+ 100026: ring_press_scale
+ 400000: cursor_cross_root
+ 400002: Cursor_Joystick
+ 400004: //RootNode
+ 400006: Cursor_Ring
+ 400008: Cursor_SizeNorthSouth
+ 400010: cursor_sizeNorthSouth_ring
+ 400012: cursor_sizeNorthSouth_ring_interaction_root
+ 400014: cursor_sizeNorthSouth_ring_press_scale
+ 400016: joystick_move
+ 400018: js_tool_indictators
+ 400020: ring_interaction_geo
+ 400022: ring_interaction_root
+ 400024: ring_observation_scale
+ 400026: ring_press_scale
+ 2300000: ring_interaction_geo
+ 3300000: ring_interaction_geo
+ 4300000: ring_interaction_geo
+ materials:
+ importMaterials: 1
+ materialName: 0
+ materialSearch: 1
+ animations:
+ legacyGenerateAnimations: 4
+ bakeSimulation: 0
+ resampleCurves: 1
+ optimizeGameObjects: 0
+ motionNodeName:
+ animationImportErrors:
+ animationImportWarnings:
+ animationRetargetingWarnings:
+ animationDoRetargetingWarnings: 0
+ animationCompression: 1
+ animationRotationError: 0.5
+ animationPositionError: 0.5
+ animationScaleError: 0.5
+ animationWrapMode: 0
+ extraExposedTransformPaths: []
+ clipAnimations: []
+ isReadable: 1
+ meshes:
+ lODScreenPercentages: []
+ globalScale: 1
+ meshCompression: 0
+ addColliders: 0
+ importBlendShapes: 1
+ swapUVChannels: 0
+ generateSecondaryUV: 0
+ useFileUnits: 1
+ optimizeMeshForGPU: 1
+ keepQuads: 0
+ weldVertices: 1
+ secondaryUVAngleDistortion: 8
+ secondaryUVAreaDistortion: 15.000001
+ secondaryUVHardAngle: 88
+ secondaryUVPackMargin: 4
+ useFileScale: 1
+ tangentSpace:
+ normalSmoothAngle: 60
+ normalImportMode: 0
+ tangentImportMode: 3
+ importAnimation: 1
+ copyAvatar: 0
+ humanDescription:
+ human: []
+ skeleton: []
+ armTwist: 0.5
+ foreArmTwist: 0.5
+ upperLegTwist: 0.5
+ legTwist: 0.5
+ armStretch: 0.05
+ legStretch: 0.05
+ feetSpacing: 0
+ rootMotionBoneName:
+ hasTranslationDoF: 0
+ lastHumanDescriptionAvatarSource: {instanceID: 0}
+ animationType: 0
+ humanoidOversampling: 1
+ additionalBone: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins.meta
new file mode 100644
index 0000000..8c9baeb
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 00b1b81cca4d57b4a96c0073ab02641e
+folderAsset: yes
+timeCreated: 1474471004
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA.meta
new file mode 100644
index 0000000..c25e655
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 185fe78bcbc5dd54386f1bdd51c449b5
+folderAsset: yes
+timeCreated: 1468273301
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM.meta
new file mode 100644
index 0000000..442e74e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 230967124dee9a3448af0e8cd24335a1
+folderAsset: yes
+timeCreated: 1468273301
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM/MicStreamSelector.dll b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM/MicStreamSelector.dll
new file mode 100644
index 0000000..d2878ba
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM/MicStreamSelector.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM/MicStreamSelector.dll.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM/MicStreamSelector.dll.meta
new file mode 100644
index 0000000..87037a3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/ARM/MicStreamSelector.dll.meta
@@ -0,0 +1,54 @@
+fileFormatVersion: 2
+guid: ba62e784cfa0c0145819cc7dfdcf8faa
+timeCreated: 1468273328
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: ARM
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64.meta
new file mode 100644
index 0000000..f0a72b9
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 5adc4b89c1810d14cb90502e0a2741f5
+folderAsset: yes
+timeCreated: 1468273301
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64/MicStreamSelector.dll b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64/MicStreamSelector.dll
new file mode 100644
index 0000000..9a77b4d
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64/MicStreamSelector.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64/MicStreamSelector.dll.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64/MicStreamSelector.dll.meta
new file mode 100644
index 0000000..fc5896f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x64/MicStreamSelector.dll.meta
@@ -0,0 +1,54 @@
+fileFormatVersion: 2
+guid: a21436697051b874fa00fdcca17c671f
+timeCreated: 1468273328
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X64
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86.meta
new file mode 100644
index 0000000..7b39ee7
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: d97bc6f8c6648c44d870a1d6b2f4943e
+folderAsset: yes
+timeCreated: 1468273301
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86/MicStreamSelector.dll b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86/MicStreamSelector.dll
new file mode 100644
index 0000000..4ab29a2
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86/MicStreamSelector.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86/MicStreamSelector.dll.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86/MicStreamSelector.dll.meta
new file mode 100644
index 0000000..8e4e81b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/WSA/x86/MicStreamSelector.dll.meta
@@ -0,0 +1,54 @@
+fileFormatVersion: 2
+guid: a8170d4829430944d9ce829c225d7e80
+timeCreated: 1468273328
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X86
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/x64.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/x64.meta
new file mode 100644
index 0000000..eed579b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/x64.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: ed8582e216067d34eb13d1f04764484d
+folderAsset: yes
+timeCreated: 1468273301
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/x64/MicStreamSelector.dll b/HoloBot/Assets/HoloToolkit/Input/Plugins/x64/MicStreamSelector.dll
new file mode 100644
index 0000000..9481c84
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Plugins/x64/MicStreamSelector.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/x64/MicStreamSelector.dll.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/x64/MicStreamSelector.dll.meta
new file mode 100644
index 0000000..6883b60
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/x64/MicStreamSelector.dll.meta
@@ -0,0 +1,62 @@
+fileFormatVersion: 2
+guid: d1017be762eba3d4ba065126882b98de
+timeCreated: 1468273328
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/x86.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/x86.meta
new file mode 100644
index 0000000..8390461
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/x86.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 456e326222b190b488e8477b00145f3c
+folderAsset: yes
+timeCreated: 1468273301
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/x86/MicStreamSelector.dll b/HoloBot/Assets/HoloToolkit/Input/Plugins/x86/MicStreamSelector.dll
new file mode 100644
index 0000000..55cbbf9
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Input/Plugins/x86/MicStreamSelector.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Input/Plugins/x86/MicStreamSelector.dll.meta b/HoloBot/Assets/HoloToolkit/Input/Plugins/x86/MicStreamSelector.dll.meta
new file mode 100644
index 0000000..a3e76aa
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Plugins/x86/MicStreamSelector.dll.meta
@@ -0,0 +1,62 @@
+fileFormatVersion: 2
+guid: a99d5ba76fdfa2b4bb8a84437b116eb0
+timeCreated: 1468273328
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: x86
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: x86
+ Win:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs.meta
new file mode 100644
index 0000000..9739ba1
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: e62af36e05049ed4bb16fb4572cfc67f
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor.meta
new file mode 100644
index 0000000..ca422f0
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: fbeba0b69576309478973ecae362ee05
+folderAsset: yes
+timeCreated: 1477677725
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/BasicCursor.prefab b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/BasicCursor.prefab
new file mode 100644
index 0000000..ab4d6aa
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/BasicCursor.prefab
@@ -0,0 +1,136 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1000013128004922}
+ m_IsPrefabParent: 1
+--- !u!1 &1000013128004922
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010362498278}
+ - 114: {fileID: 114000013944631048}
+ m_Layer: 2
+ m_Name: BasicCursor
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000014016047236
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011297337134}
+ - 33: {fileID: 33000012790067616}
+ - 23: {fileID: 23000010093703318}
+ m_Layer: 2
+ m_Name: CursorVisual
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4000010362498278
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013128004922}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000011297337134}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+--- !u!4 &4000011297337134
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000014016047236}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1.15, y: 1.1500014, z: 2.5000029}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010362498278}
+ m_RootOrder: 0
+--- !u!23 &23000010093703318
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000014016047236}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: a2c9c4679b0c3cf47b3ba3a449c985d7, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+--- !u!33 &33000012790067616
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000014016047236}
+ m_Mesh: {fileID: 4300000, guid: c1000081192be7347a0ad0c380ed6171, type: 3}
+--- !u!114 &114000013944631048
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013128004922}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: afa1ae235bc6cfa43addd1435e2fd822, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ MinCursorDistance: 1
+ DefaultCursorDistance: 2
+ SurfaceCursorDistance: 0.02
+ PositionLerpTime: 0.01
+ ScaleLerpTime: 0.01
+ RotationLerpTime: 0.01
+ LookRotationBlend: 0.5
+ PrimaryCursorVisual: {fileID: 0}
+ CursorStateData:
+ - Name: Hover
+ CursorState: 1
+ CursorObject: {fileID: 1000014016047236}
+ - Name: Hover
+ CursorState: 3
+ CursorObject: {fileID: 1000014016047236}
+ ParentTransform: {fileID: 0}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/BasicCursor.prefab.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/BasicCursor.prefab.meta
new file mode 100644
index 0000000..4cbf8eb
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/BasicCursor.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f16e5ee07dd5f614bacd13b84d14c32f
+timeCreated: 1455145063
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab
new file mode 100644
index 0000000..386747f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab
@@ -0,0 +1,235 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1000012943254746}
+ m_IsPrefabParent: 1
+--- !u!1 &1000012100030190
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011283192616}
+ - 33: {fileID: 33000011299448354}
+ - 23: {fileID: 23000013452343876}
+ m_Layer: 2
+ m_Name: CursorOnHolograms
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012943254746
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013535415816}
+ - 114: {fileID: 114000013851064060}
+ m_Layer: 2
+ m_Name: Cursor
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013615056792
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013144497514}
+ m_Layer: 2
+ m_Name: CursorOffHolograms
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013763932778
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010267160112}
+ - 108: {fileID: 108000011213487996}
+ m_Layer: 2
+ m_Name: Point light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4000010267160112
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013763932778}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000013144497514}
+ m_RootOrder: 0
+--- !u!4 &4000011283192616
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012100030190}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1.15, y: 1.15, z: 2.5}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000013535415816}
+ m_RootOrder: 0
+--- !u!4 &4000013144497514
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013615056792}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0.005, y: 0.005, z: 0.005}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000010267160112}
+ m_Father: {fileID: 4000013535415816}
+ m_RootOrder: 1
+--- !u!4 &4000013535415816
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012943254746}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000011283192616}
+ - {fileID: 4000013144497514}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+--- !u!23 &23000013452343876
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012100030190}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: a2c9c4679b0c3cf47b3ba3a449c985d7, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+--- !u!33 &33000011299448354
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012100030190}
+ m_Mesh: {fileID: 4300000, guid: c1000081192be7347a0ad0c380ed6171, type: 3}
+--- !u!108 &108000011213487996
+Light:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013763932778}
+ m_Enabled: 1
+ serializedVersion: 7
+ m_Type: 2
+ m_Color: {r: 0.8039216, g: 0.6431373, b: 0.9529412, a: 1}
+ m_Intensity: 1
+ m_Range: 0.05
+ m_SpotAngle: 30
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 0
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 1
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_Lightmapping: 4
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!114 &114000013851064060
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012943254746}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: afa1ae235bc6cfa43addd1435e2fd822, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ MinCursorDistance: 1
+ DefaultCursorDistance: 2
+ SurfaceCursorDistance: 0.02
+ PositionLerpTime: 0.01
+ ScaleLerpTime: 0.01
+ RotationLerpTime: 0.01
+ LookRotationBlend: 0.5
+ PrimaryCursorVisual: {fileID: 0}
+ CursorStateData:
+ - Name: On Hologram
+ CursorState: 1
+ CursorObject: {fileID: 1000012100030190}
+ - Name: On Hologram
+ CursorState: 3
+ CursorObject: {fileID: 1000012100030190}
+ - Name: Off Hologram
+ CursorState: 0
+ CursorObject: {fileID: 1000013615056792}
+ - Name: Off Hologram
+ CursorState: 2
+ CursorObject: {fileID: 1000013615056792}
+ ParentTransform: {fileID: 0}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab.meta
new file mode 100644
index 0000000..ec73b82
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b2db04283121ca74495c2ee000fb4243
+timeCreated: 1457634138
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/CursorWithFeedback.prefab b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/CursorWithFeedback.prefab
new file mode 100644
index 0000000..d68fbfd
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/CursorWithFeedback.prefab
@@ -0,0 +1,480 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1000010024638574}
+ m_IsPrefabParent: 1
+--- !u!1 &1000010024638574
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013243965410}
+ - 114: {fileID: 114000011803902180}
+ m_Layer: 2
+ m_Name: CursorWithFeedback
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010093781024
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012440933642}
+ - 33: {fileID: 33000010851415662}
+ - 23: {fileID: 23000011644528258}
+ m_Layer: 2
+ m_Name: cursor_sizeNorthSouth_ring_interaction
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010322050210
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011066195266}
+ m_Layer: 2
+ m_Name: cursor_sizeNorthSouth_ring
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010715023990
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011695305602}
+ m_Layer: 2
+ m_Name: cursor_cross_root
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011258900396
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013324006586}
+ m_Layer: 2
+ m_Name: HandDetectedFeedback
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011704672682
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011699401982}
+ - 114: {fileID: 114000010331726594}
+ m_Layer: 2
+ m_Name: FeedbackParent
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012125673284
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012320641616}
+ - 33: {fileID: 33000014094570260}
+ - 23: {fileID: 23000010103078400}
+ m_Layer: 2
+ m_Name: CursorVisual
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012742806780
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010087820484}
+ m_Layer: 2
+ m_Name: cursor_sizeNorthSouth_ring_press_scale
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012762340454
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010452078394}
+ m_Layer: 2
+ m_Name: Cursor_Ring
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013020990872
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013622417028}
+ m_Layer: 2
+ m_Name: cursor_sizeNorthSouth_ring_interaction_root
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013805455168
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013060984414}
+ m_Layer: 2
+ m_Name: ring_observation_scale
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000014030841020
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010841534134}
+ m_Layer: 2
+ m_Name: Cursor_SizeNorthSouth
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4000010087820484
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012742806780}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -0, y: 0, z: 0.004}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000011066195266}
+ m_RootOrder: 1
+--- !u!4 &4000010452078394
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012762340454}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000013060984414}
+ m_Father: {fileID: 4000013324006586}
+ m_RootOrder: 0
+--- !u!4 &4000010841534134
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000014030841020}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000011695305602}
+ - {fileID: 4000011066195266}
+ m_Father: {fileID: 4000013324006586}
+ m_RootOrder: 1
+--- !u!4 &4000011066195266
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010322050210}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000013622417028}
+ - {fileID: 4000010087820484}
+ m_Father: {fileID: 4000010841534134}
+ m_RootOrder: 1
+--- !u!4 &4000011695305602
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010715023990}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010841534134}
+ m_RootOrder: 0
+--- !u!4 &4000011699401982
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011704672682}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000013324006586}
+ m_Father: {fileID: 4000013243965410}
+ m_RootOrder: 0
+--- !u!4 &4000012320641616
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012125673284}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000013243965410}
+ m_RootOrder: 1
+--- !u!4 &4000012440933642
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010093781024}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0.0017081683, y: 0.0013783139, z: -0.0012663525}
+ m_LocalScale: {x: 0.02853388, y: 0.025535913, z: 0.03006477}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000013622417028}
+ m_RootOrder: 0
+--- !u!4 &4000013060984414
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013805455168}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -0, y: 0, z: 0.002}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010452078394}
+ m_RootOrder: 0
+--- !u!4 &4000013243965410
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010024638574}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000011699401982}
+ - {fileID: 4000012320641616}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+--- !u!4 &4000013324006586
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011258900396}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: -0.01}
+ m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000010452078394}
+ - {fileID: 4000010841534134}
+ m_Father: {fileID: 4000011699401982}
+ m_RootOrder: 0
+--- !u!4 &4000013622417028
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013020990872}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -0, y: 0, z: 0.004}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000012440933642}
+ m_Father: {fileID: 4000011066195266}
+ m_RootOrder: 0
+--- !u!23 &23000010103078400
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012125673284}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: a2c9c4679b0c3cf47b3ba3a449c985d7, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+--- !u!23 &23000011644528258
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010093781024}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: e3614b053e3b0bd4b8efece8f50c21ad, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+--- !u!33 &33000010851415662
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010093781024}
+ m_Mesh: {fileID: 4300000, guid: 20553dcf305b52a4e84f5e4f56e5afdc, type: 3}
+--- !u!33 &33000014094570260
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012125673284}
+ m_Mesh: {fileID: 4300000, guid: c1000081192be7347a0ad0c380ed6171, type: 3}
+--- !u!114 &114000010331726594
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011704672682}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: ac8d5b128a1d8204fb76c86f47b75912, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ PivotAxis: 0
+--- !u!114 &114000011803902180
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010024638574}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: afa1ae235bc6cfa43addd1435e2fd822, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ MinCursorDistance: 1
+ DefaultCursorDistance: 2
+ SurfaceCursorDistance: 0.02
+ PositionLerpTime: 0.01
+ ScaleLerpTime: 0.01
+ RotationLerpTime: 0.01
+ LookRotationBlend: 0.5
+ PrimaryCursorVisual: {fileID: 0}
+ CursorStateData:
+ - Name: Over Object No Hands
+ CursorState: 1
+ CursorObject: {fileID: 1000012125673284}
+ - Name: Hands Visible
+ CursorState: 2
+ CursorObject: {fileID: 1000011704672682}
+ - Name: Over Object With Hands
+ CursorState: 3
+ CursorObject: {fileID: 1000011704672682}
+ ParentTransform: {fileID: 0}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/CursorWithFeedback.prefab.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/CursorWithFeedback.prefab.meta
new file mode 100644
index 0000000..0fde217
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/CursorWithFeedback.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 90749889d87976143a9e21072d2434b4
+timeCreated: 1455228610
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/DefaultCursor.prefab b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/DefaultCursor.prefab
new file mode 100644
index 0000000..365ef42
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/DefaultCursor.prefab
@@ -0,0 +1,837 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1000012072213228}
+ m_IsPrefabParent: 1
+--- !u!1 &1000010015292458
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013708246872}
+ m_Layer: 0
+ m_Name: group_right
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010240122096
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011787857196}
+ m_Layer: 0
+ m_Name: group_bottom
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010503763288
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000014090385390}
+ m_Layer: 0
+ m_Name: Anchor_Cursor
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010627582080
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012166063264}
+ - 137: {fileID: 137000012467287548}
+ m_Layer: 0
+ m_Name: mesh_left
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010997923674
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013449772102}
+ m_Layer: 0
+ m_Name: group_top_joint_outer
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011038902392
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011946381988}
+ m_Layer: 0
+ m_Name: group_right_joint_outer
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011497247824
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010929445128}
+ m_Layer: 0
+ m_Name: group_top
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011665505428
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013458491836}
+ m_Layer: 0
+ m_Name: group_bottom_joint_outer
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011686294758
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011376360604}
+ - 137: {fileID: 137000012811968416}
+ m_Layer: 0
+ m_Name: mesh_bottom
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011844533774
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013316072862}
+ - 95: {fileID: 95000011718528066}
+ m_Layer: 0
+ m_Name: CursorVisual
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012072213228
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011792100794}
+ - 114: {fileID: 114000011521989572}
+ m_Layer: 0
+ m_Name: DefaultCursor
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012150952002
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011681230980}
+ m_Layer: 0
+ m_Name: group_right_joint_inner
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012359495584
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011059980986}
+ - 137: {fileID: 137000012128918204}
+ m_Layer: 0
+ m_Name: mesh_top
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012568377582
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011368356948}
+ m_Layer: 0
+ m_Name: group_left
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012792124594
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012976400574}
+ m_Layer: 0
+ m_Name: group_bottom_joint_inner
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012942637454
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013894343586}
+ - 137: {fileID: 137000014164134944}
+ m_Layer: 0
+ m_Name: mesh_right
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013355298042
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010411813178}
+ m_Layer: 0
+ m_Name: group_left_joint_outer
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013761764438
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010787082106}
+ m_Layer: 0
+ m_Name: group_left_joint_inner
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013764401358
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013463439578}
+ m_Layer: 0
+ m_Name: group_top_joint_inner
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4000010411813178
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013355298042}
+ m_LocalRotation: {x: 0.5, y: -0.5, z: -0.5, w: 0.5}
+ m_LocalPosition: {x: -0, y: 0, z: 0}
+ m_LocalScale: {x: 0.2, y: 0.12, z: 0.12}
+ m_LocalEulerAnglesHint: {x: 0, y: -90, z: -90}
+ m_Children:
+ - {fileID: 4000010787082106}
+ m_Father: {fileID: 4000011368356948}
+ m_RootOrder: 1
+--- !u!4 &4000010787082106
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013761764438}
+ m_LocalRotation: {x: -0.5, y: 0.5, z: 0.5, w: 0.5}
+ m_LocalPosition: {x: -1, y: 3.2612801e-16, z: -5.2385294e-32}
+ m_LocalScale: {x: 1e-12, y: 1, z: 1e-12}
+ m_LocalEulerAnglesHint: {x: -90, y: 90, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010411813178}
+ m_RootOrder: 0
+--- !u!4 &4000010929445128
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011497247824}
+ m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068}
+ m_LocalPosition: {x: -0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000011059980986}
+ - {fileID: 4000013449772102}
+ m_Father: {fileID: 4000013316072862}
+ m_RootOrder: 0
+--- !u!4 &4000011059980986
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012359495584}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 204.75, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010929445128}
+ m_RootOrder: 0
+--- !u!4 &4000011368356948
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012568377582}
+ m_LocalRotation: {x: 6.123234e-17, y: 1, z: -6.123234e-17, w: -6.123234e-17}
+ m_LocalPosition: {x: -0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000012166063264}
+ - {fileID: 4000010411813178}
+ m_Father: {fileID: 4000013316072862}
+ m_RootOrder: 2
+--- !u!4 &4000011376360604
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011686294758}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000011787857196}
+ m_RootOrder: 0
+--- !u!4 &4000011681230980
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012150952002}
+ m_LocalRotation: {x: -0.5, y: 0.5, z: 0.5, w: 0.5}
+ m_LocalPosition: {x: -1, y: 3.2612801e-16, z: -5.2385294e-32}
+ m_LocalScale: {x: 1e-12, y: 1, z: 1e-12}
+ m_LocalEulerAnglesHint: {x: -90, y: 90, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000011946381988}
+ m_RootOrder: 0
+--- !u!4 &4000011787857196
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010240122096}
+ m_LocalRotation: {x: -0, y: -0.7071068, z: 0, w: 0.7071068}
+ m_LocalPosition: {x: -0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000011376360604}
+ - {fileID: 4000013458491836}
+ m_Father: {fileID: 4000013316072862}
+ m_RootOrder: 1
+--- !u!4 &4000011792100794
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012072213228}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000014090385390}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+--- !u!4 &4000011946381988
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011038902392}
+ m_LocalRotation: {x: 0.5, y: -0.5, z: -0.5, w: 0.5}
+ m_LocalPosition: {x: -0, y: 0, z: 0}
+ m_LocalScale: {x: 0.2, y: 0.12, z: 0.12}
+ m_LocalEulerAnglesHint: {x: 0, y: -90, z: -90}
+ m_Children:
+ - {fileID: 4000011681230980}
+ m_Father: {fileID: 4000013708246872}
+ m_RootOrder: 1
+--- !u!4 &4000012166063264
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010627582080}
+ m_LocalRotation: {x: -6.123234e-17, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000011368356948}
+ m_RootOrder: 0
+--- !u!4 &4000012976400574
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012792124594}
+ m_LocalRotation: {x: -0.5, y: 0.5, z: 0.5, w: 0.5}
+ m_LocalPosition: {x: -1, y: 3.2612801e-16, z: -5.2385294e-32}
+ m_LocalScale: {x: 1e-12, y: 1, z: 1e-12}
+ m_LocalEulerAnglesHint: {x: -90, y: 90, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000013458491836}
+ m_RootOrder: 0
+--- !u!4 &4000013316072862
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011844533774}
+ m_LocalRotation: {x: 0, y: -0, z: -0, w: -1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0.04, y: 0.04, z: 0.04}
+ m_LocalEulerAnglesHint: {x: 0, y: -228, z: 0}
+ m_Children:
+ - {fileID: 4000010929445128}
+ - {fileID: 4000011787857196}
+ - {fileID: 4000011368356948}
+ - {fileID: 4000013708246872}
+ m_Father: {fileID: 4000014090385390}
+ m_RootOrder: 0
+--- !u!4 &4000013449772102
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010997923674}
+ m_LocalRotation: {x: 0.5, y: -0.5, z: -0.5, w: 0.5}
+ m_LocalPosition: {x: -0, y: 0, z: 0}
+ m_LocalScale: {x: 0.2, y: 0.12, z: 0.12}
+ m_LocalEulerAnglesHint: {x: 0, y: -90, z: -90}
+ m_Children:
+ - {fileID: 4000013463439578}
+ m_Father: {fileID: 4000010929445128}
+ m_RootOrder: 1
+--- !u!4 &4000013458491836
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011665505428}
+ m_LocalRotation: {x: 0.5, y: -0.5, z: -0.5, w: 0.5}
+ m_LocalPosition: {x: -0, y: 0, z: 0}
+ m_LocalScale: {x: 0.2, y: 0.12, z: 0.12}
+ m_LocalEulerAnglesHint: {x: 0, y: -90, z: -90}
+ m_Children:
+ - {fileID: 4000012976400574}
+ m_Father: {fileID: 4000011787857196}
+ m_RootOrder: 1
+--- !u!4 &4000013463439578
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013764401358}
+ m_LocalRotation: {x: -0.5, y: 0.5, z: 0.5, w: 0.5}
+ m_LocalPosition: {x: -1, y: 3.2612801e-16, z: -5.2385294e-32}
+ m_LocalScale: {x: 1e-12, y: 1, z: 1e-12}
+ m_LocalEulerAnglesHint: {x: -90, y: 90, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000013449772102}
+ m_RootOrder: 0
+--- !u!4 &4000013708246872
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010015292458}
+ m_LocalRotation: {x: 0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000013894343586}
+ - {fileID: 4000011946381988}
+ m_Father: {fileID: 4000013316072862}
+ m_RootOrder: 3
+--- !u!4 &4000013894343586
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012942637454}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000013708246872}
+ m_RootOrder: 0
+--- !u!4 &4000014090385390
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010503763288}
+ m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000013316072862}
+ m_Father: {fileID: 4000011792100794}
+ m_RootOrder: 0
+--- !u!95 &95000011718528066
+Animator:
+ serializedVersion: 3
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011844533774}
+ m_Enabled: 1
+ m_Avatar: {fileID: 0}
+ m_Controller: {fileID: 9100000, guid: 3f41b1c17f75cab40b11bb814443f19c, type: 2}
+ m_CullingMode: 0
+ m_UpdateMode: 0
+ m_ApplyRootMotion: 0
+ m_LinearVelocityBlending: 0
+ m_WarningMessage:
+ m_HasTransformHierarchy: 1
+ m_AllowConstantClipSamplingOptimization: 1
+--- !u!114 &114000011521989572
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012072213228}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0decd33ba8702954885a62b5bc1a778e, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ MinCursorDistance: 1
+ DefaultCursorDistance: 2
+ SurfaceCursorDistance: 0.02
+ PositionLerpTime: 0.01
+ ScaleLerpTime: 0.01
+ RotationLerpTime: 0.01
+ LookRotationBlend: 0.5
+ PrimaryCursorVisual: {fileID: 4000013316072862}
+ CursorStateData:
+ - Name: Observe
+ CursorState: 0
+ AnimInputType: 0
+ AnimParameterName: CursorState
+ AnimBoolValue: 0
+ AnimIntValue: 0
+ AnimFloatValue: 0
+ - Name: ObserveHover
+ CursorState: 1
+ AnimInputType: 0
+ AnimParameterName: CursorState
+ AnimBoolValue: 0
+ AnimIntValue: 1
+ AnimFloatValue: 0
+ - Name: Interact
+ CursorState: 2
+ AnimInputType: 0
+ AnimParameterName: CursorState
+ AnimBoolValue: 0
+ AnimIntValue: 2
+ AnimFloatValue: 0
+ - Name: InteractHover
+ CursorState: 3
+ AnimInputType: 0
+ AnimParameterName: CursorState
+ AnimBoolValue: 0
+ AnimIntValue: 3
+ AnimFloatValue: 0
+ - Name: Select
+ CursorState: 4
+ AnimInputType: 0
+ AnimParameterName: CursorState
+ AnimBoolValue: 0
+ AnimIntValue: 4
+ AnimFloatValue: 0
+ - Name: Release
+ CursorState: 5
+ AnimInputType: 0
+ AnimParameterName: CursorState
+ AnimBoolValue: 0
+ AnimIntValue: 5
+ AnimFloatValue: 0
+ EnableStateData:
+ Name:
+ CursorState: 0
+ AnimInputType: 2
+ AnimParameterName: Waiting
+ AnimBoolValue: 0
+ AnimIntValue: 0
+ AnimFloatValue: 0
+ DisableStateData:
+ Name: Waiting
+ CursorState: 5
+ AnimInputType: 2
+ AnimParameterName: Waiting
+ AnimBoolValue: 1
+ AnimIntValue: 0
+ AnimFloatValue: 0
+ CursorAnimator: {fileID: 95000011718528066}
+--- !u!137 &137000012128918204
+SkinnedMeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012359495584}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: 79bdbec5416f3444da4c0362c0b957a5, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ serializedVersion: 2
+ m_Quality: 0
+ m_UpdateWhenOffscreen: 0
+ m_SkinnedMotionVectors: 1
+ m_Mesh: {fileID: 4300002, guid: 68471bd594667db46a10efbee4e188d5, type: 3}
+ m_Bones:
+ - {fileID: 4000013449772102}
+ - {fileID: 4000013463439578}
+ m_BlendShapeWeights: []
+ m_RootBone: {fileID: 4000013449772102}
+ m_AABB:
+ m_Center: {x: 0, y: 0.000000029802322, z: -0.34499973}
+ m_Extent: {x: 0.1025, y: 0.48790336, z: 0.34499973}
+ m_DirtyAABB: 0
+--- !u!137 &137000012467287548
+SkinnedMeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010627582080}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: 79bdbec5416f3444da4c0362c0b957a5, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ serializedVersion: 2
+ m_Quality: 0
+ m_UpdateWhenOffscreen: 0
+ m_SkinnedMotionVectors: 1
+ m_Mesh: {fileID: 4300010, guid: 68471bd594667db46a10efbee4e188d5, type: 3}
+ m_Bones:
+ - {fileID: 4000010411813178}
+ - {fileID: 4000010787082106}
+ m_BlendShapeWeights: []
+ m_RootBone: {fileID: 4000010411813178}
+ m_AABB:
+ m_Center: {x: 0, y: 0, z: -0.34499964}
+ m_Extent: {x: 0.1025, y: 0.48790327, z: 0.34499964}
+ m_DirtyAABB: 0
+--- !u!137 &137000012811968416
+SkinnedMeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011686294758}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: 79bdbec5416f3444da4c0362c0b957a5, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ serializedVersion: 2
+ m_Quality: 0
+ m_UpdateWhenOffscreen: 0
+ m_SkinnedMotionVectors: 1
+ m_Mesh: {fileID: 4300014, guid: 68471bd594667db46a10efbee4e188d5, type: 3}
+ m_Bones:
+ - {fileID: 4000013458491836}
+ - {fileID: 4000012976400574}
+ m_BlendShapeWeights: []
+ m_RootBone: {fileID: 4000013458491836}
+ m_AABB:
+ m_Center: {x: 0, y: 0.000000029802322, z: -0.34499973}
+ m_Extent: {x: 0.1025, y: 0.48790336, z: 0.34499973}
+ m_DirtyAABB: 0
+--- !u!137 &137000014164134944
+SkinnedMeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012942637454}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: 79bdbec5416f3444da4c0362c0b957a5, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ serializedVersion: 2
+ m_Quality: 0
+ m_UpdateWhenOffscreen: 0
+ m_SkinnedMotionVectors: 1
+ m_Mesh: {fileID: 4300002, guid: 68471bd594667db46a10efbee4e188d5, type: 3}
+ m_Bones:
+ - {fileID: 4000011946381988}
+ - {fileID: 4000011681230980}
+ m_BlendShapeWeights: []
+ m_RootBone: {fileID: 4000011946381988}
+ m_AABB:
+ m_Center: {x: 0, y: 0, z: -0.34499964}
+ m_Extent: {x: 0.1025, y: 0.48790327, z: 0.34499964}
+ m_DirtyAABB: 0
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/DefaultCursor.prefab.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/DefaultCursor.prefab.meta
new file mode 100644
index 0000000..a493866
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/DefaultCursor.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a611e772ef8ddf64d8106a9cbb70f31c
+timeCreated: 1469228286
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/HandDetectedFeedback.prefab b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/HandDetectedFeedback.prefab
new file mode 100644
index 0000000..cf2cb61
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/HandDetectedFeedback.prefab
@@ -0,0 +1,337 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &110754
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 408678}
+ m_Layer: 2
+ m_Name: cursor_sizeNorthSouth_ring_interaction_root
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &128918
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 423990}
+ m_Layer: 2
+ m_Name: cursor_sizeNorthSouth_ring
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &139748
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 405604}
+ - 33: {fileID: 3374494}
+ - 23: {fileID: 2336532}
+ m_Layer: 2
+ m_Name: cursor_sizeNorthSouth_ring_interaction
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &150570
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 489468}
+ m_Layer: 2
+ m_Name: ring_observation_scale
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &173238
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 420132}
+ m_Layer: 2
+ m_Name: HandDetectedFeedback
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &177434
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 447900}
+ m_Layer: 2
+ m_Name: cursor_cross_root
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &187970
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 405794}
+ m_Layer: 2
+ m_Name: Cursor_Ring
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &198630
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 417894}
+ m_Layer: 2
+ m_Name: cursor_sizeNorthSouth_ring_press_scale
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &198696
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 402240}
+ m_Layer: 2
+ m_Name: Cursor_SizeNorthSouth
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &402240
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 198696}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 447900}
+ - {fileID: 423990}
+ m_Father: {fileID: 420132}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &405604
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 139748}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0.0017081683, y: 0.0013783139, z: -0.0012663525}
+ m_LocalScale: {x: 0.02853388, y: 0.025535913, z: 0.03006477}
+ m_Children: []
+ m_Father: {fileID: 408678}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &405794
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 187970}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 489468}
+ m_Father: {fileID: 420132}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &408678
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 110754}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -0, y: 0, z: 0.004}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 405604}
+ m_Father: {fileID: 423990}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &417894
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 198630}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -0, y: 0, z: 0.004}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 423990}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &420132
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 173238}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: -0.01}
+ m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+ m_Children:
+ - {fileID: 405794}
+ - {fileID: 402240}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &423990
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 128918}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 408678}
+ - {fileID: 417894}
+ m_Father: {fileID: 402240}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &447900
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 177434}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 402240}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &489468
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 150570}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -0, y: 0, z: 0.002}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 405794}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &2336532
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 139748}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: e3614b053e3b0bd4b8efece8f50c21ad, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+--- !u!33 &3374494
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 139748}
+ m_Mesh: {fileID: 4300000, guid: 20553dcf305b52a4e84f5e4f56e5afdc, type: 3}
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 0}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 0}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 0}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 0}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 0}
+ propertyPath: m_LocalPosition.z
+ value: -.00999999978
+ objectReference: {fileID: 0}
+ - target: {fileID: 0}
+ propertyPath: m_LocalScale.x
+ value: 1.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 0}
+ propertyPath: m_LocalScale.y
+ value: 1.5
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 173238}
+ m_IsPrefabParent: 1
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/HandDetectedFeedback.prefab.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/HandDetectedFeedback.prefab.meta
new file mode 100644
index 0000000..239f938
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/Cursor/HandDetectedFeedback.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 63b112b193820c9458f19fe4f0cc625a
+timeCreated: 1444774884
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/HoloLensCamera.prefab b/HoloBot/Assets/HoloToolkit/Input/Prefabs/HoloLensCamera.prefab
new file mode 100644
index 0000000..2936f95
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/HoloLensCamera.prefab
@@ -0,0 +1,644 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1000011021619270}
+ m_IsPrefabParent: 1
+--- !u!1 &1000010136702736
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010085977160}
+ - 114: {fileID: 114000011221680894}
+ m_Layer: 0
+ m_Name: JoystickXZTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010956895450
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011708201582}
+ - 114: {fileID: 114000012656745502}
+ m_Layer: 0
+ m_Name: KeyboardXZTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011021619270
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010560871102}
+ - 20: {fileID: 20000013304850028}
+ - 92: {fileID: 92000010221946138}
+ - 124: {fileID: 124000011504821460}
+ - 81: {fileID: 81000013783107718}
+ - 114: {fileID: 114000013543835744}
+ m_Layer: 0
+ m_Name: HoloLensCamera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011026140476
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000014150713462}
+ - 114: {fileID: 114000010160007858}
+ m_Layer: 0
+ m_Name: JoystickXYTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011337565444
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010590998566}
+ - 114: {fileID: 114000013933693316}
+ m_Layer: 0
+ m_Name: MouseXYRotationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011489060388
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010510211078}
+ m_Layer: 0
+ m_Name: GazeControls
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011947540078
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012378391282}
+ - 114: {fileID: 114000013988799740}
+ m_Layer: 0
+ m_Name: MouseXZTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012373135252
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011800569768}
+ - 114: {fileID: 114000012889557236}
+ m_Layer: 0
+ m_Name: KeyboardXYRotationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012618464992
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011251444590}
+ - 114: {fileID: 114000012298662144}
+ m_Layer: 0
+ m_Name: KeyboardXYTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012744789930
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010393938340}
+ - 114: {fileID: 114000011359953050}
+ m_Layer: 0
+ m_Name: MouseXYTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013425959562
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012536474926}
+ - 114: {fileID: 114000014171224568}
+ m_Layer: 0
+ m_Name: KeyboardXZRotationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000014073514604
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012610367806}
+ - 114: {fileID: 114000013649663976}
+ m_Layer: 0
+ m_Name: JoystickXYRotationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4000010085977160
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010136702736}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 9
+--- !u!4 &4000010393938340
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012744789930}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 1
+--- !u!4 &4000010510211078
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011489060388}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000010590998566}
+ - {fileID: 4000010393938340}
+ - {fileID: 4000012378391282}
+ - {fileID: 4000011800569768}
+ - {fileID: 4000012536474926}
+ - {fileID: 4000011251444590}
+ - {fileID: 4000011708201582}
+ - {fileID: 4000012610367806}
+ - {fileID: 4000014150713462}
+ - {fileID: 4000010085977160}
+ m_Father: {fileID: 4000010560871102}
+ m_RootOrder: 0
+--- !u!4 &4000010560871102
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011021619270}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000010510211078}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+--- !u!4 &4000010590998566
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011337565444}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 0
+--- !u!4 &4000011251444590
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012618464992}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 5
+--- !u!4 &4000011708201582
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010956895450}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 6
+--- !u!4 &4000011800569768
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012373135252}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 3
+--- !u!4 &4000012378391282
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011947540078}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 2
+--- !u!4 &4000012536474926
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013425959562}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 4
+--- !u!4 &4000012610367806
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000014073514604}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 7
+--- !u!4 &4000014150713462
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011026140476}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000010510211078}
+ m_RootOrder: 8
+--- !u!20 &20000013304850028
+Camera:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011021619270}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 2
+ m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.85
+ far clip plane: 1000
+ field of view: 16
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+ m_StereoMirrorMode: 0
+--- !u!81 &81000013783107718
+AudioListener:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011021619270}
+ m_Enabled: 1
+--- !u!92 &92000010221946138
+Behaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011021619270}
+ m_Enabled: 1
+--- !u!114 &114000010160007858
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011026140476}
+ m_Enabled: 0
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 3
+ axisType: 0
+ buttonType: 21
+ InputManagerHorizontalAxisName: LeftTrigger
+ InputManagerVerticalAxisName: RightTrigger
+ Axis0Destination: 2
+ Axis1Destination: 3
+ Axis2Destination: 6
+--- !u!114 &114000011221680894
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010136702736}
+ m_Enabled: 0
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 3
+ axisType: 0
+ buttonType: 21
+ InputManagerHorizontalAxisName: RightStickHorizontal
+ InputManagerVerticalAxisName: RightStickVertical
+ Axis0Destination: 0
+ Axis1Destination: 4
+ Axis2Destination: 6
+--- !u!114 &114000011359953050
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012744789930}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 1
+ axisType: 13
+ buttonType: 21
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 0
+ Axis1Destination: 2
+ Axis2Destination: 6
+--- !u!114 &114000012298662144
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012618464992}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 1
+ axisType: 3
+ buttonType: 21
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 2
+ Axis1Destination: 6
+ Axis2Destination: 6
+--- !u!114 &114000012656745502
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010956895450}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 3
+ axisType: 0
+ buttonType: 21
+ InputManagerHorizontalAxisName: Horizontal
+ InputManagerVerticalAxisName: Vertical
+ Axis0Destination: 0
+ Axis1Destination: 4
+ Axis2Destination: 6
+--- !u!114 &114000012889557236
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012373135252}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 1
+ axisType: 6
+ buttonType: 21
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 2
+ Axis1Destination: 1
+ Axis2Destination: 6
+--- !u!114 &114000013543835744
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011021619270}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9cf6ab24363b7a74da25766ea8ba6809, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ MouseSupported: 1
+ MouseXYRotationAxisControl: {fileID: 114000013933693316}
+ MouseXYTranslationAxisControl: {fileID: 114000011359953050}
+ MouseXZTranslationAxisControl: {fileID: 114000013988799740}
+ KeyboardSupported: 1
+ KeyboardXYRotationAxisControl: {fileID: 114000012889557236}
+ KeyboardXZRotationAxisControl: {fileID: 114000014171224568}
+ KeyboardXYTranslationAxisControl: {fileID: 114000012298662144}
+ KeyboardXZTranslationAxisControl: {fileID: 114000012656745502}
+ JoystickSupported: 0
+ JoystickXYRotationAxisControl: {fileID: 114000013649663976}
+ JoystickXYTranslationAxisControl: {fileID: 114000010160007858}
+ JoystickXZTranslationAxisControl: {fileID: 114000011221680894}
+--- !u!114 &114000013649663976
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000014073514604}
+ m_Enabled: 0
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 3
+ axisType: 0
+ buttonType: 21
+ InputManagerHorizontalAxisName: LeftStickHorizontal
+ InputManagerVerticalAxisName: LeftStickVertical
+ Axis0Destination: 2
+ Axis1Destination: 0
+ Axis2Destination: 6
+--- !u!114 &114000013933693316
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011337565444}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 4.5
+ axisType: 11
+ buttonType: 1
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 0
+ Axis1Destination: 2
+ Axis2Destination: 6
+--- !u!114 &114000013988799740
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011947540078}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 3
+ axisType: 12
+ buttonType: 3
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 4
+ Axis1Destination: 6
+ Axis2Destination: 6
+--- !u!114 &114000014171224568
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013425959562}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 1
+ axisType: 7
+ buttonType: 21
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 5
+ Axis1Destination: 4
+ Axis2Destination: 6
+--- !u!124 &124000011504821460
+Behaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011021619270}
+ m_Enabled: 1
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/HoloLensCamera.prefab.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs/HoloLensCamera.prefab.meta
new file mode 100644
index 0000000..58b9c4c
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/HoloLensCamera.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d379ed0a5618c9f479f58bd83a2d0ad3
+timeCreated: 1463610582
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/InputManager.prefab b/HoloBot/Assets/HoloToolkit/Input/Prefabs/InputManager.prefab
new file mode 100644
index 0000000..ae50e70
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/InputManager.prefab
@@ -0,0 +1,845 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1000011070707148}
+ m_IsPrefabParent: 1
+--- !u!1 &1000010419138632
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013175961358}
+ - 114: {fileID: 114000010697249598}
+ m_Layer: 0
+ m_Name: RawInteractionSources
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010559312462
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010757173486}
+ - 33: {fileID: 33000013920336656}
+ - 23: {fileID: 23000011955365276}
+ m_Layer: 0
+ m_Name: LeftHandMarkerQuad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!1 &1000010652855520
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010985388306}
+ - 33: {fileID: 33000011755631056}
+ - 23: {fileID: 23000014275679654}
+ m_Layer: 0
+ m_Name: RightHandMarkerQuad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!1 &1000010722508446
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011352983594}
+ - 114: {fileID: 114000013582617810}
+ m_Layer: 0
+ m_Name: XYTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000010849031070
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012383807932}
+ - 114: {fileID: 114000013944478910}
+ m_Layer: 0
+ m_Name: XZTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011025849994
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012897398672}
+ - 114: {fileID: 114000013734435004}
+ m_Layer: 0
+ m_Name: XYTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011070707148
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011656901714}
+ - 114: {fileID: 114000012009196210}
+ - 114: {fileID: 114000011980027866}
+ - 114: {fileID: 114000012434513746}
+ - 114: {fileID: 114000013868099214}
+ m_Layer: 0
+ m_Name: InputManager
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000011611902316
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012504439998}
+ - 114: {fileID: 114000014256863992}
+ m_Layer: 0
+ m_Name: FingerDownButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012017714622
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010470096086}
+ - 114: {fileID: 114000013661209266}
+ m_Layer: 0
+ m_Name: FingerUpButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012022330152
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013985985722}
+ - 114: {fileID: 114000012391649198}
+ - 114: {fileID: 114000011693831752}
+ m_Layer: 0
+ m_Name: EditorHandsInput
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012616863954
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000010261267946}
+ - 114: {fileID: 114000012864906760}
+ m_Layer: 0
+ m_Name: GesturesInput
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012685836518
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000014269641458}
+ - 114: {fileID: 114000011211768160}
+ m_Layer: 0
+ m_Name: FingerUpButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000012835389718
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012179495490}
+ - 114: {fileID: 114000010160081412}
+ m_Layer: 0
+ m_Name: XZTranslationAxis
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013347501094
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012746438650}
+ m_Layer: 0
+ m_Name: LeftHand
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013402879350
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000011838644884}
+ m_Layer: 0
+ m_Name: HandControls
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000013803292764
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000013940582514}
+ - 114: {fileID: 114000010332641428}
+ m_Layer: 0
+ m_Name: FingerDownButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1000014258050880
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 4
+ m_Component:
+ - 4: {fileID: 4000012651543500}
+ m_Layer: 0
+ m_Name: RightHand
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4000010261267946
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012616863954}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000011656901714}
+ m_RootOrder: 2
+--- !u!4 &4000010470096086
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012017714622}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012746438650}
+ m_RootOrder: 2
+--- !u!4 &4000010757173486
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010559312462}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -0.05, y: -0.09, z: 0.9}
+ m_LocalScale: {x: -0.025, y: 0.025, z: 0.025}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012746438650}
+ m_RootOrder: 4
+--- !u!4 &4000010985388306
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010652855520}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.05, y: -0.09, z: 0.9}
+ m_LocalScale: {x: 0.025, y: 0.025, z: 0.025}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012651543500}
+ m_RootOrder: 4
+--- !u!4 &4000011352983594
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010722508446}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012746438650}
+ m_RootOrder: 0
+--- !u!4 &4000011656901714
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011070707148}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000013175961358}
+ - {fileID: 4000013985985722}
+ - {fileID: 4000010261267946}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+--- !u!4 &4000011838644884
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013402879350}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000012746438650}
+ - {fileID: 4000012651543500}
+ m_Father: {fileID: 4000013985985722}
+ m_RootOrder: 0
+--- !u!4 &4000012179495490
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012835389718}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012746438650}
+ m_RootOrder: 1
+--- !u!4 &4000012383807932
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010849031070}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012651543500}
+ m_RootOrder: 1
+--- !u!4 &4000012504439998
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011611902316}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012651543500}
+ m_RootOrder: 3
+--- !u!4 &4000012651543500
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000014258050880}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000012897398672}
+ - {fileID: 4000012383807932}
+ - {fileID: 4000014269641458}
+ - {fileID: 4000012504439998}
+ - {fileID: 4000010985388306}
+ m_Father: {fileID: 4000011838644884}
+ m_RootOrder: 1
+--- !u!4 &4000012746438650
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013347501094}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000011352983594}
+ - {fileID: 4000012179495490}
+ - {fileID: 4000010470096086}
+ - {fileID: 4000013940582514}
+ - {fileID: 4000010757173486}
+ m_Father: {fileID: 4000011838644884}
+ m_RootOrder: 0
+--- !u!4 &4000012897398672
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011025849994}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012651543500}
+ m_RootOrder: 0
+--- !u!4 &4000013175961358
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010419138632}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000011656901714}
+ m_RootOrder: 0
+--- !u!4 &4000013940582514
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013803292764}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012746438650}
+ m_RootOrder: 3
+--- !u!4 &4000013985985722
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012022330152}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 4000011838644884}
+ m_Father: {fileID: 4000011656901714}
+ m_RootOrder: 1
+--- !u!4 &4000014269641458
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012685836518}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_Children: []
+ m_Father: {fileID: 4000012651543500}
+ m_RootOrder: 2
+--- !u!23 &23000011955365276
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010559312462}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: e3614b053e3b0bd4b8efece8f50c21ad, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 1
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+--- !u!23 &23000014275679654
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010652855520}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_Materials:
+ - {fileID: 2100000, guid: e3614b053e3b0bd4b8efece8f50c21ad, type: 2}
+ m_SubsetIndices:
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 1
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_SelectedWireframeHidden: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+--- !u!33 &33000011755631056
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010652855520}
+ m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!33 &33000013920336656
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010559312462}
+ m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!114 &114000010160081412
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012835389718}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 0.5
+ axisType: 12
+ buttonType: 4
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 4
+ Axis1Destination: 6
+ Axis2Destination: 6
+--- !u!114 &114000010332641428
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000013803292764}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1350e83623c005741ad0d1b09834ed62, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ buttonType: 12
+--- !u!114 &114000010697249598
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010419138632}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 73383145d055bef478097c80c114d2a4, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!114 &114000011211768160
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012685836518}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1350e83623c005741ad0d1b09834ed62, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ buttonType: 18
+--- !u!114 &114000011693831752
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012022330152}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f5d9d16de978748488d7a8e0daf6e5cf, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ HandReturnFactor: 0.25
+ HandTimeBeforeReturn: 0.25
+ MinimumTrackedMovement: 0.001
+ LeftHandPrimaryAxisControl: {fileID: 114000013582617810}
+ LeftHandSecondaryAxisControl: {fileID: 114000010160081412}
+ LeftFingerUpButtonControl: {fileID: 114000013661209266}
+ LeftFingerDownButtonControl: {fileID: 114000010332641428}
+ RightHandPrimaryAxisControl: {fileID: 114000013734435004}
+ RightHandSecondaryAxisControl: {fileID: 114000013944478910}
+ RightFingerUpButtonControl: {fileID: 114000011211768160}
+ RightFingerDownButtonControl: {fileID: 114000014256863992}
+ ActiveHandColor: {r: 0.3254902, g: 0.3764706, b: 0.92941177, a: 1}
+ DroppedHandColor: {r: 0.342, g: 0.342, b: 0.342, a: 0.241}
+ VisualizeHands: 1
+ LeftHandVisualizer: {fileID: 1000010559312462}
+ RightHandVisualizer: {fileID: 1000010652855520}
+ HandUpTexture: {fileID: 2800000, guid: 778e02a60d620bb419088e692a3584d3, type: 3}
+ HandDownTexture: {fileID: 2800000, guid: d84aac8e3bc8fe344b50dab1e7382ad7, type: 3}
+ LeftHandInView: 0
+ RightHandInView: 0
+--- !u!114 &114000011980027866
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011070707148}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b81e3e700505863408cacaa0346cb1a6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ StoredStabilitySamples: 60
+--- !u!114 &114000012009196210
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011070707148}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4d1a2a33ffcac354298137001635a001, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ MaxGazeCollisionDistance: 10
+ RaycastLayerMasks:
+ - serializedVersion: 2
+ m_Bits: 4294967291
+ Stabilizer: {fileID: 114000011980027866}
+ GazeTransform: {fileID: 0}
+--- !u!114 &114000012391649198
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012022330152}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: c527ac8839879014ab405b6cb5ee39e6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!114 &114000012434513746
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011070707148}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b160d197a8ca1894796ae263bafec0ac, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!114 &114000012864906760
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012616863954}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d40781677294a0e4caffa3460012ae41, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ UseRailsNavigation: 0
+--- !u!114 &114000013582617810
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010722508446}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 1
+ axisType: 11
+ buttonType: 4
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 3
+ Axis1Destination: 0
+ Axis2Destination: 6
+--- !u!114 &114000013661209266
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000012017714622}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1350e83623c005741ad0d1b09834ed62, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ buttonType: 12
+--- !u!114 &114000013734435004
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011025849994}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 1
+ axisType: 11
+ buttonType: 6
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 3
+ Axis1Destination: 0
+ Axis2Destination: 6
+--- !u!114 &114000013868099214
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011070707148}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 37870ab7a81bfb74b9fa277cf45b06d2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SetStabilizationPlane: 1
+ LerpStabilizationPlanePowerCloser: 4
+ LerpStabilizationPlanePowerFarther: 7
+ targetOverride: {fileID: 0}
+ trackVelocity: 0
+ UseGazeManager: 1
+ DefaultPlaneDistance: 2
+ DrawGizmos: 0
+--- !u!114 &114000013944478910
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000010849031070}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d1b627838df61e64baecc87fee2dec17, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SensitivityScale: 0.5
+ axisType: 12
+ buttonType: 6
+ InputManagerHorizontalAxisName:
+ InputManagerVerticalAxisName:
+ Axis0Destination: 4
+ Axis1Destination: 6
+ Axis2Destination: 6
+--- !u!114 &114000014256863992
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1000011611902316}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1350e83623c005741ad0d1b09834ed62, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ buttonType: 18
diff --git a/HoloBot/Assets/HoloToolkit/Input/Prefabs/InputManager.prefab.meta b/HoloBot/Assets/HoloToolkit/Input/Prefabs/InputManager.prefab.meta
new file mode 100644
index 0000000..51fa430
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Prefabs/InputManager.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3eddd1c29199313478dd3f912bfab2ab
+timeCreated: 1471454691
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/README.md b/HoloBot/Assets/HoloToolkit/Input/README.md
new file mode 100644
index 0000000..ad0f8f6
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/README.md
@@ -0,0 +1,317 @@
+## [Input]()
+Input System Diagrams:
+
+
+
+## Scripts that leverage HoloLens input features namely Gaze, Gesture and Voice.
+
+This contains a fully-featured **input module**, which allows you to handle various types of input and send them to any game object being currently gazed at, or any fallback object. It also includes a **cursor** similar to the HoloLens shell cursor that fully leverages the Unity's animation system.
+
+### [Input Module Design](InputModuleDesign)
+The input module is designed to be extensible: it could support various input mechanisms and various types of gazers.
+
+Each input source (hands, gestures, others) implement a **IInputSource** interface. The interface defines various events that the input sources can trigger. The input sources register themselves with the InputManager, whose role it is to forward input to the appropriate game objects. Input sources can be dynamically enabled / disabled as necessary, and new input sources can be created to support different input devices.
+
+Game objects that want to consume input events can implement one or many **input interfaces**, such as:
+
+- **IFocusable** for focus enter and exit. The focus can be triggered by the user's gaze or any other gaze source.
+- **IHoldHandle** for the Windows hold gesture.
+- **IInputHandler** for source up and down. The source can be a hand that tapped, a clicker that was pressed, etc.
+- **IInputClickHandler** for source clicked. The source can be a hand that tapped, a clicker that was pressed, etc.
+- **IManipulationHandler** for the Windows manipulation gesture.
+- **INavigationnHandler** for the Windows navigation gesture.
+- **ISourceStateHandler** for the source detected and source lost events.
+- **ISpeechHandler** for voice commands.
+
+The **input manager** listens to the various events coming from the input sources, and also takes into account the gaze. Currently, that gaze is always coming from the GazeManager class, but this could be extended to support multiple gaze sources if the need arises.
+
+By default, input events are sent to the currently focused game object, if that object implements the appropriate interface. Modals input handlers can also be added to the input manager: these modal handlers will take priority over the currently focused object Fallback handlers can also be defined, so that the application can react to global inputs that aren't targeting a specific element. Any event sent by the input manager always bubbles up from the object to its ancestors.
+
+In recap, the input manager forwards the various input sources events to the appropriate game object, using the following order:
+
+1. The registered modal input handlers, in LIFO (Last-In First-Out) order of registration
+2. The currently focused object
+3. The fallback input handlers, in LIFO order of registration
+
+### [Prefabs](Prefabs)
+Prefabs related to the input features.
+
+#### BasicCursor.prefab
+Torus shaped basic cursor that follows the user's gaze around.
+
+#### Cursor.prefab
+Torus shaped CursorOnHolograms when user is gazing at holograms and point light CursorOffHolograms when user is gazing away from holograms.
+
+#### CursorWithFeedback.prefab
+Torus shaped cursor that follows the user's gaze and HandDetectedFeedback asset to give feedback to user when their hand is detected in the ready state.
+
+#### DefaultCursor.prefab
+3D animated cursor that follows the user's gaze and uses the Unity animation system to handle its various states. This cursor imitates the HoloLens Shell cursor.
+
+#### HoloLensCamera.prefab
+Unity camera that has been customized for Holographic development.
+1. Camera.Transform set to 0,0,0
+2. 'Clear Flags' changed to 'Solid Color'
+3. Color set to R:0, G:0, B:0, A:0 as black renders transparent in HoloLens.
+4. Set the recommended near clipping plane.
+5. Allows manual movement of the camera when in editor
+
+#### InputManager.prefab
+Input system that manages gaze and various input sources currently supported by HoloLens, such as hands and gestures.
+
+This also includes a fake input source that allows you to simulate hand input when in the editor. By default, this can be done by holding Shift (left hand) or Space (right hand), moving the mouse to move the hand and use the left mouse button to tap.
+
+### [Scripts](Scripts)
+Scripts related to the input features.
+
+#### Cursor
+##### AnimatedCursor.cs
+Animated cursor is a cursor driven using an animator to inject state information and animate accordingly.
+
+##### Cursor.cs
+Abstract class that a concrete class should implement to make it easy to create a custom cursor. This provides the basic logic to show a cursor at the location a user is gazing.
+1. Decides when to show the cursor.
+2. Positions the cursor at the gazed hit location.
+3. Rotates the cursor to match hologram normals.
+
+##### CursorModifier.cs
+CursorModifier is a component that can be added to any game object with a collider to modify how a cursor reacts when on that collider.
+
+##### ICursor.cs
+Cursor interface that any cursor must implement.
+
+##### ICursorModifier.cs
+Interface that any cursor modifier must implement to provide basic overrides for cursor behaviour.
+
+##### MeshCursor.cs
+Cursor whose states are represented by one or many meshes.
+
+##### ObjectCursor.cs
+Cursor whose states are represented by one or many game objects.
+
+##### SpriteCursor.cs
+Cursor whose states are represented by colored sprites.
+
+#### Gaze
+##### BaseRayStabilizer.cs
+A base abstract class for a stabilizer that takes as input position and orientation, and performs operations on them to stabilize or smooth that data.
+
+##### GazeManager.cs
+Singleton component in charge of managing the gaze vector. This is where you can define which layers are considered when gazing at objects. Optionally, the gaze manager can reference a ray stabilizer that will be used to stabilize the gaze of the user.
+
+- **MaxGazeCollisionDistance :** the maximum distance to raycast. Any holograms beyond this value will not be raycasted to.
+- **RaycastLayers :** the Unity layers to raycast against. If you have holograms that should not be raycasted against, like a cursor, do not include their layers in this mask.
+- **Stabilizer :** stabilizer to use to stabilize the gaze. If not set, the gaze will not be stabilized.
+- **Gaze Transform :** the transform to use as the source of the gaze. If not set, will default to the main camera.
+
+##### GazeStabilizer.cs
+Stabilize the user's gaze to account for head jitter.
+
+- **StoredStabilitySamples** Number of samples that you want to iterate on. A larger number will be more stable.
+
+#### InputEvents
+##### BaseInputEventData.cs
+Base class for all input event data. An input event data is what is sent as a parameter to all input events.
+
+##### HoldEventData.cs
+Event data for an event coming from the hold gesture.
+
+##### IFocusable.cs
+Interface that a game object can implement to react to focus enter/exit.
+
+##### IHoldHandler.cs
+Interface that a game object can implement to react to hold gestures.
+
+##### IInputHandler.cs
+Interface that a game object can implement to react to simple pointer-like inputs.
+
+##### IManipulationHandler.cs
+Interface that a game object can implement to react to manipulation gestures.
+
+##### INavigationHandler.cs
+Interface that a game object can implement to react to navigation gestures.
+
+##### ISourceStateHandler.cs
+Interface that a game object can implement to react to source state changes, such as when an input source is detected or lost.
+
+##### InputEventData.cs
+Event data for an event that represents an input interaction such as a tap / click.
+
+##### ManipulationEventData.cs
+Event data for an event coming from the manipulation gesture.
+
+##### NavigationEventData.cs
+Event data for an event coming from the navigation gesture.
+
+##### SourceStateEventData.cs
+Event data for an event that represents an input source being detected or lost.
+
+#### InputSources
+
+##### BaseInputSource.cs
+Abstract base class for an input source that implements IInputSource. Defines the various abstract functions that any input source needs to implement, and provides some default implementations.
+
+##### EditorHandsInput.cs
+Input source for fake hands information, which can be used to simulate hands input in the Unity editor.
+
+##### GesturesInput.cs
+Input source for gestures information from the WSA APIs, which gives access to various system supported gestures.
+
+##### IInputSource.cs
+Interface for an input source. An input source is any input mechanism that can be used as the source of user interactions.
+
+##### RawInteractionSourcesInput.cs
+Input source for raw interactions sources information, which gives finer details about current source state and position than the standard GestureRecognizer.
+
+#### Interactions Scripts
+##### HandDraggable.cs
+Allows dragging an object in space with your hand on HoloLens. Just attach the script to a game object to make it movable.
+
+#### Microphone
+##### MicStream.cs
+Lets you access beam-formed microphone streams from the HoloLens to optimize voice and/or room captures, which is impossible to do with Unity's Microphone object. Takes the data and inserts it into Unity's AudioSource object for easy handling. Also lets you record indeterminate-length audio files from the Microphone to your device's Music Library, also using beam-forming.
+
+Check out Assets/HoloToolkit/Input/Tests/Scripts/MicStreamDemo.cs for an example of implementing these features, which is used in the demo scene at Assets/HoloToolkit/Input/Tests/MicrophoneStream.unity.
+
+**IMPORTANT**: Please make sure to add the Microphone and Music Library capabilities in your app, in Unity under
+Edit -> Project Settings -> Player -> Settings for Windows Store -> Publishing Settings -> Capabilities
+or in your Visual Studio Package.appxmanifest capabilities.
+
+**_KeywordsAndResponses_** Set the size as the number of keywords you'd like to listen for, then specify the keywords and method responses to complete the array.
+
+**RecognizerStart** Set this to determine whether the keyword recognizer will start immediately or if it should wait for your code to tell it to start.
+
+#### Voice
+
+**IMPORTANT**: Please make sure to add the Microphone capabilities in your app, in Unity under
+Edit -> Project Settings -> Player -> Settings for Windows Store -> Publishing Settings -> Capabilities
+or in your Visual Studio Package.appxmanifest capabilities.
+
+##### KeywordManager.cs
+Allows you to specify keywords and methods in the Unity Inspector, instead of registering them explicitly in code.
+
+**_KeywordsAndResponses_** Set the size as the number of keywords you'd like to listen for, then specify the keywords and method responses to complete the array.
+
+**RecognizerStart** Set this to determine whether the keyword recognizer will start immediately or if it should wait for your code to tell it to start.
+
+##### SpeechInputSource.cs
+Allows you to specify keywords and keyboard shortcuts in the Unity Inspector, instead of registering them explicitly in code. Keywords are handled by scripts that implement ISpeechHandler.cs.
+
+Check out Assets/HoloToolkit/Input/Tests/Scripts/SphereKeywords.cs and Assets/HoloToolkit/Input/Tests/Scripts/SphereGlobalKeywords.cs for an example of implementing these features, which is used in the demo scene at Assets/HoloToolkit/Input/Tests/SpeechInputSource.unity.
+
+**_KeywordsAndKeys_** Set the size as the number of keywords you'd like to listen for, then specify the keywords to complete the array.
+
+**RecognizerStart** Set this to determine whether the keyword recognizer will start immediately or if it should wait for your code to tell it to start.
+
+##### ISpeechHandler.cs
+Interface that a game object can implement to react to speech keywords.
+
+### [Test Prefabs](TestPrefabs)
+
+Prefabs used in the various test scenes, which you can use as inspiration to build your own.
+
+#### FocusedObjectKeywordManager.prefab
+Keyword manager pre-wired to send messages to object being currently focused via FocusedObjectMessageSender component.
+You can simply drop this into your scene and be able to send arbitrary messages to currently focused object.
+
+#### SelectedObjectKeywordManager.prefab
+Keyword manager pre-wired to send messages to object being currently selected via SelectedObjectMessageSender component.
+You can simply drop this into your scene and be able to send arbitrary messages to currently selected object.
+
+### [Test Scripts](TestScripts)
+#### FocusedObjectMessageSender.cs
+Sends Unity message to currently focused object.
+FocusedObjectMessageSender.SendMessageToFocusedObject needs to be registered as a response in KeywordManager
+to enable arbitrary messages to be sent to currently focused object.
+
+#### SelectedObjectMessageSender.cs
+Sends Unity message to currently selected object.
+SelectedObjectMessageSender.SendMessageToSelectedObject needs to be registered as a response in KeywordManager
+to enable arbitrary messages to be sent to currently selected object.
+
+#### SelectedObjectMessageReceiver.cs
+Example on how to handle messages send by SelectedObjectMessageSender.
+In this particular implementation, selected object color it toggled on selecting object and clearing selected object.
+
+#### SimpleGridGenerator.cs
+A grid of dynamic objects to illustrate sending messages to prefab instances created at runtime as opposed
+to only static objects that already exist in the scene.
+
+#### GazeResponder.cs
+This class implements IFocusable to respond to gaze changes.
+It highlights the object being gazed at.
+
+#### TapResponder.cs
+This class implements IInputClickHandler to handle the tap gesture.
+It increases the scale of the object when tapped.
+
+### [Tests](Tests/Scenes)
+Tests related to the input features. To use the scene:
+
+1. Navigate to the Tests folder.
+2. Double click on the test scene you wish to explore.
+3. Either click "Play" in the unity editor or File -> Build Settings.
+4. Add Open Scenes, Platform -> Windows Store, SDK -> Universal 10, Build Type -> D3D, Check 'Unity C# Projects'.
+5. Click 'Build' and create an App folder. When compile is done, open the solution and deploy to device.
+
+#### BasicCursor.unity
+Shows the basic cursor following the user's gaze and hugging the test sphere in the scene.
+
+#### Cursor.unity
+Shows the cursor on holograms hugging the test sphere in the scene and cursor off holograms when not gazing at the sphere.
+
+#### CursorWithFeedback.unity
+Shows the cursor hugging the test sphere in the scene and displays hand detected asset when hand is detected in ready state.
+
+#### FocusedObjectKeywords.unity
+Example on how to send keyword messages to currently focused dynamically instantiated object.
+Gazing on an object and saying "Make Smaller" and "Make Bigger" will adjust object size.
+
+#### InputTapTest.unity
+Test scene shows you in a simple way, how to respond to user's gaze using the Input module.
+It also shows you how to respond to the user's tap gesture.
+
+#### KeywordManager.unity
+Shows how to use the KeywordManager.cs script to add keywords to your scene.
+
+1. Select whether you want the recognizer to start automatically or when you manually start it.
+2. Specify the number of keywords you want.
+3. Type the word or phrase you'd like to register as the keyword and, if you want, set a key code to use in the Editor. You can also use an attached microphone with the Editor.
+4. Press the + to add a response. Then, drag a GameObject with the script you want to call into the "None (Object)" field.
+5. Select the script and method to call or variable to set from the "No Function" dropdown. Add any parameters, if necessary, into the field below the dropdown.
+
+When you start the scene, your keywords will automatically be registered on a KeywordRecognizer, and the recognizer will be started (or not) based on your Recognizer Start setting.
+
+#### ManualCameraControl.unity
+
+This scene shows how to manually control the camera. The script is on the main camera of the scene. When preview mode in Unity is activated, the user can move around the scene using WASD and look around using right-mouse-button + mouse.
+
+#### MicrophoneStream.unity
+Example usage of MicStream.cs to select and record beam-formed audio from the hololens. In editor, the script lets you choose if you want to beam-form capture on voice or on the room. When running, press 'Q' to start the stream you selected, 'W' will stop the stream, 'A' starts recording a wav file, and 'S' stops the recording, saves it to your Music library, and prints the full path of the audio clip.
+
+#### SelectedObjectKeywords.unity
+Example on how to send keyword messages to currently selected dynamically instantiated object.
+Gazing on an object and saying "Select Object" will persistently select that object for interaction with voice commands,
+after which the user can also adjust object size with "Make Smaller" and "Make Bigger" voice commands and finally clear
+currently selected object by saying "Clear Selection".
+
+#### OverrideFocusedObjectTest.unity
+Test scene shows you in a simple way, how to route input to an object not being gazed/focused at.
+Useful for scenarios like placing head locked content or clicking around to create objects.
+
+#### SpeechInputSource.unity
+
+Shows how to use the SpeechInputSource.cs script to add keywords to your scene.
+
+1. Select whether you want the recognizer to start automatically or when you manually start it.
+2. Specify the number of keywords you want.
+3. Type the word or phrase you'd like to register as the keyword and, if you want, set a key code to use in the Editor. You can also use an attached microphone with the Editor.
+4. Attach a script that implements ISpeechHandler.cs to the object in the scene that will require the gaze focus to execute the command. You should register this script with the InputManager.cs as a global listener to handle keywords that don't require a focused object.
+
+When you start the scene, your keywords will automatically be registered on a KeywordRecognizer, and the recognizer will be started (or not) based on your Recognizer Start setting.
+
+####
+
+---
+##### [Go back up to the table of contents.](../../../README.md)
+---
diff --git a/HoloBot/Assets/HoloToolkit/Input/README.md.meta b/HoloBot/Assets/HoloToolkit/Input/README.md.meta
new file mode 100644
index 0000000..6b83133
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/README.md.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9727c082b70b9934a9136d337efb7159
+timeCreated: 1470705588
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts.meta
new file mode 100644
index 0000000..42ed44f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 3fca56ff17adf954590a8c00b2dc532c
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor.meta
new file mode 100644
index 0000000..ebe047b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 683336f59c4e8154dabdb77e57f53763
+folderAsset: yes
+timeCreated: 1464209091
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/AnimatedCursor.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/AnimatedCursor.cs
new file mode 100644
index 0000000..223169e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/AnimatedCursor.cs
@@ -0,0 +1,170 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Animated cursor is a cursor driven using an animator to inject state information
+ /// and animate accordingly
+ ///
+ public class AnimatedCursor : Cursor
+ {
+ ///
+ /// Data struct for cursor state information for the Animated Cursor, which leverages the Unity animation system..
+ /// This defines a modification to an Unity animation parameter, based on cursor state.
+ ///
+ [Serializable]
+ public struct AnimCursorDatum
+ {
+ public string Name;
+ public CursorStateEnum CursorState;
+
+ ///
+ /// Types that an animation parameter can have in the Unity animation system.
+ ///
+ public enum AnimInputTypeEnum
+ {
+ Int,
+ Trigger,
+ Bool,
+ Float
+ }
+
+ [Tooltip("Type of the animation parameter to modify.")]
+ public AnimInputTypeEnum AnimInputType;
+
+ [Tooltip("Name of the animation parameter to modify.")]
+ public string AnimParameterName;
+
+ [Tooltip("If the animation parameter type is a bool, value to set. Ignored otherwise.")]
+ public bool AnimBoolValue;
+
+ [Tooltip("If the animation parameter type is an int, value to set. Ignored otherwise.")]
+ public int AnimIntValue;
+
+ [Tooltip("If the animation parameter type is a float, value to set. Ignored otherwise.")]
+ public float AnimFloatValue;
+ }
+
+ ///
+ /// Serialized set of cursor state data
+ ///
+ [Header("Animated Cursor State Data")]
+ [Tooltip("Cursor state data to use for its various states")]
+ [SerializeField]
+ public AnimCursorDatum[] CursorStateData;
+
+ ///
+ /// Enabled state Data when enabling
+ ///
+ [Tooltip("Cursor State Data to use when enabling the cursor")]
+ public AnimCursorDatum EnableStateData;
+
+ ///
+ /// Disabled state Data when disabled
+ ///
+ [Tooltip("Cursor State Data to use when the cursor is disabled")]
+ public AnimCursorDatum DisableStateData;
+
+ ///
+ /// Link the the cursor animator
+ ///
+ [SerializeField]
+ [Tooltip("Animator for the cursor")]
+ protected Animator CursorAnimator = null;
+
+ ///
+ /// Change anim stage when enabled
+ ///
+ public override void OnInputEnabled()
+ {
+ base.OnInputEnabled();
+ SetCursorState(EnableStateData);
+ }
+
+ ///
+ /// Change anim stage when disabled
+ ///
+ public override void OnInputDisabled()
+ {
+ base.OnInputDisabled();
+ SetCursorState(DisableStateData);
+ }
+
+ ///
+ /// Override to set the cursor anim trigger
+ ///
+ ///
+ protected override void OnActiveModifier(CursorModifier modifier)
+ {
+ base.OnActiveModifier(modifier);
+
+ if (modifier != null)
+ {
+ if(!string.IsNullOrEmpty(modifier.CursorTriggerName))
+ {
+ OnCursorStateChange(CursorStateEnum.Contextual);
+ CursorAnimator.SetTrigger(modifier.CursorTriggerName);
+ }
+ }
+ else
+ {
+ OnCursorStateChange(CursorStateEnum.None);
+ }
+ }
+
+ ///
+ /// Override OnCursorState change to set the correct animation
+ /// state for the cursor
+ ///
+ ///
+ public override void OnCursorStateChange(CursorStateEnum state)
+ {
+ base.OnCursorStateChange(state);
+ if(state != CursorStateEnum.Contextual)
+ {
+ for(int i = 0; i < CursorStateData.Length; i++)
+ {
+ if(CursorStateData[i].CursorState == state)
+ {
+ SetCursorState(CursorStateData[i]);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Based on the type of animator state info pass it through to the animator
+ ///
+ ///
+ private void SetCursorState(AnimCursorDatum stateDatum)
+ {
+ // Return if we do not have an animator
+ if (CursorAnimator == null)
+ {
+ return;
+ }
+
+ switch (stateDatum.AnimInputType)
+ {
+ case AnimCursorDatum.AnimInputTypeEnum.Bool:
+ CursorAnimator.SetBool(stateDatum.AnimParameterName, stateDatum.AnimBoolValue);
+ break;
+ case AnimCursorDatum.AnimInputTypeEnum.Float:
+ CursorAnimator.SetFloat(stateDatum.AnimParameterName, stateDatum.AnimFloatValue);
+ break;
+ case AnimCursorDatum.AnimInputTypeEnum.Int:
+ CursorAnimator.SetInteger(stateDatum.AnimParameterName, stateDatum.AnimIntValue);
+ break;
+ case AnimCursorDatum.AnimInputTypeEnum.Trigger:
+ CursorAnimator.SetTrigger(stateDatum.AnimParameterName);
+ break;
+ }
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/AnimatedCursor.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/AnimatedCursor.cs.meta
new file mode 100644
index 0000000..152cb1d
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/AnimatedCursor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0decd33ba8702954885a62b5bc1a778e
+timeCreated: 1460564228
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/Cursor.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/Cursor.cs
new file mode 100644
index 0000000..392f620
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/Cursor.cs
@@ -0,0 +1,458 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Object that represents a cursor in 3D space controlled by gaze.
+ ///
+ public abstract class Cursor : MonoBehaviour, ICursor
+ {
+ ///
+ /// Enum for current cursor state
+ ///
+ public enum CursorStateEnum
+ {
+ ///
+ /// Useful for releasing external override.
+ /// See CursorStateEnum.Contextual
+ ///
+ None = -1,
+ ///
+ /// Not IsHandVisible
+ ///
+ Observe,
+ ///
+ /// Not IsHandVisible AND not IsInputSourceDown AND TargetedObject exists
+ ///
+ ObserveHover,
+ ///
+ /// IsHandVisible AND not IsInputSourceDown AND TargetedObject is NULL
+ ///
+ Interact,
+ ///
+ /// IsHandVisible AND not IsInputSourceDown AND TargetedObject exists
+ ///
+ InteractHover,
+ ///
+ /// IsHandVisible AND IsInputSourceDown
+ ///
+ Select,
+ ///
+ /// Available for use by classes that extend Cursor.
+ /// No logic for setting Release state exists in the base Cursor class.
+ ///
+ Release,
+ ///
+ /// Allows for external override
+ ///
+ Contextual
+ }
+
+ public CursorStateEnum CursorState { get { return cursorState; } }
+ private CursorStateEnum cursorState = CursorStateEnum.None;
+
+ ///
+ /// Minimum distance for cursor if nothing is hit
+ ///
+ [Header("Cusor Distance")]
+ [Tooltip("The minimum distance the cursor can be with nothing hit")]
+ public float MinCursorDistance = 1.0f;
+
+ ///
+ /// Maximum distance for cursor if nothing is hit
+ ///
+ [Tooltip("The maximum distance the cursor can be with nothing hit")]
+ public float DefaultCursorDistance = 2.0f;
+
+ ///
+ /// Surface distance to place the cursor off of the surface at
+ ///
+ [Tooltip("The distance from the hit surface to place the cursor")]
+ public float SurfaceCursorDistance = 0.02f;
+
+ [Header("Motion")]
+ [Tooltip("When lerping, use unscaled time. This is useful for games that have a pause mechanism or otherwise adjust the game timescale.")]
+ public bool UseUnscaledTime = true;
+
+ ///
+ /// Blend value for surface normal to user facing lerp
+ ///
+ public float PositionLerpTime = 0.01f;
+
+ ///
+ /// Blend value for surface normal to user facing lerp
+ ///
+ public float ScaleLerpTime = 0.01f;
+
+ ///
+ /// Blend value for surface normal to user facing lerp
+ ///
+ public float RotationLerpTime = 0.01f;
+
+ ///
+ /// Blend value for surface normal to user facing lerp
+ ///
+ [Range(0, 1)]
+ public float LookRotationBlend = 0.5f;
+
+ ///
+ /// Visual that is displayed when cursor is active normally
+ ///
+ [Header("Tranform References")]
+ public Transform PrimaryCursorVisual;
+
+ public Vector3 Position
+ {
+ get { return transform.position; }
+ }
+
+ public Quaternion Rotation
+ {
+ get { return transform.rotation; }
+ }
+
+ public Vector3 LocalScale
+ {
+ get { return transform.localScale; }
+ }
+
+ ///
+ /// Indicates if hand is current in the view
+ ///
+ protected bool IsHandVisible;
+
+ ///
+ /// Indicates air tap down
+ ///
+ protected bool IsInputSourceDown;
+
+ protected GameObject TargetedObject;
+ protected ICursorModifier TargetedCursorModifier;
+
+ private uint visibleHandsCount = 0;
+ private bool isVisible = true;
+
+ private GazeManager gazeManager;
+
+ ///
+ /// Position, scale and rotational goals for cursor
+ ///
+ private Vector3 targetPosition;
+ private Vector3 targetScale;
+ private Quaternion targetRotation;
+
+ ///
+ /// Indicates if the cursor should be visible
+ ///
+ public bool IsVisible
+ {
+ set
+ {
+ isVisible = value;
+ SetVisiblity(isVisible);
+ }
+ }
+
+ #region MonoBehaviour Functions
+
+ private void Awake()
+ {
+ // Use the setter to update visibility of the cursor at startup based on user preferences
+ IsVisible = isVisible;
+ SetVisiblity(isVisible);
+ }
+
+ private void Start()
+ {
+ gazeManager = GazeManager.Instance;
+ RegisterManagers();
+ }
+
+ private void Update()
+ {
+ UpdateCursorState();
+ UpdateCursorTransform();
+ }
+
+ ///
+ /// Override for enable functions
+ ///
+ protected virtual void OnEnable()
+ {
+ if (gazeManager)
+ {
+ OnFocusedObjectChanged(null, gazeManager.HitObject);
+ }
+ OnCursorStateChange(CursorStateEnum.None);
+ }
+
+ ///
+ /// Override for disable functions
+ ///
+ protected virtual void OnDisable()
+ {
+ TargetedObject = null;
+ TargetedCursorModifier = null;
+ visibleHandsCount = 0;
+ IsHandVisible = false;
+ OnCursorStateChange(CursorStateEnum.Contextual);
+ }
+
+ private void OnDestroy()
+ {
+ UnregisterManagers();
+ }
+
+ #endregion
+
+ ///
+ /// Register to events from the managers the cursor needs.
+ ///
+ protected virtual void RegisterManagers()
+ {
+ // Register to gaze events
+ gazeManager.FocusedObjectChanged += OnFocusedObjectChanged;
+
+ // Register the cursor as a global listener, so that it can always get input events it cares about
+ InputManager.Instance.AddGlobalListener(gameObject);
+
+ // Setup the cursor to be able to respond to input being globally enabled / disabled
+ if (InputManager.Instance.IsInputEnabled)
+ {
+ OnInputEnabled();
+ }
+ else
+ {
+ OnInputDisabled();
+ }
+
+ InputManager.Instance.InputEnabled += OnInputEnabled;
+ InputManager.Instance.InputDisabled += OnInputDisabled;
+ }
+
+ ///
+ /// Unregister from events from the managers the cursor needs.
+ ///
+ protected virtual void UnregisterManagers()
+ {
+ if (gazeManager != null)
+ {
+ gazeManager.FocusedObjectChanged -= OnFocusedObjectChanged;
+ }
+
+ if (InputManager.Instance != null)
+ {
+ InputManager.Instance.RemoveGlobalListener(gameObject);
+ InputManager.Instance.InputEnabled -= OnInputEnabled;
+ InputManager.Instance.InputDisabled -= OnInputDisabled;
+ }
+ }
+
+ ///
+ /// Updates the currently targeted object and cursor modifier upon getting
+ /// an event indicating that the focused object has changed.
+ ///
+ /// Object that was previously being focused.
+ /// New object being focused.
+ protected virtual void OnFocusedObjectChanged(GameObject previousObject, GameObject newObject)
+ {
+ TargetedObject = newObject;
+ if (newObject != null)
+ {
+ OnActiveModifier(newObject.GetComponent());
+ }
+ }
+
+ ///
+ /// Override function when a new modifier is found or no modifier is valid
+ ///
+ ///
+ protected virtual void OnActiveModifier(CursorModifier modifier)
+ {
+ TargetedCursorModifier = modifier;
+ }
+
+ ///
+ /// Update the cursor's transform
+ ///
+ protected virtual void UpdateCursorTransform()
+ {
+ // Get the necessary info from the gaze source
+ RaycastHit hitResult = gazeManager.HitInfo;
+ GameObject newTargetedObject = gazeManager.HitObject;
+
+ // Get the forward vector looking back at camera
+ Vector3 lookForward = -gazeManager.GazeNormal;
+
+ // Normalize scale on before update
+ targetScale = Vector3.one;
+
+ // If no game object is hit, put the cursor at the default distance
+ if (TargetedObject == null)
+ {
+ this.TargetedObject = null;
+ this.TargetedCursorModifier = null;
+ targetPosition = gazeManager.GazeOrigin + gazeManager.GazeNormal * DefaultCursorDistance;
+ targetRotation = lookForward.magnitude > 0 ? Quaternion.LookRotation(lookForward, Vector3.up) : transform.rotation;
+ }
+ else
+ {
+ // Update currently targeted object
+ this.TargetedObject = newTargetedObject;
+
+ if (TargetedCursorModifier != null)
+ {
+ TargetedCursorModifier.GetModifiedTransform(this, out targetPosition, out targetRotation, out targetScale);
+ }
+ else
+ {
+ // If no modifier is on the target, just use the hit result to set cursor position
+ targetPosition = hitResult.point + (lookForward * SurfaceCursorDistance);
+ targetRotation = Quaternion.LookRotation(Vector3.Lerp(hitResult.normal, lookForward, LookRotationBlend), Vector3.up);
+ }
+ }
+
+ float deltaTime = UseUnscaledTime
+ ? Time.unscaledDeltaTime
+ : Time.deltaTime;
+
+ // Use the lerp times to blend the position to the target position
+ transform.position = Vector3.Lerp(transform.position, targetPosition, deltaTime / PositionLerpTime);
+ transform.localScale = Vector3.Lerp(transform.localScale, targetScale, deltaTime / ScaleLerpTime);
+ transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, deltaTime / RotationLerpTime);
+ }
+
+ ///
+ /// Updates the visual representation of the cursor.
+ ///
+ public void SetVisiblity(bool visible)
+ {
+ if (PrimaryCursorVisual != null)
+ {
+ PrimaryCursorVisual.gameObject.SetActive(visible);
+ }
+ }
+
+ ///
+ /// Disable input and set to contextual to override input
+ ///
+ public virtual void OnInputDisabled()
+ {
+ // Reset visible hands on disable
+ visibleHandsCount = 0;
+ IsHandVisible = false;
+
+ OnCursorStateChange(CursorStateEnum.Contextual);
+ }
+
+ ///
+ /// Enable input and set to none to reset cursor
+ ///
+ public virtual void OnInputEnabled()
+ {
+ OnCursorStateChange(CursorStateEnum.None);
+ }
+
+ ///
+ /// Function for consuming the OnInputUp events
+ ///
+ ///
+ public virtual void OnInputUp(InputEventData eventData)
+ {
+ IsInputSourceDown = false;
+ }
+
+ ///
+ /// Function for receiving OnInputDown events from InputManager
+ ///
+ ///
+ public virtual void OnInputDown(InputEventData eventData)
+ {
+ IsInputSourceDown = true;
+ }
+
+ ///
+ /// Function for receiving OnInputClicked events from InputManager
+ ///
+ ///
+ public virtual void OnInputClicked(InputClickedEventData eventData)
+ {
+ // Open input socket for other cool stuff...
+ }
+
+
+ ///
+ /// Input source detected callback for the cursor
+ ///
+ ///
+ public virtual void OnSourceDetected(SourceStateEventData eventData)
+ {
+ visibleHandsCount++;
+ IsHandVisible = true;
+ }
+
+
+ ///
+ /// Input source lost callback for the cursor
+ ///
+ ///
+ public virtual void OnSourceLost(SourceStateEventData eventData)
+ {
+ visibleHandsCount--;
+ if (visibleHandsCount == 0)
+ {
+ IsHandVisible = false;
+ IsInputSourceDown = false;
+ }
+ }
+
+ ///
+ /// Internal update to check for cursor state changes
+ ///
+ private void UpdateCursorState()
+ {
+ CursorStateEnum newState = CheckCursorState();
+ if (cursorState != newState)
+ {
+ OnCursorStateChange(newState);
+ }
+ }
+
+ ///
+ /// Virtual function for checking state changess.
+ ///
+ public virtual CursorStateEnum CheckCursorState()
+ {
+ if (cursorState != CursorStateEnum.Contextual)
+ {
+ if (IsInputSourceDown)
+ {
+ return CursorStateEnum.Select;
+ }
+ else if (cursorState == CursorStateEnum.Select)
+ {
+ return CursorStateEnum.Release;
+ }
+
+ if (IsHandVisible)
+ {
+ return TargetedObject != null ? CursorStateEnum.InteractHover : CursorStateEnum.Interact;
+ }
+ return TargetedObject != null ? CursorStateEnum.ObserveHover : CursorStateEnum.Observe;
+ }
+ return CursorStateEnum.Contextual;
+ }
+
+ ///
+ /// Change the cursor state to the new state. Override in cursor implementations.
+ ///
+ ///
+ public virtual void OnCursorStateChange(CursorStateEnum state)
+ {
+ cursorState = state;
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/Cursor.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/Cursor.cs.meta
new file mode 100644
index 0000000..b5c53a1
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/Cursor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ec2dd3e33d633414fa40ca4fead4a3d6
+timeCreated: 1460564228
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/CursorModifier.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/CursorModifier.cs
new file mode 100644
index 0000000..b2f013c
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/CursorModifier.cs
@@ -0,0 +1,106 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Component that can be added to any game object with a collider to modify
+ /// how a cursor reacts when on that collider.
+ ///
+ public class CursorModifier : MonoBehaviour, ICursorModifier
+ {
+ [Tooltip("Transform for which this cursor modifier applies its various properties.")]
+ public Transform HostTransform;
+
+ [Tooltip("How much a cursor should be offset from the surface of the object when overlapping.")]
+ public Vector3 CursorOffset = Vector3.zero;
+
+ [Tooltip("Direction of the cursor offset.")]
+ public Vector3 CursorNormal = Vector3.back;
+
+ [Tooltip("Scale of the cursor when looking at this object.")]
+ public Vector3 CursorScaleOffset = Vector3.one;
+
+ [Tooltip("Should the cursor snap to the object.")]
+ public bool SnapCursor = false;
+
+ [Tooltip("If true, the normal from the gaze vector will be used to orient the cursor " +
+ "instead of the targeted object's normal at point of contact.")]
+ public bool UseGazeBasedNormal = false;
+
+ [Tooltip("Should the cursor be hidding when this object is focused.")]
+ public bool HideCursorOnFocus = false;
+
+ [Tooltip("Cursor animation event to trigger when this object is gazed. Leave empty for none.")]
+ public string CursorTriggerName;
+
+ private void Awake()
+ {
+ if (HostTransform == null)
+ {
+ HostTransform = transform;
+ }
+ }
+
+ ///
+ /// Return whether or not hide the cursor
+ ///
+ ///
+ public bool GetCursorVisibility()
+ {
+ return HideCursorOnFocus;
+ }
+
+ public Vector3 GetModifiedPosition(ICursor cursor)
+ {
+ Vector3 position;
+
+ if (SnapCursor)
+ {
+ // Snap if the targeted object has a cursor modifier that supports snapping
+ position = HostTransform.position +
+ HostTransform.TransformVector(CursorOffset);
+ }
+ else
+ {
+ // Else, consider the modifiers on the cursor modifier, but don't snap
+ position = GazeManager.Instance.HitPosition + HostTransform.TransformVector(CursorOffset);
+ }
+
+ return position;
+ }
+
+ public Quaternion GetModifiedRotation(ICursor cursor)
+ {
+ Quaternion rotation;
+
+ Vector3 forward = UseGazeBasedNormal ? -GazeManager.Instance.GazeNormal : HostTransform.rotation * CursorNormal;
+
+ // Determine the cursor forward
+ if (forward.magnitude > 0)
+ {
+ rotation = Quaternion.LookRotation(forward, Vector3.up);
+ }
+ else
+ {
+ rotation = cursor.Rotation;
+ }
+
+ return rotation;
+ }
+
+ public Vector3 GetModifiedScale(ICursor cursor)
+ {
+ return CursorScaleOffset;
+ }
+
+ public void GetModifiedTransform(ICursor cursor, out Vector3 position, out Quaternion rotation, out Vector3 scale)
+ {
+ position = GetModifiedPosition(cursor);
+ rotation = GetModifiedRotation(cursor);
+ scale = GetModifiedScale(cursor);
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/CursorModifier.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/CursorModifier.cs.meta
new file mode 100644
index 0000000..2e5671b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/CursorModifier.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b79c91d1ffb021347a4135df5ddd1efc
+timeCreated: 1470951870
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursor.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursor.cs
new file mode 100644
index 0000000..4f001a9
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursor.cs
@@ -0,0 +1,34 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Cursor Interface for handling input events and setting visiblity.
+ ///
+ public interface ICursor : IInputHandler, IInputClickHandler, ISourceStateHandler
+ {
+ ///
+ /// Position of the cursor.
+ ///
+ Vector3 Position { get; }
+
+ ///
+ /// Rotation of the cursor.
+ ///
+ Quaternion Rotation { get; }
+
+ ///
+ /// Local scale of the cursor.
+ ///
+ Vector3 LocalScale { get; }
+
+ ///
+ /// Sets the visibility of the cursor.
+ ///
+ /// True if cursor should be visible, false if not.
+ void SetVisiblity(bool visible);
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursor.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursor.cs.meta
new file mode 100644
index 0000000..1d540d5
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1ef5f7f70af31a94086ff3d7f0a1719f
+timeCreated: 1477949420
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursorModifier.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursorModifier.cs
new file mode 100644
index 0000000..3d70128
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursorModifier.cs
@@ -0,0 +1,49 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Cursor Modifier Interface that provides basic overrides for cursor behaviour.
+ ///
+ public interface ICursorModifier
+ {
+ ///
+ /// Indicates whether the cursor should be visible or not.
+ ///
+ /// True if cursor should be visible, false if not.
+ bool GetCursorVisibility();
+
+ ///
+ /// Returns the cursor position after considering this modifier.
+ ///
+ /// Cursor that is being modified.
+ /// New position for the cursor
+ Vector3 GetModifiedPosition(ICursor cursor);
+
+ ///
+ /// Returns the cursor rotation after considering this modifier.
+ ///
+ /// Cursor that is being modified.
+ /// New rotation for the cursor
+ Quaternion GetModifiedRotation(ICursor cursor);
+
+ ///
+ /// Returns the cursor local scale after considering this modifier.
+ ///
+ /// Cursor that is being modified.
+ /// New local scale for the cursor
+ Vector3 GetModifiedScale(ICursor cursor);
+
+ ///
+ /// Returns the modified transform for the cursor after considering this modifier.
+ ///
+ /// Cursor that is being modified.
+ /// Modified position.
+ /// Modified rotation.
+ /// Modified scale.
+ void GetModifiedTransform(ICursor cursor, out Vector3 position, out Quaternion rotation, out Vector3 scale);
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursorModifier.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursorModifier.cs.meta
new file mode 100644
index 0000000..c7c30d8
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ICursorModifier.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 822c0970b94b13a47801746b133830f5
+timeCreated: 1478108836
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/MeshCursor.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/MeshCursor.cs
new file mode 100644
index 0000000..b13ad8f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/MeshCursor.cs
@@ -0,0 +1,86 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Object that represents a cursor in 3D space controlled by gaze.
+ ///
+ public class MeshCursor : Cursor
+ {
+ [Serializable]
+ public struct MeshCursorDatum
+ {
+ public string Name;
+ public CursorStateEnum CursorState;
+ public Mesh CursorMesh;
+ public Vector3 LocalScale;
+ public Vector3 LocalOffset;
+ }
+
+ [SerializeField]
+ public MeshCursorDatum[] CursorStateData;
+
+ ///
+ /// Sprite renderer to change. If null find one in children
+ ///
+ public MeshRenderer TargetRenderer;
+
+ ///
+ /// On enable look for a sprite renderer on children
+ ///
+ protected override void OnEnable()
+ {
+ if(TargetRenderer == null)
+ {
+ TargetRenderer = GetComponentInChildren();
+ }
+
+ base.OnEnable();
+ }
+
+ ///
+ /// Override OnCursorState change to set the correct animation
+ /// state for the cursor
+ ///
+ ///
+ public override void OnCursorStateChange(CursorStateEnum state)
+ {
+ base.OnCursorStateChange(state);
+
+ if (state != CursorStateEnum.Contextual)
+ {
+ for (int i = 0; i < CursorStateData.Length; i++)
+ {
+ if (CursorStateData[i].CursorState == state)
+ {
+ SetCursorState(CursorStateData[i]);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Based on the type of state info pass it through to the mesh renderer
+ ///
+ ///
+ private void SetCursorState(MeshCursorDatum stateDatum)
+ {
+ // Return if we do not have an animator
+ if (TargetRenderer != null)
+ {
+ MeshFilter mf = TargetRenderer.gameObject.GetComponent();
+ if(mf != null && stateDatum.CursorMesh != null)
+ {
+ mf.mesh = stateDatum.CursorMesh;
+ }
+
+ TargetRenderer.transform.localPosition = stateDatum.LocalOffset;
+ TargetRenderer.transform.localScale = stateDatum.LocalScale;
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/MeshCursor.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/MeshCursor.cs.meta
new file mode 100644
index 0000000..1784d79
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/MeshCursor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5a03e90953147cf4e948462c10c01b31
+timeCreated: 1460564228
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ObjectCursor.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ObjectCursor.cs
new file mode 100644
index 0000000..bd1cb56
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ObjectCursor.cs
@@ -0,0 +1,96 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// The object cursor can switch between different game objects based on its state.
+ /// It simply links the game object to set to active with its associated cursor state.
+ ///
+ public class ObjectCursor : Cursor
+ {
+ [Serializable]
+ public struct ObjectCursorDatum
+ {
+ public string Name;
+ public CursorStateEnum CursorState;
+ public GameObject CursorObject;
+ }
+
+ [SerializeField]
+ public ObjectCursorDatum[] CursorStateData;
+
+ ///
+ /// Sprite renderer to change. If null find one in children
+ ///
+ public Transform ParentTransform;
+
+ ///
+ /// On enable look for a sprite renderer on children
+ ///
+ protected override void OnEnable()
+ {
+ if(ParentTransform == null)
+ {
+ ParentTransform = transform;
+ }
+
+ for (int i = 0; i < ParentTransform.childCount; i++)
+ {
+ ParentTransform.GetChild(i).gameObject.SetActive(false);
+ }
+
+ base.OnEnable();
+ }
+
+ ///
+ /// Override OnCursorState change to set the correct animation
+ /// state for the cursor
+ ///
+ ///
+ public override void OnCursorStateChange(CursorStateEnum state)
+ {
+ base.OnCursorStateChange(state);
+ if (state != CursorStateEnum.Contextual)
+ {
+
+ // First, try to find a cursor for the current state
+ var newActive = new ObjectCursorDatum();
+ for(int cursorIndex = 0; cursorIndex < CursorStateData.Length; cursorIndex++)
+ {
+ ObjectCursorDatum cursor = CursorStateData[cursorIndex];
+ if (cursor.CursorState == state)
+ {
+ newActive = cursor;
+ break;
+ }
+ }
+
+ // If no cursor for current state is found, let the last active cursor be
+ // (any cursor is better than an invisible cursor)
+ if (newActive.Name == null)
+ {
+ return;
+ }
+
+ // If we come here, there is a cursor for the new state,
+ // so de-activate a possible earlier active cursor
+ for(int cursorIndex = 0; cursorIndex < CursorStateData.Length; cursorIndex++)
+ {
+ ObjectCursorDatum cursor = CursorStateData[cursorIndex];
+ if (cursor.CursorObject.activeSelf)
+ {
+ cursor.CursorObject.SetActive(false);
+ break;
+ }
+ }
+
+ // ... and set the cursor for the new state active.
+ newActive.CursorObject.SetActive(true);
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ObjectCursor.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ObjectCursor.cs.meta
new file mode 100644
index 0000000..68dcfeb
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/ObjectCursor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: afa1ae235bc6cfa43addd1435e2fd822
+timeCreated: 1460564228
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/SpriteCursor.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/SpriteCursor.cs
new file mode 100644
index 0000000..39f7117
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/SpriteCursor.cs
@@ -0,0 +1,81 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Object that represents a cursor comprised of sprites and colors for each state
+ ///
+ public class SpriteCursor : Cursor
+ {
+ [Serializable]
+ public struct SpriteCursorDatum
+ {
+ public string Name;
+ public CursorStateEnum CursorState;
+ public Sprite CursorSprite;
+ public Color CursorColor;
+ }
+
+ [SerializeField]
+ public SpriteCursorDatum[] CursorStateData;
+
+ ///
+ /// Sprite renderer to change. If null find one in children
+ ///
+ public SpriteRenderer TargetRenderer;
+
+ ///
+ /// On enable look for a sprite renderer on children
+ ///
+ protected override void OnEnable()
+ {
+ if(TargetRenderer == null)
+ {
+ TargetRenderer = GetComponentInChildren();
+ }
+
+ base.OnEnable();
+ }
+
+ ///
+ /// Override OnCursorState change to set the correct sprite
+ /// state for the cursor
+ ///
+ ///
+ public override void OnCursorStateChange(CursorStateEnum state)
+ {
+ base.OnCursorStateChange(state);
+
+ if (state != CursorStateEnum.Contextual)
+ {
+ for (int i = 0; i < CursorStateData.Length; i++)
+ {
+ if (CursorStateData[i].CursorState == state)
+ {
+ SetCursorState(CursorStateData[i]);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Based on the type of state info pass it through to the sprite renderer
+ ///
+ ///
+ private void SetCursorState(SpriteCursorDatum stateDatum)
+ {
+ // Return if we do not have an animator
+ if (TargetRenderer != null)
+ {
+ TargetRenderer.sprite = stateDatum.CursorSprite;
+ TargetRenderer.color = stateDatum.CursorColor;
+ }
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/SpriteCursor.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/SpriteCursor.cs.meta
new file mode 100644
index 0000000..b7cc6fb
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Cursor/SpriteCursor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: aca36d332a4c62a43b19ab4aa21d2248
+timeCreated: 1460564228
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor.meta
new file mode 100644
index 0000000..7ccfb4c
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 9230b89c8eef3f94f98f6cbee39b500f
+folderAsset: yes
+timeCreated: 1485458480
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor/EditorHandsMaterialInspector.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor/EditorHandsMaterialInspector.cs
new file mode 100644
index 0000000..11114a2
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor/EditorHandsMaterialInspector.cs
@@ -0,0 +1,15 @@
+using UnityEditor;
+
+public class EditorHandsMaterialInspector : ShaderGUI
+{
+ public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
+ {
+ foreach (MaterialProperty materialProperty in properties)
+ {
+ if (materialProperty.flags != MaterialProperty.PropFlags.PerRendererData)
+ {
+ materialEditor.ShaderProperty(materialProperty, materialProperty.displayName);
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor/EditorHandsMaterialInspector.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor/EditorHandsMaterialInspector.cs.meta
new file mode 100644
index 0000000..4599d59
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Editor/EditorHandsMaterialInspector.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b7cea557c59ff6e4992ef89d5e6a8091
+timeCreated: 1485458499
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/GameControllerManipulator.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/GameControllerManipulator.cs
new file mode 100644
index 0000000..2506d22
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/GameControllerManipulator.cs
@@ -0,0 +1,164 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Allows the user to place and rotate GameObjects using a game controller.
+ /// TODO This should be converted to an input source.
+ ///
+ /// Make sure to enable the HumanInterfaceDevice capability before using.
+ public class GameControllerManipulator : MonoBehaviour
+ {
+ [Tooltip("Name of the joystick axis that moves the object along X as set in InputManager")]
+ public string MoveXAxisName = "ControllerLeftStickX";
+ [Tooltip("Speed of movement along X")]
+ public float MoveXAxisSpeed = 0.2f;
+
+ [Tooltip("Name of the joystick axis that moves the object along Y as set in InputManager")]
+ public string MoveYAxisName = "ControllerLeftStickY";
+ [Tooltip("Speed of movement along Y")]
+ public float MoveYAxisSpeed = 0.2f;
+
+ [Tooltip("Name of the joystick axis that moves the object along Z as set in InputManager")]
+ public string MoveZAxisName = "ControllerTriggerAxis";
+ [Tooltip("Speed of movement along Z")]
+ public float MoveZAxisSpeed = 0.2f;
+
+ [Tooltip("Name of the button the user presses to move the object with gaze")]
+ public string MoveWithGazeButtonName = "Fire1";
+
+ [Tooltip("Name of the joystick axis that rotates around X as set in InputManager")]
+ public string RotateAroundXAxisName = "ControllerLeftStickY";
+ [Tooltip("Speed of rotation around X")]
+ public float RotateAroundXAxisSpeed = -1f;
+
+ [Tooltip("Name of the joystick axis that rotates around Y as set in InputManager")]
+ public string RotateAroundYAxisName = "ControllerLeftStickX";
+ [Tooltip("Speed of rotation around Y")]
+ public float RotateAroundYAxisSpeed = -1f;
+
+ [Tooltip("Name of the joystick axis that rotates around Z as set in InputManager")]
+ public string RotateAroundZAxisName = "";
+ [Tooltip("Speed of rotation around Z")]
+ public float RotateAroundZAxisSpeed = 1f;
+
+ [Tooltip("Name of the button used to enable rotation. Useful for single stick controllers")]
+ public string RotateModifierButtonName = "Fire2";
+
+ [Tooltip("Move the gaze target instead of the GameObject this script is attached to")]
+ public bool MoveGazeTarget = false;
+
+ private GameObject lastAffectedObject;
+ private float stickDistance = 0;
+
+ // Update is called once per frame
+ private void Update()
+ {
+ GameObject objectToManipulate;
+
+ if (!MoveGazeTarget)
+ {
+ objectToManipulate = gameObject;
+ }
+ else
+ {
+ objectToManipulate = lastAffectedObject ?? GazeManager.Instance.HitObject;
+ }
+
+ if (objectToManipulate == null)
+ {
+ return;
+ }
+
+ var cameraTransform = Camera.main.transform;
+
+ //Rotate
+ var noRotateModifier = string.IsNullOrEmpty(RotateModifierButtonName);
+ var enableRotate = noRotateModifier || Input.GetButton(RotateModifierButtonName);
+
+ float rz = 0;
+ float ry = 0;
+ float rx = 0;
+
+ if (enableRotate)
+ {
+ rz = RotateAroundAxis(objectToManipulate, RotateAroundZAxisName, cameraTransform.forward, RotateAroundZAxisSpeed);
+ ry = RotateAroundAxis(objectToManipulate, RotateAroundYAxisName, cameraTransform.up, RotateAroundYAxisSpeed);
+ rx = RotateAroundAxis(objectToManipulate, RotateAroundXAxisName, cameraTransform.right, RotateAroundXAxisSpeed);
+ }
+
+ //Move
+ bool usingSameAxisForRotateAndMove = RotateAroundYAxisName == MoveXAxisName ||
+ RotateAroundYAxisName == MoveZAxisName ||
+ RotateAroundZAxisName == MoveXAxisName ||
+ RotateAroundZAxisName == MoveYAxisName;
+
+ float x = 0;
+ float y = 0;
+
+ //only move if the movement axis has not been used for rotation
+ if (!(enableRotate && usingSameAxisForRotateAndMove))
+ {
+ x = Input.GetAxis(MoveXAxisName) * MoveXAxisSpeed * 60 * Time.deltaTime;
+ objectToManipulate.transform.RotateAround(cameraTransform.position, cameraTransform.up, x);
+
+ y = Input.GetAxis(MoveYAxisName) * MoveYAxisSpeed * 60 * Time.deltaTime;
+ objectToManipulate.transform.RotateAround(cameraTransform.position, cameraTransform.right, y);
+ }
+
+ var z = Input.GetAxis(MoveZAxisName) * MoveZAxisSpeed * 60 * Time.deltaTime;
+ objectToManipulate.transform.position += cameraTransform.forward*z*-0.03f;
+
+ var stickInFrontOfMe = Input.GetButton(MoveWithGazeButtonName);
+
+ if (stickInFrontOfMe)
+ {
+ if (stickDistance == 0)
+ {
+ stickDistance = (objectToManipulate.transform.position - cameraTransform.position).magnitude;
+ }
+
+ objectToManipulate.transform.position = cameraTransform.position + cameraTransform.forward * stickDistance;
+ }
+ else
+ {
+ stickDistance = 0;
+ }
+
+
+ if (stickInFrontOfMe || x != 0 || y != 0 || z != 0 || rz != 0 || ry != 0 || rx != 0)
+ {
+ lastAffectedObject = objectToManipulate;
+ }
+#if !UNITY_EDITOR
+ else
+ {
+ lastAffectedObject = null; //easier to test in Unity this way
+ }
+#endif
+ }
+
+ ///
+ /// Rotates the specified GameObject as dictated by joystick values and multipliers
+ ///
+ /// the gameObject to rotate
+ /// the name of the joystick axis
+ /// vector to rotate around
+ /// rotation speed
+ /// the amount of rotation applied
+ private float RotateAroundAxis(GameObject objectToRotate, string joyAxisName, Vector3 vectorToRotateAround, float speed)
+ {
+ if (string.IsNullOrEmpty(joyAxisName))
+ {
+ return 0;
+ }
+
+ var result = Input.GetAxis(joyAxisName) * speed * 60 * Time.deltaTime;
+ objectToRotate.transform.rotation = Quaternion.Euler(vectorToRotateAround * result) * objectToRotate.transform.rotation;
+ return result;
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/GameControllerManipulator.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/GameControllerManipulator.cs.meta
new file mode 100644
index 0000000..9b9eae5
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/GameControllerManipulator.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a4d43a912ea5ac9408a3e9d407d36b53
+timeCreated: 1472832956
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze.meta
new file mode 100644
index 0000000..cbfd1e6
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 1f494bd132b39f443afdf5e8ecf1edd2
+folderAsset: yes
+timeCreated: 1464209085
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/BaseRayStabilizer.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/BaseRayStabilizer.cs
new file mode 100644
index 0000000..bd3c785
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/BaseRayStabilizer.cs
@@ -0,0 +1,36 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// A base class for a stabilizer that takes an input position and orientation, and performs operations on them
+ /// to stabilize, or smooth deltas, in the data.
+ ///
+ public abstract class BaseRayStabilizer : MonoBehaviour
+ {
+ ///
+ /// The stabilized position.
+ ///
+ public abstract Vector3 StablePosition { get; }
+
+ ///
+ /// The stabilized rotation.
+ ///
+ public abstract Quaternion StableRotation { get; }
+
+ ///
+ /// A ray representing the stable position and orientation
+ ///
+ public abstract Ray StableRay { get; }
+
+ ///
+ /// Call this each frame to smooth out changes to a position and orientation.
+ ///
+ /// Input position to smooth.
+ /// Input orientation to smooth.
+ public abstract void UpdateStability(Vector3 position, Quaternion rotation);
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/BaseRayStabilizer.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/BaseRayStabilizer.cs.meta
new file mode 100644
index 0000000..27d5035
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/BaseRayStabilizer.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c60c270d8eeccb14f9368b571cb637aa
+timeCreated: 1470956080
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeManager.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeManager.cs
new file mode 100644
index 0000000..05abcd1
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeManager.cs
@@ -0,0 +1,377 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// The gaze manager manages everything related to a gaze ray that can interact with other objects.
+ ///
+ public class GazeManager : Singleton
+ {
+ public delegate void FocusedChangedDelegate(GameObject previousObject, GameObject newObject);
+
+ ///
+ /// Indicates whether the user is currently gazing at an object.
+ ///
+ public bool IsGazingAtObject { get; private set; }
+
+ ///
+ /// HitInfo property gives access to information at the object being gazed at, if any.
+ ///
+ public RaycastHit HitInfo { get { return hitInfo; } }
+ private RaycastHit hitInfo;
+
+ ///
+ /// The game object that is currently being gazed at, if any.
+ ///
+ public GameObject HitObject { get; private set; }
+
+ ///
+ /// Position at which the gaze manager hit an object.
+ /// If no object is currently being hit, this will use the last hit distance.
+ ///
+ public Vector3 HitPosition { get; private set; }
+
+ ///
+ /// Origin of the gaze.
+ ///
+ public Vector3 GazeOrigin { get; private set; }
+
+ ///
+ /// Normal of the gaze.
+ ///
+ public Vector3 GazeNormal { get; private set; }
+
+ ///
+ /// Maximum distance at which the gaze can collide with an object.
+ ///
+ public float MaxGazeCollisionDistance = 10.0f;
+
+ ///
+ /// The LayerMasks, in prioritized order, that are used to determine the HitObject when raycasting.
+ ///
+ /// Example Usage:
+ ///
+ /// // Allow the cursor to hit SR, but first prioritize any DefaultRaycastLayers (potentially behind SR)
+ ///
+ /// int sr = LayerMask.GetMask("SR");
+ /// int nonSR = Physics.DefaultRaycastLayers & ~sr;
+ /// GazeManager.Instance.RaycastLayerMasks = new LayerMask[] { nonSR, sr };
+ ///
+ [Tooltip("The LayerMasks, in prioritized order, that are used to determine the HitObject when raycasting.\n\nExample Usage:\n\n// Allow the cursor to hit SR, but first prioritize any DefaultRaycastLayers (potentially behind SR)\n\nint sr = LayerMask.GetMask(\"SR\");\nint nonSR = Physics.DefaultRaycastLayers & ~sr;\nGazeManager.Instance.RaycastLayerMasks = new LayerMask[] { nonSR, sr };")]
+ public LayerMask[] RaycastLayerMasks = new LayerMask[] { Physics.DefaultRaycastLayers };
+
+ ///
+ /// Current stabilization method, used to smooth out the gaze ray data.
+ /// If left null, no stabilization will be performed.
+ ///
+ [Tooltip("Stabilizer, if any, used to smooth out the gaze ray data.")]
+ public BaseRayStabilizer Stabilizer = null;
+
+ ///
+ /// Transform that should be used as the source of the gaze position and orientation.
+ /// Defaults to the main camera.
+ ///
+ [Tooltip("Transform that should be used to represent the gaze position and orientation. Defaults to Camera.Main")]
+ public Transform GazeTransform;
+
+ ///
+ /// Dispatched when focus shifts to a new object, or focus on current object
+ /// is lost.
+ ///
+ public event FocusedChangedDelegate FocusedObjectChanged;
+
+ private float lastHitDistance = 2.0f;
+
+ ///
+ /// Unity UI pointer event. This will be null if the EventSystem is not defined in the scene.
+ ///
+ public PointerEventData UnityUIPointerEvent { get; private set; }
+
+ ///
+ /// Cached results of racast results.
+ ///
+ private List raycastResultList = new List();
+
+ protected override void Awake()
+ {
+ base.Awake();
+
+ // Add default RaycastLayers as first layerPriority
+ if (RaycastLayerMasks == null || RaycastLayerMasks.Length == 0)
+ {
+ RaycastLayerMasks = new LayerMask[] { Physics.DefaultRaycastLayers };
+ }
+ }
+
+ private void Start()
+ {
+ if (GazeTransform == null)
+ {
+ if (Camera.main != null)
+ {
+ GazeTransform = Camera.main.transform;
+ }
+ else
+ {
+ Debug.LogError("Gaze Manager was not given a GazeTransform and no main camera exists to default to.");
+ }
+ }
+ }
+
+ private void Update()
+ {
+ if (GazeTransform == null)
+ {
+ return;
+ }
+
+ UpdateGazeInfo();
+
+ // Perform raycast to determine gazed object
+ GameObject previousFocusObject = RaycastPhysics();
+
+ // If we have a unity event system, perform graphics raycasts as well to support Unity UI interactions
+ if (EventSystem.current != null)
+ {
+ // NOTE: We need to do this AFTER we set the HitPosition and HitObject since we need to use HitPosition to perform the correct 2D UI Raycast.
+ RaycastUnityUI();
+ }
+
+ // Dispatch changed event if focus is different
+ if (previousFocusObject != HitObject && FocusedObjectChanged != null)
+ {
+ FocusedObjectChanged(previousFocusObject, HitObject);
+ }
+ }
+
+ ///
+ /// Updates the current gaze information, so that the gaze origin and normal are accurate.
+ ///
+ private void UpdateGazeInfo()
+ {
+ Vector3 newGazeOrigin = GazeTransform.position;
+ Vector3 newGazeNormal = GazeTransform.forward;
+
+ // Update gaze info from stabilizer
+ if (Stabilizer != null)
+ {
+ Stabilizer.UpdateStability(newGazeOrigin, GazeTransform.rotation);
+ newGazeOrigin = Stabilizer.StablePosition;
+ newGazeNormal = Stabilizer.StableRay.direction;
+ }
+
+ GazeOrigin = newGazeOrigin;
+ GazeNormal = newGazeNormal;
+ }
+
+ ///
+ /// Perform a Unity physics Raycast to determine which scene objects with a collider is currently being gazed at, if any.
+ ///
+ private GameObject RaycastPhysics()
+ {
+ GameObject previousFocusObject = HitObject;
+
+ // If there is only one priority, don't prioritize
+ if (RaycastLayerMasks.Length == 1)
+ {
+ IsGazingAtObject = Physics.Raycast(GazeOrigin, GazeNormal, out hitInfo, MaxGazeCollisionDistance, RaycastLayerMasks[0]);
+ }
+ else
+ {
+ // Raycast across all layers and prioritize
+ RaycastHit? hit = PrioritizeHits(Physics.RaycastAll(new Ray(GazeOrigin, GazeNormal), MaxGazeCollisionDistance, -1));
+
+ IsGazingAtObject = hit.HasValue;
+ if (IsGazingAtObject)
+ {
+ hitInfo = hit.Value;
+ }
+ }
+
+ if (IsGazingAtObject)
+ {
+ HitObject = HitInfo.collider.gameObject;
+ HitPosition = HitInfo.point;
+ lastHitDistance = HitInfo.distance;
+ }
+ else
+ {
+ HitObject = null;
+ HitPosition = GazeOrigin + (GazeNormal * lastHitDistance);
+ }
+ return previousFocusObject;
+ }
+
+ ///
+ /// Perform a Unity UI Raycast, compare with the latest 3D raycast, and overwrite the hit object info if the UI gets focus
+ ///
+ private void RaycastUnityUI()
+ {
+ if (UnityUIPointerEvent == null)
+ {
+ UnityUIPointerEvent = new PointerEventData(EventSystem.current);
+ }
+
+ // 2D cursor position
+ Vector2 cursorScreenPos = Camera.main.WorldToScreenPoint(HitPosition);
+ UnityUIPointerEvent.delta = cursorScreenPos - UnityUIPointerEvent.position;
+ UnityUIPointerEvent.position = cursorScreenPos;
+
+ // Graphics raycast
+ raycastResultList.Clear();
+ EventSystem.current.RaycastAll(UnityUIPointerEvent, raycastResultList);
+ RaycastResult uiRaycastResult = FindClosestRaycastHitInLayermasks(raycastResultList, RaycastLayerMasks);
+ UnityUIPointerEvent.pointerCurrentRaycast = uiRaycastResult;
+
+ // If we have a raycast result, check if we need to overwrite the 3D raycast info
+ if (uiRaycastResult.gameObject != null)
+ {
+ // Add the near clip distance since this is where the raycast is from
+ float uiRaycastDistance = uiRaycastResult.distance + Camera.main.nearClipPlane;
+
+ bool superseded3DObject = false;
+ if (IsGazingAtObject)
+ {
+ // Check layer prioritization
+ if (RaycastLayerMasks.Length > 1)
+ {
+ // Get the index in the prioritized layer masks
+ int uiLayerIndex = FindLayerListIndex(uiRaycastResult.gameObject.layer, RaycastLayerMasks);
+ int threeDLayerIndex = FindLayerListIndex(hitInfo.collider.gameObject.layer, RaycastLayerMasks);
+
+ if (threeDLayerIndex > uiLayerIndex)
+ {
+ superseded3DObject = true;
+ }
+ else if (threeDLayerIndex == uiLayerIndex)
+ {
+ if (hitInfo.distance > uiRaycastDistance)
+ {
+ superseded3DObject = true;
+ }
+ }
+ }
+ else
+ {
+ if (hitInfo.distance > uiRaycastDistance)
+ {
+ superseded3DObject = true;
+ }
+ }
+ }
+
+ // Check if we need to overwrite the 3D raycast info
+ if (!IsGazingAtObject || superseded3DObject)
+ {
+ IsGazingAtObject = true;
+ Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(uiRaycastResult.screenPosition.x, uiRaycastResult.screenPosition.y, uiRaycastDistance));
+ hitInfo = new RaycastHit()
+ {
+ distance = uiRaycastDistance,
+ normal = -Camera.main.transform.forward,
+ point = worldPos
+ };
+
+ HitObject = uiRaycastResult.gameObject;
+ HitPosition = HitInfo.point;
+ lastHitDistance = HitInfo.distance;
+ }
+ }
+ }
+
+ #region Helpers
+
+ ///
+ /// Find the closest raycast hit in the list of RaycastResults that is also included in the LayerMask list.
+ ///
+ /// List of RaycastResults from a Unity UI raycast
+ /// List of layers to support
+ /// RaycastResult if hit, or an empty RaycastResult if nothing was hit
+ private RaycastResult FindClosestRaycastHitInLayermasks(List candidates, LayerMask[] layerMaskList)
+ {
+ int combinedLayerMask = 0;
+ for (int i = 0; i < layerMaskList.Length; i++)
+ {
+ combinedLayerMask = combinedLayerMask | layerMaskList[i].value;
+ }
+
+ RaycastResult? minHit = null;
+ for (var i = 0; i < candidates.Count; ++i)
+ {
+ if (candidates[i].gameObject == null || !IsLayerInLayerMask(candidates[i].gameObject.layer, combinedLayerMask))
+ {
+ continue;
+ }
+ if (minHit == null || candidates[i].distance < minHit.Value.distance)
+ {
+ minHit = candidates[i];
+ }
+ }
+
+ return minHit ?? new RaycastResult();
+ }
+
+ ///
+ /// Look through the layerMaskList and find the index in that list for which the supplied layer is part of
+ ///
+ /// Layer to search for
+ /// List of LayerMasks to search
+ /// LayerMaskList index, or -1 for not found
+ private int FindLayerListIndex(int layer, LayerMask[] layerMaskList)
+ {
+ for (int i = 0; i < layerMaskList.Length; i++)
+ {
+ if (IsLayerInLayerMask(layer, layerMaskList[i].value))
+ {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ private bool IsLayerInLayerMask(int layer, int layerMask)
+ {
+ return ((1 << layer) & layerMask) != 0;
+ }
+
+ private RaycastHit? PrioritizeHits(RaycastHit[] hits)
+ {
+ if (hits.Length == 0)
+ {
+ return null;
+ }
+
+ // Return the minimum distance hit within the first layer that has hits.
+ // In other words, sort all hit objects first by layerMask, then by distance.
+ for (int layerMaskIdx = 0; layerMaskIdx < RaycastLayerMasks.Length; layerMaskIdx++)
+ {
+ RaycastHit? minHit = null;
+
+ for (int hitIdx = 0; hitIdx < hits.Length; hitIdx++)
+ {
+ RaycastHit hit = hits[hitIdx];
+ if (IsLayerInLayerMask(hit.transform.gameObject.layer, RaycastLayerMasks[layerMaskIdx]) &&
+ (minHit == null || hit.distance < minHit.Value.distance))
+ {
+ minHit = hit;
+ }
+ }
+
+ if (minHit != null)
+ {
+ return minHit;
+ }
+ }
+
+ return null;
+ }
+
+ #endregion Helpers
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeManager.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeManager.cs.meta
new file mode 100644
index 0000000..03a3e71
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeManager.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4d1a2a33ffcac354298137001635a001
+timeCreated: 1470956079
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeStabilizer.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeStabilizer.cs
new file mode 100644
index 0000000..89b47c0
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeStabilizer.cs
@@ -0,0 +1,115 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// GazeStabilizer iterates over samples of Raycast data and
+ /// helps stabilize the user's gaze for precision targeting.
+ ///
+ public class GazeStabilizer : BaseRayStabilizer
+ {
+ [Tooltip("Number of samples that you want to iterate on.")]
+ [Range(40, 120)]
+ public int StoredStabilitySamples = 60;
+
+ private Vector3 stablePosition;
+ public override Vector3 StablePosition
+ {
+ get { return stablePosition; }
+ }
+
+ private Quaternion stableRotation;
+ public override Quaternion StableRotation
+ {
+ get { return stableRotation; }
+ }
+
+ private Ray stableRay;
+ public override Ray StableRay
+ {
+ get { return stableRay; }
+ }
+
+ ///
+ /// Calculates standard deviation and averages for the gaze position.
+ ///
+ private readonly VectorRollingStatistics positionRollingStats = new VectorRollingStatistics();
+
+ ///
+ /// Calculates standard deviation and averages for the gaze direction.
+ ///
+ private readonly VectorRollingStatistics directionRollingStats = new VectorRollingStatistics();
+
+ ///
+ /// Tunable parameter.
+ /// If the standard deviation for the position is above this value, we reset and stop stabilizing.
+ ///
+ private const float PositionStandardDeviationReset = 0.2f;
+
+ ///
+ /// Tunable parameter.
+ /// If the standard deviation for the direction is above this value, we reset and stop stabilizing.
+ ///
+ private const float DirectionStandardDeviationReset = 0.1f;
+
+ ///
+ /// We must have at least this many samples with a standard deviation below the above constants to stabalize
+ ///
+ private const int MinimumSamplesRequiredToStabalize = 30;
+
+ ///
+ /// When not stabalizing this is the 'lerp' applied to the position and direction of the gaze to smooth it over time.
+ ///
+ private const float UnstabalizedLerpFactor = 0.3f;
+
+ ///
+ /// When stabalizing we will use the standard deviation of the position and direction to create the lerp value.
+ /// By default this value will be low and the cursor will be too sluggish, so we 'boost' it by this value.
+ ///
+ private const float StabalizedLerpBoost = 10.0f;
+
+ private void Awake()
+ {
+ directionRollingStats.Init(StoredStabilitySamples);
+ positionRollingStats.Init(StoredStabilitySamples);
+ }
+
+ ///
+ /// Updates the StablePosition and StableRotation based on GazeSample values.
+ /// Call this method with Raycasthit parameters to get stable values.
+ ///
+ /// Position value from a RaycastHit point.
+ /// Rotation value from a RaycastHit rotation.
+ public override void UpdateStability(Vector3 position, Quaternion rotation)
+ {
+ Vector3 gazePosition = position;
+ Vector3 gazeDirection = rotation * Vector3.forward;
+
+ positionRollingStats.AddSample(gazePosition);
+ directionRollingStats.AddSample(gazeDirection);
+
+ float lerpPower = UnstabalizedLerpFactor;
+ if (positionRollingStats.ActualSampleCount > MinimumSamplesRequiredToStabalize && // we have enough samples and...
+ (positionRollingStats.CurrentStandardDeviation > PositionStandardDeviationReset || // the standard deviation of positions is high or...
+ directionRollingStats.CurrentStandardDeviation > DirectionStandardDeviationReset)) // the standard deviation of directions is high
+ {
+ // We've detected that the user's gaze is no longer fixed, so stop stabalizing so that gaze is responsive.
+ //Debug.LogFormat("Reset {0} {1} {2} {3}", positionRollingStats.standardDeviation, positionRollingStats.standardDeviationsAway, directionRollignStats.standardDeviation, directionRollignStats.standardDeviationsAway);
+ positionRollingStats.Reset();
+ directionRollingStats.Reset();
+ }
+ else if (positionRollingStats.ActualSampleCount > MinimumSamplesRequiredToStabalize)
+ {
+ // We've detected that the user's gaze is fairly fixed, so start stabalizing. The more fixed the gaze the less the cursor will move.
+ lerpPower = StabalizedLerpBoost * (positionRollingStats.CurrentStandardDeviation + directionRollingStats.CurrentStandardDeviation);
+ }
+
+ stablePosition = Vector3.Lerp(stablePosition, gazePosition, lerpPower);
+ stableRotation = Quaternion.LookRotation(Vector3.Lerp(stableRotation * Vector3.forward, gazeDirection, lerpPower));
+ stableRay = new Ray(stablePosition, stableRotation * Vector3.forward);
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeStabilizer.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeStabilizer.cs.meta
new file mode 100644
index 0000000..d3d4b33
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Gaze/GazeStabilizer.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b81e3e700505863408cacaa0346cb1a6
+timeCreated: 1455735878
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/HandGuidance.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/HandGuidance.cs
new file mode 100644
index 0000000..b50b818
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/HandGuidance.cs
@@ -0,0 +1,169 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using UnityEngine.VR.WSA.Input;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Show a hand guidance indicator when the user's hand is close to leaving the camera's view.
+ ///
+ public class HandGuidance : Singleton
+ {
+ [Tooltip("The Cursor object the HandGuidanceIndicator will be positioned around.")]
+ public GameObject Cursor;
+
+ [Tooltip("GameObject to display when your hand is about to lose tracking.")]
+ public GameObject HandGuidanceIndicator;
+ private GameObject handGuidanceIndicatorGameObject = null;
+
+ // Hand source loss risk to start showing a hand indicator.
+ // As the source loss risk approaches 1, the hand is closer to being out of view.
+ [Range(0.0f, 1.0f)]
+ [Tooltip("When to start showing the Hand Guidance Indicator. 1 is out of view, 0 is centered in view.")]
+ public float HandGuidanceThreshold = 0.5f;
+
+ private Quaternion defaultHandGuidanceRotation;
+
+ private uint? currentlyTrackedHand = null;
+
+ protected override void Awake()
+ {
+ base.Awake();
+ if (HandGuidanceIndicator == null)
+ {
+ Debug.LogError("Please include a GameObject for the Hand Guidance Indicator.");
+ }
+
+ if (Cursor == null)
+ {
+ Debug.LogError("Please include a GameObject for the Cursor to display the indicator around.");
+ }
+
+ if (HandGuidanceIndicator != null)
+ {
+ // Cache the initial rotation of the HandGuidanceIndicator so future rotations
+ // can be done with respect to this orientation.
+ defaultHandGuidanceRotation = HandGuidanceIndicator.transform.rotation;
+ }
+
+ // Create an object in the scene for the guidance indicator and default it to not be visible.
+ handGuidanceIndicatorGameObject = Instantiate(HandGuidanceIndicator);
+ handGuidanceIndicatorGameObject.SetActive(false);
+
+ // Register for hand and finger events to know where your hand
+ // is being tracked and what state it is in.
+ InteractionManager.SourceLost += InteractionManager_SourceLost;
+ InteractionManager.SourceUpdated += InteractionManager_SourceUpdated;
+ InteractionManager.SourceReleased += InteractionManager_SourceReleased;
+ }
+
+ private void ShowHandGuidanceIndicator(InteractionSourceState hand)
+ {
+ if (!currentlyTrackedHand.HasValue)
+ {
+ return;
+ }
+
+ // Get the position and rotation of the hand guidance indicator and display the indicator object.
+ if (handGuidanceIndicatorGameObject != null)
+ {
+ Vector3 position;
+ Quaternion rotation;
+ GetIndicatorPositionAndRotation(hand, out position, out rotation);
+
+ handGuidanceIndicatorGameObject.transform.position = position;
+ handGuidanceIndicatorGameObject.transform.rotation = rotation * defaultHandGuidanceRotation;
+ handGuidanceIndicatorGameObject.SetActive(true);
+ }
+ }
+
+ private void HideHandGuidanceIndicator(InteractionSourceState hand)
+ {
+ if (!currentlyTrackedHand.HasValue)
+ {
+ return;
+ }
+
+ if (handGuidanceIndicatorGameObject != null)
+ {
+ handGuidanceIndicatorGameObject.SetActive(false);
+ }
+ }
+
+ private void GetIndicatorPositionAndRotation(InteractionSourceState hand, out Vector3 position, out Quaternion rotation)
+ {
+ // Update the distance from IndicatorParent based on the user's hand's distance from the center of the view.
+ // Bound this distance by this maxDistanceFromCenter field, in meters.
+ const float maxDistanceFromCenter = 0.3f;
+ float distanceFromCenter = (float)(hand.properties.sourceLossRisk * maxDistanceFromCenter);
+
+ // Subtract direction from origin so that the indicator is between the hand and the origin.
+ position = Cursor.transform.position - hand.properties.sourceLossMitigationDirection * distanceFromCenter;
+ rotation = Quaternion.LookRotation(Camera.main.transform.forward, hand.properties.sourceLossMitigationDirection);
+ }
+
+ private void InteractionManager_SourceUpdated(InteractionSourceState hand)
+ {
+ // Only display hand indicators when we are in a holding state, since hands going out of view will affect any active gestures.
+ if (!hand.pressed)
+ {
+ return;
+ }
+
+ // Only track a new hand if are not currently tracking a hand.
+ if (!currentlyTrackedHand.HasValue)
+ {
+ currentlyTrackedHand = hand.source.id;
+ }
+ else if (currentlyTrackedHand.Value != hand.source.id)
+ {
+ // This hand is not the currently tracked hand, do not drawn a guidance indicator for this hand.
+ return;
+ }
+
+ // Start showing an indicator to move your hand toward the center of the view.
+ if (hand.properties.sourceLossRisk > HandGuidanceThreshold)
+ {
+ ShowHandGuidanceIndicator(hand);
+ }
+ else
+ {
+ HideHandGuidanceIndicator(hand);
+ }
+ }
+
+ private void InteractionManager_SourceReleased(InteractionSourceState hand)
+ {
+ // Stop displaying the guidance indicator when the user releases their finger from the pressed state.
+ RemoveTrackedHand(hand);
+ }
+
+ private void InteractionManager_SourceLost(InteractionSourceState hand)
+ {
+ // Stop displaying the guidance indicator when the user's hand leaves the view.
+ RemoveTrackedHand(hand);
+ }
+
+ private void RemoveTrackedHand(InteractionSourceState hand)
+ {
+ // Only remove a hand if we are currently tracking a hand, and the hand to remove matches this tracked hand.
+ if (currentlyTrackedHand.HasValue && currentlyTrackedHand.Value == hand.source.id)
+ {
+ // Remove a hand by hiding the guidance indicator and nulling out the currentlyTrackedHand field.
+ handGuidanceIndicatorGameObject.SetActive(false);
+ currentlyTrackedHand = null;
+ }
+ }
+
+ protected override void OnDestroy()
+ {
+ InteractionManager.SourceLost -= InteractionManager_SourceLost;
+ InteractionManager.SourceUpdated -= InteractionManager_SourceUpdated;
+ InteractionManager.SourceReleased -= InteractionManager_SourceReleased;
+
+ base.OnDestroy();
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/HandGuidance.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/HandGuidance.cs.meta
new file mode 100644
index 0000000..0a8498c
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/HandGuidance.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2ac869b7c13e5a542b695b17a48d0375
+timeCreated: 1455735877
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents.meta
new file mode 100644
index 0000000..38f4fca
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 9660420db2c085246ad4af96397bd31c
+folderAsset: yes
+timeCreated: 1470933856
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/BaseInputEventData.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/BaseInputEventData.cs
new file mode 100644
index 0000000..ebc5924
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/BaseInputEventData.cs
@@ -0,0 +1,34 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Base class of all input events.
+ ///
+ public abstract class BaseInputEventData : BaseEventData
+ {
+ ///
+ /// The source the input event originates from.
+ ///
+ public IInputSource InputSource { get; private set; }
+
+ ///
+ /// The id of the source the event is from, for instance the hand id.
+ ///
+ public uint SourceId { get; private set; }
+
+ public BaseInputEventData(EventSystem eventSystem) : base(eventSystem)
+ {
+ }
+
+ protected virtual void BaseInitialize(IInputSource inputSource, uint sourceId)
+ {
+ Reset();
+ InputSource = inputSource;
+ SourceId = sourceId;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/BaseInputEventData.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/BaseInputEventData.cs.meta
new file mode 100644
index 0000000..bf64659
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/BaseInputEventData.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 57bc52a903dabb343acd31f45390b885
+timeCreated: 1471031854
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/HoldEventData.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/HoldEventData.cs
new file mode 100644
index 0000000..7eb7259
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/HoldEventData.cs
@@ -0,0 +1,22 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Event dispatched when a hold gesture is detected.
+ ///
+ public class HoldEventData : BaseInputEventData
+ {
+ public HoldEventData(EventSystem eventSystem) : base(eventSystem)
+ {
+ }
+
+ public void Initialize(IInputSource inputSource, uint sourceId)
+ {
+ BaseInitialize(inputSource, sourceId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/HoldEventData.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/HoldEventData.cs.meta
new file mode 100644
index 0000000..2fde96c
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/HoldEventData.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 02ef53b3a93625840aa0bdadd41119c4
+timeCreated: 1471039769
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IFocusable.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IFocusable.cs
new file mode 100644
index 0000000..5f17d5a
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IFocusable.cs
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Interface to implement to react to focus enter/exit.
+ ///
+ public interface IFocusable : IEventSystemHandler
+ {
+ void OnFocusEnter();
+ void OnFocusExit();
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IFocusable.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IFocusable.cs.meta
new file mode 100644
index 0000000..7d454ee
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IFocusable.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a780ad3b7aa945548a27f98be252d2f0
+timeCreated: 1470934749
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IHoldHandler.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IHoldHandler.cs
new file mode 100644
index 0000000..e746217
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IHoldHandler.cs
@@ -0,0 +1,17 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Interface to implement to react to hold gestures.
+ ///
+ public interface IHoldHandler : IEventSystemHandler
+ {
+ void OnHoldStarted(HoldEventData eventData);
+ void OnHoldCompleted(HoldEventData eventData);
+ void OnHoldCanceled(HoldEventData eventData);
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IHoldHandler.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IHoldHandler.cs.meta
new file mode 100644
index 0000000..7b1bba4
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IHoldHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 19bbf18da0424824c80f866d003d3c2d
+timeCreated: 1470938330
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputClickHandler.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputClickHandler.cs
new file mode 100644
index 0000000..e562793
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputClickHandler.cs
@@ -0,0 +1,15 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Interface to implement to react to simple click input.
+ ///
+ public interface IInputClickHandler : IEventSystemHandler
+ {
+ void OnInputClicked(InputClickedEventData eventData);
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputClickHandler.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputClickHandler.cs.meta
new file mode 100644
index 0000000..e2528b3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputClickHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b3af9ec35c2752747acc7943104003ac
+timeCreated: 1479259956
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputHandler.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputHandler.cs
new file mode 100644
index 0000000..9f69cdc
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputHandler.cs
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Interface to implement to react to simple pointer-like input.
+ ///
+ public interface IInputHandler : IEventSystemHandler
+ {
+ void OnInputUp(InputEventData eventData);
+ void OnInputDown(InputEventData eventData);
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputHandler.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputHandler.cs.meta
new file mode 100644
index 0000000..0067329
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IInputHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: aaeec22e4394fe84eb076f236e01b4f6
+timeCreated: 1470934749
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IManipulationHandler.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IManipulationHandler.cs
new file mode 100644
index 0000000..404ea18
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IManipulationHandler.cs
@@ -0,0 +1,18 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Interface to implement to react to manipulation gestures.
+ ///
+ public interface IManipulationHandler : IEventSystemHandler
+ {
+ void OnManipulationStarted(ManipulationEventData eventData);
+ void OnManipulationUpdated(ManipulationEventData eventData);
+ void OnManipulationCompleted(ManipulationEventData eventData);
+ void OnManipulationCanceled(ManipulationEventData eventData);
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IManipulationHandler.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IManipulationHandler.cs.meta
new file mode 100644
index 0000000..7435e9a
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/IManipulationHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 691df9a706b797e46b321614e4c8fcfc
+timeCreated: 1470938330
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/INavigationHandler.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/INavigationHandler.cs
new file mode 100644
index 0000000..d232906
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/INavigationHandler.cs
@@ -0,0 +1,18 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Interface to implement to react to navigation gestures.
+ ///
+ public interface INavigationHandler : IEventSystemHandler
+ {
+ void OnNavigationStarted(NavigationEventData eventData);
+ void OnNavigationUpdated(NavigationEventData eventData);
+ void OnNavigationCompleted(NavigationEventData eventData);
+ void OnNavigationCanceled(NavigationEventData eventData);
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/INavigationHandler.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/INavigationHandler.cs.meta
new file mode 100644
index 0000000..6ad160e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/INavigationHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 45118da20cb0d3d46b72b9fe0868f070
+timeCreated: 1470938330
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISourceStateHandler.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISourceStateHandler.cs
new file mode 100644
index 0000000..33be00e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISourceStateHandler.cs
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Interface to implement to react to source state changes, such as when an input source is detected or lost.
+ ///
+ public interface ISourceStateHandler : IEventSystemHandler
+ {
+ void OnSourceDetected(SourceStateEventData eventData);
+ void OnSourceLost(SourceStateEventData eventData);
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISourceStateHandler.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISourceStateHandler.cs.meta
new file mode 100644
index 0000000..6f830e5
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISourceStateHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1e18cc5955663234eac0b82dbb83df95
+timeCreated: 1474316412
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISpeechHandler.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISpeechHandler.cs
new file mode 100644
index 0000000..92dd535
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISpeechHandler.cs
@@ -0,0 +1,15 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Interface to implement to react to speech recognition.
+ ///
+ public interface ISpeechHandler : IEventSystemHandler
+ {
+ void OnSpeechKeywordRecognized(SpeechKeywordRecognizedEventData eventData);
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISpeechHandler.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISpeechHandler.cs.meta
new file mode 100644
index 0000000..a7d315f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ISpeechHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f62517ad59638754bad3b2a5d71a06b4
+timeCreated: 1479913151
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputClickedEventData.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputClickedEventData.cs
new file mode 100644
index 0000000..30d855d
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputClickedEventData.cs
@@ -0,0 +1,29 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Describes an input event that involves a tap.
+ ///
+ public class InputClickedEventData : InputEventData
+ {
+ ///
+ /// Number of taps that triggered the event.
+ ///
+ public int TapCount { get; private set; }
+
+ public InputClickedEventData(EventSystem eventSystem) : base(eventSystem)
+ {
+ }
+
+ public void Initialize(IInputSource inputSource, uint sourceId, int tapCount)
+ {
+ BaseInitialize(inputSource, sourceId);
+ TapCount = tapCount;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputClickedEventData.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputClickedEventData.cs.meta
new file mode 100644
index 0000000..4e36eb2
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputClickedEventData.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b304d3268ca1ec74aa0fd59559e3d8cb
+timeCreated: 1482758406
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputEventData.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputEventData.cs
new file mode 100644
index 0000000..77ec266
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputEventData.cs
@@ -0,0 +1,22 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Describes an input event that has a source id.
+ ///
+ public class InputEventData : BaseInputEventData
+ {
+ public InputEventData(EventSystem eventSystem) : base(eventSystem)
+ {
+ }
+
+ public void Initialize(IInputSource inputSource, uint sourceId)
+ {
+ BaseInitialize(inputSource, sourceId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputEventData.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputEventData.cs.meta
new file mode 100644
index 0000000..52419b2
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/InputEventData.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d19e27fb7c95c9149a31eef0146eda5f
+timeCreated: 1471025790
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ManipulationEventData.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ManipulationEventData.cs
new file mode 100644
index 0000000..5a2d70a
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ManipulationEventData.cs
@@ -0,0 +1,30 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Describes an input event that involves content manipulation.
+ ///
+ public class ManipulationEventData : InputEventData
+ {
+ ///
+ /// The amount of manipulation that has occurred. Usually in the form of
+ /// delta position of a hand.
+ ///
+ public Vector3 CumulativeDelta { get; private set; }
+
+ public ManipulationEventData(EventSystem eventSystem) : base(eventSystem)
+ {
+ }
+
+ public void Initialize(IInputSource inputSource, uint sourceId, Vector3 cumulativeDelta)
+ {
+ BaseInitialize(inputSource, sourceId);
+ CumulativeDelta = cumulativeDelta;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ManipulationEventData.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ManipulationEventData.cs.meta
new file mode 100644
index 0000000..5c57d98
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/ManipulationEventData.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6da69ac160e563c43a9e481a14a381c2
+timeCreated: 1471039770
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/NavigationEventData.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/NavigationEventData.cs
new file mode 100644
index 0000000..5036936
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/NavigationEventData.cs
@@ -0,0 +1,30 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Describes an input event that involves content navigation.
+ ///
+ public class NavigationEventData : InputEventData
+ {
+ ///
+ /// The amount of manipulation that has occurred. Usually in the form of
+ /// delta position of a hand.
+ ///
+ public Vector3 CumulativeDelta { get; private set; }
+
+ public NavigationEventData(EventSystem eventSystem) : base(eventSystem)
+ {
+ }
+
+ public void Initialize(IInputSource inputSource, uint sourceId, Vector3 cumulativeDelta)
+ {
+ BaseInitialize(inputSource, sourceId);
+ CumulativeDelta = cumulativeDelta;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/NavigationEventData.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/NavigationEventData.cs.meta
new file mode 100644
index 0000000..400b434
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/NavigationEventData.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 36553f0bb12305447b639cf2d682cf1b
+timeCreated: 1471039770
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SourceStateEventData.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SourceStateEventData.cs
new file mode 100644
index 0000000..78a7e90
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SourceStateEventData.cs
@@ -0,0 +1,22 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Describes an source state event that has a source id.
+ ///
+ public class SourceStateEventData : BaseInputEventData
+ {
+ public SourceStateEventData(EventSystem eventSystem) : base(eventSystem)
+ {
+ }
+
+ public void Initialize(IInputSource inputSource, uint sourceId)
+ {
+ BaseInitialize(inputSource, sourceId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SourceStateEventData.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SourceStateEventData.cs.meta
new file mode 100644
index 0000000..4efab90
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SourceStateEventData.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 8b34d86fb1285344f9f865590a0e7fa3
+timeCreated: 1474316498
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SpeechKeywordRecognizedEventData.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SpeechKeywordRecognizedEventData.cs
new file mode 100644
index 0000000..0d05338
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SpeechKeywordRecognizedEventData.cs
@@ -0,0 +1,55 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+using UnityEngine.EventSystems;
+using UnityEngine.Windows.Speech;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Describes an input event that involves keyword recognition.
+ ///
+ public class SpeechKeywordRecognizedEventData : InputEventData
+ {
+ ///
+ /// A measure of correct recognition certainty.
+ ///
+ public ConfidenceLevel Confidence { get; private set; }
+
+ ///
+ /// The time it took for the phrase to be uttered.
+ ///
+ public TimeSpan PhraseDuration { get; private set; }
+
+ ///
+ /// The moment in time when uttering of the phrase began.
+ ///
+ public DateTime PhraseStartTime { get; private set; }
+
+ ///
+ /// A semantic meaning of recognized phrase.
+ ///
+ public SemanticMeaning[] SemanticMeanings { get; private set; }
+
+ ///
+ /// The text that was recognized.
+ ///
+ public string RecognizedText { get; private set; }
+
+ public SpeechKeywordRecognizedEventData(EventSystem eventSystem) : base(eventSystem)
+ {
+ }
+
+ public void Initialize(IInputSource inputSource, uint sourceId, ConfidenceLevel confidence, TimeSpan phraseDuration, DateTime phraseStartTime, SemanticMeaning[] semanticMeanings, string recognizedText)
+ {
+ BaseInitialize(inputSource, sourceId);
+ Confidence = confidence;
+ PhraseDuration = phraseDuration;
+ PhraseStartTime = phraseStartTime;
+ SemanticMeanings = semanticMeanings;
+ RecognizedText = recognizedText;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SpeechKeywordRecognizedEventData.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SpeechKeywordRecognizedEventData.cs.meta
new file mode 100644
index 0000000..09e4b3a
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputEvents/SpeechKeywordRecognizedEventData.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: fad9c3efdd73ec143ba39215c09207a2
+timeCreated: 1479913151
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputManager.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputManager.cs
new file mode 100644
index 0000000..50c3eb2
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputManager.cs
@@ -0,0 +1,619 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Input Manager is responsible for managing input sources and dispatching relevant events
+ /// to the appropriate input handlers.
+ ///
+ public class InputManager : Singleton
+ {
+ ///
+ /// To tap on a hologram even when not focused on,
+ /// set OverrideFocusedObject to desired game object.
+ /// If it's null, then focused object will be used.
+ ///
+ public GameObject OverrideFocusedObject { get; set; }
+
+ public event Action InputEnabled;
+ public event Action InputDisabled;
+
+ private readonly Stack modalInputStack = new Stack();
+ private readonly Stack fallbackInputStack = new Stack();
+
+ ///
+ /// Global listeners listen to all events and ignore the fact that other components might have consumed them.
+ ///
+ private readonly List globalListeners = new List();
+
+ private bool isRegisteredToGazeChanges;
+ private int disabledRefCount;
+
+ private InputEventData inputEventData;
+ private InputClickedEventData sourceClickedEventData;
+ private SourceStateEventData sourceStateEventData;
+ private ManipulationEventData manipulationEventData;
+ private HoldEventData holdEventData;
+ private NavigationEventData navigationEventData;
+
+ ///
+ /// Indicates if input is currently enabled or not.
+ ///
+ public bool IsInputEnabled
+ {
+ get { return disabledRefCount <= 0; }
+ }
+
+ ///
+ /// Should the Unity UI events be fired?
+ ///
+ public bool ShouldSendUnityUiEvents { get { return GazeManager.Instance.UnityUIPointerEvent != null && EventSystem.current != null; } }
+
+ ///
+ /// Push a game object into the modal input stack. Any input handlers
+ /// on the game object are given priority to input events before any focused objects.
+ ///
+ /// The input handler to push
+ public void PushModalInputHandler(GameObject inputHandler)
+ {
+ modalInputStack.Push(inputHandler);
+ }
+
+ ///
+ /// Remove the last game object from the modal input stack.
+ ///
+ public void PopModalInputHandler()
+ {
+ modalInputStack.Pop();
+ }
+
+ ///
+ /// Clear all modal input handlers off the stack.
+ ///
+ public void ClearModalInputStack()
+ {
+ modalInputStack.Clear();
+ }
+
+ ///
+ /// Adds a global listener that will receive all input events, regardless
+ /// of which other game objects might have handled the event beforehand.
+ ///
+ /// Listener to add.
+ public void AddGlobalListener(GameObject listener)
+ {
+ globalListeners.Add(listener);
+ }
+
+ ///
+ /// Removes a global listener.
+ ///
+ /// Listener to remove.
+ public void RemoveGlobalListener(GameObject listener)
+ {
+ globalListeners.Remove(listener);
+ }
+
+ ///
+ /// Push a game object into the fallback input stack. Any input handlers on
+ /// the game object are given input events when no modal or focused objects consume the event.
+ ///
+ /// The input handler to push
+ public void PushFallbackInputHandler(GameObject inputHandler)
+ {
+ fallbackInputStack.Push(inputHandler);
+ }
+
+ ///
+ /// Remove the last game object from the fallback input stack.
+ ///
+ public void PopFallbackInputHandler()
+ {
+ fallbackInputStack.Pop();
+ }
+
+ ///
+ /// Clear all fallback input handlers off the stack.
+ ///
+ public void ClearFallbackInputStack()
+ {
+ fallbackInputStack.Clear();
+ }
+
+ ///
+ /// Push a disabled input state onto the input manager.
+ /// While input is disabled no events will be sent out and the cursor displays
+ /// a waiting animation.
+ ///
+ public void PushInputDisable()
+ {
+ ++disabledRefCount;
+
+ if (disabledRefCount == 1)
+ {
+ InputDisabled.RaiseEvent();
+ }
+ }
+
+ ///
+ /// Pop disabled input state. When the last disabled state is
+ /// popped off the stack input will be re-enabled.
+ ///
+ public void PopInputDisable()
+ {
+ --disabledRefCount;
+ Debug.Assert(disabledRefCount >= 0, "Tried to pop more input disable than the amount pushed.");
+
+ if (disabledRefCount == 0)
+ {
+ InputEnabled.RaiseEvent();
+ }
+ }
+
+ ///
+ /// Clear the input disable stack, which will immediately re-enable input.
+ ///
+ public void ClearInputDisableStack()
+ {
+ bool wasInputDisabled = disabledRefCount > 0;
+ disabledRefCount = 0;
+
+ if (wasInputDisabled)
+ {
+ InputEnabled.RaiseEvent();
+ }
+ }
+
+ private void Start()
+ {
+ InitializeEventDatas();
+
+ if (GazeManager.Instance == null)
+ {
+ Debug.LogError("InputManager requires an active GazeManager in the scene");
+ }
+
+ RegisterGazeManager();
+ }
+
+ private void InitializeEventDatas()
+ {
+ inputEventData = new InputEventData(EventSystem.current);
+ sourceClickedEventData = new InputClickedEventData(EventSystem.current);
+ sourceStateEventData = new SourceStateEventData(EventSystem.current);
+ manipulationEventData = new ManipulationEventData(EventSystem.current);
+ navigationEventData = new NavigationEventData(EventSystem.current);
+ holdEventData = new HoldEventData(EventSystem.current);
+ }
+
+ protected override void OnDestroy()
+ {
+ UnregisterGazeManager();
+ }
+
+ private void OnEnable()
+ {
+ RegisterGazeManager();
+ }
+
+ private void OnDisable()
+ {
+ UnregisterGazeManager();
+ }
+
+ public void HandleEvent(BaseEventData eventData, ExecuteEvents.EventFunction eventHandler)
+ where T : IEventSystemHandler
+ {
+ if (!enabled || disabledRefCount > 0)
+ {
+ return;
+ }
+
+ // Use focused object when OverrideFocusedObject is null.
+ GameObject focusedObject = (OverrideFocusedObject == null) ? GazeManager.Instance.HitObject : OverrideFocusedObject;
+
+ // Send the event to global listeners
+ for (int i = 0; i < globalListeners.Count; i++)
+ {
+ // Global listeners should only get events on themselves, as opposed to their hierarchy
+ ExecuteEvents.Execute(globalListeners[i], eventData, eventHandler);
+ }
+
+ // Handle modal input if one exists
+ if (modalInputStack.Count > 0)
+ {
+ GameObject modalInput = modalInputStack.Peek();
+
+ // If there is a focused object in the hierarchy of the modal handler, start the event
+ // bubble there
+ if (focusedObject != null && focusedObject.transform.IsChildOf(modalInput.transform))
+ {
+
+ if (ExecuteEvents.ExecuteHierarchy(focusedObject, eventData, eventHandler))
+ {
+ return;
+ }
+ }
+ // Otherwise, just invoke the event on the modal handler itself
+ else
+ {
+ if (ExecuteEvents.ExecuteHierarchy(modalInput, eventData, eventHandler))
+ {
+ return;
+ }
+ }
+ }
+
+ // If event was not handled by modal, pass it on to the current focused object
+ if (focusedObject != null)
+ {
+ bool eventHandled = ExecuteEvents.ExecuteHierarchy(focusedObject, eventData, eventHandler);
+ if (eventHandled)
+ {
+ return;
+ }
+ }
+
+ // If event was not handled by the focused object, pass it on to any fallback handlers
+ if (fallbackInputStack.Count > 0)
+ {
+ GameObject fallbackInput = fallbackInputStack.Peek();
+ ExecuteEvents.ExecuteHierarchy(fallbackInput, eventData, eventHandler);
+ }
+ }
+
+ ///
+ /// Register to gaze manager events.
+ ///
+ private void RegisterGazeManager()
+ {
+ if (!isRegisteredToGazeChanges && GazeManager.Instance != null)
+ {
+ GazeManager.Instance.FocusedObjectChanged += GazeManager_FocusedChanged;
+ isRegisteredToGazeChanges = true;
+ }
+ }
+
+ ///
+ /// Unregister from gaze manager events.
+ ///
+ private void UnregisterGazeManager()
+ {
+ if (isRegisteredToGazeChanges && GazeManager.Instance != null)
+ {
+ GazeManager.Instance.FocusedObjectChanged -= GazeManager_FocusedChanged;
+ isRegisteredToGazeChanges = false;
+ }
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnFocusEnterEventHandler =
+ delegate (IFocusable handler, BaseEventData eventData)
+ {
+ handler.OnFocusEnter();
+ };
+
+ private static readonly ExecuteEvents.EventFunction OnFocusExitEventHandler =
+ delegate (IFocusable handler, BaseEventData eventData)
+ {
+ handler.OnFocusExit();
+ };
+
+ private void GazeManager_FocusedChanged(GameObject previousObject, GameObject newObject)
+ {
+ if (disabledRefCount > 0)
+ {
+ return;
+ }
+
+ if (previousObject != null)
+ {
+ ExecuteEvents.ExecuteHierarchy(previousObject, null, OnFocusExitEventHandler);
+ if (ShouldSendUnityUiEvents)
+ {
+ ExecuteEvents.ExecuteHierarchy(previousObject, GazeManager.Instance.UnityUIPointerEvent, ExecuteEvents.pointerExitHandler);
+ }
+ }
+
+ if (newObject != null)
+ {
+ ExecuteEvents.ExecuteHierarchy(newObject, null, OnFocusEnterEventHandler);
+ if (ShouldSendUnityUiEvents)
+ {
+ ExecuteEvents.ExecuteHierarchy(newObject, GazeManager.Instance.UnityUIPointerEvent, ExecuteEvents.pointerEnterHandler);
+ }
+ }
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnInputClickedEventHandler =
+ delegate (IInputClickHandler handler, BaseEventData eventData)
+ {
+ InputClickedEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnInputClicked(casted);
+ };
+
+ public void RaiseInputClicked(IInputSource source, uint sourceId, int tapCount)
+ {
+ // Create input event
+ sourceClickedEventData.Initialize(source, sourceId, tapCount);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(sourceClickedEventData, OnInputClickedEventHandler);
+
+ // UI events
+ if (ShouldSendUnityUiEvents)
+ {
+ PointerEventData unityUIPointerEvent = GazeManager.Instance.UnityUIPointerEvent;
+ HandleEvent(unityUIPointerEvent, ExecuteEvents.pointerClickHandler);
+ }
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnSourceUpEventHandler =
+ delegate (IInputHandler handler, BaseEventData eventData)
+ {
+ InputEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnInputUp(casted);
+ };
+
+ public void RaiseSourceUp(IInputSource source, uint sourceId)
+ {
+ // Create input event
+ inputEventData.Initialize(source, sourceId);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(inputEventData, OnSourceUpEventHandler);
+
+ // UI events
+ if (ShouldSendUnityUiEvents)
+ {
+ PointerEventData unityUIPointerEvent = GazeManager.Instance.UnityUIPointerEvent;
+ HandleEvent(unityUIPointerEvent, ExecuteEvents.pointerUpHandler);
+ }
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnSourceDownEventHandler =
+ delegate (IInputHandler handler, BaseEventData eventData)
+ {
+ InputEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnInputDown(casted);
+ };
+
+ public void RaiseSourceDown(IInputSource source, uint sourceId)
+ {
+ // Create input event
+ inputEventData.Initialize(source, sourceId);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(inputEventData, OnSourceDownEventHandler);
+
+ // UI events
+ if (ShouldSendUnityUiEvents)
+ {
+ PointerEventData unityUiPointerEvent = GazeManager.Instance.UnityUIPointerEvent;
+
+ unityUiPointerEvent.eligibleForClick = true;
+ unityUiPointerEvent.delta = Vector2.zero;
+ unityUiPointerEvent.dragging = false;
+ unityUiPointerEvent.useDragThreshold = true;
+ unityUiPointerEvent.pressPosition = unityUiPointerEvent.position;
+ unityUiPointerEvent.pointerPressRaycast = unityUiPointerEvent.pointerCurrentRaycast;
+
+ HandleEvent(unityUiPointerEvent, ExecuteEvents.pointerDownHandler);
+ }
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnSourceDetectedEventHandler =
+ delegate (ISourceStateHandler handler, BaseEventData eventData)
+ {
+ SourceStateEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnSourceDetected(casted);
+ };
+
+ public void RaiseSourceDetected(IInputSource source, uint sourceId)
+ {
+ // Create input event
+ sourceStateEventData.Initialize(source, sourceId);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(sourceStateEventData, OnSourceDetectedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnSourceLostEventHandler =
+ delegate (ISourceStateHandler handler, BaseEventData eventData)
+ {
+ SourceStateEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnSourceLost(casted);
+ };
+
+ public void RaiseSourceLost(IInputSource source, uint sourceId)
+ {
+ // Create input event
+ sourceStateEventData.Initialize(source, sourceId);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(sourceStateEventData, OnSourceLostEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnManipulationStartedEventHandler =
+ delegate (IManipulationHandler handler, BaseEventData eventData)
+ {
+ ManipulationEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnManipulationStarted(casted);
+ };
+
+ public void RaiseManipulationStarted(IInputSource source, uint sourceId, Vector3 cumulativeDelta)
+ {
+ // Create input event
+ manipulationEventData.Initialize(source, sourceId, cumulativeDelta);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(manipulationEventData, OnManipulationStartedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnManipulationUpdatedEventHandler =
+ delegate (IManipulationHandler handler, BaseEventData eventData)
+ {
+ ManipulationEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnManipulationUpdated(casted);
+ };
+
+ public void RaiseManipulationUpdated(IInputSource source, uint sourceId, Vector3 cumulativeDelta)
+ {
+ // Create input event
+ manipulationEventData.Initialize(source, sourceId, cumulativeDelta);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(manipulationEventData, OnManipulationUpdatedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnManipulationCompletedEventHandler =
+ delegate (IManipulationHandler handler, BaseEventData eventData)
+ {
+ ManipulationEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnManipulationCompleted(casted);
+ };
+
+ public void RaiseManipulationCompleted(IInputSource source, uint sourceId, Vector3 cumulativeDelta)
+ {
+ // Create input event
+ manipulationEventData.Initialize(source, sourceId, cumulativeDelta);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(manipulationEventData, OnManipulationCompletedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnManipulationCanceledEventHandler =
+ delegate (IManipulationHandler handler, BaseEventData eventData)
+ {
+ ManipulationEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnManipulationCanceled(casted);
+ };
+
+ public void RaiseManipulationCanceled(IInputSource source, uint sourceId, Vector3 cumulativeDelta)
+ {
+ // Create input event
+ manipulationEventData.Initialize(source, sourceId, cumulativeDelta);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(manipulationEventData, OnManipulationCanceledEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnHoldStartedEventHandler =
+ delegate (IHoldHandler handler, BaseEventData eventData)
+ {
+ HoldEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnHoldStarted(casted);
+ };
+
+ public void RaiseHoldStarted(IInputSource source, uint sourceId)
+ {
+ // Create input event
+ holdEventData.Initialize(source, sourceId);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(holdEventData, OnHoldStartedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnHoldCompletedEventHandler =
+ delegate (IHoldHandler handler, BaseEventData eventData)
+ {
+ HoldEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnHoldCompleted(casted);
+ };
+
+ public void RaiseHoldCompleted(IInputSource source, uint sourceId)
+ {
+ // Create input event
+ holdEventData.Initialize(source, sourceId);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(holdEventData, OnHoldCompletedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnHoldCanceledEventHandler =
+ delegate (IHoldHandler handler, BaseEventData eventData)
+ {
+ HoldEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnHoldCanceled(casted);
+ };
+
+ public void RaiseHoldCanceled(IInputSource source, uint sourceId)
+ {
+ // Create input event
+ holdEventData.Initialize(source, sourceId);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(holdEventData, OnHoldCanceledEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnNavigationStartedEventHandler =
+ delegate (INavigationHandler handler, BaseEventData eventData)
+ {
+ NavigationEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnNavigationStarted(casted);
+ };
+
+ public void RaiseNavigationStarted(IInputSource source, uint sourceId, Vector3 normalizedOffset)
+ {
+ // Create input event
+ navigationEventData.Initialize(source, sourceId, normalizedOffset);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(navigationEventData, OnNavigationStartedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnNavigationUpdatedEventHandler =
+ delegate (INavigationHandler handler, BaseEventData eventData)
+ {
+ NavigationEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnNavigationUpdated(casted);
+ };
+
+ public void RaiseNavigationUpdated(IInputSource source, uint sourceId, Vector3 normalizedOffset)
+ {
+ // Create input event
+ navigationEventData.Initialize(source, sourceId, normalizedOffset);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(navigationEventData, OnNavigationUpdatedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnNavigationCompletedEventHandler =
+ delegate (INavigationHandler handler, BaseEventData eventData)
+ {
+ NavigationEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnNavigationCompleted(casted);
+ };
+
+ public void RaiseNavigationCompleted(IInputSource source, uint sourceId, Vector3 normalizedOffset)
+ {
+ // Create input event
+ navigationEventData.Initialize(source, sourceId, normalizedOffset);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(navigationEventData, OnNavigationCompletedEventHandler);
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnNavigationCanceledEventHandler =
+ delegate (INavigationHandler handler, BaseEventData eventData)
+ {
+ NavigationEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnNavigationCanceled(casted);
+ };
+
+ public void RaiseNavigationCanceled(IInputSource source, uint sourceId, Vector3 normalizedOffset)
+ {
+ // Create input event
+ navigationEventData.Initialize(source, sourceId, normalizedOffset);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ HandleEvent(navigationEventData, OnNavigationCanceledEventHandler);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputManager.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputManager.cs.meta
new file mode 100644
index 0000000..d334b9c
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputManager.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b160d197a8ca1894796ae263bafec0ac
+timeCreated: 1471025790
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources.meta
new file mode 100644
index 0000000..5ee319b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 625f902511dda214e988a85f9566d616
+folderAsset: yes
+timeCreated: 1470879308
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/BaseInputSource.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/BaseInputSource.cs
new file mode 100644
index 0000000..cb85fcc
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/BaseInputSource.cs
@@ -0,0 +1,32 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Base class for an input source.
+ ///
+ public abstract class BaseInputSource : MonoBehaviour, IInputSource
+ {
+ protected InputManager inputManager;
+
+ protected virtual void Start()
+ {
+ inputManager = InputManager.Instance;
+ }
+
+ public abstract SupportedInputInfo GetSupportedInputInfo(uint sourceId);
+
+ public bool SupportsInputInfo(uint sourceId, SupportedInputInfo inputInfo)
+ {
+ return (GetSupportedInputInfo(sourceId) & inputInfo) != 0;
+ }
+
+ public abstract bool TryGetPosition(uint sourceId, out Vector3 position);
+
+ public abstract bool TryGetOrientation(uint sourceId, out Quaternion orientation);
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/BaseInputSource.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/BaseInputSource.cs.meta
new file mode 100644
index 0000000..66ec2ba
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/BaseInputSource.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1a454c1fc56751649ab5a76175b205af
+timeCreated: 1471296253
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/EditorHandsInput.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/EditorHandsInput.cs
new file mode 100644
index 0000000..6a34e43
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/EditorHandsInput.cs
@@ -0,0 +1,410 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Input source for fake hands information, which gives finer details about current hand state and position
+ /// than the standard GestureRecognizer.
+ ///
+ /// This input source only triggers SourceUp and SourceDown for the hands. Everything else is handled by GesturesInput.
+ [RequireComponent(typeof(ManualHandControl))]
+ public class EditorHandsInput : BaseInputSource
+ {
+ ///
+ /// Data for a hand.
+ ///
+ private class EditorHandData
+ {
+ public EditorHandData(uint handId)
+ {
+ HandId = handId;
+ HandPosition = Vector3.zero;
+ HandDelta = Vector3.zero;
+ IsFingerDown = false;
+ IsFingerDownPending = false;
+ FingerStateChanged = false;
+ FingerStateUpdateTimer = -1;
+ ManipulationInProgress = false;
+ HoldInProgress = false;
+ CumulativeDelta = Vector3.zero;
+ }
+
+ public readonly uint HandId;
+ public Vector3 HandPosition;
+ public Vector3 HandDelta;
+ public bool IsFingerDown;
+ public bool IsFingerDownPending;
+ public bool FingerStateChanged;
+ public float FingerStateUpdateTimer;
+ public float FingerDownStartTime;
+ public bool ManipulationInProgress;
+ public bool HoldInProgress;
+ public Vector3 CumulativeDelta;
+ }
+
+ private ManualHandControl manualHandControl;
+
+ ///
+ /// Dispatched each frame that a hand is moving.
+ ///
+ public event Action HandMoved;
+
+ ///
+ /// Delay before a finger pressed is considered.
+ /// This mitigates fake finger taps that can sometimes be detected while the hand is moving.
+ ///
+ private const float FingerPressDelay = 0.07f;
+
+ ///
+ /// The maximum interval between button down and button up that will result in a clicked event.
+ ///
+ private const float MaxClickDuration = 0.5f;
+
+ ///
+ /// Number of fake hands supported in the editor.
+ ///
+ private const int EditorHandsCount = 2;
+
+ ///
+ /// Array containing the hands data for the two fake hands.
+ ///
+ private readonly EditorHandData[] editorHandsData = new EditorHandData[EditorHandsCount];
+
+ ///
+ /// Dictionary linking each hand ID to its data.
+ ///
+ private readonly Dictionary handIdToData = new Dictionary(4);
+ private readonly List pendingHandIdDeletes = new List();
+
+ // HashSets used to be able to quickly update the hands data when hands become visible / not visible.
+ private readonly HashSet currentHands = new HashSet();
+ private readonly HashSet newHands = new HashSet();
+
+ [SerializeField]
+ [Tooltip("The total amount of hand movement that needs to happen to signal intent to start a manipulation. This is a distance, but not a distance in any one direction.")]
+ private float manipulationStartMovementThreshold = 0.03f;
+
+ public override SupportedInputInfo GetSupportedInputInfo(uint sourceId)
+ {
+ return SupportedInputInfo.Position;
+ }
+
+ public override bool TryGetPosition(uint sourceId, out Vector3 position)
+ {
+ if (sourceId >= editorHandsData.Length)
+ {
+ position = Vector3.zero;
+ return false;
+ }
+
+ position = editorHandsData[sourceId].HandPosition;
+ return true;
+ }
+
+ public override bool TryGetOrientation(uint sourceId, out Quaternion orientation)
+ {
+ // Orientation is not supported by hands.
+ orientation = Quaternion.identity;
+ return false;
+ }
+
+ ///
+ /// Gets the position delta of the specified hand.
+ ///
+ /// ID of the hand to get.
+ /// The current movement vector of the specified hand.
+ public Vector3 GetHandDelta(uint handId)
+ {
+ if (handId >= editorHandsData.Length)
+ {
+ string message = string.Format("GetHandDelta called with invalid hand ID {0}.", handId.ToString());
+ throw new ArgumentException(message, "handId");
+ }
+
+ return editorHandsData[handId].HandDelta;
+ }
+
+ ///
+ /// Gets the pressed state of the specified hand.
+ ///
+ /// ID of the hand to get.
+ /// True if the specified hand is currently in an airtap.
+ public bool GetFingerState(uint handId)
+ {
+ if (handId >= editorHandsData.Length)
+ {
+ var message = string.Format("GetFingerState called with invalid hand ID {0}.", handId.ToString());
+ throw new ArgumentException(message, "handId");
+ }
+
+ return editorHandsData[handId].IsFingerDown;
+ }
+
+ ///
+ /// Gets whether the specified hand just started an airtap this frame.
+ ///
+ /// ID of the hand to get.
+ /// True for the first frame of an airtap
+ public bool GetFingerDown(uint handId)
+ {
+ if (handId >= editorHandsData.Length)
+ {
+ var message = string.Format("GetFingerDown called with invalid hand ID {0}.", handId.ToString());
+ throw new ArgumentException(message, "handId");
+ }
+
+ return editorHandsData[handId].IsFingerDown && editorHandsData[handId].FingerStateChanged;
+ }
+
+ ///
+ /// Gets whether the specified hand just ended an airtap this frame.
+ ///
+ /// ID of the hand to get.
+ /// True for the first frame of the release of an airtap
+ public bool GetFingerUp(uint handId)
+ {
+ if (handId >= editorHandsData.Length)
+ {
+ var message = string.Format("GetFingerUp called with invalid hand ID {0}.", handId.ToString());
+ throw new ArgumentException(message, "handId");
+ }
+
+ return !editorHandsData[handId].IsFingerDown && editorHandsData[handId].FingerStateChanged;
+ }
+
+ private void Awake()
+ {
+#if !UNITY_EDITOR
+ Destroy(this);
+#else
+ manualHandControl = GetComponent();
+ for (uint i = 0; i < editorHandsData.Length; i++)
+ {
+ editorHandsData[i] = new EditorHandData(i);
+ }
+#endif
+ }
+
+#if UNITY_EDITOR
+ private void Update()
+ {
+ newHands.Clear();
+ currentHands.Clear();
+
+ UpdateHandData();
+ SendHandVisibilityEvents();
+ }
+#endif
+
+ ///
+ /// Update the hand data for the currently detected hands.
+ ///
+ private void UpdateHandData()
+ {
+ float time;
+ float deltaTime;
+
+ if (manualHandControl.UseUnscaledTime)
+ {
+ time = Time.unscaledTime;
+ deltaTime = Time.unscaledDeltaTime;
+ }
+ else
+ {
+ time = Time.time;
+ deltaTime = Time.deltaTime;
+ }
+
+ if (manualHandControl.LeftHandInView)
+ {
+ GetOrAddHandData(0);
+ currentHands.Add(0);
+
+ UpdateHandState(manualHandControl.LeftHandSourceState, editorHandsData[0], deltaTime, time);
+ }
+
+ if (manualHandControl.RightHandInView)
+ {
+ GetOrAddHandData(1);
+ currentHands.Add(1);
+ UpdateHandState(manualHandControl.RightHandSourceState, editorHandsData[1], deltaTime, time);
+ }
+ }
+
+ ///
+ /// Gets the hand data for the specified hand source if it already exists, otherwise creates it.
+ ///
+ /// Hand source for which hands data should be retrieved.
+ /// The hand data requested.
+ private EditorHandData GetOrAddHandData(uint sourceId)
+ {
+ EditorHandData handData;
+ if (!handIdToData.TryGetValue(sourceId, out handData))
+ {
+ handData = new EditorHandData(sourceId);
+ handIdToData.Add(handData.HandId, handData);
+ newHands.Add(handData.HandId);
+ }
+
+ return handData;
+ }
+
+ ///
+ /// Updates the hand positional information.
+ ///
+ /// Hand source to use to update the position.
+ /// EditorHandData structure to update.
+ /// Unscaled delta time of last event.
+ /// Unscaled time of last event.
+ private void UpdateHandState(DebugInteractionSourceState handSource, EditorHandData editorHandData, float deltaTime, float time)
+ {
+ // Update hand position.
+ Vector3 handPosition;
+ if (handSource.Properties.Location.TryGetPosition(out handPosition))
+ {
+ editorHandData.HandDelta = handPosition - editorHandData.HandPosition;
+ editorHandData.HandPosition = handPosition;
+ }
+
+ // Check for finger presses.
+ if (handSource.Pressed != editorHandData.IsFingerDownPending)
+ {
+ editorHandData.IsFingerDownPending = handSource.Pressed;
+ editorHandData.FingerStateUpdateTimer = FingerPressDelay;
+ }
+
+ // Finger presses are delayed to mitigate issue with hand position shifting during air tap.
+ editorHandData.FingerStateChanged = false;
+ if (editorHandData.FingerStateUpdateTimer > 0)
+ {
+ editorHandData.FingerStateUpdateTimer -= deltaTime;
+ if (editorHandData.FingerStateUpdateTimer <= 0)
+ {
+ editorHandData.IsFingerDown = editorHandData.IsFingerDownPending;
+ editorHandData.FingerStateChanged = true;
+ if (editorHandData.IsFingerDown)
+ {
+ editorHandData.FingerDownStartTime = time;
+ }
+ }
+ }
+
+ SendHandStateEvents(editorHandData, time);
+ }
+
+ ///
+ /// Sends the events for hand state changes.
+ ///
+ /// Hand data for which events should be sent.
+ /// Unscaled time of last event.
+ private void SendHandStateEvents(EditorHandData editorHandData, float time)
+ {
+ // Hand moved event.
+ if (editorHandData.HandDelta.sqrMagnitude > 0)
+ {
+ HandMoved.RaiseEvent(this, editorHandData.HandId);
+ }
+
+ // If the finger state has just changed to be down vs up.
+ if (editorHandData.FingerStateChanged)
+ {
+ // New down presses are straightforward - fire input down and be on your way.
+ if (editorHandData.IsFingerDown)
+ {
+ inputManager.RaiseSourceDown(this, editorHandData.HandId);
+ editorHandData.CumulativeDelta = Vector3.zero;
+ }
+ // New up presses require sending different events depending on whether it's also a click, hold, or manipulation.
+ else
+ {
+ // A gesture is always either a click, a hold or a manipulation.
+ if (editorHandData.ManipulationInProgress)
+ {
+ inputManager.RaiseManipulationCompleted(this, editorHandData.HandId, editorHandData.CumulativeDelta);
+ editorHandData.ManipulationInProgress = false;
+ }
+ // Clicks and holds are based on time, and both are overruled by manipulations.
+ else if (editorHandData.HoldInProgress)
+ {
+ inputManager.RaiseHoldCompleted(this, editorHandData.HandId);
+ editorHandData.HoldInProgress = false;
+ }
+ else
+ {
+ // We currently only support single taps in editor.
+ inputManager.RaiseInputClicked(this, editorHandData.HandId, 1);
+ }
+
+ inputManager.RaiseSourceUp(this, editorHandData.HandId);
+ }
+ }
+ // If the finger state hasn't changed, and the finger is down, that means if calculations need to be done
+ // nothing might change, or it might trigger a hold or a manipulation (or a hold and then a manipulation).
+ else if (editorHandData.IsFingerDown)
+ {
+ editorHandData.CumulativeDelta += editorHandData.HandDelta;
+
+ if (!editorHandData.ManipulationInProgress)
+ {
+ // Manipulations are triggered by the amount of movement since the finger was pressed down.
+ if (editorHandData.CumulativeDelta.magnitude > manipulationStartMovementThreshold)
+ {
+ // Starting a manipulation will cancel an existing hold.
+ if (editorHandData.HoldInProgress)
+ {
+ inputManager.RaiseHoldCanceled(this, editorHandData.HandId);
+ editorHandData.HoldInProgress = false;
+ }
+
+ inputManager.RaiseManipulationStarted(this, editorHandData.HandId, editorHandData.CumulativeDelta);
+ editorHandData.ManipulationInProgress = true;
+ }
+ // Holds are triggered by time.
+ else if (!editorHandData.HoldInProgress && (time - editorHandData.FingerDownStartTime >= MaxClickDuration))
+ {
+ inputManager.RaiseHoldStarted(this, editorHandData.HandId);
+ editorHandData.HoldInProgress = true;
+ }
+ }
+ else
+ {
+ inputManager.RaiseManipulationUpdated(this, editorHandData.HandId, editorHandData.CumulativeDelta);
+ }
+ }
+ }
+
+ ///
+ /// Sends the events for hand visibility changes.
+ ///
+ private void SendHandVisibilityEvents()
+ {
+ // Send event for new hands that were added.
+ foreach (uint newHand in newHands)
+ {
+ inputManager.RaiseSourceDetected(this, newHand);
+ }
+
+ // Send event for hands that are no longer visible and remove them from our dictionary.
+ foreach (uint existingHand in handIdToData.Keys)
+ {
+ if (!currentHands.Contains(existingHand))
+ {
+ pendingHandIdDeletes.Add(existingHand);
+ inputManager.RaiseSourceLost(this, existingHand);
+ }
+ }
+
+ // Remove pending hand IDs.
+ for (int i = 0; i < pendingHandIdDeletes.Count; ++i)
+ {
+ handIdToData.Remove(pendingHandIdDeletes[i]);
+ }
+ pendingHandIdDeletes.Clear();
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/EditorHandsInput.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/EditorHandsInput.cs.meta
new file mode 100644
index 0000000..8f70184
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/EditorHandsInput.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c527ac8839879014ab405b6cb5ee39e6
+timeCreated: 1470932425
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/GesturesInput.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/GesturesInput.cs
new file mode 100644
index 0000000..18b09cf
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/GesturesInput.cs
@@ -0,0 +1,229 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using UnityEngine.EventSystems;
+using UnityEngine.VR.WSA.Input;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Input source for gestures information from the WSA APIs, which gives access to various system-supported gestures.
+ /// This is a wrapper on top of GestureRecognizer.
+ ///
+ public class GesturesInput : BaseInputSource
+ {
+ // This enumeration gives the manager two different ways to handle the recognizer. Both will
+ // set up the recognizer. The first causes the recognizer to start
+ // immediately. The second allows the recognizer to be manually started at a later time.
+ public enum RecognizerStartBehavior { AutoStart, ManualStart };
+
+ [Tooltip("Whether the recognizer should be activated on start.")]
+ public RecognizerStartBehavior RecognizerStart;
+
+ [Tooltip("Set to true to use the use rails (guides) for the navigation gesture, as opposed to full 3D navigation.")]
+ public bool UseRailsNavigation = false;
+
+ protected GestureRecognizer gestureRecognizer;
+ protected GestureRecognizer navigationGestureRecognizer;
+
+ protected override void Start()
+ {
+ base.Start();
+
+ gestureRecognizer = new GestureRecognizer();
+ gestureRecognizer.TappedEvent += OnTappedEvent;
+
+ gestureRecognizer.HoldStartedEvent += OnHoldStartedEvent;
+ gestureRecognizer.HoldCompletedEvent += OnHoldCompletedEvent;
+ gestureRecognizer.HoldCanceledEvent += OnHoldCanceledEvent;
+
+ gestureRecognizer.ManipulationStartedEvent += OnManipulationStartedEvent;
+ gestureRecognizer.ManipulationUpdatedEvent += OnManipulationUpdatedEvent;
+ gestureRecognizer.ManipulationCompletedEvent += OnManipulationCompletedEvent;
+ gestureRecognizer.ManipulationCanceledEvent += OnManipulationCanceledEvent;
+
+ gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap |
+ GestureSettings.ManipulationTranslate |
+ GestureSettings.Hold);
+
+ // We need a separate gesture recognizer for navigation, since it isn't compatible with manipulation
+ navigationGestureRecognizer = new GestureRecognizer();
+
+ navigationGestureRecognizer.NavigationStartedEvent += OnNavigationStartedEvent;
+ navigationGestureRecognizer.NavigationUpdatedEvent += OnNavigationUpdatedEvent;
+ navigationGestureRecognizer.NavigationCompletedEvent += OnNavigationCompletedEvent;
+ navigationGestureRecognizer.NavigationCanceledEvent += OnNavigationCanceledEvent;
+
+ if (UseRailsNavigation)
+ {
+ navigationGestureRecognizer.SetRecognizableGestures(GestureSettings.NavigationRailsX |
+ GestureSettings.NavigationRailsY |
+ GestureSettings.NavigationRailsZ);
+ }
+ else
+ {
+ navigationGestureRecognizer.SetRecognizableGestures(GestureSettings.NavigationX |
+ GestureSettings.NavigationY |
+ GestureSettings.NavigationZ);
+ }
+
+ if (RecognizerStart == RecognizerStartBehavior.AutoStart)
+ {
+ gestureRecognizer.StartCapturingGestures();
+ navigationGestureRecognizer.StartCapturingGestures();
+ }
+ }
+
+ protected virtual void OnDestroy()
+ {
+ StopGestureRecognizer();
+ if (gestureRecognizer != null)
+ {
+ gestureRecognizer.TappedEvent -= OnTappedEvent;
+
+ gestureRecognizer.HoldStartedEvent -= OnHoldStartedEvent;
+ gestureRecognizer.HoldCompletedEvent -= OnHoldCompletedEvent;
+ gestureRecognizer.HoldCanceledEvent -= OnHoldCanceledEvent;
+
+ gestureRecognizer.ManipulationStartedEvent -= OnManipulationStartedEvent;
+ gestureRecognizer.ManipulationUpdatedEvent -= OnManipulationUpdatedEvent;
+ gestureRecognizer.ManipulationCompletedEvent -= OnManipulationCompletedEvent;
+ gestureRecognizer.ManipulationCanceledEvent -= OnManipulationCanceledEvent;
+
+ gestureRecognizer.Dispose();
+ }
+ if (navigationGestureRecognizer != null)
+ {
+ navigationGestureRecognizer.NavigationStartedEvent -= OnNavigationStartedEvent;
+ navigationGestureRecognizer.NavigationUpdatedEvent -= OnNavigationUpdatedEvent;
+ navigationGestureRecognizer.NavigationCompletedEvent -= OnNavigationCompletedEvent;
+ navigationGestureRecognizer.NavigationCanceledEvent -= OnNavigationCanceledEvent;
+
+ navigationGestureRecognizer.Dispose();
+ }
+ }
+
+ protected virtual void OnDisable()
+ {
+ StopGestureRecognizer();
+ }
+
+ protected virtual void OnEnable()
+ {
+ if (RecognizerStart == RecognizerStartBehavior.AutoStart)
+ {
+ StartGestureRecognizer();
+ }
+ }
+
+ ///
+ /// Make sure the gesture recognizer is off, then start it.
+ /// Otherwise, leave it alone because it's already in the desired state.
+ ///
+ public void StartGestureRecognizer()
+ {
+ if (gestureRecognizer != null && !gestureRecognizer.IsCapturingGestures())
+ {
+ gestureRecognizer.StartCapturingGestures();
+ }
+ if (navigationGestureRecognizer != null && !navigationGestureRecognizer.IsCapturingGestures())
+ {
+ navigationGestureRecognizer.StartCapturingGestures();
+ }
+ }
+
+ ///
+ /// Make sure the gesture recognizer is on, then stop it.
+ /// Otherwise, leave it alone because it's already in the desired state.
+ ///
+ public void StopGestureRecognizer()
+ {
+ if (gestureRecognizer != null && gestureRecognizer.IsCapturingGestures())
+ {
+ gestureRecognizer.StopCapturingGestures();
+ }
+ if (navigationGestureRecognizer != null && navigationGestureRecognizer.IsCapturingGestures())
+ {
+ navigationGestureRecognizer.StopCapturingGestures();
+ }
+ }
+
+ protected void OnTappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
+ {
+ inputManager.RaiseInputClicked(this, 0, tapCount);
+ }
+
+ protected void OnHoldStartedEvent(InteractionSourceKind source, Ray headray)
+ {
+ inputManager.RaiseHoldStarted(this, 0);
+ }
+
+ protected void OnHoldCanceledEvent(InteractionSourceKind source, Ray headray)
+ {
+ inputManager.RaiseHoldCanceled(this, 0);
+ }
+
+ protected void OnHoldCompletedEvent(InteractionSourceKind source, Ray headray)
+ {
+ inputManager.RaiseHoldCompleted(this, 0);
+ }
+
+ protected void OnManipulationStartedEvent(InteractionSourceKind source, Vector3 cumulativeDelta, Ray headray)
+ {
+ inputManager.RaiseManipulationStarted(this, 0, cumulativeDelta);
+ }
+
+ protected void OnManipulationUpdatedEvent(InteractionSourceKind source, Vector3 cumulativeDelta, Ray headray)
+ {
+ inputManager.RaiseManipulationUpdated(this, 0, cumulativeDelta);
+ }
+
+ protected void OnManipulationCompletedEvent(InteractionSourceKind source, Vector3 cumulativeDelta, Ray headray)
+ {
+ inputManager.RaiseManipulationCompleted(this, 0, cumulativeDelta);
+ }
+
+ protected void OnManipulationCanceledEvent(InteractionSourceKind source, Vector3 cumulativeDelta, Ray headray)
+ {
+ inputManager.RaiseManipulationCanceled(this, 0, cumulativeDelta);
+ }
+
+ protected void OnNavigationStartedEvent(InteractionSourceKind source, Vector3 normalizedOffset, Ray headray)
+ {
+ inputManager.RaiseNavigationStarted(this, 0, normalizedOffset);
+ }
+
+ protected void OnNavigationUpdatedEvent(InteractionSourceKind source, Vector3 normalizedOffset, Ray headray)
+ {
+ inputManager.RaiseNavigationUpdated(this, 0, normalizedOffset);
+ }
+
+ protected void OnNavigationCompletedEvent(InteractionSourceKind source, Vector3 normalizedOffset, Ray headray)
+ {
+ inputManager.RaiseNavigationCompleted(this, 0, normalizedOffset);
+ }
+
+ protected void OnNavigationCanceledEvent(InteractionSourceKind source, Vector3 normalizedOffset, Ray headray)
+ {
+ inputManager.RaiseNavigationCanceled(this, 0, normalizedOffset);
+ }
+
+ public override bool TryGetPosition(uint sourceId, out Vector3 position)
+ {
+ position = Vector3.zero;
+ return false;
+ }
+
+ public override bool TryGetOrientation(uint sourceId, out Quaternion orientation)
+ {
+ orientation = Quaternion.identity;
+ return false;
+ }
+
+ public override SupportedInputInfo GetSupportedInputInfo(uint sourceId)
+ {
+ return SupportedInputInfo.None;
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/GesturesInput.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/GesturesInput.cs.meta
new file mode 100644
index 0000000..57a14da
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/GesturesInput.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d40781677294a0e4caffa3460012ae41
+timeCreated: 1470932425
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/IInputSource.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/IInputSource.cs
new file mode 100644
index 0000000..e97ebf6
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/IInputSource.cs
@@ -0,0 +1,56 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Flags used to indicate which input information is supported by an input source.
+ ///
+ [Flags]
+ public enum SupportedInputInfo
+ {
+ None = 0,
+ Position = 1,
+ Orientation = 2,
+ }
+
+ ///
+ /// Interface for an input source.
+ /// An input source can be anything that a user can use to interact with a device.
+ ///
+ public interface IInputSource
+ {
+ ///
+ /// Returns the input info that that the input source can provide.
+ ///
+ SupportedInputInfo GetSupportedInputInfo(uint sourceId);
+
+ ///
+ /// Returns whether the input source supports the specified input info type.
+ ///
+ /// ID of the source.
+ /// Input info type that we want to get information about.
+ bool SupportsInputInfo(uint sourceId, SupportedInputInfo inputInfo);
+
+ ///
+ /// Returns the position of the input source, if available.
+ /// Not all input sources have positional information.
+ ///
+ /// ID of the source for which the position should be retrieved.
+ /// Out parameter filled with the position if available, otherwise the zero vector.
+ /// True if a position was retrieved, false if not.
+ bool TryGetPosition(uint sourceId, out Vector3 position);
+
+ ///
+ /// Returns the orientation of the input source, if available.
+ /// Not all input sources have orientation information.
+ ///
+ /// ID of the source for which the position should be retrieved.
+ /// Out parameter filled with the orientation if available, otherwise the zero vector.
+ /// True if an orientation was retrieved, false if not.
+ bool TryGetOrientation(uint sourceId, out Quaternion orientation);
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/IInputSource.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/IInputSource.cs.meta
new file mode 100644
index 0000000..5a79a95
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/IInputSource.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 17aa48f2d64d22c4d8a6c63e08a13cd4
+timeCreated: 1470932424
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/RawInteractionSourcesInput.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/RawInteractionSourcesInput.cs
new file mode 100644
index 0000000..492bbbd
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/RawInteractionSourcesInput.cs
@@ -0,0 +1,243 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.VR.WSA.Input;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Input source for raw interactions sources information, which gives finer details about current source state and position
+ /// than the standard GestureRecognizer.
+ /// This mostly allows users to access the source up/down and detected/lost events,
+ /// which are not communicated as part of standard Windows gestures.
+ ///
+ ///
+ /// This input source only triggers SourceUp/SourceDown and SourceDetected/SourceLost.
+ /// Everything else is handled by GesturesInput.
+ ///
+ public class RawInteractionSourcesInput : BaseInputSource
+ {
+ ///
+ /// Data for an interaction source.
+ ///
+ private class SourceData
+ {
+ public SourceData(uint sourceId)
+ {
+ SourceId = sourceId;
+ HasPosition = false;
+ SourcePosition = Vector3.zero;
+ IsSourceDown = false;
+ IsSourceDownPending = false;
+ SourceStateChanged = false;
+ SourceStateUpdateTimer = -1;
+ }
+
+ public readonly uint SourceId;
+ public bool HasPosition;
+ public Vector3 SourcePosition;
+ public bool IsSourceDown;
+ public bool IsSourceDownPending;
+ public bool SourceStateChanged;
+ public float SourceStateUpdateTimer;
+ }
+
+ ///
+ /// Delay before a source press is considered.
+ /// This mitigates fake source taps that can sometimes be detected while the input source is moving.
+ ///
+ private const float SourcePressDelay = 0.07f;
+
+ [Tooltip("Use unscaled time. This is useful for games that have a pause mechanism or otherwise adjust the game timescale.")]
+ public bool UseUnscaledTime = true;
+
+ ///
+ /// Dictionary linking each source ID to its data.
+ ///
+ private readonly Dictionary sourceIdToData = new Dictionary(4);
+ private readonly List pendingSourceIdDeletes = new List();
+
+ // HashSets used to be able to quickly update the sources data when they become visible / not visible
+ private readonly HashSet currentSources = new HashSet();
+ private readonly HashSet newSources = new HashSet();
+
+ public override SupportedInputInfo GetSupportedInputInfo(uint sourceId)
+ {
+ SupportedInputInfo retVal = SupportedInputInfo.None;
+
+ SourceData sourceData;
+ if (sourceIdToData.TryGetValue(sourceId, out sourceData))
+ {
+ if (sourceData.HasPosition)
+ {
+ retVal |= SupportedInputInfo.Position;
+ }
+ }
+
+ return retVal;
+ }
+
+ public override bool TryGetPosition(uint sourceId, out Vector3 position)
+ {
+ SourceData sourceData;
+ if (sourceIdToData.TryGetValue(sourceId, out sourceData))
+ {
+ if (sourceData.HasPosition)
+ {
+ position = sourceData.SourcePosition;
+ return true;
+ }
+ }
+
+ // Else, the source doesn't have positional information
+ position = Vector3.zero;
+ return false;
+ }
+
+ public override bool TryGetOrientation(uint sourceId, out Quaternion orientation)
+ {
+ // Orientation is not supported by any Windows interaction sources
+ orientation = Quaternion.identity;
+ return false;
+ }
+
+ private void Update()
+ {
+ newSources.Clear();
+ currentSources.Clear();
+
+ UpdateSourceData();
+ SendSourceVisibilityEvents();
+ }
+
+ ///
+ /// Update the source data for the currently detected sources.
+ ///
+ private void UpdateSourceData()
+ {
+ // Poll for updated reading from hands
+ InteractionSourceState[] sourceStates = InteractionManager.GetCurrentReading();
+ if (sourceStates != null)
+ {
+ for (var i = 0; i < sourceStates.Length; ++i)
+ {
+ InteractionSourceState handSource = sourceStates[i];
+ SourceData sourceData = GetOrAddSourceData(handSource.source);
+ currentSources.Add(handSource.source.id);
+
+ UpdateSourceState(handSource, sourceData);
+ }
+ }
+ }
+
+ ///
+ /// Gets the source data for the specified interaction source if it already exists, otherwise creates it.
+ ///
+ /// Interaction source for which data should be retrieved.
+ /// The source data requested.
+ private SourceData GetOrAddSourceData(InteractionSource interactionSource)
+ {
+ SourceData sourceData;
+ if (!sourceIdToData.TryGetValue(interactionSource.id, out sourceData))
+ {
+ sourceData = new SourceData(interactionSource.id);
+ sourceIdToData.Add(sourceData.SourceId, sourceData);
+ newSources.Add(sourceData.SourceId);
+ }
+
+ return sourceData;
+ }
+
+ ///
+ /// Updates the source positional information.
+ ///
+ /// Interaction source to use to update the position.
+ /// SourceData structure to update.
+ private void UpdateSourceState(InteractionSourceState interactionSource, SourceData sourceData)
+ {
+ // Update source position
+ Vector3 sourcePosition;
+ if (interactionSource.properties.location.TryGetPosition(out sourcePosition))
+ {
+ sourceData.HasPosition = true;
+ sourceData.SourcePosition = sourcePosition;
+ }
+
+ // Check for source presses
+ if (interactionSource.pressed != sourceData.IsSourceDownPending)
+ {
+ sourceData.IsSourceDownPending = interactionSource.pressed;
+ sourceData.SourceStateUpdateTimer = SourcePressDelay;
+ }
+
+ // Source presses are delayed to mitigate issue with hand position shifting during air tap
+ sourceData.SourceStateChanged = false;
+ if (sourceData.SourceStateUpdateTimer >= 0)
+ {
+ float deltaTime = UseUnscaledTime
+ ? Time.unscaledDeltaTime
+ : Time.deltaTime;
+
+ sourceData.SourceStateUpdateTimer -= deltaTime;
+ if (sourceData.SourceStateUpdateTimer < 0)
+ {
+ sourceData.IsSourceDown = sourceData.IsSourceDownPending;
+ sourceData.SourceStateChanged = true;
+ }
+ }
+
+ SendSourceStateEvents(sourceData);
+ }
+
+ ///
+ /// Sends the events for source state changes.
+ ///
+ /// Source data for which events should be sent.
+ private void SendSourceStateEvents(SourceData sourceData)
+ {
+ // Source pressed/released events
+ if (sourceData.SourceStateChanged)
+ {
+ if (sourceData.IsSourceDown)
+ {
+ inputManager.RaiseSourceDown(this, sourceData.SourceId);
+ }
+ else
+ {
+ inputManager.RaiseSourceUp(this, sourceData.SourceId);
+ }
+ }
+ }
+
+ ///
+ /// Sends the events for source visibility changes.
+ ///
+ private void SendSourceVisibilityEvents()
+ {
+ // Send event for new sources that were added
+ foreach (uint newSource in newSources)
+ {
+ inputManager.RaiseSourceDetected(this, newSource);
+ }
+
+ // Send event for sources that are no longer visible and remove them from our dictionary
+ foreach (uint existingSource in sourceIdToData.Keys)
+ {
+ if (!currentSources.Contains(existingSource))
+ {
+ pendingSourceIdDeletes.Add(existingSource);
+ inputManager.RaiseSourceLost(this, existingSource);
+ }
+ }
+
+ // Remove pending source IDs
+ for (int i = 0; i < pendingSourceIdDeletes.Count; ++i)
+ {
+ sourceIdToData.Remove(pendingSourceIdDeletes[i]);
+ }
+ pendingSourceIdDeletes.Clear();
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/RawInteractionSourcesInput.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/RawInteractionSourcesInput.cs.meta
new file mode 100644
index 0000000..1e3b3dc
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/InputSources/RawInteractionSourcesInput.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 73383145d055bef478097c80c114d2a4
+timeCreated: 1470932424
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions.meta
new file mode 100644
index 0000000..1a6093a
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 95d2ce0a001b47e408d513b5017f2899
+folderAsset: yes
+timeCreated: 1471397343
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions/HandDraggable.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions/HandDraggable.cs
new file mode 100644
index 0000000..c7a42a0
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions/HandDraggable.cs
@@ -0,0 +1,316 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using System;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Component that allows dragging an object with your hand on HoloLens.
+ /// Dragging is done by calculating the angular delta and z-delta between the current and previous hand positions,
+ /// and then repositioning the object based on that.
+ ///
+ public class HandDraggable : MonoBehaviour,
+ IFocusable,
+ IInputHandler,
+ ISourceStateHandler
+ {
+ ///
+ /// Event triggered when dragging starts.
+ ///
+ public event Action StartedDragging;
+
+ ///
+ /// Event triggered when dragging stops.
+ ///
+ public event Action StoppedDragging;
+
+ [Tooltip("Transform that will be dragged. Defaults to the object of the component.")]
+ public Transform HostTransform;
+
+ [Tooltip("Scale by which hand movement in z is multipled to move the dragged object.")]
+ public float DistanceScale = 2f;
+
+ public enum RotationModeEnum
+ {
+ Default,
+ LockObjectRotation,
+ OrientTowardUser,
+ OrientTowardUserAndKeepUpright
+ }
+
+ public RotationModeEnum RotationMode = RotationModeEnum.Default;
+
+ public bool IsDraggingEnabled = true;
+
+ private Camera mainCamera;
+ private bool isDragging;
+ private bool isGazed;
+ private Vector3 objRefForward;
+ private Vector3 objRefUp;
+ private float objRefDistance;
+ private Quaternion gazeAngularOffset;
+ private float handRefDistance;
+ private Vector3 objRefGrabPoint;
+
+ private Vector3 draggingPosition;
+ private Quaternion draggingRotation;
+
+ private IInputSource currentInputSource = null;
+ private uint currentInputSourceId;
+
+ private void Start()
+ {
+ if (HostTransform == null)
+ {
+ HostTransform = transform;
+ }
+
+ mainCamera = Camera.main;
+ }
+
+ private void OnDestroy()
+ {
+ if (isDragging)
+ {
+ StopDragging();
+ }
+
+ if (isGazed)
+ {
+ OnFocusExit();
+ }
+ }
+
+ private void Update()
+ {
+ if (IsDraggingEnabled && isDragging)
+ {
+ UpdateDragging();
+ }
+ }
+
+ ///
+ /// Starts dragging the object.
+ ///
+ public void StartDragging()
+ {
+ if (!IsDraggingEnabled)
+ {
+ return;
+ }
+
+ if (isDragging)
+ {
+ return;
+ }
+
+ // Add self as a modal input handler, to get all inputs during the manipulation
+ InputManager.Instance.PushModalInputHandler(gameObject);
+
+ isDragging = true;
+ //GazeCursor.Instance.SetState(GazeCursor.State.Move);
+ //GazeCursor.Instance.SetTargetObject(HostTransform);
+
+ Vector3 gazeHitPosition = GazeManager.Instance.HitInfo.point;
+ Vector3 handPosition;
+ currentInputSource.TryGetPosition(currentInputSourceId, out handPosition);
+
+ Vector3 pivotPosition = GetHandPivotPosition();
+ handRefDistance = Vector3.Magnitude(handPosition - pivotPosition);
+ objRefDistance = Vector3.Magnitude(gazeHitPosition - pivotPosition);
+
+ Vector3 objForward = HostTransform.forward;
+ Vector3 objUp = HostTransform.up;
+
+ // Store where the object was grabbed from
+ objRefGrabPoint = mainCamera.transform.InverseTransformDirection(HostTransform.position - gazeHitPosition);
+
+ Vector3 objDirection = Vector3.Normalize(gazeHitPosition - pivotPosition);
+ Vector3 handDirection = Vector3.Normalize(handPosition - pivotPosition);
+
+ objForward = mainCamera.transform.InverseTransformDirection(objForward); // in camera space
+ objUp = mainCamera.transform.InverseTransformDirection(objUp); // in camera space
+ objDirection = mainCamera.transform.InverseTransformDirection(objDirection); // in camera space
+ handDirection = mainCamera.transform.InverseTransformDirection(handDirection); // in camera space
+
+ objRefForward = objForward;
+ objRefUp = objUp;
+
+ // Store the initial offset between the hand and the object, so that we can consider it when dragging
+ gazeAngularOffset = Quaternion.FromToRotation(handDirection, objDirection);
+ draggingPosition = gazeHitPosition;
+
+ StartedDragging.RaiseEvent();
+ }
+
+ ///
+ /// Gets the pivot position for the hand, which is approximated to the base of the neck.
+ ///
+ /// Pivot position for the hand.
+ private Vector3 GetHandPivotPosition()
+ {
+ Vector3 pivot = Camera.main.transform.position + new Vector3(0, -0.2f, 0) - Camera.main.transform.forward * 0.2f; // a bit lower and behind
+ return pivot;
+ }
+
+ ///
+ /// Enables or disables dragging.
+ ///
+ /// Indicates whether dragging shoudl be enabled or disabled.
+ public void SetDragging(bool isEnabled)
+ {
+ if (IsDraggingEnabled == isEnabled)
+ {
+ return;
+ }
+
+ IsDraggingEnabled = isEnabled;
+
+ if (isDragging)
+ {
+ StopDragging();
+ }
+ }
+
+ ///
+ /// Update the position of the object being dragged.
+ ///
+ private void UpdateDragging()
+ {
+ Vector3 newHandPosition;
+ currentInputSource.TryGetPosition(currentInputSourceId, out newHandPosition);
+
+ Vector3 pivotPosition = GetHandPivotPosition();
+
+ Vector3 newHandDirection = Vector3.Normalize(newHandPosition - pivotPosition);
+
+ newHandDirection = mainCamera.transform.InverseTransformDirection(newHandDirection); // in camera space
+ Vector3 targetDirection = Vector3.Normalize(gazeAngularOffset * newHandDirection);
+ targetDirection = mainCamera.transform.TransformDirection(targetDirection); // back to world space
+
+ float currenthandDistance = Vector3.Magnitude(newHandPosition - pivotPosition);
+
+ float distanceRatio = currenthandDistance / handRefDistance;
+ float distanceOffset = distanceRatio > 0 ? (distanceRatio - 1f) * DistanceScale : 0;
+ float targetDistance = objRefDistance + distanceOffset;
+
+ draggingPosition = pivotPosition + (targetDirection * targetDistance);
+
+ if (RotationMode == RotationModeEnum.OrientTowardUser || RotationMode == RotationModeEnum.OrientTowardUserAndKeepUpright)
+ {
+ draggingRotation = Quaternion.LookRotation(HostTransform.position - pivotPosition);
+ }
+ else if (RotationMode == RotationModeEnum.LockObjectRotation)
+ {
+ draggingRotation = HostTransform.rotation;
+ }
+ else // RotationModeEnum.Default
+ {
+ Vector3 objForward = mainCamera.transform.TransformDirection(objRefForward); // in world space
+ Vector3 objUp = mainCamera.transform.TransformDirection(objRefUp); // in world space
+ draggingRotation = Quaternion.LookRotation(objForward, objUp);
+ }
+
+ // Apply Final Position
+ HostTransform.position = draggingPosition + mainCamera.transform.TransformDirection(objRefGrabPoint);
+ // Apply Final Rotation
+ HostTransform.rotation = draggingRotation;
+ if (RotationMode == RotationModeEnum.OrientTowardUserAndKeepUpright)
+ {
+ Quaternion upRotation = Quaternion.FromToRotation(HostTransform.up, Vector3.up);
+ HostTransform.rotation = upRotation * HostTransform.rotation;
+ }
+ }
+
+ ///
+ /// Stops dragging the object.
+ ///
+ public void StopDragging()
+ {
+ if (!isDragging)
+ {
+ return;
+ }
+
+ // Remove self as a modal input handler
+ InputManager.Instance.PopModalInputHandler();
+
+ isDragging = false;
+ currentInputSource = null;
+ StoppedDragging.RaiseEvent();
+ }
+
+ public void OnFocusEnter()
+ {
+ if (!IsDraggingEnabled)
+ {
+ return;
+ }
+
+ if (isGazed)
+ {
+ return;
+ }
+
+ isGazed = true;
+ }
+
+ public void OnFocusExit()
+ {
+ if (!IsDraggingEnabled)
+ {
+ return;
+ }
+
+ if (!isGazed)
+ {
+ return;
+ }
+
+ isGazed = false;
+ }
+
+ public void OnInputUp(InputEventData eventData)
+ {
+ if (currentInputSource != null &&
+ eventData.SourceId == currentInputSourceId)
+ {
+ StopDragging();
+ }
+ }
+
+ public void OnInputDown(InputEventData eventData)
+ {
+ if (isDragging)
+ {
+ // We're already handling drag input, so we can't start a new drag operation.
+ return;
+ }
+
+ if (!eventData.InputSource.SupportsInputInfo(eventData.SourceId, SupportedInputInfo.Position))
+ {
+ // The input source must provide positional data for this script to be usable
+ return;
+ }
+
+ currentInputSource = eventData.InputSource;
+ currentInputSourceId = eventData.SourceId;
+ StartDragging();
+ }
+
+ public void OnSourceDetected(SourceStateEventData eventData)
+ {
+ // Nothing to do
+ }
+
+ public void OnSourceLost(SourceStateEventData eventData)
+ {
+ if (currentInputSource != null && eventData.SourceId == currentInputSourceId)
+ {
+ StopDragging();
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions/HandDraggable.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions/HandDraggable.cs.meta
new file mode 100644
index 0000000..0273e67
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Interactions/HandDraggable.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 7d5a0a60fbe897549ad0bfe2039f12b6
+timeCreated: 1463778456
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/KeyboardManager.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/KeyboardManager.cs
new file mode 100644
index 0000000..011fa80
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/KeyboardManager.cs
@@ -0,0 +1,237 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using System;
+using System.Collections.Generic;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// KeyboardManager allows other scripts to register for (or inject) key events.
+ ///
+ public class KeyboardManager : Singleton
+ {
+ public enum KeyEvent
+ {
+ ///
+ /// This event is sent once when a key is pressed.
+ ///
+ KeyDown = 0,
+
+ ///
+ /// This event is sent repeatedly while a key is held down.
+ ///
+ KeyHeld,
+
+ ///
+ /// This event is sent once when a key is released.
+ ///
+ KeyUp
+ };
+
+ ///
+ /// Simple struct that holds a KeyCode and KeyEvent
+ ///
+ public struct KeyCodeEventPair
+ {
+ public KeyCode KeyCode;
+ public KeyEvent KeyEvent;
+
+ public KeyCodeEventPair(KeyCode keyCode, KeyEvent keyEvent)
+ {
+ this.KeyCode = keyCode;
+ this.KeyEvent = keyEvent;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is KeyCodeEventPair))
+ {
+ return false;
+ }
+
+ KeyCodeEventPair compare = (KeyCodeEventPair)obj;
+
+ return KeyCode == compare.KeyCode && KeyEvent == compare.KeyEvent;
+ }
+
+ public override int GetHashCode()
+ {
+ return (KeyCode.GetHashCode() * 100) ^ KeyEvent.GetHashCode();
+ }
+ };
+
+ ///
+ /// KeyboardRegistration is returned by RegisterKeyEvent. Calling code should maintain a reference
+ /// to the object while the registration should function, then call Dispose on it to unregister.
+ ///
+ public class KeyboardRegistration : IDisposable
+ {
+ private readonly KeyCodeEventPair keyCodeEvent;
+ private readonly KeyboardCallback callback;
+ private bool isRegistered;
+
+ public KeyboardRegistration(KeyCodeEventPair keyCodeEvent, KeyboardCallback callback)
+ {
+ this.keyCodeEvent = keyCodeEvent;
+ this.callback = callback;
+ isRegistered = true;
+ }
+
+ public void Dispose()
+ {
+ if (isRegistered)
+ {
+ var keyboard = KeyboardManager.Instance;
+ if (keyboard)
+ {
+ keyboard.UnregisterKeyEvent(keyCodeEvent, callback);
+ }
+ isRegistered = false;
+ }
+ }
+ }
+
+ ///
+ /// Delegate that is called when a registered keyboard event is detected
+ ///
+ /// The KeyCodeEventPair corresponding to the detected input
+ public delegate void KeyboardCallback(KeyCodeEventPair keyCodeEvent);
+
+ ///
+ /// A dictionary containing a list of callbacks for each active KeyCodeEventPair
+ ///
+ private Dictionary> registeredCallbacks
+ = new Dictionary>();
+
+ ///
+ /// The detected input events. This is done to avoid callbacks interfering with the traversal of the dictionary.
+ ///
+ private List detectedKeyEvents = new List();
+
+ ///
+ /// The input events that are being processed. Only used by Update to avoid multithreading issues.
+ ///
+ private List pendingKeyEvents = new List();
+
+ private void Update()
+ {
+ lock (detectedKeyEvents)
+ {
+ pendingKeyEvents.AddRange(detectedKeyEvents);
+ detectedKeyEvents.Clear();
+ }
+
+ // Check for all keys that are registered for events
+ foreach (KeyCodeEventPair keyCheck in registeredCallbacks.Keys)
+ {
+ bool eventTriggered = false;
+
+ switch (keyCheck.KeyEvent)
+ {
+ case KeyEvent.KeyHeld:
+ eventTriggered = Input.GetKey(keyCheck.KeyCode);
+ break;
+ case KeyEvent.KeyDown:
+ eventTriggered = Input.GetKeyDown(keyCheck.KeyCode);
+ break;
+ case KeyEvent.KeyUp:
+ eventTriggered = Input.GetKeyUp(keyCheck.KeyCode);
+ break;
+ }
+
+ if (eventTriggered)
+ {
+ pendingKeyEvents.Add(keyCheck);
+ }
+ }
+
+ for (int eventIndex = 0; eventIndex < pendingKeyEvents.Count; eventIndex++)
+ {
+ HandleKeyEvent(pendingKeyEvents[eventIndex]);
+ }
+ pendingKeyEvents.Clear();
+ }
+
+ ///
+ /// Unregister a specified KeyCodeEventPair and KeyboardCallback.
+ ///
+ private void UnregisterKeyEvent(KeyCodeEventPair keyCodeEvent, KeyboardCallback callback)
+ {
+ if (registeredCallbacks.ContainsKey(keyCodeEvent))
+ {
+ List callbackList = registeredCallbacks[keyCodeEvent];
+
+ if (callbackList.Remove(callback))
+ {
+ // remove the list from the dictionary if no callbacks are left
+ if (callbackList.Count == 0)
+ {
+ registeredCallbacks.Remove(keyCodeEvent);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Invoke any registered callbacks for the specified KeyCodeEventPair input.
+ ///
+ private void HandleKeyEvent(KeyCodeEventPair keyEventPair)
+ {
+ List callbackList;
+
+ if (registeredCallbacks.TryGetValue(keyEventPair, out callbackList))
+ {
+ // Create a copy of the list in case a listener unregisters.
+ KeyboardCallback[] callbacksCopy = callbackList.ToArray();
+ foreach (KeyboardCallback callback in callbacksCopy)
+ {
+ callback(keyEventPair);
+ }
+ }
+ }
+
+ #region Public Functions
+ ///
+ /// Register to get a callback whenever the specified KeyCodeEventPair input is detected
+ ///
+ public KeyboardRegistration RegisterKeyEvent(KeyCodeEventPair keycodeEvent, KeyboardCallback callback)
+ {
+ if (!registeredCallbacks.ContainsKey(keycodeEvent))
+ {
+ registeredCallbacks.Add(keycodeEvent, new List());
+ }
+
+ // Don't register the same callback more than once
+ List callbackList = registeredCallbacks[keycodeEvent];
+ for (int i = 0; i < callbackList.Count; i++)
+ {
+ if (callbackList[i] == callback)
+ {
+ // Duplicate
+ Debug.LogError("Ignoring duplicate keyboard callback.");
+ return null;
+ }
+ }
+
+ callbackList.Add(callback);
+
+ // return a registration object, which must be referenced until it's disposed to unregister
+ return new KeyboardRegistration(keycodeEvent, callback);
+ }
+
+ ///
+ /// Queue an artificial keyboard event to be handled on the next Update.
+ /// (This can be called from another thread.)
+ ///
+ public void InjectKeyboardEvent(KeyCodeEventPair keycodeEvent)
+ {
+ lock (detectedKeyEvents)
+ {
+ detectedKeyEvents.Add(keycodeEvent);
+ }
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/KeyboardManager.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/KeyboardManager.cs.meta
new file mode 100644
index 0000000..2a9e879
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/KeyboardManager.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d16c92d59af8a9a4a9a0db824132b067
+timeCreated: 1467670142
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone.meta
new file mode 100644
index 0000000..23d1ff3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 8262c9fb55668ff4ab65697a089e64ae
+folderAsset: yes
+timeCreated: 1474471005
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone/MicStream.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone/MicStream.cs
new file mode 100644
index 0000000..a2569c3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone/MicStream.cs
@@ -0,0 +1,195 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System.Runtime.InteropServices;
+using UnityEngine;
+using System.Text;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ public class MicStream
+ {
+ // This class replaces Unity's Microphone object
+ // This class is made for HoloLens mic stream selection, but should work well on all windows 10 devices
+ // chooses from one of three possible microphone modes on HoloLens
+ // There is an example of how to use this script in HoloToolkit\Input\Tests\Scripts\MicStreamDemo.cs
+
+ // Streams: LOW_QUALITY_VOICE is optimized for speech analysis, COMMUNICATIONS is higher quality voice and is probably preferred
+ // ROOM_CAPTURE tries to get the sounds of the room more than the voice of the suer
+ // can only be set on initialization
+ public enum StreamCategory { LOW_QUALITY_VOICE, HIGH_QUALITY_VOICE, ROOM_CAPTURE }
+
+ public enum ErrorCodes { ALREADY_RUNNING = -10, NO_AUDIO_DEVICE, NO_INPUT_DEVICE, ALREADY_RECORDING, GRAPH_NOT_EXIST, CHANNEL_COUNT_MISMATCH, FILE_CREATION_PERMISSION_ERROR, NOT_ENOUGH_DATA, NEED_ENABLED_MIC_CAPABILITY };
+
+ const int MAX_PATH = 260; // 260 is maximum path length in windows, to be returned when we MicStopRecording
+
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)] // If included in MicStartStream, this callback will be triggered when audio data is ready. This is not the preferred method for Game Engines and can probably be ignored.
+ public delegate void LiveMicCallback();
+
+ ///
+ /// Called before calling MicStartStream or MicstartRecording to initialize microphone
+ ///
+ /// One of the entries in the StreamCategory enumeratio
+ /// error code or 0
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicInitializeDefault(int category);
+
+ ///
+ /// Called before calling MicStartStream or MicstartRecording to initialize microphone
+ ///
+ /// One of the entries in the StreamCategory enumeration
+ /// Desired number of samples per second
+ /// error code or 0
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicInitializeCustomRate(int category, int samplerate);
+
+ ///
+ /// Call this to start receiving data from a microphone. Then, each frame, call MicGetFrame.
+ ///
+ /// If true, all data will stay in the queue, if the client code is running behind. This can lead to significant audio lag, so is not appropriate for low-latency situations like reall-time voice chat.
+ /// If true, the audio from the microphone will be played through your speakers.
+ /// Optional (can be null): This callback will be called when data is ready for MicGetFrame
+ /// error code or 0
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicStartStream(bool keepData, bool previewOnDevice, LiveMicCallback micsignal);
+
+ ///
+ /// Call this to start receiving data from a microphone. Then, each frame, call MicGetFrame.
+ ///
+ /// If true, all data will stay in the queue, if the client code is running behind. This can lead to significant audio lag, so is not appropriate for low-latency situations like reall-time voice chat.
+ /// If true, the audio from the microphone will be played through your speakers.
+ /// error code or 0
+ public static int MicStartStream(bool keepData, bool previewOnDevice)
+ {
+ return MicStartStream(keepData, previewOnDevice, null);
+ }
+
+ ///
+ /// Shuts down the connection to the microphone. Data will not longer be received from the microphone.
+ ///
+ /// error code or 0
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicStopStream();
+
+ ///
+ /// Begins recording microphone data to the specified file.
+ ///
+ /// The file will be saved to this name. Specify only the wav file's name with extensions, aka "myfile.wav", not full path
+ /// If true, will play micstream in speakers
+ ///
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicStartRecording(string filename, bool previewOnDevice);
+
+ ///
+ /// Finishes writing the file recording started with MicStartRecording.
+ ///
+ /// returns the full path to the recorded audio file
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern void MicStopRecording(StringBuilder sb);
+
+ ///
+ /// Finishes writing the file recording started with MicStartRecording.
+ ///
+ /// the full path to the recorded audio file
+ public static string MicStopRecording()
+ {
+ StringBuilder builder = new StringBuilder(MAX_PATH);
+ MicStopRecording(builder);
+ return builder.ToString();
+ }
+
+ ///
+ /// Cleans up data associated with microphone recording. Counterpart to MicInitialize*
+ ///
+ /// error code or 0
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicDestroy();
+
+ ///
+ /// Pauses streaming of microphone data to MicGetFrame (and/or file specified with MicStartRecording)
+ ///
+ /// error code or 0
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+
+ public static extern int MicPause();
+
+ ///
+ /// Unpauses streaming of microphone data to MicGetFrame (and/or file specified with MicStartRecording)
+ ///
+ /// error code or 0
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicResume();
+
+ ///
+ /// Sets apmlification factor for microphone samples returned by MicGetFrame (and/or file specified with MicStartRecording)
+ ///
+ /// gain factor
+ /// error code or 0
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicSetGain(float g);
+
+ ///
+ /// Queries the default microphone audio frame sample size. Useful if doing default initializations with callbacks to know how much data it wants to hand you.
+ ///
+ /// the number of samles in the default audio buffer
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ private static extern int MicGetDefaultBufferSize();
+
+ ///
+ /// Queries the number of channels supported by the microphone. Useful if doing default initializations with callbacks to know how much data it wants to hand you.
+ ///
+ /// the number of channels
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ private static extern int MicGetDefaultNumChannels();
+
+ ///
+ /// Read from the microphone buffer. Usually called once per frame.
+ ///
+ /// the buffer into which to store the microphone audio samples
+ /// the length of the buffer
+ /// the number of audio channels to store in the buffer
+ /// error code (or 0 if no error)
+ [DllImport("MicStreamSelector", ExactSpelling = true)]
+ public static extern int MicGetFrame(float[] buffer, int length, int numchannels);
+
+ ///
+ /// Prints useful error/warning messages based on error codes returned from the functions in this class
+ ///
+ /// An error code returned by another function in this class
+ /// True if no error or warning message was printed, false if a message was printed
+ public static bool CheckForErrorOnCall(int returnCode)
+ {
+ switch (returnCode)
+ {
+ case (int)ErrorCodes.ALREADY_RECORDING:
+ Debug.LogError("WARNING: Tried to start recording when you were already doing so. You need to stop your previous recording before you can start again.");
+ return false;
+ case (int)ErrorCodes.ALREADY_RUNNING:
+ Debug.LogError("WARNING: Tried to initialize microphone more than once");
+ return false;
+ case (int)ErrorCodes.GRAPH_NOT_EXIST:
+ Debug.LogError("ERROR: Tried to do microphone things without a properly initialized microphone. \n Do you have a mic plugged into a functional audio system and did you call MicInitialize() before anything else ??");
+ return false;
+ case (int)ErrorCodes.NO_AUDIO_DEVICE:
+ Debug.LogError("ERROR: Tried to start microphone, but you don't appear to have a functional audio device. check your OS audio settings.");
+ return false;
+ case (int)ErrorCodes.NO_INPUT_DEVICE:
+ Debug.LogError("ERROR: Tried to start microphone, but you don't have one plugged in, do you?");
+ return false;
+ case (int)ErrorCodes.CHANNEL_COUNT_MISMATCH:
+ Debug.LogError("ERROR: Microphone had a channel count mismatch internally on device. Try setting different mono/stereo options in OS mic settings.");
+ return false;
+ case (int)ErrorCodes.FILE_CREATION_PERMISSION_ERROR:
+ Debug.LogError("ERROR: Didn't have access to create file in Music library. Make sure permissions to write to Music library are set granted.");
+ return false;
+ case (int)ErrorCodes.NOT_ENOUGH_DATA:
+ // usually not an error, means the device hasn't produced enough data yet because it just started running
+ return false;
+ case (int)ErrorCodes.NEED_ENABLED_MIC_CAPABILITY:
+ Debug.LogError("ERROR: Seems like you forgot to enable the microphone capabilities in your Unity permissions");
+ return false;
+ }
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone/MicStream.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone/MicStream.cs.meta
new file mode 100644
index 0000000..9c6f001
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Microphone/MicStream.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4b1346964b1669842b425d5dce5b360d
+timeCreated: 1468273805
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/SetGlobalListener.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/SetGlobalListener.cs
new file mode 100644
index 0000000..8ccf9fe
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/SetGlobalListener.cs
@@ -0,0 +1,23 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule.Tests
+{
+ ///
+ /// Register this game object on the InputManager as a global listener.
+ ///
+ public class SetGlobalListener : MonoBehaviour
+ {
+ private void Start()
+ {
+ InputManager.Instance.AddGlobalListener(gameObject);
+ }
+
+ private void OnDestroy()
+ {
+ InputManager.Instance.RemoveGlobalListener(gameObject);
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/SetGlobalListener.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/SetGlobalListener.cs.meta
new file mode 100644
index 0000000..2b0dd96
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/SetGlobalListener.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: cae8f3c88e9704a4393cb8d904b62372
+timeCreated: 1481884576
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/UI.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/UI.meta
new file mode 100644
index 0000000..47ec4c3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/UI.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: db8878df5857f754aafe6c6d0e759c69
+folderAsset: yes
+timeCreated: 1469832109
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/UI/TriggerButton.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/UI/TriggerButton.cs
new file mode 100644
index 0000000..642b2eb
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/UI/TriggerButton.cs
@@ -0,0 +1,41 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Very simple class that implements basic logic for a trigger button.
+ ///
+ public class TriggerButton : MonoBehaviour, IInputClickHandler
+ {
+ ///
+ /// Indicates whether the button is clickable or not.
+ ///
+ [Tooltip("Indicates whether the button is clickable or not.")]
+ public bool IsEnabled = true;
+
+ public event Action ButtonPressed;
+
+ ///
+ /// Press the button programatically.
+ ///
+ public void Press()
+ {
+ if (IsEnabled)
+ {
+ ButtonPressed.RaiseEvent();
+ }
+ }
+
+ public void OnInputClicked(InputClickedEventData eventData)
+ {
+ if (IsEnabled)
+ {
+ ButtonPressed.RaiseEvent();
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/UI/TriggerButton.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/UI/TriggerButton.cs.meta
new file mode 100644
index 0000000..c260c74
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/UI/TriggerButton.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e56a6ffca3a66b54189d6d303078cbf6
+timeCreated: 1469832135
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities.meta
new file mode 100644
index 0000000..e93afa3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: bca5b310aad363f4da86850d2785aa96
+folderAsset: yes
+timeCreated: 1471397787
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/AxisController.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/AxisController.cs
new file mode 100644
index 0000000..bf6437d
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/AxisController.cs
@@ -0,0 +1,565 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using System;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// AxisController uses the keyboard, mouse, or joystick and allows
+ /// you to map a 1 axis controller to 1 axis displacement via GetDiplacement1()
+ /// or to map a 2 axis controller to 2 axis displacement via GetDisplacement2()
+ /// or to map a 2 axis controller to 2 of the 3 axis displacement via GetDisplacement3()
+ ///
+ public class AxisController : MonoBehaviour
+ {
+ ///
+ /// Type of input axis, based on device.
+ ///
+ public enum AxisType
+ {
+ // Axis are double axis (XY) unless indicated as single axis (X only)
+ InputManagerAxis,
+
+ KeyboardArrows,
+ KeyboardWASD,
+ KeyboardQE, // single axis
+ KeyboardIJKL,
+ KeyboardUO, // single axis
+ Keyboard8426,
+ Keyboard7193,
+ KeyboardPeriodComma, // single axis
+ KeyboardBrackets,
+ KeyBoardHomeEndPgUpPgDown,
+
+ Mouse,
+ MouseScroll, // single axis
+
+ None
+ }
+
+ ///
+ /// Each input axis, x, y, or z, will get mapped to an output axis, with potential inversion
+ ///
+ public enum AxisDestination
+ {
+ PositiveX,
+ NegativeX,
+ PositiveY,
+ NegativeY,
+ PositiveZ,
+ NegativeZ,
+ None
+ }
+
+ public float SensitivityScale = 3.0f;
+
+ [Tooltip("Use unscaled time. This is useful for games that have a pause mechanism or otherwise adjust the game timescale.")]
+ public bool UseUnscaledTime = true;
+
+ public AxisType axisType = AxisType.Mouse;
+ public ButtonController.ButtonType buttonType = ButtonController.ButtonType.None;
+
+ public string InputManagerHorizontalAxisName;
+ public string InputManagerVerticalAxisName;
+
+ public AxisDestination Axis0Destination = AxisDestination.PositiveX;
+ public AxisDestination Axis1Destination = AxisDestination.PositiveY;
+ public AxisDestination Axis2Destination = AxisDestination.None;
+
+ private Vector3 lastMousePosition = Vector3.zero;
+
+ private const float MouseSensitivity = 0.015f; // always affects the mouse sensitivity
+ private const float MouseUnlockedSensitivity = 0.1f; // affects the sensitivity when using the mouse buttons
+ private const float KeyboardSensitivity = 10.0f;
+ private const float InputManagerAxisSensitivity = 0.05f;
+
+ private bool isMouseJumping = false;
+ private bool appHasFocus = true;
+ private bool usingMouse = false;
+
+ private bool inputManagerAxesNeedApproval = true;
+ private bool inputManagerHorizontalAxisApproved = false;
+ private bool inputManagerVerticalAxisApproved = false;
+
+ public bool AxisTypeIsKeyboard
+ {
+ get { return AxisType.KeyboardArrows <= axisType && axisType <= AxisType.KeyBoardHomeEndPgUpPgDown; }
+ }
+ public bool AxisTypeIsInputManagerAxis
+ {
+ get { return axisType == AxisType.InputManagerAxis; }
+ }
+ public bool AxisTypeIsMouse
+ {
+ get { return axisType == AxisType.Mouse; }
+ }
+ public bool AxisTypeIsMouseScroll
+ {
+ get { return axisType == AxisType.MouseScroll; }
+ }
+
+ public void EnableAndCheck(bool value)
+ {
+ this.enabled = value;
+ if (value)
+ {
+ InputManagerAxisCheck();
+ }
+ }
+
+ private void Awake()
+ {
+ // AxisController is for development only and should not exist--and certainly not be used--in
+ // any non-Editor scenario.
+#if !UNITY_EDITOR
+ Destroy(this);
+#else
+ // Workaround for Remote Desktop. Ctrl-mouse, Shift-mouse, and Alt-mouse don't work, so they should be avoided.
+ if (IsRunningUnderRemoteDesktop())
+ {
+ if (this.buttonType == ButtonController.ButtonType.Control)
+ {
+ this.buttonType = ButtonController.ButtonType.Left;
+ Debug.LogWarning("Running under Remote Desktop, so changed AxisContol method to Left mouse button");
+ }
+ if (this.buttonType == ButtonController.ButtonType.Alt)
+ {
+ this.buttonType = ButtonController.ButtonType.Right;
+ Debug.LogWarning("Running under Remote Desktop, so changed AxisContol method to Right mouse button");
+ }
+ if (this.buttonType == ButtonController.ButtonType.Shift)
+ {
+ this.buttonType = ButtonController.ButtonType.Middle;
+ Debug.LogWarning("Running under Remote Desktop, so changed AxisContol method to Middle mouse button");
+ }
+ }
+
+ UnityEngine.Cursor.lockState = CursorLockMode.None;
+ UnityEngine.Cursor.visible = true;
+#endif
+ }
+
+ private static float InputCurve(float x)
+ {
+ // smoothing input curve, converts from [-1,1] to [-2,2]
+ return (Mathf.Sign(x) * (1.0f - Mathf.Cos(.5f * Mathf.PI * Mathf.Clamp(x, -1.0f, 1.0f))));
+ }
+
+ ///
+ /// Get a Vector3 populated with axis mapped displacements.
+ ///
+ public Vector3 GetDisplacementVector3()
+ {
+ Vector3 source = GetDisplacement();
+ Vector3 dest = Vector3.zero;
+ RemapAdditive(source, 0, ref dest, Axis0Destination);
+ RemapAdditive(source, 1, ref dest, Axis1Destination);
+ RemapAdditive(source, 2, ref dest, Axis2Destination);
+ return dest;
+ }
+
+ ///
+ /// Get a Vector2 populated with axis mapped displacements.
+ ///
+ public Vector2 GetDisplacementVector2()
+ {
+ Vector3 source = GetDisplacement();
+ Vector3 middle = Vector3.zero;
+ Vector2 dest = Vector2.zero;
+ RemapAdditive(source, 0, ref middle, Axis0Destination);
+ RemapAdditive(source, 1, ref middle, Axis1Destination);
+ dest[0] = middle[0];
+ dest[1] = middle[1];
+ return dest;
+ }
+
+ ///
+ /// Get a float populated with axis mapped displacements.
+ ///
+ public float GetDisplacementFloat()
+ {
+ Vector3 source = GetDisplacement();
+ Vector3 middle = Vector2.zero;
+ RemapAdditive(source, 0, ref middle, Axis0Destination);
+ return middle[0];
+ }
+
+ private void RemapAdditive(Vector3 source, int sourceDim, ref Vector3 dest, AxisDestination destDim)
+ {
+ float inp = source[sourceDim];
+ if (destDim == AxisDestination.NegativeX || destDim == AxisDestination.NegativeY || destDim == AxisDestination.NegativeZ)
+ {
+ inp = -inp;
+ }
+ if (destDim == AxisDestination.PositiveX || destDim == AxisDestination.NegativeX)
+ {
+ dest[0] += inp;
+ }
+ else if (destDim == AxisDestination.PositiveY || destDim == AxisDestination.NegativeY)
+ {
+ dest[1] += inp;
+ }
+ else if (destDim == AxisDestination.PositiveZ || destDim == AxisDestination.NegativeZ)
+ {
+ dest[2] += inp;
+ }
+ }
+
+ private Vector3 GetDisplacement()
+ {
+ Vector3 rot = Vector3.zero;
+
+ // this check enables us to check the InputManagerAxes names when we are switching on the fly
+ if (!AxisTypeIsInputManagerAxis)
+ {
+ inputManagerAxesNeedApproval = true;
+ }
+
+ // Now check to see what sort of input we have, and dispatch the appropriate LookTick routine
+ if (AxisTypeIsInputManagerAxis)
+ {
+ if (inputManagerAxesNeedApproval)
+ {
+ InputManagerAxisCheck();
+ }
+ if (ShouldControl())
+ {
+ rot = InputManagerAxisLookTick();
+ }
+ }
+ else if (AxisTypeIsKeyboard)
+ {
+ if (ShouldControl())
+ rot = KeyboardLookTick();
+ }
+ else if (AxisTypeIsMouseScroll)
+ {
+ if (ShouldControl())
+ rot.x += Input.GetAxis("Mouse ScrollWheel");
+ }
+ else if (AxisTypeIsMouse)
+ {
+ if (ShouldControl())
+ {
+ if (!this.usingMouse)
+ {
+ OnStartMouseLook();
+ this.usingMouse = true;
+ }
+ rot = MouseLookTick();
+ }
+ else
+ {
+ if (this.usingMouse)
+ {
+ OnEndMouseLook();
+ this.usingMouse = false;
+ }
+ }
+ }
+
+ rot *= this.SensitivityScale;
+ return rot;
+ }
+
+ private void OnStartMouseLook()
+ {
+ if (this.buttonType <= ButtonController.ButtonType.Middle)
+ {
+ // if mousebutton is either left, right or middle
+ SetWantsMouseJumping(true);
+ }
+ else if (this.buttonType <= ButtonController.ButtonType.Focused)
+ {
+ // if mousebutton is either control, shift or focused
+ UnityEngine.Cursor.lockState = CursorLockMode.Locked;
+ UnityEngine.Cursor.visible = false;
+ }
+
+ // do nothing if (this.MouseLookButton == MouseButton.None)
+ }
+
+ private void OnEndMouseLook()
+ {
+ if (this.buttonType <= ButtonController.ButtonType.Middle)
+ {
+ // if mousebutton is either left, right or middle
+ SetWantsMouseJumping(false);
+ }
+ else if (this.buttonType <= ButtonController.ButtonType.Focused)
+ {
+ // if mousebutton is either control, shift or focused
+ UnityEngine.Cursor.lockState = CursorLockMode.None;
+ UnityEngine.Cursor.visible = true;
+ }
+
+ // do nothing if (this.MouseLookButton == MouseButton.None)
+ }
+
+ private Vector3 MouseLookTick()
+ {
+ Vector3 rot = Vector3.zero;
+
+ // Use frame-to-frame mouse delta in pixels to determine mouse rotation. The traditional
+ // GetAxis("Mouse X") method doesn't work under Remote Desktop.
+ Vector3 mousePositionDelta = Input.mousePosition - this.lastMousePosition;
+ this.lastMousePosition = Input.mousePosition;
+
+ if (UnityEngine.Cursor.lockState == CursorLockMode.Locked)
+ {
+ mousePositionDelta.x = Input.GetAxis("Mouse X");
+ mousePositionDelta.y = Input.GetAxis("Mouse Y");
+ }
+ else
+ {
+ mousePositionDelta.x *= MouseUnlockedSensitivity;
+ mousePositionDelta.y *= MouseUnlockedSensitivity;
+ }
+
+ rot.x += -InputCurve(mousePositionDelta.y) * MouseSensitivity;
+ rot.y += InputCurve(mousePositionDelta.x) * MouseSensitivity;
+ return rot;
+ }
+
+ private float GetKeyDir(KeyCode neg, KeyCode pos)
+ {
+ return Input.GetKey(neg) ? -1.0f : Input.GetKey(pos) ? 1.0f : 0.0f;
+ }
+
+ private float GetKeyDir(string neg, string pos)
+ {
+ return Input.GetKey(neg) ? -1.0f : Input.GetKey(pos) ? 1.0f : 0.0f;
+ }
+
+ private void InputManagerAxisCheck()
+ {
+ inputManagerHorizontalAxisApproved = false;
+ inputManagerVerticalAxisApproved = false;
+
+ {
+ inputManagerHorizontalAxisApproved = true;
+ try
+ {
+ Input.GetAxis(InputManagerHorizontalAxisName);
+ }
+ catch (Exception)
+ {
+ Debug.LogWarningFormat("Input Axis {0} is not setup. Use Edit -> Project Settings -> Input", InputManagerHorizontalAxisName);
+ inputManagerHorizontalAxisApproved = false;
+ }
+ }
+
+ {
+ inputManagerVerticalAxisApproved = true;
+ try
+ {
+ Input.GetAxis(InputManagerVerticalAxisName);
+ }
+ catch (Exception)
+ {
+ Debug.LogWarningFormat("Input Axis {0} is not setup. Use Edit -> Project Settings -> Input", InputManagerVerticalAxisName);
+ inputManagerVerticalAxisApproved = false;
+ }
+ }
+ inputManagerAxesNeedApproval = false;
+ }
+
+ private Vector3 InputManagerAxisLookTick()
+ {
+ Vector3 rot = Vector3.zero;
+ if (inputManagerHorizontalAxisApproved)
+ {
+ rot.x += InputManagerAxisSensitivity * InputCurve(Input.GetAxis(InputManagerHorizontalAxisName));
+ }
+ if (inputManagerVerticalAxisApproved)
+ {
+ rot.y += InputManagerAxisSensitivity * InputCurve(Input.GetAxis(InputManagerVerticalAxisName));
+ }
+ return rot;
+ }
+
+ private Vector3 KeyboardLookTick()
+ {
+ float deltaTime = UseUnscaledTime
+ ? Time.unscaledDeltaTime
+ : Time.deltaTime;
+
+ Vector3 rot = Vector3.zero;
+ if (axisType == AxisType.KeyboardArrows)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.LeftArrow, KeyCode.RightArrow));
+ rot.y += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.DownArrow, KeyCode.UpArrow));
+ }
+ else if (axisType == AxisType.KeyboardWASD)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.A, KeyCode.D));
+ rot.y += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.S, KeyCode.W));
+ }
+ else if (axisType == AxisType.KeyboardQE)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.Q, KeyCode.E));
+ }
+ else if (axisType == AxisType.KeyboardIJKL)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.J, KeyCode.L));
+ rot.y += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.K, KeyCode.I));
+ }
+ else if (axisType == AxisType.KeyboardUO)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.U, KeyCode.O));
+ }
+ else if (axisType == AxisType.Keyboard8426)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.Keypad4, KeyCode.Keypad6));
+ rot.y += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.Keypad2, KeyCode.Keypad8));
+ }
+ else if (axisType == AxisType.Keyboard7193)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.Keypad1, KeyCode.Keypad7));
+ rot.y += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.Keypad3, KeyCode.Keypad9));
+ }
+ else if (axisType == AxisType.KeyboardPeriodComma)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.Comma, KeyCode.Period));
+ }
+ else if (axisType == AxisType.KeyboardBrackets)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.LeftBracket, KeyCode.RightBracket));
+ }
+ else if (axisType == AxisType.KeyBoardHomeEndPgUpPgDown)
+ {
+ rot.x += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.End, KeyCode.Home));
+ rot.y += InputCurve(deltaTime * KeyboardSensitivity * GetKeyDir(KeyCode.PageDown, KeyCode.PageUp));
+ }
+ return rot;
+ }
+
+ ///
+ /// Only allow the mouse to control rotation when Unity has focus. This enables
+ /// the player to temporarily alt-tab away without having the player look around randomly
+ /// back in the Unity Game window.
+ ///
+ /// Whether the user is holding down the control button.
+ public bool ShouldControl()
+ {
+ if (!this.appHasFocus)
+ {
+ return false;
+ }
+ else if (this.buttonType == ButtonController.ButtonType.None)
+ {
+ return true;
+ }
+ else if (this.buttonType <= ButtonController.ButtonType.Middle)
+ {
+ return Input.GetMouseButton((int)this.buttonType);
+ }
+ else if (this.buttonType == ButtonController.ButtonType.Control)
+ {
+ return Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl);
+ }
+ else if (this.buttonType == ButtonController.ButtonType.Shift)
+ {
+ return Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
+ }
+ else if (this.buttonType == ButtonController.ButtonType.Alt)
+ {
+ return Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt);
+ }
+ else if (this.buttonType == ButtonController.ButtonType.Space)
+ {
+ return Input.GetKey(KeyCode.Space);
+ }
+ else if (this.buttonType == ButtonController.ButtonType.Return)
+ {
+ return Input.GetKey(KeyCode.Return);
+ }
+ else if (this.buttonType == ButtonController.ButtonType.Focused)
+ {
+ if (!this.usingMouse)
+ {
+ // any kind of click will capture focus
+ return Input.GetMouseButtonDown((int)ButtonController.ButtonType.Left)
+ || Input.GetMouseButtonDown((int)ButtonController.ButtonType.Right)
+ || Input.GetMouseButtonDown((int)ButtonController.ButtonType.Middle);
+ }
+ else
+ {
+ // pressing escape will stop capture
+ return !Input.GetKeyDown(KeyCode.Escape);
+ }
+ }
+
+ return false;
+ }
+
+ private void OnApplicationFocus(bool focusStatus)
+ {
+ this.appHasFocus = focusStatus;
+ }
+
+ ///
+ /// Mouse jumping is typically used during one of the mouse button modes.
+ /// It means that the cursor will be invisible when it is outside of the
+ /// Unity game view window, and visible when it breaches the outer edges.
+ ///
+ /// Wheter the mouse cursor should be visible over the game window.
+ private void SetWantsMouseJumping(bool wantsJumping)
+ {
+ if (wantsJumping != this.isMouseJumping)
+ {
+ this.isMouseJumping = wantsJumping;
+
+ if (wantsJumping)
+ {
+ // unlock the cursor if it was locked
+ UnityEngine.Cursor.lockState = CursorLockMode.None;
+
+ // hide the cursor
+ UnityEngine.Cursor.visible = false;
+
+ this.lastMousePosition = Input.mousePosition;
+ }
+ else
+ {
+ // recenter the cursor (setting lockCursor has side-effects under the hood)
+ UnityEngine.Cursor.lockState = CursorLockMode.Locked;
+ UnityEngine.Cursor.lockState = CursorLockMode.None;
+
+ // show the cursor
+ UnityEngine.Cursor.visible = true;
+ }
+
+#if UNITY_EDITOR
+ UnityEditor.EditorGUIUtility.SetWantsMouseJumping(wantsJumping ? 1 : 0);
+#endif
+ }
+ }
+
+#if UNITY_EDITOR
+ [System.Runtime.InteropServices.DllImport("kernel32.dll")]
+ private static extern uint GetCurrentProcessId();
+
+ [System.Runtime.InteropServices.DllImport("kernel32.dll")]
+ private static extern bool ProcessIdToSessionId(uint dwProcessId, out uint pSessionId);
+
+ [System.Runtime.InteropServices.DllImport("kernel32.dll")]
+ private static extern uint WTSGetActiveConsoleSessionId();
+
+ private bool IsRunningUnderRemoteDesktop()
+ {
+ uint processId = GetCurrentProcessId();
+ uint sessionId;
+ return ProcessIdToSessionId(processId, out sessionId) && (sessionId != WTSGetActiveConsoleSessionId());
+ }
+#else
+ private bool IsRunningUnderRemoteDesktop()
+ {
+ return false;
+ }
+#endif
+ }
+
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/AxisController.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/AxisController.cs.meta
new file mode 100644
index 0000000..5e26026
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/AxisController.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d1b627838df61e64baecc87fee2dec17
+timeCreated: 1463176599
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ButtonController.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ButtonController.cs
new file mode 100644
index 0000000..6d24696
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ButtonController.cs
@@ -0,0 +1,173 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+
+ ///
+ /// ButtonController provides a per key or button component for the Manual input Controls
+ /// in the Unity Editor, used to simulate actual HoloLens behavior.
+ ///
+ public class ButtonController : MonoBehaviour
+ {
+ ///
+ /// These enums allow us to activate an axis only by a key press, such as CTRL mouse or ALT mouse
+ ///
+ public enum ButtonType
+ {
+ Left,
+ Right,
+ Middle,
+ Control,
+ Shift,
+ Alt,
+ Space,
+ Return,
+ Focused,
+ ControlAndLeft,
+ ControlAndRight,
+ ControlAndMiddle,
+ ShiftAndLeft,
+ ShiftAndRight,
+ ShiftAndMiddle,
+ AltAndLeft,
+ AltAndRight,
+ AltAndMiddle,
+ SpaceAndLeft,
+ SpaceAndRight,
+ SpaceAndMiddle,
+ None
+ }
+
+ ///
+ /// Type of button used for activation.
+ ///
+ public ButtonType buttonType = ButtonType.None;
+
+ private bool appHasFocus = true;
+
+ private void Awake()
+ {
+ // ButtonController is for development only and should not exist--and certainly not be used--in
+ // any non-Editor scenario.
+#if !UNITY_EDITOR
+ Destroy(this);
+#else
+ // Workaround for Remote Desktop. Ctrl-mouse, Shift-mouse, and Alt-mouse don't work, so they should be avoided.
+ if (IsRunningUnderRemoteDesktop())
+ {
+ if (this.buttonType == ButtonType.Control)
+ {
+ this.buttonType = ButtonType.Left;
+ Debug.LogWarning("Running under Remote Desktop, so changed ButtonController method to Left mouse button");
+ }
+ if (this.buttonType == ButtonType.Alt)
+ {
+ this.buttonType = ButtonType.Right;
+ Debug.LogWarning("Running under Remote Desktop, so changed ButtonController method to Right mouse button");
+ }
+ if (this.buttonType == ButtonType.Shift)
+ {
+ this.buttonType = ButtonType.Middle;
+ Debug.LogWarning("Running under Remote Desktop, so changed ButtonController method to Middle mouse button");
+ }
+ }
+#endif
+ }
+
+ ///
+ /// Returns true if the configured button is currently pressed.
+ ///
+ /// True if pressed.
+ public bool Pressed()
+ {
+ bool left = Input.GetMouseButton(0);
+ bool right = Input.GetMouseButton(1);
+ bool middle = Input.GetMouseButton(2);
+ bool control = Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl);
+ bool shift = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
+ bool alt = Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt);
+ bool space = Input.GetKey(KeyCode.Space);
+ switch (buttonType)
+ {
+ case ButtonType.Left:
+ return left;
+ case ButtonType.Right:
+ return right;
+ case ButtonType.Middle:
+ return middle;
+ case ButtonType.Control:
+ return control;
+ case ButtonType.Shift:
+ return shift;
+ case ButtonType.Alt:
+ return alt;
+ case ButtonType.Space:
+ return space;
+ case ButtonType.Return:
+ return Input.GetKey(KeyCode.Return);
+ case ButtonType.Focused:
+ return this.appHasFocus;
+ case ButtonType.ControlAndLeft:
+ return control && left;
+ case ButtonType.ControlAndRight:
+ return control && right;
+ case ButtonType.ControlAndMiddle:
+ return control && middle;
+ case ButtonType.ShiftAndLeft:
+ return shift && left;
+ case ButtonType.ShiftAndRight:
+ return shift && right;
+ case ButtonType.ShiftAndMiddle:
+ return shift && middle;
+ case ButtonType.AltAndLeft:
+ return alt && left;
+ case ButtonType.AltAndRight:
+ return alt && right;
+ case ButtonType.AltAndMiddle:
+ return alt && middle;
+ case ButtonType.SpaceAndLeft:
+ return space && left;
+ case ButtonType.SpaceAndRight:
+ return space && right;
+ case ButtonType.SpaceAndMiddle:
+ return space && middle;
+ case ButtonType.None:
+ default:
+ return false;
+ };
+ }
+
+ private void OnApplicationFocus(bool focusStatus)
+ {
+ this.appHasFocus = focusStatus;
+ }
+
+#if UNITY_EDITOR
+ [System.Runtime.InteropServices.DllImport("kernel32.dll")]
+ private static extern uint GetCurrentProcessId();
+
+ [System.Runtime.InteropServices.DllImport("kernel32.dll")]
+ private static extern bool ProcessIdToSessionId(uint dwProcessId, out uint pSessionId);
+
+ [System.Runtime.InteropServices.DllImport("kernel32.dll")]
+ private static extern uint WTSGetActiveConsoleSessionId();
+
+ private bool IsRunningUnderRemoteDesktop()
+ {
+ uint processId = GetCurrentProcessId();
+ uint sessionId;
+ return ProcessIdToSessionId(processId, out sessionId) && (sessionId != WTSGetActiveConsoleSessionId());
+ }
+#else
+ private bool IsRunningUnderRemoteDesktop()
+ {
+ return false;
+ }
+#endif
+
+ }
+
+} // namespace
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ButtonController.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ButtonController.cs.meta
new file mode 100644
index 0000000..b24fd0e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ButtonController.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1350e83623c005741ad0d1b09834ed62
+timeCreated: 1463182826
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualGazeControl.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualGazeControl.cs
new file mode 100644
index 0000000..34aacb3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualGazeControl.cs
@@ -0,0 +1,123 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// Class for manually controlling the camera when not running on HoloLens (in editor).
+ /// Attach to same main camera game object.
+ ///
+ public class ManualGazeControl : MonoBehaviour
+ {
+ public bool MouseSupported = true;
+ public AxisController MouseXYRotationAxisControl;
+ public AxisController MouseXYTranslationAxisControl;
+ public AxisController MouseXZTranslationAxisControl;
+
+ public bool KeyboardSupported = true;
+ public AxisController KeyboardXYRotationAxisControl;
+ public AxisController KeyboardXZRotationAxisControl;
+ public AxisController KeyboardXYTranslationAxisControl;
+ public AxisController KeyboardXZTranslationAxisControl;
+
+ public bool JoystickSupported = false;
+ public AxisController JoystickXYRotationAxisControl;
+ public AxisController JoystickXYTranslationAxisControl;
+ public AxisController JoystickXZTranslationAxisControl;
+
+ private Vector3 lastTrackerToUnityTranslation = Vector3.zero;
+ private Quaternion lastTrackerToUnityRotation = Quaternion.identity;
+
+ private Transform cameraTransform;
+
+ private void Awake()
+ {
+#if !UNITY_EDITOR
+ Destroy(this);
+#endif
+ cameraTransform = GetComponent().transform;
+ if (cameraTransform == null)
+ {
+ Debug.LogError("ManualGazeControl being used on a game object without a Camera.");
+ }
+
+ MouseXYRotationAxisControl.enabled = MouseSupported;
+ MouseXYTranslationAxisControl.enabled = MouseSupported;
+ MouseXZTranslationAxisControl.enabled = MouseSupported;
+
+ KeyboardXYRotationAxisControl.enabled = KeyboardSupported;
+ KeyboardXZRotationAxisControl.enabled = KeyboardSupported;
+ KeyboardXYTranslationAxisControl.enabled = KeyboardSupported;
+ KeyboardXZTranslationAxisControl.enabled = KeyboardSupported;
+
+ JoystickXYRotationAxisControl.enabled = JoystickSupported;
+ JoystickXYTranslationAxisControl.enabled = JoystickSupported;
+ JoystickXZTranslationAxisControl.enabled = JoystickSupported;
+
+ }
+
+ private void Update()
+ {
+ // Undo the last tracker to Unity transforms applied.
+ cameraTransform.Translate(-this.lastTrackerToUnityTranslation, Space.World);
+ cameraTransform.Rotate(-this.lastTrackerToUnityRotation.eulerAngles, Space.World);
+
+ // Undo the last local Z-axis tilt rotation.
+ float previousZTilt = this.transform.localEulerAngles.z;
+ cameraTransform.Rotate(0, 0, -previousZTilt, Space.Self);
+
+ // Calculate and apply the camera control movement this frame
+ Vector3 rotate = Vector3.zero;
+ Vector3 translate = Vector3.zero;
+
+ if (MouseSupported)
+ {
+ Vector3 mouseXYRotate = MouseXYRotationAxisControl.GetDisplacementVector3();
+ Vector3 mouseXYTranslate = MouseXYTranslationAxisControl.GetDisplacementVector3();
+ Vector3 mouseXZTranslate = MouseXZTranslationAxisControl.GetDisplacementVector3();
+ rotate += mouseXYRotate;
+ translate += mouseXYTranslate;
+ translate += mouseXZTranslate;
+ }
+
+ if (KeyboardSupported)
+ {
+ Vector3 keyboardXYRotate = KeyboardXYRotationAxisControl.GetDisplacementVector3();
+ Vector3 keyboardXZRotate = KeyboardXZRotationAxisControl.GetDisplacementVector3();
+ Vector3 keyboardXYTranslate = KeyboardXYTranslationAxisControl.GetDisplacementVector3();
+ Vector3 keyboardXZTranslate = KeyboardXZTranslationAxisControl.GetDisplacementVector3();
+ rotate += keyboardXYRotate;
+ rotate += keyboardXZRotate;
+ translate += keyboardXYTranslate;
+ translate += keyboardXZTranslate;
+ }
+
+ if (JoystickSupported)
+ {
+ Vector3 joystickXYRotate = JoystickXYRotationAxisControl.GetDisplacementVector3();
+ Vector3 joystickXYTranslate = JoystickXYTranslationAxisControl.GetDisplacementVector3();
+ Vector3 joystickXZTranslate = JoystickXZTranslationAxisControl.GetDisplacementVector3();
+ rotate += joystickXYRotate;
+ translate += joystickXYTranslate;
+ translate += joystickXZTranslate;
+ }
+
+ rotate *= Mathf.Rad2Deg; // change to degrees for the Rotate function
+
+ // Now apply the displacements to the camera
+ cameraTransform.Rotate(rotate.x, 0.0f, 0.0f, Space.Self);
+ cameraTransform.Rotate(0.0f, rotate.y, 0.0f, Space.World);
+ cameraTransform.Translate(translate, Space.Self);
+
+ // Apply updated local Z-axis tilt rotation.
+ cameraTransform.Rotate(0.0f, 0.0f, rotate.z + previousZTilt, Space.Self);
+
+ // Re-apply the last tracker to Unity transform.
+ cameraTransform.Rotate(this.lastTrackerToUnityRotation.eulerAngles, Space.World);
+ cameraTransform.Translate(this.lastTrackerToUnityTranslation, Space.World);
+ }
+ }
+
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualGazeControl.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualGazeControl.cs.meta
new file mode 100644
index 0000000..e968d38
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualGazeControl.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9cf6ab24363b7a74da25766ea8ba6809
+timeCreated: 1464208473
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualHandControl.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualHandControl.cs
new file mode 100644
index 0000000..5bf8826
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualHandControl.cs
@@ -0,0 +1,288 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ public enum ButtonChoices
+ {
+ Left,
+ Right,
+ Middle,
+ Control,
+ Shift,
+ Alt,
+ Focused,
+ None
+ }
+
+ ///
+ /// Since the InteractionSourceState is internal to UnityEngine.VR.WSA.Input,
+ /// this is a fake SourceState structure to keep the test code consistent.
+ ///
+ public struct DebugInteractionSourceState
+ {
+ public bool Pressed;
+ public DebugInteractionSourceProperties Properties;
+ }
+
+ ///
+ /// Since the InteractionSourceProperties is internal to UnityEngine.VR.WSA.Input,
+ /// this is a fake SourceProperties structure to keep the test code consistent.
+ ///
+ public struct DebugInteractionSourceProperties
+ {
+ public DebugInteractionSourceLocation Location;
+ }
+
+ ///
+ /// Since the InteractionSourceLocation is internal to UnityEngine.VR.WSA.Input,
+ /// this is a fake SourceLocation structure to keep the test code consistent.
+ ///
+ public class DebugInteractionSourceLocation
+ {
+ ///
+ /// In the typical InteractionSourceLocation, the hardware determines if
+ /// TryGetPosition and TryGetVelocity will return true or not. Here
+ /// we manually emulate this state with TryGetFunctionsReturnsTrue.
+ ///
+ public bool TryGetFunctionsReturnsTrue;
+
+ public Vector3 Position;
+ public Vector3 Velocity;
+
+ public void Awake()
+ {
+ TryGetFunctionsReturnsTrue = false;
+ Position = new Vector3(0, 0, 0);
+ Velocity = new Vector3(0, 0, 0);
+ }
+
+ public bool TryGetPosition(out Vector3 position)
+ {
+ position = Position;
+ if (!TryGetFunctionsReturnsTrue)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public bool TryGetVelocity(out Vector3 velocity)
+ {
+ velocity = Velocity;
+ if (!TryGetFunctionsReturnsTrue)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ ///
+ /// Class for manually controlling the hand(s) when not running on HoloLens (in editor).
+ ///
+ public class ManualHandControl : MonoBehaviour
+ {
+ public float HandReturnFactor = 0.25f; /// [0.0,1.0] the closer this is to one the faster it brings the hand back to center
+ public float HandTimeBeforeReturn = 0.5f;
+ public float MinimumTrackedMovement = 0.001f;
+
+ [Tooltip("Use unscaled time. This is useful for games that have a pause mechanism or otherwise adjust the game timescale.")]
+ public bool UseUnscaledTime = true;
+
+ public AxisController LeftHandPrimaryAxisControl;
+ public AxisController LeftHandSecondaryAxisControl;
+ public ButtonController LeftFingerUpButtonControl;
+ public ButtonController LeftFingerDownButtonControl;
+
+ public AxisController RightHandPrimaryAxisControl;
+ public AxisController RightHandSecondaryAxisControl;
+ public ButtonController RightFingerUpButtonControl;
+ public ButtonController RightFingerDownButtonControl;
+
+ public DebugInteractionSourceState LeftHandSourceState;
+ public DebugInteractionSourceState RightHandSourceState;
+
+ public Color ActiveHandColor;
+ public Color DroppedHandColor;
+ ///
+ /// Will place hand visualizations in the world space, only for debugging.
+ /// Place the representative GameObjects in LeftHandVisualizer & RightHandVisualizer.
+ ///
+ public bool VisualizeHands = true;
+ public GameObject LeftHandVisualizer;
+ public GameObject RightHandVisualizer;
+
+ public Texture HandUpTexture;
+ public Texture HandDownTexture;
+
+ public bool LeftHandInView;
+ public bool RightHandInView;
+
+ private Vector3 leftHandInitialPosition;
+ private Vector3 rightHandInitialPosition;
+
+ private Vector3 leftHandLocalPosition;
+ private Vector3 rightHandLocalPosition;
+
+ private Renderer leftHandVisualRenderer;
+ private Renderer rightHandVisualRenderer;
+ private MaterialPropertyBlock leftHandVisualPropertyBlock;
+ private MaterialPropertyBlock rightHandVisualPropertyBlock;
+ private int mainTexID;
+ private bool appHasFocus = true;
+
+ private float timeBeforeReturn;
+
+ private void Awake()
+ {
+ mainTexID = Shader.PropertyToID("_MainTex");
+
+ LeftHandSourceState.Pressed = false;
+ LeftHandSourceState.Properties.Location = new DebugInteractionSourceLocation();
+ leftHandLocalPosition = LeftHandVisualizer.transform.position;
+ leftHandInitialPosition = leftHandLocalPosition;
+ LeftHandSourceState.Properties.Location.Position = leftHandLocalPosition;
+ leftHandVisualRenderer = LeftHandVisualizer.GetComponent();
+ leftHandVisualPropertyBlock = new MaterialPropertyBlock();
+ leftHandVisualRenderer.SetPropertyBlock(leftHandVisualPropertyBlock);
+
+ RightHandSourceState.Pressed = false;
+ RightHandSourceState.Properties.Location = new DebugInteractionSourceLocation();
+ rightHandLocalPosition = RightHandVisualizer.transform.position;
+ rightHandInitialPosition = rightHandLocalPosition;
+ RightHandSourceState.Properties.Location.Position = rightHandLocalPosition;
+ rightHandVisualRenderer = RightHandVisualizer.GetComponent();
+ rightHandVisualPropertyBlock = new MaterialPropertyBlock();
+ rightHandVisualRenderer.SetPropertyBlock(rightHandVisualPropertyBlock);
+
+#if !UNITY_EDITOR
+ VisualizeHands = false;
+ UpdateHandVisualization();
+ Destroy(this);
+#endif
+ }
+
+ private void Update()
+ {
+ UpdateHandVisualization();
+
+ float deltaTime = UseUnscaledTime
+ ? Time.unscaledDeltaTime
+ : Time.deltaTime;
+
+ float smoothingFactor = deltaTime * 30.0f * HandReturnFactor;
+ if (timeBeforeReturn > 0.0f)
+ {
+ timeBeforeReturn = Mathf.Clamp(timeBeforeReturn - deltaTime, 0.0f, HandTimeBeforeReturn);
+ }
+
+ LeftHandSourceState.Pressed = LeftFingerDownButtonControl.Pressed();
+ RightHandSourceState.Pressed = RightFingerDownButtonControl.Pressed();
+
+ if (LeftHandSourceState.Pressed || RightHandSourceState.Pressed)
+ {
+ timeBeforeReturn = HandTimeBeforeReturn;
+ }
+
+ if (timeBeforeReturn <= 0.0f)
+ {
+ leftHandLocalPosition = Vector3.Slerp(leftHandLocalPosition, leftHandInitialPosition, smoothingFactor);
+ if (leftHandLocalPosition == leftHandInitialPosition)
+ {
+ LeftHandInView = false;
+ }
+ rightHandLocalPosition = Vector3.Slerp(rightHandLocalPosition, rightHandInitialPosition, smoothingFactor);
+ if (rightHandLocalPosition == rightHandInitialPosition)
+ {
+ RightHandInView = false;
+ }
+ }
+
+ if (appHasFocus)
+ {
+ Vector3 translate1 = LeftHandPrimaryAxisControl.GetDisplacementVector3();
+ Vector3 translate2 = LeftHandSecondaryAxisControl.GetDisplacementVector3();
+ Vector3 translate = translate1 + translate2;
+
+ // If there is a mouse translate with a modifier key and it is held down, do not reset the hand position.
+ bool handTranslateActive =
+ (LeftHandPrimaryAxisControl.axisType == AxisController.AxisType.Mouse && LeftHandPrimaryAxisControl.buttonType != ButtonController.ButtonType.None && LeftHandPrimaryAxisControl.ShouldControl()) ||
+ (LeftHandSecondaryAxisControl.axisType == AxisController.AxisType.Mouse && LeftHandSecondaryAxisControl.buttonType != ButtonController.ButtonType.None && LeftHandSecondaryAxisControl.ShouldControl());
+
+ if (handTranslateActive || LeftHandSourceState.Pressed)
+ {
+ timeBeforeReturn = HandTimeBeforeReturn;
+ LeftHandInView = true;
+ }
+
+ leftHandLocalPosition += translate;
+ LeftHandSourceState.Properties.Location.Position = Camera.main.transform.position + Camera.main.transform.TransformVector(leftHandLocalPosition);
+
+ LeftHandVisualizer.transform.position = LeftHandSourceState.Properties.Location.Position;
+ LeftHandVisualizer.transform.forward = Camera.main.transform.forward;
+
+ leftHandVisualPropertyBlock.SetTexture(mainTexID, LeftHandSourceState.Pressed ? HandDownTexture : HandUpTexture);
+ leftHandVisualRenderer.SetPropertyBlock(leftHandVisualPropertyBlock);
+
+ LeftHandSourceState.Properties.Location.TryGetFunctionsReturnsTrue = LeftHandInView;
+ }
+ else
+ {
+ LeftHandSourceState.Properties.Location.TryGetFunctionsReturnsTrue = false;
+ }
+
+ if (appHasFocus)
+ {
+ Vector3 translate1 = RightHandPrimaryAxisControl.GetDisplacementVector3();
+ Vector3 translate2 = RightHandSecondaryAxisControl.GetDisplacementVector3();
+ Vector3 translate = translate1 + translate2;
+
+
+ bool handTranslateActive =
+ (RightHandPrimaryAxisControl.axisType == AxisController.AxisType.Mouse && RightHandPrimaryAxisControl.buttonType != ButtonController.ButtonType.None && RightHandPrimaryAxisControl.ShouldControl()) ||
+ (RightHandSecondaryAxisControl.axisType == AxisController.AxisType.Mouse && RightHandSecondaryAxisControl.buttonType != ButtonController.ButtonType.None && RightHandSecondaryAxisControl.ShouldControl());
+
+ // If there is a mouse translate with a modifier key and it is held down, do not reset the hand position.
+ if (handTranslateActive || RightHandSourceState.Pressed)
+ {
+ timeBeforeReturn = HandTimeBeforeReturn;
+ RightHandInView = true;
+ }
+
+ rightHandLocalPosition += translate;
+ RightHandSourceState.Properties.Location.Position = Camera.main.transform.position + Camera.main.transform.TransformVector(rightHandLocalPosition);
+
+ RightHandVisualizer.transform.position = RightHandSourceState.Properties.Location.Position;
+ RightHandVisualizer.transform.forward = Camera.main.transform.forward;
+ rightHandVisualPropertyBlock.SetTexture(mainTexID, RightHandSourceState.Pressed ? HandDownTexture : HandUpTexture);
+ rightHandVisualRenderer.SetPropertyBlock(rightHandVisualPropertyBlock);
+
+ RightHandSourceState.Properties.Location.TryGetFunctionsReturnsTrue = RightHandInView;
+ }
+ else
+ {
+ RightHandSourceState.Properties.Location.TryGetFunctionsReturnsTrue = false;
+ }
+ }
+
+ private void UpdateHandVisualization()
+ {
+ leftHandVisualPropertyBlock.SetColor("_Color", LeftHandInView ? ActiveHandColor : DroppedHandColor);
+ rightHandVisualPropertyBlock.SetColor("_Color", RightHandInView ? ActiveHandColor : DroppedHandColor);
+
+ if (LeftHandVisualizer.activeSelf != VisualizeHands)
+ {
+ LeftHandVisualizer.SetActive(VisualizeHands);
+ }
+ if (RightHandVisualizer.activeSelf != VisualizeHands)
+ {
+ RightHandVisualizer.SetActive(VisualizeHands);
+ }
+ }
+ }
+
+}
+
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualHandControl.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualHandControl.cs.meta
new file mode 100644
index 0000000..fd6722d
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Utilities/ManualHandControl.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f5d9d16de978748488d7a8e0daf6e5cf
+timeCreated: 1463005967
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice.meta
new file mode 100644
index 0000000..d95dcd4
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 1e1644ee9122f0947bb1a04f2da54d79
+folderAsset: yes
+timeCreated: 1464209698
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor.meta
new file mode 100644
index 0000000..26b4c3b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 96002e6c3375b69438b84427abc094ac
+folderAsset: yes
+timeCreated: 1481793391
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/KeywordAndKeyCodeDrawer.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/KeywordAndKeyCodeDrawer.cs
new file mode 100644
index 0000000..c22edc2
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/KeywordAndKeyCodeDrawer.cs
@@ -0,0 +1,29 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEngine;
+using UnityEditor;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ [CustomPropertyDrawer(typeof(SpeechInputSource.KeywordAndKeyCode))]
+ public class KeywordAndKeyCodeDrawer : PropertyDrawer
+ {
+ public override void OnGUI(Rect rect, SerializedProperty property, GUIContent content)
+ {
+ EditorGUI.BeginProperty(rect, content, property);
+
+ // calculate field reactangle with half of total drawer length for each
+ float fieldWidth = rect.width * 0.5f;
+ Rect keywordRect = new Rect(rect.x, rect.y, fieldWidth, rect.height);
+ Rect keyCodeRect = new Rect(rect.x + fieldWidth, rect.y, fieldWidth, rect.height);
+
+ // the Keyword field without label
+ EditorGUI.PropertyField(keywordRect, property.FindPropertyRelative("Keyword"), GUIContent.none);
+ // the KeyCode field without label
+ EditorGUI.PropertyField(keyCodeRect, property.FindPropertyRelative("KeyCode"), GUIContent.none);
+
+ EditorGUI.EndProperty();
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/KeywordAndKeyCodeDrawer.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/KeywordAndKeyCodeDrawer.cs.meta
new file mode 100644
index 0000000..9b17e76
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/KeywordAndKeyCodeDrawer.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5d877fc560a8f724fba6dd6e12386516
+timeCreated: 1481795529
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputHandlerEditor.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputHandlerEditor.cs
new file mode 100644
index 0000000..b72c0c0
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputHandlerEditor.cs
@@ -0,0 +1,113 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ [CustomEditor(typeof(SpeechInputHandler))]
+ public class SpeechInputHandlerEditor : Editor
+ {
+ private SerializedProperty keywordsProperty;
+ private string[] registeredKeywords;
+
+ private void OnEnable()
+ {
+ keywordsProperty = serializedObject.FindProperty("keywords");
+ registeredKeywords = RegisteredKeywords().Distinct().ToArray();
+ }
+
+ public override void OnInspectorGUI()
+ {
+ serializedObject.Update();
+ ShowList(keywordsProperty);
+ serializedObject.ApplyModifiedProperties();
+
+ // error and warning messages
+ if (keywordsProperty.arraySize == 0)
+ {
+ EditorGUILayout.HelpBox("No keywords have been assigned!", MessageType.Warning);
+ }
+ else
+ {
+ SpeechInputHandler handler = target as SpeechInputHandler;
+ string duplicateKeyword = handler.keywords.GroupBy(keyword => keyword.Keyword.ToLower()).Where(group => group.Count() > 1).Select(group => group.Key).FirstOrDefault();
+ if (duplicateKeyword != null)
+ {
+ EditorGUILayout.HelpBox("Keyword '" + duplicateKeyword + "' is assigned more than once!", MessageType.Warning);
+ }
+ }
+ }
+
+ private static GUIContent removeButtonContent = new GUIContent("-", "Remove keyword");
+ private static GUIContent addButtonContent = new GUIContent("+", "Add keyword");
+ private static GUILayoutOption miniButtonWidth = GUILayout.Width(20.0f);
+
+ private void ShowList(SerializedProperty list)
+ {
+ EditorGUI.indentLevel++;
+
+ // remove the keywords already assigned from the registered list
+ SpeechInputHandler handler = target as SpeechInputHandler;
+ string[] availableKeywords = registeredKeywords.Except(handler.keywords.Select(keywordAndResponse => keywordAndResponse.Keyword)).ToArray();
+
+ // keyword rows
+ for (int index = 0; index < list.arraySize; index++)
+ {
+ // the element
+ SerializedProperty elementProperty = list.GetArrayElementAtIndex(index);
+ EditorGUILayout.BeginHorizontal();
+ bool elementExpanded = EditorGUILayout.PropertyField(elementProperty);
+ GUILayout.FlexibleSpace();
+ // the remove element button
+ bool elementRemoved = GUILayout.Button(removeButtonContent, EditorStyles.miniButton, miniButtonWidth);
+ if (elementRemoved)
+ {
+ list.DeleteArrayElementAtIndex(index);
+ }
+ EditorGUILayout.EndHorizontal();
+
+ if (!elementRemoved && elementExpanded)
+ {
+ SerializedProperty keywordProperty = elementProperty.FindPropertyRelative("Keyword");
+ string[] keywords = availableKeywords.Concat(new[] { keywordProperty.stringValue }).OrderBy(keyword => keyword).ToArray();
+ int previousSelection = ArrayUtility.IndexOf(keywords, keywordProperty.stringValue);
+ int currentSelection = EditorGUILayout.Popup("Keyword", previousSelection, keywords);
+ if (currentSelection != previousSelection)
+ {
+ keywordProperty.stringValue = keywords[currentSelection];
+ }
+
+ SerializedProperty responseProperty = elementProperty.FindPropertyRelative("Response");
+ EditorGUILayout.PropertyField(responseProperty, true);
+ }
+ }
+
+ // add button row
+ EditorGUILayout.BeginHorizontal();
+ GUILayout.FlexibleSpace();
+ // the add element button
+ if (GUILayout.Button(addButtonContent, EditorStyles.miniButton, miniButtonWidth))
+ {
+ list.InsertArrayElementAtIndex(list.arraySize);
+ }
+ EditorGUILayout.EndHorizontal();
+
+ EditorGUI.indentLevel--;
+ }
+
+ private IEnumerable RegisteredKeywords()
+ {
+ foreach(SpeechInputSource source in Object.FindObjectsOfType())
+ {
+ foreach(SpeechInputSource.KeywordAndKeyCode keywordAndKeyCode in source.Keywords)
+ {
+ yield return keywordAndKeyCode.Keyword;
+ }
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputHandlerEditor.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputHandlerEditor.cs.meta
new file mode 100644
index 0000000..37e0531
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputHandlerEditor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 978dacb7a2cc0fd45aba947d6d966484
+timeCreated: 1482245695
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputSourceEditor.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputSourceEditor.cs
new file mode 100644
index 0000000..803457d
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputSourceEditor.cs
@@ -0,0 +1,84 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using UnityEditor;
+using UnityEngine;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ [CustomEditor(typeof(SpeechInputSource))]
+ public class SpeechInputSourceEditor : Editor
+ {
+ private SerializedProperty recognizerStart;
+ private SerializedProperty keywordsAndKeys;
+
+ private void OnEnable()
+ {
+ recognizerStart = serializedObject.FindProperty("RecognizerStart");
+ keywordsAndKeys = serializedObject.FindProperty("Keywords");
+ }
+
+ public override void OnInspectorGUI()
+ {
+ serializedObject.Update();
+ // the RecognizerStart field
+ EditorGUILayout.PropertyField(recognizerStart);
+ // the Keywords field
+ ShowList(keywordsAndKeys);
+ serializedObject.ApplyModifiedProperties();
+
+ // error and warning messages
+ if (keywordsAndKeys.arraySize == 0)
+ {
+ EditorGUILayout.HelpBox("No keywords have been assigned!", MessageType.Warning);
+ }
+ }
+
+ private static GUIContent removeButtonContent = new GUIContent("-", "Remove keyword");
+ private static GUIContent addButtonContent = new GUIContent("+", "Add keyword");
+ private static GUILayoutOption miniButtonWidth = GUILayout.Width(20.0f);
+
+ private static void ShowList(SerializedProperty list)
+ {
+ // property name with expansion widget
+ EditorGUILayout.PropertyField(list);
+
+ if (list.isExpanded)
+ {
+ EditorGUI.indentLevel++;
+
+ // header row
+ EditorGUILayout.BeginHorizontal();
+ EditorGUILayout.LabelField("Keyword");
+ EditorGUILayout.LabelField("Key Shortcut");
+ EditorGUILayout.EndHorizontal();
+
+ // keyword rows
+ for (int index = 0; index < list.arraySize; index++)
+ {
+ EditorGUILayout.BeginHorizontal();
+ // the element
+ EditorGUILayout.PropertyField(list.GetArrayElementAtIndex(index));
+ // the remove element button
+ if (GUILayout.Button(removeButtonContent, EditorStyles.miniButton, miniButtonWidth))
+ {
+ list.DeleteArrayElementAtIndex(index);
+ }
+ EditorGUILayout.EndHorizontal();
+ }
+
+ // add button row
+ EditorGUILayout.BeginHorizontal();
+ GUILayout.FlexibleSpace();
+ // the add element button
+ if (GUILayout.Button(addButtonContent, EditorStyles.miniButton, miniButtonWidth))
+ {
+ list.InsertArrayElementAtIndex(list.arraySize);
+ }
+ EditorGUILayout.EndHorizontal();
+
+ EditorGUI.indentLevel--;
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputSourceEditor.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputSourceEditor.cs.meta
new file mode 100644
index 0000000..676b61e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/Editor/SpeechInputSourceEditor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ea5e835211b0e9541ba1adb429d80ea3
+timeCreated: 1481793435
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs
new file mode 100644
index 0000000..e7daf9b
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs
@@ -0,0 +1,166 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Events;
+using UnityEngine.Windows.Speech;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// KeywordManager allows you to specify keywords and methods in the Unity
+ /// Inspector, instead of registering them explicitly in code.
+ /// This also includes a setting to either automatically start the
+ /// keyword recognizer or allow your code to start it.
+ ///
+ /// IMPORTANT: Please make sure to add the microphone capability in your app, in Unity under
+ /// Edit -> Project Settings -> Player -> Settings for Windows Store -> Publishing Settings -> Capabilities
+ /// or in your Visual Studio Package.appxmanifest capabilities.
+ ///
+ public partial class KeywordManager : MonoBehaviour
+ {
+ [System.Serializable]
+ public struct KeywordAndResponse
+ {
+ [Tooltip("The keyword to recognize.")]
+ public string Keyword;
+ [Tooltip("The KeyCode to recognize.")]
+ public KeyCode KeyCode;
+ [Tooltip("The UnityEvent to be invoked when the keyword is recognized.")]
+ public UnityEvent Response;
+ }
+
+ // This enumeration gives the manager two different ways to handle the recognizer. Both will
+ // set up the recognizer and add all keywords. The first causes the recognizer to start
+ // immediately. The second allows the recognizer to be manually started at a later time.
+ public enum RecognizerStartBehavior { AutoStart, ManualStart };
+
+ [Tooltip("An enumeration to set whether the recognizer should start on or off.")]
+ public RecognizerStartBehavior RecognizerStart;
+
+ [Tooltip("An array of string keywords and UnityEvents, to be set in the Inspector.")]
+ public KeywordAndResponse[] KeywordsAndResponses;
+
+ private KeywordRecognizer keywordRecognizer;
+ private readonly Dictionary responses = new Dictionary();
+
+ void Start()
+ {
+ int keywordCount = KeywordsAndResponses.Length;
+ if (keywordCount > 0)
+ {
+ try
+ {
+ string[] keywords = new string[keywordCount];
+ // Convert the struct array into a dictionary, with the keywords and the keys and the methods as the values.
+ // This helps easily link the keyword recognized to the UnityEvent to be invoked.
+ for (int index = 0; index < keywordCount; index++)
+ {
+ KeywordAndResponse keywordAndResponse = KeywordsAndResponses[index];
+ responses[keywordAndResponse.Keyword] = keywordAndResponse.Response;
+ keywords[index] = keywordAndResponse.Keyword;
+ }
+
+ keywordRecognizer = new KeywordRecognizer(keywords);
+ keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
+
+ if (RecognizerStart == RecognizerStartBehavior.AutoStart)
+ {
+ keywordRecognizer.Start();
+ }
+ }
+ catch (ArgumentException)
+ {
+ Debug.LogError("Duplicate keywords specified in the Inspector on " + gameObject.name + ".");
+ }
+ }
+ else
+ {
+ Debug.LogError("Must have at least one keyword specified in the Inspector on " + gameObject.name + ".");
+ }
+ }
+
+ void Update()
+ {
+ if (keywordRecognizer != null && keywordRecognizer.IsRunning)
+ {
+ ProcessKeyBindings();
+ }
+ }
+
+ void OnDestroy()
+ {
+ if (keywordRecognizer != null)
+ {
+ StopKeywordRecognizer();
+ keywordRecognizer.OnPhraseRecognized -= KeywordRecognizer_OnPhraseRecognized;
+ keywordRecognizer.Dispose();
+ }
+ }
+
+ void OnDisable()
+ {
+ if (keywordRecognizer != null)
+ {
+ StopKeywordRecognizer();
+ }
+ }
+
+ void OnEnable()
+ {
+ if (keywordRecognizer != null && RecognizerStart == RecognizerStartBehavior.AutoStart)
+ {
+ StartKeywordRecognizer();
+ }
+ }
+
+ private void ProcessKeyBindings()
+ {
+ foreach (var kvp in KeywordsAndResponses)
+ {
+ if (Input.GetKeyDown(kvp.KeyCode))
+ {
+ kvp.Response.Invoke();
+ return;
+ }
+ }
+ }
+
+ private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
+ {
+ UnityEvent keywordResponse;
+
+ // Check to make sure the recognized keyword exists in the methods dictionary, then invoke the corresponding method.
+ if (responses.TryGetValue(args.text, out keywordResponse))
+ {
+ keywordResponse.Invoke();
+ }
+ }
+
+ ///
+ /// Make sure the keyword recognizer is off, then start it.
+ /// Otherwise, leave it alone because it's already in the desired state.
+ ///
+ public void StartKeywordRecognizer()
+ {
+ if (keywordRecognizer != null && !keywordRecognizer.IsRunning)
+ {
+ keywordRecognizer.Start();
+ }
+ }
+
+ ///
+ /// Make sure the keyword recognizer is on, then stop it.
+ /// Otherwise, leave it alone because it's already in the desired state.
+ ///
+ public void StopKeywordRecognizer()
+ {
+ if (keywordRecognizer != null && keywordRecognizer.IsRunning)
+ {
+ keywordRecognizer.Stop();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs.meta
new file mode 100644
index 0000000..557b252
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 3f2795b3e072e1745a4f8c670d64284f
+timeCreated: 1455735877
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputHandler.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputHandler.cs
new file mode 100644
index 0000000..07c9735
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputHandler.cs
@@ -0,0 +1,60 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ public class SpeechInputHandler : MonoBehaviour, ISpeechHandler
+ {
+ [System.Serializable]
+ public struct KeywordAndResponse
+ {
+ [Tooltip("The keyword to handle.")]
+ public string Keyword;
+ [Tooltip("The handler to be invoked.")]
+ public UnityEvent Response;
+ }
+
+ [Tooltip("The keywords to be recognized and optional keyboard shortcuts.")]
+ public KeywordAndResponse[] keywords;
+
+ [NonSerialized]
+ private readonly Dictionary responses = new Dictionary();
+
+ // Use this for initialization
+ protected virtual void Start()
+ {
+ // Convert the struct array into a dictionary, with the keywords and the methods as the values.
+ // This helps easily link the keyword recognized to the UnityEvent to be invoked.
+ int keywordCount = keywords.Length;
+ for (int index = 0; index < keywordCount; index++)
+ {
+ KeywordAndResponse keywordAndResponse = keywords[index];
+ string keyword = keywordAndResponse.Keyword.ToLower();
+ if (responses.ContainsKey(keyword))
+ {
+ Debug.LogError("Duplicate keyword '" + keyword + "' specified in '" + gameObject.name + "'.");
+ }
+ else
+ {
+ responses.Add(keyword, keywordAndResponse.Response);
+ }
+ }
+ }
+
+ void ISpeechHandler.OnSpeechKeywordRecognized(SpeechKeywordRecognizedEventData eventData)
+ {
+ UnityEvent keywordResponse;
+
+ // Check to make sure the recognized keyword exists in the methods dictionary, then invoke the corresponding method.
+ if (enabled && responses.TryGetValue(eventData.RecognizedText.ToLower(), out keywordResponse))
+ {
+ keywordResponse.Invoke();
+ }
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputHandler.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputHandler.cs.meta
new file mode 100644
index 0000000..347f8ed
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e7d6513c2cdf97f409654a2a4114d9b1
+timeCreated: 1482243203
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputSource.cs b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputSource.cs
new file mode 100644
index 0000000..d763199
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputSource.cs
@@ -0,0 +1,182 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using UnityEngine;
+using UnityEngine.EventSystems;
+using UnityEngine.Windows.Speech;
+
+namespace HoloToolkit.Unity.InputModule
+{
+ ///
+ /// SpeechInputSource allows you to specify keywords and methods in the Unity
+ /// Inspector, instead of registering them explicitly in code.
+ /// This also includes a setting to either automatically start the
+ /// keyword recognizer or allow your code to start it.
+ ///
+ /// IMPORTANT: Please make sure to add the microphone capability in your app, in Unity under
+ /// Edit -> Project Settings -> Player -> Settings for Windows Store -> Publishing Settings -> Capabilities
+ /// or in your Visual Studio Package.appxmanifest capabilities.
+ ///
+ public partial class SpeechInputSource : BaseInputSource
+ {
+ [System.Serializable]
+ public struct KeywordAndKeyCode
+ {
+ [Tooltip("The keyword to recognize.")]
+ public string Keyword;
+ [Tooltip("The KeyCode to recognize.")]
+ public KeyCode KeyCode;
+ }
+
+ // This enumeration gives the manager two different ways to handle the recognizer. Both will
+ // set up the recognizer and add all keywords. The first causes the recognizer to start
+ // immediately. The second allows the recognizer to be manually started at a later time.
+ public enum RecognizerStartBehavior { AutoStart, ManualStart };
+
+ [Tooltip("Whether the recognizer should be activated on start.")]
+ public RecognizerStartBehavior RecognizerStart;
+
+ [Tooltip("The keywords to be recognized and optional keyboard shortcuts.")]
+ public KeywordAndKeyCode[] Keywords;
+
+ private KeywordRecognizer keywordRecognizer;
+
+ private SpeechKeywordRecognizedEventData speechKeywordRecognizedEventData;
+
+ protected override void Start()
+ {
+ base.Start();
+
+ speechKeywordRecognizedEventData = new SpeechKeywordRecognizedEventData(EventSystem.current);
+
+ int keywordCount = Keywords.Length;
+ if (keywordCount > 0)
+ {
+ string[] keywords = new string[keywordCount];
+ for (int index = 0; index < keywordCount; index++)
+ {
+ keywords[index] = Keywords[index].Keyword;
+ }
+ keywordRecognizer = new KeywordRecognizer(keywords);
+ keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
+
+ if (RecognizerStart == RecognizerStartBehavior.AutoStart)
+ {
+ keywordRecognizer.Start();
+ }
+ }
+ else
+ {
+ Debug.LogError("Must have at least one keyword specified in the Inspector on " + gameObject.name + ".");
+ }
+ }
+
+ protected virtual void Update()
+ {
+ if (keywordRecognizer != null && keywordRecognizer.IsRunning)
+ {
+ ProcessKeyBindings();
+ }
+ }
+
+ protected virtual void OnDestroy()
+ {
+ if (keywordRecognizer != null)
+ {
+ StopKeywordRecognizer();
+ keywordRecognizer.OnPhraseRecognized -= KeywordRecognizer_OnPhraseRecognized;
+ keywordRecognizer.Dispose();
+ }
+ }
+
+ protected virtual void OnDisable()
+ {
+ if (keywordRecognizer != null)
+ {
+ StopKeywordRecognizer();
+ }
+ }
+
+ protected virtual void OnEnable()
+ {
+ if (keywordRecognizer != null && RecognizerStart == RecognizerStartBehavior.AutoStart)
+ {
+ StartKeywordRecognizer();
+ }
+ }
+
+ private void ProcessKeyBindings()
+ {
+ for (int index = Keywords.Length; --index >= 0;)
+ {
+ if (Input.GetKeyDown(Keywords[index].KeyCode))
+ {
+ OnPhraseRecognized(ConfidenceLevel.High, TimeSpan.Zero, DateTime.Now, null, Keywords[index].Keyword);
+ }
+ }
+ }
+
+ private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
+ {
+ OnPhraseRecognized(args.confidence, args.phraseDuration, args.phraseStartTime, args.semanticMeanings, args.text);
+ }
+
+ ///
+ /// Make sure the keyword recognizer is off, then start it.
+ /// Otherwise, leave it alone because it's already in the desired state.
+ ///
+ public void StartKeywordRecognizer()
+ {
+ if (keywordRecognizer != null && !keywordRecognizer.IsRunning)
+ {
+ keywordRecognizer.Start();
+ }
+ }
+
+ ///
+ /// Make sure the keyword recognizer is on, then stop it.
+ /// Otherwise, leave it alone because it's already in the desired state.
+ ///
+ public void StopKeywordRecognizer()
+ {
+ if (keywordRecognizer != null && keywordRecognizer.IsRunning)
+ {
+ keywordRecognizer.Stop();
+ }
+ }
+
+ private static readonly ExecuteEvents.EventFunction OnSpeechKeywordRecognizedEventHandler =
+ delegate (ISpeechHandler handler, BaseEventData eventData)
+ {
+ SpeechKeywordRecognizedEventData casted = ExecuteEvents.ValidateEventData(eventData);
+ handler.OnSpeechKeywordRecognized(casted);
+ };
+
+ protected void OnPhraseRecognized(ConfidenceLevel confidence, TimeSpan phraseDuration, DateTime phraseStartTime, SemanticMeaning[] semanticMeanings, string text)
+ {
+ // Create input event
+ speechKeywordRecognizedEventData.Initialize(this, 0, confidence, phraseDuration, phraseStartTime, semanticMeanings, text);
+
+ // Pass handler through HandleEvent to perform modal/fallback logic
+ inputManager.HandleEvent(speechKeywordRecognizedEventData, OnSpeechKeywordRecognizedEventHandler);
+ }
+
+ public override bool TryGetPosition(uint sourceId, out Vector3 position)
+ {
+ position = Vector3.zero;
+ return false;
+ }
+
+ public override bool TryGetOrientation(uint sourceId, out Quaternion orientation)
+ {
+ orientation = Quaternion.identity;
+ return false;
+ }
+
+ public override SupportedInputInfo GetSupportedInputInfo(uint sourceId)
+ {
+ return SupportedInputInfo.None;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputSource.cs.meta b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputSource.cs.meta
new file mode 100644
index 0000000..cf56baa
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputSource.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c62fd7a55ba7458499b69cae18f83806
+timeCreated: 1480671562
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders.meta b/HoloBot/Assets/HoloToolkit/Input/Shaders.meta
new file mode 100644
index 0000000..28b5078
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 567263514c68df24a8aa456a5dc6c8f4
+folderAsset: yes
+timeCreated: 1466793338
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders/Cursor.shader b/HoloBot/Assets/HoloToolkit/Input/Shaders/Cursor.shader
new file mode 100644
index 0000000..add56d2
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders/Cursor.shader
@@ -0,0 +1,54 @@
+Shader "HoloToolkit/Cursor"
+{
+ Properties
+ {
+ _Color ("Color", Color) = (1, 1, 1, 1)
+ }
+ SubShader
+ {
+ Tags { "RenderType"="Opaque" }
+ LOD 100
+ ZTest Always
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+
+ #include "UnityCG.cginc"
+
+ struct appdata
+ {
+ float4 vertex : POSITION;
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ };
+
+ struct v2f
+ {
+ float4 vertex : SV_POSITION;
+ UNITY_VERTEX_OUTPUT_STEREO
+ };
+
+ float4 _Color;
+
+ v2f vert (appdata v)
+ {
+ UNITY_SETUP_INSTANCE_ID(v);
+
+ v2f o;
+ o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
+
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
+ return o;
+ }
+
+ fixed4 frag (v2f i) : SV_Target
+ {
+ fixed4 col = _Color;
+ return col;
+ }
+ ENDCG
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders/Cursor.shader.meta b/HoloBot/Assets/HoloToolkit/Input/Shaders/Cursor.shader.meta
new file mode 100644
index 0000000..5bf93e4
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders/Cursor.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 51c87b08c4bd5cd4eabce20953fbe2e7
+timeCreated: 1471371239
+licenseType: Pro
+ShaderImporter:
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders/CursorShader.shader b/HoloBot/Assets/HoloToolkit/Input/Shaders/CursorShader.shader
new file mode 100644
index 0000000..a80203e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders/CursorShader.shader
@@ -0,0 +1,96 @@
+Shader "HoloToolkit/Cursor"
+{
+ Properties
+ {
+ [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
+ _Color ("Tint", Color) = (1,1,1,1)
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ "PreviewType"="Plane"
+ "CanUseSpriteAtlas"="True"
+ }
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull Off
+ Lighting Off
+ ZWrite Off
+ ZTest [unity_GUIZTestMode]
+ Blend SrcAlpha OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+ #include "UnityCG.cginc"
+
+ struct appdata_t
+ {
+ float4 vertex : POSITION;
+ float4 color : COLOR;
+ float2 texcoord : TEXCOORD0;
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ };
+
+ struct v2f
+ {
+ float4 vertex : SV_POSITION;
+ fixed4 color : COLOR;
+ half2 texcoord : TEXCOORD0;
+ UNITY_VERTEX_OUTPUT_STEREO
+ };
+
+ fixed4 _Color;
+
+ v2f vert(appdata_t IN)
+ {
+ UNITY_SETUP_INSTANCE_ID(IN);
+
+ v2f OUT;
+ OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
+ OUT.texcoord = IN.texcoord;
+#ifdef UNITY_HALF_TEXEL_OFFSET
+ OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
+#endif
+ OUT.color = IN.color * _Color;
+
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
+ return OUT;
+ }
+
+ sampler2D _MainTex;
+
+ fixed4 frag(v2f IN) : SV_Target
+ {
+ half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
+ clip (color.a - 0.01);
+ return color;
+ }
+ ENDCG
+ }
+ }
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders/CursorShader.shader.meta b/HoloBot/Assets/HoloToolkit/Input/Shaders/CursorShader.shader.meta
new file mode 100644
index 0000000..059794e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders/CursorShader.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 1c78697a7c77f7a49873eb4602b26988
+timeCreated: 1444775332
+licenseType: Pro
+ShaderImporter:
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders/EditorHands.shader b/HoloBot/Assets/HoloToolkit/Input/Shaders/EditorHands.shader
new file mode 100644
index 0000000..aedeb8f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders/EditorHands.shader
@@ -0,0 +1,93 @@
+Shader "HoloToolkit/EditorHands"
+{
+ Properties
+ {
+ [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
+ [PerRendererData] _Color ("Tint", Color) = (1,1,1,1)
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ "PreviewType"="Plane"
+ "CanUseSpriteAtlas"="True"
+ }
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull Off
+ Lighting Off
+ ZWrite Off
+ ZTest [unity_GUIZTestMode]
+ Blend SrcAlpha OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+ #include "UnityCG.cginc"
+
+ struct appdata_t
+ {
+ float4 vertex : POSITION;
+ float4 color : COLOR;
+ float2 texcoord : TEXCOORD0;
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ };
+ struct v2f
+ {
+ float4 vertex : SV_POSITION;
+ fixed4 color : COLOR;
+ half2 texcoord : TEXCOORD0;
+ UNITY_VERTEX_OUTPUT_STEREO
+ };
+ fixed4 _Color;
+ v2f vert(appdata_t IN)
+ {
+ UNITY_SETUP_INSTANCE_ID(IN);
+ v2f OUT;
+ OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
+ OUT.texcoord = IN.texcoord;
+ #ifdef UNITY_HALF_TEXEL_OFFSET
+ OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
+ #endif
+ OUT.color = IN.color * _Color;
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
+ return OUT;
+ }
+
+
+ sampler2D _MainTex;
+ fixed4 frag(v2f IN) : SV_Target
+ {
+ half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
+ clip (color.a - 0.01);
+ return color;
+ }
+
+ ENDCG
+ }
+ }
+ CustomEditor "EditorHandsMaterialInspector"
+}
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders/EditorHands.shader.meta b/HoloBot/Assets/HoloToolkit/Input/Shaders/EditorHands.shader.meta
new file mode 100644
index 0000000..cb5c15c
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders/EditorHands.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 17b35d8a8e5e92d4ebcf1933bf853497
+timeCreated: 1444775332
+licenseType: Pro
+ShaderImporter:
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders/SpecularHighlight.shader b/HoloBot/Assets/HoloToolkit/Input/Shaders/SpecularHighlight.shader
new file mode 100644
index 0000000..31d7b2e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders/SpecularHighlight.shader
@@ -0,0 +1,177 @@
+//
+// Copyright (C) Microsoft. All rights reserved.
+//
+
+Shader "HoloToolkit/SpecularHighlight"
+{
+ Properties
+ {
+ _Color("Main Color", Color) = (1,1,1,1)
+ _HighlightColor("Highlight Color", Color) = (1,1,1,1)
+ _MainTex1("Albedo", 2D) = "white" { }
+ _Specular("Specular", Color) = (0.08,0.075,0.065,1)
+ _Shininess("Shininess", float) = 3.0
+ _Highlight("Highlight", float) = 0.0
+ }
+
+ CGINCLUDE
+#include "UnityCG.cginc"
+#include "AutoLight.cginc"
+#include "Lighting.cginc"
+ ENDCG
+
+ SubShader
+ {
+ Tags { "RenderType" = "Opaque" }
+ LOD 200
+ Pass
+ {
+ Lighting On
+ Tags {"LightMode" = "ForwardBase"}
+
+ CGPROGRAM
+
+ #pragma exclude_renderers gles
+ #pragma vertex vert
+ #pragma fragment frag
+ #pragma multi_compile_fwdbase
+ #pragma target 5.0
+ #pragma only_renderers d3d11
+
+ // Low precision floating point types
+ #define lowp min16float
+ #define lowp2 min16float2
+ #define lowp3 min16float3
+ #define lowp4 min16float4
+ #define WORLD_NORMAL(vertexNormal) lowp4((normalize((lowp3)mul(vertexNormal, (float3x3)unity_WorldToObject))), 1.0f)
+
+ #define SPECULAR_ON 1
+ #define REFLECTION_ON 0
+
+ float3 _Color;
+ float3 _HighlightColor;
+ sampler2D _MainTex1;
+ float4 _Specular;
+ float _Shininess;
+ float _Highlight;
+
+ sampler2D _SimpleShadow;
+ uniform float4x4 _World2SimpleShadow;
+
+ float _CubeContribution;
+ float _FresnelPower;
+ samplerCUBE _Cube;
+
+ struct appdata_t
+ {
+ float4 vertex : POSITION;
+ float3 normal : NORMAL;
+ float4 texcoord : TEXCOORD0;
+ lowp4 color : COLOR;
+ };
+
+ struct v2f
+ {
+ float4 pos : POSITION;
+ lowp2 uv : TEXCOORD0;
+ lowp3 color : COLOR;
+ lowp3 diffuse : TEXCOORD2;
+
+#if SPECULAR_ON
+ lowp3 specular : TEXCOORD4;
+#endif
+
+#if REFLECTION_ON
+ lowp3 worldViewDir : TEXCOORD5;
+ lowp3 worldNormal : TEXCOORD6;
+ lowp3 reflection : TEXCOORD7;
+#endif
+
+ };
+
+ v2f vert(appdata_t v)
+ {
+ v2f o;
+ o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
+ o.uv = v.texcoord;
+
+ //Setup vectors for light probe contribution, w = 1.
+ lowp4 worldNormal = WORLD_NORMAL(v.normal);
+
+ //Calculate light probe contribution
+ lowp3 x1;
+ // Linear + constant polynomial terms
+ x1.r = dot(unity_SHAr, worldNormal);
+ x1.g = dot(unity_SHAg, worldNormal);
+ x1.b = dot(unity_SHAb, worldNormal);
+
+ //transfering color to pixel shader for use in diffuse output
+ o.color = v.color * _Color;
+
+ lowp nDotL = saturate(dot((lowp3)_WorldSpaceLightPos0.xyz, worldNormal.xyz));
+ lowp3 halfLightColor = _LightColor0.rgb * (lowp).5f;
+
+ // Store half the color of the light as diffuse and half as ambient
+ o.diffuse = halfLightColor * nDotL;
+
+#if SPECULAR_ON || REFLECTION_ON
+ lowp3 worldViewDir = normalize(WorldSpaceViewDir(v.vertex));
+#endif
+
+#if SPECULAR_ON
+ // Calculate specular
+ // TODO WorldLightDir is constant each frame. Normalize this on the CPU instead.
+ lowp3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
+ lowp3 halfVector = normalize(worldLightDir + worldViewDir);
+
+ lowp3 specNormal = normalize(worldNormal);
+ lowp specDot = saturate(dot(specNormal, halfVector));
+
+ // Pre-adding specular into ambient so we don't
+ // have to do it in the fragment shader
+ o.specular = _Specular * saturate(pow(specDot, _Shininess)) * 5;
+#endif
+
+#if REFLECTION_ON
+ o.worldNormal = worldNormal;
+ o.worldViewDir = worldViewDir;
+ o.reflection = reflect(-worldViewDir, worldNormal.xyz * 1.0);
+#endif
+ return o;
+ }
+
+
+ lowp4 frag(v2f i) : COLOR
+ {
+ lowp attenuation = 1.0f;
+ lowp3 albedo;
+ {
+ albedo = (lowp3)tex2D(_MainTex1, i.uv) * i.color;
+#if SPECULAR_ON
+ albedo += i.specular;
+#endif
+
+#if REFLECTION_ON
+ lowp fresnel = saturate(dot(i.worldNormal, i.worldViewDir));
+ // Try and sneak a MAD in there
+ lowp fresnelRatio = (fresnel * fresnel) * (-(lowp)_FresnelPower) + (lowp)1.0;
+ albedo += texCUBE(_Cube, i.reflection) * _CubeContribution * fresnelRatio;
+#endif
+ }
+
+ lowp3 irradiance;
+ {
+ irradiance = i.diffuse;
+ irradiance = irradiance * attenuation + albedo;
+ }
+
+ lowp3 exitantRadiance = albedo * irradiance + _HighlightColor * _Highlight;
+
+ lowp alpha = 1.0f;
+ return lowp4(exitantRadiance, alpha);
+ }
+ ENDCG
+ }
+ }
+ Fallback "VertexLit"
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Input/Shaders/SpecularHighlight.shader.meta b/HoloBot/Assets/HoloToolkit/Input/Shaders/SpecularHighlight.shader.meta
new file mode 100644
index 0000000..76a50a9
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Input/Shaders/SpecularHighlight.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f326278a838e87c499393f30a8e72127
+timeCreated: 1461882034
+licenseType: Pro
+ShaderImporter:
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing.meta b/HoloBot/Assets/HoloToolkit/Sharing.meta
new file mode 100644
index 0000000..811ed26
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: fa3fb3fd8dafc484487449a62b4fab72
+folderAsset: yes
+timeCreated: 1456611862
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins.meta
new file mode 100644
index 0000000..b58dd23
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 5f788fe1ea017744fa7365052305669e
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA.meta
new file mode 100644
index 0000000..b71f665
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: b474aba3141da224aa5a9100f8838cde
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM.meta
new file mode 100644
index 0000000..21cbbbc
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 04160e0c231a5714c982df6de2d09433
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM/SharingClient.dll b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM/SharingClient.dll
new file mode 100644
index 0000000..9a51b44
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM/SharingClient.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM/SharingClient.dll.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM/SharingClient.dll.meta
new file mode 100644
index 0000000..84d2da8
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/ARM/SharingClient.dll.meta
@@ -0,0 +1,54 @@
+fileFormatVersion: 2
+guid: e34562f7419002c42acf845c89fd2c5a
+timeCreated: 1456615159
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: ARM
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64.meta
new file mode 100644
index 0000000..941f024
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 85059dffc84910e4993d5e1da0604b7d
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64/SharingClient.dll b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64/SharingClient.dll
new file mode 100644
index 0000000..7466624
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64/SharingClient.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64/SharingClient.dll.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64/SharingClient.dll.meta
new file mode 100644
index 0000000..9c9c6aa
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x64/SharingClient.dll.meta
@@ -0,0 +1,54 @@
+fileFormatVersion: 2
+guid: 7ca2360a11146cc4cb740a0eab60b6b4
+timeCreated: 1456615159
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X64
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86.meta
new file mode 100644
index 0000000..bd039e6
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: bcf9bdf58e801514daf1ce7f10b88a7b
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86/SharingClient.dll b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86/SharingClient.dll
new file mode 100644
index 0000000..70ffcf2
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86/SharingClient.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86/SharingClient.dll.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86/SharingClient.dll.meta
new file mode 100644
index 0000000..580a7c4
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/WSA/x86/SharingClient.dll.meta
@@ -0,0 +1,54 @@
+fileFormatVersion: 2
+guid: 524bc2fa88e9e2249a3bace97aee437c
+timeCreated: 1456615159
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X86
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64.meta
new file mode 100644
index 0000000..276a81f
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 6cb6ac333da98c74facd3d4c621690e0
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64/SharingClient.dll b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64/SharingClient.dll
new file mode 100644
index 0000000..19a487f
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64/SharingClient.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64/SharingClient.dll.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64/SharingClient.dll.meta
new file mode 100644
index 0000000..35524c1
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x64/SharingClient.dll.meta
@@ -0,0 +1,62 @@
+fileFormatVersion: 2
+guid: 851c5df1d1918514ebd9f776dae6844d
+timeCreated: 1458942114
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: Windows
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: X64
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86.meta
new file mode 100644
index 0000000..ba50f98
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: c765185e90368834bb85c1a8c0816010
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86/SharingClient.dll b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86/SharingClient.dll
new file mode 100644
index 0000000..c63ddcd
Binary files /dev/null and b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86/SharingClient.dll differ
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86/SharingClient.dll.meta b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86/SharingClient.dll.meta
new file mode 100644
index 0000000..cb7d81e
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Plugins/x86/SharingClient.dll.meta
@@ -0,0 +1,62 @@
+fileFormatVersion: 2
+guid: fcb86078da5d38b4b9010f905416d334
+timeCreated: 1458942114
+licenseType: Pro
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: Windows
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: x86
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: x86
+ Win:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: X86
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Prefabs.meta b/HoloBot/Assets/HoloToolkit/Sharing/Prefabs.meta
new file mode 100644
index 0000000..c077980
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Prefabs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: aa5a1f5c296fe8c48a336bca1f65bef8
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Prefabs/Sharing.prefab b/HoloBot/Assets/HoloToolkit/Sharing/Prefabs/Sharing.prefab
new file mode 100644
index 0000000..a8e04e3
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Prefabs/Sharing.prefab
@@ -0,0 +1,74 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &163528
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 475158}
+ - component: {fileID: 114000012667812730}
+ - component: {fileID: 114000013602799446}
+ m_Layer: 0
+ m_Name: Sharing
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &475158
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 163528}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 163528}
+ m_IsPrefabParent: 1
+--- !u!114 &114000012667812730
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 163528}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9af4ac91e9017f34c971bbf5e12948d3, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ ClientRole: 0
+ ServerAddress: localhost
+ ServerPort: 20602
+ connectOnAwake: 1
+ AutoDiscoverServer: 0
+ PingIntervalSec: 2
+ IsAudioEndpoint: 1
+ ShowDetailedLogs: 0
+--- !u!114 &114000013602799446
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 163528}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8fa5da1314a4aa745a5be3f0f6ab6bd6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ SessionName: Default
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Prefabs/Sharing.prefab.meta b/HoloBot/Assets/HoloToolkit/Sharing/Prefabs/Sharing.prefab.meta
new file mode 100644
index 0000000..fff8d84
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Prefabs/Sharing.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8aaf37823b26ee449bb3b3d7775965c3
+timeCreated: 1454460865
+licenseType: Pro
+NativeFormatImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/README.md b/HoloBot/Assets/HoloToolkit/Sharing/README.md
new file mode 100644
index 0000000..954d5c8
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/README.md
@@ -0,0 +1,377 @@
+## [Sharing]()
+The HoloToolkit.Sharing library allows applications to span multiple devices, and enables holographic collaboration.
+
+Originally developed for OnSight, a collaboration between SOTA (a Microsoft studio) and NASA to enhance their existing Mars rover planning tool with HoloLens, HoloToolkit.Sharing enables users to use multiple devices for a task by allowing the apps running on each device communicate and stay in sync seamlessly in real time.
+
+Users can also collaborate with other users (who are also using multiple devices) who may be in the same room or working remotely.
+
+## Table of Contents
+
+- [Features](#features)
+- [Configuration](#configuration)
+- [Troubleshooting](#troubleshooting)
+- [Plugins](#plugins)
+- [Prefabs](#prefabs)
+- [Scripts](#scripts)
+- [Test Prefabs](#test-prefabs)
+- [Test Scripts](#test-scripts)
+- [Tests](#tests)
+
+### Features
+---
+
+#### Lobby & Session system
+* Discover available sessions or create your own
+* Permanent or ‘until empty’ session lifetime
+* See user status: current session, mute state
+* Easy to discover and hop between sessions
+
+#### Anchor Sharing
+* Users in a session can be in the same or different physical rooms
+* Users can share the location of Holographic 'anchors' they place in their room with other users in the same room
+* Users joining late can download all anchors in the session
+* Allows multiple users to see shared holograms
+
+#### Synchronization System
+Synchronize data across all participants in session
+* Everyone in session guaranteed to see the same thing
+* Automatic conflict resolution for simultanious conflicting remote changes
+* Real-time: See remote changes as they happen
+* Shared data sets automatically merged when new users join a session
+* Responsive: no delay in your own changes
+* Ownership: your data leaves session when you do
+
+#### Group Voice Chat
+Support for VOIP is built-in
+* Server-based mixing lowers processing and bandwidth requirements for clients
+
+#### Visual Pairing
+Connect devices just by looking at them
+* One device displays a QR code with connection info and security code
+* Other device sees QR code, connects, and validates with security code
+* Can also detect location in 3D space using built-in fiducial marker support
+
+#### Profiler
+Profiling and debugging an experience that spans multiple devices is challenging. So HoloToolkit.Sharing provides an app that can connect to multiple devices at once and aggregates their timings and debug output in a single place
+
+#### Sync Model
+
+HoloToolkit.Sharing has the ability to synchronize data across any application connected to a given session. Conflict resolution is automatically handled by the framework, at whichever level the conflict occurs.
+
+##### Primitive Types
+The following primitives are natively supported by the sync system. The C# class that corresponds to each primitive is written in parentheses.
+
+- Boolean (SyncBool)
+- Double (SyncDouble)
+- Float (SyncFloat)
+- Integer (SyncInteger)
+- Long (SyncLong)
+- Object, which is a container class that can have child primitives (SyncObject
+- String (SyncString)
+
+On top of the native primitives above, the following types are supported in the C# layer:
+
+- Quaternion (SyncQuaternion)
+- Transform (SyncTransform)
+- Unordered array (SyncArray)
+- Vector3 (SyncVector3)
+
+Other types can be built for your own application as needed by inheriting from SyncObject in a similar way to what SyncVector3 and SyncTransform do.
+
+##### Defining the Sync Model
+By default, the SyncRoot object (which inherits from SyncObject) only contains an array of InstantiatedPrefabs, which may not be enough for your application.
+
+For any type inheriting from SyncObject, you can easily add new children primitives by using the SyncData attribute, such as in the following example:
+
+
+ public class MySyncObject : SyncObject
+ {
+ [SyncData]
+ public SyncSpawnArray OtherSyncObject;
+
+ [SyncData]
+ public SyncFloat FloatValue;
+ }
+
+Any SyncPrimitive tagged with the [SyncData] attribute will automatically be added to the data model and synced in the current HoloToolkit.Sharing session.
+
+### Configuration
+---
+Ensure you have the following capabilities set in Player Settings -> Windows Store -> Publishing Settings -> Capabilities:
+
+1. SpatialPerception
+2. InternetClientServer
+3. PrivateNetworkClientServer
+4. Microphone capabilities
+
+Install or run the server instance.
+
+### Troubleshooting
+---
+- Double check the Server Address on your sharing stage component in your scene matches the address shown in the sharing service console.
+- Make sure all devices are connected to the same Wireless Local Area Network.
+- Ensure all firewall settings are correct. Windows firewall gives you options to enable/disable by network type (private, public, home), make sure you're enabling the firewall for your connection's type.
+
+####Invalid Schema Version
+
+```
+SharingService [..\..\Source\Common\Private\SessionListHandshakeLogic.cpp (67)]:
+***************************************************************
+List Server Handshake Failed: Invalid schema version.
+Expected: 17, got 15
+Please sync to latest XTools
+***************************************************************
+```
+
+- Ensure you're using the latest binaries of the sharing service found at `HoloToolkit-Unity\External\HoloToolkit\Sharing\Server`.
+
+### [Plugins](Plugins)
+---
+Contains compiled architecture specific binaries for SharingClient.dll which are required by the Unity application for accessing sharing APIs.
+Binaries are compiled from the native [HoloToolkit\Sharing](https://github.com/Microsoft/HoloToolkit/tree/master/Sharing).
+
+### [Prefabs](Prefabs)
+---
+Prefabs related to the sharing and networking features.
+
+#### Sharing.prefab
+1. Enables sharing and networking in your Unity application.
+2. Allows you to communicate between a Windows and non-Windows device.
+
+**SharingStage.cs** allows you to be a Primary Client (typical case).
+**Server Address** is the IP address of the machine running the HoloToolkit -> Launch Sharing Service.
+**Server Port** displays the port being used for communicating.
+
+**AutoJoinSession.cs** creates a shared session with Session Name 'Default' which is customizable.
+Joins a player to that session if once already exists.
+
+### [Scripts](Scripts)
+---
+Scripts related to the sharing and networking features.
+
+#### [Editor](Scripts/Editor)
+---
+Scripts for in editor use only.
+
+##### SharingMenu.cs
+Enables users to start the Sharing Service, Sharing Manager, and Profiler from the Unity Editor via the HoloToolkit Menu.
+
+##### SharingStageEditor.cs
+Draws the default Sharing Stage Inspector and adds the SyncRoot Hierarchy view so users can quickly verify Sync Object updates.
+
+#### [SDK](Scripts/SDK)
+---
+Contains scripts compiled from the native [HoloToolkit\Sharing](https://github.com/Microsoft/HoloToolkit/tree/master/Sharing) repository and using the SWIG tool to generate different language bindings.
+
+#### [Spawning](Scripts/Spawning)
+---
+Scripts for spawning objects using the sharing service.
+
+##### PrefabSpawnerManager.cs
+A SpawnManager that creates a GameObject based on a prefab when a new SyncSpawnedObject is created in the data model. This class can spawn prefabs in reaction to the addition/removal of any object that inherits from SyncSpawnedObject, thus allowing applications to dynamically spawn prefabs as needed.
+
+The PrefabSpawnManager registers to the SyncArray of InstantiatedPrefabs in the SyncRoot object.
+
+The various classes can be linked to a prefab from the editor by specifying which class corresponds to which prefab. Note that the class field is currently a string that has to be typed in manually ("SyncSpawnedObject", for example): this could eventually be improved through a custom editor script.
+
+##### SpawnManager.cs
+A SpawnManager is in charge of spawning the appropriate objects based on changes to an array of data model objects. It also manages the lifespan of these spawned objects.
+
+This is an abstract class from which you can derive a custom SpawnManager to react to specific synchronized objects being added or removed from the data model.
+
+##### SyncSpawnArray.cs
+This array is meant to hold SyncSpawnedObject and objects of subclasses. Compared to SyncArray, this supports dynamic types for objects.
+
+##### SyncSpawnedObject.cs
+A SpawnedObject contains all the information needed for another device to spawn an object in the same location as where it was originally created on this device.
+
+#### [SyncModel](Scripts/SyncModel)
+---
+Scripts for syncing data over sharing service.
+
+##### SyncArray.cs
+The SyncArray class provides the functionality of an array in the data model. The array holds entire objects, not primitives, since each object is indexed by unique name. Note that this array is unordered.
+
+##### SyncBool.cs
+This class implements the boolean primitive for the syncing system. It does the heavy lifting to make adding new bools to a class easy.
+
+##### SyncDataAttributes.cs
+Used to markup SyncObject classes and SyncPrimitives inside those classes, so that they properly get instantiated when using a hierarchical data model that inherits from SyncObject.
+
+##### SyncDouble.cs
+This class implements the double primitive for the syncing system. It does the heavy lifting to make adding new doubles to a class easy.
+
+##### SyncFloat.cs
+This class implements the float primitive for the syncing system. It does the heavy lifting to make adding new floats to a class easy.
+
+##### SyncInteger.cs
+This class implements the integer primitive for the syncing system. It does the heavy lifting to make adding new integers to a class easy.
+
+##### SyncLong.cs
+This class implements the long primitive for the syncing system. It does the heavy lifting to make adding new longs to a class easy.
+
+##### SyncObject.cs
+The SyncObject class is a container object that can hold multiple SyncPrimitives.
+
+##### SyncPrimitive.cs
+Base primitive used to define an element within the data model. The primitive is defined by a field and a value.
+
+##### SyncQuaternion.cs
+This class implements the Quaternion object primitive for the syncing system. It does the heavy lifting to make adding new Quaternion to a class easy.
+
+##### SyncString.cs
+This class implements the string primitive for the syncing system. It does the heavy lifting to make adding new strings to a class easy.
+
+##### SyncTransform.cs
+This class implements the Transform object primitive for the syncing system. It does the heavy lifting to make adding new transforms to a class easy. A transform defines the position, rotation and scale of an object.
+
+##### SyncVector3.cs
+This class implements the Vector3 object primitive for the syncing system. It does the heavy lifting to make adding new Vector3 to a class easy.
+
+#### [Unity](Scripts/Unity)
+---
+Scripts used to implement unity specific sync services.
+
+##### DefaultSyncModelAccessor.cs
+Default implementation of a behaviour that allows other components of a game object access the shared data model as a raw SyncObject instance.
+
+##### ISyncModelSccessor.cs
+Interface that allows a components of a game object access the shared data model set by a SpawnManager.
+
+##### TransformSynchronizer.cs
+Synchronizer to update and broadcast a transform object through our data model.
+
+#### [Utilities](Scripts/Utilities)
+---
+Scripts for sync service utilities.
+
+##### AutoJoinSession.cs
+A behaviour component that allows the application to automatically join the specified session as soon as the application has a valid server connection. This class will also maintain the session connection throughout the application lifetime.
+
+This is mostly meant to be used to quickly test networking in an application. In most cases, some session management code should be written to allow users to join/leave sessions according to the desired application flow.
+
+##### ConsoleLogWriter.cs
+Utility class that writes the sharing service log messages to the Unity Engine's console.
+
+##### DirectPairing.cs
+This class enables users to pair with a remote client directly. One side should use the Receiver role, the other side should use the Connector role. RemoteAddress and RemotePort are used by the Connector role, LocalPort is used by the Receiver.
+
+#### [VoiceChat](Scripts/VoiceChat)
+---
+Scripts for Voice Chat service.
+
+##### MicrophoneReceiver.cs
+Receives and plays voice data transmitted through the session server. This data comes from other clients running the MicrophoneTransmitter behaviour.
+
+##### MicrophoneTransmitter.cs
+Transmits data from your microphone to other clients connected to a SessionServer. Requires any receiving client to be running the MicrophoneReceiver script.
+
+---
+
+#### ServerSessionTracker.cs
+The ServerSessionsTracker is in charge of listing the various sessions that exist on the server, and exposes events related to all of these sessions. This is also the class that allows the application to join or leave a session. Instance is created by Sharing Stage when a connection is found.
+
+#### SessionUsersTracker.cs
+The SessionUsersTracker keeps track of the current session and its users. It also exposes events that are triggered whenever users join or leave the current session. Instance is created by Sharing Stage when a connection is found.
+
+#### SharingStage.cs
+A Singleton behaviour that is in charge of managing the core networking layer for the application. The SharingStage has the following responsibilities:
+
+- Server configuration (address, port and client role)
+- Establish and manage the server connection
+- Create and initialize the synchronized data model (SyncRoot)
+- Create the ServerSessionsTracker that tracks all sessions on the server
+- Create the SessionUsersTracker that tracks the users in the current session
+
+#### SyncRoot.cs
+Root of the synchronized data model, under which every element of the model should be located. The SharingStage will automatically create and initialize the SyncRoot at application startup.
+
+#### SyncSettings.cs
+Collection of sharing sync settings, used by the HoloToolkit Sharing sync system to figure out which data model classes need to be instantiated when receiving data that inherits from SyncObject.
+
+#### SyncStateListener.cs
+C# wrapper for the Sharing SyncListener, making changes available through the Action class.
+
+### [Test Prefabs](Tests/Prefabs)
+---
+Prefabs used in the various test scenes, which you can use as inspiration to build your own.
+
+#### SpawnTestCube.prefab
+Simple Cube prefab with a Transform, Mesh Filter, Box Collider, Mesh Renderer, and Default Sync Model Accessor components.
+
+#### SpawnTestSphere.prefab
+A simple Sphere prefab with a Transform, Mesh Filter, Sphere Collider, and Mesh Renderer components.
+Purposefully missing Default Sync Model Accessor component for SharingSpawnTest.
+
+### [Test Scripts](Tests/Scripts)
+---
+Test Scripts.
+
+#### CustomMessages.cs
+Test class for demonstrating how to send custom messages between clients.
+
+#### ImportExportAnchorManager.cs
+Manages creating anchors and sharing the anchors with other clients.
+
+#### RemoteHeadManager.cs
+Broadcasts the head transform of the local user to other users in the session, and adds and updates the head transforms of remote users. Head transforms are sent and received in the local coordinate space of the GameObject this component is on.
+
+#### RoomTest.cs
+Test class for demonstrating creating rooms and anchors.
+
+#### SyncObjectSpawner.cs
+Class that handles spawning and deleteing sync objects for the `SpawningTest.scene`. Uses the `KeywordManager` to spawn objects using voice and keyboard input.
+
+|Voice Command|Key Command|Description|
+|---|---|---|
+| Spawn Basic | Key `I`| Spawns a cube with a `SyncSpawnedObject` basic sync model.|
+| Spawn Custom | Key `O`| Spawns a sphere with a `SyncSpawnTestSphere` custom sync model.|
+| Delete Object | Key `M`| Deletes both sync model types.|
+
+#### SyncSpawnTestSphere.cs
+Class that demonstrates a custom class using sync model attributes.
+
+#### UserNotifications.cs
+Used to demonstrate how to get notifications when users leave and enter room.
+
+### [Tests](Tests/Scenes)
+---
+Tests related to the sharing features. To use the each scene:
+
+1. Navigate to the Tests folder.
+2. Double click on the test scene you wish to explore.
+3. Either click "Play" in the unity editor or File -> Build Settings.
+4. Add Open Scenes, Platform -> Windows Store, SDK -> Universal 10, Build Type -> D3D, Check 'Unity C# Projects'.
+5. Enable all required [capabilities](configuration).
+6. Click 'Build' and create an App folder. When compile is done, open the solution and deploy to device.
+
+#### SharingTest.unity
+This test demonstrates how to use the Sharing prefabs for networking and sharing custom messages with clients.
+It also demonstrates how to share world anchors between clients to establish a shared space.
+
+1. Ensure to launch the sharing service using: HoloToolkit -> Launch Sharing service
+2. Enter the IP address displayed in the console window into the Server Address of the Sharing object.
+3. **CustomMessages.cs** shows how to communicate specific information across clients.
+4. **ImportExportAnchorManager.cs** shows how to create anchors and share them with other clients using the sharing service.
+5. **RemoteHeadManager.cs** draw cubes on remote heads of users joining the session.
+
+#### RoomAndAnchorTest.unity
+This test demonstrates how to create new rooms and anchors inside your application.
+It also demonstrates how to upload and download new anchors.
+
+1. Ensure to launch the sharing service using: HoloToolkit -> Launch Sharing service
+2. Enter the IP address displayed in the console window into the Server Address of the Sharing object.
+3. **RoomTest.cs** shows how to create, join, and leave rooms; also shows how to create and download anchors.
+
+#### SharingSpawnTest.unity
+This test demonstrates how to spawn and delete sync objects in your scene and across your networked clients.
+
+1. Ensure to launch the sharing service using: HoloToolkit -> Launch Sharing service
+2. Enter the IP address displayed in the console window into the Server Address of the Sharing object.
+3. **PrefabSpawnManager.cs** enables you to store prefab references to use when spawning.
+4. **SyncObjectSpawner.cs** demonstrates how to spawn and delete sync objects, as well as custom class types.
+
+---
+##### [Go back up to the table of contents](#table-of-contents)
+##### [Go back to the main page.](../../../README.md)
+---
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/README.md.meta b/HoloBot/Assets/HoloToolkit/Sharing/README.md.meta
new file mode 100644
index 0000000..f439bf9
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/README.md.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 978345edff4a3ea4cb8ca1e56e7d3257
+timeCreated: 1470705588
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Scripts.meta b/HoloBot/Assets/HoloToolkit/Sharing/Scripts.meta
new file mode 100644
index 0000000..9a2d38a
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Scripts.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: ece6b30733993ed418105192d199ba9c
+folderAsset: yes
+timeCreated: 1456611862
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor.meta b/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor.meta
new file mode 100644
index 0000000..d2a6c73
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: cf3a15147feff8e4aa8134f6c34b4682
+folderAsset: yes
+timeCreated: 1460418045
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingMenu.cs b/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingMenu.cs
new file mode 100644
index 0000000..a093dba
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingMenu.cs
@@ -0,0 +1,58 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System.IO;
+using UnityEditor;
+using UnityEngine;
+using HoloToolkit.Unity;
+
+namespace HoloToolkit.Sharing
+{
+ public static class SharingMenu
+ {
+ [MenuItem("HoloToolkit/Sharing Service/Launch Sharing Service", false, 100)]
+ public static void LaunchSessionServer()
+ {
+ string filePathName = @"External\HoloToolkit\Sharing\Server\SharingService.exe";
+
+ if (!File.Exists(filePathName))
+ {
+ Debug.LogError("Sharing service does not exist at location: " + filePathName);
+ Debug.LogError("Manually copy SharingService.exe to this path from HoloToolkit-Unity\\External.");
+ return;
+ }
+
+ ExternalProcess.FindAndLaunch(filePathName, @"-local");
+ }
+
+ [MenuItem("HoloToolkit/Sharing Service/Launch Session Manager", false, 101)]
+ public static void LaunchSessionUI()
+ {
+ string filePathName = @"External\HoloToolkit\Sharing\Tools\SessionManager\x86\SessionManager.UI.exe";
+
+ if (!File.Exists(filePathName))
+ {
+ Debug.LogError("Session Manager UI does not exist at location: " + filePathName);
+ Debug.LogError("Manually copy SessionManager.UI.exe to this path from HoloToolkit-Unity\\External.");
+ return;
+ }
+
+ ExternalProcess.FindAndLaunch(filePathName);
+ }
+
+ [MenuItem("HoloToolkit/Sharing Service/Launch Profiler", false, 103)]
+ public static void LaunchProfilerX()
+ {
+ string filePathName = @"External\HoloToolkit\Sharing\Tools\Profiler\x86\ProfilerX.exe";
+
+ if (!File.Exists(filePathName))
+ {
+ Debug.LogError("Profiler does not exist at location: " + filePathName);
+ Debug.LogError("Manually copy ProfilerX.exe to this path from HoloToolkit-Unity\\External.");
+ return;
+ }
+
+ ExternalProcess.FindAndLaunch(filePathName);
+ }
+ }
+}
\ No newline at end of file
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingMenu.cs.meta b/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingMenu.cs.meta
new file mode 100644
index 0000000..900e2b8
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingMenu.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 029ac67c65e8d7d428e72c96a230fe63
+timeCreated: 1455735876
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingStageEditor.cs b/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingStageEditor.cs
new file mode 100644
index 0000000..3ad819d
--- /dev/null
+++ b/HoloBot/Assets/HoloToolkit/Sharing/Scripts/Editor/SharingStageEditor.cs
@@ -0,0 +1,95 @@
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+//
+
+using System.Collections.Generic;
+using UnityEditor;
+using UnityEngine;
+using HoloToolkit.Sharing.SyncModel;
+
+namespace HoloToolkit.Sharing
+{
+ [CustomEditor(typeof(SharingStage))]
+ public class SharingStageEditor : Editor
+ {
+ private Dictionary