From e8175a8d347d09f7ce0ec0532d93c8b9807a4b6a Mon Sep 17 00:00:00 2001 From: Jared Finder Date: Mon, 28 Sep 2015 19:57:17 -0700 Subject: [PATCH] release-xiaotong --- .../bin/google-unity-wrapper.jar | Bin 5766 -> 4576 bytes .../bin/AndroidManifest.xml | 2 +- .../tango-ux-support-library/bin/R.txt | 93 +++--- .../bin/tango-ux-support-library.jar | Bin 71962 -> 77962 bytes .../project.properties | 4 +- .../res/layout/layout_connection.xml | 3 +- .../res/values/dimens.xml | 2 +- .../res/values/strings.xml | 47 +-- .../Scenes/ExperimentalAugmentedReality.unity | 8 +- .../Scripts/AreaLearningFPSCounter.cs | 8 +- .../AreaLearning/Scripts/SaveADFController.cs | 8 +- .../Common/Scripts/SceneSwitcher.cs | 6 +- .../Scripts/ARScreen.cs | 43 +-- .../Shaders/YUV2RGB.shader | 4 +- .../Scripts/PointCloudFPSCounter.cs | 4 +- .../TangoPrefabs/Materials/point_cloud.mat | 6 +- .../Scripts/TangoGestureCamera.cs | 32 +- .../TangoPrefabs/Scripts/TangoMultiCamera.cs | 32 +- .../TangoPrefabs/Scripts/TangoPointCloud.cs | 25 ++ .../TangoPrefabs/Shaders/PointCloud.shader | 8 +- .../TangoSDK/Core/Scripts/Common/Common.cs | 132 --------- .../Core/Scripts/Common/TangoEnums.cs | 21 ++ .../Interfaces/ITangoEventMultithreaded.cs | 36 +++ .../ITangoEventMultithreaded.cs.meta | 10 + .../Core/Scripts/Listeners/DepthListener.cs | 7 +- .../Core/Scripts/Listeners/PoseListener.cs | 21 +- .../Scripts/Listeners/TangoEventListener.cs | 62 +++- .../Scripts/Listeners/VideoOverlayListener.cs | 12 +- .../Scripts/TangoWrappers/PoseProvider.cs | 15 - .../Scripts/TangoWrappers/TangoApplication.cs | 179 ++++++++++-- .../Core/Scripts/TangoWrappers/TangoConfig.cs | 276 +++++++++--------- .../TangoWrappers/VideoOverlayProvider.cs | 76 ++--- UnityExamples/Assets/TangoSDK/Core/Tango.dat | 2 +- .../Assets/TangoSDK/Editor/TangoInspector.cs | 2 + .../TangoSDK/TangoUX/Scripts/TangoUx.cs | 4 +- .../ProjectSettings/ProjectSettings.asset | 4 +- 36 files changed, 671 insertions(+), 523 deletions(-) create mode 100644 UnityExamples/Assets/TangoSDK/Core/Scripts/Interfaces/ITangoEventMultithreaded.cs create mode 100644 UnityExamples/Assets/TangoSDK/Core/Scripts/Interfaces/ITangoEventMultithreaded.cs.meta diff --git a/UnityExamples/Assets/Plugins/Android/google-unity-wrapper/bin/google-unity-wrapper.jar b/UnityExamples/Assets/Plugins/Android/google-unity-wrapper/bin/google-unity-wrapper.jar index 608d1902204e779f9c583ba2af45b6a66f99d3aa..36fc3146de92537e737e41069eb998f619aecd15 100644 GIT binary patch delta 110 zcmZqEeW1)6;LXe;!ob17!H`*QIg!_$8Axpm_hkXmo0qdhFoGFOY>8aFj7%a7aHW$s m2s?wMCVvwS2h#x}d0_gWh_?tU8v_uq0AVI014E(!hz9`6*%*BQ delta 1208 zcmaE$+@{ML;LXe;!ob17!Em5MW+JaUGmzRC?#lwAH!o+2U<5Om*b=!UVG5J8WZW5$ zfZAjMHj#R#(#)I`=ls01%yhl1#Ii)a+|-gp)`JIm8x(jL4%i2muxKwjaeKy&hW|}R zCp669`duv^{A{n+!m>>@EA9B)O23y_D%iVRxu$RP(qN&ZcU2ru+ttOUhAVoNzuxKl z6qc#u$M~f`b+H@Y75)Hkb`H&57k-8T9T5e@AU}vhJb~^uJ)qk(>an{=Q1O z_O}{WX>F;7xJYGFCj)zsbEZj-Dr{|>Vm*!=bRKfy^ z^RNLhp!P4jz_C&IQN(^HjgrQHzN(_l!Qv8QVa^qdiw;vYtk zOC4GbI#Yqp$Od9W^dFQLQme%p??AjZ#rI+8S;QdXGhi4AzKPg@^LE~awUgr5N$4rm! zxbx@Ps~1O#!c(1pY~0nHJ@f9o>*XCA7ckE_RV1R#@eZ8sCjC0sjBpzxlL!Mm_e?Gj za0ca;$=d|N!L)#29+++v^wvVC1O+v6>Qw{!0|62RCJV9&J7UdE0p6&lASXIKgb_d% zw;<3Ibws*H*NL16Kxq;I_6Xugq3A{+M-nKtAV7)`)QB)}DhEdpx^CoP1VtnQunB{8 WLv^vTfn+#=@H`U(!$P1O0|NjY*>qt5 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 3f07b937..bfa61674 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 a7663cd1..43bd9079 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,14 @@ int color gray_dark 0x7f040000 -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 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 0x7f050000 int dimen exception_component_height 0x7f050001 int dimen exception_status_component_size 0x7f050002 -int dimen hold_steady_bubble_level_max_y 0x7f050003 -int dimen hold_steady_frame_transform_pivot_y 0x7f050004 +int dimen hold_steady_bubble_level_max_y 0x7f050004 +int dimen hold_steady_frame_transform_pivot_y 0x7f050003 int dimen hold_steady_trace_size 0x7f050005 int drawable exception_container_shadow 0x7f020000 int drawable hold_steady_bubble_level_err 0x7f020001 @@ -28,14 +28,15 @@ 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 exception_container 0x7f08000e +int id connection_layout 0x7f080010 +int id connection_layout_title 0x7f08000d +int id exception_container 0x7f08000f 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 0x7f08000d +int id splash_logo 0x7f08000e int id trace_left_1 0x7f080002 int id trace_left_2 0x7f080000 int id trace_right_1 0x7f080003 @@ -45,37 +46,43 @@ 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 0x7f060000 -int string connection_layout_message 0x7f060001 -int string device_not_responding_description 0x7f060002 -int string device_not_responding_title 0x7f060003 -int string lying_on_surface_description 0x7f060004 -int string lying_on_surface_title 0x7f060005 -int string motion_track_description 0x7f060006 -int string motion_track_title 0x7f060007 -int string moving_too_fast_description 0x7f060008 -int string moving_too_fast_title 0x7f060009 -int string not_enough_light_description 0x7f06000a -int string not_enough_light_title 0x7f06000b -int string project_tango 0x7f06000c -int string run_time_mismatch_description 0x7f06000d -int string run_time_mismatch_title 0x7f06000e -int string service_updated_description 0x7f06000f -int string service_updated_title 0x7f060010 -int string space_not_recognized_description 0x7f060011 -int string space_not_recognized_title 0x7f060012 -int string too_much_light_description 0x7f060013 -int string too_much_light_title 0x7f060014 -int string unable_to_detect_surface_description 0x7f060015 -int string unable_to_detect_surface_title 0x7f060016 -int style ConnectionLayoutSubtext 0x7f070000 -int style ConnectionLayoutText 0x7f070001 -int style DownloadProgressText 0x7f070002 -int style ExceptionActionRequired 0x7f070003 -int style ExceptionDescription 0x7f070004 +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 style ExceptionTitle 0x7f070005 -int style Text20GrayDarkLight 0x7f070006 -int style Text40GrayDarkThin 0x7f070007 -int style TextListContentItem 0x7f070008 -int style TextListTitle 0x7f070009 -int style TextListTitleItem 0x7f07000a +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/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 b3e8347d7ede7310cbc8e78c64bad63f95320ba5..fb6a635263cb395dfc8b01a88a80d53a6792c53e 100644 GIT binary patch literal 77962 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

B1`ZYjKfVQx?o2s^rueRq+9EiPDT@*kykjjo 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 Oxx@ob@P7XC?f(J&%;t#z diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/project.properties b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/project.properties index 19469c2c..f5c58814 100755 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/project.properties +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/project.properties @@ -11,6 +11,6 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-21 +target=android-19 android.library=true -android.library.reference.1=../tango-java-lib +android.library.reference.1=../tango_java_lib diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/layout_connection.xml b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/layout_connection.xml index e8c8455a..b1783775 100755 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/layout_connection.xml +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/layout/layout_connection.xml @@ -32,10 +32,11 @@ 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 39c1510f..73b2fbd8 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 @@ -22,7 +22,7 @@ 30dp 110dp - -30dp + 30dp 112dp diff --git a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/strings.xml b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/strings.xml index f0e8acd0..306c7805 100755 --- a/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/strings.xml +++ b/UnityExamples/Assets/Plugins/Android/tango-ux-support-library/res/values/strings.xml @@ -23,36 +23,45 @@ Too fast. Slow down and hold device steady. - Few depth points. - Keep objects to be scanned in the range of 0.5 – 4 meters. - + Nothing detected. + Keep the device at least an arm’s length from objects. + Space not recognized. - Avoid pointing at environments with few features. - - Not enough light. - Make sure nothing is blocking camera or light. + Point the device somewhere else. + + Too dark. + Use the device in well-lit areas. - Too much light. + Too bright. Avoid pointing at bright lights. - Tango Service Crash. - Exit the application or reboot your device. + System unavailable. + Restart the app or reboot the device. - Library Mismatch. - Update your Tango Service to the latest version. + Incompatible version. + Update to the latest Project Tango Core. - Lying on surface. + Camera blocked. Pick up the device to continue. - Motion Tracking lost. - Hold steady and wait for system to recover. + Tracking lost. + Hold steady to let the system recover. - Runtime Mismatch. - Go to system setting and use ART as runtime. + Incorrect configuration. + Go to Settings > Developer options and select “Use ART”. + Incorrect tilt. + Point the device %s. + Action required - Hold steady + Hold still + Hold tight + + + forward + up + down - \ No newline at end of file + diff --git a/UnityExamples/Assets/Scenes/ExperimentalAugmentedReality.unity b/UnityExamples/Assets/Scenes/ExperimentalAugmentedReality.unity index ae01dde1..2ad2daa4 100644 --- a/UnityExamples/Assets/Scenes/ExperimentalAugmentedReality.unity +++ b/UnityExamples/Assets/Scenes/ExperimentalAugmentedReality.unity @@ -200,7 +200,7 @@ Camera: width: 1 height: 1 near clip plane: .0500000007 - far clip plane: 100 + far clip plane: 4 field of view: 37.7999992 orthographic: 0 orthographic size: 5 @@ -240,6 +240,10 @@ 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 @@ -297,7 +301,7 @@ Transform: 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: 15.1000004} + m_LocalPosition: {x: 0, y: 0, z: 3.99000001} m_LocalScale: {x: 1.60000002, y: 1, z: 1} m_Children: [] m_Father: {fileID: 535930854} diff --git a/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/AreaLearningFPSCounter.cs b/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/AreaLearningFPSCounter.cs index 303dec77..61d3f9f1 100644 --- a/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/AreaLearningFPSCounter.cs +++ b/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/AreaLearningFPSCounter.cs @@ -75,10 +75,10 @@ private void OnGUI() Color oldColor = GUI.color; GUI.color = Color.black; - GUI.Label(new Rect(Common.UI_LABEL_START_X, - Common.UI_FPS_LABEL_START_Y, - Common.UI_LABEL_SIZE_X, - Common.UI_LABEL_SIZE_Y), Common.UI_FONT_SIZE + m_FPSText + ""); + GUI.Label(new Rect(AreaLearningGUIController.UI_LABEL_START_X, + AreaLearningGUIController.UI_FPS_LABEL_START_Y, + AreaLearningGUIController.UI_LABEL_SIZE_X, + AreaLearningGUIController.UI_LABEL_SIZE_Y), AreaLearningGUIController.UI_FONT_SIZE + m_FPSText + ""); GUI.color = oldColor; } diff --git a/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/SaveADFController.cs b/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/SaveADFController.cs index c0ba0a98..b926a971 100644 --- a/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/SaveADFController.cs +++ b/UnityExamples/Assets/TangoExamples/AreaLearning/Scripts/SaveADFController.cs @@ -60,10 +60,10 @@ private void OnGUI() { if (m_tangoApplication.m_enableAreaLearning) { - if (GUI.Button(new Rect(Common.UI_BUTTON_GAP_X, - Screen.height - (Common.UI_BUTTON_SIZE_Y + Common.UI_LABEL_GAP_Y), - Common.UI_BUTTON_SIZE_X, - Common.UI_BUTTON_SIZE_Y), "Save ADF")) + 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; } diff --git a/UnityExamples/Assets/TangoExamples/Common/Scripts/SceneSwitcher.cs b/UnityExamples/Assets/TangoExamples/Common/Scripts/SceneSwitcher.cs index 0839ae9f..56f0541e 100644 --- a/UnityExamples/Assets/TangoExamples/Common/Scripts/SceneSwitcher.cs +++ b/UnityExamples/Assets/TangoExamples/Common/Scripts/SceneSwitcher.cs @@ -28,6 +28,8 @@ public class SceneSwitcher : MonoBehaviour { private const int SCENE_BUTTON_SIZE_X = 250; private const int SCENE_BUTTON_SIZE_Y = 65; + private const int SCENE_BUTTON_GAP_X = 5; + private const int SCENE_BUTTON_GAP_Y = 3; ///

/// The names of all the scenes this can switch between. @@ -46,8 +48,8 @@ private void OnGUI() { for (int it = 0; it < m_sceneNames.Length; ++it) { - Rect buttonRect = new Rect(Screen.width - Common.UI_BUTTON_GAP_X - SCENE_BUTTON_SIZE_X, - Common.UI_LABEL_GAP_Y + ((Common.UI_LABEL_GAP_Y + SCENE_BUTTON_SIZE_Y) * it), + Rect buttonRect = new Rect(Screen.width - SCENE_BUTTON_GAP_X - SCENE_BUTTON_SIZE_X, + SCENE_BUTTON_GAP_Y + ((SCENE_BUTTON_GAP_Y + SCENE_BUTTON_SIZE_Y) * it), SCENE_BUTTON_SIZE_X, SCENE_BUTTON_SIZE_Y); if (GUI.Button(buttonRect, "" + m_sceneNames[it] + "")) diff --git a/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs b/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs index f633a255..f405748c 100644 --- a/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs +++ b/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Scripts/ARScreen.cs @@ -329,8 +329,9 @@ private void _SetCameraIntrinsics() } /// - /// Create a projection matrix from window size, camera intrinsics, and clip settings. + /// 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. @@ -342,42 +343,44 @@ private void _SetCameraIntrinsics() private Matrix4x4 ProjectionMatrixForCameraIntrinsics(float width, float height, float fx, float fy, float cx, float cy, - float near, float far) { + float near, float far) + { float xscale = near / fx; float yscale = near / fy; - float xoffset = (cx - (width / 2.0f)) * xscale; + 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); + return Frustum((xscale * -width / 2.0f) - xoffset, + (xscale * +width / 2.0f) - xoffset, + (yscale * -height / 2.0f) - yoffset, + (yscale * +height / 2.0f) - yoffset, + near, far); } /// - /// This is function compute the projection matrix based on frustum size. + /// 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. - private Matrix4x4 Frustum(float left, - float right, - float bottom, - float top, - float zNear, - float zFar) { + /// 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)); + 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/Shaders/YUV2RGB.shader b/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Shaders/YUV2RGB.shader index 1d7c0271..a76a109d 100644 --- a/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Shaders/YUV2RGB.shader +++ b/UnityExamples/Assets/TangoExamples/ExperimentalAugmentedReality/Shaders/YUV2RGB.shader @@ -10,8 +10,8 @@ { // Setting the z write off to make sure our video overlay is always rendered at back. ZWrite Off - - Tags { "Queue" = "Geometry" } + ZTest Off + Tags { "Queue" = "Background" } Pass { GLSLPROGRAM diff --git a/UnityExamples/Assets/TangoExamples/PointCloud/Scripts/PointCloudFPSCounter.cs b/UnityExamples/Assets/TangoExamples/PointCloud/Scripts/PointCloudFPSCounter.cs index a0b3b52b..c4e9115d 100644 --- a/UnityExamples/Assets/TangoExamples/PointCloud/Scripts/PointCloudFPSCounter.cs +++ b/UnityExamples/Assets/TangoExamples/PointCloud/Scripts/PointCloudFPSCounter.cs @@ -74,8 +74,8 @@ public void OnGUI() Color oldColor = GUI.color; GUI.color = Color.black; - GUI.Label(new Rect(Common.UI_LABEL_START_X, Common.UI_FPS_LABEL_START_Y, Common.UI_LABEL_SIZE_X, Common.UI_LABEL_SIZE_Y), - Common.UI_FONT_SIZE + m_FPSText + ""); + GUI.Label(new Rect(PointCloudGUIController.UI_LABEL_START_X, PointCloudGUIController.UI_FPS_LABEL_START_Y, PointCloudGUIController.UI_LABEL_SIZE_X, PointCloudGUIController.UI_LABEL_SIZE_Y), + PointCloudGUIController.UI_FONT_SIZE + m_FPSText + ""); GUI.color = oldColor; } diff --git a/UnityExamples/Assets/TangoPrefabs/Materials/point_cloud.mat b/UnityExamples/Assets/TangoPrefabs/Materials/point_cloud.mat index 445827ba..c7ee4843 100644 --- a/UnityExamples/Assets/TangoPrefabs/Materials/point_cloud.mat +++ b/UnityExamples/Assets/TangoPrefabs/Materials/point_cloud.mat @@ -22,7 +22,11 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - m_Floats: {} + m_Floats: + data: + first: + name: point_size + second: 5 m_Colors: data: first: diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoGestureCamera.cs b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoGestureCamera.cs index 2173f61d..08aeecc0 100644 --- a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoGestureCamera.cs +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoGestureCamera.cs @@ -42,7 +42,13 @@ 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; @@ -233,24 +239,24 @@ private void OnGUI() return; } - if (GUI.Button(new Rect(Screen.width - Common.UI_BUTTON_SIZE_X - Common.UI_BUTTON_GAP_X, - Screen.height - ((Common.UI_BUTTON_SIZE_Y + Common.UI_LABEL_GAP_Y) * 3), - Common.UI_BUTTON_SIZE_X, - Common.UI_BUTTON_SIZE_Y), "First")) + if (GUI.Button(new Rect(Screen.width - UI_BUTTON_SIZE_X - UI_BUTTON_GAP_X, + Screen.height - ((UI_BUTTON_SIZE_Y + UI_BUTTON_GAP_Y) * 3), + UI_BUTTON_SIZE_X, + UI_BUTTON_SIZE_Y), "First")) { EnableCamera(CameraType.FIRST_PERSON); } - if (GUI.Button(new Rect(Screen.width - Common.UI_BUTTON_SIZE_X - Common.UI_BUTTON_GAP_X, - Screen.height - ((Common.UI_BUTTON_SIZE_Y + Common.UI_LABEL_GAP_Y) * 2), - Common.UI_BUTTON_SIZE_X, - Common.UI_BUTTON_SIZE_Y), "Third")) + if (GUI.Button(new Rect(Screen.width - UI_BUTTON_SIZE_X - UI_BUTTON_GAP_X, + Screen.height - ((UI_BUTTON_SIZE_Y + UI_BUTTON_GAP_Y) * 2), + UI_BUTTON_SIZE_X, + UI_BUTTON_SIZE_Y), "Third")) { EnableCamera(CameraType.THIRD_PERSON); } - if (GUI.Button(new Rect(Screen.width - Common.UI_BUTTON_SIZE_X - Common.UI_BUTTON_GAP_X, - Screen.height - (Common.UI_BUTTON_SIZE_Y + Common.UI_LABEL_GAP_Y), - Common.UI_BUTTON_SIZE_X, - Common.UI_BUTTON_SIZE_Y), "Top")) + if (GUI.Button(new Rect(Screen.width - UI_BUTTON_SIZE_X - UI_BUTTON_GAP_X, + Screen.height - (UI_BUTTON_SIZE_Y + UI_BUTTON_GAP_Y), + UI_BUTTON_SIZE_X, + UI_BUTTON_SIZE_Y), "Top")) { EnableCamera(CameraType.TOP_DOWN); } diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoMultiCamera.cs b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoMultiCamera.cs index aa365cda..6d87a620 100644 --- a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoMultiCamera.cs +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoMultiCamera.cs @@ -51,7 +51,13 @@ public enum CameraType /// The default camera type. /// 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. /// @@ -292,26 +298,26 @@ public void OnGUI() return; } - if (GUI.Button(new Rect(Screen.width - Common.UI_BUTTON_SIZE_X - Common.UI_BUTTON_GAP_X, - Screen.height - ((Common.UI_BUTTON_SIZE_Y + Common.UI_LABEL_GAP_Y) * 3), - Common.UI_BUTTON_SIZE_X, - Common.UI_BUTTON_SIZE_Y), + if (GUI.Button(new Rect(Screen.width - UI_BUTTON_SIZE_X - UI_BUTTON_GAP_X, + Screen.height - ((UI_BUTTON_SIZE_Y + UI_BUTTON_GAP_Y) * 3), + UI_BUTTON_SIZE_X, + UI_BUTTON_SIZE_Y), "First")) { EnableCamera(CameraType.FirstPerson); } - if (GUI.Button(new Rect(Screen.width - Common.UI_BUTTON_SIZE_X - Common.UI_BUTTON_GAP_X, - Screen.height - ((Common.UI_BUTTON_SIZE_Y + Common.UI_LABEL_GAP_Y) * 2), - Common.UI_BUTTON_SIZE_X, - Common.UI_BUTTON_SIZE_Y), + if (GUI.Button(new Rect(Screen.width - UI_BUTTON_SIZE_X - UI_BUTTON_GAP_X, + Screen.height - ((UI_BUTTON_SIZE_Y + UI_BUTTON_GAP_Y) * 2), + UI_BUTTON_SIZE_X, + UI_BUTTON_SIZE_Y), "Third")) { EnableCamera(CameraType.ThirdPerson); } - if (GUI.Button(new Rect(Screen.width - Common.UI_BUTTON_SIZE_X - Common.UI_BUTTON_GAP_X, - Screen.height - (Common.UI_BUTTON_SIZE_Y + Common.UI_LABEL_GAP_Y), - Common.UI_BUTTON_SIZE_X, - Common.UI_BUTTON_SIZE_Y), + if (GUI.Button(new Rect(Screen.width - UI_BUTTON_SIZE_X - UI_BUTTON_GAP_X, + Screen.height - (UI_BUTTON_SIZE_Y + UI_BUTTON_GAP_Y), + UI_BUTTON_SIZE_X, + UI_BUTTON_SIZE_Y), "Top")) { EnableCamera(CameraType.TopDown); diff --git a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoPointCloud.cs b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoPointCloud.cs index 425b1ac8..73a9c1dc 100644 --- a/UnityExamples/Assets/TangoPrefabs/Scripts/TangoPointCloud.cs +++ b/UnityExamples/Assets/TangoPrefabs/Scripts/TangoPointCloud.cs @@ -31,6 +31,14 @@ public class TangoPointCloud : MonoBehaviour, ITangoDepth /// If set, the point cloud's mesh gets updated (much slower, useful for debugging). /// public bool m_updatePointsMesh; + + /// + /// If set, m_updatePointsMesh also gets set at start. Then PointCloud material's renderqueue is set to background + /// (which is same as YUV2RGB Shader) so that PointCloud data gets written to Z buffer for Depth test with virtual + /// objects in scene. Note this is a very rudimentary way of doing occlusion and limited by the capabilities of + /// depth camera. + /// + public bool m_enableOcclusion; /// /// The points of the point cloud, in world space. @@ -63,6 +71,16 @@ public class TangoPointCloud : MonoBehaviour, ITangoDepth /// private const int MAX_POINT_COUNT = 61440; + /// + /// The Background renderqueue's number. + /// + private const int BACKGROUND_RENDER_QUEUE = 1000; + + /// + /// Point size of PointCloud data when projected on to image plane. + /// + private const int POINTCLOUD_SPLATTER_UPSAMPLE_SIZE = 30; + private TangoApplication m_tangoApplication; // Matrices for transforming pointcloud to world coordinates. @@ -108,6 +126,13 @@ public void Start() m_renderer = GetComponent(); m_rand = new System.Random(); + if (m_enableOcclusion) + { + m_renderer.enabled = true; + m_renderer.material.renderQueue = BACKGROUND_RENDER_QUEUE; + m_renderer.material.SetFloat("point_size", POINTCLOUD_SPLATTER_UPSAMPLE_SIZE); + m_updatePointsMesh = true; + } } /// diff --git a/UnityExamples/Assets/TangoPrefabs/Shaders/PointCloud.shader b/UnityExamples/Assets/TangoPrefabs/Shaders/PointCloud.shader index edc87c6a..db227393 100644 --- a/UnityExamples/Assets/TangoPrefabs/Shaders/PointCloud.shader +++ b/UnityExamples/Assets/TangoPrefabs/Shaders/PointCloud.shader @@ -1,14 +1,18 @@ Shader "Tango/PointCloud" { +Properties{ + point_size("Point Size", Float) = 5.0 +} SubShader { Pass { GLSLPROGRAM - + #ifdef VERTEX uniform mat4 depthCameraTUnityWorld; + uniform float point_size; varying vec4 v_color; void main() { - gl_PointSize = 5.0; + gl_PointSize = point_size; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; // Color should be based on pose relative info diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/Common.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/Common.cs index 79eb1efc..9112a569 100755 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/Common.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/Common.cs @@ -89,48 +89,6 @@ public enum AndroidResult DENIED = 1 } - /// - /// DEPRECATED: Empty string. - /// - public const string TANGO_PERMISSION_STRING = ""; - - /// - /// DEPRECATED: Tango permissions error. - /// - public const string TANGO_NO_PERMISSIONS_ERROR = "This application requires all Tango permissions to run. Please restart the application and grant Tango permissions."; - - //// \cond - //// Collection of deprecated fields that should be removed - public const float UI_LABEL_START_X = 15.0f; - public const float UI_LABEL_START_Y = 15.0f; - public const float UI_LABEL_SIZE_X = 1920.0f; - public const float UI_LABEL_SIZE_Y = 35.0f; - public const float UI_LABEL_GAP_Y = 3.0f; - 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_CAMERA_BUTTON_OFFSET = UI_BUTTON_SIZE_X + UI_BUTTON_GAP_X; - public const float UI_LABEL_OFFSET = UI_LABEL_GAP_Y + UI_LABEL_SIZE_Y; - public const float UI_FPS_LABEL_START_Y = UI_LABEL_START_Y + UI_LABEL_OFFSET; - public const float UI_EVENT_LABEL_START_Y = UI_FPS_LABEL_START_Y + UI_LABEL_OFFSET; - public const float UI_POSE_LABEL_START_Y = UI_EVENT_LABEL_START_Y + UI_LABEL_OFFSET; - public const float UI_DEPTH_LABLE_START_Y = UI_POSE_LABEL_START_Y + UI_LABEL_OFFSET; - public const string UI_FLOAT_FORMAT = "F3"; - public const string UI_FONT_SIZE = ""; - - public const float UI_TANGO_VERSION_X = UI_LABEL_START_X; - public const float UI_TANGO_VERSION_Y = UI_LABEL_START_Y; - public const float UI_TANGO_APP_SPECIFIC_START_X = UI_TANGO_VERSION_X; - public const float UI_TANGO_APP_SPECIFIC_START_Y = UI_TANGO_VERSION_Y + (UI_LABEL_OFFSET * 2); - - public const string UX_SERVICE_VERSION = "Service version: {0}"; - public const string UX_TANGO_SERVICE_VERSION = "Tango service version: {0}"; - public const string UX_TANGO_SYSTEM_EVENT = "Tango system event: {0}"; - public const string UX_TARGET_TO_BASE_FRAME = "Target->{0}, Base->{1}:"; - public const string UX_STATUS = "\tstatus: {0}, count: {1}, delta time(ms): {2}, position (m): [{3}], orientation: [{4}]"; - public const float SECOND_TO_MILLISECOND = 1000.0f; - //// \endcond - /// /// Name of the Tango C-API library. /// @@ -165,95 +123,5 @@ public enum AndroidResult /// The length of an area description ID string. /// internal const int UUID_LENGTH = 37; - - //// Backing for deprecated properties below. -#if (UNITY_EDITOR) - private static bool m_mirroring = true; -#elif (UNITY_ANDROID) - private static bool m_mirroring = false; -#else - private static bool m_mirroring = false; -#endif - private static Resolution m_depthFrameResolution; - private static int m_depthBufferSize; - - /// - /// DEPRECATED: Property for mirroring. - /// - /// Bool - sets mirroring. - public static bool Mirroring - { - get { return m_mirroring; } - set { m_mirroring = value; } - } - - /// - /// DEPRECATED: Property for the current depth frame resolution. - /// - /// Resolution - Sets depth frame resolution reference. - public static Resolution DepthFrameResolution - { - get { return m_depthFrameResolution; } - set { m_depthFrameResolution = value; } - } - - /// - /// DEPRECATED: Property for the depth buffer size. - /// - /// Bool - Sets the size of the depth buffer. - public static int DepthBufferSize - { - get { return m_depthBufferSize; } - set { m_depthBufferSize = value; } - } - - /// - /// DEPRECATED: Get the world rotation. - /// - /// Quaternion representing the world rotation. - public static Quaternion GetWorldRotation() - { - return OrientationManager.GetWorldRotation(); - } - - /// - /// DEPRECATED: Get the screen size if the screen was in landscape mode. - /// - /// This looks at Screen.width and Screen.height. - /// - /// Vector2 containing the screen size. - public static Vector2 GetWindowResolution() - { - Vector2 screenSize; - if (Screen.width > Screen.height) - { - screenSize = new Vector2(Screen.width, Screen.height); - } - else - { - screenSize = new Vector2(Screen.height, Screen.width); - } - return screenSize; - } - - /// - /// DEPRECATED: Get the aspect ratio of the screen in landscape mode. - /// - /// Aspect ratio. - public static float GetWindowResolutionAspect() - { - Vector2 resolution = GetWindowResolution(); - return resolution.x / resolution.y; - } - - /// - /// DEPRECATED: Misspelled version of GetWindowResolutionAspect. - /// - /// Aspect ratio. - public static float GetWindowResoltionAspect() - { - Vector2 resolution = GetWindowResolution(); - return resolution.x / resolution.y; - } } } \ No newline at end of file diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoEnums.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoEnums.cs index 11759a30..943331d8 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoEnums.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Common/TangoEnums.cs @@ -224,6 +224,11 @@ public enum TangoConfigType /// TANGO_CONFIG_AREA_LEARNING, + /// + /// Runtime configuration parameters. + /// + TANGO_CONFIG_RUNTIME, + /// /// Maximum number allowable. /// @@ -265,5 +270,21 @@ public enum TangoImageFormatType /// TANGO_HAL_PIXEL_FORMAT_YV12 = 0x32315659 } + + /// + /// Depth camera rates. + /// + public enum TangoDepthCameraRate + { + /// + /// Disable the depth camera entirely. + /// + DISABLED, + + /// + /// The maximum depth camera rate supported. This is 5 on the Tango tablet. + /// + MAXIMUM, + } } } \ No newline at end of file diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Interfaces/ITangoEventMultithreaded.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Interfaces/ITangoEventMultithreaded.cs new file mode 100644 index 00000000..b31fef20 --- /dev/null +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Interfaces/ITangoEventMultithreaded.cs @@ -0,0 +1,36 @@ +//----------------------------------------------------------------------- +// +// +// 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; + +/// +/// Tango event interface where the handler will be invoked from multiple threads. +/// +/// Use this if you want to get the events as soon as they happen. The handler will be invoked as soon as the +/// event happens, even if that is in another thread. You must make sure your handler is threadsafe. +/// +public interface ITangoEventMultithreaded +{ + /// + /// This is called each time a Tango event happens. + /// + /// Tango event. + void OnTangoEventMultithreadedAvailableEventHandler(Tango.TangoEvent tangoEvent); +} diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Interfaces/ITangoEventMultithreaded.cs.meta b/UnityExamples/Assets/TangoSDK/Core/Scripts/Interfaces/ITangoEventMultithreaded.cs.meta new file mode 100644 index 00000000..351f4479 --- /dev/null +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Interfaces/ITangoEventMultithreaded.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ff09c9752b24d434495a54e47fe2646a +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/DepthListener.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/DepthListener.cs index bedbebd3..e5a8836b 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/DepthListener.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/DepthListener.cs @@ -38,7 +38,7 @@ internal class DepthListener private Tango.DepthProvider.TangoService_onDepthAvailable m_onDepthAvailableCallback; /// - /// Occurs when m_on tango depth available. + /// Called when a new Tango depth is available. /// private event OnTangoDepthAvailableEventHandler OnTangoDepthAvailable; @@ -100,12 +100,11 @@ internal void UnregisterOnTangoDepthAvailable(OnTangoDepthAvailableEventHandler } /// - /// DEPRECATED: Callback that gets called when depth is available - /// from the Tango Service. + /// Callback that gets called when depth is available from the Tango Service. /// /// Callback context. /// Xyzij. - protected void _OnDepthAvailable(IntPtr callbackContext, TangoXYZij xyzij) + private void _OnDepthAvailable(IntPtr callbackContext, TangoXYZij xyzij) { // Fill in the data to draw the point cloud. if (xyzij != null) diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/PoseListener.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/PoseListener.cs index 4f79d849..8893475f 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/PoseListener.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/PoseListener.cs @@ -34,12 +34,13 @@ namespace Tango /// public class PoseListener { + private const int SIZE_OF_POSE_DATA_POOL = 3; + /// - /// DEPRECATED: The pose available callback. + /// Called when a new Tango pose is available. /// - internal Tango.PoseProvider.TangoService_onPoseAvailable m_poseAvailableCallback; + private Tango.PoseProvider.TangoService_onPoseAvailable m_poseAvailableCallback; - private const int SIZE_OF_POSE_DATA_POOL = 3; private TangoPoseData m_motionTrackingData = null; private TangoPoseData m_areaLearningData = null; private TangoPoseData m_relocalizationData = null; @@ -49,20 +50,10 @@ public class PoseListener private object m_lockObject = new object(); /// - /// DEPRECATED: Gets or sets a value indicating whether this is using auto reset. + /// Gets or sets a value indicating whether this is using auto reset. /// /// true if auto reset; otherwise, false. - public bool AutoReset - { - get; - set; - } - - /// - /// DEPRECATED: Gets or sets a value indicating whether this use camera intrinsics. - /// - /// true if use camera intrinsics; otherwise, false. - public bool UseCameraIntrinsics + internal bool AutoReset { get; set; diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/TangoEventListener.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/TangoEventListener.cs index 873098ca..94447861 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/TangoEventListener.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/TangoEventListener.cs @@ -35,7 +35,9 @@ internal class TangoEventListener { private TangoEvents.TangoService_onEventAvailable m_onEventAvaialableCallback; private OnTangoEventAvailableEventHandler m_onTangoEventAvailable; - private TangoEvent m_previousEvent; + private OnTangoEventAvailableEventHandler m_onTangoEventMultithreadedAvailable; + private TangoEvent m_tangoEvent; + private System.Object m_lockObject = new System.Object(); private bool m_isDirty; /// @@ -48,7 +50,7 @@ internal virtual void SetCallback() { m_onEventAvaialableCallback = new TangoEvents.TangoService_onEventAvailable(_onEventAvailable); TangoEvents.SetCallback(m_onEventAvaialableCallback); - m_previousEvent = new TangoEvent(); + m_tangoEvent = new TangoEvent(); m_isDirty = false; } @@ -57,14 +59,13 @@ internal virtual void SetCallback() /// internal void SendIfTangoEventAvailable() { - if (m_isDirty) + if (m_isDirty && m_onTangoEventAvailable != null) { - if (m_onTangoEventAvailable != null) + lock (m_lockObject) { - m_onTangoEventAvailable(m_previousEvent); + m_onTangoEventAvailable(m_tangoEvent); } - - m_isDirty = true; + m_isDirty = false; } } @@ -93,20 +94,51 @@ internal void UnregisterOnTangoEventAvailable(OnTangoEventAvailableEventHandler } /// - /// DEPRECATED: Handle the callback sent by the Tango Service - /// when a new event is issued. + /// Register a multithread handler for Tango events. + /// + /// Event handler to register. + internal void RegisterOnTangoEventMultithreadedAvailable(OnTangoEventAvailableEventHandler handler) + { + if (handler != null) + { + m_onTangoEventMultithreadedAvailable += handler; + } + } + + /// + /// Unregister a multithread handler for the Tango depth event. + /// + /// Event handler to unregister. + internal void UnregisterOnTangoEventMultithreadedAvailable(OnTangoEventAvailableEventHandler handler) + { + if (handler != null) + { + m_onTangoEventMultithreadedAvailable -= handler; + } + } + + /// + /// Handle the callback sent by the Tango Service when a new event is issued. /// /// Callback context. /// Tango event. - protected void _onEventAvailable(IntPtr callbackContext, TangoEvent tangoEvent) + private void _onEventAvailable(IntPtr callbackContext, TangoEvent tangoEvent) { if (tangoEvent != null) { - m_previousEvent.timestamp = tangoEvent.timestamp; - m_previousEvent.type = tangoEvent.type; - m_previousEvent.event_key = tangoEvent.event_key; - m_previousEvent.event_value = tangoEvent.event_value; - m_isDirty = true; + if (m_onTangoEventMultithreadedAvailable != null) + { + m_onTangoEventMultithreadedAvailable(tangoEvent); + } + + lock (m_lockObject) + { + m_tangoEvent.timestamp = tangoEvent.timestamp; + m_tangoEvent.type = tangoEvent.type; + m_tangoEvent.event_key = tangoEvent.event_key; + m_tangoEvent.event_value = tangoEvent.event_value; + m_isDirty = true; + } } } } diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/VideoOverlayListener.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/VideoOverlayListener.cs index 5f07a266..657a190c 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/VideoOverlayListener.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/Listeners/VideoOverlayListener.cs @@ -170,15 +170,13 @@ internal void UnregisterOnExperimentalTangoImageAvailable(OnExperimentalTangoIma } /// - /// DEPRECATED: Handle the callback sent by the Tango Service - /// when a new image is sampled. + /// Handle the callback sent by the Tango Service when a new image is sampled. /// /// Callback context. /// Camera identifier. /// Image buffer. - protected void _OnImageAvailable(IntPtr callbackContext, - TangoEnums.TangoCameraId cameraId, - TangoImageBuffer imageBuffer) + private void _OnImageAvailable(IntPtr callbackContext, TangoEnums.TangoCameraId cameraId, + TangoImageBuffer imageBuffer) { m_previousCameraId = cameraId; @@ -200,11 +198,11 @@ protected void _OnImageAvailable(IntPtr callbackContext, } /// - /// DEPRECATED: Handle the callback set by the Tango Service when a new image is available. + /// Handle the callback set by the Tango Service when a new image is available. /// /// Callback context. /// Camera identifier. - protected void _OnExperimentalUnityFrameAvailable(IntPtr callbackContext, Tango.TangoEnums.TangoCameraId cameraId) + private void _OnExperimentalUnityFrameAvailable(IntPtr callbackContext, Tango.TangoEnums.TangoCameraId cameraId) { m_previousCameraId = cameraId; m_shouldSendEvent = true; diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/PoseProvider.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/PoseProvider.cs index 39473e36..948dda8b 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/PoseProvider.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/PoseProvider.cs @@ -92,21 +92,6 @@ public static void GetPoseAtTime([In, Out] TangoPoseData poseData, } } - /// - /// DEPRECATED: Sets the listener coordinate frame pairs. - /// - /// Count. - /// Frames. - public static void SetListenerCoordinateFramePairs(int count, - ref TangoCoordinateFramePair frames) - { - int returnValue = PoseProviderAPI.TangoService_setPoseListenerFrames(count, ref frames); - if (returnValue != Common.ErrorType.TANGO_SUCCESS) - { - Debug.Log(CLASS_NAME + ".SetListenerCoordinateFramePairs() Could not set frame pairs"); - } - } - /// /// Resets the motion tracking system. /// diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs index 7965d18c..f3077c9d 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs @@ -75,6 +75,7 @@ private enum PermissionsTypes public bool m_enableVideoOverlay = false; public bool m_motionTrackingAutoReset = true; public bool m_enableAreaLearning = false; + public bool m_enableADFLoading = false; public bool m_useExperimentalVideoOverlay = true; public bool m_useExperimentalADF = false; #if UNITY_EDITOR @@ -120,6 +121,8 @@ private enum PermissionsTypes private VideoOverlayListener m_videoOverlayListener; private TangoEventListener m_tangoEventListener; private YUVTexture m_yuvTexture; + private TangoConfig m_tangoConfig; + private TangoConfig m_tangoRuntimeConfig; /// /// Get the Tango service version name. @@ -160,6 +163,13 @@ public void Register(System.Object tangoObject) RegisterOnTangoEvent(tangoEvent.OnTangoEventAvailableEventHandler); } + ITangoEventMultithreaded tangoEventMultithreaded = tangoObject as ITangoEventMultithreaded; + + if (tangoEventMultithreaded != null) + { + RegisterOnTangoEventMultithreaded(tangoEventMultithreaded.OnTangoEventMultithreadedAvailableEventHandler); + } + if (m_enableMotionTracking) { ITangoPose poseHandler = tangoObject as ITangoPose; @@ -218,6 +228,13 @@ public void Unregister(System.Object tangoObject) UnregisterOnTangoEvent(tangoEvent.OnTangoEventAvailableEventHandler); } + ITangoEventMultithreaded tangoEventMultithreaded = tangoObject as ITangoEventMultithreaded; + + if (tangoEventMultithreaded != null) + { + UnregisterOnTangoEventMultithreaded(tangoEventMultithreaded.OnTangoEventMultithreadedAvailableEventHandler); + } + if (m_enableMotionTracking) { ITangoPose poseHandler = tangoObject as ITangoPose; @@ -299,20 +316,6 @@ public void UnregisterPermissionsCallback(PermissionsEvent permissionsEventHandl } } - /// - /// DEPRECATED: Unregister from the permission callbacks. - /// - /// See TangoApplication.RegisterPermissionsCallback for more details. - /// - /// Event to remove. - public void RemovePermissionsCallback(PermissionsEvent permissionsEventHandler) - { - if (permissionsEventHandler != null) - { - PermissionEvent -= permissionsEventHandler; - } - } - /// /// Register to get an event callback when connected to the Tango service. /// @@ -399,7 +402,14 @@ public void InitApplication() { Debug.Log("-----------------------------------Initializing Tango"); _TangoInitialize(); - TangoConfig.InitConfig(TangoEnums.TangoConfigType.TANGO_CONFIG_DEFAULT); + if (m_tangoConfig == null) + { + m_tangoConfig = new TangoConfig(TangoEnums.TangoConfigType.TANGO_CONFIG_DEFAULT); + } + if (m_tangoRuntimeConfig == null) + { + m_tangoRuntimeConfig = new TangoConfig(TangoEnums.TangoConfigType.TANGO_CONFIG_RUNTIME); + } if (m_enableVideoOverlay && m_useExperimentalVideoOverlay) { @@ -408,10 +418,10 @@ public void InitApplication() int uvTextureWidth = 0; int uvTextureHeight = 0; - TangoConfig.GetInt32(TangoConfig.Keys.EXPERIMENTAL_Y_TEXTURE_WIDTH, ref yTextureWidth); - TangoConfig.GetInt32(TangoConfig.Keys.EXPERIMENTAL_Y_TEXTURE_HEIGHT, ref yTextureHeight); - TangoConfig.GetInt32(TangoConfig.Keys.EXPERIMENTAL_UV_TEXTURE_WIDTH, ref uvTextureWidth); - TangoConfig.GetInt32(TangoConfig.Keys.EXPERIMENTAL_UV_TEXTURE_HEIGHT, ref uvTextureHeight); + m_tangoConfig.GetInt32(TangoConfig.Keys.EXPERIMENTAL_Y_TEXTURE_WIDTH, ref yTextureWidth); + m_tangoConfig.GetInt32(TangoConfig.Keys.EXPERIMENTAL_Y_TEXTURE_HEIGHT, ref yTextureHeight); + m_tangoConfig.GetInt32(TangoConfig.Keys.EXPERIMENTAL_UV_TEXTURE_WIDTH, ref uvTextureWidth); + m_tangoConfig.GetInt32(TangoConfig.Keys.EXPERIMENTAL_UV_TEXTURE_HEIGHT, ref uvTextureHeight); if (yTextureWidth == 0 || yTextureHeight == 0 || uvTextureWidth == 0 || uvTextureHeight == 0) { @@ -461,10 +471,79 @@ public void ConnectToService() public void Shutdown() { Debug.Log("Tango Shutdown"); - TangoConfig.Free(); + if (m_tangoConfig != null) + { + m_tangoConfig.Dispose(); + m_tangoConfig = null; + } + if (m_tangoRuntimeConfig != null) + { + m_tangoRuntimeConfig.Dispose(); + m_tangoRuntimeConfig = null; + } _TangoDisconnect(); } + /// + /// Set the framerate of the depth camera. + /// + /// Disabling or reducing the framerate of the depth camera when it is running can save a significant amount + /// of battery. + /// + /// The rate in frames per second, for the depth camera to run at. + public void SetDepthCameraRate(int rate) + { + if (rate < 0) + { + Debug.Log("Invalid rate passed to SetDepthCameraRate"); + return; + } + + m_tangoRuntimeConfig.SetInt32(TangoConfig.Keys.RUNTIME_DEPTH_FRAMERATE, rate); + m_tangoRuntimeConfig.SetRuntimeConfig(); + } + + /// + /// Set the framerate of the depth camera. + /// + /// Disabling or reducing the framerate of the depth camera when it is running can save a significant amount + /// of battery. + /// + /// A special rate to set the depth camera to. + public void SetDepthCameraRate(TangoEnums.TangoDepthCameraRate rate) + { + switch (rate) + { + case TangoEnums.TangoDepthCameraRate.DISABLED: + SetDepthCameraRate(0); + break; + + case TangoEnums.TangoDepthCameraRate.MAXIMUM: + // Set the depth frame rate to a sufficiently high number, it will get rounded down. There is no + // way to actually get the maximum value to pass in. + SetDepthCameraRate(9000); + break; + } + } + + /// + /// Get the Tango config. Useful for debugging. + /// + /// The config. + internal TangoConfig Config + { + get { return m_tangoConfig; } + } + + /// + /// Get the current Tango runtime config. Useful for debugging. + /// + /// The current runtime config. + internal TangoConfig RuntimeConfig + { + get { return m_tangoRuntimeConfig; } + } + /// /// Register to get Tango pose callbacks. /// @@ -548,6 +627,34 @@ internal void UnregisterOnTangoEvent(OnTangoEventAvailableEventHandler handler) m_tangoEventListener.UnregisterOnTangoEventAvailable(handler); } } + + /// + /// Register to get Tango event callbacks. + /// + /// See TangoApplication.Register for details. + /// + /// Object to stop getting Tango callbacks from. + internal void RegisterOnTangoEventMultithreaded(OnTangoEventAvailableEventHandler handler) + { + if (m_tangoEventListener != null) + { + m_tangoEventListener.RegisterOnTangoEventMultithreadedAvailable(handler); + } + } + + /// + /// Unregister from the Tango event callbacks. + /// + /// See TangoApplication.Register for more details. + /// + /// Event to remove. + internal void UnregisterOnTangoEventMultithreaded(OnTangoEventAvailableEventHandler handler) + { + if (m_tangoEventListener != null) + { + m_tangoEventListener.UnregisterOnTangoEventMultithreadedAvailable(handler); + } + } /// /// Register to get Tango video overlay callbacks. @@ -685,22 +792,33 @@ private void _InitializeMotionTracking(string uuid) { System.Collections.Generic.List framePairs = new System.Collections.Generic.List(); - if (TangoConfig.SetBool(TangoConfig.Keys.ENABLE_MOTION_TRACKING_BOOL, m_enableMotionTracking) && m_enableMotionTracking) + if (m_tangoConfig.SetBool(TangoConfig.Keys.ENABLE_MOTION_TRACKING_BOOL, m_enableMotionTracking) && m_enableMotionTracking) { TangoCoordinateFramePair motionTracking; motionTracking.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_START_OF_SERVICE; motionTracking.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE; framePairs.Add(motionTracking); - - if (TangoConfig.SetBool(TangoConfig.Keys.ENABLE_AREA_LEARNING_BOOL, m_enableAreaLearning) && m_enableAreaLearning) + + bool areaLearningEnabled = false; + if (m_tangoConfig.SetBool(TangoConfig.Keys.ENABLE_AREA_LEARNING_BOOL, m_enableAreaLearning) && m_enableAreaLearning) { + areaLearningEnabled = true; Debug.Log("Area Learning is enabled."); + } + + // 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)) { - TangoConfig.SetBool("config_experimental_high_accuracy_small_scale_adf", m_useExperimentalADF); - TangoConfig.SetString(TangoConfig.Keys.LOAD_AREA_DESCRIPTION_UUID_STRING, uuid); + m_tangoConfig.SetString(TangoConfig.Keys.LOAD_AREA_DESCRIPTION_UUID_STRING, uuid); } - + } + + if (areaLearningEnabled || m_enableADFLoading) + { TangoCoordinateFramePair areaDescription; areaDescription.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_AREA_DESCRIPTION; areaDescription.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE; @@ -720,9 +838,9 @@ private void _InitializeMotionTracking(string uuid) } // The C API does not default this to on, but it is locked down. - TangoConfig.SetBool(TangoConfig.Keys.ENABLE_LOW_LATENCY_IMU_INTEGRATION, true); + m_tangoConfig.SetBool(TangoConfig.Keys.ENABLE_LOW_LATENCY_IMU_INTEGRATION, true); - TangoConfig.SetBool(TangoConfig.Keys.ENABLE_MOTION_TRACKING_AUTO_RECOVERY_BOOL, m_motionTrackingAutoReset); + m_tangoConfig.SetBool(TangoConfig.Keys.ENABLE_MOTION_TRACKING_AUTO_RECOVERY_BOOL, m_motionTrackingAutoReset); } /// @@ -730,7 +848,7 @@ private void _InitializeMotionTracking(string uuid) /// private void _InitializeDepth() { - if (TangoConfig.SetBool(TangoConfig.Keys.ENABLE_DEPTH_PERCEPTION_BOOL, m_enableDepth) && m_enableDepth) + if (m_tangoConfig.SetBool(TangoConfig.Keys.ENABLE_DEPTH_PERCEPTION_BOOL, m_enableDepth) && m_enableDepth) { _SetDepthCallbacks(); } @@ -777,7 +895,7 @@ private void _TangoConnect() { m_isServiceConnected = true; AndroidHelper.PerformanceLog("Unity _TangoConnect start"); - if (TangoServiceAPI.TangoService_connect(m_callbackContext, TangoConfig.GetConfig()) != Common.ErrorType.TANGO_SUCCESS) + if (TangoServiceAPI.TangoService_connect(m_callbackContext, m_tangoConfig.GetHandle()) != Common.ErrorType.TANGO_SUCCESS) { Debug.Log(CLASS_NAME + ".Connect() Could not connect to the Tango Service!"); } @@ -955,6 +1073,7 @@ private void _ResetPermissionsFlags() { m_requiredPermissions |= m_enableMotionTracking ? PermissionsTypes.MOTION_TRACKING : PermissionsTypes.NONE; m_requiredPermissions |= m_enableAreaLearning ? PermissionsTypes.AREA_LEARNING : PermissionsTypes.NONE; + m_requiredPermissions |= m_enableADFLoading ? PermissionsTypes.AREA_LEARNING : PermissionsTypes.NONE; } } diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoConfig.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoConfig.cs index e50ae856..3135cc93 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoConfig.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/TangoConfig.cs @@ -29,7 +29,7 @@ namespace Tango /// /// C API wrapper for Tango Configuration Parameters. /// - internal class TangoConfig + internal sealed class TangoConfig : IDisposable { #region Attributes /// @@ -58,76 +58,88 @@ internal struct Keys // Utility public static readonly string ENABLE_DATASET_RECORDING = "config_enable_dataset_recording"; public static readonly string GET_TANGO_SERVICE_VERSION_STRING = "tango_service_library_version"; + + // Runtime configs + public static readonly string RUNTIME_DEPTH_FRAMERATE = "config_runtime_depth_framerate"; } private const string m_FailedConversionFormat = "Failed to convert object to generic type : {0}. Reverting to default."; private const string m_ErrorLogFormat = "{0}.{1}() Was unable to set key: {2} with value: {3}"; private const string m_ConfigErrorFormat = "{0}.{1}() Invalid TangoConfig, make sure Tango Config is initialized properly."; - private static readonly string CLASS_NAME = "TangoConfig."; + private static readonly string CLASS_NAME = "TangoConfig"; private static readonly string NO_CONFIG_FOUND = "No config file found."; - private static IntPtr m_tangoConfig = IntPtr.Zero; + + /// + /// Pointer to the TangoConfig. + /// + private IntPtr m_configHandle; /// /// Delegate for internal API call that sets a config option. /// - /// This matches the signature of TangoConfig_setBool, TangoConfig_Double, etc. + /// This matches the signature of TangoConfig_setBool, TangoConfig_setDouble, etc. /// - /// C pointer to a TangoConfig. - /// Key we want to modify. - /// Value to set, of the correct type. + /// TangoConfig handle. + /// Key we want to modify. + /// Value to set, of the correct type. /// /// Returns TANGO_SUCCESS on success or TANGO_INVALID if config or key is NULL, or key is not found or could /// not be set. /// - private delegate int ConfigAPIDelegate(IntPtr obj1, string obj2, T obj3); - #endregion + private delegate int ConfigAPISetter(IntPtr configHandle, string key, T val); /// - /// Gets the cached C pointer to a TangoConfig. + /// Delegate for internal API call that gets a config option. /// - /// This pointer is updated by calling InitConfig. + /// This matches the signature of TangoConfig_getBool, TangoConfig_getDouble, etc. /// - /// C pointer to a Tango config. - internal static IntPtr GetConfig() - { - return m_tangoConfig; - } + /// TangoConfig handle. + /// Key we want to get. + /// Upon success, the value of for key. + /// + /// Returns TANGO_SUCCESS on success or TANGO_INVALID if config or key is NULL, or key is not found or could + /// not be set. + /// + private delegate int ConfigAPIGetter(IntPtr configHandle, string key, ref T val); + #endregion /// - /// Update the cached C pointer to a TangoConfig. + /// Create a new TangoConfig. /// - /// This should be used to initialize a Config object for setting the configuration that TangoService should - /// be run in. The Config handle is passed to TangoService_connect() which starts the service running with - /// the parameters set at that time in that TangoConfig handle. This function can be used to find the current + /// A TangoConfig is passed to TangoService_connect() which starts the service running with + /// the parameters set at that time in that TangoConfig. This function can be used to find the current /// configuration of the service (i.e. what would be run if no config is specified on TangoService_connect()), - /// or to create one of a few "template" TangoConfigs. The returned TangoConfig can be further modified by - /// TangoConfig_set function calls. The handle should be freed with Free(). The handle is needed - /// only at the time of TangoService_connect() where it is used to configure the service, and can safely be - /// freed after it has been used in TangoService_connect(). + /// or to create one of a few "template" TangoConfigs. + /// + /// The class is needed only at the time of TangoService_connect() where it is used to configure the service + /// and can safely be disposed after it has been used in TangoService_connect(). /// /// The requested configuration type. - internal static void InitConfig(TangoEnums.TangoConfigType configType) + public TangoConfig(TangoEnums.TangoConfigType configType) { - m_tangoConfig = TangoConfigAPI.TangoService_getConfig(configType); - - // TODO : error check this! + m_configHandle = TangoConfigAPI.TangoService_getConfig(configType); } /// - /// Free a TangoConfig object. - /// - /// Frees the TangoConfig object for the cached handle. + /// Releases all resource used by the object. /// - internal static void Free() + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After calling + /// , you must release all references to the so the garbage + /// collector can reclaim the memory that the was occupying. + public void Dispose() { - if (m_tangoConfig != IntPtr.Zero) + if (m_configHandle != IntPtr.Zero) { - TangoConfigAPI.TangoConfig_free(m_tangoConfig); - } + TangoConfigAPI.TangoConfig_free(m_configHandle); + m_configHandle = IntPtr.Zero; + } else { Debug.Log(CLASS_NAME + ".Free() No allocated Tango Config found!"); } + + GC.SuppressFinalize(this); } /// @@ -137,11 +149,11 @@ internal static void Free() /// Note that many of these config values are read-only, unless otherwise documented. /// /// String representation of the cached configuration. - internal static string GetSettings() + internal string GetSettings() { - if (m_tangoConfig != IntPtr.Zero) + if (m_configHandle != IntPtr.Zero) { - return TangoConfigAPI.TangoConfig_toString(m_tangoConfig); + return TangoConfigAPI.TangoConfig_toString(m_configHandle); } else { @@ -149,15 +161,24 @@ internal static string GetSettings() } } + /// + /// Get the internal handle for this TangoConfig. + /// + /// The handle. + internal IntPtr GetHandle() + { + return m_configHandle; + } + /// /// Set a boolean configuration parameter. /// /// true on success, false otherwise. /// The string key value of the configuration parameter to set. /// The value to set the configuration key to. - internal static bool SetBool(string key, bool value) + internal bool SetBool(string key, bool value) { - return _ConfigHelperSet(new ConfigAPIDelegate(TangoConfigAPI.TangoConfig_setBool), m_tangoConfig, key, value, "SetBool"); + return _ConfigHelperSet(new ConfigAPISetter(TangoConfigAPI.TangoConfig_setBool), key, value, "SetBool"); } /// @@ -166,9 +187,9 @@ internal static bool SetBool(string key, bool value) /// true on success, false otherwise. /// The string key value of the configuration parameter to set. /// The value to set the configuration key to. - internal static bool SetInt32(string key, Int32 value) + internal bool SetInt32(string key, Int32 value) { - return _ConfigHelperSet(new ConfigAPIDelegate(TangoConfigAPI.TangoConfig_setInt32), m_tangoConfig, key, value, "SetInt32"); + return _ConfigHelperSet(new ConfigAPISetter(TangoConfigAPI.TangoConfig_setInt32), key, value, "SetInt32"); } /// @@ -177,9 +198,9 @@ internal static bool SetInt32(string key, Int32 value) /// true on success, false otherwise. /// The string key value of the configuration parameter to set. /// The value to set the configuration key to. - internal static bool SetInt64(string key, Int64 value) + internal bool SetInt64(string key, Int64 value) { - return _ConfigHelperSet(new ConfigAPIDelegate(TangoConfigAPI.TangoConfig_setInt64), m_tangoConfig, key, value, "SetInt64"); + return _ConfigHelperSet(new ConfigAPISetter(TangoConfigAPI.TangoConfig_setInt64), key, value, "SetInt64"); } /// @@ -188,9 +209,9 @@ internal static bool SetInt64(string key, Int64 value) /// true on success, false otherwise. /// The string key value of the configuration parameter to set. /// The value to set the configuration key to. - internal static bool SetDouble(string key, double value) + internal bool SetDouble(string key, double value) { - return _ConfigHelperSet(new ConfigAPIDelegate(TangoConfigAPI.TangoConfig_setDouble), m_tangoConfig, key, value, "SetDouble"); + return _ConfigHelperSet(new ConfigAPISetter(TangoConfigAPI.TangoConfig_setDouble), key, value, "SetDouble"); } /// @@ -199,9 +220,9 @@ internal static bool SetDouble(string key, double value) /// true on success, false otherwise. /// The string key value of the configuration parameter to set. /// The value to set the configuration key to. - internal static bool SetString(string key, string value) + internal bool SetString(string key, string value) { - return _ConfigHelperSet(new ConfigAPIDelegate(TangoConfigAPI.TangoConfig_setString), m_tangoConfig, key, value, "SetString"); + return _ConfigHelperSet(new ConfigAPISetter(TangoConfigAPI.TangoConfig_setString), key, value, "SetString"); } /// @@ -210,20 +231,9 @@ internal static bool SetString(string key, string value) /// true, if the value was retrieved, false otherwise. /// The string key value of the configuration parameter to get. /// On successful return, the value of the configuration key. - internal static bool GetBool(string key, ref bool value) + internal bool GetBool(string key, ref bool value) { - bool wasSuccess = false; - if (m_tangoConfig != IntPtr.Zero) - { - wasSuccess = TangoConfigAPI.TangoConfig_getBool(m_tangoConfig, key, ref value) == Common.ErrorType.TANGO_SUCCESS; - } - if (!wasSuccess) - { -#if UNITY_ANDROID && !UNITY_EDITOR - Debug.LogWarning(string.Format(m_ErrorLogFormat, "GetBool", key, false)); -#endif - } - return wasSuccess; + return _ConfigHelperGet(new ConfigAPIGetter(TangoConfigAPI.TangoConfig_getBool), key, ref value, "GetBool"); } /// @@ -232,18 +242,9 @@ internal static bool GetBool(string key, ref bool value) /// true, if the value was retrieved, false otherwise. /// The string key value of the configuration parameter to get. /// On successful return, the value of the configuration key. - internal static bool GetInt32(string key, ref Int32 value) + internal bool GetInt32(string key, ref Int32 value) { - bool wasSuccess = false; - if (m_tangoConfig != IntPtr.Zero) - { - wasSuccess = TangoConfigAPI.TangoConfig_getInt32(m_tangoConfig, key, ref value) == Common.ErrorType.TANGO_SUCCESS; - } - if (!wasSuccess) - { - Debug.Log(string.Format(m_ErrorLogFormat, "GetInt32", key, value)); - } - return wasSuccess; + return _ConfigHelperGet(new ConfigAPIGetter(TangoConfigAPI.TangoConfig_getInt32), key, ref value, "GetInt32"); } /// @@ -252,18 +253,9 @@ internal static bool GetInt32(string key, ref Int32 value) /// true, if the value was retrieved, false otherwise. /// The string key value of the configuration parameter to get. /// On successful return, the value of the configuration key. - internal static bool GetInt64(string key, ref Int64 value) + internal bool GetInt64(string key, ref Int64 value) { - bool wasSuccess = false; - if (m_tangoConfig != IntPtr.Zero) - { - wasSuccess = TangoConfigAPI.TangoConfig_getInt64(m_tangoConfig, key, ref value) == Common.ErrorType.TANGO_SUCCESS; - } - if (!wasSuccess) - { - Debug.Log(string.Format(m_ErrorLogFormat, "GetInt64", key, value)); - } - return wasSuccess; + return _ConfigHelperGet(new ConfigAPIGetter(TangoConfigAPI.TangoConfig_getInt64), key, ref value, "GetInt64"); } /// @@ -272,18 +264,9 @@ internal static bool GetInt64(string key, ref Int64 value) /// true, if the value was retrieved, false otherwise. /// The string key value of the configuration parameter to get. /// On successful return, the value of the configuration key. - internal static bool GetDouble(string key, ref double value) + internal bool GetDouble(string key, ref double value) { - bool wasSuccess = false; - if (m_tangoConfig != IntPtr.Zero) - { - wasSuccess = TangoConfigAPI.TangoConfig_getDouble(m_tangoConfig, key, ref value) == 0; - } - if (!wasSuccess) - { - Debug.Log(string.Format(m_ErrorLogFormat, "GetDouble", key, value)); - } - return wasSuccess; + return _ConfigHelperGet(new ConfigAPIGetter(TangoConfigAPI.TangoConfig_getDouble), key, ref value, "GetDouble"); } /// @@ -292,71 +275,96 @@ internal static bool GetDouble(string key, ref double value) /// true, if the value was retrieved, false otherwise. /// The string key value of the configuration parameter to get. /// On successful return, the value of the configuration key. - internal static bool GetString(string key, ref string value) + internal bool GetString(string key, ref string value) { + // Can't use _ConfigHelperGet because the API takes a size parameter. + string tangoMethodName = "GetString"; + + if (m_configHandle == IntPtr.Zero) + { + Debug.Log(string.Format(m_ConfigErrorFormat, CLASS_NAME, tangoMethodName)); + return false; + } + bool wasSuccess = false; - if (m_tangoConfig != IntPtr.Zero) + StringBuilder stringBuilder = new StringBuilder(512); + wasSuccess = TangoConfigAPI.TangoConfig_getString(m_configHandle, key, stringBuilder, (uint)stringBuilder.Capacity) == Common.ErrorType.TANGO_SUCCESS; + value = stringBuilder.ToString(); + if (!wasSuccess) { - UInt32 stringLength = 512; - - StringBuilder tempString = new StringBuilder(512); - wasSuccess = TangoConfigAPI.TangoConfig_getString(m_tangoConfig, key, tempString, stringLength) == Common.ErrorType.TANGO_SUCCESS; - if (wasSuccess) - { - value = tempString.ToString(); - } - else - { - Debug.Log(string.Format(m_ErrorLogFormat, "GetString", key, value)); - } + Debug.Log(string.Format(m_ErrorLogFormat, CLASS_NAME, tangoMethodName, key)); } return wasSuccess; } + /// + /// Set this config as the current runtime config. + /// + internal void SetRuntimeConfig() + { + bool wasSuccess = TangoConfigAPI.TangoService_setRuntimeConfig(m_configHandle) == Common.ErrorType.TANGO_SUCCESS; + if (!wasSuccess) + { + Debug.Log(string.Format(m_ErrorLogFormat, CLASS_NAME, "SetRuntimeConfig")); + } + } + /// /// Helper method for setting a configuration parameter. /// /// true if the API call returned success, false otherwise. - /// The API call we want to perform. - /// Handle to a Tango Config. - /// The string key value of the configuration parameter to set. - /// The value to set the configuration key to. - /// Name of the method we are calling. Used for logging purposes. - /// The type of object we are trying to set. - private static bool _ConfigHelperSet(ConfigAPIDelegate apiCall, IntPtr tangoConfig, string configKey, object configValue, - string tangoMethodName) + /// The API call to perform. + /// The key of the configuration parameter to set. + /// The value to set the configuration key to. + /// Name of the calling method. Used for logging purposes. + /// The type of object to set. + private bool _ConfigHelperSet(ConfigAPISetter apiCall, string key, T value, string tangoMethodName) { - if (tangoConfig == IntPtr.Zero) + if (m_configHandle == IntPtr.Zero) { Debug.Log(string.Format(m_ConfigErrorFormat, CLASS_NAME, tangoMethodName)); return false; } + bool wasSuccess = false; - T genericObj; - try + wasSuccess = apiCall(m_configHandle, key, value) == Common.ErrorType.TANGO_SUCCESS; + if (!wasSuccess) { - genericObj = (T)configValue; - } - catch + Debug.Log(string.Format(m_ErrorLogFormat, CLASS_NAME, tangoMethodName, key, value)); + } + return wasSuccess; + } + + /// + /// Helper method for getting a configuration parameter. + /// + /// true, if the API call returned success, false otherwise. + /// The API call to perfom. + /// The key of the configuration parameter to get. + /// On success, this is filled with the value of the configuration parameter. + /// Name of the calling method. Used for logging purposes. + /// The 1type of object to get. + private bool _ConfigHelperGet(ConfigAPIGetter apiCall, string key, ref T value, string tangoMethodName) + { + if (m_configHandle == IntPtr.Zero) { - Debug.Log(string.Format(m_FailedConversionFormat, typeof(T))); - genericObj = default(T); + Debug.Log(string.Format(m_ConfigErrorFormat, CLASS_NAME, tangoMethodName)); + return false; } - wasSuccess = apiCall(tangoConfig, configKey, genericObj) == Common.ErrorType.TANGO_SUCCESS; + + bool wasSuccess = false; + wasSuccess = apiCall(m_configHandle, key, ref value) == Common.ErrorType.TANGO_SUCCESS; if (!wasSuccess) { - Debug.Log(string.Format(m_ErrorLogFormat, CLASS_NAME, tangoMethodName, configKey, configValue)); + Debug.Log(string.Format(m_ErrorLogFormat, CLASS_NAME, tangoMethodName, key)); } return wasSuccess; } - /// - /// DEPRECATED: Internal API, should be private. - /// [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:ElementsMustBeDocumented", Justification = "C API Wrapper.")] - internal struct TangoConfigAPI + private struct TangoConfigAPI { #if UNITY_ANDROID && !UNITY_EDITOR [DllImport(Common.TANGO_UNITY_DLL)] @@ -417,6 +425,9 @@ public static extern int TangoConfig_getString(IntPtr tangoConfig, [MarshalAs(UnmanagedType.LPStr)] string key, [In, Out] StringBuilder value, UInt32 size); + + [DllImport(Common.TANGO_UNITY_DLL)] + public static extern int TangoService_setRuntimeConfig(IntPtr tangoConfig); #else public static void TangoConfig_free(IntPtr tangoConfig) { @@ -502,6 +513,11 @@ public static int TangoConfig_getString(IntPtr tangoConfig, { return Common.ErrorType.TANGO_SUCCESS; } + + public static int TangoService_setRuntimeConfig(IntPtr tangoConfig) + { + return Common.ErrorType.TANGO_SUCCESS; + } #endif } } diff --git a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/VideoOverlayProvider.cs b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/VideoOverlayProvider.cs index 3d3ecfb2..1a879985 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/VideoOverlayProvider.cs +++ b/UnityExamples/Assets/TangoSDK/Core/Scripts/TangoWrappers/VideoOverlayProvider.cs @@ -76,42 +76,6 @@ public static void ConnectTexture(TangoEnums.TangoCameraId cameraId, int texture } } - /// - /// Experimental API only, subject to change. Connect a Texture IDs to a camera. - /// - /// The camera is selected via TangoCameraId. Currently only TANGO_CAMERA_COLOR is supported. The texture - /// handles will be regenerated by the API on startup after which the application can use them, and will be - /// packed RGBA8888 data containing bytes of the image (so a single RGBA8888 will pack 4 neighbouring pixels). - /// If the config flag experimental_image_pixel_format is set to HAL_PIXEL_FORMAT_YCrCb_420_SP, texture_y will - /// pack 1280x720 pixels into a 320x720 RGBA8888 texture. texture_Cb and texture_Cr will contain copies of - /// the 2x2 downsampled interleaved UV planes packed similarly. If experimental_image_pixel_format is set to - /// HAL_PIXEL_FORMAT_YV12 then texture_y will have a stride of 1536 containing 1280 columns of data, packed - /// similarly in a RGBA8888 texture. texture_Cb and texture_Cr will be 2x2 downsampled versions of the same. - /// See YV12 and NV21 formats for details. - /// - /// Note: The first scan-line of the color image is reserved for metadata instead of image pixels. - /// - /// - /// The ID of the camera to connect this texture to. Only TANGO_CAMERA_COLOR and TANGO_CAMERA_FISHEYE are - /// supported. - /// - /// The texture IDs to use for the Y, Cb, and Cr planes. - /// Callback. - internal static void ExperimentalConnectTexture(TangoEnums.TangoCameraId cameraId, YUVTexture textures, TangoService_onUnityFrameAvailable onUnityFrameAvailable) - { - int returnValue = VideoOverlayAPI.TangoService_Experimental_connectTextureIdUnity(cameraId, - (uint)textures.m_videoOverlayTextureY.GetNativeTextureID(), - (uint)textures.m_videoOverlayTextureCb.GetNativeTextureID(), - (uint)textures.m_videoOverlayTextureCr.GetNativeTextureID(), - callbackContext, - onUnityFrameAvailable); - - if (returnValue != Common.ErrorType.TANGO_SUCCESS) - { - Debug.Log("VideoOverlayProvider.ConnectTexture() Texture was not connected to camera!"); - } - } - /// /// Update the texture that has been connected to camera referenced by TangoCameraId with the latest image /// from the camera. @@ -129,10 +93,10 @@ public static double RenderLatestFrame(TangoEnums.TangoCameraId cameraId) { Debug.Log("VideoOverlayProvider.UpdateTexture() Texture was not updated by camera!"); } - + return timestamp; } - + /// /// Get the intrinsic calibration parameters for a given camera. /// @@ -153,6 +117,42 @@ public static void GetIntrinsics(TangoEnums.TangoCameraId cameraId, [Out] TangoC } } + /// + /// Experimental API only, subject to change. Connect a Texture IDs to a camera. + /// + /// The camera is selected via TangoCameraId. Currently only TANGO_CAMERA_COLOR is supported. The texture + /// handles will be regenerated by the API on startup after which the application can use them, and will be + /// packed RGBA8888 data containing bytes of the image (so a single RGBA8888 will pack 4 neighbouring pixels). + /// If the config flag experimental_image_pixel_format is set to HAL_PIXEL_FORMAT_YCrCb_420_SP, texture_y will + /// pack 1280x720 pixels into a 320x720 RGBA8888 texture. texture_Cb and texture_Cr will contain copies of + /// the 2x2 downsampled interleaved UV planes packed similarly. If experimental_image_pixel_format is set to + /// HAL_PIXEL_FORMAT_YV12 then texture_y will have a stride of 1536 containing 1280 columns of data, packed + /// similarly in a RGBA8888 texture. texture_Cb and texture_Cr will be 2x2 downsampled versions of the same. + /// See YV12 and NV21 formats for details. + /// + /// Note: The first scan-line of the color image is reserved for metadata instead of image pixels. + /// + /// + /// The ID of the camera to connect this texture to. Only TANGO_CAMERA_COLOR and TANGO_CAMERA_FISHEYE are + /// supported. + /// + /// The texture IDs to use for the Y, Cb, and Cr planes. + /// Callback. + internal static void ExperimentalConnectTexture(TangoEnums.TangoCameraId cameraId, YUVTexture textures, TangoService_onUnityFrameAvailable onUnityFrameAvailable) + { + int returnValue = VideoOverlayAPI.TangoService_Experimental_connectTextureIdUnity(cameraId, + (uint)textures.m_videoOverlayTextureY.GetNativeTextureID(), + (uint)textures.m_videoOverlayTextureCb.GetNativeTextureID(), + (uint)textures.m_videoOverlayTextureCr.GetNativeTextureID(), + callbackContext, + onUnityFrameAvailable); + + if (returnValue != Common.ErrorType.TANGO_SUCCESS) + { + Debug.Log("VideoOverlayProvider.ConnectTexture() Texture was not connected to camera!"); + } + } + /// /// Connect a callback to a camera for access to the pixels. /// diff --git a/UnityExamples/Assets/TangoSDK/Core/Tango.dat b/UnityExamples/Assets/TangoSDK/Core/Tango.dat index 80235af0..4cf28363 100644 --- a/UnityExamples/Assets/TangoSDK/Core/Tango.dat +++ b/UnityExamples/Assets/TangoSDK/Core/Tango.dat @@ -1 +1 @@ - undefined400af05 release-weyl \ No newline at end of file + undefinedf2877f0release-xiaotong \ No newline at end of file diff --git a/UnityExamples/Assets/TangoSDK/Editor/TangoInspector.cs b/UnityExamples/Assets/TangoSDK/Editor/TangoInspector.cs index ef88ba1d..d9a26bd7 100644 --- a/UnityExamples/Assets/TangoSDK/Editor/TangoInspector.cs +++ b/UnityExamples/Assets/TangoSDK/Editor/TangoInspector.cs @@ -67,6 +67,8 @@ private void _DrawMotionTrackingOptions(TangoApplication tangoApplication) tangoApplication.m_motionTrackingAutoReset = EditorGUILayout.Toggle("Auto Reset", tangoApplication.m_motionTrackingAutoReset); + tangoApplication.m_enableADFLoading = EditorGUILayout.Toggle("Load ADF", + tangoApplication.m_enableADFLoading); tangoApplication.m_enableAreaLearning = EditorGUILayout.Toggle("Area Learning", tangoApplication.m_enableAreaLearning); if (tangoApplication.m_enableAreaLearning) diff --git a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/TangoUx.cs b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/TangoUx.cs index 16bcd901..48409e79 100644 --- a/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/TangoUx.cs +++ b/UnityExamples/Assets/TangoSDK/TangoUX/Scripts/TangoUx.cs @@ -19,7 +19,7 @@ namespace Tango { [RequireComponent(typeof(TangoApplication))] - public class TangoUx : MonoBehaviour, ITangoPose, ITangoEvent, ITangoDepth + public class TangoUx : MonoBehaviour, ITangoPose, ITangoEventMultithreaded, ITangoDepth { public bool m_enableUXLibrary = true; public bool m_drawDefaultUXExceptions = true; @@ -103,7 +103,7 @@ public void OnTangoPoseAvailable(Tango.TangoPoseData poseData) /// Raises the tango event available event handler event. /// /// Tango event. - public void OnTangoEventAvailableEventHandler(Tango.TangoEvent tangoEvent) + public void OnTangoEventMultithreadedAvailableEventHandler(Tango.TangoEvent tangoEvent) { if(m_enableUXLibrary) { diff --git a/UnityExamples/ProjectSettings/ProjectSettings.asset b/UnityExamples/ProjectSettings/ProjectSettings.asset index 444914a0..19564494 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.22 + bundleVersion: 1.23 preloadedAssets: [] metroEnableIndependentInputSource: 0 metroEnableLowLatencyPresentationAPI: 0 xboxOneDisableKinectGpuReservation: 0 virtualRealitySupported: 0 productGUID: c6391136f507d40acbbba7382166aeb8 - AndroidBundleVersionCode: 22 + AndroidBundleVersionCode: 23 AndroidMinSdkVersion: 17 AndroidPreferredInstallLocation: 1 aotOptions: