From a8c0d8cdb7ed979414766457445b1ff23f594a8c Mon Sep 17 00:00:00 2001 From: Jared Finder Date: Mon, 12 Oct 2015 10:28:22 -0700 Subject: [PATCH] release-yamabe --- .../Google-Unity/Scripts/AndroidHelper.cs | 131 +++--- .../Google-Unity/Scripts/AndroidLifecycle.cs | 313 ++++++++------ .../Plugins/Android/UnityUxHelper/bin/R.txt | 121 +++++- .../UnityUxHelper/bin/unityuxhelper.jar | Bin 6236 -> 7032 bytes .../bin/AndroidManifest.xml | 2 +- .../tango-ux-support-library/bin/R.txt | 103 +++-- .../bin/tango-ux-support-library.jar | Bin 77962 -> 75825 bytes .../res/drawable-land-xhdpi.meta | 9 + .../hold_steady_frame_err.png | Bin 0 -> 1525 bytes .../hold_steady_frame_err.png.meta | 2 +- .../hold_steady_frame_ok.png | Bin 0 -> 1566 bytes .../hold_steady_frame_ok.png.meta | 2 +- .../hold_steady_trace_left_1.png | Bin 0 -> 6616 bytes .../hold_steady_trace_left_1.png.meta | 2 +- .../hold_steady_trace_left_2.png | Bin 0 -> 7897 bytes .../hold_steady_trace_left_2.png.meta | 2 +- .../hold_steady_trace_right_1.png | Bin 0 -> 6983 bytes .../hold_steady_trace_right_1.png.meta | 2 +- .../hold_steady_trace_right_2.png | Bin 0 -> 7943 bytes .../hold_steady_trace_right_2.png.meta | 2 +- .../res/drawable-port-xhdpi.meta | 9 + .../hold_steady_frame_err.png | Bin .../hold_steady_frame_err.png.meta | 6 + .../hold_steady_frame_ok.png | Bin .../hold_steady_frame_ok.png.meta | 6 + .../hold_steady_trace_left_1.png | Bin .../hold_steady_trace_left_1.png.meta | 6 + .../hold_steady_trace_left_2.png | Bin .../hold_steady_trace_left_2.png.meta | 6 + .../hold_steady_trace_right_1.png | Bin .../hold_steady_trace_right_1.png.meta | 6 + .../hold_steady_trace_right_2.png | Bin .../hold_steady_trace_right_2.png.meta | 6 + .../res/drawable-xhdpi/splash_logo.png | Bin 27709 -> 0 bytes .../res/drawable-xhdpi/splash_logo.png.meta | 6 - .../res/layout/component_hold_steady.xml | 2 +- .../res/layout/layout_splash.xml.meta | 6 - .../res/values-land.meta | 9 + .../dimens.xml} | 51 +-- .../res/values-land/dimens.xml.meta | 6 + .../res/values-port.meta | 9 + .../res/values-port/dimens.xml | 21 + .../res/values-port/dimens.xml.meta | 6 + .../res/values/configuration.xml | 10 + .../res/values/configuration.xml.meta | 6 + .../res/values/dimens.xml | 2 +- .../Scenes/ExperimentalAugmentedReality.unity | 202 ++------- .../AreaLearning/Scripts/SaveADFController.cs | 146 ++++++- .../Scripts/ARScreen.cs | 386 ------------------ .../Scripts/AugmentedRealityGUIController.cs | 14 +- .../PersistentStatePoseController.cs | 1 + .../Scripts/TangoARPoseController.cs | 306 ++++++++++++++ .../Scripts/TangoARPoseController.cs.meta | 12 + .../TangoPrefabs/Scripts/TangoARScreen.cs | 215 ++++++++++ .../Scripts/TangoARScreen.cs.meta} | 0 .../Scripts/TangoGestureCamera.cs | 12 +- .../TangoPrefabs/Scripts/TangoMultiCamera.cs | 12 +- .../TangoPrefabs/Scripts/TangoPointCloud.cs | 1 + .../TangoPrefabs/Tango AR Camera.prefab | 151 +++++++ .../TangoPrefabs/Tango AR Camera.prefab.meta | 8 + .../Core/Scripts/Common/TangoAndroidHelper.cs | 60 ++- .../Core/Scripts/Common/TangoEnums.cs | 5 + .../Scripts/TangoWrappers/PoseProvider.cs | 28 +- .../Scripts/TangoWrappers/TangoApplication.cs | 78 +--- UnityExamples/Assets/TangoSDK/Core/Tango.dat | 2 +- .../Assets/TangoSDK/Editor/TangoInspector.cs | 25 +- .../TangoUX/Scripts/Common/AndroidHelper.cs | 77 +++- .../TangoUX/Scripts/Common/TangoUxEnums.cs | 46 ++- .../TangoUX/Scripts/Common/TangoUxTypes.cs | 38 +- .../TangoUX/Scripts/Interfaces/ITangoUX.cs | 38 +- .../Listeners/UxExceptionEventListener.cs | 92 +++-- .../TangoSDK/TangoUX/Scripts/TangoUx.cs | 84 ++-- .../ProjectSettings/ProjectSettings.asset | 4 +- 73 files changed, 1804 insertions(+), 1109 deletions(-) create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi.meta create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_frame_err.png rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-land-xhdpi}/hold_steady_frame_err.png.meta (70%) create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_frame_ok.png rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-land-xhdpi}/hold_steady_frame_ok.png.meta (70%) create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_1.png rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-land-xhdpi}/hold_steady_trace_left_1.png.meta (70%) create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_2.png rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-land-xhdpi}/hold_steady_trace_left_2.png.meta (70%) create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_1.png rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-land-xhdpi}/hold_steady_trace_right_1.png.meta (70%) create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_2.png rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-land-xhdpi}/hold_steady_trace_right_2.png.meta (70%) create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi.meta rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-port-xhdpi}/hold_steady_frame_err.png (100%) mode change 100755 => 100644 create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_err.png.meta rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-port-xhdpi}/hold_steady_frame_ok.png (100%) mode change 100755 => 100644 create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_ok.png.meta rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-port-xhdpi}/hold_steady_trace_left_1.png (100%) mode change 100755 => 100644 create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_1.png.meta rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-port-xhdpi}/hold_steady_trace_left_2.png (100%) mode change 100755 => 100644 create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_2.png.meta rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-port-xhdpi}/hold_steady_trace_right_1.png (100%) mode change 100755 => 100644 create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_1.png.meta rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{drawable-xhdpi => drawable-port-xhdpi}/hold_steady_trace_right_2.png (100%) mode change 100755 => 100644 create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_2.png.meta delete mode 100755 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/splash_logo.png delete mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/splash_logo.png.meta delete mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/layout_splash.xml.meta create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-land.meta rename UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/{layout/layout_splash.xml => values-land/dimens.xml} (56%) mode change 100755 => 100644 create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-land/dimens.xml.meta create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port.meta create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port/dimens.xml create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port/dimens.xml.meta create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/configuration.xml create mode 100644 UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/configuration.xml.meta delete mode 100644 UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs create mode 100644 UnityExamples/Assets/TangoPrefabs/Scripts/TangoARPoseController.cs create mode 100644 UnityExamples/Assets/TangoPrefabs/Scripts/TangoARPoseController.cs.meta create mode 100644 UnityExamples/Assets/TangoPrefabs/Scripts/TangoARScreen.cs rename UnityExamples/Assets/{TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs.meta => TangoPrefabs/Scripts/TangoARScreen.cs.meta} (100%) create mode 100644 UnityExamples/Assets/TangoPrefabs/Tango AR Camera.prefab create mode 100644 UnityExamples/Assets/TangoPrefabs/Tango AR Camera.prefab.meta diff --git a/UnityExamples/Assets/Google-Unity/Scripts/AndroidHelper.cs b/UnityExamples/Assets/Google-Unity/Scripts/AndroidHelper.cs index 54bc8724..10ad979b 100644 --- a/UnityExamples/Assets/Google-Unity/Scripts/AndroidHelper.cs +++ b/UnityExamples/Assets/Google-Unity/Scripts/AndroidHelper.cs @@ -1,21 +1,27 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- + +#if UNITY_ANDROID && !UNITY_EDITOR #define ANDROID_DEVICE #endif -/* - * Copyright 2014 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ + using System; using System.Collections; using UnityEngine; @@ -38,12 +44,12 @@ public partial class AndroidHelper : MonoBehaviour public static void RegisterPauseEvent(OnPauseEventHandler onPause) { #if ANDROID_DEVICE - if(m_callbacks == null) - { - RegisterCallbacks(); - } + if (m_callbacks == null) + { + _RegisterCallbacks(); + } - m_callbacks.RegisterOnPause(onPause); + m_callbacks.RegisterOnPause(onPause); #endif } @@ -54,12 +60,12 @@ public static void RegisterPauseEvent(OnPauseEventHandler onPause) public static void RegisterResumeEvent(OnResumeEventHandler onResume) { #if ANDROID_DEVICE - if(m_callbacks == null) - { - RegisterCallbacks(); - } - - m_callbacks.RegisterOnResume(onResume); + if (m_callbacks == null) + { + _RegisterCallbacks(); + } + + m_callbacks.RegisterOnResume(onResume); #endif } @@ -70,29 +76,12 @@ public static void RegisterResumeEvent(OnResumeEventHandler onResume) public static void RegisterOnActivityResultEvent(OnActivityResultEventHandler onActivityResult) { #if ANDROID_DEVICE - if(m_callbacks == null) - { - RegisterCallbacks(); - } - - m_callbacks.RegisterOnActivityResult(onActivityResult); - #endif - } + if (m_callbacks == null) + { + _RegisterCallbacks(); + } - /// - /// Inializes the AndroidJavaProxy for the Android lifecycle callbacks. - /// - private static void RegisterCallbacks() - { - #if ANDROID_DEVICE - m_callbacks = new AndroidLifecycleCallbacks(); - - m_unityActivity = GetUnityActivity(); - if(m_unityActivity != null) - { - Debug.Log("AndroidLifecycle callback set"); - m_unityActivity.Call("attachLifecycleListener", m_callbacks); - } + m_callbacks.RegisterOnActivityResult(onActivityResult); #endif } @@ -103,20 +92,20 @@ private static void RegisterCallbacks() public static AndroidJavaObject GetUnityActivity() { #if ANDROID_DEVICE - if(m_unityActivity == null) - { + if (m_unityActivity == null) + { try { - AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - m_unityActivity = unityPlayer.GetStatic("currentActivity"); + AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); + m_unityActivity = unityPlayer.GetStatic("currentActivity"); } - catch(AndroidJavaException e) + catch (AndroidJavaException e) { Debug.Log("AndroidJavaException : " + e.Message); m_unityActivity = null; } - } - return m_unityActivity; + } + return m_unityActivity; #else return null; #endif @@ -331,7 +320,8 @@ public static void ShowAndroidToastMessage(string message) try { AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast"); - unityActivity.Call("runOnUiThread", new AndroidJavaRunnable(() => { + unityActivity.Call("runOnUiThread", new AndroidJavaRunnable(() => + { AndroidJavaObject toastObject = toastClass.CallStatic("makeText", unityActivity, message, 0x00000001); toastObject.Call("show"); })); @@ -349,7 +339,7 @@ public static void ShowAndroidToastMessage(string message) public static void AndroidFinish() { AndroidJavaObject unityActivity = GetUnityActivity(); - + if (unityActivity != null) { try @@ -362,7 +352,7 @@ public static void AndroidFinish() } } } - + /// /// Calls quit on the Unity Activity. /// @@ -371,13 +361,30 @@ public static void AndroidQuit() #if ANDROID_DEVICE try { - AndroidJavaClass system = new AndroidJavaClass("java.lang.System"); - system.CallStatic("exit", 0); + AndroidJavaClass system = new AndroidJavaClass("java.lang.System"); + system.CallStatic("exit", 0); } - catch(AndroidJavaException e) + catch (AndroidJavaException e) { Debug.Log("AndroidJavaException : " + e.Message); } #endif } + + /// + /// Inializes the AndroidJavaProxy for the Android lifecycle callbacks. + /// + private static void _RegisterCallbacks() + { + #if ANDROID_DEVICE + m_callbacks = new AndroidLifecycleCallbacks(); + + m_unityActivity = GetUnityActivity(); + if (m_unityActivity != null) + { + Debug.Log("AndroidLifecycle callback set"); + m_unityActivity.Call("attachLifecycleListener", m_callbacks); + } + #endif + } } diff --git a/UnityExamples/Assets/Google-Unity/Scripts/AndroidLifecycle.cs b/UnityExamples/Assets/Google-Unity/Scripts/AndroidLifecycle.cs index 45099863..caaba64d 100644 --- a/UnityExamples/Assets/Google-Unity/Scripts/AndroidLifecycle.cs +++ b/UnityExamples/Assets/Google-Unity/Scripts/AndroidLifecycle.cs @@ -1,144 +1,191 @@ -/* - * Copyright 2014 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -using UnityEngine; +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- using System.Collections; +using UnityEngine; + +[module: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", + "SA1649:FileHeaderFileNameDocumentationMustMatchTypeName", + Justification = "Legacy support.")] +/// +/// Delegate for the Android onPause event. +/// public delegate void OnPauseEventHandler(); + +/// +/// Delegate for the Android onResume event. +/// public delegate void OnResumeEventHandler(); + +/// +/// Delegate for the Android onActivityResult event. +/// +/// Request code. +/// Result code. +/// Data. public delegate void OnActivityResultEventHandler(int requestCode, int resultCode, AndroidJavaObject data); /// /// Binds callbacks directly to Android lifecycle. /// public class AndroidLifecycleCallbacks : AndroidJavaProxy -{ - public AndroidLifecycleCallbacks() : base("com.google.unity.GoogleUnityActivity$AndroidLifecycleListener"){} - - private static event OnPauseEventHandler m_onPause; - private static event OnResumeEventHandler m_onResume; - private static event OnActivityResultEventHandler m_onActivityResult; - - /// - /// Registers the on pause callback to Android. - /// - /// On pause. - public void RegisterOnPause(OnPauseEventHandler onPause) - { - if(onPause != null) - { - m_onPause += onPause; - } - } - - /// - /// Registers the on resume callback to Android. - /// - /// On resume. - public void RegisterOnResume(OnResumeEventHandler onResume) - { - if(onResume != null) - { - m_onResume += onResume; - } - } - - /// - /// Registers the on onActivityResult callback to Android. - /// - /// On activity result. - public void RegisterOnActivityResult(OnActivityResultEventHandler onActivityResult) - { - if(onActivityResult != null) - { - m_onActivityResult += onActivityResult; - } - } - - /// - /// Unregisters the on pause callback to Android. - /// - /// On pause. - public void UnregisterOnPause(OnPauseEventHandler onPause) - { - if(onPause != null) - { - m_onPause -= onPause; - } - } - - /// - /// Unregisters the on resume callback to Android. - /// - /// On resume. - public void UnregisterOnResume(OnResumeEventHandler onResume) - { - if(onResume != null) - { - m_onResume -= onResume; - } - } - - /// - /// Unregisters the on onActivityResult callback to Android. - /// - /// On activity result. - public void UnregisterOnActivityResult(OnActivityResultEventHandler onActivityResult) - { - if(onActivityResult != null) - { - m_onActivityResult -= onActivityResult; - } - } - - /// - /// Implements the Android onPause. - /// - protected void onPause() - { - if(m_onPause != null) - { - Debug.Log("Unity got the Java onPause"); - m_onPause(); - } - } - - /// - /// Implements the Android onResume. - /// - protected void onResume() - { - if(m_onResume != null) - { - Debug.Log("Unity got the Java onResume"); - m_onResume(); - } - } - - /// - /// Implements the Android onActivityResult. - /// - /// Request code. - /// Result code. - /// Data. - protected void onActivityResult(int requestCode, int resultCode, AndroidJavaObject data) - { - if(m_onActivityResult != null) - { - Debug.Log("Unity got the Java onActivityResult"); - m_onActivityResult(requestCode, resultCode, data); - } - } +{ + /// + /// Initializes a new instance of the class. + /// + public AndroidLifecycleCallbacks() : base("com.google.unity.GoogleUnityActivity$AndroidLifecycleListener") + { + } + + /// + /// Occurs when the Android onPause event is fired. + /// + private static event OnPauseEventHandler OnPauseEvent; + + /// + /// Occurs when the Android onResume event is fired. + /// + private static event OnResumeEventHandler OnResumeEvent; + + /// + /// Occurs when the Android onActivityResult event is fired. + /// + private static event OnActivityResultEventHandler OnActivityResultEvent; + + /// + /// Registers the on pause callback to Android. + /// + /// On pause. + public void RegisterOnPause(OnPauseEventHandler onPause) + { + if (onPause != null) + { + OnPauseEvent += onPause; + } + } + + /// + /// Registers the on resume callback to Android. + /// + /// On resume. + public void RegisterOnResume(OnResumeEventHandler onResume) + { + if (onResume != null) + { + OnResumeEvent += onResume; + } + } + + /// + /// Registers the on onActivityResult callback to Android. + /// + /// On activity result. + public void RegisterOnActivityResult(OnActivityResultEventHandler onActivityResult) + { + if (onActivityResult != null) + { + OnActivityResultEvent += onActivityResult; + } + } + + /// + /// Unregisters the on pause callback to Android. + /// + /// On pause. + public void UnregisterOnPause(OnPauseEventHandler onPause) + { + if (onPause != null) + { + OnPauseEvent -= onPause; + } + } + + /// + /// Unregisters the on resume callback to Android. + /// + /// On resume. + public void UnregisterOnResume(OnResumeEventHandler onResume) + { + if (onResume != null) + { + OnResumeEvent -= onResume; + } + } + + /// + /// Unregisters the on onActivityResult callback to Android. + /// + /// On activity result. + public void UnregisterOnActivityResult(OnActivityResultEventHandler onActivityResult) + { + if (onActivityResult != null) + { + OnActivityResultEvent -= onActivityResult; + } + } + + /// + /// Implements the Android onPause. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", + "SA1300:ElementMustBeginWithUpperCaseLetter", + Justification = "Android API.")] + protected void onPause() + { + if (OnPauseEvent != null) + { + Debug.Log("Unity got the Java onPause"); + OnPauseEvent(); + } + } + + /// + /// Implements the Android onResume. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", + "SA1300:ElementMustBeginWithUpperCaseLetter", + Justification = "Android API.")] + protected void onResume() + { + if (OnResumeEvent != null) + { + Debug.Log("Unity got the Java onResume"); + OnResumeEvent(); + } + } + + /// + /// Implements the Android onActivityResult. + /// + /// Request code. + /// Result code. + /// Data. + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", + "SA1300:ElementMustBeginWithUpperCaseLetter", + Justification = "Android API.")] + protected void onActivityResult(int requestCode, int resultCode, AndroidJavaObject data) + { + if (OnActivityResultEvent != null) + { + Debug.Log("Unity got the Java onActivityResult"); + OnActivityResultEvent(requestCode, resultCode, data); + } + } } diff --git a/UnityExamples/Assets/Plugins/Android/UnityUxHelper/bin/R.txt b/UnityExamples/Assets/Plugins/Android/UnityUxHelper/bin/R.txt index 74e7a112..6b7c0903 100644 --- a/UnityExamples/Assets/Plugins/Android/UnityUxHelper/bin/R.txt +++ b/UnityExamples/Assets/Plugins/Android/UnityUxHelper/bin/R.txt @@ -1,17 +1,104 @@ -int drawable ic_launcher 0x7f020000 -int id layout_exceptions 0x7f060000 -int layout tango_ux_exceptions 0x7f030000 -int string ux_exception_1 0x7f040001 -int string ux_exception_10 0x7f04000a -int string ux_exception_11 0x7f04000b -int string ux_exception_2 0x7f040002 -int string ux_exception_3 0x7f040003 -int string ux_exception_4 0x7f040004 -int string ux_exception_5 0x7f040005 -int string ux_exception_6 0x7f040006 -int string ux_exception_7 0x7f040007 -int string ux_exception_8 0x7f040008 -int string ux_exception_9 0x7f040009 -int string ux_exception_listener 0x7f040000 -int style AppBaseTheme 0x7f050000 -int style AppTheme 0x7f050001 +int color gray_dark 0x7f040000 +int color tango_blue 0x7f040004 +int color tango_green 0x7f040003 +int color tango_yellow 0x7f040005 +int color text_exception_action_required 0x7f040002 +int color text_exception_description 0x7f040001 +int dimen connection_progress_bar_sub_margin 0x7f060000 +int dimen exception_component_height 0x7f060001 +int dimen exception_status_component_size 0x7f060002 +int dimen hold_steady_bubble_level_max_y 0x7f060006 +int dimen hold_steady_frame_transform_pivot_x 0x7f060003 +int dimen hold_steady_frame_transform_pivot_y 0x7f060004 +int dimen hold_steady_trace_size 0x7f060005 +int drawable exception_container_shadow 0x7f020000 +int drawable hold_steady_bubble_level_err 0x7f020001 +int drawable hold_steady_bubble_level_ok 0x7f020002 +int drawable hold_steady_frame_err 0x7f020003 +int drawable hold_steady_frame_ok 0x7f020004 +int drawable hold_steady_trace_left_1 0x7f020005 +int drawable hold_steady_trace_left_2 0x7f020006 +int drawable hold_steady_trace_right_1 0x7f020007 +int drawable hold_steady_trace_right_2 0x7f020008 +int drawable ic_exception_i_am_dizzy 0x7f020009 +int drawable ic_exception_i_am_lost 0x7f02000a +int drawable ic_exception_i_cant_see 0x7f02000b +int drawable ic_exception_system 0x7f02000c +int drawable ic_launcher 0x7f02000d +int id bubble_level_err 0x7f080006 +int id bubble_level_group 0x7f080005 +int id bubble_level_ok 0x7f080007 +int id component_hold_steady 0x7f08000c +int id connection_layout 0x7f08000f +int id connection_layout_title 0x7f08000d +int id exception_container 0x7f08000e +int id exception_description 0x7f08000a +int id exception_icon 0x7f080008 +int id exception_status 0x7f08000b +int id exception_title 0x7f080009 +int id frame 0x7f080004 +int id layout_exceptions 0x7f080010 +int id trace_left_1 0x7f080002 +int id trace_left_2 0x7f080000 +int id trace_right_1 0x7f080003 +int id trace_right_2 0x7f080001 +int layout component_hold_steady 0x7f030000 +int layout exception_component 0x7f030001 +int layout layout_connection 0x7f030002 +int layout layout_tango_ux 0x7f030003 +int layout tango_ux_exceptions 0x7f030004 +int string action_required 0x7f050018 +int string connection_layout_message_still 0x7f050019 +int string connection_layout_message_tight 0x7f05001a +int string device_not_responding_description 0x7f05000d +int string device_not_responding_title 0x7f05000c +int string hold_posture_description 0x7f050017 +int string hold_posture_down 0x7f05001d +int string hold_posture_forward 0x7f05001b +int string hold_posture_title 0x7f050016 +int string hold_posture_up 0x7f05001c +int string lying_on_surface_description 0x7f050011 +int string lying_on_surface_title 0x7f050010 +int string motion_track_description 0x7f050013 +int string motion_track_title 0x7f050012 +int string moving_too_fast_description 0x7f050003 +int string moving_too_fast_title 0x7f050002 +int string not_enough_light_description 0x7f050009 +int string not_enough_light_title 0x7f050008 +int string project_tango 0x7f050001 +int string run_time_mismatch_description 0x7f050015 +int string run_time_mismatch_title 0x7f050014 +int string service_updated_description 0x7f05000f +int string service_updated_title 0x7f05000e +int string space_not_recognized_description 0x7f050007 +int string space_not_recognized_title 0x7f050006 +int string too_much_light_description 0x7f05000b +int string too_much_light_title 0x7f05000a +int string unable_to_detect_surface_description 0x7f050005 +int string unable_to_detect_surface_title 0x7f050004 +int string ux_exception_1 0x7f05001f +int string ux_exception_10 0x7f050028 +int string ux_exception_11 0x7f050029 +int string ux_exception_2 0x7f050020 +int string ux_exception_3 0x7f050021 +int string ux_exception_4 0x7f050022 +int string ux_exception_5 0x7f050023 +int string ux_exception_6 0x7f050024 +int string ux_exception_7 0x7f050025 +int string ux_exception_8 0x7f050026 +int string ux_exception_9 0x7f050027 +int string ux_exception_listener 0x7f05001e +int string ux_library_version 0x7f050000 +int style AppBaseTheme 0x7f07000b +int style AppTheme 0x7f07000c +int style ConnectionLayoutSubtext 0x7f070003 +int style ConnectionLayoutText 0x7f070002 +int style DownloadProgressText 0x7f070004 +int style ExceptionActionRequired 0x7f070007 +int style ExceptionDescription 0x7f070006 +int style ExceptionTitle 0x7f070005 +int style Text20GrayDarkLight 0x7f070001 +int style Text40GrayDarkThin 0x7f070000 +int style TextListContentItem 0x7f07000a +int style TextListTitle 0x7f070008 +int style TextListTitleItem 0x7f070009 diff --git a/UnityExamples/Assets/Plugins/Android/UnityUxHelper/bin/unityuxhelper.jar b/UnityExamples/Assets/Plugins/Android/UnityUxHelper/bin/unityuxhelper.jar index 91d9bd3ccd4429e36c2504936fc163c5dc079ba5..4048f583abaa1122c9bd3bff2f4436a2e8bd8335 100644 GIT binary patch literal 7032 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 LDt~K&f8PBM@v{|k literal 6236 zcmcJT1yEeunuYNojk{Zb0FAr5OB&bUE{!KxfJPb`4VnaR+}%lVg1ft02!ucq2m~_l z-ko~6w`ykU-FmZ6b=5h$>+Dtg)K~vr{{pEYqYxpWqoX6(#-J%7{5FUXP!Kc}bY(bH zG!?ltWHeP26?AktH5BiL5fFCvkPtv>kI*Y3@`zCG-$A^n8{7G4+^-)7r(-%d1h}Rfo`kD2NjV z3|EkqcSRLQRW_40C@66aWVOIsrsLq!f~yK;I2)QipBZCD@wu+Oi@bvbRp~J5*o)rI zj(=tG$<&-!dxk+xh2)+7c6UACwDn-GbwYwA`0jS38i8}CHJk*BKW1#8+SK?#U_fgu zuTWQgZK+~bzg26ysgBMjMz+B)!&9Nw5<>=hmTs&^9M+V&^iG%qo=QLcYFtlUXN)ov zK4&yHQmeKL46tx>gszu4^?f~$-8)QcwJ2XETm#yfuArhd$>UTVd+#&%&h^oY1DU)4 z-5BLvE8UY!ahbR zg&o;cQTLK1y1#{YmRi53+p*qiSi!Q49KoyFOb;(_Xl557&)L*L`%w#SI~@=zhApuS z-UNiaa?i4~cr;v=pGG8=ogN(7SaEEQcUTl_a#hhCZV6S2w3K}w%sDfZc_zwfjnqtO zhS3rE>uqpAYby89D~BQ~%IZT!$O^p;HxsbmcgZ%(DUx5@PwlYXl7hH85R1cu$i2RZ7XDp zhr9bZY$)Tv>$OAD{>_h7cB8NK?aEh+(&@~&QwuJ|ozYl7uSv-{{W7J8j*86^*v}?y zypX-n@1MUa;3Q#r!RW5lr}7MF?F7{;61H!tchcHo!@~4N2L-a|CKkZ}-^1Z)BkzFl zVLVq7^1ZDAX3Lp{jdDBQhC}&0{b~ya)i@#P4MqoyNCg(O9{j1uBPlhkmtu4?V3slP zq^PvDfzugre9^TTeWrih;M1yYk8AAKN9cHY>lo>17Q$R=<`poqfIr_GV8BG1J6Vjb_|C+r<4 z?hw~jlG-7n`+ZI&@i!({*Gk^<9kAVIPz#GTdJC(1UPjOaXx^Un?8$YBeg9Mf{l}bq zezRV`SnCi~h0OI`gtSCy8kH38DEoqM)SR0EPr%n&TnbXRIN}2o*?0&e4b~P}UA!tZ zGG`py1Xb_)Q^H5h4^s{^_d<<(n)%T%G%0b$#;3%?Fa_!SZLptWObf?NI1qtm4rm|h zTz4Z@5ahnlfieH{b&mI+buLTSiipauF3=KVfZv zB0|;8ZzSERI_$Bah@IAcKm0uPJL{U+dav-CFU*wCo|hlNu)n|_HElGIEpmEP8{6DP zTekXQpRY~h$XPvW>Z2o5^l?yTJ1UBoDbSAENsFhC<>`wV_HF=+Y`eO*u&kb3tn&Ie zdIm(cr!6ZDhpWD^Jo<>g$DZQ8ik(Ts>~7xsxVI-&#an#~Q7$Q?=ajQ42RI*Am3FOd~(9>G_zzxr3-D=q{Qk*x? z-Rh7eC`0d8rcs|1o)PYSjLvyJg@xvVow=TQmnl8s(nm?YszQFXC@N%tAL+-cLQ2?I zZx1~yFYZQQ!KST60k-ckDKmeC_G5LI(D4w=PzYu18-=c#7WXlh+BIvGtw%h)a}FeNE6gRp1O zk22yJSA8-9vd>=S&nL{ZK@3GJ?GTmiXCF`EGAcTwi)P^@Hz?i+zf>BjXCY&KnoalY zE`D@j@=Wl(4t)qx@uvY5ZE0R5k{7bK&tesHAK8?SWA3?;iS)iVA5@%X^?Y3Tl;;9f z?k&sPR=&|-5a%{L#v_{0keQU7AIMd5WNrmzIBsW`Kh2&|r4uZ~_Y?tmM0`pGhjN!& zwgBZPFGwHYS7iS7E$#k>%97fFbNGukDze=+1}$ir|YuQzFJGbNn3WvmXF0>o}s-foPJkDgALZ*(9V zcBey#_2@-EdUn(YDVFRD%Rakd@P5wUR1RP3jzOuTMB@cSAP4nP=QL#* zxVpO1jex}E%m-w;Ryr&O%d$zA)OIU;9Nmrq^-8PF{awT__l9!)9wW`2GcY0H-@!kr zE`5vWCH^cXw+^WnbGVy{dQ$&X-19uPyF4Cm8lBTQ0Pq%j3E$dc(1iQd%(NbsHMd5A z$5@YW5!tj}WxAUm#Fw15Nuk9nz1K>uZFOS@Uc4a3oliJY^ZWPYrTGvummeO3@#Lfy-HRN34}I{0GMu18*w0sPaL- zqPL6Xzlh$B^@T9>QmQ8xV5?B`wIpr|@dy-rOe|WjKhELt3tggpL!rt~+>!eef2TjP z|0Bl7n{=tHv!^<*x=gl%m0~kR+u}sL@6K&;Uvf+h(&_OIdWyi@P~%Y86Z@SA*wuiC zH`osdGqIf&nBF7I_Wyt|{~rkJjDTmPi6mwUe6}f^koey@(@j2(XpxpymT@U#U@N3c zl$aMv)dd>XZRX>>h%IEWg=niWu8CY`d(nE`9$#M4BG6dP^dR-- zOUK>9^pzNt2{2WhDK11c+qr<( zaF7rp`x+?P;HZV`>-t7I`!nLR!;s_2Rj(Qc3QJ${VDd&m0qx1s2CaTutk+~Tqa53t zm{q(fzIai>RgL60PX!WV`E;GgFmhM|w-5RpX(Ub-TjB+K8p5r6S!4KQ0J2 z;cr{YWSS)_TQO!ov4y~?{9C0*K0KS{sF>085Se77x^g5?3^Kr`=AX2&;J^9ie`(X~ z4`YrP2Tm`-l}?$&ecMM^ev~gsq<)lshdx#)YGOK4GKu3dLZ{7B`YGC`01Yr6pCap~ zARe!v?mCS%ZG__WtX}aeDaRyhFSGaCiehh}sI}EAq~agg_ENSy2Y@s`fS7y)Fw!L~ zdmsYPi7sS74l4NKH#XrOUwcgm2EXiYOfalktyq=(kR_M@Y_P#Vg*ZytRoy8`P~8&y z^WD(So}b_$Q7x!3%8#r3MADdCp9z|y*T;+YGWZ`YQY+BOiRb~nd;9R8Zjl83j9zlM zs0X$HBE`A@oB>~;7A$p#Ysdg2`M73nOg|RB-pv? zd%-{$byeWYiS8tDIGitl{2PvdwyvW?9#jpDlXo@8sISM?)bfef1fhp%a9>S89?T{) zF(qHRMSLqUgOJ7VYk~7NMH;}=-u;f$xqHeB*bj>xZc$0j&@@uaf;UyA=*Gv#{B+;l z{n-Q)b09M;O5NT9sRSPu!Dw3~MCvBxV<1z9uPNW}%zb2uCTg2e_6l2X$#MTY#+-1j z#COB1m+gCctmfL*(xeY3HpG1|{h^?aHK~@0*O1ck$*ghLj$z*{lLTFsjzv>tb5u|s zQWmDV?7@(~?2EWJm8o1c#vAVYIwW5D)^C;SaY0NY3?}&p?vlM+UE_LCqSBX|$9xrx zz`O7)6LXJmjQiz6WzF&K0S3;bd?yOps5mMo9HsB`Q3Dc~0NIz=JgPXRZG8V z^@Suvg)}+U4$I}sXeB)u6*4j|(o8yS>y3u_b$u!-% z6oSI&=Ef(XucVKo8}0h*R%6$444RPQhA5j+mI=kgW`fqAr&VEoqV=IpI1E}ICb8i& zE-}CW;u&Stolnyny2<`%+-*}cGCF_qT&>d~hLU{4Y)AEQe~tj8wQ18Dw`bC7hzH_{ z%2U2YHo3-dUgLPhdM#6)#O&I;;8K@>{#D^}-^|>Yj{hU4GIE@-OCGV(n_>s^HdLf6 zX22&x;WstZe$_RiTo)?NlI(goYq6;sCVnRGAN9QIbO}HTgC%g1Nk}#59%Xe&5|2N> zmYrJa@J1OJ`Z7f%fs7WvRSM4kM#1miB#IOs z6@Ee=Ur0@gK^xzCT&}Vz`<#An2tnKy%NviKQR4HL>yfMB6lbx!5))7yZS)7V6CRtM zz98h+XFe#eQR9P4G&BOkVqDH-!QJOf5M+5q12nE}^~HvXGnPuzNh2jB^CHtWWe4yL z>Qf$bp)XlIE*zF@5!1|C61TbOCb=Bali9J=M}(`S)G-F*p{lTttsamWz1|C(pt146 zMVuN44;6T8!j;ft72n~@iJpqRzE><*{p7K_dZ@+*L#m9Y1WW4I4j5~=2zSHRDpP}= zNamu{$w^s>EZtRBLPv1|?j<%``m9PGcDDDkC-YaP=dT1RS#_&;2S>7bP}(GpilbM? zO8PNYE(-ID_6jd!tBmzU*ESaBCc@D6ElL?BxhxjE`i?zc+bhf~cUe$}08uiSJ}cGe z8jwH%z#e@g!=5thhC?ofUca-TzgPIU3okwl4&TEwZ4uGL>A zm%$q~h1~}k!XaT|6`4{KcV51qI~SWv&`@cDlMsBSnhl{SG%wRb$f9{pNY2ScEX#-1 zjbNT;*cO^iExj|`>5bw~{e`<5gwCH@qUYpeSav8}&4<_p{h*DQ5Sp_sFqnrPBYtei zi|afI%*ZuEHpmYqjJ%$3$=zve`las7wu@u+A}=C|^R}pQXde5pm}{`-M_m3DZ&&OL zVd32TFEP>etwr_VOJ>b?G7~rraN@S3L1}WA6+suuYY)ZV>`K%C&E5}XT{!sP{jnFZ z5I-UOQhaS;9|m}`*e!+cUpap&M5bR8N70nU3c`rBNP$ta{FKMOVsBAhbY9lxzxc9( zdmj5~AC`Q8<43UjwxZk1T4+L}O@G@@E%75{izE95S;kUdU#h#o)mJpIPecNE6Kv4J z-T(^rDdP?c9?W^@rJ0N)5z zoW5ww&-TqZ7NjT&G8_<6FXwh%Qp_|G-|{k|ditfpzxBZG{=;lXvh4*8i*w8m>Y!n@ ztr939E#hD2iaT?3bB@=1d0n2nEDp?86i~ZHEbF>3HZ+RZ)9p59oG(|cn73;gL^UjK z$dOL&xpt+btB5#RZjs6O85L+TP3f&`m}T<$8)rtZtsrU}NM+}wh*iiBVkMB?y~ZCo z>@xqQ4s&c1obE~(6g=H2wL@BUTXDscB6$$%!)ZtwCSYQGhxp)9-^&$ZD&0F&EZhgH zfQUqd@ULX{_oVe9nf>$lpK{v2uJU`1@sP^?YpCAe{_TwRuQI=PjDMElz2DxyFY`x4 z@>iMPUHzYBxX}NO%pc9@UuAxGaDSFLzmJ3d{oVZ0F#J{K_mle1GOpNvN9GT6_*a?V lA$vIX|200{WA|_G=AR}2q=t(2u+XFXtLoluydi#g`Y#HPxKjWC diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/AndroidManifest.xml b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/AndroidManifest.xml index bfa61674..3f07b937 100644 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/AndroidManifest.xml +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/AndroidManifest.xml @@ -20,7 +20,7 @@ android:versionName="0" > \ No newline at end of file diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/R.txt b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/R.txt index 43bd9079..cd602d0a 100644 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/R.txt +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/R.txt @@ -1,14 +1,15 @@ int color gray_dark 0x7f040000 -int color tango_blue 0x7f040004 -int color tango_green 0x7f040003 -int color tango_yellow 0x7f040005 -int color text_exception_action_required 0x7f040002 -int color text_exception_description 0x7f040001 +int color tango_blue 0x7f040001 +int color tango_green 0x7f040002 +int color tango_yellow 0x7f040003 +int color text_exception_action_required 0x7f040004 +int color text_exception_description 0x7f040005 int dimen connection_progress_bar_sub_margin 0x7f050000 int dimen exception_component_height 0x7f050001 int dimen exception_status_component_size 0x7f050002 -int dimen hold_steady_bubble_level_max_y 0x7f050004 -int dimen hold_steady_frame_transform_pivot_y 0x7f050003 +int dimen hold_steady_bubble_level_max_y 0x7f050006 +int dimen hold_steady_frame_transform_pivot_x 0x7f050003 +int dimen hold_steady_frame_transform_pivot_y 0x7f050004 int dimen hold_steady_trace_size 0x7f050005 int drawable exception_container_shadow 0x7f020000 int drawable hold_steady_bubble_level_err 0x7f020001 @@ -23,20 +24,18 @@ int drawable ic_exception_i_am_dizzy 0x7f020009 int drawable ic_exception_i_am_lost 0x7f02000a int drawable ic_exception_i_cant_see 0x7f02000b int drawable ic_exception_system 0x7f02000c -int drawable splash_logo 0x7f02000d int id bubble_level_err 0x7f080006 int id bubble_level_group 0x7f080005 int id bubble_level_ok 0x7f080007 int id component_hold_steady 0x7f08000c -int id connection_layout 0x7f080010 +int id connection_layout 0x7f08000f int id connection_layout_title 0x7f08000d -int id exception_container 0x7f08000f +int id exception_container 0x7f08000e int id exception_description 0x7f08000a int id exception_icon 0x7f080008 int id exception_status 0x7f08000b int id exception_title 0x7f080009 int id frame 0x7f080004 -int id splash_logo 0x7f08000e int id trace_left_1 0x7f080002 int id trace_left_2 0x7f080000 int id trace_right_1 0x7f080003 @@ -44,45 +43,45 @@ int id trace_right_2 0x7f080001 int layout component_hold_steady 0x7f030000 int layout exception_component 0x7f030001 int layout layout_connection 0x7f030002 -int layout layout_splash 0x7f030003 -int layout layout_tango_ux 0x7f030004 -int string action_required 0x7f060017 -int string connection_layout_message_still 0x7f060018 -int string connection_layout_message_tight 0x7f060019 -int string device_not_responding_description 0x7f06000c -int string device_not_responding_title 0x7f06000b -int string hold_posture_description 0x7f060016 -int string hold_posture_down 0x7f06001c -int string hold_posture_forward 0x7f06001a -int string hold_posture_title 0x7f060015 -int string hold_posture_up 0x7f06001b -int string lying_on_surface_description 0x7f060010 -int string lying_on_surface_title 0x7f06000f -int string motion_track_description 0x7f060012 -int string motion_track_title 0x7f060011 -int string moving_too_fast_description 0x7f060002 -int string moving_too_fast_title 0x7f060001 -int string not_enough_light_description 0x7f060008 -int string not_enough_light_title 0x7f060007 -int string project_tango 0x7f060000 -int string run_time_mismatch_description 0x7f060014 -int string run_time_mismatch_title 0x7f060013 -int string service_updated_description 0x7f06000e -int string service_updated_title 0x7f06000d -int string space_not_recognized_description 0x7f060006 -int string space_not_recognized_title 0x7f060005 -int string too_much_light_description 0x7f06000a -int string too_much_light_title 0x7f060009 -int string unable_to_detect_surface_description 0x7f060004 -int string unable_to_detect_surface_title 0x7f060003 -int style ConnectionLayoutSubtext 0x7f070003 -int style ConnectionLayoutText 0x7f070002 -int style DownloadProgressText 0x7f070004 -int style ExceptionActionRequired 0x7f070007 -int style ExceptionDescription 0x7f070006 +int layout layout_tango_ux 0x7f030003 +int string action_required 0x7f060000 +int string connection_layout_message_still 0x7f060001 +int string connection_layout_message_tight 0x7f060002 +int string device_not_responding_description 0x7f060003 +int string device_not_responding_title 0x7f060004 +int string hold_posture_description 0x7f060005 +int string hold_posture_down 0x7f060006 +int string hold_posture_forward 0x7f060007 +int string hold_posture_title 0x7f060008 +int string hold_posture_up 0x7f060009 +int string lying_on_surface_description 0x7f06000a +int string lying_on_surface_title 0x7f06000b +int string motion_track_description 0x7f06000c +int string motion_track_title 0x7f06000d +int string moving_too_fast_description 0x7f06000e +int string moving_too_fast_title 0x7f06000f +int string not_enough_light_description 0x7f060010 +int string not_enough_light_title 0x7f060011 +int string project_tango 0x7f060012 +int string run_time_mismatch_description 0x7f060013 +int string run_time_mismatch_title 0x7f060014 +int string service_updated_description 0x7f060015 +int string service_updated_title 0x7f060016 +int string space_not_recognized_description 0x7f060017 +int string space_not_recognized_title 0x7f060018 +int string too_much_light_description 0x7f060019 +int string too_much_light_title 0x7f06001a +int string unable_to_detect_surface_description 0x7f06001b +int string unable_to_detect_surface_title 0x7f06001c +int string ux_library_version 0x7f06001d +int style ConnectionLayoutSubtext 0x7f070000 +int style ConnectionLayoutText 0x7f070001 +int style DownloadProgressText 0x7f070002 +int style ExceptionActionRequired 0x7f070003 +int style ExceptionDescription 0x7f070004 int style ExceptionTitle 0x7f070005 -int style Text20GrayDarkLight 0x7f070001 -int style Text40GrayDarkThin 0x7f070000 -int style TextListContentItem 0x7f07000a -int style TextListTitle 0x7f070008 -int style TextListTitleItem 0x7f070009 +int style Text20GrayDarkLight 0x7f070006 +int style Text40GrayDarkThin 0x7f070007 +int style TextListContentItem 0x7f070008 +int style TextListTitle 0x7f070009 +int style TextListTitleItem 0x7f07000a diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/tango-ux-support-library.jar b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/bin/tango-ux-support-library.jar index fb6a635263cb395dfc8b01a88a80d53a6792c53e..b4c76757b2e22613ac9b9891246af6fec78d5e07 100644 GIT binary patch literal 75825 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 Y8Vs;<3Irq$_(ua+t38DSc$`502lnIgP5=M^ literal 77962 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 aCcn9Fa%sGA6wa&y722MzelF{r5}E)2(k}r3 literal 0 HcmV?d00001 diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_frame_ok.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_frame_ok.png.meta similarity index 70% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_frame_ok.png.meta rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_frame_ok.png.meta index be314062..43f50579 100644 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_frame_ok.png.meta +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_frame_ok.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: fac73c7be55cf4d25bf1292aaf3fd849 +guid: cd30f90ca40b640b782a403649a81a15 DefaultImporter: userData: assetBundleName: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_1.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_1.png new file mode 100644 index 0000000000000000000000000000000000000000..23911e4ee77cf6c98428c281051eb32479f467e0 GIT binary patch literal 6616 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 Da~QJY literal 0 HcmV?d00001 diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_1.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_1.png.meta similarity index 70% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_1.png.meta rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_1.png.meta index 6b92d804..f8c0b367 100644 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_1.png.meta +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_1.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 680b0b26a3faf4f429467370161fecc2 +guid: c2f16b67bfea34da3ad9b69bb72e3757 DefaultImporter: userData: assetBundleName: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_2.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a34f803873fcda20cd0b6819f93a6986812950ee GIT binary patch literal 7897 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 literal 0 HcmV?d00001 diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_2.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_2.png.meta similarity index 70% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_2.png.meta rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_2.png.meta index 3913f6f1..88e9eeca 100644 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_2.png.meta +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_left_2.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 93fab9a5d52a84b3e95318d39a241b86 +guid: bd1e9f4c512f14518915cfc0d75199b5 DefaultImporter: userData: assetBundleName: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_1.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7b768c15b6a1cbfd73f5be9eb53a35f776b542df GIT binary patch literal 6983 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 NCDO*U*4XRHe*tlsi+lh8 literal 0 HcmV?d00001 diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_1.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_1.png.meta similarity index 70% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_1.png.meta rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_1.png.meta index aa256fc1..391a81a9 100644 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_1.png.meta +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_1.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 114602e7119004bae967929f739217a2 +guid: 6917fa401dd6e4a86a665e6106730a41 DefaultImporter: userData: assetBundleName: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_2.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9f23aadf286e90301350d238ebb11b22b4c723ac GIT binary patch literal 7943 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 literal 0 HcmV?d00001 diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_2.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_2.png.meta similarity index 70% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_2.png.meta rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_2.png.meta index 7a3a9e78..ca177536 100644 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_2.png.meta +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-land-xhdpi/hold_steady_trace_right_2.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8f18e3edf7d0c40ddab5d06787be7a19 +guid: 0b59e7e77e58240a8a1be8519cc949f0 DefaultImporter: userData: assetBundleName: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi.meta new file mode 100644 index 00000000..73fbc598 --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8b3677e9766cb469f8745963d6e34b03 +folderAsset: yes +timeCreated: 1444235388 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_frame_err.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_err.png old mode 100755 new mode 100644 similarity index 100% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_frame_err.png rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_err.png diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_err.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_err.png.meta new file mode 100644 index 00000000..cce0cb4c --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_err.png.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 8f25cd0dec2864dea996d4431bfb85ed +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_frame_ok.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_ok.png old mode 100755 new mode 100644 similarity index 100% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_frame_ok.png rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_ok.png diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_ok.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_ok.png.meta new file mode 100644 index 00000000..0ca3da64 --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_frame_ok.png.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 54f1c57f18c1d480598f2bcbe7901da2 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_1.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_1.png old mode 100755 new mode 100644 similarity index 100% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_1.png rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_1.png diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_1.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_1.png.meta new file mode 100644 index 00000000..c6130ae7 --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_1.png.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 1d3a7965eeb0b4458957bf91221683db +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_2.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_2.png old mode 100755 new mode 100644 similarity index 100% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_left_2.png rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_2.png diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_2.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_2.png.meta new file mode 100644 index 00000000..78c9fddb --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_left_2.png.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: ff1b9a8c117f94bb38d95e869d44196f +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_1.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_1.png old mode 100755 new mode 100644 similarity index 100% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_1.png rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_1.png diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_1.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_1.png.meta new file mode 100644 index 00000000..95cecdad --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_1.png.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 8baad2ed1cfc14934895c9f152540cff +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_2.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_2.png old mode 100755 new mode 100644 similarity index 100% rename from UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/hold_steady_trace_right_2.png rename to UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_2.png diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_2.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_2.png.meta new file mode 100644 index 00000000..7e6b0733 --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-port-xhdpi/hold_steady_trace_right_2.png.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 58cd6c22db33b4d2b8a69657464c717d +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/splash_logo.png b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/splash_logo.png deleted file mode 100755 index 98cc967f5ed063c9ba268d0e76de93fec62a98fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27709 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 OoccN@+SL!8qW>SQeGv)( diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/splash_logo.png.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/splash_logo.png.meta deleted file mode 100644 index 3f8cfcca..00000000 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/drawable-xhdpi/splash_logo.png.meta +++ /dev/null @@ -1,6 +0,0 @@ -fileFormatVersion: 2 -guid: 86dd2879b137e463db2e1686aabcc74a -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/component_hold_steady.xml b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/component_hold_steady.xml index ae470a55..88ed5529 100755 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/component_hold_steady.xml +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/component_hold_steady.xml @@ -59,7 +59,7 @@ android:id="@+id/bubble_level_group" android:layout_width="match_parent" android:layout_height="match_parent" - android:transformPivotX="98dp" + android:transformPivotX="@dimen/hold_steady_frame_transform_pivot_x" android:transformPivotY="@dimen/hold_steady_frame_transform_pivot_y" > - - - - - - \ No newline at end of file + + + + + 15dp + + diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-land/dimens.xml.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-land/dimens.xml.meta new file mode 100644 index 00000000..eda2d6f9 --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-land/dimens.xml.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: d3d7e1b466b03425bb35abee0ca1e9b8 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port.meta new file mode 100644 index 00000000..5216b8a4 --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f9c00ab040cd3412c9a694614197e07b +folderAsset: yes +timeCreated: 1444235388 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port/dimens.xml b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port/dimens.xml new file mode 100644 index 00000000..9080a3d7 --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port/dimens.xml @@ -0,0 +1,21 @@ + + + + + 30dp + + diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port/dimens.xml.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port/dimens.xml.meta new file mode 100644 index 00000000..d6d043d5 --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values-port/dimens.xml.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: f1ca413489626413db7fe1f3964f636f +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/configuration.xml b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/configuration.xml new file mode 100644 index 00000000..07159a1b --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/configuration.xml @@ -0,0 +1,10 @@ + + + + 1.24:2015.09.21-xiaotong-platform-freeze-1382-gc4281ad0:6366:unstable + diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/configuration.xml.meta b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/configuration.xml.meta new file mode 100644 index 00000000..32576d6c --- /dev/null +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/configuration.xml.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 2ef15f2202b374546b50ba439c355430 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/dimens.xml b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/dimens.xml index 73b2fbd8..9197f0e4 100755 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/dimens.xml +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/dimens.xml @@ -21,8 +21,8 @@ 58dp 30dp + 98dp 110dp - 30dp 112dp diff --git a/UnityExamples/Assets/Scenes/ExperimentalAugmentedReality.unity b/UnityExamples/Assets/Scenes/ExperimentalAugmentedReality.unity index 2ad2daa4..f7ed39e9 100644 --- a/UnityExamples/Assets/Scenes/ExperimentalAugmentedReality.unity +++ b/UnityExamples/Assets/Scenes/ExperimentalAugmentedReality.unity @@ -148,87 +148,6 @@ Light: m_ShadowRadius: 0 m_ShadowAngle: 0 m_AreaSize: {x: 1, y: 1} ---- !u!1 &535930848 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 100000, guid: 63520a65e7d434fb9bae9690d56d24ac, type: 2} - m_PrefabInternal: {fileID: 0} - serializedVersion: 4 - m_Component: - - 4: {fileID: 535930854} - - 20: {fileID: 535930853} - - 124: {fileID: 535930852} - - 92: {fileID: 535930851} - m_Layer: 0 - m_Name: Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!92 &535930851 -Behaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 9200000, guid: 63520a65e7d434fb9bae9690d56d24ac, - type: 2} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 535930848} - m_Enabled: 1 ---- !u!124 &535930852 -Behaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 12400000, guid: 63520a65e7d434fb9bae9690d56d24ac, - type: 2} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 535930848} - m_Enabled: 1 ---- !u!20 &535930853 -Camera: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 2000000, guid: 63520a65e7d434fb9bae9690d56d24ac, - type: 2} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 535930848} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 1, g: 1, b: 1, a: .0196078438} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: .0500000007 - far clip plane: 4 - field of view: 37.7999992 - orthographic: 0 - orthographic size: 5 - m_Depth: 1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294966783 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_HDR: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 - m_StereoMirrorMode: 0 ---- !u!4 &535930854 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 400000, guid: 63520a65e7d434fb9bae9690d56d24ac, type: 2} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 535930848} - 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: 1065599728} - m_Father: {fileID: 0} - m_RootOrder: 2 --- !u!1001 &636177781 Prefab: m_ObjectHideFlags: 0 @@ -240,10 +159,6 @@ Prefab: propertyPath: m_RootOrder value: 4 objectReference: {fileID: 0} - - target: {fileID: 11493252, guid: 5f59b9945461344cebfcccf17cdc53f9, type: 2} - propertyPath: m_enableOcclusion - value: 0 - objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 5f59b9945461344cebfcccf17cdc53f9, type: 2} m_IsPrefabParent: 0 @@ -276,82 +191,48 @@ Transform: - {fileID: 115214908} m_Father: {fileID: 0} m_RootOrder: 3 ---- !u!1 &1065599727 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 4 - m_Component: - - 4: {fileID: 1065599728} - - 33: {fileID: 1065599731} - - 23: {fileID: 1065599729} - - 114: {fileID: 1065599730} - m_Layer: 0 - m_Name: VideoOverlayScreen - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1065599728 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1065599727} - m_LocalRotation: {x: -.707106829, y: 0, z: 0, w: .707106709} - m_LocalPosition: {x: 0, y: 0, z: 3.99000001} - m_LocalScale: {x: 1.60000002, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 535930854} - m_RootOrder: 0 ---- !u!23 &1065599729 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1065599727} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_Materials: - - {fileID: 2100000, guid: aaf9e2fe0204a438aaff24a73507f2b8, type: 2} - m_SubsetIndices: - m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 1 - m_ReflectionProbeUsage: 1 - m_ProbeAnchor: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingOrder: 0 ---- !u!114 &1065599730 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1065599727} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9d2fb8dda2d8e7445a90ba8bcf89f17d, type: 3} - m_Name: - m_EditorClassIdentifier: - m_renderCamera: {fileID: 535930853} - m_screenMaterial: {fileID: 2100000, guid: aaf9e2fe0204a438aaff24a73507f2b8, type: 2} - m_status: 0 - m_frameCount: 0 ---- !u!33 &1065599731 -MeshFilter: +--- !u!1001 &1130806255 +Prefab: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1065599727} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 484544, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 484544, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 484544, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 484544, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 484544, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 484544, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 484544, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 484544, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 6433b1b4ccf6f474083daeac76842ec5, type: 2} + m_IsPrefabParent: 0 --- !u!1001 &1261604106 Prefab: m_ObjectHideFlags: 0 @@ -502,7 +383,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 78760276f84c94c678297fc65f4ec855, type: 3} m_Name: m_EditorClassIdentifier: - m_arScreen: {fileID: 1065599730} m_prefabLocation: {fileID: 188320, guid: eca66899b90504167b643aadeaadf7e2, type: 2} m_pointCloud: {fileID: 2044887022} --- !u!114 &2044887022 stripped diff --git a/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/SaveADFController.cs b/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/SaveADFController.cs index b926a971..9aecfc7b 100644 --- a/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/SaveADFController.cs +++ b/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/SaveADFController.cs @@ -18,20 +18,45 @@ // //----------------------------------------------------------------------- using System.Collections; +using System.Threading; using UnityEngine; using Tango; ///

/// Save ADF controller. /// -public class SaveADFController : MonoBehaviour +public class SaveADFController : MonoBehaviour, ITangoEvent { + /// + /// Width of the Saving ADF... text box. + /// + private const float SAVE_ADF_TEXT_WIDTH = 800; + private TangoApplication m_tangoApplication; private TouchScreenKeyboard m_keyboard; private KeyboardState m_keyboardState; - private UUIDUnityHolder m_adfUnityHolder; private string m_keyboardString; + /// + /// While saving an ADF, this holds the thread doing the saving. + /// + private Thread m_adfSaveThread; + + /// + /// Time the ADF saving thread was started. + /// + private float m_adfSaveStartTime; + + /// + /// Value from 0 - 1, where 0 is saving has just started and 1 is the saving completed. + /// + private float m_adfSavePercentComplete; + + /// + /// If true, the ADF save operation failed. + /// + private bool m_adfSaveFailed; + /// /// Describes the state, TouchScreenKeyBoard is in. /// @@ -42,6 +67,19 @@ public enum KeyboardState ACTIVE, DONE } + + /// + /// This is called each time a Tango event happens. + /// + /// Tango event. + public void OnTangoEventAvailableEventHandler(Tango.TangoEvent tangoEvent) + { + if (tangoEvent.type == TangoEnums.TangoEventType.TANGO_EVENT_AREA_LEARNING + && tangoEvent.event_key == "AreaDescriptionSaveProgress") + { + m_adfSavePercentComplete = float.Parse(tangoEvent.event_value); + } + } /// /// Start is called after Awake.Make any initilizations here. @@ -49,10 +87,24 @@ public enum KeyboardState private void Start() { m_tangoApplication = FindObjectOfType(); - m_adfUnityHolder = new UUIDUnityHolder(); + m_tangoApplication.Register(this); + m_keyboardState = KeyboardState.NONE; } + /// + /// Update this instance. + /// + private void Update() + { + if (m_adfSaveThread != null && m_adfSaveThread.ThreadState != ThreadState.Running) + { + // After saving an ADF, the Tango Service will no longer provide pose updates until you reconnect. + // Do this by reloading the current scene. + Application.LoadLevel(Application.loadedLevel); + } + } + /// /// Data logging GUI. /// @@ -60,14 +112,46 @@ private void OnGUI() { if (m_tangoApplication.m_enableAreaLearning) { - if (GUI.Button(new Rect(AreaLearningGUIController.UI_BUTTON_GAP_X, - Screen.height - (AreaLearningGUIController.UI_BUTTON_SIZE_Y + AreaLearningGUIController.UI_LABEL_GAP_Y), - AreaLearningGUIController.UI_BUTTON_SIZE_X, - AreaLearningGUIController.UI_BUTTON_SIZE_Y), "Save ADF")) + if (m_adfSaveThread == null) + { + // Save thread is not active + if (GUI.Button(new Rect(AreaLearningGUIController.UI_BUTTON_GAP_X, + Screen.height - (AreaLearningGUIController.UI_BUTTON_SIZE_Y + AreaLearningGUIController.UI_LABEL_GAP_Y), + AreaLearningGUIController.UI_BUTTON_SIZE_X, + AreaLearningGUIController.UI_BUTTON_SIZE_Y), "Save ADF")) + { + m_keyboardState = KeyboardState.OPEN; + } + KeyBoardBehaviour(); + } + else if (!m_adfSaveFailed) + { + // Save thread is active. + Color oldColor = GUI.color; + GUI.color = Color.black; + + int numDots = ((int)(Time.time - m_adfSaveStartTime) % 3) + 1; + string progressString = "Saving ADF" + new string('.', numDots) + ""; + GUI.Label(new Rect((Screen.width - SAVE_ADF_TEXT_WIDTH) / 2, Screen.height / 2, SAVE_ADF_TEXT_WIDTH, Screen.height / 2), + progressString); + + int percent = (int)(m_adfSavePercentComplete * 100); + GUI.Label(new Rect((Screen.width + SAVE_ADF_TEXT_WIDTH) / 2, Screen.height / 2, SAVE_ADF_TEXT_WIDTH, Screen.height / 2), + string.Format("({0}%)", percent)); + + GUI.color = oldColor; + } + else { - m_keyboardState = KeyboardState.OPEN; + // Save thread failed + Color oldColor = GUI.color; + GUI.color = Color.black; + + GUI.Label(new Rect((Screen.width - SAVE_ADF_TEXT_WIDTH) / 2, Screen.height / 2, SAVE_ADF_TEXT_WIDTH, Screen.height / 2), + "Save failed"); + + GUI.color = oldColor; } - KeyBoardBehaviour(); } } @@ -88,10 +172,24 @@ private void KeyBoardBehaviour() { m_keyboardState = KeyboardState.DONE; m_keyboardString = m_keyboard.text; - PoseProvider.SaveAreaDescription(m_adfUnityHolder); - PoseProvider.GetAreaDescriptionMetaData(m_adfUnityHolder); - PoseProvider.AreaDescriptionMetaData_set(Common.MetaDataKeyType.KEY_NAME, m_keyboardString, m_adfUnityHolder); - PoseProvider.SaveAreaDescriptionMetaData(m_adfUnityHolder); + + // Do the save in a background thread, because it can take some time. + m_adfSaveStartTime = Time.time; + m_adfSavePercentComplete = 0; + m_adfSaveFailed = false; + + // The above values can get written in the background thread, ensure the thread starts with those + // values available. + Thread.MemoryBarrier(); + + m_adfSaveThread = new Thread(_SaveADFInBackground); + m_adfSaveThread.Start(m_keyboardString); + + // While saving is going on, also disable anything that would display UI + GameObject.FindObjectOfType().enabled = false; + GameObject.FindObjectOfType().enabled = false; + GameObject.FindObjectOfType().enabled = false; + GameObject.FindObjectOfType().enabled = false; } else { @@ -99,4 +197,26 @@ private void KeyBoardBehaviour() } } } + + /// + /// Thread method to save an ADF. Make this the ThreadFunc. + /// + /// Name of the ADF. Must be a string. + private void _SaveADFInBackground(object rawName) + { + UUIDUnityHolder adfUnityHolder = new UUIDUnityHolder(); + string name = (string)rawName; + + if (PoseProvider.SaveAreaDescription(adfUnityHolder) == Common.ErrorType.TANGO_SUCCESS) + { + PoseProvider.GetAreaDescriptionMetaData(adfUnityHolder); + PoseProvider.AreaDescriptionMetaData_set(Common.MetaDataKeyType.KEY_NAME, name, adfUnityHolder); + PoseProvider.SaveAreaDescriptionMetaData(adfUnityHolder); + } + else + { + // Setting a bool is atomic. + m_adfSaveFailed = true; + } + } } diff --git a/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs b/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs deleted file mode 100644 index f405748c..00000000 --- a/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs +++ /dev/null @@ -1,386 +0,0 @@ -//----------------------------------------------------------------------- -// -// -// Copyright 2015 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// -//----------------------------------------------------------------------- -using System.Collections; -using UnityEngine; -using Tango; - -/// -/// ARScreen takes the YUV image from the API, resize the image plane and passes -/// the YUV data and vertices data to the YUV2RGB shader to produce a properly -/// sized RGBA image. -/// -/// Please note that all the YUV to RGB conversion is done through the YUV2RGB -/// shader, no computation is in this class, this class only passes the data to -/// shader. -/// -public class ARScreen : MonoBehaviour -{ - public Camera m_renderCamera; - public Material m_screenMaterial; - - // Values for debug display. - [HideInInspector] - public TangoEnums.TangoPoseStatusType m_status; - [HideInInspector] - public int m_frameCount; - - private TangoApplication m_tangoApplication; - private YUVTexture m_textures; - - // Matrix for Tango coordinate frame to Unity coordinate frame conversion. - // Start of service frame with respect to Unity world frame. - private Matrix4x4 m_uwTss; - - // Unity camera frame with respect to color camera frame. - private Matrix4x4 m_cTuc; - - // Device frame with respect to IMU frame. - private Matrix4x4 m_imuTd; - - // Color camera frame with respect to IMU frame. - private Matrix4x4 m_imuTc; - - // Unity camera frame with respect to IMU frame, this is composed by - // Matrix4x4.Inverse(m_imuTd) * m_imuTc * m_cTuc; - // We pre-compute this matrix to save some computation in update(). - private Matrix4x4 m_dTuc; - - /// - /// Initialize the AR Screen. - /// - private void Start() - { - // Constant matrix converting start of service frame to Unity world frame. - m_uwTss = new Matrix4x4(); - m_uwTss.SetColumn(0, new Vector4(1.0f, 0.0f, 0.0f, 0.0f)); - m_uwTss.SetColumn(1, new Vector4(0.0f, 0.0f, 1.0f, 0.0f)); - m_uwTss.SetColumn(2, new Vector4(0.0f, 1.0f, 0.0f, 0.0f)); - m_uwTss.SetColumn(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f)); - - // Constant matrix converting Unity world frame frame to device frame. - m_cTuc.SetColumn(0, new Vector4(1.0f, 0.0f, 0.0f, 0.0f)); - m_cTuc.SetColumn(1, new Vector4(0.0f, -1.0f, 0.0f, 0.0f)); - m_cTuc.SetColumn(2, new Vector4(0.0f, 0.0f, 1.0f, 0.0f)); - m_cTuc.SetColumn(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f)); - - m_tangoApplication = FindObjectOfType(); - - if (m_tangoApplication != null) - { - if (AndroidHelper.IsTangoCorePresent()) - { - // Request Tango permissions - m_tangoApplication.RegisterPermissionsCallback(_OnTangoApplicationPermissionsEvent); - m_tangoApplication.RequestNecessaryPermissionsAndConnect(); - m_tangoApplication.Register(this); - } - else - { - // If no Tango Core is present let's tell the user to install it. - Debug.Log("Tango Core is outdated."); - } - } - else - { - Debug.Log("No Tango Manager found in scene."); - } - if (m_tangoApplication != null) - { - m_textures = m_tangoApplication.GetVideoOverlayTextureYUV(); - - // Pass YUV textures to shader for process. - m_screenMaterial.SetTexture("_YTex", m_textures.m_videoOverlayTextureY); - m_screenMaterial.SetTexture("_UTex", m_textures.m_videoOverlayTextureCb); - m_screenMaterial.SetTexture("_VTex", m_textures.m_videoOverlayTextureCr); - } - - m_tangoApplication.Register(this); - } - - /// - /// Unity update function, we update our texture from here. - /// - private void Update() - { - if (Input.GetKeyDown(KeyCode.Escape)) - { - if (m_tangoApplication != null) - { - m_tangoApplication.Shutdown(); - } - - // This is a temporary fix for a lifecycle issue where calling - // Application.Quit() here, and restarting the application immediately, - // results in a hard crash. - AndroidHelper.AndroidQuit(); - } - double timestamp = VideoOverlayProvider.RenderLatestFrame(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR); - _UpdateTransformation(timestamp); - GL.InvalidateState(); - } - - /// - /// This callback function is called after user appoved or declined the permission to use Motion Tracking. - /// - /// If the permissions were granted. - private void _OnTangoApplicationPermissionsEvent(bool permissionsGranted) - { - if (permissionsGranted) - { - m_tangoApplication.InitApplication(); - m_tangoApplication.InitProviders(string.Empty); - m_tangoApplication.ConnectToService(); - - // Ask ARScreen to query the camera intrinsics from Tango Service. - _SetCameraIntrinsics(); - _SetCameraExtrinsics(); - } - else - { - AndroidHelper.ShowAndroidToastMessage("Motion Tracking Permissions Needed", true); - } - } - - /// - /// Update the camera gameobject's transformation to the pose that on current timestamp. - /// - /// Time to update the camera to. - private void _UpdateTransformation(double timestamp) - { - TangoPoseData pose = new TangoPoseData(); - TangoCoordinateFramePair pair; - pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_START_OF_SERVICE; - pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE; - PoseProvider.GetPoseAtTime(pose, timestamp, pair); - - m_status = pose.status_code; - if (pose.status_code == TangoEnums.TangoPoseStatusType.TANGO_POSE_VALID) - { - Vector3 m_tangoPosition = new Vector3((float)pose.translation[0], - (float)pose.translation[1], - (float)pose.translation[2]); - - Quaternion m_tangoRotation = new Quaternion((float)pose.orientation[0], - (float)pose.orientation[1], - (float)pose.orientation[2], - (float)pose.orientation[3]); - - Matrix4x4 ssTd = Matrix4x4.TRS(m_tangoPosition, m_tangoRotation, Vector3.one); - - // Here we are getting the pose of Unity camera frame with respect to Unity world. - // This is the transformation of our current pose within the Unity coordinate frame. - Matrix4x4 uwTuc = m_uwTss * ssTd * m_dTuc; - - // Extract new local position - m_renderCamera.transform.position = uwTuc.GetColumn(3); - - // Extract new local rotation - m_renderCamera.transform.rotation = Quaternion.LookRotation(uwTuc.GetColumn(2), uwTuc.GetColumn(1)); - m_frameCount++; - } - else - { - m_frameCount = 0; - } - } - - /// - /// Set the screen (video overlay image plane) size and vertices. The image plane is not - /// applying any project matrix or view matrix. So it's drawing space is the normalized - /// screen space, that is [-1.0f, 1.0f] for both width and height. - /// - /// Horizontal padding to add to the left and right edges. - /// Vertical padding to add to top and bottom edges. - private void _SetScreenVertices(float normalizedOffsetX, float normalizedOffsetY) - { - MeshFilter meshFilter = GetComponent(); - Mesh mesh = meshFilter.mesh; - mesh.Clear(); - - // Set the vertices base on the offset, note that the offset is used to compensate - // the ratio differences between the camera image and device screen. - Vector3[] verts = new Vector3[4]; - verts[0] = new Vector3(-1.0f - normalizedOffsetX, -1.0f - normalizedOffsetY, 1.0f); - verts[1] = new Vector3(-1.0f - normalizedOffsetX, 1.0f + normalizedOffsetY, 1.0f); - verts[2] = new Vector3(1.0f + normalizedOffsetX, 1.0f + normalizedOffsetY, 1.0f); - verts[3] = new Vector3(1.0f + normalizedOffsetX, -1.0f - normalizedOffsetY, 1.0f); - - // Set indices. - int[] indices = new int[6]; - indices[0] = 0; - indices[1] = 2; - indices[2] = 3; - indices[3] = 1; - indices[4] = 2; - indices[5] = 0; - - // Set UVs. - Vector2[] uvs = new Vector2[4]; - uvs[0] = new Vector2(0, 0); - uvs[1] = new Vector2(0, 1f); - uvs[2] = new Vector2(1f, 1f); - uvs[3] = new Vector2(1f, 0); - - mesh.Clear(); - mesh.vertices = verts; - mesh.triangles = indices; - mesh.uv = uvs; - meshFilter.mesh = mesh; - mesh.RecalculateNormals(); - } - - /// - /// The function is for querying the camera extrinsic, for example: the transformation between - /// IMU and device frame. These extrinsics is used to transform the pose from the color camera frame - /// to the device frame. Because the extrinsic is being queried using the GetPoseAtTime() - /// with a desired frame pair, it can only be queried after the ConnectToService() is called. - /// - /// The device with respect to IMU frame is not directly queryable from API, so we use the IMU - /// frame as a temporary value to get the device frame with respect to IMU frame. - /// - private void _SetCameraExtrinsics() - { - double timestamp = 0.0; - TangoCoordinateFramePair pair; - TangoPoseData poseData = new TangoPoseData(); - - // Getting the transformation of device frame with respect to IMU frame. - pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_IMU; - pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE; - PoseProvider.GetPoseAtTime(poseData, timestamp, pair); - Vector3 position = new Vector3((float)poseData.translation[0], - (float)poseData.translation[1], - (float)poseData.translation[2]); - Quaternion quat = new Quaternion((float)poseData.orientation[0], - (float)poseData.orientation[1], - (float)poseData.orientation[2], - (float)poseData.orientation[3]); - m_imuTd = Matrix4x4.TRS(position, quat, new Vector3(1.0f, 1.0f, 1.0f)); - - // Getting the transformation of IMU frame with respect to color camera frame. - pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_IMU; - pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_CAMERA_COLOR; - PoseProvider.GetPoseAtTime(poseData, timestamp, pair); - position = new Vector3((float)poseData.translation[0], - (float)poseData.translation[1], - (float)poseData.translation[2]); - quat = new Quaternion((float)poseData.orientation[0], - (float)poseData.orientation[1], - (float)poseData.orientation[2], - (float)poseData.orientation[3]); - m_imuTc = Matrix4x4.TRS(position, quat, new Vector3(1.0f, 1.0f, 1.0f)); - m_dTuc = Matrix4x4.Inverse(m_imuTd) * m_imuTc * m_cTuc; - } - - /// - /// Set up the size of ARScreen based on camera intrinsics. - /// - private void _SetCameraIntrinsics() - { - TangoCameraIntrinsics intrinsics = new TangoCameraIntrinsics(); - VideoOverlayProvider.GetIntrinsics(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR, intrinsics); - - float verticalFOV = 2.0f * Mathf.Rad2Deg * Mathf.Atan((intrinsics.height * 0.5f) / (float)intrinsics.fy); - if (!float.IsNaN(verticalFOV)) - { - m_renderCamera.projectionMatrix = - ProjectionMatrixForCameraIntrinsics((float)intrinsics.width, - (float)intrinsics.height, - (float)intrinsics.fx, - (float)intrinsics.fy, - (float)intrinsics.cx, - (float)intrinsics.cy, - 0.1f, 1000.0f); - - // Here we are scaling the image plane to make sure the image plane's ratio is set as the - // color camera image ratio. - // If we don't do this, because we are drawing the texture fullscreen, the image plane will - // be set to the screen's ratio. - float widthRatio = (float)Screen.width / (float)intrinsics.width; - float heightRatio = (float)Screen.height / (float)intrinsics.height; - if (widthRatio >= heightRatio) - { - float normalizedOffset = ((widthRatio / heightRatio) - 1.0f) / 2.0f; - _SetScreenVertices(0, normalizedOffset); - } - else - { - float normalizedOffset = ((heightRatio / widthRatio) - 1.0f) / 2.0f; - _SetScreenVertices(normalizedOffset, 0); - } - } - } - - /// - /// Compute a projection matrix from window size, camera intrinsics, and clip settings. - /// - /// Projection matrix. - /// The width of the camera image. - /// The height of the camera image. - /// The x-axis focal length of the camera. - /// The y-axis focal length of the camera. - /// The x-coordinate principal point in pixels. - /// The y-coordinate principal point in pixels. - /// The desired near z-clipping plane. - /// The desired far z-clipping plane. - private Matrix4x4 ProjectionMatrixForCameraIntrinsics(float width, float height, - float fx, float fy, - float cx, float cy, - float near, float far) - { - float xscale = near / fx; - float yscale = near / fy; - - float xoffset = (cx - (width / 2.0f)) * xscale; - - // OpenGL coordinates has y pointing downwards so we negate this term. - float yoffset = -(cy - (height / 2.0f)) * yscale; - - return Frustum((xscale * -width / 2.0f) - xoffset, - (xscale * +width / 2.0f) - xoffset, - (yscale * -height / 2.0f) - yoffset, - (yscale * +height / 2.0f) - yoffset, - near, far); - } - - /// - /// Compute a projection matrix for a frustum. - /// - /// This function's implementation is same as glFrustum. - /// - /// Projection matrix. - /// Specify the coordinates for the left vertical clipping planes. - /// Specify the coordinates for the right vertical clipping planes. - /// Specify the coordinates for the bottom horizontal clipping planes. - /// Specify the coordinates for the top horizontal clipping planes. - /// Specify the distances to the near depth clipping planes. Both distances must be positive. - /// Specify the distances to the far depth clipping planes. Both distances must be positive. - [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "*", - Justification = "Matrix visibility is more important.")] - private Matrix4x4 Frustum(float left, float right, float bottom, float top, float zNear, float zFar) - { - Matrix4x4 m = new Matrix4x4(); - m.SetRow(0, new Vector4(2.0f * zNear / (right - left), 0.0f, (right + left) / (right - left) , 0.0f)); - m.SetRow(1, new Vector4(0.0f, 2.0f * zNear / (top - bottom), (top + bottom) / (top - bottom) , 0.0f)); - m.SetRow(2, new Vector4(0.0f, 0.0f, -(zFar + zNear) / (zFar - zNear), -(2 * zFar * zNear) / (zFar - zNear))); - m.SetRow(3, new Vector4(0.0f, 0.0f, -1.0f, 0.0f)); - return m; - } -} diff --git a/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/AugmentedRealityGUIController.cs b/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/AugmentedRealityGUIController.cs index 54511351..4fe5d227 100644 --- a/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/AugmentedRealityGUIController.cs +++ b/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/AugmentedRealityGUIController.cs @@ -67,8 +67,6 @@ public class AugmentedRealityGUIController : MonoBehaviour /// public const float MIN_PLANE_FIT_PERCENTAGE = 0.8f; - public ARScreen m_arScreen; - /// /// The location prefab to place on taps. /// @@ -88,6 +86,7 @@ public class AugmentedRealityGUIController : MonoBehaviour private Rect m_label; private TangoApplication m_tangoApplication; + private TangoARPoseController m_tangoPose; private string m_tangoServiceVersion; /// @@ -121,6 +120,7 @@ public void Start() m_fpsText = "FPS = Calculating"; m_label = new Rect((Screen.width * 0.025f) - 50, (Screen.height * 0.96f) - 25, 600.0f, 50.0f); m_tangoApplication = FindObjectOfType(); + m_tangoPose = FindObjectOfType(); m_tangoServiceVersion = TangoApplication.GetTangoServiceVersion(); } @@ -174,8 +174,8 @@ public void OnGUI() UI_LABEL_SIZE_Y), UI_FONT_SIZE + String.Format(UX_TARGET_TO_BASE_FRAME, "Device", "Start") + ""); - Vector3 pos = m_arScreen.transform.position; - Quaternion quat = m_arScreen.transform.rotation; + Vector3 pos = m_tangoPose.transform.position; + Quaternion quat = m_tangoPose.transform.rotation; string positionString = pos.x.ToString(UI_FLOAT_FORMAT) + ", " + pos.y.ToString(UI_FLOAT_FORMAT) + ", " + pos.z.ToString(UI_FLOAT_FORMAT); @@ -184,8 +184,8 @@ public void OnGUI() quat.z.ToString(UI_FLOAT_FORMAT) + ", " + quat.w.ToString(UI_FLOAT_FORMAT); string statusString = String.Format(UX_STATUS, - _GetLoggingStringFromPoseStatus(m_arScreen.m_status), - _GetLoggingStringFromFrameCount(m_arScreen.m_frameCount), + _GetLoggingStringFromPoseStatus(m_tangoPose.m_poseStatus), + _GetLoggingStringFromFrameCount(m_tangoPose.m_poseCount), positionString, rotationString); GUI.Label(new Rect(UI_LABEL_START_X, UI_POSE_LABEL_START_Y, @@ -379,7 +379,7 @@ private void _UpdateLocationMarker() // Single tap -- place new location or select existing location. Touch t = Input.GetTouch(0); Vector2 guiPosition = new Vector2(t.position.x, Screen.height - t.position.y); - Camera cam = m_arScreen.m_renderCamera; + Camera cam = Camera.main; RaycastHit hitInfo; if (t.phase != TouchPhase.Began) diff --git a/UnityExamples/Assets/TangoExamples/ExperimentalPersistentState/Scripts/Controllers/PersistentStatePoseController.cs b/UnityExamples/Assets/TangoExamples/ExperimentalPersistentState/Scripts/Controllers/PersistentStatePoseController.cs index d5ff6507..10b9f611 100644 --- a/UnityExamples/Assets/TangoExamples/ExperimentalPersistentState/Scripts/Controllers/PersistentStatePoseController.cs +++ b/UnityExamples/Assets/TangoExamples/ExperimentalPersistentState/Scripts/Controllers/PersistentStatePoseController.cs @@ -47,6 +47,7 @@ public void Start() { tangoApplication = FindObjectOfType(); } + tangoApplication.InitApplication(); tangoApplication.InitProviders(Statics.curADFId); tangoApplication.Register(this); tangoApplication.ConnectToService(); diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARPoseController.cs b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARPoseController.cs new file mode 100644 index 00000000..34deca23 --- /dev/null +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARPoseController.cs @@ -0,0 +1,306 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- +using System; +using System.Collections; +using UnityEngine; +using Tango; + +/// +/// This is a movement controller based on the poses returned from the Tango service, using the correct timing needed +/// for augmented reality. +/// +[RequireComponent(typeof(TangoARScreen))] +public class TangoARPoseController : MonoBehaviour +{ + /// + /// Total number of poses ever applied by this controller. + /// + [HideInInspector] + public int m_poseCount; + + /// + /// The most recent pose status applied. + /// + [HideInInspector] + public TangoEnums.TangoPoseStatusType m_poseStatus; + + /// + /// The TangoApplication being listened to. + /// + private TangoApplication m_tangoApplication; + + /// + /// The TangoARScreen that is being updated. + /// + private TangoARScreen m_tangoARScreen; + + /// + /// The most recent pose timestamp applied. + /// + private double m_poseTimestamp; + + /// + /// The most recent Tango rotation. + /// + private Vector3 m_tangoPosition; + + /// + /// The most recent Tango position. + /// + private Quaternion m_tangoRotation; + + // We use couple of matrix transformation to convert the pose from Tango coordinate + // frame to Unity coordinate frame. + // The full equation is: + // Matrix4x4 uwTuc = uwTss * ssTd * dTuc; + // + // uwTuc: Unity camera with respect to Unity world, this is the desired matrix. + // uwTss: Constant matrix converting start of service frame to Unity world frame. + // ssTd: Device frame with repect to start of service frame, this matrix denotes the + // pose transform we get from pose callback. + // dTuc: Constant matrix converting Unity world frame frame to device frame. + // + // Please see the coordinate system section online for more information: + // https://developers.google.com/project-tango/overview/coordinate-systems + + /// + /// Matrix that transforms from Start of Service to the Unity World. + /// + private Matrix4x4 m_uwTss; + + /// + /// Matrix that transforms from the Unity Camera to Device. + /// + private Matrix4x4 m_dTuc; + + /// + /// Awake is called when the script instance is being loaded. + /// + public void Awake() + { + // Constant matrix converting start of service frame to Unity world frame. + m_uwTss = new Matrix4x4(); + m_uwTss.SetColumn(0, new Vector4(1.0f, 0.0f, 0.0f, 0.0f)); + m_uwTss.SetColumn(1, new Vector4(0.0f, 0.0f, 1.0f, 0.0f)); + m_uwTss.SetColumn(2, new Vector4(0.0f, 1.0f, 0.0f, 0.0f)); + m_uwTss.SetColumn(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f)); + + m_poseTimestamp = -1.0f; + m_poseCount = -1; + m_poseStatus = TangoEnums.TangoPoseStatusType.NA; + m_tangoRotation = Quaternion.identity; + m_tangoPosition = Vector3.zero; + } + + /// + /// Start is called on the frame when a script is enabled. + /// + public void Start() + { + m_tangoApplication = FindObjectOfType(); + m_tangoARScreen = GetComponent(); + + if (m_tangoApplication != null) + { + if (AndroidHelper.IsTangoCorePresent()) + { + // Request Tango permissions + m_tangoApplication.RegisterPermissionsCallback(_OnTangoApplicationPermissionsEvent); + m_tangoApplication.RequestNecessaryPermissionsAndConnect(); + } + else + { + // If no Tango Core is present let's tell the user to install it! + StartCoroutine(_InformUserNoTangoCore()); + } + } + else + { + Debug.Log("No Tango Manager found in scene."); + } + } + + /// + /// Update is called every frame. + /// + public void Update() + { + if (Input.GetKeyDown(KeyCode.Escape)) + { + if (m_tangoApplication != null) + { + m_tangoApplication.Shutdown(); + } + + // This is a temporary fix for a lifecycle issue where calling + // Application.Quit() here, and restarting the application immediately, + // results in a hard crash. + AndroidHelper.AndroidQuit(); + } + + if (m_tangoARScreen.m_screenUpdateTime != m_poseTimestamp) + { + _UpdateTransformation(m_tangoARScreen.m_screenUpdateTime); + } + } + + /// + /// Unity callback when application is paused. + /// + /// The pauseStatus as reported by Unity. + public void OnApplicationPause(bool pauseStatus) + { + m_poseTimestamp = -1.0f; + m_poseCount = -1; + m_poseStatus = TangoEnums.TangoPoseStatusType.NA; + } + + /// + /// Update the transformation to the pose for that timestamp. + /// + /// Time in seconds to update the transformation to. + private void _UpdateTransformation(double timestamp) + { + TangoPoseData pose = new TangoPoseData(); + TangoCoordinateFramePair pair; + pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_START_OF_SERVICE; + pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE; + PoseProvider.GetPoseAtTime(pose, timestamp, pair); + + // The callback pose is for device with respect to start of service pose. + if (pose.status_code == TangoEnums.TangoPoseStatusType.TANGO_POSE_VALID) + { + // Construct matrix for the start of service with respect to device from the pose. + Vector3 posePosition = new Vector3((float)pose.translation[0], + (float)pose.translation[1], + (float)pose.translation[2]); + Quaternion poseRotation = new Quaternion((float)pose.orientation[0], + (float)pose.orientation[1], + (float)pose.orientation[2], + (float)pose.orientation[3]); + Matrix4x4 ssTd = Matrix4x4.TRS(posePosition, poseRotation, Vector3.one); + + // Calculate matrix for the camera in the Unity world, taking into account offsets. + Matrix4x4 uwTuc = m_uwTss * ssTd * m_dTuc; + + // Extract final position, rotation. + m_tangoPosition = uwTuc.GetColumn(3); + m_tangoRotation = Quaternion.LookRotation(uwTuc.GetColumn(2), uwTuc.GetColumn(1)); + + // Other pose data -- Pose count gets reset if pose status just became valid. + if (pose.status_code != m_poseStatus) + { + m_poseCount = 0; + } + m_poseCount++; + + // Other pose data -- Pose time. + m_poseTimestamp = timestamp; + } + m_poseStatus = pose.status_code; + + // Apply final position and rotation. + transform.position = m_tangoPosition; + transform.rotation = m_tangoRotation; + } + + /// + /// The function is for querying the camera extrinsic, for example: the transformation between + /// IMU and device frame. These extrinsics is used to transform the pose from the color camera frame + /// to the device frame. Because the extrinsic is being queried using the GetPoseAtTime() + /// with a desired frame pair, it can only be queried after the ConnectToService() is called. + /// + /// The device with respect to IMU frame is not directly queryable from API, so we use the IMU + /// frame as a temporary value to get the device frame with respect to IMU frame. + /// + private void _SetCameraExtrinsics() + { + double timestamp = 0.0; + TangoCoordinateFramePair pair; + TangoPoseData poseData = new TangoPoseData(); + + // Get the transformation of device frame with respect to IMU frame. + pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_IMU; + pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE; + PoseProvider.GetPoseAtTime(poseData, timestamp, pair); + Vector3 position = new Vector3((float)poseData.translation[0], + (float)poseData.translation[1], + (float)poseData.translation[2]); + Quaternion quat = new Quaternion((float)poseData.orientation[0], + (float)poseData.orientation[1], + (float)poseData.orientation[2], + (float)poseData.orientation[3]); + Matrix4x4 imuTd = Matrix4x4.TRS(position, quat, new Vector3(1.0f, 1.0f, 1.0f)); + + // Get the transformation of IMU frame with respect to color camera frame. + pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_IMU; + pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_CAMERA_COLOR; + PoseProvider.GetPoseAtTime(poseData, timestamp, pair); + position = new Vector3((float)poseData.translation[0], + (float)poseData.translation[1], + (float)poseData.translation[2]); + quat = new Quaternion((float)poseData.orientation[0], + (float)poseData.orientation[1], + (float)poseData.orientation[2], + (float)poseData.orientation[3]); + Matrix4x4 imuTc = Matrix4x4.TRS(position, quat, new Vector3(1.0f, 1.0f, 1.0f)); + + // Get the transform of the Unity Camera frame with respect to the Color Camera frame. + Matrix4x4 cTuc = new Matrix4x4(); + cTuc.SetColumn(0, new Vector4(1.0f, 0.0f, 0.0f, 0.0f)); + cTuc.SetColumn(1, new Vector4(0.0f, -1.0f, 0.0f, 0.0f)); + cTuc.SetColumn(2, new Vector4(0.0f, 0.0f, 1.0f, 0.0f)); + cTuc.SetColumn(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f)); + + m_dTuc = Matrix4x4.Inverse(imuTd) * imuTc * cTuc; + } + + /// + /// Internal callback when no Tango core is present. + /// + /// Coroutine IEnumerator. + private IEnumerator _InformUserNoTangoCore() + { + AndroidHelper.ShowAndroidToastMessage("Please install Tango Core", false); + yield return new WaitForSeconds(2.0f); + Application.Quit(); + } + + /// + /// Internal callback when a permissions event happens. + /// + /// If set to true permissions granted. + private void _OnTangoApplicationPermissionsEvent(bool permissionsGranted) + { + if (permissionsGranted) + { + m_tangoApplication.InitApplication(); + m_tangoApplication.InitProviders(string.Empty); + m_tangoApplication.ConnectToService(); + + // Get camera extrinsics to form final matrix transforms + _SetCameraExtrinsics(); + } + else + { + AndroidHelper.ShowAndroidToastMessage("Motion Tracking Permissions Needed", true); + } + } +} diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARPoseController.cs.meta b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARPoseController.cs.meta new file mode 100644 index 00000000..fa16b50d --- /dev/null +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARPoseController.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dac225c1aca3140fea87a8c8644eecc1 +timeCreated: 1442514577 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARScreen.cs b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARScreen.cs new file mode 100644 index 00000000..759b1dd3 --- /dev/null +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARScreen.cs @@ -0,0 +1,215 @@ +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- +using System.Collections; +using UnityEngine; +using Tango; + +/// +/// TangoARScreen takes the YUV image from the API, resize the image plane and passes +/// the YUV data and vertices data to the YUV2RGB shader to produce a properly +/// sized RGBA image. +/// +/// Please note that all the YUV to RGB conversion is done through the YUV2RGB +/// shader, no computation is in this class, this class only passes the data to +/// shader. +/// +[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] +public class TangoARScreen : MonoBehaviour +{ + /// + /// Set this to the AR Screen material. + /// + public Material m_screenMaterial; + + /// + /// The most recent time (in seconds) the screen was updated. + /// + [HideInInspector] + public double m_screenUpdateTime; + + private TangoApplication m_tangoApplication; + private YUVTexture m_textures; + + /// + /// Initialize the AR Screen. + /// + private void Start() + { + m_tangoApplication = FindObjectOfType(); + if (m_tangoApplication != null) + { + m_tangoApplication.RegisterOnTangoConnect(_SetCameraIntrinsics); + + // Pass YUV textures to shader for process. + m_textures = m_tangoApplication.GetVideoOverlayTextureYUV(); + m_screenMaterial.SetTexture("_YTex", m_textures.m_videoOverlayTextureY); + m_screenMaterial.SetTexture("_UTex", m_textures.m_videoOverlayTextureCb); + m_screenMaterial.SetTexture("_VTex", m_textures.m_videoOverlayTextureCr); + } + } + + /// + /// Unity update function, we update our texture from here. + /// + private void Update() + { + m_screenUpdateTime = VideoOverlayProvider.RenderLatestFrame(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR); + + // Rendering the latest frame changes a bunch of OpenGL state. Ensure Unity knows the current OpenGL state. + GL.InvalidateState(); + } + + /// + /// Set the screen (video overlay image plane) size and vertices. The image plane is not + /// applying any project matrix or view matrix. So it's drawing space is the normalized + /// screen space, that is [-1.0f, 1.0f] for both width and height. + /// + /// Horizontal padding to add to the left and right edges. + /// Vertical padding to add to top and bottom edges. + private void _SetScreenVertices(float normalizedOffsetX, float normalizedOffsetY) + { + // Set the vertices base on the offset, note that the offset is used to compensate + // the ratio differences between the camera image and device screen. + Vector3[] verts = new Vector3[4]; + verts[0] = new Vector3(-1.0f - normalizedOffsetX, -1.0f - normalizedOffsetY, 1.0f); + verts[1] = new Vector3(-1.0f - normalizedOffsetX, 1.0f + normalizedOffsetY, 1.0f); + verts[2] = new Vector3(1.0f + normalizedOffsetX, 1.0f + normalizedOffsetY, 1.0f); + verts[3] = new Vector3(1.0f + normalizedOffsetX, -1.0f - normalizedOffsetY, 1.0f); + + // Set indices. + int[] indices = new int[6]; + indices[0] = 0; + indices[1] = 2; + indices[2] = 3; + indices[3] = 1; + indices[4] = 2; + indices[5] = 0; + + // Set UVs. + Vector2[] uvs = new Vector2[4]; + uvs[0] = new Vector2(0, 0); + uvs[1] = new Vector2(0, 1f); + uvs[2] = new Vector2(1f, 1f); + uvs[3] = new Vector2(1f, 0); + + Mesh mesh = GetComponent().mesh; + mesh.Clear(); + mesh.vertices = verts; + mesh.triangles = indices; + mesh.uv = uvs; + + // Make this mesh never fail the occlusion cull + mesh.bounds = new Bounds(Vector3.zero, new Vector3(float.MaxValue, float.MaxValue, float.MaxValue)); + } + + /// + /// Set up the size of ARScreen based on camera intrinsics. + /// + private void _SetCameraIntrinsics() + { + TangoCameraIntrinsics intrinsics = new TangoCameraIntrinsics(); + VideoOverlayProvider.GetIntrinsics(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR, intrinsics); + + if (intrinsics.width != 0 && intrinsics.height != 0) + { + Camera.main.projectionMatrix = ProjectionMatrixForCameraIntrinsics((float)intrinsics.width, + (float)intrinsics.height, + (float)intrinsics.fx, + (float)intrinsics.fy, + (float)intrinsics.cx, + (float)intrinsics.cy, + 0.1f, + 1000.0f); + + // Here we are scaling the image plane to make sure the image plane's ratio is set as the + // color camera image ratio. + // If we don't do this, because we are drawing the texture fullscreen, the image plane will + // be set to the screen's ratio. + float widthRatio = (float)Screen.width / (float)intrinsics.width; + float heightRatio = (float)Screen.height / (float)intrinsics.height; + if (widthRatio >= heightRatio) + { + float normalizedOffset = ((widthRatio / heightRatio) - 1.0f) / 2.0f; + _SetScreenVertices(0, normalizedOffset); + } + else + { + float normalizedOffset = ((heightRatio / widthRatio) - 1.0f) / 2.0f; + _SetScreenVertices(normalizedOffset, 0); + } + } + } + + /// + /// Compute a projection matrix from window size, camera intrinsics, and clip settings. + /// + /// Projection matrix. + /// The width of the camera image. + /// The height of the camera image. + /// The x-axis focal length of the camera. + /// The y-axis focal length of the camera. + /// The x-coordinate principal point in pixels. + /// The y-coordinate principal point in pixels. + /// The desired near z-clipping plane. + /// The desired far z-clipping plane. + private Matrix4x4 ProjectionMatrixForCameraIntrinsics(float width, float height, + float fx, float fy, + float cx, float cy, + float near, float far) + { + float xscale = near / fx; + float yscale = near / fy; + + float xoffset = (cx - (width / 2.0f)) * xscale; + + // OpenGL coordinates has y pointing downwards so we negate this term. + float yoffset = -(cy - (height / 2.0f)) * yscale; + + return Frustum((xscale * -width / 2.0f) - xoffset, + (xscale * +width / 2.0f) - xoffset, + (yscale * -height / 2.0f) - yoffset, + (yscale * +height / 2.0f) - yoffset, + near, far); + } + + /// + /// Compute a projection matrix for a frustum. + /// + /// This function's implementation is same as glFrustum. + /// + /// Projection matrix. + /// Specify the coordinates for the left vertical clipping planes. + /// Specify the coordinates for the right vertical clipping planes. + /// Specify the coordinates for the bottom horizontal clipping planes. + /// Specify the coordinates for the top horizontal clipping planes. + /// Specify the distances to the near depth clipping planes. Both distances must be positive. + /// Specify the distances to the far depth clipping planes. Both distances must be positive. + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "*", + Justification = "Matrix visibility is more important.")] + private Matrix4x4 Frustum(float left, float right, float bottom, float top, float zNear, float zFar) + { + Matrix4x4 m = new Matrix4x4(); + m.SetRow(0, new Vector4(2.0f * zNear / (right - left), 0.0f, (right + left) / (right - left) , 0.0f)); + m.SetRow(1, new Vector4(0.0f, 2.0f * zNear / (top - bottom), (top + bottom) / (top - bottom) , 0.0f)); + m.SetRow(2, new Vector4(0.0f, 0.0f, -(zFar + zNear) / (zFar - zNear), -(2 * zFar * zNear) / (zFar - zNear))); + m.SetRow(3, new Vector4(0.0f, 0.0f, -1.0f, 0.0f)); + return m; + } +} diff --git a/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs.meta b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoARScreen.cs.meta similarity index 100% rename from UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs.meta rename to UnityExamples/Assets/TangoPrefabs/Scripts/TangoARScreen.cs.meta diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoGestureCamera.cs b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoGestureCamera.cs index 08aeecc0..d41a9b54 100644 --- a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoGestureCamera.cs +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoGestureCamera.cs @@ -35,6 +35,12 @@ public enum CameraType TOP_DOWN = 0x4 } + // UI fields. + public const float UI_BUTTON_SIZE_X = 125.0f; + public const float UI_BUTTON_SIZE_Y = 65.0f; + public const float UI_BUTTON_GAP_X = 5.0f; + public const float UI_BUTTON_GAP_Y = 3.0f; + public GameObject m_targetFollowingObject; // Set this to enable the First / Third / Top UI buttons. @@ -43,12 +49,6 @@ public enum CameraType // The default camera mode. public CameraType m_defaultCameraMode = CameraType.FIRST_PERSON; - // UI fields. - public const float UI_BUTTON_SIZE_X = 125.0f; - public const float UI_BUTTON_SIZE_Y = 65.0f; - public const float UI_BUTTON_GAP_X = 5.0f; - public const float UI_BUTTON_GAP_Y = 3.0f; - private Vector3 m_curOffset; private Vector3 m_firstPersonCamOffset = Vector3.zero; diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoMultiCamera.cs b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoMultiCamera.cs index 6d87a620..b8738c4d 100644 --- a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoMultiCamera.cs +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoMultiCamera.cs @@ -37,6 +37,12 @@ public enum CameraType TopDown } + // UI fields. + public const float UI_BUTTON_SIZE_X = 125.0f; + public const float UI_BUTTON_SIZE_Y = 65.0f; + public const float UI_BUTTON_GAP_X = 5.0f; + public const float UI_BUTTON_GAP_Y = 3.0f; + /// /// The target object to follow. /// @@ -52,12 +58,6 @@ public enum CameraType /// public CameraType m_defaultCameraType = CameraType.FirstPerson; - // UI fields. - public const float UI_BUTTON_SIZE_X = 125.0f; - public const float UI_BUTTON_SIZE_Y = 65.0f; - public const float UI_BUTTON_GAP_X = 5.0f; - public const float UI_BUTTON_GAP_Y = 3.0f; - /// /// Scaling factor when doing a pinch to zoom gesture. /// diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoPointCloud.cs b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoPointCloud.cs index 73a9c1dc..4b8a35a7 100644 --- a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoPointCloud.cs +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoPointCloud.cs @@ -38,6 +38,7 @@ public class TangoPointCloud : MonoBehaviour, ITangoDepth /// objects in scene. Note this is a very rudimentary way of doing occlusion and limited by the capabilities of /// depth camera. /// + [HideInInspector] public bool m_enableOcclusion; /// diff --git a/UnityExamples/Assets/TangoPrefabs/Tango AR Camera.prefab b/UnityExamples/Assets/TangoPrefabs/Tango AR Camera.prefab new file mode 100644 index 00000000..bfb54153 --- /dev/null +++ b/UnityExamples/Assets/TangoPrefabs/Tango AR Camera.prefab @@ -0,0 +1,151 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &103230 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 484544} + - 20: {fileID: 2034540} + - 124: {fileID: 12494314} + - 92: {fileID: 9218394} + - 33: {fileID: 3306942} + - 23: {fileID: 2394646} + - 114: {fileID: 11482468} + - 114: {fileID: 11488288} + m_Layer: 0 + m_Name: Tango AR Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &484544 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 103230} + 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 +--- !u!20 &2034540 +Camera: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 103230} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 1, g: 1, b: 1, a: .0196078438} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: .0500000007 + far clip plane: 4 + field of view: 37.7999992 + orthographic: 0 + orthographic size: 5 + m_Depth: 1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294966783 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_HDR: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: .0219999999 + m_StereoMirrorMode: 0 +--- !u!23 &2394646 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 103230} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_Materials: + - {fileID: 2100000, guid: aaf9e2fe0204a438aaff24a73507f2b8, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 0 + m_ReflectionProbeUsage: 0 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3306942 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 103230} + m_Mesh: {fileID: 0} +--- !u!92 &9218394 +Behaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 103230} + m_Enabled: 1 +--- !u!114 &11482468 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 103230} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dac225c1aca3140fea87a8c8644eecc1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_poseCount: 0 + m_poseStatus: 0 +--- !u!114 &11488288 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 103230} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d2fb8dda2d8e7445a90ba8bcf89f17d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_screenMaterial: {fileID: 2100000, guid: aaf9e2fe0204a438aaff24a73507f2b8, type: 2} + m_screenUpdateTime: 0 +--- !u!124 &12494314 +Behaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 103230} + m_Enabled: 1 +--- !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: 103230} + m_IsPrefabParent: 1 diff --git a/UnityExamples/Assets/TangoPrefabs/Tango AR Camera.prefab.meta b/UnityExamples/Assets/TangoPrefabs/Tango AR Camera.prefab.meta new file mode 100644 index 00000000..cb5ba1be --- /dev/null +++ b/UnityExamples/Assets/TangoPrefabs/Tango AR Camera.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6433b1b4ccf6f474083daeac76842ec5 +timeCreated: 1442534237 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoAndroidHelper.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoAndroidHelper.cs index 091e8ead..0ed75605 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoAndroidHelper.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoAndroidHelper.cs @@ -41,7 +41,11 @@ public struct TangoDeviceOrientation public DeviceOrientation currentRotation; } - private const string PERMISSION_REQUESTER = "com.projecttango.permissionrequester.RequestManagerActivity"; + private const string PERMISSION_REQUEST_ACTIVITY = "com.google.atap.tango.RequestPermissionActivity"; + + private const string TANGO_APPLICATION_ID = "com.projecttango.tango"; + private const string LAUNCH_INTENT_SIGNATURE = "launchIntent"; + private const string ADF_IMPORT_EXPORT_ACTIVITY = "com.google.atap.tango.RequestImportExportActivity"; #if UNITY_ANDROID && !UNITY_EDITOR private static AndroidJavaObject m_tangoHelper = null; @@ -90,7 +94,11 @@ public static void StartTangoPermissionsActivity(string permissionsType) if (requestCode != 0) { - unityActivity.Call("launchIntent", "com.projecttango.tango", "com.google.atap.tango.RequestPermissionActivity", args, requestCode); + unityActivity.Call(LAUNCH_INTENT_SIGNATURE, + TANGO_APPLICATION_ID, + PERMISSION_REQUEST_ACTIVITY, + args, + requestCode); } else { @@ -136,7 +144,7 @@ public static TangoDeviceOrientation GetTangoDeviceOrientation() return deviceOrientation; } - + /// /// Check if the Tango Core package is installed. /// @@ -147,7 +155,7 @@ public static bool IsTangoCorePresent() if (unityActivity != null) { - if (GetPackageInfo("com.projecttango.tango") != null) + if (GetPackageInfo(TANGO_APPLICATION_ID) != null) { return true; } @@ -155,4 +163,48 @@ public static bool IsTangoCorePresent() return false; } + + /// + /// Call export ADF permission activity. + /// + /// ADF that is going to be exported. + /// Path to the export location. + internal static void StartExportADFActivity(string srcAdfUuid, string exportLocation) + { + AndroidJavaObject unityActivity = GetUnityActivity(); + + if (unityActivity != null) + { + int requestCode = 1; + string[] args = new string[2]; + args[0] = "SOURCE_UUID:" + srcAdfUuid; + args[1] = "DESTINATION_FILE:" + exportLocation; + unityActivity.Call(LAUNCH_INTENT_SIGNATURE, + TANGO_APPLICATION_ID, + ADF_IMPORT_EXPORT_ACTIVITY, + args, + 1); + } + } + + /// + /// Call import ADF permission activity. + /// + /// Path to the ADF that is going to be imported. + internal static void StartImportADFActivity(string adfPath) + { + AndroidJavaObject unityActivity = GetUnityActivity(); + + if (unityActivity != null) + { + int requestCode = 1; + string[] args = new string[1]; + args[0] = "SOURCE_FILE:" + adfPath; + unityActivity.Call(LAUNCH_INTENT_SIGNATURE, + TANGO_APPLICATION_ID, + ADF_IMPORT_EXPORT_ACTIVITY, + args, + 1); + } + } } diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoEnums.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoEnums.cs index 943331d8..690a7fd0 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoEnums.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoEnums.cs @@ -197,6 +197,11 @@ public enum TangoEventType /// Feature Tracking Event. /// TANGO_EVENT_FEATURE_TRACKING, + + /// + /// Area Learning Event. + /// + TANGO_EVENT_AREA_LEARNING, } /// diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/PoseProvider.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/PoseProvider.cs index 948dda8b..073fb186 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/PoseProvider.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/PoseProvider.cs @@ -335,18 +335,14 @@ public static int ExportAreaDescriptionToFile(string uuid, string filePath) Debug.Log("Missing file path for exporting area description. Please define one."); return Common.ErrorType.TANGO_ERROR; } - int returnValue = PoseProviderAPI.TangoService_exportAreaDescription(uuid, filePath); - if (returnValue != Common.ErrorType.TANGO_SUCCESS) - { - Debug.Log(CLASS_NAME + ".ExportAreaDescription() Could not export area description: " + uuid + - " with path: " + filePath); - } - return returnValue; + AndroidHelper.StartExportADFActivity(uuid, filePath); + return Common.ErrorType.TANGO_SUCCESS; } /// - /// Import an area description from a file path to the default area storage location. + /// Deprecated: Import an area description from a file path to the default area storage location. /// + /// Please call ImportAreaDescriptionFromFile(string filePath) instead. /// The new area description will get a new ID, which will be stored in adfID. /// /// Common.ErrorType.TANGO_SUCCESS if the UUID was imported successfully. @@ -374,6 +370,22 @@ public static int ImportAreaDescriptionFromFile(UUIDUnityHolder adfID, string fi return returnValue; } + /// + /// Import an area description from a file path to the default area storage location. + /// + /// Common.ErrorType.TANGO_SUCCESS if the UUID was imported successfully. + /// File path of the area descrption to be imported. + public static int ImportAreaDescriptionFromFile(string filePath) + { + if (string.IsNullOrEmpty(filePath)) + { + Debug.Log("Missing file path for exporting area description. Please define one."); + return Common.ErrorType.TANGO_ERROR; + } + AndroidHelper.StartImportADFActivity(filePath); + return Common.ErrorType.TANGO_SUCCESS; + } + /// /// Deletes an area description with the specified unique ID. /// diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs index f3077c9d..c8369841 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs @@ -70,6 +70,7 @@ private enum PermissionsTypes AREA_LEARNING = 0x2, } + public bool m_allowOutOfDateTangoAPI = false; public bool m_enableMotionTracking = true; public bool m_enableDepth = true; public bool m_enableVideoOverlay = false; @@ -77,19 +78,11 @@ private enum PermissionsTypes public bool m_enableAreaLearning = false; public bool m_enableADFLoading = false; public bool m_useExperimentalVideoOverlay = true; - public bool m_useExperimentalADF = false; #if UNITY_EDITOR public static bool m_mouseEmulationViaPoseUpdates = false; #endif private const string CLASS_NAME = "TangoApplication"; - private const string ANDROID_PRO_LABEL_TEXT = "Tango plugin requires Unity Android Pro!"; - private const float ANDROID_PRO_LABEL_PERCENT_X = 0.5f; - private const float ANDROID_PRO_LABEL_PERCENT_Y = 0.5f; - private const float ANDROID_PRO_LABEL_WIDTH = 200.0f; - private const float ANDROID_PRO_LABEL_HEIGHT = 200.0f; - private const string DEFAULT_AREA_DESCRIPTION = "/sdcard/defaultArea"; - private const string MOTION_TRACKING_LOG_PREFIX = "Motion tracking mode : "; - private const int MINIMUM_API_VERSION = 1978; + private const int MINIMUM_API_VERSION = 5145; private static string m_tangoServiceVersion = string.Empty; /// @@ -108,10 +101,8 @@ private enum PermissionsTypes private event OnTangoDisconnectEventHandler OnTangoDisconnect; private PermissionsTypes m_requiredPermissions = 0; - private static bool m_isValidTangoAPIVersion = false; - private static bool m_hasVersionBeenChecked = false; - private DepthProvider m_depthProvider; private IntPtr m_callbackContext = IntPtr.Zero; + private bool m_isServiceInitialized = false; private bool m_isServiceConnected = false; private bool m_shouldReconnectService = false; private bool m_sendPermissions = false; @@ -391,7 +382,7 @@ public void RequestNecessaryPermissionsAndConnect() } /// - /// Init step 2. Call this to initialize interal state on TangoApplication. + /// Init step 2. Call this to initialize internal state on TangoApplication. /// /// Call this in the permissions callback if all permissions have been granted. /// @@ -401,7 +392,7 @@ public void RequestNecessaryPermissionsAndConnect() public void InitApplication() { Debug.Log("-----------------------------------Initializing Tango"); - _TangoInitialize(); + _CheckTangoVersion(); if (m_tangoConfig == null) { m_tangoConfig = new TangoConfig(TangoEnums.TangoConfigType.TANGO_CONFIG_DEFAULT); @@ -809,8 +800,6 @@ private void _InitializeMotionTracking(string uuid) // For backward compatibility, don't require the m_enableADFLoading to be set. if (areaLearningEnabled || m_enableADFLoading) { - m_tangoConfig.SetBool("config_experimental_high_accuracy_small_scale_adf", m_useExperimentalADF); - if (!string.IsNullOrEmpty(uuid)) { m_tangoConfig.SetString(TangoConfig.Keys.LOAD_AREA_DESCRIPTION_UUID_STRING, uuid); @@ -863,27 +852,23 @@ private void _InitializeOverlay() } /// - /// Initialize the Tango Service. + /// Validate the TangoService version is supported. /// - private void _TangoInitialize() + private void _CheckTangoVersion() { - if (_IsValidTangoAPIVersion()) + int tangoVersion = _GetTangoAPIVersion(); + if (tangoVersion < MINIMUM_API_VERSION) { - int status = TangoServiceAPI.TangoService_initialize(IntPtr.Zero, IntPtr.Zero); - if (status != Common.ErrorType.TANGO_SUCCESS) - { - Debug.Log("-------------------Tango initialize status : " + status); - Debug.Log(CLASS_NAME + ".Initialize() The service has not been initialized!"); - } - else + Debug.Log(string.Format(CLASS_NAME + ".Initialize() Invalid API version {0}. Please update Project Tango Core to at least {1}.", tangoVersion, MINIMUM_API_VERSION)); + if (!m_allowOutOfDateTangoAPI) { - Debug.Log(CLASS_NAME + ".Initialize() Tango was initialized!"); + AndroidHelper.ShowAndroidToastMessage("Please update Tango Core", false); + return; } } - else - { - Debug.Log(CLASS_NAME + ".Initialize() Invalid API version. please update to minimul API version."); - } + + m_isServiceInitialized = true; + Debug.Log(CLASS_NAME + ".Initialize() Tango was initialized!"); } /// @@ -891,12 +876,18 @@ private void _TangoInitialize() /// private void _TangoConnect() { + if (!m_isServiceInitialized) + { + return; + } + if (!m_isServiceConnected) { m_isServiceConnected = true; AndroidHelper.PerformanceLog("Unity _TangoConnect start"); if (TangoServiceAPI.TangoService_connect(m_callbackContext, m_tangoConfig.GetHandle()) != Common.ErrorType.TANGO_SUCCESS) { + AndroidHelper.ShowAndroidToastMessage("Failed to connect to Tango Service."); Debug.Log(CLASS_NAME + ".Connect() Could not connect to the Tango Service!"); } else @@ -934,31 +925,6 @@ private void _TangoDisconnect() } } - /// - /// Checks to see if the current Tango Service is supported. - /// - /// true, if is valid tango API version is greater - /// than or equal to the minimum supported version, false otherwise. - private bool _IsValidTangoAPIVersion() - { - if (!m_hasVersionBeenChecked) - { - int versionCode = _GetTangoAPIVersion(); - if (versionCode < 0) - { - m_isValidTangoAPIVersion = false; - } - else - { - m_isValidTangoAPIVersion = versionCode >= MINIMUM_API_VERSION; - } - - m_hasVersionBeenChecked = true; - } - - return m_isValidTangoAPIVersion; - } - /// /// Android on pause. /// diff --git a/UnityExamples/Assets/TangoSDK/Core/Tango.dat b/UnityExamples/Assets/TangoSDK/Core/Tango.dat index 4cf28363..5edd2173 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Tango.dat +++ b/UnityExamples/Assets/TangoSDK/Core/Tango.dat @@ -1 +1 @@ - undefinedf2877f0release-xiaotong \ No newline at end of file + undefinedf5fc62frelease-yamabe \ No newline at end of file diff --git a/UnityExamples/Assets/TangoSDK/Editor/TangoInspector.cs b/UnityExamples/Assets/TangoSDK/Editor/TangoInspector.cs index d9a26bd7..84ce2bb0 100644 --- a/UnityExamples/Assets/TangoSDK/Editor/TangoInspector.cs +++ b/UnityExamples/Assets/TangoSDK/Editor/TangoInspector.cs @@ -38,6 +38,7 @@ public override void OnInspectorGUI() _DrawMotionTrackingOptions(m_tangoApplication); _DrawDepthOptions(m_tangoApplication); _DrawVideoOverlayOptions(m_tangoApplication); + _DrawDevelopmentOptions(m_tangoApplication); if (GUI.changed) { @@ -71,14 +72,6 @@ private void _DrawMotionTrackingOptions(TangoApplication tangoApplication) tangoApplication.m_enableADFLoading); tangoApplication.m_enableAreaLearning = EditorGUILayout.Toggle("Area Learning", tangoApplication.m_enableAreaLearning); - if (tangoApplication.m_enableAreaLearning) - { - EditorGUI.indentLevel++; - tangoApplication.m_useExperimentalADF = EditorGUILayout.Toggle("High Accuracy (Experimental)", - tangoApplication.m_useExperimentalADF); - EditorGUI.indentLevel--; - } - EditorGUI.indentLevel--; } EditorGUILayout.Space(); @@ -111,4 +104,20 @@ private void _DrawVideoOverlayOptions(TangoApplication tangoApplication) } EditorGUILayout.Space(); } + + /// + /// Draws development options. + /// + /// These should only be set while in development. + /// + /// Tango application. + private void _DrawDevelopmentOptions(TangoApplication tangoApplication) + { + GUILayout.Label("Development Options (Disable these before publishing)", GUILayout.ExpandWidth(true)); + EditorGUI.indentLevel++; + tangoApplication.m_allowOutOfDateTangoAPI = EditorGUILayout.Toggle("Allow out of date API", + m_tangoApplication.m_allowOutOfDateTangoAPI); + EditorGUI.indentLevel--; + EditorGUILayout.Space(); + } } \ No newline at end of file diff --git a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Common/AndroidHelper.cs b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Common/AndroidHelper.cs index 43e9c09c..cc426f6b 100644 --- a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Common/AndroidHelper.cs +++ b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Common/AndroidHelper.cs @@ -1,13 +1,34 @@ -using UnityEngine; +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- using System.Collections; +using UnityEngine; +/// +/// Misc Android related utilities provided by the Tango UX SDK. +/// public partial class AndroidHelper { - #pragma warning disable 414 private static AndroidJavaObject m_tangoUxHelper = null; #pragma warning restore 414 - + /// /// Gets the Java tango helper object. /// @@ -35,11 +56,11 @@ public static AndroidJavaObject GetTangoUxHelperObject() public static void ParseTangoEvent(double timestamp, int eventType, string key, string value) { AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); - if(tangoUxObject != null) + if (tangoUxObject != null) { tangoUxObject.Call("processTangoEvent", timestamp, eventType, key, value); } - } + } /// /// Parses the tango pose status. @@ -48,12 +69,12 @@ public static void ParseTangoEvent(double timestamp, int eventType, string key, public static void ParseTangoPoseStatus(int poseStatus) { AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); - if(tangoUxObject != null) + if (tangoUxObject != null) { tangoUxObject.Call("processPoseDataStatus", poseStatus); } } - + /// /// Parses the tango depth point count. /// @@ -61,22 +82,21 @@ public static void ParseTangoPoseStatus(int poseStatus) public static void ParseTangoDepthPointCount(int pointCount) { AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); - if(tangoUxObject != null) + if (tangoUxObject != null) { tangoUxObject.Call("processXyzIjPointCount", pointCount); } } - + /// /// Initialize tango ux library. /// - /// A flag to indicate if motion tracking is enabled. - public static void InitTangoUx(bool isMotionTrackingEnabled) + public static void InitTangoUx() { AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); - if(tangoUxObject != null) + if (tangoUxObject != null) { - tangoUxObject.Call("initTangoUx", isMotionTrackingEnabled); + tangoUxObject.Call("initTangoUx"); } } @@ -87,25 +107,27 @@ public static void InitTangoUx(bool isMotionTrackingEnabled) public static void ShowStandardTangoExceptionsUI(bool shouldUseDefaultUi) { AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); - if(tangoUxObject != null) + if (tangoUxObject != null) { tangoUxObject.Call("showDefaultExceptionsUi", shouldUseDefaultUi); } } - + /// /// Starts the tango UX library. /// Should be called after connecting to Tango service. /// - public static void StartTangoUX() + /// Specifies whether the Connection layout should be shown. + /// Set this to false if motion tracking is disabled. + public static void StartTangoUX(bool showConnectionScreen) { AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); - if(tangoUxObject != null) + if (tangoUxObject != null) { - tangoUxObject.Call("start"); + tangoUxObject.Call("start", showConnectionScreen); } } - + /// /// Stops the tango UX library. /// Should be called before disconnect. @@ -113,7 +135,7 @@ public static void StartTangoUX() public static void StopTangoUX() { AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); - if(tangoUxObject != null) + if (tangoUxObject != null) { tangoUxObject.Call("stop"); } @@ -125,9 +147,22 @@ public static void StopTangoUX() public static void SetUxExceptionEventListener() { AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); - if(tangoUxObject != null) + if (tangoUxObject != null) { tangoUxObject.Call("setUxExceptionEventListener", UxExceptionEventListener.GetInstance); } } + + /// + /// Sets the recommended way to hold the device. + /// + /// Recommended way to hold the device. + public static void SetHoldPosture(int holdPostureType) + { + AndroidJavaObject tangoUxObject = GetTangoUxHelperObject(); + if (tangoUxObject != null) + { + tangoUxObject.Call("setHoldPosture", holdPostureType); + } + } } diff --git a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Common/TangoUxEnums.cs b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Common/TangoUxEnums.cs index e7d73dcc..5c9ae966 100644 --- a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Common/TangoUxEnums.cs +++ b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Common/TangoUxEnums.cs @@ -1,18 +1,22 @@ -/* - * Copyright 2014 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- using System.Collections; using UnityEngine; @@ -50,5 +54,17 @@ public enum UxExceptionEventStatus STATUS_DETECTED, /**< The exception was detected */ NA /*** + /// Possible types for a UX Hold Posture. + /// + public enum UxHoldPostureType + { + TYPE_HOLD_POSTURE_NONE, /**< No posture defined */ + TYPE_HOLD_POSTURE_FORWARD, /**< Device should be pointed forward */ + TYPE_HOLD_POSTURE_UP, /**< Device should be pointed upwards */ + TYPE_HOLD_POSTURE_DOWN, /**< Device should be pointed downwards */ + NA /*** +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- using System; using System.Runtime.InteropServices; using UnityEngine; +[module: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", + "SA1649:FileHeaderFileNameDocumentationMustMatchTypeName", + Justification = "Types file.")] + namespace Tango { /// diff --git a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Interfaces/ITangoUX.cs b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Interfaces/ITangoUX.cs index 4e7a8751..681b6041 100644 --- a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Interfaces/ITangoUX.cs +++ b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Interfaces/ITangoUX.cs @@ -1,18 +1,22 @@ -/* - * Copyright 2014 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- using System.Collections; using UnityEngine; @@ -24,6 +28,6 @@ public interface ITangoUX /// /// Called when a Tango.UxExceptionEvent is dispatched. /// - /// Event containing information about the exception - void onUxExceptionEventHandler(Tango.UxExceptionEvent exceptionEvent); + /// Event containing information about the exception. + void OnUxExceptionEventHandler(Tango.UxExceptionEvent exceptionEvent); } diff --git a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Listeners/UxExceptionEventListener.cs b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Listeners/UxExceptionEventListener.cs index 9e81c020..f9b7e65b 100644 --- a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Listeners/UxExceptionEventListener.cs +++ b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/Listeners/UxExceptionEventListener.cs @@ -1,47 +1,61 @@ -/* - * Copyright 2014 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- using System.Collections; using UnityEngine; -public delegate void onUxExceptionEventHandler (Tango.UxExceptionEvent tangoUxEvent); - /// /// Tando User Experience exception listener. /// public class UxExceptionEventListener : AndroidJavaProxy { + /// + /// Delegate for UX Exception events. + /// + /// The exception event from Tango. + public delegate void OnUxExceptionEventHandler(Tango.UxExceptionEvent tangoUxEvent); + private static UxExceptionEventListener m_instance; /// /// Initializes a new instance of the class. /// - private UxExceptionEventListener (): base("com.google.atap.tango.ux.UxExceptionEventListener") + private UxExceptionEventListener() : base("com.google.atap.tango.ux.UxExceptionEventListener") { } - private event onUxExceptionEventHandler m_onUxExceptionEvent; + /// + /// Occurs when on ux exception event. + /// + private event OnUxExceptionEventHandler OnUxExceptionEvent; /// /// Gets the get instance. /// /// The get instance. - public static UxExceptionEventListener GetInstance { - get { - if (m_instance == null) { - m_instance = new UxExceptionEventListener (); + public static UxExceptionEventListener GetInstance + { + get + { + if (m_instance == null) + { + m_instance = new UxExceptionEventListener(); } return m_instance; } @@ -51,10 +65,11 @@ public static UxExceptionEventListener GetInstance { /// Registers ux exception events. /// /// Handler. - public void RegisterOnUxExceptionEventHandler (onUxExceptionEventHandler handler) + public void RegisterOnUxExceptionEventHandler(OnUxExceptionEventHandler handler) { - if (handler != null) { - m_onUxExceptionEvent += handler; + if (handler != null) + { + OnUxExceptionEvent += handler; } } @@ -62,25 +77,30 @@ public void RegisterOnUxExceptionEventHandler (onUxExceptionEventHandler handler /// Unregisters the on too few points. /// /// Handler. - public void UnregisterOnUxExceptionEventHandler (onUxExceptionEventHandler handler) + public void UnregisterOnUxExceptionEventHandler(OnUxExceptionEventHandler handler) { - if (handler != null) { - m_onUxExceptionEvent -= handler; + if (handler != null) + { + OnUxExceptionEvent -= handler; } } /// /// Called when a Ux Exception Event is dispatched. /// - /// A AndroidJavaObject containing information about the exception - void onUxExceptionEvent(AndroidJavaObject tangoUxEvent) + /// A AndroidJavaObject containing information about the exception. + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", + "SA1300:ElementMustBeginWithUpperCaseLetter", + Justification = "Called from Java.")] + private void onUxExceptionEvent(AndroidJavaObject tangoUxEvent) { - if (m_onUxExceptionEvent != null) { + if (OnUxExceptionEvent != null) + { Tango.UxExceptionEvent uxEvent = new Tango.UxExceptionEvent(); - uxEvent.type = (Tango.TangoUxEnums.UxExceptionEventType) tangoUxEvent.Call ("getType"); - uxEvent.value = tangoUxEvent.Call ("getValue"); - uxEvent.status = (Tango.TangoUxEnums.UxExceptionEventStatus) tangoUxEvent.Call ("getStatus"); - m_onUxExceptionEvent (uxEvent); + uxEvent.type = (Tango.TangoUxEnums.UxExceptionEventType)tangoUxEvent.Call("getType"); + uxEvent.value = tangoUxEvent.Call("getValue"); + uxEvent.status = (Tango.TangoUxEnums.UxExceptionEventStatus)tangoUxEvent.Call("getStatus"); + OnUxExceptionEvent(uxEvent); } } } diff --git a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/TangoUx.cs b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/TangoUx.cs index 48409e79..868d4aa2 100644 --- a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/TangoUx.cs +++ b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/TangoUx.cs @@ -1,50 +1,61 @@ -/* - * Copyright 2014 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -using UnityEngine; +//----------------------------------------------------------------------- +// +// +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +//----------------------------------------------------------------------- using System.Collections; +using UnityEngine; namespace Tango { + /// + /// Main entry point for the Tango UX Library. + /// + /// This component handles nearly all communication with the underlying Tango UX Library. Customization of the + /// UX library can be done in the Unity editor or by programatically setting the member flags. + /// [RequireComponent(typeof(TangoApplication))] public class TangoUx : MonoBehaviour, ITangoPose, ITangoEventMultithreaded, ITangoDepth { public bool m_enableUXLibrary = true; public bool m_drawDefaultUXExceptions = true; + public bool m_showConnectionScreen = true; private TangoApplication m_tangoApplication; /// /// Start this instance. /// - void Start () + public void Start() { m_tangoApplication = GetComponent(); m_tangoApplication.RegisterPermissionsCallback(_OnTangoPermissionsEvent); m_tangoApplication.RegisterOnTangoConnect(_OnTangoServiceConnected); m_tangoApplication.RegisterOnTangoDisconnect(_OnTangoServiceDisconnected); m_tangoApplication.Register(this); - AndroidHelper.InitTangoUx(m_tangoApplication.m_enableMotionTracking); + AndroidHelper.InitTangoUx(); } /// /// Raises the destroy event. /// - void OnDestroy() + public void OnDestroy() { - if(m_tangoApplication) + if (m_tangoApplication) { m_tangoApplication.UnregisterPermissionsCallback(_OnTangoPermissionsEvent); m_tangoApplication.UnregisterOnTangoConnect(_OnTangoServiceConnected); @@ -59,13 +70,13 @@ void OnDestroy() /// Tango object. public void Register(Object tangoObject) { - if(m_enableUXLibrary) + if (m_enableUXLibrary) { ITangoUX tangoUX = tangoObject as ITangoUX; - if(tangoUX != null) + if (tangoUX != null) { - UxExceptionEventListener.GetInstance.RegisterOnUxExceptionEventHandler(tangoUX.onUxExceptionEventHandler); + UxExceptionEventListener.GetInstance.RegisterOnUxExceptionEventHandler(tangoUX.OnUxExceptionEventHandler); } } } @@ -76,13 +87,13 @@ public void Register(Object tangoObject) /// Tango object. public void Unregister(Object tangoObject) { - if(m_enableUXLibrary) + if (m_enableUXLibrary) { ITangoUX tangoUX = tangoObject as ITangoUX; - if(tangoUX != null) + if (tangoUX != null) { - UxExceptionEventListener.GetInstance.UnregisterOnUxExceptionEventHandler(tangoUX.onUxExceptionEventHandler); + UxExceptionEventListener.GetInstance.UnregisterOnUxExceptionEventHandler(tangoUX.OnUxExceptionEventHandler); } } } @@ -93,7 +104,7 @@ public void Unregister(Object tangoObject) /// Pose data. public void OnTangoPoseAvailable(Tango.TangoPoseData poseData) { - if(m_enableUXLibrary) + if (m_enableUXLibrary) { AndroidHelper.ParseTangoPoseStatus((int)poseData.status_code); } @@ -105,7 +116,7 @@ public void OnTangoPoseAvailable(Tango.TangoPoseData poseData) /// Tango event. public void OnTangoEventMultithreadedAvailableEventHandler(Tango.TangoEvent tangoEvent) { - if(m_enableUXLibrary) + if (m_enableUXLibrary) { AndroidHelper.ParseTangoEvent(tangoEvent.timestamp, (int)tangoEvent.type, @@ -120,12 +131,21 @@ public void OnTangoEventMultithreadedAvailableEventHandler(Tango.TangoEvent tang /// Tango depth. public void OnTangoDepthAvailable(Tango.TangoUnityDepth tangoDepth) { - if(m_enableUXLibrary) + if (m_enableUXLibrary) { AndroidHelper.ParseTangoDepthPointCount(tangoDepth.m_pointCount); } } - + + /// + /// Sets the recommended way to hold the device. + /// + /// Hold posture type. + public void SetHoldPosture(TangoUxEnums.UxHoldPostureType holdPostureType) + { + AndroidHelper.SetHoldPosture((int)holdPostureType); + } + /// /// Start exceptions listener. /// @@ -133,7 +153,7 @@ public void OnTangoDepthAvailable(Tango.TangoUnityDepth tangoDepth) private IEnumerator _StartExceptionsListener() { AndroidHelper.ShowStandardTangoExceptionsUI(m_drawDefaultUXExceptions); - AndroidHelper.SetUxExceptionEventListener (); + AndroidHelper.SetUxExceptionEventListener(); yield return 0; } @@ -144,7 +164,7 @@ private void _OnTangoServiceConnected() { if (m_enableUXLibrary) { - AndroidHelper.StartTangoUX(); + AndroidHelper.StartTangoUX(m_tangoApplication.m_enableMotionTracking && m_showConnectionScreen); } } diff --git a/UnityExamples/ProjectSettings/ProjectSettings.asset b/UnityExamples/ProjectSettings/ProjectSettings.asset index 19564494..fc2a6258 100644 --- a/UnityExamples/ProjectSettings/ProjectSettings.asset +++ b/UnityExamples/ProjectSettings/ProjectSettings.asset @@ -72,14 +72,14 @@ PlayerSettings: 16:9: 1 Others: 1 bundleIdentifier: com.projecttango.unityexamples - bundleVersion: 1.23 + bundleVersion: 1.24 preloadedAssets: [] metroEnableIndependentInputSource: 0 metroEnableLowLatencyPresentationAPI: 0 xboxOneDisableKinectGpuReservation: 0 virtualRealitySupported: 0 productGUID: c6391136f507d40acbbba7382166aeb8 - AndroidBundleVersionCode: 23 + AndroidBundleVersionCode: 24 AndroidMinSdkVersion: 17 AndroidPreferredInstallLocation: 1 aotOptions: