From 2e667d2fc91feab452fbcbd372f0f555fb9f476f Mon Sep 17 00:00:00 2001
From: Jared Bienz <>
Date: Fri, 9 Feb 2018 18:12:36 -0600
Subject: [PATCH 01/40] Initial commit. Have the ability to store secret values
like keys in environment now so that they don't accidentally get pushed to
source control. Project is running, but getting http 400 errors.
---
.gitignore | 210 +++---
Assets/MixedRealityAzure-Examples.meta | 10 +
Assets/MixedRealityAzure-Examples/LUIS.meta | 10 +
.../LUIS/Scenes.meta | 10 +
.../LUIS/Scenes/LUISTest.unity | 305 +++++++++
.../LUIS/Scenes/LUISTest.unity.meta | 9 +
Assets/MixedRealityAzure.meta | 10 +
Assets/MixedRealityAzure/Common.meta | 10 +
Assets/MixedRealityAzure/Common/Scripts.meta | 10 +
.../Common/Scripts/SecretHelper.cs | 158 +++++
.../Common/Scripts/SecretHelper.cs.meta | 13 +
.../Common/Scripts/UnityExtensions.cs | 52 ++
.../Common/Scripts/UnityExtensions.cs.meta | 13 +
Assets/MixedRealityAzure/LUIS.meta | 10 +
Assets/MixedRealityAzure/LUIS/README.md | 60 ++
Assets/MixedRealityAzure/LUIS/README.md.meta | 9 +
Assets/MixedRealityAzure/LUIS/Scripts.meta | 10 +
.../LUIS/Scripts/LuisManager.cs | 183 +++++
.../LUIS/Scripts/LuisManager.cs.meta | 13 +
Assets/Plugins.meta | 10 +
Assets/Plugins/Dependencies.meta | 10 +
.../Plugins/Dependencies/Newtonsoft.Json.meta | 10 +
.../portable-net45+wp80+win8+wpa81.meta | 10 +
.../Newtonsoft.Json.dll | Bin 0 -> 468480 bytes
.../Newtonsoft.Json.dll.meta | 121 ++++
.../Dependencies/System.Collections.dll | Bin 0 -> 5120 bytes
.../Dependencies/System.Collections.dll.meta | 121 ++++
Assets/Plugins/Dependencies/System.IO.dll | Bin 0 -> 5120 bytes
.../Plugins/Dependencies/System.IO.dll.meta | 113 ++++
.../Plugins/Dependencies/System.Runtime.dll | Bin 0 -> 13312 bytes
.../Dependencies/System.Runtime.dll.meta | 121 ++++
.../Dependencies/System.Threading.Tasks.dll | Bin 0 -> 5632 bytes
.../System.Threading.Tasks.dll.meta | 121 ++++
Assets/Plugins/LUIS.meta | 10 +
Assets/Plugins/LUIS/net45+win8+wpa81.meta | 10 +
.../Microsoft.Cognitive.LUIS.dll | Bin 0 -> 34840 bytes
.../Microsoft.Cognitive.LUIS.dll.meta | 121 ++++
LICENSE.licenseheader | 37 +
MixedReality-Azure-Samples.Editor.csproj | 339 ++++++++++
MixedReality-Azure-Samples.csproj | 267 ++++++++
MixedReality-Azure-Samples.sln | 20 +
ProjectSettings/AudioManager.asset | 17 +
ProjectSettings/ClusterInputManager.asset | 6 +
ProjectSettings/DynamicsManager.asset | 20 +
ProjectSettings/EditorBuildSettings.asset | 7 +
ProjectSettings/EditorSettings.asset | 20 +
ProjectSettings/GraphicsSettings.asset | 61 ++
ProjectSettings/InputManager.asset | 295 ++++++++
ProjectSettings/NavMeshAreas.asset | 91 +++
ProjectSettings/NetworkManager.asset | 8 +
ProjectSettings/Physics2DSettings.asset | 37 +
ProjectSettings/ProjectSettings.asset | 635 ++++++++++++++++++
ProjectSettings/ProjectVersion.txt | 1 +
ProjectSettings/QualitySettings.asset | 192 ++++++
ProjectSettings/TagManager.asset | 43 ++
ProjectSettings/TimeManager.asset | 9 +
ProjectSettings/UnityConnectSettings.asset | 34 +
UnityPackageManager/manifest.json | 4 +
58 files changed, 3921 insertions(+), 105 deletions(-)
create mode 100644 Assets/MixedRealityAzure-Examples.meta
create mode 100644 Assets/MixedRealityAzure-Examples/LUIS.meta
create mode 100644 Assets/MixedRealityAzure-Examples/LUIS/Scenes.meta
create mode 100644 Assets/MixedRealityAzure-Examples/LUIS/Scenes/LUISTest.unity
create mode 100644 Assets/MixedRealityAzure-Examples/LUIS/Scenes/LUISTest.unity.meta
create mode 100644 Assets/MixedRealityAzure.meta
create mode 100644 Assets/MixedRealityAzure/Common.meta
create mode 100644 Assets/MixedRealityAzure/Common/Scripts.meta
create mode 100644 Assets/MixedRealityAzure/Common/Scripts/SecretHelper.cs
create mode 100644 Assets/MixedRealityAzure/Common/Scripts/SecretHelper.cs.meta
create mode 100644 Assets/MixedRealityAzure/Common/Scripts/UnityExtensions.cs
create mode 100644 Assets/MixedRealityAzure/Common/Scripts/UnityExtensions.cs.meta
create mode 100644 Assets/MixedRealityAzure/LUIS.meta
create mode 100644 Assets/MixedRealityAzure/LUIS/README.md
create mode 100644 Assets/MixedRealityAzure/LUIS/README.md.meta
create mode 100644 Assets/MixedRealityAzure/LUIS/Scripts.meta
create mode 100644 Assets/MixedRealityAzure/LUIS/Scripts/LuisManager.cs
create mode 100644 Assets/MixedRealityAzure/LUIS/Scripts/LuisManager.cs.meta
create mode 100644 Assets/Plugins.meta
create mode 100644 Assets/Plugins/Dependencies.meta
create mode 100644 Assets/Plugins/Dependencies/Newtonsoft.Json.meta
create mode 100644 Assets/Plugins/Dependencies/Newtonsoft.Json/portable-net45+wp80+win8+wpa81.meta
create mode 100644 Assets/Plugins/Dependencies/Newtonsoft.Json/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll
create mode 100644 Assets/Plugins/Dependencies/Newtonsoft.Json/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll.meta
create mode 100644 Assets/Plugins/Dependencies/System.Collections.dll
create mode 100644 Assets/Plugins/Dependencies/System.Collections.dll.meta
create mode 100644 Assets/Plugins/Dependencies/System.IO.dll
create mode 100644 Assets/Plugins/Dependencies/System.IO.dll.meta
create mode 100644 Assets/Plugins/Dependencies/System.Runtime.dll
create mode 100644 Assets/Plugins/Dependencies/System.Runtime.dll.meta
create mode 100644 Assets/Plugins/Dependencies/System.Threading.Tasks.dll
create mode 100644 Assets/Plugins/Dependencies/System.Threading.Tasks.dll.meta
create mode 100644 Assets/Plugins/LUIS.meta
create mode 100644 Assets/Plugins/LUIS/net45+win8+wpa81.meta
create mode 100644 Assets/Plugins/LUIS/net45+win8+wpa81/Microsoft.Cognitive.LUIS.dll
create mode 100644 Assets/Plugins/LUIS/net45+win8+wpa81/Microsoft.Cognitive.LUIS.dll.meta
create mode 100644 LICENSE.licenseheader
create mode 100644 MixedReality-Azure-Samples.Editor.csproj
create mode 100644 MixedReality-Azure-Samples.csproj
create mode 100644 MixedReality-Azure-Samples.sln
create mode 100644 ProjectSettings/AudioManager.asset
create mode 100644 ProjectSettings/ClusterInputManager.asset
create mode 100644 ProjectSettings/DynamicsManager.asset
create mode 100644 ProjectSettings/EditorBuildSettings.asset
create mode 100644 ProjectSettings/EditorSettings.asset
create mode 100644 ProjectSettings/GraphicsSettings.asset
create mode 100644 ProjectSettings/InputManager.asset
create mode 100644 ProjectSettings/NavMeshAreas.asset
create mode 100644 ProjectSettings/NetworkManager.asset
create mode 100644 ProjectSettings/Physics2DSettings.asset
create mode 100644 ProjectSettings/ProjectSettings.asset
create mode 100644 ProjectSettings/ProjectVersion.txt
create mode 100644 ProjectSettings/QualitySettings.asset
create mode 100644 ProjectSettings/TagManager.asset
create mode 100644 ProjectSettings/TimeManager.asset
create mode 100644 ProjectSettings/UnityConnectSettings.asset
create mode 100644 UnityPackageManager/manifest.json
diff --git a/.gitignore b/.gitignore
index 940794e..4d1d415 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,80 @@
+# Unity3D Autogenerated VS/MD solution and project files
+/**/Unity/**/UWP
+/**/Unity/**/Unprocessed
+/**/Unity/Tools/
+
+# Unity3D Player Binaries
+Unity*.dll
+WinRTLegacy.dll
+
+# Unity3D C# Project Binaries
+Assembly-CSharp*.dll
+
+# Unity3D Autogenerated Player files
+Players/
+
+# Unity3D Exported Data files
+Data/
+
+# UWP Exported Binaries
+/**/UWP/**/*.dll
+/**/UWP/**/*.exe
+
+# HoloLens Binaries
+SharingClient.dll
+PlaneFinding.dll
+
+# Unity3D Generated File On Crash Reports
+sysinfo.txt
+Lib/*.suo
+
+# NuGet Files
+project.lock.json
+
+# Built application files
+/*/build/
+
+# Crashlytics configuations
+com_crashlytics_export_strings.xml
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Gradle generated files
+.gradle/
+
+# Signing files
+.signing/
+
+# User-specific configurations
+.idea/libraries/
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/.name
+.idea/compiler.xml
+.idea/copyright/profiles_settings.xml
+.idea/encodings.xml
+.idea/misc.xml
+.idea/modules.xml
+.idea/scopes/scope_settings.xml
+.idea/vcs.xml
+*.iml
+
+# OS-specific files
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+
+
+
+
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.suo
@@ -17,17 +90,30 @@
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
+[Rr]ef/
x64/
x86/
+build/
bld/
[Bb]in/
[Oo]bj/
-[Ll]og/
-# Visual Studio 2015 cache/options directory
+# Packaging libraries
+[Pp]ackaging/Builds/*
+[Pp]ackaging/Packages/*
+
+# Packaging content OK
+![Pp]ackaging/Content/**
+
+# Always get Unity root tools
+![U]nity/**
+
+# Always ignore Unity Library and Temp folders
+**/[Ll]ibrary/*
+**/[Tt]emp/
+
+# Visual Studo 2015 cache/options directory
.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
@@ -42,18 +128,10 @@ TestResult.xml
[Rr]eleasePS/
dlldata.c
-# .NET Core
-project.lock.json
-project.fragment.lock.json
-artifacts/
-**/Properties/launchSettings.json
-
*_i.c
*_p.c
*_i.h
*.ilk
-*.meta
-*.obj
*.pch
*.pdb
*.pgc
@@ -80,18 +158,14 @@ _Chutzpah*
ipch/
*.aps
*.ncb
-*.opendb
*.opensdf
*.sdf
*.cachefile
-*.VC.db
-*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
-*.sap
# TFS 2012 Local Workspace
$tf/
@@ -104,7 +178,7 @@ _ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
-# JustCode is a .NET coding add-in
+# JustCode is a .NET coding addin-in
.JustCode
# TeamCity is a build add-in
@@ -113,14 +187,9 @@ _TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
# NCrunch
_NCrunch_*
.*crunch*.local.xml
-nCrunchTemp_*
# MightyMoose
*.mm.*
@@ -148,16 +217,11 @@ publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
-# TODO: Comment the next line if you want to checkin your web deploy settings
+# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
@@ -166,44 +230,30 @@ PublishScripts/
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
+# VSIX Packages OK
+!**/VisualStudio/VSFeatureEngine/Packages/*
+# Lock files
+**/project.lock.json
-# Microsoft Azure Build Output
+# Windows Azure Build Output
csx/
*.build.csdef
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
+# Windows Store app package directory
AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!*.[Cc]ache/
# Others
+*.[Cc]ache
ClientBin/
+[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.dbproj.schemaview
-*.jfm
-*.pfx
+# *.pfx // Allowing PFX because all PFX files are for samples
*.publishsettings
-orleans.codegen.cs
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
+node_modules/
+bower_components/
# RIA/Silverlight projects
Generated_Code/
@@ -219,7 +269,6 @@ UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
-*.ndf
# Business Intelligence projects
*.rdl.data
@@ -229,60 +278,11 @@ UpgradeLog*.htm
# Microsoft Fakes
FakesAssemblies/
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
-node_modules/
-
-# Typescript v1 declaration files
-typings/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
-
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# JetBrains Rider
-.idea/
-*.sln.iml
-
-# CodeRush
-.cr/
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
-
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
diff --git a/Assets/MixedRealityAzure-Examples.meta b/Assets/MixedRealityAzure-Examples.meta
new file mode 100644
index 0000000..8b6a954
--- /dev/null
+++ b/Assets/MixedRealityAzure-Examples.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 60025ef4870efbf4a9081116dec980e5
+folderAsset: yes
+timeCreated: 1518194984
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure-Examples/LUIS.meta b/Assets/MixedRealityAzure-Examples/LUIS.meta
new file mode 100644
index 0000000..c82302e
--- /dev/null
+++ b/Assets/MixedRealityAzure-Examples/LUIS.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: a6f7954a60840974cbd54c6553a7f2a4
+folderAsset: yes
+timeCreated: 1518220169
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure-Examples/LUIS/Scenes.meta b/Assets/MixedRealityAzure-Examples/LUIS/Scenes.meta
new file mode 100644
index 0000000..4c7a1ef
--- /dev/null
+++ b/Assets/MixedRealityAzure-Examples/LUIS/Scenes.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: fdfdc99caa9e2b541940730810385761
+folderAsset: yes
+timeCreated: 1518220179
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure-Examples/LUIS/Scenes/LUISTest.unity b/Assets/MixedRealityAzure-Examples/LUIS/Scenes/LUISTest.unity
new file mode 100644
index 0000000..7aac0bb
--- /dev/null
+++ b/Assets/MixedRealityAzure-Examples/LUIS/Scenes/LUISTest.unity
@@ -0,0 +1,305 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 8
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 0
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_TemporalCoherenceThreshold: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 1
+ m_LightmapEditorSettings:
+ serializedVersion: 9
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_TextureWidth: 1024
+ m_TextureHeight: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 0
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 500
+ m_PVRBounces: 2
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringMode: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ShowResolutionOverlay: 1
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &664368916
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 664368920}
+ - component: {fileID: 664368919}
+ - component: {fileID: 664368918}
+ - component: {fileID: 664368917}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &664368917
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 664368916}
+ m_Enabled: 1
+--- !u!124 &664368918
+Behaviour:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 664368916}
+ m_Enabled: 1
+--- !u!20 &664368919
+Camera:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 664368916}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ 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: 1
+ m_AllowMSAA: 1
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &664368920
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 664368916}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: -10}
+ 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!1 &1082056800
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1082056802}
+ - component: {fileID: 1082056801}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &1082056801
+Light:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1082056800}
+ m_Enabled: 1
+ serializedVersion: 8
+ m_Type: 1
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ 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: 0
+ 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_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &1082056802
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1082056800}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &1776187684
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1776187686}
+ - component: {fileID: 1776187685}
+ m_Layer: 0
+ m_Name: LUIS
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1776187685
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1776187684}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d268b595133a624f8d05847a7d3ef36, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ AppId:
+ AppKey:
+ Domain: southcentralus
+ Preview: 0
+ Verbose: 0
+--- !u!4 &1776187686
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1776187684}
+ 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: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
diff --git a/Assets/MixedRealityAzure-Examples/LUIS/Scenes/LUISTest.unity.meta b/Assets/MixedRealityAzure-Examples/LUIS/Scenes/LUISTest.unity.meta
new file mode 100644
index 0000000..6732ebd
--- /dev/null
+++ b/Assets/MixedRealityAzure-Examples/LUIS/Scenes/LUISTest.unity.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 017fcfbfe9263b1459783ab0eed8f7f4
+timeCreated: 1518220199
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure.meta b/Assets/MixedRealityAzure.meta
new file mode 100644
index 0000000..bc2228d
--- /dev/null
+++ b/Assets/MixedRealityAzure.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 9568e7e427cbc4244848e4698efd172a
+folderAsset: yes
+timeCreated: 1518194984
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure/Common.meta b/Assets/MixedRealityAzure/Common.meta
new file mode 100644
index 0000000..2aeae09
--- /dev/null
+++ b/Assets/MixedRealityAzure/Common.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 5022ba4cc73cf234da706daa44c288d0
+folderAsset: yes
+timeCreated: 1518192936
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure/Common/Scripts.meta b/Assets/MixedRealityAzure/Common/Scripts.meta
new file mode 100644
index 0000000..de07fcb
--- /dev/null
+++ b/Assets/MixedRealityAzure/Common/Scripts.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 3e75a259c0673f4419257951c28a8de1
+folderAsset: yes
+timeCreated: 1518192936
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure/Common/Scripts/SecretHelper.cs b/Assets/MixedRealityAzure/Common/Scripts/SecretHelper.cs
new file mode 100644
index 0000000..e96630b
--- /dev/null
+++ b/Assets/MixedRealityAzure/Common/Scripts/SecretHelper.cs
@@ -0,0 +1,158 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license.
+//
+// MIT License:
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using Microsoft.Cognitive.LUIS;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Security;
+using System.Threading.Tasks;
+using System.Reflection;
+using UnityEngine;
+
+#if !UNITY_WSA || UNITY_EDITOR
+using System.Security.Cryptography.X509Certificates;
+#endif
+
+namespace Microsoft.MR
+{
+ ///
+ /// An attribute that can be used to designate where a secret value is held.
+ ///
+ [AttributeUsage(validOn: AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
+ public class SecretValueAttribute : Attribute
+ {
+ #region Member Variables
+ private string name;
+ #endregion // Member Variables
+
+ #region Constructors
+ ///
+ /// Initializes a new instance.
+ ///
+ ///
+ /// The name of the secret value.
+ ///
+ public SecretValueAttribute(string name)
+ {
+ // Validate
+ if (string.IsNullOrEmpty(name)) throw new ArgumentException(nameof(name));
+
+ // Store
+ this.name = name;
+ }
+ #endregion // Constructors
+
+ #region Public Properties
+ ///
+ /// Gets the name of the secret.
+ ///
+ public string Name => name;
+ #endregion // Public Properties
+ }
+
+ ///
+ /// A class that helps deal with secret keys and other values that should not be
+ /// checked into source control.
+ ///
+ static public class SecretHelper
+ {
+ #region Internal Methods
+ ///
+ /// Attempts to load a secret value into the specified field.
+ ///
+ ///
+ /// A that indicates the source of the secret value.
+ ///
+ ///
+ /// The field where the value will be loaded.
+ ///
+ ///
+ /// The object instance where the value will be set.
+ ///
+ static private void TryLoadValue(SecretValueAttribute sva, FieldInfo field, object obj)
+ {
+ // Try to get the environment variable
+ string svalue = Environment.GetEnvironmentVariable(sva.Name);
+
+ // No variable or no value?
+ if (string.IsNullOrEmpty(svalue))
+ {
+ Debug.LogWarning($"The environment variable {sva.Name} is either missing or has no value.");
+ return;
+ }
+
+ // If string, just assign. Otherwise attempt to convert.
+ if (field.FieldType == typeof(string))
+ {
+ field.SetValue(obj, svalue);
+ }
+ else
+ {
+ try
+ {
+ object cvalue = Convert.ChangeType(svalue, field.FieldType);
+ field.SetValue(obj, cvalue);
+ }
+ catch (Exception ex)
+ {
+ Debug.LogWarning($"The value '{svalue}' of environment variable {sva.Name} could not be converted to {field.FieldType.Name}. {ex.Message}");
+ }
+ }
+ }
+ #endregion // Internal Methods
+
+ #region Public Methods
+ ///
+ /// Attempts to load all secret values for the specified object.
+ ///
+ ///
+ /// The object where secret values will be loaded.
+ ///
+ static public void LoadSecrets(object obj)
+ {
+ // Validate
+ if (obj == null) throw new ArgumentNullException(nameof(obj));
+
+ // Get all fields
+ FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
+
+ // Look for secret fields
+ foreach (var field in fields)
+ {
+ // Try to get attribute
+ SecretValueAttribute sva = field.GetCustomAttribute();
+
+ // If not a secret, skip
+ if (sva == null) { continue; }
+
+ // Try to load the value
+ TryLoadValue(sva, field, obj);
+ }
+ }
+ #endregion // Public Methods
+ }
+}
\ No newline at end of file
diff --git a/Assets/MixedRealityAzure/Common/Scripts/SecretHelper.cs.meta b/Assets/MixedRealityAzure/Common/Scripts/SecretHelper.cs.meta
new file mode 100644
index 0000000..6877c1c
--- /dev/null
+++ b/Assets/MixedRealityAzure/Common/Scripts/SecretHelper.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: c1367348fc0344245bfc3e9f2788bc85
+timeCreated: 1518192940
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure/Common/Scripts/UnityExtensions.cs b/Assets/MixedRealityAzure/Common/Scripts/UnityExtensions.cs
new file mode 100644
index 0000000..b030bce
--- /dev/null
+++ b/Assets/MixedRealityAzure/Common/Scripts/UnityExtensions.cs
@@ -0,0 +1,52 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license.
+//
+// MIT License:
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using UnityEngine;
+using UnityEngine.Assertions;
+
+namespace Microsoft.MR
+{
+ ///
+ /// Extension methods for Unity Behaviors
+ ///
+ static public class BahaviorExtensions
+ {
+ ///
+ /// Asserts that the behavior is enabled.
+ ///
+ ///
+ /// The behavior to test.
+ ///
+ static public void AssertEnabled(this Behaviour behavior)
+ {
+ Assert.IsTrue(behavior.enabled);
+ }
+ }
+}
diff --git a/Assets/MixedRealityAzure/Common/Scripts/UnityExtensions.cs.meta b/Assets/MixedRealityAzure/Common/Scripts/UnityExtensions.cs.meta
new file mode 100644
index 0000000..0c47c24
--- /dev/null
+++ b/Assets/MixedRealityAzure/Common/Scripts/UnityExtensions.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 19d3ab1d0b1564943b281c2a18233d47
+timeCreated: 1518204444
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure/LUIS.meta b/Assets/MixedRealityAzure/LUIS.meta
new file mode 100644
index 0000000..2be93b2
--- /dev/null
+++ b/Assets/MixedRealityAzure/LUIS.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: cc4a9b21378edde47810d5a29ae13a35
+folderAsset: yes
+timeCreated: 1518188532
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure/LUIS/README.md b/Assets/MixedRealityAzure/LUIS/README.md
new file mode 100644
index 0000000..39dd415
--- /dev/null
+++ b/Assets/MixedRealityAzure/LUIS/README.md
@@ -0,0 +1,60 @@
+# LUIS Reference for Mixed Reality Applications
+
+This project serves as a reference for integrating the [Language Understanding Intelligence Service](https://www.luis.ai/home) (LUIS) into Mixed Reality applications. Though **Mixed Reality** is in the title, this reference is not exclusive to Windows Mixed Reality devices.
+
+
+- [Objective](#objective)
+- [Minimum requirements](#minimum-requirements)
+- [Running the demo scene](#running-the-demo-scene)
+- [Adding these components to your project](#setting-up-components)
+- [What's next](#next-steps)
+
+
+## Objective
+It's quite easy to leverage voice commands in Unity through the [KeywordRecognizer](https://docs.unity3d.com/ScriptReference/Windows.Speech.KeywordRecognizer.html) class. Voice commands are very powerful, but they also present their own set of challenges:
+
+- **Voice commands don't have context** - They work great for global commands like "Save", but targeting voice commands at an object in the scene requires additional code. The [MRTK](https://github.com/Microsoft/MixedRealityToolkit-Unity) attempts to help with this through the [ISpeechHandler](https://github.com/Microsoft/MixedRealityToolkit-Unity/blob/master/Assets/HoloToolkit/Input/Scripts/InputHandlers/ISpeechHandler.cs) interface. This interface allows voice commands to be routed to whichever object the user is gazing at.
+
+- **Voice commands are explicit** - Being able to say "move the box" and "move the cube" requires two different voice commands (even though "box" and "cube" may mean the same object). Similarly, "move the box left" and "move the box right" require two different voice commands just to support those two directions. As you can imagine, the number of objects in the scene and the ways you can interact with them exponentially increases the commands required to support them.
+
+-
+
+and dictation as input as part of the MR Toolkit, there is no language understanding as part of that input out of the box. By adding support for LUIS in Unity you can use natural language to control Unity game objects. This project was initially developed during an internal Microsoft Mixed Reality hack.
+
+## Minimum Requirements
+- [Unity MRTP5](http://beta.unity3d.com/download/a07ad30bae31/download.html)
+- Enable `.NET 4.6 (experimental)` under player settings
+- Enable `.NET backend` under player settings
+
+## Running the Demo Scene ##
+1. Set up a [LUIS account](https://www.luis.ai/home). Under 'My Apps', select 'Import App' and choose the LuisApp.json file from this repository. Make sure to train the model and publish it to get the App ID and App Key (which you'll need later).
+2. In Unity, open the LUIS folder in this repository as your project. Click on the LUIS-Sample scene in Assets to open the scene.
+3. Click on `LUISDictationManager` in the Hierarchy and enter your [App ID and App Key](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/manage-keys) for the LUIS model you set up in the first step.
+4. Go to the File menu -> Build Settings -> Add Open Scenes. Change the platform to Universal Windows Platform and click 'Switch Platform'. Make sure the build type is D3D and Unity C# Projects is checked.
+5. Click Build, create a separate folder called 'App' and select that folder.
+6. After it Builds, go into your 'App' folder and open the .sln file in Visual Studio. In Visual Studio on the second top toolbar, change the drop down menus from 'Debug' to 'Release', 'ARM' to 'x64', and deploy to 'Local Machine'. You'll want to deploy without debugging, which you can do in Debug -> Start Without Debugging.
+7. Make sure your headset is plugged in and you have at least one motion controller. Click on the Record Button, allow the app to use your microphone, and say a command into your mic.
+Commands include:
+- change the box/ball to \*color\*
+- make the box/ball big/medium/small
+
+
+## Setting Up Components ##
+Here's what you need to do in order to use these tools in your project.
+### UNITY ###
+- In Assets -> LUISAssets-> Prefabs, add the `LUISDictationManager` prefab to your scene. After you complete the LUIS steps below, make sure to add your App ID and App Key to `LUISDictationManager`.
+- Make sure you have some way to start/stop dictation. In the sample application, we used a "Record Button" that called `StartRecordingDictation()` and `StopRecordingDictation()` from the `DictationToLUIS` script.
+### LUIS ###
+> Note: When training the LUIS model for Unity we reserved one set of entities for object identification and selection. Then we added additional Entity sets for altering the game object's properties (such as color or size).
+
+In order to implement in Unity:
+- Attach the `LuisBehavior` script onto the Unity GameObject you wish to control.
+- Enter the Entity type and Entity name used for object identification purposes. eg. The Entity type might be "Shape" and the Entity name id "box".
+
+
+## Next Steps ##
+These are potential ideas for improving this project.
+- Implement raycasting to determine what the player is looking in addition to explicitly stating which GameObject to affect.
+- Create an easy to use UI for `LUISBehavior` so you don't have to hook everything up on the script.
+- Auto import LUIS Intents and Entity catagories so users don't have to explicitly use strings on the `LUISBehavior` script.
+- Investigate use of ScriptableoOjects to hold LUIS behaviors.
diff --git a/Assets/MixedRealityAzure/LUIS/README.md.meta b/Assets/MixedRealityAzure/LUIS/README.md.meta
new file mode 100644
index 0000000..5a9b277
--- /dev/null
+++ b/Assets/MixedRealityAzure/LUIS/README.md.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 29dbc198602d76f4aa16b238137ce16a
+timeCreated: 1518192966
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure/LUIS/Scripts.meta b/Assets/MixedRealityAzure/LUIS/Scripts.meta
new file mode 100644
index 0000000..af49e13
--- /dev/null
+++ b/Assets/MixedRealityAzure/LUIS/Scripts.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 04ee24cfdb53edd438723456060afdb8
+folderAsset: yes
+timeCreated: 1518189239
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MixedRealityAzure/LUIS/Scripts/LuisManager.cs b/Assets/MixedRealityAzure/LUIS/Scripts/LuisManager.cs
new file mode 100644
index 0000000..a7ca819
--- /dev/null
+++ b/Assets/MixedRealityAzure/LUIS/Scripts/LuisManager.cs
@@ -0,0 +1,183 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license.
+//
+// MIT License:
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using Microsoft.Cognitive.LUIS;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Security;
+using System.Threading.Tasks;
+using UnityEngine;
+
+#if !UNITY_WSA || UNITY_EDITOR
+using System.Security.Cryptography.X509Certificates;
+#endif
+
+namespace Microsoft.MR.LUIS
+{
+ ///
+ /// Manages configuration and connection to the LUIS service.
+ ///
+ public class LuisManager : MonoBehaviour
+ {
+ #region Member Variables
+ private LuisClient client;
+ #endregion // Member Variables
+
+ #region Unity Inspector Variables
+ [Tooltip("The application ID of the LUIS application.")]
+ [SecretValue("LUIS.AppId")]
+ public string AppId;
+
+ [Tooltip("The application subscription key of the LUIS application.")]
+ [SecretValue("LUIS.AppKey")]
+ public string AppKey;
+
+ [Tooltip("String that represents the domain of the LUIS endpoint.")]
+ public string Domain = "westus";
+
+ [Tooltip("Whether to use preview LUIS features.")]
+ public bool Preview = false;
+
+ [Tooltip("Whether to return full result of all intents not just the top scoring intent (for preview features only).")]
+ public bool Verbose = false;
+ #endregion // Unity Inspector Variables
+
+ #region Internal Methods
+ ///
+ /// Makes sure that the client has been created.
+ ///
+ private void EnsureClient()
+ {
+ this.AssertEnabled();
+ if (client == null)
+ {
+ client = new LuisClient(AppId, AppKey, Verbose, Domain);
+ }
+ }
+ #endregion // Internal Methods
+
+ #region Unity Overrides
+ protected virtual void Awake()
+ {
+ #if !UNITY_WSA || UNITY_EDITOR
+ //This works, and one of these two options are required as Unity's TLS (SSL) support doesn't currently work like .NET
+ //ServicePointManager.CertificatePolicy = new CustomCertificatePolicy();
+
+ //This 'workaround' seems to work for the .NET Storage SDK, but not event hubs.
+ //If you need all of it (ex Storage, event hubs,and app insights) then consider using the above.
+ //If you don't want to check an SSL certificate coming back, simply use the return true delegate below.
+ //Also it may help to use non-ssl URIs if you have the ability to, until Unity fixes the issue (which may be fixed by the time you read this)
+ ServicePointManager.ServerCertificateValidationCallback = CheckValidCertificateCallback; //delegate { return true; };
+ #endif
+
+ // Attempt to load secrets
+ SecretHelper.LoadSecrets(this);
+
+ // Make sure we have enough to continue
+ if (string.IsNullOrEmpty(AppId))
+ {
+ Debug.LogErrorFormat("'{0}' is required but is not set. {1} has been disabled.", "AppId", this.GetType().Name);
+ this.enabled = false;
+ }
+
+ if (string.IsNullOrEmpty(AppKey))
+ {
+ Debug.LogErrorFormat("'{0}' is required but is not set. {1} has been disabled.", "AppKey", this.GetType().Name);
+ this.enabled = false;
+ }
+ }
+
+ protected virtual async void Start()
+ {
+ await Predict("Turn the box blue");
+ }
+ #endregion // Unity Overrides
+
+ #region Overridables / Event Triggers
+ #if !UNITY_WSA || UNITY_EDITOR
+ protected virtual bool CheckValidCertificateCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
+ {
+ bool valid = true;
+
+ // If there are errors in the certificate chain, look at each error to determine the cause.
+ if (sslPolicyErrors != SslPolicyErrors.None)
+ {
+ for (int i = 0; i < chain.ChainStatus.Length; i++)
+ {
+ if (chain.ChainStatus[i].Status != X509ChainStatusFlags.RevocationStatusUnknown)
+ {
+ chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
+ chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
+ chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
+ chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
+ bool chainIsValid = chain.Build((X509Certificate2)certificate);
+ if (!chainIsValid)
+ {
+ valid = false;
+ }
+ }
+ }
+ }
+ return valid;
+ }
+ #endif
+
+ protected virtual void ProcessResult(LuisResult result)
+ {
+ Debug.LogFormat($"Top Intent: {result.TopScoringIntent.Name} with a score of {result.TopScoringIntent.Score}");
+ }
+ #endregion // Overridables / Event Triggers
+
+ #region Public Methods
+ public async Task Predict(string text)
+ {
+ // Make sure we have a client
+ EnsureClient();
+
+ // Use client to do the prediction
+ LuisResult result = await client.Predict(text);
+
+ // Process the result
+ ProcessResult(result);
+ }
+ #endregion // Public Methods
+
+ #region Public Properties
+ ///
+ /// Gets the instance created by this manager.
+ ///
+ public LuisClient Client
+ {
+ get
+ {
+ this.EnsureClient();
+ return client;
+ }
+ }
+ #endregion // Public Properties
+ }
+}
\ No newline at end of file
diff --git a/Assets/MixedRealityAzure/LUIS/Scripts/LuisManager.cs.meta b/Assets/MixedRealityAzure/LUIS/Scripts/LuisManager.cs.meta
new file mode 100644
index 0000000..dcf4dff
--- /dev/null
+++ b/Assets/MixedRealityAzure/LUIS/Scripts/LuisManager.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 9d268b595133a624f8d05847a7d3ef36
+timeCreated: 1518189330
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta
new file mode 100644
index 0000000..1b0e9d8
--- /dev/null
+++ b/Assets/Plugins.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 39cd5cf49fa594448aefc8dc3cfc4b4e
+folderAsset: yes
+timeCreated: 1512434829
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Dependencies.meta b/Assets/Plugins/Dependencies.meta
new file mode 100644
index 0000000..eec7c52
--- /dev/null
+++ b/Assets/Plugins/Dependencies.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: ea3ad00f1f4b5f0428823fb13c89e4aa
+folderAsset: yes
+timeCreated: 1512435111
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Dependencies/Newtonsoft.Json.meta b/Assets/Plugins/Dependencies/Newtonsoft.Json.meta
new file mode 100644
index 0000000..0bc4359
--- /dev/null
+++ b/Assets/Plugins/Dependencies/Newtonsoft.Json.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: c853715c7c345dc4fa7861d5fedd2414
+folderAsset: yes
+timeCreated: 1512435190
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Dependencies/Newtonsoft.Json/portable-net45+wp80+win8+wpa81.meta b/Assets/Plugins/Dependencies/Newtonsoft.Json/portable-net45+wp80+win8+wpa81.meta
new file mode 100644
index 0000000..32d6465
--- /dev/null
+++ b/Assets/Plugins/Dependencies/Newtonsoft.Json/portable-net45+wp80+win8+wpa81.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 9120e8cf3520066489d5bcd98b27a81f
+folderAsset: yes
+timeCreated: 1512435062
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Dependencies/Newtonsoft.Json/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll b/Assets/Plugins/Dependencies/Newtonsoft.Json/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll
new file mode 100644
index 0000000000000000000000000000000000000000..828927481e01ee3f7c78e6486f40c7742f10777c
GIT binary patch
literal 468480
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